FS2_Open
Open source remastering of the Freespace 2 engine
ship_select.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) Volition, Inc. 1999. All rights reserved.
3  *
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 the
6  * source.
7  *
8 */
9 
10 
11 
12 #include "stdafx.h"
13 #include "FRED.h"
14 #include "ship_select.h"
15 #include "globalincs/linklist.h"
16 #include "object/object.h"
17 #include "ship/ship.h"
18 #include "Management.h"
19 #include "FREDView.h"
20 
21 #define ACTIVITY_SHIP 1
22 #define ACTIVITY_WING 2
23 
24 #ifdef _DEBUG
25 #undef THIS_FILE
26 static char THIS_FILE[] = __FILE__;
27 #endif
28 
32 
35 
37 
39 // ship_select dialog
40 
41 ship_select::ship_select(CWnd* pParent /*=NULL*/)
42  : CDialog(ship_select::IDD, pParent)
43 {
44  int i;
45 
46  //{{AFX_DATA_INIT(ship_select)
50  //}}AFX_DATA_INIT
51 
52  // this is stupid
63 
64  if (filter_iff_inited == FALSE)
65  {
66  for (i = 0; i < MAX_IFFS; i++)
67  filter_iff[i] = TRUE;
68 
70  }
71 
75 
76  for (i = 0; i < MAX_IFFS; i++)
77  m_filter_iff[i] = filter_iff[i];
78 
79  activity = 0;
80 
81  wing_index.reserve(MAX_WINGS);
82  wing_sel_last.reserve(MAX_WINGS);
83 }
84 
85 void ship_select::DoDataExchange(CDataExchange* pDX)
86 {
87  int i;
88 
89  CDialog::DoDataExchange(pDX);
90  //{{AFX_DATA_MAP(ship_select)
91  DDX_Control(pDX, IDC_WING_LIST, m_wing_list);
92  DDX_Control(pDX, IDC_SHIP_LIST, m_ship_list);
93  DDX_Check(pDX, IDC_FILTER_SHIPS, m_filter_ships);
94  DDX_Check(pDX, IDC_FILTER_STARTS, m_filter_starts);
96  for (i = 0; i < MAX_IFFS; i++)
97  DDX_Check(pDX, IDC_FILTER_SHIPS_IFF[i], m_filter_iff[i]);
98  //}}AFX_DATA_MAP
99 }
100 
101 BEGIN_MESSAGE_MAP(ship_select, CDialog)
102  //{{AFX_MSG_MAP(ship_select)
103  ON_CBN_SELCHANGE(IDC_WING_DISPLAY_FILTER, OnSelchangeWingDisplayFilter)
104  ON_BN_CLICKED(IDC_FILTER_SHIPS, OnFilterShips)
105  ON_BN_CLICKED(IDC_FILTER_STARTS, OnFilterStarts)
106  ON_BN_CLICKED(IDC_FILTER_WAYPOINTS, OnFilterWaypoints)
107  ON_BN_CLICKED(IDC_FILTER_SHIPS_IFF_0, OnFilterShipsIFF0)
108  ON_BN_CLICKED(IDC_FILTER_SHIPS_IFF_1, OnFilterShipsIFF1)
109  ON_BN_CLICKED(IDC_FILTER_SHIPS_IFF_2, OnFilterShipsIFF2)
110  ON_BN_CLICKED(IDC_FILTER_SHIPS_IFF_3, OnFilterShipsIFF3)
111  ON_BN_CLICKED(IDC_FILTER_SHIPS_IFF_4, OnFilterShipsIFF4)
112  ON_BN_CLICKED(IDC_FILTER_SHIPS_IFF_5, OnFilterShipsIFF5)
113  ON_BN_CLICKED(IDC_FILTER_SHIPS_IFF_6, OnFilterShipsIFF6)
114  ON_BN_CLICKED(IDC_FILTER_SHIPS_IFF_7, OnFilterShipsIFF7)
115  ON_BN_CLICKED(IDC_FILTER_SHIPS_IFF_8, OnFilterShipsIFF8)
116  ON_BN_CLICKED(IDC_FILTER_SHIPS_IFF_9, OnFilterShipsIFF9)
117  ON_BN_CLICKED(IDC_CLEAR, OnClear)
118  ON_BN_CLICKED(IDC_ALL, OnAll)
119  ON_BN_CLICKED(IDC_INVERT, OnInvert)
120  ON_LBN_DBLCLK(IDC_SHIP_LIST, OnDblclkShipList)
121  ON_LBN_SELCHANGE(IDC_WING_LIST, OnSelchangeWingList)
122  ON_LBN_SELCHANGE(IDC_SHIP_LIST, OnSelchangeShipList)
123  ON_LBN_DBLCLK(IDC_WING_LIST, OnDblclkWingList)
124  //}}AFX_MSG_MAP
125 END_MESSAGE_MAP()
126 
128 // ship_select message handlers
129 
130 void ship_select::OnSelchangeWingDisplayFilter()
131 {
132  UpdateData(TRUE);
133  create_list();
134 }
135 
137 {
138  int i, flags;
139  object *ptr;
140 
141  CDialog::OnInitDialog();
142 
143  ptr = GET_FIRST(&obj_used_list);
144  while (ptr != END_OF_LIST(&obj_used_list))
145  {
146  flags = ptr->flags & ~OF_TEMP_MARKED;
147  if (flags & OF_MARKED)
148  flags |= OF_TEMP_MARKED;
149  else
150  flags &= ~OF_TEMP_MARKED;
151 
152  ptr->flags = flags;
153  ptr = GET_NEXT(ptr);
154  }
155 
156  list_size = 0;
157  create_list();
158 
159  // init dialog stuff
160  for (i = 0; i < MAX_IFFS; i++)
161  {
162  if (i < Num_iffs)
163  {
164  GetDlgItem(IDC_FILTER_SHIPS_IFF[i])->SetWindowText(Iff_info[i].iff_name);
165  }
166 
167  GetDlgItem(IDC_FILTER_SHIPS_IFF[i])->ShowWindow(i < Num_iffs);
168  }
169 
170  for (i = 0; i < Num_iffs; i++)
171  GetDlgItem(IDC_FILTER_SHIPS_IFF[i])->EnableWindow(m_filter_ships);
172 
173  wlist_size = wplist_size = 0;
174  wing_index.clear();
175  wing_sel_last.clear();
176 
177  // Elements 0 - wlist_size are wings, and elements wlist_size - wplist_size are waypoint paths
178  m_wing_list.ResetContent();
179  wlist_size = 0;
180  for (i=0; i<MAX_WINGS; i++) {
181  if (Wings[i].wave_count) {
182  m_wing_list.AddString(Wings[i].name);
183  wing_sel_last.push_back(0);
184  wing_index.push_back(i);
185  wlist_size++;
186  }
187  }
188 
189  wplist_size = wlist_size;
190 
192  for (i = 0, ii = Waypoint_lists.begin(); ii != Waypoint_lists.end(); ++i, ++ii) {
193  m_wing_list.AddString(ii->get_name());
194  wing_sel_last.push_back(0);
195  wing_index.push_back(i);
196  wplist_size++;
197  }
198 
199  return TRUE;
200 }
201 
203 {
204  char text[512];
205  object *ptr;
206 
207  update_status(true);
208  m_ship_list.ResetContent();
209  list_size = 0;
210 
211  if (m_filter_starts)
212  {
213  ptr = GET_FIRST(&obj_used_list);
214  while (ptr != END_OF_LIST(&obj_used_list))
215  {
216  if (ptr->type == OBJ_START)
217  {
218  m_ship_list.AddString(Ships[ptr->instance].ship_name);
219  obj_index[list_size++] = ptr;
220  if (ptr->flags & OF_TEMP_MARKED)
221  m_ship_list.SetSel(list_size - 1);
222  }
223 
224  ptr = GET_NEXT(ptr);
225  }
226  }
227 
228  if (m_filter_ships) {
229  ptr = GET_FIRST(&obj_used_list);
230  while (ptr != END_OF_LIST(&obj_used_list))
231  {
232  if (ptr->type == OBJ_SHIP)
233  {
234  if (m_filter_iff[Ships[ptr->instance].team])
235  {
236  m_ship_list.AddString(Ships[ptr->instance].ship_name);
237  obj_index[list_size++] = ptr;
238  if (ptr->flags & OF_TEMP_MARKED)
239  m_ship_list.SetSel(list_size - 1);
240  }
241  }
242 
243  ptr = GET_NEXT(ptr);
244  }
245  }
246 
247  if (m_filter_waypoints)
248  {
249  ptr = GET_FIRST(&obj_used_list);
250  while (ptr != END_OF_LIST(&obj_used_list))
251  {
252  if (ptr->type == OBJ_WAYPOINT)
253  {
254  int waypoint_num;
255  waypoint_list *wp_list = find_waypoint_list_with_instance(ptr->instance, &waypoint_num);
256  Assert(wp_list != NULL);
257  sprintf(text, "%s:%d", wp_list->get_name(), waypoint_num + 1);
258  m_ship_list.AddString(text);
259  obj_index[list_size++] = ptr;
260  if (ptr->flags & OF_TEMP_MARKED)
261  m_ship_list.SetSel(list_size - 1);
262  }
263 
264  ptr = GET_NEXT(ptr);
265  }
266  }
267 }
268 
270 {
271  int i;
272  object *ptr;
273 
274  unmark_all();
275  update_status();
276  ptr = GET_FIRST(&obj_used_list);
277  while (ptr != END_OF_LIST(&obj_used_list))
278  {
279  if (ptr->flags & OF_TEMP_MARKED)
280  mark_object(OBJ_INDEX(ptr));
281 
282  ptr = GET_NEXT(ptr);
283  }
284 
285  if (query_valid_object() && (Marked == 1) && (Objects[cur_object_index].type == OBJ_POINT)) {
288 
289  } else {
290  if (Briefing_dialog)
292  }
293 
297 
298  for (i = 0; i < MAX_IFFS; i++)
299  filter_iff[i] = m_filter_iff[i];
300 
301  CDialog::OnOK();
302 }
303 
304 void ship_select::update_status(bool first_time)
305 {
306  int i, z;
307  object *ptr;
308 
309  ptr = GET_FIRST(&obj_used_list);
310  while (ptr != END_OF_LIST(&obj_used_list)) {
311  ptr->flags &= ~OF_TEMP_MARKED;
312  ptr = GET_NEXT(ptr);
313  }
314 
315  for (i=0; i<list_size; i++)
316  {
317  z = m_ship_list.GetSel(i);
318  if (z < 1)
319  obj_index[i]->flags &= ~OF_TEMP_MARKED;
320  else
321  obj_index[i]->flags |= OF_TEMP_MARKED;
322  }
323  if(!first_time)
325 }
326 
328 {
329  int i;
330 
331  UpdateData(TRUE);
332  create_list();
333 
334  for (i = 0; i < Num_iffs; i++)
335  GetDlgItem(IDC_FILTER_SHIPS_IFF[i])->EnableWindow(m_filter_ships);
336 }
337 
339 {
340  UpdateData(TRUE);
341  create_list();
342 }
343 
345 {
346  UpdateData(TRUE);
347  create_list();
348 }
349 
351 {
352  UpdateData(true);
353  create_list();
354 }
355 
357 {
358  int i;
359  object *ptr;
360 
361  ptr = GET_FIRST(&obj_used_list);
362  while (ptr != END_OF_LIST(&obj_used_list))
363  {
364  ptr->flags &= ~OF_TEMP_MARKED;
365  ptr = GET_NEXT(ptr);
366  }
367 
368  for (i=0; i<list_size; i++)
369  m_ship_list.SetSel(i, FALSE);
370 
371  for (i=0; i<wplist_size; i++) {
372  wing_sel_last[i] = 0;
373  m_wing_list.SetSel(i, FALSE);
374  }
375 }
376 
378 {
379  int i;
380 
381  for (i=0; i<list_size; i++)
382  {
383  obj_index[i]->flags |= OF_TEMP_MARKED;
384  m_ship_list.SetSel(i);
385  }
386 
387  for (i=0; i<wplist_size; i++) {
388  wing_sel_last[i] = 1;
389  m_wing_list.SetSel(i, TRUE);
390  }
391 }
392 
394 {
395  int i, z;
396 
397  for (i=0; i<list_size; i++)
398  {
399  z = m_ship_list.GetSel(i);
400  if (z > 0)
401  {
402  obj_index[i]->flags &= ~OF_TEMP_MARKED;
403  m_ship_list.SetSel(i, FALSE);
404 
405  } else {
406  obj_index[i]->flags |= OF_TEMP_MARKED;
407  m_ship_list.SetSel(i);
408  }
409  }
410 
412 }
413 
415 {
416  OnOK();
417 
418 /* int i, j, z, wing;
419 
420  z = m_ship_list.GetCaretIndex();
421  switch (obj_index[z]->type) {
422  case OBJ_SHIP:
423  wing = Ships[obj_index[z]->instance].wingnum;
424  if (wing >= 0) {
425  for (i=0; i<Wings[wing].wave_count; i++)
426  for (j=0; j<list_size; j++)
427  if (OBJ_INDEX(obj_index[j]) == wing_objects[wing][i]) {
428  m_ship_list.SetSel(j);
429  break;
430  }
431 
432  for (i=0; i<wlist_size; i++)
433  if (wing_index[i] == wing) {
434  m_wing_list.SetSel(i);
435  wing_sel_last[i] = 1;
436  break;
437  }
438  }
439 
440  break;
441 
442  case OBJ_WAYPOINT:
443  break;
444  }*/
445 }
446 
448 {
449  int i, j, k, z;
450 
451  if (activity)
452  return;
453 
454  activity = ACTIVITY_WING;
455  for (i=0; i<wlist_size; i++) {
456  z = (m_wing_list.GetSel(i) > 0) ? 1 : 0;
457  if (z != wing_sel_last[i]) {
458  for (j=0; j<Wings[wing_index[i]].wave_count; j++)
459  for (k=0; k<list_size; k++)
460  if (OBJ_INDEX(obj_index[k]) == wing_objects[wing_index[i]][j]) {
461  m_ship_list.SetSel(k, z ? TRUE : FALSE);
462  break;
463  }
464 
465  wing_sel_last[i] = z;
466  }
467  }
468 
469  for (i=wlist_size; i<wplist_size; i++) {
470  z = (m_wing_list.GetSel(i) > 0) ? 1 : 0;
471  if (z != wing_sel_last[i]) {
472  waypoint_list *wp_list = find_waypoint_list_at_index(wing_index[i]);
473  Assert(wp_list != NULL);
475  for (j = 0, jj = wp_list->get_waypoints().begin(); jj != wp_list->get_waypoints().end(); ++j, ++jj) {
476  for (k=0; k<list_size; k++) {
477  if ((obj_index[k]->type == OBJ_WAYPOINT) && (obj_index[k]->instance == calc_waypoint_instance(wing_index[i], j))) {
478  m_ship_list.SetSel(k, z ? TRUE : FALSE);
479  break;
480  }
481  }
482  }
483 
484  wing_sel_last[i] = z;
485  }
486  }
487 
488  activity = 0;
489 }
490 
492 {
493  int i, j, k, count;
494 
495  if (activity)
496  return;
497 
498  activity = ACTIVITY_SHIP;
499  for (i=0; i<wlist_size; i++) {
500  count = 0;
501  for (j=0; j<Wings[wing_index[i]].wave_count; j++)
502  for (k=0; k<list_size; k++)
503  if (OBJ_INDEX(obj_index[k]) == wing_objects[wing_index[i]][j]) {
504  if (m_ship_list.GetSel(k))
505  count++;
506 
507  break;
508  }
509 
510  if (count == Wings[wing_index[i]].wave_count)
511  wing_sel_last[i] = 1;
512  else
513  wing_sel_last[i] = 0;
514 
515  m_wing_list.SetSel(i, wing_sel_last[i] ? TRUE : FALSE);
516  }
517 
518  for (i=wlist_size; i<wplist_size; i++) {
519  waypoint_list *wp_list = find_waypoint_list_at_index(wing_index[i]);
520  Assert(wp_list != NULL);
522 
523  count = 0;
524  for (j = 0, jj = wp_list->get_waypoints().begin(); jj != wp_list->get_waypoints().end(); ++j, ++jj) {
525  for (k=0; k<list_size; k++) {
526  if ((obj_index[k]->type == OBJ_WAYPOINT) && (obj_index[k]->instance == calc_waypoint_instance(wing_index[i], j))) {
527  if (m_ship_list.GetSel(k))
528  count++;
529 
530  break;
531  }
532  }
533  }
534 
535  if ((uint) count == wp_list->get_waypoints().size())
536  wing_sel_last[i] = 1;
537  else
538  wing_sel_last[i] = 0;
539 
540  m_wing_list.SetSel(i, wing_sel_last[i] ? TRUE : FALSE);
541  }
542 
543  activity = 0;
544 }
545 
547 {
548  OnOK();
549 }
550 
552 {
553  OnFilterShipsIFF(0);
554 }
555 
557 {
558  OnFilterShipsIFF(1);
559 }
560 
562 {
563  OnFilterShipsIFF(2);
564 }
565 
567 {
568  OnFilterShipsIFF(3);
569 }
570 
572 {
573  OnFilterShipsIFF(4);
574 }
575 
577 {
578  OnFilterShipsIFF(5);
579 }
580 
582 {
583  OnFilterShipsIFF(6);
584 }
585 
587 {
588  OnFilterShipsIFF(7);
589 }
590 
592 {
593  OnFilterShipsIFF(8);
594 }
595 
597 {
598  OnFilterShipsIFF(9);
599 }
600 
BOOL m_filter_iff[MAX_IFFS]
Definition: ship_select.h:37
wing Wings[MAX_WINGS]
Definition: ship.cpp:128
int i
Definition: multi_pxo.cpp:466
afx_msg void OnAll()
int team
Definition: ship.h:606
ship_select(CWnd *pParent=NULL)
Definition: ship_select.cpp:41
void OnFilterShipsIFF(int iff)
afx_msg void OnFilterShipsIFF9()
char * get_name()
Definition: waypoint.cpp:84
#define OF_TEMP_MARKED
Definition: object.h:126
void unmark_all()
#define MAX_WINGS
Definition: globals.h:50
afx_msg void OnFilterWaypoints()
waypoint_list * find_waypoint_list_with_instance(int waypoint_instance, int *waypoint_index)
Definition: waypoint.cpp:254
afx_msg void OnFilterShipsIFF2()
Assert(pm!=NULL)
#define IDC_FILTER_SHIPS_IFF_4
Definition: resource.h:613
#define IDC_FILTER_SHIPS_IFF_9
Definition: resource.h:623
#define TRUE
Definition: pstypes.h:399
afx_msg void OnFilterShipsIFF0()
object obj_used_list
Definition: object.cpp:53
int Marked
Definition: fredview.cpp:101
afx_msg void OnSelchangeShipList()
#define IDC_FILTER_SHIPS_IFF_5
Definition: resource.h:615
#define IDC_FILTER_SHIPS_IFF_3
Definition: resource.h:608
SCP_list< waypoint_list > Waypoint_lists
Definition: waypoint.cpp:9
int calc_waypoint_instance(int waypoint_list_index, int waypoint_index)
Definition: waypoint.cpp:111
GLenum type
Definition: Gl.h:1492
afx_msg void OnClear()
afx_msg void OnFilterShipsIFF1()
iff_info Iff_info[MAX_IFFS]
Definition: iff_defs.cpp:20
#define ACTIVITY_SHIP
Definition: ship_select.cpp:21
SCP_vector< waypoint > & get_waypoints()
Definition: waypoint.cpp:89
int query_valid_object(int index)
afx_msg void OnInvert()
#define IDC_FILTER_SHIPS_IFF_7
Definition: resource.h:619
#define OBJ_WAYPOINT
Definition: object.h:36
int instance
Definition: object.h:150
int filter_ships
Definition: ship_select.cpp:29
#define OBJ_START
Definition: object.h:35
unsigned int uint
Definition: pstypes.h:64
#define IDC_INVERT
Definition: resource.h:611
int filter_iff_inited
Definition: ship_select.cpp:34
BOOL m_filter_starts
Definition: ship_select.h:35
afx_msg void OnFilterShipsIFF3()
#define IDC_WING_LIST
Definition: resource.h:760
CListBox m_wing_list
Definition: ship_select.h:32
sprintf(buf,"(%f,%f,%f)", v3->xyz.x, v3->xyz.y, v3->xyz.z)
GLdouble GLdouble z
Definition: Glext.h:5451
#define IDC_FILTER_STARTS
Definition: resource.h:603
int IDC_FILTER_SHIPS_IFF[MAX_IFFS]
Definition: ship_select.cpp:36
void create_list()
int wing_objects[MAX_WINGS][MAX_SHIPS_PER_WING]
Definition: management.cpp:97
int filter_starts
Definition: ship_select.cpp:30
#define IDC_FILTER_SHIPS_IFF_2
Definition: resource.h:607
int wave_count
Definition: ship.h:1527
object Objects[MAX_OBJECTS]
Definition: object.cpp:62
afx_msg void OnFilterShipsIFF5()
BOOL m_filter_ships
Definition: ship_select.h:34
#define OBJ_INDEX(objp)
Definition: object.h:235
afx_msg void OnDblclkWingList()
#define OF_MARKED
Definition: object.h:125
virtual BOOL OnInitDialog()
void update_status(bool first_time=false)
afx_msg void OnFilterShipsIFF4()
#define OBJ_SHIP
Definition: object.h:32
GLbitfield flags
Definition: Glext.h:6722
#define IDC_FILTER_SHIPS
Definition: resource.h:604
#define IDC_SHIP_LIST
Definition: resource.h:548
GLuint const GLchar * name
Definition: Glext.h:5608
int filter_iff[MAX_IFFS]
Definition: ship_select.cpp:33
int BOOL
Definition: config.h:80
CListBox m_ship_list
Definition: ship_select.h:33
ship Ships[MAX_SHIPS]
Definition: ship.cpp:122
#define ACTIVITY_WING
Definition: ship_select.cpp:22
#define IDC_FILTER_SHIPS_IFF_0
Definition: resource.h:605
afx_msg void OnFilterShipsIFF8()
waypoint_list * find_waypoint_list_at_index(int index)
Definition: waypoint.cpp:291
void mark_object(int obj)
#define IDC_FILTER_SHIPS_IFF_6
Definition: resource.h:617
#define IDC_ALL
Definition: resource.h:609
afx_msg void OnFilterShips()
afx_msg void OnSelchangeWingList()
GLint GLsizei count
Definition: Gl.h:1491
#define IDC_FILTER_SHIPS_IFF_8
Definition: resource.h:621
#define IDC_WING_DISPLAY_FILTER
Definition: resource.h:543
#define MAX_IFFS
Definition: globals.h:34
int cur_object_index
Definition: management.cpp:79
afx_msg void OnDblclkShipList()
afx_msg void OnFilterShipsIFF6()
#define IDC_CLEAR
Definition: resource.h:610
#define IDC_FILTER_WAYPOINTS
Definition: resource.h:602
BOOL m_filter_waypoints
Definition: ship_select.h:36
int Num_iffs
Definition: iff_defs.cpp:19
briefing_editor_dlg * Briefing_dialog
Definition: fred.cpp:59
virtual void DoDataExchange(CDataExchange *pDX)
Definition: ship_select.cpp:85
uint flags
Definition: object.h:151
#define IDC_FILTER_SHIPS_IFF_1
Definition: resource.h:606
afx_msg void OnFilterStarts()
char type
Definition: object.h:146
#define FALSE
Definition: pstypes.h:400
#define OBJ_POINT
Definition: object.h:40
afx_msg void OnFilterShipsIFF7()
char ship_name[NAME_LENGTH]
Definition: ship.h:604
int filter_waypoints
Definition: ship_select.cpp:31