From 2548a9321086597c56e1eefd03139e5d839b583d Mon Sep 17 00:00:00 2001 From: Mike Nelson Date: Thu, 7 May 2026 10:02:23 -0500 Subject: [PATCH] ship special stats stylization pass --- .../ShipSpecialStatsDialogModel.cpp | 570 +++++++++--------- .../ShipEditor/ShipSpecialStatsDialogModel.h | 116 ++-- .../ShipEditor/ShipSpecialStatsDialog.cpp | 6 +- .../ShipEditor/ShipSpecialStatsDialog.h | 4 +- 4 files changed, 341 insertions(+), 355 deletions(-) diff --git a/qtfred/src/mission/dialogs/ShipEditor/ShipSpecialStatsDialogModel.cpp b/qtfred/src/mission/dialogs/ShipEditor/ShipSpecialStatsDialogModel.cpp index aa1e6a60cc4..93bc0f5c88d 100644 --- a/qtfred/src/mission/dialogs/ShipEditor/ShipSpecialStatsDialogModel.cpp +++ b/qtfred/src/mission/dialogs/ShipEditor/ShipSpecialStatsDialogModel.cpp @@ -1,318 +1,308 @@ #include "ShipSpecialStatsDialogModel.h" -namespace fso { - namespace fred { - namespace dialogs { - ShipSpecialStatsDialogModel::ShipSpecialStatsDialogModel(QObject* parent, EditorViewport* viewport) - : AbstractDialogModel(parent, viewport) - { - initializeData(); - } - void ShipSpecialStatsDialogModel::initializeData() - { - object* objp; - num_selected_ships = 0; - m_selected_ships.resize(MAX_SHIPS); - - objp = GET_FIRST(&obj_used_list); - while (objp != END_OF_LIST(&obj_used_list)) { - if ((objp->type == OBJ_START) || (objp->type == OBJ_SHIP)) { - if (objp->flags[Object::Object_Flags::Marked]) { - m_selected_ships[num_selected_ships] = objp->instance; - num_selected_ships++; - } - } - objp = GET_NEXT(objp); - } +namespace fso::fred::dialogs { - m_ship = _editor->cur_ship; - //Special Hits - if (Ships[m_ship].special_hitpoints) { - m_hull = Ships[m_ship].special_hitpoints; - m_special_hitpoints_enabled = true; - } - else { - ship_info* sip; - sip = &Ship_info[Ships[m_ship].ship_info_index]; +ShipSpecialStatsDialogModel::ShipSpecialStatsDialogModel(QObject* parent, EditorViewport* viewport) + : AbstractDialogModel(parent, viewport) +{ + initializeData(); +} - m_hull = static_cast(sip->max_hull_strength); - m_special_hitpoints_enabled = false; +void ShipSpecialStatsDialogModel::initializeData() +{ + object* objp; + _numSelectedShips = 0; + _selectedShips.resize(MAX_SHIPS); - if (m_hull < 1) { m_hull = 10; } - } + objp = GET_FIRST(&obj_used_list); + while (objp != END_OF_LIST(&obj_used_list)) { + if ((objp->type == OBJ_START) || (objp->type == OBJ_SHIP)) { + if (objp->flags[Object::Object_Flags::Marked]) { + _selectedShips[_numSelectedShips] = objp->instance; + _numSelectedShips++; + } + } + objp = GET_NEXT(objp); + } - if (Ships[m_ship].special_shield > 0) { - m_shields = Ships[m_ship].special_shield; - m_special_shield_enabled = true; - } - else { - // get default_table_values - ship_info* sip; - sip = &Ship_info[Ships[m_ship].ship_info_index]; + _ship = _editor->cur_ship; - m_shields = static_cast(sip->max_shield_strength); - m_special_shield_enabled = false; + if (Ships[_ship].special_hitpoints) { + _hull = Ships[_ship].special_hitpoints; + _specialHitpointsEnabled = true; + } else { + ship_info* sip; + sip = &Ship_info[Ships[_ship].ship_info_index]; - if (m_shields < 0) { - m_shields = 0; - } - } + _hull = static_cast(sip->max_hull_strength); + _specialHitpointsEnabled = false; - //Special Explosions - if (!(Ships[m_ship].use_special_explosion)) { - // get default_table_values - ship_info* sip; - sip = &Ship_info[Ships[m_ship].ship_info_index]; - - m_inner_rad = static_cast(sip->shockwave.inner_rad); - m_outer_rad = static_cast(sip->shockwave.outer_rad); - m_damage = static_cast(sip->shockwave.damage); - m_blast = static_cast(sip->shockwave.blast); - m_shockwave = static_cast(sip->explosion_propagates); - m_shock_speed = static_cast(sip->shockwave.speed); - m_deathRoll = false; - m_duration = 0; - m_special_exp = false; - - if (m_inner_rad < 1) { - m_inner_rad = 1; - } - if (m_outer_rad < 2) { - m_outer_rad = 2; - } - if (m_shock_speed < 1) { - m_shock_speed = 1; - } - } - else { - m_inner_rad = Ships[m_ship].special_exp_inner; - m_outer_rad = Ships[m_ship].special_exp_outer; - m_damage = Ships[m_ship].special_exp_damage; - m_blast = Ships[m_ship].special_exp_blast; - m_shockwave = Ships[m_ship].use_shockwave; - m_shock_speed = Ships[m_ship].special_exp_shockwave_speed; - m_deathRoll = (Ships[m_ship].special_exp_deathroll_time > 0); - m_duration = Ships[m_ship].special_exp_deathroll_time; - m_special_exp = true; - } - modelChanged(); - _modified = false; - } + if (_hull < 1) { _hull = 10; } + } - bool ShipSpecialStatsDialogModel::apply() - { - float temp_max_hull_strength; - int new_shield_strength, new_hull_strength; - if (m_special_hitpoints_enabled) { + if (Ships[_ship].special_shield > 0) { + _shields = Ships[_ship].special_shield; + _specialShieldEnabled = true; + } else { + ship_info* sip; + sip = &Ship_info[Ships[_ship].ship_info_index]; - // Don't update anything if the hull strength is invalid - if (m_hull < 1) { - return false; - } + _shields = static_cast(sip->max_shield_strength); + _specialShieldEnabled = false; - // set to update + if (_shields < 0) { + _shields = 0; + } + } - new_hull_strength = m_hull; - //Ships[m_ship_num].special_hitpoints = m_hull; + if (!(Ships[_ship].use_special_explosion)) { + ship_info* sip; + sip = &Ship_info[Ships[_ship].ship_info_index]; - } - else { - // set to update + _innerRad = static_cast(sip->shockwave.inner_rad); + _outerRad = static_cast(sip->shockwave.outer_rad); + _damage = static_cast(sip->shockwave.damage); + _blast = static_cast(sip->shockwave.blast); + _shockwave = static_cast(sip->explosion_propagates); + _shockSpeed = static_cast(sip->shockwave.speed); + _deathRoll = false; + _duration = 0; + _specialExp = false; - new_hull_strength = 0; - } + if (_innerRad < 1) { + _innerRad = 1; + } + if (_outerRad < 2) { + _outerRad = 2; + } + if (_shockSpeed < 1) { + _shockSpeed = 1; + } + } else { + _innerRad = Ships[_ship].special_exp_inner; + _outerRad = Ships[_ship].special_exp_outer; + _damage = Ships[_ship].special_exp_damage; + _blast = Ships[_ship].special_exp_blast; + _shockwave = Ships[_ship].use_shockwave; + _shockSpeed = Ships[_ship].special_exp_shockwave_speed; + _deathRoll = (Ships[_ship].special_exp_deathroll_time > 0); + _duration = Ships[_ship].special_exp_deathroll_time; + _specialExp = true; + } + modelChanged(); + _modified = false; +} - if (m_special_shield_enabled) { +bool ShipSpecialStatsDialogModel::apply() +{ + float temp_max_hull_strength; + int new_shield_strength, new_hull_strength; + if (_specialHitpointsEnabled) { + if (_hull < 1) { + return false; + } + new_hull_strength = _hull; + } else { + new_hull_strength = 0; + } - // Don't update anything if the hull strength is invalid - if (m_shields < 0) { - return false; - } + if (_specialShieldEnabled) { + if (_shields < 0) { + return false; + } + new_shield_strength = _shields; + } else { + new_shield_strength = -1; + } - // set to update + if (_innerRad > _outerRad) { + auto button = _viewport->dialogProvider->showButtonDialog(DialogType::Error, "Invalid Entry", "Inner radius must be less than outer radius", + { DialogButton::Ok }); + if (button == DialogButton::Ok) { + return false; + } + } - new_shield_strength = m_shields; - //Ships[m_ship_num].special_shield = m_shields; + for (auto& shipp : _selectedShips) { + Ships[shipp].special_hitpoints = new_hull_strength; + Ships[shipp].special_shield = new_shield_strength; - } - else { - // set to update + if (Ships[shipp].special_hitpoints) { + temp_max_hull_strength = (float)Ships[shipp].special_hitpoints; + } else { + temp_max_hull_strength = Ship_info[Ships[shipp].ship_info_index].max_hull_strength; + } - new_shield_strength = -1; - } + Ai_info[Ships[shipp].ai_index].kamikaze_damage = std::min(1000, 200 + static_cast(temp_max_hull_strength / 4.0f)); - if (m_inner_rad > m_outer_rad) { - auto button = _viewport->dialogProvider->showButtonDialog(DialogType::Error, "Invalid Entry", "Inner radius must be less than outer radius", + if (_specialExp) { + Ships[shipp].use_special_explosion = true; + Ships[shipp].special_exp_inner = _innerRad; + Ships[shipp].special_exp_outer = _outerRad; + Ships[shipp].special_exp_damage = _damage; + Ships[shipp].special_exp_blast = _blast; + Ships[shipp].use_shockwave = (_shockwave ? 1 : 0); + if (_shockSpeed) { + if (_shockSpeed < 1) { + _shockSpeed = 1; + _viewport->dialogProvider->showButtonDialog(DialogType::Warning, "Invalid Entry", "Shockwave speed must be defined! Setting this to 1 now", { DialogButton::Ok }); - if (button == DialogButton::Ok) { - return false; - } - } - - for (auto& shipp : m_selected_ships) { - // set the special hitpoints/shield - Ships[shipp].special_hitpoints = new_hull_strength; - Ships[shipp].special_shield = new_shield_strength; - - // calc kamikaze stuff - if (Ships[shipp].special_hitpoints) - { - temp_max_hull_strength = (float)Ships[shipp].special_hitpoints; - } - else - { - temp_max_hull_strength = Ship_info[Ships[shipp].ship_info_index].max_hull_strength; - } - - Ai_info[Ships[shipp].ai_index].kamikaze_damage = std::min(1000, 200 + static_cast(temp_max_hull_strength / 4.0f)); - - if (m_special_exp) { - // set em - Ships[shipp].use_special_explosion = true; - Ships[shipp].special_exp_inner = m_inner_rad; - Ships[shipp].special_exp_outer = m_outer_rad; - Ships[shipp].special_exp_damage = m_damage; - Ships[shipp].special_exp_blast = m_blast; - Ships[shipp].use_shockwave = (m_shockwave ? 1 : 0); - if (m_shock_speed) { - if (m_shock_speed < 1) { - m_shock_speed = 1; - _viewport->dialogProvider->showButtonDialog(DialogType::Warning, "Invalid Entry", "Shockwave speed must be defined! Setting this to 1 now", - { DialogButton::Ok }); - } - Ships[shipp].special_exp_shockwave_speed = m_shock_speed; - } - if (m_duration) { - if (m_duration < 2) { - m_duration = 2; - _viewport->dialogProvider->showButtonDialog(DialogType::Warning, "Invalid Entry", "Death roll time must be at least 2 milliseconds Setting this to 2 now", - { DialogButton::Ok }); - } - Ships[shipp].special_exp_deathroll_time = m_duration; - } - } - else { - Ships[shipp].use_special_explosion = false; - Ships[shipp].special_exp_inner = -1; - Ships[shipp].special_exp_outer = -1; - Ships[shipp].special_exp_damage = -1; - Ships[shipp].special_exp_blast = -1; - Ships[shipp].use_shockwave = false; - Ships[shipp].special_exp_shockwave_speed = -1; - Ships[shipp].special_exp_deathroll_time = 0; - } } - _editor->missionChanged(); - return true; - } - void ShipSpecialStatsDialogModel::reject() - { - } - bool ShipSpecialStatsDialogModel::getSpecialExp() const - { - return m_special_exp; - } - void ShipSpecialStatsDialogModel::setSpecialExp(const bool value) - { - modify(m_special_exp, value); - } - bool ShipSpecialStatsDialogModel::getShockwave() const - { - return m_shockwave; - } - void ShipSpecialStatsDialogModel::setShockwave(const bool value) - { - modify(m_shockwave, value); - } - bool ShipSpecialStatsDialogModel::getDeathRoll() const - { - return m_deathRoll; - } - void ShipSpecialStatsDialogModel::setDeathRoll(const bool value) - { - modify(m_deathRoll, value); - } - int ShipSpecialStatsDialogModel::getDamage() const - { - return m_damage; - } - void ShipSpecialStatsDialogModel::setDamage(const int value) - { - modify(m_damage, value); - } - int ShipSpecialStatsDialogModel::getBlast() const - { - return m_blast; - } - void ShipSpecialStatsDialogModel::setBlast(const int value) - { - modify(m_blast, value); - } - int ShipSpecialStatsDialogModel::getInnerRadius() const - { - return m_inner_rad; - } - void ShipSpecialStatsDialogModel::setInnerRadius(const int value) - { - modify(m_inner_rad, value); + Ships[shipp].special_exp_shockwave_speed = _shockSpeed; } - int ShipSpecialStatsDialogModel::getOuterRadius() const - { - return m_outer_rad; - } - void ShipSpecialStatsDialogModel::setOuterRadius(const int value) - { - modify(m_outer_rad, value); - } - int ShipSpecialStatsDialogModel::getShockwaveSpeed() const - { - return m_shock_speed; - } - void ShipSpecialStatsDialogModel::setShockwaveSpeed(const int value) - { - modify(m_shock_speed, value); - } - int ShipSpecialStatsDialogModel::getRollDuration() const - { - return m_duration; - } - void ShipSpecialStatsDialogModel::setRollDuration(const int value) - { - modify(m_duration, value); - } - bool ShipSpecialStatsDialogModel::getSpecialShield() const - { - return m_special_shield_enabled; - } - void ShipSpecialStatsDialogModel::setSpecialShield(const bool value) - { - modify(m_special_shield_enabled, value); - } - int ShipSpecialStatsDialogModel::getShield() const - { - return m_shields; - } - void ShipSpecialStatsDialogModel::setShield(const int value) - { - modify(m_shields, value); - } - bool ShipSpecialStatsDialogModel::getSpecialHull() const - { - return m_special_hitpoints_enabled; - } - void ShipSpecialStatsDialogModel::setSpecialHull(const bool value) - { - modify(m_special_hitpoints_enabled, value); - } - int ShipSpecialStatsDialogModel::getHull() const - { - return m_hull; - } - void ShipSpecialStatsDialogModel::setHull(const int value) - { - modify(m_hull, value); + if (_duration) { + if (_duration < 2) { + _duration = 2; + _viewport->dialogProvider->showButtonDialog(DialogType::Warning, "Invalid Entry", "Death roll time must be at least 2 milliseconds Setting this to 2 now", + { DialogButton::Ok }); + } + Ships[shipp].special_exp_deathroll_time = _duration; } + } else { + Ships[shipp].use_special_explosion = false; + Ships[shipp].special_exp_inner = -1; + Ships[shipp].special_exp_outer = -1; + Ships[shipp].special_exp_damage = -1; + Ships[shipp].special_exp_blast = -1; + Ships[shipp].use_shockwave = false; + Ships[shipp].special_exp_shockwave_speed = -1; + Ships[shipp].special_exp_deathroll_time = 0; } - } -} \ No newline at end of file + _editor->missionChanged(); + return true; +} + +void ShipSpecialStatsDialogModel::reject() {} + +bool ShipSpecialStatsDialogModel::getSpecialExp() const +{ + return _specialExp; +} + +void ShipSpecialStatsDialogModel::setSpecialExp(bool specialExp) +{ + modify(_specialExp, specialExp); +} + +bool ShipSpecialStatsDialogModel::getShockwave() const +{ + return _shockwave; +} + +void ShipSpecialStatsDialogModel::setShockwave(bool shockwave) +{ + modify(_shockwave, shockwave); +} + +bool ShipSpecialStatsDialogModel::getDeathRoll() const +{ + return _deathRoll; +} + +void ShipSpecialStatsDialogModel::setDeathRoll(bool deathRoll) +{ + modify(_deathRoll, deathRoll); +} + +int ShipSpecialStatsDialogModel::getDamage() const +{ + return _damage; +} + +void ShipSpecialStatsDialogModel::setDamage(int damage) +{ + modify(_damage, damage); +} + +int ShipSpecialStatsDialogModel::getBlast() const +{ + return _blast; +} + +void ShipSpecialStatsDialogModel::setBlast(int blast) +{ + modify(_blast, blast); +} + +int ShipSpecialStatsDialogModel::getInnerRadius() const +{ + return _innerRad; +} + +void ShipSpecialStatsDialogModel::setInnerRadius(int innerRadius) +{ + modify(_innerRad, innerRadius); +} + +int ShipSpecialStatsDialogModel::getOuterRadius() const +{ + return _outerRad; +} + +void ShipSpecialStatsDialogModel::setOuterRadius(int outerRadius) +{ + modify(_outerRad, outerRadius); +} + +int ShipSpecialStatsDialogModel::getShockwaveSpeed() const +{ + return _shockSpeed; +} + +void ShipSpecialStatsDialogModel::setShockwaveSpeed(int speed) +{ + modify(_shockSpeed, speed); +} + +int ShipSpecialStatsDialogModel::getRollDuration() const +{ + return _duration; +} + +void ShipSpecialStatsDialogModel::setRollDuration(int duration) +{ + modify(_duration, duration); +} + +bool ShipSpecialStatsDialogModel::getSpecialShield() const +{ + return _specialShieldEnabled; +} + +void ShipSpecialStatsDialogModel::setSpecialShield(bool specialShield) +{ + modify(_specialShieldEnabled, specialShield); +} + +int ShipSpecialStatsDialogModel::getShield() const +{ + return _shields; +} + +void ShipSpecialStatsDialogModel::setShield(int shield) +{ + modify(_shields, shield); +} + +bool ShipSpecialStatsDialogModel::getSpecialHull() const +{ + return _specialHitpointsEnabled; +} + +void ShipSpecialStatsDialogModel::setSpecialHull(bool specialHull) +{ + modify(_specialHitpointsEnabled, specialHull); +} + +int ShipSpecialStatsDialogModel::getHull() const +{ + return _hull; +} + +void ShipSpecialStatsDialogModel::setHull(int hull) +{ + modify(_hull, hull); +} + +} // namespace fso::fred::dialogs diff --git a/qtfred/src/mission/dialogs/ShipEditor/ShipSpecialStatsDialogModel.h b/qtfred/src/mission/dialogs/ShipEditor/ShipSpecialStatsDialogModel.h index 0656c4f0783..fdef763b75c 100644 --- a/qtfred/src/mission/dialogs/ShipEditor/ShipSpecialStatsDialogModel.h +++ b/qtfred/src/mission/dialogs/ShipEditor/ShipSpecialStatsDialogModel.h @@ -2,69 +2,65 @@ #include "../AbstractDialogModel.h" -namespace fso { - namespace fred { - namespace dialogs { - class ShipSpecialStatsDialogModel : public AbstractDialogModel { - private: - int m_ship; +namespace fso::fred::dialogs { - int num_selected_ships; - SCP_vector m_selected_ships; - //Special Explosion - bool m_special_exp; - bool m_shockwave; - bool m_deathRoll; - int m_inner_rad; - int m_outer_rad; - int m_damage; - int m_shock_speed; - int m_duration; - int m_blast; +class ShipSpecialStatsDialogModel : public AbstractDialogModel { + Q_OBJECT + public: + ShipSpecialStatsDialogModel(QObject* parent, EditorViewport* viewport); - //Special Hits - bool m_special_hitpoints_enabled; - bool m_special_shield_enabled; - int m_shields; - int m_hull; + bool apply() override; + void reject() override; + bool getSpecialExp() const; + void setSpecialExp(bool specialExp); + bool getShockwave() const; + void setShockwave(bool shockwave); + bool getDeathRoll() const; + void setDeathRoll(bool deathRoll); + int getDamage() const; + void setDamage(int damage); + int getBlast() const; + void setBlast(int blast); + int getInnerRadius() const; + void setInnerRadius(int innerRadius); + int getOuterRadius() const; + void setOuterRadius(int outerRadius); + int getShockwaveSpeed() const; + void setShockwaveSpeed(int speed); + int getRollDuration() const; + void setRollDuration(int duration); - public: - ShipSpecialStatsDialogModel(QObject* parent, EditorViewport* viewport); - void initializeData(); - bool apply() override; - void reject() override; + bool getSpecialShield() const; + void setSpecialShield(bool specialShield); + int getShield() const; + void setShield(int shield); + bool getSpecialHull() const; + void setSpecialHull(bool specialHull); + int getHull() const; + void setHull(int hull); - //Exp Get/Setters - bool getSpecialExp() const; - void setSpecialExp(const bool); - bool getShockwave() const; - void setShockwave(const bool); - bool getDeathRoll() const; - void setDeathRoll(const bool); - int getDamage() const; - void setDamage(const int); - int getBlast() const; - void setBlast(const int); - int getInnerRadius() const; - void setInnerRadius(const int); - int getOuterRadius() const; - void setOuterRadius(const int); - int getShockwaveSpeed() const; - void setShockwaveSpeed(const int); - int getRollDuration() const; - void setRollDuration(const int); + private: // NOLINT(readability-redundant-access-specifiers) + void initializeData(); - //Hit Get/Setters - bool getSpecialShield() const; - void setSpecialShield(const bool); - int getShield() const; - void setShield(const int); - bool getSpecialHull() const; - void setSpecialHull(const bool); - int getHull() const; - void setHull(const int); - }; - } - } -} \ No newline at end of file + int _ship; + int _numSelectedShips; + SCP_vector _selectedShips; + + bool _specialExp; + bool _shockwave; + bool _deathRoll; + int _innerRad; + int _outerRad; + int _damage; + int _shockSpeed; + int _duration; + int _blast; + + bool _specialHitpointsEnabled; + bool _specialShieldEnabled; + int _shields; + int _hull; +}; + +} // namespace fso::fred::dialogs diff --git a/qtfred/src/ui/dialogs/ShipEditor/ShipSpecialStatsDialog.cpp b/qtfred/src/ui/dialogs/ShipEditor/ShipSpecialStatsDialog.cpp index 9367795c23d..e905c4e5397 100644 --- a/qtfred/src/ui/dialogs/ShipEditor/ShipSpecialStatsDialog.cpp +++ b/qtfred/src/ui/dialogs/ShipEditor/ShipSpecialStatsDialog.cpp @@ -15,9 +15,9 @@ ShipSpecialStatsDialog::ShipSpecialStatsDialog(QWidget* parent, EditorViewport* { ui->setupUi(this); - connect(_model.get(), &AbstractDialogModel::modelChanged, this, [this]() { updateUI(false); }); + connect(_model.get(), &AbstractDialogModel::modelChanged, this, [this]() { updateUi(false); }); - updateUI(true); + updateUi(true); // Resize the dialog to the minimum size resize(QDialog::sizeHint()); @@ -109,7 +109,7 @@ void ShipSpecialStatsDialog::on_explodeCheckBox_toggled(bool value) { _model->setSpecialExp(value); } -void ShipSpecialStatsDialog::updateUI(bool first) +void ShipSpecialStatsDialog::updateUi(bool first) { util::SignalBlockers blockers(this); if (first) { diff --git a/qtfred/src/ui/dialogs/ShipEditor/ShipSpecialStatsDialog.h b/qtfred/src/ui/dialogs/ShipEditor/ShipSpecialStatsDialog.h index 38615dca89f..61219674a8d 100644 --- a/qtfred/src/ui/dialogs/ShipEditor/ShipSpecialStatsDialog.h +++ b/qtfred/src/ui/dialogs/ShipEditor/ShipSpecialStatsDialog.h @@ -42,11 +42,11 @@ class ShipSpecialStatsDialog : public QDialog { void on_specialHullCheckbox_toggled(bool); void on_hullSpinBox_valueChanged(int); - private:// NOLINT(readability-redundant-access-specifiers) + private: // NOLINT(readability-redundant-access-specifiers) std::unique_ptr ui; std::unique_ptr _model; EditorViewport* _viewport; - void updateUI(bool first = false); + void updateUi(bool first = false); }; } // namespace fso::fred::dialogs \ No newline at end of file