Skip to content

Commit b1cefad

Browse files
authored
Qtfred cargo title and scanning fields (#7387)
* implement newer cargo fields and clarify subsystem cargo settings * static
1 parent cf5b50f commit b1cefad

13 files changed

Lines changed: 159 additions & 11 deletions

code/mission/mission_flags.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ namespace Mission {
113113
SF_Cannot_perform_scan_hide_cargo, // Goober5000 - ship cannot scan other ships, and cargo will not be shown on the HUD
114114
SF_Cannot_perform_scan_show_cargo, // Goober5000 - ship cannot scan other ships, but cargo will be shown on the HUD
115115
SF_No_targeting_limits, // MjnMixael - Ship is always targetable regardless of AWACS or targeting range limits
116+
SF_No_scanned_cargo, // MjnMixael - cargo is never revealed, only shows scanned/not scanned (requires unified scanning)
116117
SF_From_player_wing, // set for ships that are members of any player starting wing
117118

118119
NUM_VALUES

code/mission/missionparse.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,7 @@ flag_def_list_new<Ship::Ship_Flags> Parse_ship_flags[] = {
328328
{"cannot-perform-scan-hide-cargo", Ship::Ship_Flags::Cannot_perform_scan_hide_cargo, true, false},
329329
{"cannot-perform-scan-show-cargo", Ship::Ship_Flags::Cannot_perform_scan_show_cargo, true, false},
330330
{"no-targeting-limits", Ship::Ship_Flags::No_targeting_limits, true, false},
331+
{"no-scanned-cargo", Ship::Ship_Flags::No_scanned_cargo, true, false},
331332
{"force-shields-on", Ship::Ship_Flags::Force_shields_on, true, false},
332333
{"Destroy before Mission", Ship::Ship_Flags::Kill_before_mission,true, false}, //Not Printed to misson so can use descriptive name
333334
}
@@ -499,6 +500,7 @@ flag_def_list_new<Mission::Parse_Object_Flags> Parse_object_flags[] = {
499500
{ "cannot-perform-scan-hide-cargo", Mission::Parse_Object_Flags::SF_Cannot_perform_scan_hide_cargo, true, false },
500501
{ "cannot-perform-scan-show-cargo", Mission::Parse_Object_Flags::SF_Cannot_perform_scan_show_cargo, true, false },
501502
{ "no-targeting-limits", Mission::Parse_Object_Flags::SF_No_targeting_limits, true, false},
503+
{ "no-scanned-cargo", Mission::Parse_Object_Flags::SF_No_scanned_cargo, true, false },
502504
};
503505

504506
parse_object_flag_description<Mission::Parse_Object_Flags> Parse_object_flag_descriptions[] = {
@@ -566,6 +568,7 @@ parse_object_flag_description<Mission::Parse_Object_Flags> Parse_object_flag_des
566568
{ Mission::Parse_Object_Flags::SF_Cannot_perform_scan_hide_cargo, "Ship cannot scan other ships, and the cargo line will not be shown on the HUD."},
567569
{ Mission::Parse_Object_Flags::SF_Cannot_perform_scan_show_cargo, "Ship cannot scan other ships, but the cargo line will be shown on the HUD."},
568570
{ Mission::Parse_Object_Flags::SF_No_targeting_limits, "Ship is always targetable regardless of AWACS or targeting range limits."},
571+
{ Mission::Parse_Object_Flags::SF_No_scanned_cargo, "Cargo is never revealed; only shows 'Scanned' or 'Not Scanned'. Needs $Unify Scanning Behavior in game_settings.tbl."},
569572
};
570573

571574
const size_t Num_parse_object_flags = sizeof(Parse_object_flags) / sizeof(flag_def_list_new<Mission::Parse_Object_Flags>);
@@ -3147,6 +3150,8 @@ void resolve_parse_flags(object *objp, flagset<Mission::Parse_Object_Flags> &par
31473150
shipp->flags.set(Ship::Ship_Flags::Cannot_perform_scan_hide_cargo);
31483151
if (parse_flags[Mission::Parse_Object_Flags::SF_Cannot_perform_scan_show_cargo])
31493152
shipp->flags.set(Ship::Ship_Flags::Cannot_perform_scan_show_cargo);
3153+
if (parse_flags[Mission::Parse_Object_Flags::SF_No_scanned_cargo])
3154+
shipp->flags.set(Ship::Ship_Flags::No_scanned_cargo);
31503155

31513156
if (parse_flags[Mission::Parse_Object_Flags::SF_No_targeting_limits])
31523157
shipp->flags.set(Ship::Ship_Flags::No_targeting_limits);

code/missioneditor/missionsave.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3843,6 +3843,8 @@ int Fred_mission_save::save_objects()
38433843
fout(" \"cannot-perform-scan-show-cargo\"");
38443844
if (shipp->flags[Ship::Ship_Flags::No_targeting_limits])
38453845
fout(" \"no-targeting-limits\"");
3846+
if (shipp->flags[Ship::Ship_Flags::No_scanned_cargo])
3847+
fout(" \"no-scanned-cargo\"");
38463848
fout(" )");
38473849
}
38483850
// -----------------------------------------------------------

qtfred/src/mission/dialogs/ShipEditor/ShipEditorDialogModel.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,7 @@ void ShipEditorDialogModel::initializeData()
370370
_m_ai_class = Ships[i].weapons.ai_class;
371371
cargo = Ships[i].cargo1;
372372
_m_cargo1 = Cargo_names[cargo];
373+
_m_cargo_title = Ships[i].cargo_title;
373374
_m_hotkey = Ships[i].hotkey + 1;
374375
_m_score = Ships[i].score;
375376
_m_assist_score = static_cast<int>(Ships[i].assist_score_pct * 100);
@@ -409,6 +410,10 @@ void ShipEditorDialogModel::initializeData()
409410
_m_cargo1 = "";
410411
}
411412

413+
if (_m_cargo_title != Ships[i].cargo_title) {
414+
_m_cargo_title = "";
415+
}
416+
412417
_m_score = Ships[i].score;
413418
_m_assist_score = static_cast<int>(Ships[i].assist_score_pct * 100);
414419

@@ -495,6 +500,7 @@ void ShipEditorDialogModel::initializeData()
495500

496501
_m_ai_class = -1;
497502
_m_cargo1 = "";
503+
_m_cargo_title = "";
498504
_m_hotkey = 0;
499505
_m_score = 0; // cause control to be blank
500506
_m_assist_score = 0;
@@ -928,6 +934,24 @@ SCP_string ShipEditorDialogModel::getCargo() const
928934
return _m_cargo1;
929935
}
930936

937+
void ShipEditorDialogModel::setCargoTitle(const SCP_string& title)
938+
{
939+
if (_m_cargo_title == title)
940+
return;
941+
_m_cargo_title = title;
942+
for (auto* ptr = GET_FIRST(&obj_used_list); ptr != END_OF_LIST(&obj_used_list); ptr = GET_NEXT(ptr)) {
943+
if (((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) && (ptr->flags[Object::Object_Flags::Marked])) {
944+
strcpy_s(Ships[ptr->instance].cargo_title, title.c_str());
945+
}
946+
}
947+
set_modified();
948+
}
949+
950+
SCP_string ShipEditorDialogModel::getCargoTitle() const
951+
{
952+
return _m_cargo_title;
953+
}
954+
931955
void ShipEditorDialogModel::setAltName(const SCP_string& m_altName)
932956
{
933957
if (_m_alt_name == m_altName)

qtfred/src/mission/dialogs/ShipEditor/ShipEditorDialogModel.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class ShipEditorDialogModel : public AbstractDialogModel {
1919
SCP_string _m_ship_name;
2020
SCP_string _m_ship_display_name;
2121
SCP_string _m_cargo1;
22+
SCP_string _m_cargo_title;
2223
SCP_string _m_alt_name;
2324
SCP_string _m_callsign;
2425
int _m_ship_class;
@@ -96,6 +97,9 @@ class ShipEditorDialogModel : public AbstractDialogModel {
9697
void setCargo(const SCP_string&);
9798
SCP_string getCargo() const;
9899

100+
void setCargoTitle(const SCP_string&);
101+
SCP_string getCargoTitle() const;
102+
99103
void setAltName(const SCP_string&);
100104
SCP_string getAltName() const;
101105

qtfred/src/mission/dialogs/ShipEditor/ShipInitialStatusDialogModel.cpp

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
#include <globalincs/linklist.h>
66
#include <localization/localize.h>
7+
#include <mod_table/mod_table.h>
78

89
#include <QtWidgets>
910
#include <object/objectdock.cpp>
@@ -766,6 +767,16 @@ void ShipInitialStatusDialogModel::setCargo(const SCP_string& text)
766767
modify(m_cargo_name, text);
767768
}
768769

770+
SCP_string ShipInitialStatusDialogModel::getCargoTitle() const
771+
{
772+
return m_cargo_title;
773+
}
774+
775+
void ShipInitialStatusDialogModel::setCargoTitle(const SCP_string& text)
776+
{
777+
modify(m_cargo_title, text);
778+
}
779+
769780
SCP_string ShipInitialStatusDialogModel::getColour() const
770781
{
771782
return m_team_color_setting;
@@ -817,6 +828,9 @@ void ShipInitialStatusDialogModel::change_subsys(const int new_subsys)
817828
ptr->subsys_cargo_name = cargo_index;
818829
}
819830
}
831+
832+
// update cargo title
833+
strcpy_s(ptr->subsys_cargo_title, m_cargo_title.c_str());
820834
}
821835

822836
cur_subsys = z = new_subsys;
@@ -831,15 +845,12 @@ void ShipInitialStatusDialogModel::change_subsys(const int new_subsys)
831845
}
832846

833847
m_damage = 100 - static_cast<int>(ptr->current_hits);
834-
if (ship_has_scannable_subsystems) {
835-
if (ptr->subsys_cargo_name > 0) {
836-
m_cargo_name = Cargo_names[ptr->subsys_cargo_name];
837-
} else {
838-
m_cargo_name = "";
839-
}
848+
if (ptr->subsys_cargo_name > 0) {
849+
m_cargo_name = Cargo_names[ptr->subsys_cargo_name];
840850
} else {
841851
m_cargo_name = "";
842852
}
853+
m_cargo_title = ptr->subsys_cargo_title;
843854
}
844855
set_modified();
845856
modelChanged();
@@ -896,4 +907,14 @@ void ShipInitialStatusDialogModel::setGuardian(int value)
896907
modify(guardian_threshold, value);
897908
}
898909

910+
bool ShipInitialStatusDialogModel::getToggleSubsystemScanning() const
911+
{
912+
return Ships[m_ship].flags[Ship::Ship_Flags::Toggle_subsystem_scanning];
913+
}
914+
915+
bool ShipInitialStatusDialogModel::getUseNewScanningBehavior()
916+
{
917+
return Use_new_scanning_behavior;
918+
}
919+
899920
} // namespace fso::fred::dialogs

qtfred/src/mission/dialogs/ShipEditor/ShipInitialStatusDialogModel.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class ShipInitialStatusDialogModel : public AbstractDialogModel {
3333
int m_ship_locked;
3434
int m_weapons_locked;
3535
SCP_string m_cargo_name;
36+
SCP_string m_cargo_title;
3637
int m_primaries_locked;
3738
int m_secondaries_locked;
3839
int m_turrets_locked;
@@ -108,6 +109,9 @@ class ShipInitialStatusDialogModel : public AbstractDialogModel {
108109
SCP_string getCargo() const;
109110
void setCargo(const SCP_string&);
110111

112+
SCP_string getCargoTitle() const;
113+
void setCargoTitle(const SCP_string&);
114+
111115
SCP_string getColour() const;
112116
void setColour(const SCP_string&);
113117

@@ -123,6 +127,9 @@ class ShipInitialStatusDialogModel : public AbstractDialogModel {
123127
bool getUseTeamcolours() const;
124128
bool getIfMultpleShips() const;
125129

130+
bool getToggleSubsystemScanning() const;
131+
static bool getUseNewScanningBehavior();
132+
126133
int getGuardian() const;
127134
void setGuardian(int);
128135
};

qtfred/src/ui/dialogs/ShipEditor/ShipEditorDialog.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ ShipEditorDialog::ShipEditorDialog(FredView* parent, EditorViewport* viewport)
3030
ui->shipDisplayNameEdit->setMaxLength(NAME_LENGTH - 1);
3131
ui->altNameCombo->lineEdit()->setMaxLength(NAME_LENGTH - 1);
3232
ui->callsignCombo->lineEdit()->setMaxLength(CALLSIGN_LEN);
33+
ui->cargoTitleEdit->setMaxLength(NAME_LENGTH - 1);
3334

3435
connect(_model.get(), &AbstractDialogModel::modelChanged, this, [this] { updateUI(false); });
3536
connect(viewport->editor, &Editor::currentObjectChanged, this, &ShipEditorDialog::update);
@@ -38,6 +39,7 @@ ShipEditorDialog::ShipEditorDialog(FredView* parent, EditorViewport* viewport)
3839
// Column One
3940

4041
connect(ui->cargoCombo->lineEdit(), (&QLineEdit::editingFinished), this, &ShipEditorDialog::cargoChanged);
42+
connect(ui->cargoTitleEdit, (&QLineEdit::editingFinished), this, &ShipEditorDialog::cargoTitleChanged);
4143
connect(ui->altNameCombo->lineEdit(), (&QLineEdit::textEdited), this, &ShipEditorDialog::altNameChanged);
4244
connect(ui->callsignCombo->lineEdit(), (&QLineEdit::textEdited), this, &ShipEditorDialog::callsignChanged);
4345

@@ -187,6 +189,7 @@ void ShipEditorDialog::updateColumnOne(bool overwrite)
187189

188190
ui->cargoCombo->setCurrentIndex(ui->cargoCombo->findText(QString(cargo.c_str())));
189191
}
192+
ui->cargoTitleEdit->setText(_model->getCargoTitle().c_str());
190193
}
191194
if (_model->getNumSelectedObjects()) {
192195
if (_model->getIfMultipleShips()) {
@@ -484,6 +487,7 @@ void ShipEditorDialog::enableDisable()
484487

485488
ui->AIClassCombo->setEnabled(_model->getUIEnable());
486489
ui->cargoCombo->setEnabled(_model->getUIEnable());
490+
ui->cargoTitleEdit->setEnabled(_model->getUIEnable());
487491
ui->hotkeyCombo->setEnabled(_model->getUIEnable());
488492
if ((_model->getShipClass() >= 0) && !(Ship_info[_model->getShipClass()].flags[Ship::Info_Flags::Cargo]) &&
489493
!(Ship_info[_model->getShipClass()].flags[Ship::Info_Flags::No_ship_type]))
@@ -574,6 +578,14 @@ void ShipEditorDialog::cargoChanged()
574578
_model->setCargo(NewCargo);
575579
}
576580
}
581+
void ShipEditorDialog::cargoTitleChanged()
582+
{
583+
const QString entry = ui->cargoTitleEdit->text();
584+
if (!entry.isEmpty() && entry != _model->getCargoTitle().c_str()) {
585+
const SCP_string NewCargoTitle = entry.toUtf8().constData();
586+
_model->setCargoTitle(NewCargoTitle);
587+
}
588+
}
577589
void ShipEditorDialog::altNameChanged()
578590
{
579591
const QString entry = ui->altNameCombo->lineEdit()->text();

qtfred/src/ui/dialogs/ShipEditor/ShipEditorDialog.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ class ShipEditorDialog : public QDialog, public SexpTreeEditorInterface {
134134

135135
// column one
136136
void cargoChanged();
137+
void cargoTitleChanged();
137138
void altNameChanged();
138139
void callsignChanged();
139140
};

qtfred/src/ui/dialogs/ShipEditor/ShipInitialStatusDialog.cpp

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ ShipInitialStatusDialog::ShipInitialStatusDialog(QDialog* parent, EditorViewport
2222
ui->setupUi(this);
2323

2424
ui->cargoEdit->setMaxLength(NAME_LENGTH - 1);
25+
ui->cargoTitleEdit->setMaxLength(NAME_LENGTH - 1);
2526

2627
connect(_model.get(), &AbstractDialogModel::modelChanged, this, &ShipInitialStatusDialog::updateUI);
2728

@@ -130,6 +131,11 @@ void ShipInitialStatusDialog::on_cargoEdit_editingFinished()
130131
SCP_string cargo = ui->cargoEdit->text().toUtf8().constData();
131132
_model->setCargo(cargo);
132133
}
134+
void ShipInitialStatusDialog::on_cargoTitleEdit_editingFinished()
135+
{
136+
SCP_string title = ui->cargoTitleEdit->text().toUtf8().constData();
137+
_model->setCargoTitle(title);
138+
}
133139
void ShipInitialStatusDialog::on_colourComboBox_currentIndexChanged(int index)
134140
{
135141
SCP_string colour = ui->colourComboBox->itemText(index).toUtf8().constData();
@@ -363,12 +369,15 @@ void ShipInitialStatusDialog::updateSubsystems()
363369
ship_subsys* ptr;
364370
auto index = ui->subsystemList->currentIndex();
365371
ui->subsystemList->clear();
366-
if (!_model->getIfMultpleShips()) {
372+
373+
bool multiEdit = _model->getIfMultpleShips();
374+
bool useNewScanning = _model->getUseNewScanningBehavior();
375+
bool toggleSet = _model->getToggleSubsystemScanning();
376+
bool scannable = _model->getShip_has_scannable_subsystems();
377+
378+
if (!multiEdit) {
367379
ui->subsystemList->setEnabled(true);
368380
ui->subIntegritySpinBox->setEnabled(true);
369-
if (_model->getShip_has_scannable_subsystems()) {
370-
ui->cargoEdit->setEnabled(true);
371-
}
372381
for (ptr = GET_FIRST(&Ships[_model->getShip()].subsys_list);
373382
ptr != END_OF_LIST(&Ships[_model->getShip()].subsys_list);
374383
ptr = GET_NEXT(ptr)) {
@@ -380,11 +389,30 @@ void ShipInitialStatusDialog::updateSubsystems()
380389
} else {
381390
ui->subsystemList->setEnabled(false);
382391
ui->subIntegritySpinBox->setEnabled(false);
383-
ui->cargoEdit->setEnabled(false);
384392
}
393+
394+
// Determine whether subsystem cargo fields should be shown.
395+
// Classic mode: ship must have scannable subsystems (huge ship, or non-huge with Toggle_subsystem_scanning).
396+
// Unified mode: any ship with Toggle_subsystem_scanning can use subsystem cargo.
397+
bool showCargo;
398+
if (useNewScanning) {
399+
showCargo = !multiEdit && toggleSet;
400+
} else {
401+
showCargo = !multiEdit && scannable;
402+
}
403+
404+
ui->subsysCargoHelpLabel->setVisible(!showCargo && !multiEdit);
405+
ui->cargoLabel->setVisible(showCargo);
406+
ui->cargoEdit->setVisible(showCargo);
407+
ui->cargoEdit->setEnabled(showCargo);
408+
ui->cargoTitleLabel->setVisible(showCargo);
409+
ui->cargoTitleEdit->setVisible(showCargo);
410+
ui->cargoTitleEdit->setEnabled(showCargo);
411+
385412
auto value = _model->getDamage();
386413
ui->subIntegritySpinBox->setValue(value);
387414
auto cargovalue = _model->getCargo();
388415
ui->cargoEdit->setText(cargovalue.c_str());
416+
ui->cargoTitleEdit->setText(_model->getCargoTitle().c_str());
389417
}
390418
} // namespace fso::fred::dialogs

0 commit comments

Comments
 (0)