Skip to content

Commit 055cc6e

Browse files
Merge pull request #4210 from JohnAFernandez/Team-Loadout-Editor-Possible-Rebase
QTFred Loadout Editor
2 parents d3c4373 + d564329 commit 055cc6e

File tree

15 files changed

+3108
-459
lines changed

15 files changed

+3108
-459
lines changed

code/ship/ship.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7222,9 +7222,9 @@ static void ship_set(int ship_index, int objnum, int ship_type)
72227222
int max_points_per_bank = 0;
72237223
for (int i = 0; i < sip->num_secondary_banks; ++i)
72247224
{
7225-
int slots = pm->missile_banks[i].num_slots;
7226-
if (slots > max_points_per_bank)
7227-
max_points_per_bank = slots;
7225+
int num_slots = pm->missile_banks[i].num_slots; // old variable name was conflicting with qt slots macro
7226+
if (num_slots > max_points_per_bank)
7227+
max_points_per_bank = num_slots;
72287228
}
72297229
shipp->secondary_point_reload_pct.init(sip->num_secondary_banks, max_points_per_bank, 1.0f);
72307230

qtfred/source_groups.cmake

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ add_file_folder("Source/Mission/Dialogs"
5252
src/mission/dialogs/FictionViewerDialogModel.h
5353
src/mission/dialogs/FormWingDialogModel.cpp
5454
src/mission/dialogs/FormWingDialogModel.h
55+
src/mission/dialogs/LoadoutEditorDialogModel.cpp
56+
src/mission/dialogs/LoadoutEditorDialogModel.h
5557
src/mission/dialogs/MissionGoalsDialogModel.cpp
5658
src/mission/dialogs/MissionGoalsDialogModel.h
5759
src/mission/dialogs/MissionSpecDialogModel.cpp
@@ -114,6 +116,8 @@ add_file_folder("Source/UI/Dialogs"
114116
src/ui/dialogs/FictionViewerDialog.h
115117
src/ui/dialogs/FormWingDialog.cpp
116118
src/ui/dialogs/FormWingDialog.h
119+
src/ui/dialogs/LoadoutDialog.cpp
120+
src/ui/dialogs/LoadoutDialog.h
117121
src/ui/dialogs/MissionGoalsDialog.cpp
118122
src/ui/dialogs/MissionGoalsDialog.h
119123
src/ui/dialogs/MissionSpecDialog.cpp
@@ -126,8 +130,6 @@ add_file_folder("Source/UI/Dialogs"
126130
src/ui/dialogs/SelectionDialog.h
127131
src/ui/dialogs/ShieldSystemDialog.h
128132
src/ui/dialogs/ShieldSystemDialog.cpp
129-
src/ui/dialogs/TeamLoadoutDialog.cpp
130-
src/ui/dialogs/TeamLoadoutDialog.h
131133
src/ui/dialogs/VoiceActingManager.h
132134
src/ui/dialogs/VoiceActingManager.cpp
133135
src/ui/dialogs/WaypointEditorDialog.cpp
@@ -182,13 +184,13 @@ add_file_folder("UI"
182184
ui/FictionViewerDialog.ui
183185
ui/FormWingDialog.ui
184186
ui/FredView.ui
187+
ui/LoadoutDialog.ui
185188
ui/MissionGoalsDialog.ui
186189
ui/MissionSpecDialog.ui
187190
ui/ObjectOrientationDialog.ui
188191
ui/ReinforcementsDialog.ui
189192
ui/SelectionDialog.ui
190193
ui/ShieldSystemDialog.ui
191-
ui/TeamLoadoutDialog.ui
192194
ui/VoiceActingManager.ui
193195
ui/WaypointEditorDialog.ui
194196
ui/ShipEditorDialog.ui

qtfred/src/mission/Editor.cpp

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ bool Editor::loadMission(const std::string& mission_name, int flags) {
264264
}
265265

266266
for (i = 0; i < Num_teams; i++) {
267-
generate_team_weaponry_usage_list(i, used_pool);
267+
generate_team_weaponry_usage_list(i, _weapon_usage[i]);
268268
for (j = 0; j < Team_data[i].num_weapon_choices; j++) {
269269
// The amount used in wings is always set by a static loadout entry so skip any that were set by Sexp variables
270270
if ((!strlen(Team_data[i].weaponry_pool_variable[j]))
@@ -276,12 +276,12 @@ bool Editor::loadMission(const std::string& mission_name, int flags) {
276276
}
277277

278278
// zero the used pool entry
279-
used_pool[Team_data[i].weaponry_pool[j]] = 0;
279+
_weapon_usage[i][Team_data[i].weaponry_pool[j]] = 0;
280280
}
281281
}
282282
// double check the used pool is empty
283283
for (j = 0; j < static_cast<int>(Weapon_info.size()); j++) {
284-
if (!Team_data[i].do_not_validate && used_pool[j] != 0) {
284+
if (_weapon_usage[i][j] != 0) {
285285
Warning(LOCATION,
286286
"%s is used in wings of team %d but was not in the loadout. Fixing now",
287287
Weapon_info[j].name,
@@ -1636,6 +1636,36 @@ void Editor::generate_team_weaponry_usage_list(int team, int* arr) {
16361636
}
16371637
}
16381638
}
1639+
void Editor::generate_ship_usage_list(int* arr, int wing) {
1640+
int i;
1641+
1642+
if (wing < 0) {
1643+
return;
1644+
}
1645+
1646+
i = Wings[wing].wave_count;
1647+
while (i--) {
1648+
arr[Ships[Wings[wing].ship_index[i]].ship_info_index]++;
1649+
}
1650+
}
1651+
void Editor::updateStartingWingLoadoutUseCounts() {
1652+
memset(_ship_usage, 0, sizeof(int) * MAX_TVT_TEAMS * MAX_SHIP_CLASSES);
1653+
1654+
if (The_mission.game_type & MISSION_TYPE_MULTI_TEAMS) {
1655+
for (int i = 0; i<MAX_TVT_TEAMS; i++) {
1656+
for (int j = 0; j<MAX_TVT_WINGS_PER_TEAM; j++) {
1657+
generate_ship_usage_list(_ship_usage[i], TVT_wings[(i*MAX_TVT_WINGS_PER_TEAM) + j]);
1658+
}
1659+
generate_team_weaponry_usage_list(i, _weapon_usage[i]);
1660+
}
1661+
}
1662+
else {
1663+
for (int i = 0; i < MAX_STARTING_WINGS; i++) {
1664+
generate_ship_usage_list(_ship_usage[0], Starting_wings[i]);
1665+
}
1666+
generate_team_weaponry_usage_list(0, _weapon_usage[0]);
1667+
}
1668+
}
16391669
void Editor::delete_marked() {
16401670
object* ptr, * next;
16411671

@@ -3169,6 +3199,27 @@ void Editor::lcl_fred_replace_stuff(QString& text)
31693199
text.replace("\\", "$backslash");
31703200
}
31713201

3202+
SCP_vector<int> Editor::getStartingWingLoadoutUseCounts() {
3203+
// update before sending so that we have the most up to date info.
3204+
updateStartingWingLoadoutUseCounts();
3205+
3206+
SCP_vector<int> out;
3207+
3208+
for (int i = 0; i < MAX_TVT_TEAMS; i++) {
3209+
for (auto& entry : _ship_usage[i]) {
3210+
out.push_back(entry);
3211+
}
3212+
}
3213+
for (int i = 0; i < MAX_TVT_TEAMS; i++) {
3214+
for (auto& entry : _weapon_usage[i]) {
3215+
out.push_back(entry);
3216+
}
3217+
}
3218+
3219+
return out;
3220+
}
3221+
3222+
31723223

31733224
} // namespace fred
31743225
} // namespace fso

qtfred/src/mission/Editor.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,12 @@ class Editor : public QObject {
181181
static void pad_with_newline(SCP_string& str, size_t max_size);
182182
static void lcl_fred_replace_stuff(QString& text);
183183

184+
SCP_vector<int> getStartingWingLoadoutUseCounts();
185+
184186
static const ai_goal_list* getAi_goal_list();
185187
static int getAigoal_list_size();
186188
const char* error_check_initial_orders(ai_goal* goals, int ship, int wing);
189+
187190
private:
188191
void clearMission(bool fast_reload = false);
189192

@@ -209,6 +212,10 @@ class Editor : public QObject {
209212
int obj_count = 0;
210213
int g_err = 0;
211214

215+
// ship and weapon usage pools
216+
int _ship_usage[MAX_TVT_TEAMS][MAX_SHIP_CLASSES];
217+
int _weapon_usage[MAX_TVT_TEAMS][MAX_WEAPON_TYPES];
218+
212219
int common_object_delete(int obj);
213220

214221
int reference_handler(const char* name, sexp_ref_type type, int obj);
@@ -260,6 +267,8 @@ class Editor : public QObject {
260267

261268
void generate_team_weaponry_usage_list(int team, int* arr);
262269

270+
void generate_ship_usage_list(int* arr, int wing);
271+
263272
int get_visible_sub_system_count(ship* shipp);
264273

265274
int get_next_visible_subsys(ship* shipp, ship_subsys** next_subsys);
@@ -279,6 +288,8 @@ class Editor : public QObject {
279288
int global_error_check_player_wings(int multi);
280289

281290
const char* get_order_name(int order);
291+
292+
void updateStartingWingLoadoutUseCounts();
282293
};
283294

284295
} // namespace fred

0 commit comments

Comments
 (0)