2 * Copyright (C) Volition, Inc. 1999. All rights reserved.
4 * All source code herein is the property of Volition, Inc. You may not sell
5 * or otherwise commercially exploit the source or things you created based on
10 * $Logfile: /Freespace2/code/FRED2/ship_select.cpp $
15 * Object selection (marking) dialog box handling code
18 * Revision 1.3 2002/06/09 04:41:16 relnev
19 * added copyright header
21 * Revision 1.2 2002/05/07 03:16:44 theoddone33
22 * The Great Newline Fix
24 * Revision 1.1.1.1 2002/05/03 03:28:09 root
28 * 2 10/07/98 6:28p Dave
29 * Initial checkin. Renamed all relevant stuff to be Fred2 instead of
30 * Fred. Globalized mission and campaign file extensions. Removed Silent
31 * Threat specific code.
33 * 1 10/07/98 3:01p Dave
35 * 1 10/07/98 3:00p Dave
37 * 21 2/13/98 11:48a Hoffoss
38 * Fixed up some bugs with object selection when filters are turned off.
40 * 20 9/16/97 9:41p Hoffoss
41 * Changed Fred code around to stop using Parse_player structure for
42 * player information, and use actual ships instead.
44 * 19 9/09/97 10:29a Hoffoss
45 * Added support for neutral team, and fixed changes made to how team is
46 * used in ship structure.
48 * 18 9/06/97 2:13p Mike
49 * Replace support for TEAM_NEUTRAL
51 * 17 8/26/97 11:08a Hoffoss
52 * Added waypoint paths to object selection dialog.
54 * 16 7/28/97 5:10p Hoffoss
55 * Removed all occurances of neutral team from Fred.
57 * 15 7/24/97 2:43p Hoffoss
58 * Made changes whiteside requested. Double clicking acts as clicking ok
61 * 14 7/24/97 10:24a Mike
62 * Restore support for Unknown team
64 * 13 7/10/97 11:24a Hoffoss
65 * Fixed bugs in briefing editor system. Make icon button not updating
66 * when selecting ships via list select, and after making icon, it wasn't
67 * being displayed, though it was selected.
69 * 12 5/26/97 10:30a Hoffoss
70 * Added select wing to object select dialog.
72 * 11 5/14/97 4:08p Lawrance
73 * removing my_index from game arrays
75 * 10 3/07/97 4:37p Mike
76 * Make rockeye missile home.
77 * Remove UNKNOWN and NEUTRAL teams.
79 * 9 2/17/97 5:28p Hoffoss
80 * Checked RCS headers, added them were missing, changing description to
81 * something better, etc where needed.
88 #include "ship_select.h"
92 #include "management.h"
95 #define ACTIVITY_SHIP 1
96 #define ACTIVITY_WING 2
101 static char THIS_FILE[] = __FILE__;
104 int filter_ships = TRUE;
105 int filter_starts = TRUE;
106 int filter_waypoints = TRUE;
107 int filter_friendly = TRUE;
108 int filter_hostile = TRUE;
109 int filter_neutral = TRUE;
110 int filter_unknown = TRUE;
112 /////////////////////////////////////////////////////////////////////////////
113 // ship_select dialog
115 ship_select::ship_select(CWnd* pParent /*=NULL*/)
116 : CDialog(ship_select::IDD, pParent)
118 //{{AFX_DATA_INIT(ship_select)
119 m_filter_ships = TRUE;
120 m_filter_starts = TRUE;
121 m_filter_waypoints = TRUE;
122 m_filter_friendly = TRUE;
123 m_filter_hostile = TRUE;
124 m_filter_neutral = TRUE;
125 m_filter_unknown = TRUE;
128 m_filter_ships = filter_ships;
129 m_filter_starts = filter_starts;
130 m_filter_waypoints = filter_waypoints;
131 m_filter_friendly = filter_friendly;
132 m_filter_hostile = filter_hostile;
133 m_filter_neutral = filter_neutral;
134 m_filter_unknown = filter_unknown;
138 void ship_select::DoDataExchange(CDataExchange* pDX)
140 CDialog::DoDataExchange(pDX);
141 //{{AFX_DATA_MAP(ship_select)
142 DDX_Control(pDX, IDC_WING_LIST, m_wing_list);
143 DDX_Control(pDX, IDC_SHIP_LIST, m_ship_list);
144 DDX_Check(pDX, IDC_FILTER_SHIPS, m_filter_ships);
145 DDX_Check(pDX, IDC_FILTER_STARTS, m_filter_starts);
146 DDX_Check(pDX, IDC_FILTER_WAYPOINTS, m_filter_waypoints);
147 DDX_Check(pDX, IDC_FILTER_SHIPS_FRIENDLY, m_filter_friendly);
148 DDX_Check(pDX, IDC_FILTER_SHIPS_HOSTILE, m_filter_hostile);
149 DDX_Check(pDX, IDC_FILTER_SHIPS_NEUTRAL, m_filter_neutral);
150 DDX_Check(pDX, IDC_FILTER_SHIPS_UNKNOWN, m_filter_unknown);
154 BEGIN_MESSAGE_MAP(ship_select, CDialog)
155 //{{AFX_MSG_MAP(ship_select)
156 ON_CBN_SELCHANGE(IDC_WING_DISPLAY_FILTER, OnSelchangeWingDisplayFilter)
157 ON_BN_CLICKED(IDC_FILTER_SHIPS, OnFilterShips)
158 ON_BN_CLICKED(IDC_FILTER_STARTS, OnFilterStarts)
159 ON_BN_CLICKED(IDC_FILTER_WAYPOINTS, OnFilterWaypoints)
160 ON_BN_CLICKED(IDC_FILTER_SHIPS_FRIENDLY, OnFilterShipsFriendly)
161 ON_BN_CLICKED(IDC_FILTER_SHIPS_HOSTILE, OnFilterShipsHostile)
162 ON_BN_CLICKED(IDC_FILTER_SHIPS_NEUTRAL, OnFilterShipsNeutral)
163 ON_BN_CLICKED(IDC_FILTER_SHIPS_UNKNOWN, OnFilterShipsUnknown)
164 ON_BN_CLICKED(IDC_CLEAR, OnClear)
165 ON_BN_CLICKED(IDC_ALL, OnAll)
166 ON_BN_CLICKED(IDC_INVERT, OnInvert)
167 ON_LBN_DBLCLK(IDC_SHIP_LIST, OnDblclkShipList)
168 ON_LBN_SELCHANGE(IDC_WING_LIST, OnSelchangeWingList)
169 ON_LBN_SELCHANGE(IDC_SHIP_LIST, OnSelchangeShipList)
170 ON_LBN_DBLCLK(IDC_WING_LIST, OnDblclkWingList)
174 /////////////////////////////////////////////////////////////////////////////
175 // ship_select message handlers
177 void ship_select::OnSelchangeWingDisplayFilter()
183 BOOL ship_select::OnInitDialog()
188 wlist_size = wplist_size = 0;
189 CDialog::OnInitDialog();
191 ptr = GET_FIRST(&obj_used_list);
192 while (ptr != END_OF_LIST(&obj_used_list))
194 flags = ptr->flags & ~OF_TEMP_MARKED;
195 if (flags & OF_MARKED)
196 flags |= OF_TEMP_MARKED;
198 flags &= ~OF_TEMP_MARKED;
206 GetDlgItem(IDC_FILTER_SHIPS_FRIENDLY)->EnableWindow(m_filter_ships);
207 GetDlgItem(IDC_FILTER_SHIPS_HOSTILE)->EnableWindow(m_filter_ships);
208 GetDlgItem(IDC_FILTER_SHIPS_NEUTRAL)->EnableWindow(m_filter_ships);
209 GetDlgItem(IDC_FILTER_SHIPS_UNKNOWN)->EnableWindow(m_filter_ships);
211 // Elements 0 - wlist_size are wings, and elements wlist_size - wplist_size are waypoint paths
212 m_wing_list.ResetContent();
214 for (i=0; i<MAX_WINGS; i++)
215 if (Wings[i].wave_count) {
216 m_wing_list.AddString(Wings[i].name);
217 wing_sel_last[wlist_size] = 0;
218 wing_index[wlist_size++] = i;
221 wplist_size = wlist_size;
222 for (i=0; i<Num_waypoint_lists; i++) {
223 m_wing_list.AddString(Waypoint_lists[i].name);
224 wing_sel_last[wplist_size] = 0;
225 wing_index[wplist_size++] = i;
231 void ship_select::create_list()
238 m_ship_list.ResetContent();
243 ptr = GET_FIRST(&obj_used_list);
244 while (ptr != END_OF_LIST(&obj_used_list))
246 if (ptr->type == OBJ_START)
248 m_ship_list.AddString(Ships[ptr->instance].ship_name);
249 obj_index[list_size++] = ptr;
250 if (ptr->flags & OF_TEMP_MARKED)
251 m_ship_list.SetSel(list_size - 1);
258 if (m_filter_ships) {
259 ptr = GET_FIRST(&obj_used_list);
260 while (ptr != END_OF_LIST(&obj_used_list))
262 if (ptr->type == OBJ_SHIP)
265 switch (Ships[ptr->instance].team)
268 flag = m_filter_friendly;
272 flag = m_filter_hostile;
276 flag = m_filter_neutral;
280 flag = m_filter_unknown;
284 flag = m_filter_hostile;
290 m_ship_list.AddString(Ships[ptr->instance].ship_name);
291 obj_index[list_size++] = ptr;
292 if (ptr->flags & OF_TEMP_MARKED)
293 m_ship_list.SetSel(list_size - 1);
301 if (m_filter_waypoints)
303 ptr = GET_FIRST(&obj_used_list);
304 while (ptr != END_OF_LIST(&obj_used_list))
306 if (ptr->type == OBJ_WAYPOINT)
308 sprintf(text, "%s:%d", Waypoint_lists[ptr->instance / 65536].name,
309 (ptr->instance & 0xffff) + 1);
310 m_ship_list.AddString(text);
311 obj_index[list_size++] = ptr;
312 if (ptr->flags & OF_TEMP_MARKED)
313 m_ship_list.SetSel(list_size - 1);
321 void ship_select::OnOK()
327 ptr = GET_FIRST(&obj_used_list);
328 while (ptr != END_OF_LIST(&obj_used_list))
330 if (ptr->flags & OF_TEMP_MARKED)
331 mark_object(OBJ_INDEX(ptr));
336 if (query_valid_object() && (Marked == 1) && (Objects[cur_object_index].type == OBJ_POINT)) {
337 SDL_assert(Briefing_dialog);
338 Briefing_dialog->icon_select(Objects[cur_object_index].instance);
342 Briefing_dialog->icon_select(-1);
345 filter_ships = m_filter_ships;
346 filter_starts = m_filter_starts;
347 filter_waypoints = m_filter_waypoints;
348 filter_friendly = m_filter_friendly;
349 filter_hostile = m_filter_hostile;
350 filter_neutral = m_filter_neutral;
351 filter_unknown = m_filter_unknown;
355 void ship_select::update_status()
360 ptr = GET_FIRST(&obj_used_list);
361 while (ptr != END_OF_LIST(&obj_used_list)) {
362 ptr->flags &= ~OF_TEMP_MARKED;
366 for (i=0; i<list_size; i++)
368 z = m_ship_list.GetSel(i);
370 obj_index[i]->flags &= ~OF_TEMP_MARKED;
372 obj_index[i]->flags |= OF_TEMP_MARKED;
375 OnSelchangeShipList();
378 void ship_select::OnFilterShips()
382 GetDlgItem(IDC_FILTER_SHIPS_FRIENDLY)->EnableWindow(m_filter_ships);
383 GetDlgItem(IDC_FILTER_SHIPS_HOSTILE)->EnableWindow(m_filter_ships);
384 GetDlgItem(IDC_FILTER_SHIPS_NEUTRAL)->EnableWindow(m_filter_ships);
385 GetDlgItem(IDC_FILTER_SHIPS_UNKNOWN)->EnableWindow(m_filter_ships);
388 void ship_select::OnFilterStarts()
394 void ship_select::OnFilterWaypoints()
400 void ship_select::OnFilterShipsFriendly()
406 void ship_select::OnFilterShipsHostile()
412 void ship_select::OnFilterShipsNeutral()
418 void ship_select::OnFilterShipsUnknown()
424 void ship_select::OnClear()
429 ptr = GET_FIRST(&obj_used_list);
430 while (ptr != END_OF_LIST(&obj_used_list))
432 ptr->flags &= ~OF_TEMP_MARKED;
436 for (i=0; i<list_size; i++)
437 m_ship_list.SetSel(i, FALSE);
439 for (i=0; i<wplist_size; i++) {
440 wing_sel_last[i] = 0;
441 m_wing_list.SetSel(i, FALSE);
445 void ship_select::OnAll()
449 for (i=0; i<list_size; i++)
451 obj_index[i]->flags |= OF_TEMP_MARKED;
452 m_ship_list.SetSel(i);
455 for (i=0; i<wplist_size; i++) {
456 wing_sel_last[i] = 1;
457 m_wing_list.SetSel(i, TRUE);
461 void ship_select::OnInvert()
465 for (i=0; i<list_size; i++)
467 z = m_ship_list.GetSel(i);
470 obj_index[i]->flags &= ~OF_TEMP_MARKED;
471 m_ship_list.SetSel(i, FALSE);
474 obj_index[i]->flags |= OF_TEMP_MARKED;
475 m_ship_list.SetSel(i);
479 OnSelchangeShipList();
482 void ship_select::OnDblclkShipList()
486 /* int i, j, z, wing;
488 z = m_ship_list.GetCaretIndex();
489 switch (obj_index[z]->type) {
491 wing = Ships[obj_index[z]->instance].wingnum;
493 for (i=0; i<Wings[wing].wave_count; i++)
494 for (j=0; j<list_size; j++)
495 if (OBJ_INDEX(obj_index[j]) == wing_objects[wing][i]) {
496 m_ship_list.SetSel(j);
500 for (i=0; i<wlist_size; i++)
501 if (wing_index[i] == wing) {
502 m_wing_list.SetSel(i);
503 wing_sel_last[i] = 1;
515 void ship_select::OnSelchangeWingList()
522 activity = ACTIVITY_WING;
523 for (i=0; i<wlist_size; i++) {
524 z = (m_wing_list.GetSel(i) > 0) ? 1 : 0;
525 if (z != wing_sel_last[i]) {
526 for (j=0; j<Wings[wing_index[i]].wave_count; j++)
527 for (k=0; k<list_size; k++)
528 if (OBJ_INDEX(obj_index[k]) == wing_objects[wing_index[i]][j]) {
529 m_ship_list.SetSel(k, z ? TRUE : FALSE);
533 wing_sel_last[i] = z;
537 for (i=wlist_size; i<wplist_size; i++) {
538 z = (m_wing_list.GetSel(i) > 0) ? 1 : 0;
539 if (z != wing_sel_last[i]) {
540 for (j=0; j<Waypoint_lists[wing_index[i]].count; j++)
541 for (k=0; k<list_size; k++)
542 if ((obj_index[k]->type == OBJ_WAYPOINT) && (obj_index[k]->instance == wing_index[i] * 65536 + j)) {
543 m_ship_list.SetSel(k, z ? TRUE : FALSE);
547 wing_sel_last[i] = z;
554 void ship_select::OnSelchangeShipList()
561 activity = ACTIVITY_SHIP;
562 for (i=0; i<wlist_size; i++) {
564 for (j=0; j<Wings[wing_index[i]].wave_count; j++)
565 for (k=0; k<list_size; k++)
566 if (OBJ_INDEX(obj_index[k]) == wing_objects[wing_index[i]][j]) {
567 if (m_ship_list.GetSel(k))
573 if (count == Wings[wing_index[i]].wave_count)
574 wing_sel_last[i] = 1;
576 wing_sel_last[i] = 0;
578 m_wing_list.SetSel(i, wing_sel_last[i] ? TRUE : FALSE);
581 for (i=wlist_size; i<wplist_size; i++) {
583 for (j=0; j<Waypoint_lists[wing_index[i]].count; j++)
584 for (k=0; k<list_size; k++)
585 if ((obj_index[k]->type == OBJ_WAYPOINT) && (obj_index[k]->instance == wing_index[i] * 65536 + j)) {
586 if (m_ship_list.GetSel(k))
592 if (count == Waypoint_lists[wing_index[i]].count)
593 wing_sel_last[i] = 1;
595 wing_sel_last[i] = 0;
597 m_wing_list.SetSel(i, wing_sel_last[i] ? TRUE : FALSE);
603 void ship_select::OnDblclkWingList()