2 * $Logfile: /Freespace2/code/FRED2/ship_select.cpp $
7 * Object selection (marking) dialog box handling code
10 * Revision 1.1 2002/05/03 03:28:09 root
14 * 2 10/07/98 6:28p Dave
15 * Initial checkin. Renamed all relevant stuff to be Fred2 instead of
16 * Fred. Globalized mission and campaign file extensions. Removed Silent
17 * Threat specific code.
19 * 1 10/07/98 3:01p Dave
21 * 1 10/07/98 3:00p Dave
23 * 21 2/13/98 11:48a Hoffoss
24 * Fixed up some bugs with object selection when filters are turned off.
26 * 20 9/16/97 9:41p Hoffoss
27 * Changed Fred code around to stop using Parse_player structure for
28 * player information, and use actual ships instead.
30 * 19 9/09/97 10:29a Hoffoss
31 * Added support for neutral team, and fixed changes made to how team is
32 * used in ship structure.
34 * 18 9/06/97 2:13p Mike
35 * Replace support for TEAM_NEUTRAL
37 * 17 8/26/97 11:08a Hoffoss
38 * Added waypoint paths to object selection dialog.
40 * 16 7/28/97 5:10p Hoffoss
41 * Removed all occurances of neutral team from Fred.
43 * 15 7/24/97 2:43p Hoffoss
44 * Made changes whiteside requested. Double clicking acts as clicking ok
47 * 14 7/24/97 10:24a Mike
48 * Restore support for Unknown team
50 * 13 7/10/97 11:24a Hoffoss
51 * Fixed bugs in briefing editor system. Make icon button not updating
52 * when selecting ships via list select, and after making icon, it wasn't
53 * being displayed, though it was selected.
55 * 12 5/26/97 10:30a Hoffoss
56 * Added select wing to object select dialog.
58 * 11 5/14/97 4:08p Lawrance
59 * removing my_index from game arrays
61 * 10 3/07/97 4:37p Mike
62 * Make rockeye missile home.
63 * Remove UNKNOWN and NEUTRAL teams.
65 * 9 2/17/97 5:28p Hoffoss
66 * Checked RCS headers, added them were missing, changing description to
67 * something better, etc where needed.
74 #include "ship_select.h"
78 #include "management.h"
81 #define ACTIVITY_SHIP 1
82 #define ACTIVITY_WING 2
87 static char THIS_FILE[] = __FILE__;
90 int filter_ships = TRUE;
91 int filter_starts = TRUE;
92 int filter_waypoints = TRUE;
93 int filter_friendly = TRUE;
94 int filter_hostile = TRUE;
95 int filter_neutral = TRUE;
96 int filter_unknown = TRUE;
98 /////////////////////////////////////////////////////////////////////////////
101 ship_select::ship_select(CWnd* pParent /*=NULL*/)
102 : CDialog(ship_select::IDD, pParent)
104 //{{AFX_DATA_INIT(ship_select)
105 m_filter_ships = TRUE;
106 m_filter_starts = TRUE;
107 m_filter_waypoints = TRUE;
108 m_filter_friendly = TRUE;
109 m_filter_hostile = TRUE;
110 m_filter_neutral = TRUE;
111 m_filter_unknown = TRUE;
114 m_filter_ships = filter_ships;
115 m_filter_starts = filter_starts;
116 m_filter_waypoints = filter_waypoints;
117 m_filter_friendly = filter_friendly;
118 m_filter_hostile = filter_hostile;
119 m_filter_neutral = filter_neutral;
120 m_filter_unknown = filter_unknown;
124 void ship_select::DoDataExchange(CDataExchange* pDX)
126 CDialog::DoDataExchange(pDX);
127 //{{AFX_DATA_MAP(ship_select)
128 DDX_Control(pDX, IDC_WING_LIST, m_wing_list);
129 DDX_Control(pDX, IDC_SHIP_LIST, m_ship_list);
130 DDX_Check(pDX, IDC_FILTER_SHIPS, m_filter_ships);
131 DDX_Check(pDX, IDC_FILTER_STARTS, m_filter_starts);
132 DDX_Check(pDX, IDC_FILTER_WAYPOINTS, m_filter_waypoints);
133 DDX_Check(pDX, IDC_FILTER_SHIPS_FRIENDLY, m_filter_friendly);
134 DDX_Check(pDX, IDC_FILTER_SHIPS_HOSTILE, m_filter_hostile);
135 DDX_Check(pDX, IDC_FILTER_SHIPS_NEUTRAL, m_filter_neutral);
136 DDX_Check(pDX, IDC_FILTER_SHIPS_UNKNOWN, m_filter_unknown);
140 BEGIN_MESSAGE_MAP(ship_select, CDialog)
141 //{{AFX_MSG_MAP(ship_select)
142 ON_CBN_SELCHANGE(IDC_WING_DISPLAY_FILTER, OnSelchangeWingDisplayFilter)
143 ON_BN_CLICKED(IDC_FILTER_SHIPS, OnFilterShips)
144 ON_BN_CLICKED(IDC_FILTER_STARTS, OnFilterStarts)
145 ON_BN_CLICKED(IDC_FILTER_WAYPOINTS, OnFilterWaypoints)
146 ON_BN_CLICKED(IDC_FILTER_SHIPS_FRIENDLY, OnFilterShipsFriendly)
147 ON_BN_CLICKED(IDC_FILTER_SHIPS_HOSTILE, OnFilterShipsHostile)
148 ON_BN_CLICKED(IDC_FILTER_SHIPS_NEUTRAL, OnFilterShipsNeutral)
149 ON_BN_CLICKED(IDC_FILTER_SHIPS_UNKNOWN, OnFilterShipsUnknown)
150 ON_BN_CLICKED(IDC_CLEAR, OnClear)
151 ON_BN_CLICKED(IDC_ALL, OnAll)
152 ON_BN_CLICKED(IDC_INVERT, OnInvert)
153 ON_LBN_DBLCLK(IDC_SHIP_LIST, OnDblclkShipList)
154 ON_LBN_SELCHANGE(IDC_WING_LIST, OnSelchangeWingList)
155 ON_LBN_SELCHANGE(IDC_SHIP_LIST, OnSelchangeShipList)
156 ON_LBN_DBLCLK(IDC_WING_LIST, OnDblclkWingList)
160 /////////////////////////////////////////////////////////////////////////////
161 // ship_select message handlers
163 void ship_select::OnSelchangeWingDisplayFilter()
169 BOOL ship_select::OnInitDialog()
174 wlist_size = wplist_size = 0;
175 CDialog::OnInitDialog();
177 ptr = GET_FIRST(&obj_used_list);
178 while (ptr != END_OF_LIST(&obj_used_list))
180 flags = ptr->flags & ~OF_TEMP_MARKED;
181 if (flags & OF_MARKED)
182 flags |= OF_TEMP_MARKED;
184 flags &= ~OF_TEMP_MARKED;
192 GetDlgItem(IDC_FILTER_SHIPS_FRIENDLY)->EnableWindow(m_filter_ships);
193 GetDlgItem(IDC_FILTER_SHIPS_HOSTILE)->EnableWindow(m_filter_ships);
194 GetDlgItem(IDC_FILTER_SHIPS_NEUTRAL)->EnableWindow(m_filter_ships);
195 GetDlgItem(IDC_FILTER_SHIPS_UNKNOWN)->EnableWindow(m_filter_ships);
197 // Elements 0 - wlist_size are wings, and elements wlist_size - wplist_size are waypoint paths
198 m_wing_list.ResetContent();
200 for (i=0; i<MAX_WINGS; i++)
201 if (Wings[i].wave_count) {
202 m_wing_list.AddString(Wings[i].name);
203 wing_sel_last[wlist_size] = 0;
204 wing_index[wlist_size++] = i;
207 wplist_size = wlist_size;
208 for (i=0; i<Num_waypoint_lists; i++) {
209 m_wing_list.AddString(Waypoint_lists[i].name);
210 wing_sel_last[wplist_size] = 0;
211 wing_index[wplist_size++] = i;
217 void ship_select::create_list()
224 m_ship_list.ResetContent();
229 ptr = GET_FIRST(&obj_used_list);
230 while (ptr != END_OF_LIST(&obj_used_list))
232 if (ptr->type == OBJ_START)
234 m_ship_list.AddString(Ships[ptr->instance].ship_name);
235 obj_index[list_size++] = ptr;
236 if (ptr->flags & OF_TEMP_MARKED)
237 m_ship_list.SetSel(list_size - 1);
244 if (m_filter_ships) {
245 ptr = GET_FIRST(&obj_used_list);
246 while (ptr != END_OF_LIST(&obj_used_list))
248 if (ptr->type == OBJ_SHIP)
251 switch (Ships[ptr->instance].team)
254 flag = m_filter_friendly;
258 flag = m_filter_hostile;
262 flag = m_filter_neutral;
266 flag = m_filter_unknown;
270 flag = m_filter_hostile;
276 m_ship_list.AddString(Ships[ptr->instance].ship_name);
277 obj_index[list_size++] = ptr;
278 if (ptr->flags & OF_TEMP_MARKED)
279 m_ship_list.SetSel(list_size - 1);
287 if (m_filter_waypoints)
289 ptr = GET_FIRST(&obj_used_list);
290 while (ptr != END_OF_LIST(&obj_used_list))
292 if (ptr->type == OBJ_WAYPOINT)
294 sprintf(text, "%s:%d", Waypoint_lists[ptr->instance / 65536].name,
295 (ptr->instance & 0xffff) + 1);
296 m_ship_list.AddString(text);
297 obj_index[list_size++] = ptr;
298 if (ptr->flags & OF_TEMP_MARKED)
299 m_ship_list.SetSel(list_size - 1);
307 void ship_select::OnOK()
313 ptr = GET_FIRST(&obj_used_list);
314 while (ptr != END_OF_LIST(&obj_used_list))
316 if (ptr->flags & OF_TEMP_MARKED)
317 mark_object(OBJ_INDEX(ptr));
322 if (query_valid_object() && (Marked == 1) && (Objects[cur_object_index].type == OBJ_POINT)) {
323 Assert(Briefing_dialog);
324 Briefing_dialog->icon_select(Objects[cur_object_index].instance);
328 Briefing_dialog->icon_select(-1);
331 filter_ships = m_filter_ships;
332 filter_starts = m_filter_starts;
333 filter_waypoints = m_filter_waypoints;
334 filter_friendly = m_filter_friendly;
335 filter_hostile = m_filter_hostile;
336 filter_neutral = m_filter_neutral;
337 filter_unknown = m_filter_unknown;
341 void ship_select::update_status()
346 ptr = GET_FIRST(&obj_used_list);
347 while (ptr != END_OF_LIST(&obj_used_list)) {
348 ptr->flags &= ~OF_TEMP_MARKED;
352 for (i=0; i<list_size; i++)
354 z = m_ship_list.GetSel(i);
356 obj_index[i]->flags &= ~OF_TEMP_MARKED;
358 obj_index[i]->flags |= OF_TEMP_MARKED;
361 OnSelchangeShipList();
364 void ship_select::OnFilterShips()
368 GetDlgItem(IDC_FILTER_SHIPS_FRIENDLY)->EnableWindow(m_filter_ships);
369 GetDlgItem(IDC_FILTER_SHIPS_HOSTILE)->EnableWindow(m_filter_ships);
370 GetDlgItem(IDC_FILTER_SHIPS_NEUTRAL)->EnableWindow(m_filter_ships);
371 GetDlgItem(IDC_FILTER_SHIPS_UNKNOWN)->EnableWindow(m_filter_ships);
374 void ship_select::OnFilterStarts()
380 void ship_select::OnFilterWaypoints()
386 void ship_select::OnFilterShipsFriendly()
392 void ship_select::OnFilterShipsHostile()
398 void ship_select::OnFilterShipsNeutral()
404 void ship_select::OnFilterShipsUnknown()
410 void ship_select::OnClear()
415 ptr = GET_FIRST(&obj_used_list);
416 while (ptr != END_OF_LIST(&obj_used_list))
418 ptr->flags &= ~OF_TEMP_MARKED;
422 for (i=0; i<list_size; i++)
423 m_ship_list.SetSel(i, FALSE);
425 for (i=0; i<wplist_size; i++) {
426 wing_sel_last[i] = 0;
427 m_wing_list.SetSel(i, FALSE);
431 void ship_select::OnAll()
435 for (i=0; i<list_size; i++)
437 obj_index[i]->flags |= OF_TEMP_MARKED;
438 m_ship_list.SetSel(i);
441 for (i=0; i<wplist_size; i++) {
442 wing_sel_last[i] = 1;
443 m_wing_list.SetSel(i, TRUE);
447 void ship_select::OnInvert()
451 for (i=0; i<list_size; i++)
453 z = m_ship_list.GetSel(i);
456 obj_index[i]->flags &= ~OF_TEMP_MARKED;
457 m_ship_list.SetSel(i, FALSE);
460 obj_index[i]->flags |= OF_TEMP_MARKED;
461 m_ship_list.SetSel(i);
465 OnSelchangeShipList();
468 void ship_select::OnDblclkShipList()
472 /* int i, j, z, wing;
474 z = m_ship_list.GetCaretIndex();
475 switch (obj_index[z]->type) {
477 wing = Ships[obj_index[z]->instance].wingnum;
479 for (i=0; i<Wings[wing].wave_count; i++)
480 for (j=0; j<list_size; j++)
481 if (OBJ_INDEX(obj_index[j]) == wing_objects[wing][i]) {
482 m_ship_list.SetSel(j);
486 for (i=0; i<wlist_size; i++)
487 if (wing_index[i] == wing) {
488 m_wing_list.SetSel(i);
489 wing_sel_last[i] = 1;
501 void ship_select::OnSelchangeWingList()
508 activity = ACTIVITY_WING;
509 for (i=0; i<wlist_size; i++) {
510 z = (m_wing_list.GetSel(i) > 0) ? 1 : 0;
511 if (z != wing_sel_last[i]) {
512 for (j=0; j<Wings[wing_index[i]].wave_count; j++)
513 for (k=0; k<list_size; k++)
514 if (OBJ_INDEX(obj_index[k]) == wing_objects[wing_index[i]][j]) {
515 m_ship_list.SetSel(k, z ? TRUE : FALSE);
519 wing_sel_last[i] = z;
523 for (i=wlist_size; i<wplist_size; i++) {
524 z = (m_wing_list.GetSel(i) > 0) ? 1 : 0;
525 if (z != wing_sel_last[i]) {
526 for (j=0; j<Waypoint_lists[wing_index[i]].count; j++)
527 for (k=0; k<list_size; k++)
528 if ((obj_index[k]->type == OBJ_WAYPOINT) && (obj_index[k]->instance == wing_index[i] * 65536 + j)) {
529 m_ship_list.SetSel(k, z ? TRUE : FALSE);
533 wing_sel_last[i] = z;
540 void ship_select::OnSelchangeShipList()
547 activity = ACTIVITY_SHIP;
548 for (i=0; i<wlist_size; i++) {
550 for (j=0; j<Wings[wing_index[i]].wave_count; j++)
551 for (k=0; k<list_size; k++)
552 if (OBJ_INDEX(obj_index[k]) == wing_objects[wing_index[i]][j]) {
553 if (m_ship_list.GetSel(k))
559 if (count == Wings[wing_index[i]].wave_count)
560 wing_sel_last[i] = 1;
562 wing_sel_last[i] = 0;
564 m_wing_list.SetSel(i, wing_sel_last[i] ? TRUE : FALSE);
567 for (i=wlist_size; i<wplist_size; i++) {
569 for (j=0; j<Waypoint_lists[wing_index[i]].count; j++)
570 for (k=0; k<list_size; k++)
571 if ((obj_index[k]->type == OBJ_WAYPOINT) && (obj_index[k]->instance == wing_index[i] * 65536 + j)) {
572 if (m_ship_list.GetSel(k))
578 if (count == Waypoint_lists[wing_index[i]].count)
579 wing_sel_last[i] = 1;
581 wing_sel_last[i] = 0;
583 m_wing_list.SetSel(i, wing_sel_last[i] ? TRUE : FALSE);
589 void ship_select::OnDblclkWingList()