FS2_Open
Open source remastering of the Freespace 2 engine
asteroideditordlg.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 // AsteroidEditorDlg.cpp : implementation file
11 //
12 
13 #include "stdafx.h"
14 #include "FRED.h"
15 #include "AsteroidEditorDlg.h"
16 #include "starfield/starfield.h"
17 #include "FREDDoc.h"
18 #include "debris/debris.h" // Asteroid stuff.
20 
21 #ifdef _DEBUG
22 #undef THIS_FILE
23 static char THIS_FILE[] = __FILE__;
24 #endif
25 
26 #define ID_FIELD_MENU 9000
27 
28 // helps in looping over combo boxes
30 
31 
33 // asteroid_editor dialog
34 
35 asteroid_editor::asteroid_editor(CWnd* pParent /*=NULL*/)
36  : CDialog(asteroid_editor::IDD, pParent)
37 {
38  int i;
39 
40  //{{AFX_DATA_INIT(asteroid_editor)
41  m_avg_speed = 0;
42  m_density = 0;
44  m_max_x = _T("");
45  m_max_y = _T("");
46  m_max_z = _T("");
47  m_min_x = _T("");
48  m_min_y = _T("");
49  m_min_z = _T("");
52  m_box_max_x = _T("");
53  m_box_max_y = _T("");
54  m_box_max_z = _T("");
55  m_box_min_x = _T("");
56  m_box_min_y = _T("");
57  m_box_min_z = _T("");
58  //}}AFX_DATA_INIT
59 
60  last_field = -1;
61  i=0;
62 // for (i=0; i<MAX_ASTEROID_FIELDS; i++)
63  a_field[i] = Asteroid_field; // Only supporting one field per mission.
64 }
65 
66 void asteroid_editor::DoDataExchange(CDataExchange* pDX)
67 {
68  CDialog::DoDataExchange(pDX);
69  //{{AFX_DATA_MAP(asteroid_editor)
70  DDX_Control(pDX, IDC_DENSITY_SPIN, m_density_spin);
71  DDX_Text(pDX, IDC_AVG_SPEED, m_avg_speed);
72  DDX_Text(pDX, IDC_DENSITY, m_density);
74  DDX_Text(pDX, IDC_MAX_X, m_max_x);
75  DDX_Text(pDX, IDC_MAX_Y, m_max_y);
76  DDX_Text(pDX, IDC_MAX_Z, m_max_z);
77  DDX_Text(pDX, IDC_MIN_X, m_min_x);
78  DDX_Text(pDX, IDC_MIN_Y, m_min_y);
79  DDX_Text(pDX, IDC_MIN_Z, m_min_z);
81  DDX_Text(pDX, IDC_INNER_MAX_X, m_box_max_x);
82  DDX_Text(pDX, IDC_INNER_MAX_Y, m_box_max_y);
83  DDX_Text(pDX, IDC_INNER_MAX_Z, m_box_max_z);
84  DDX_Text(pDX, IDC_INNER_MIN_X, m_box_min_x);
85  DDX_Text(pDX, IDC_INNER_MIN_Y, m_box_min_y);
86  DDX_Text(pDX, IDC_INNER_MIN_Z, m_box_min_z);
87  //}}AFX_DATA_MAP
88 }
89 
90 BEGIN_MESSAGE_MAP(asteroid_editor, CDialog)
91  //{{AFX_MSG_MAP(asteroid_editor)
92  ON_WM_INITMENU()
93  ON_BN_CLICKED(IDC_ENABLE_ASTEROIDS, OnEnableAsteroids)
94  ON_WM_CLOSE()
95  ON_BN_CLICKED(IDC_ENABLE_INNER_BOX, OnEnableInnerBox)
96  ON_BN_CLICKED(IDC_PASSIVE_FIELD, OnPassiveField)
97  ON_BN_CLICKED(IDC_FIELD_SHIP, OnFieldShip)
98  ON_BN_CLICKED(IDC_ACTIVE_FIELD, OnActiveField)
99  ON_BN_CLICKED(IDC_FIELD_ASTEROID, OnFieldAsteroid)
100  //}}AFX_MSG_MAP
101 END_MESSAGE_MAP()
102 
104 // asteroid_editor message handlers
105 
106 void asteroid_editor::OnInitMenu(CMenu* pMenu)
107 {
108  int i;
109  CString str;
110  CMenu *m;
111 
112  m = pMenu->GetSubMenu(0);
113  clear_menu(m);
114  i = 0; //for (i=0; i<MAX_ASTEROID_FIELDS; i++) {
115  str.Format("Asteroid Field %d", i);
116  m->AppendMenu(MF_ENABLED | MF_STRING, ID_FIELD_MENU + i, str);
117  //}
118 
119  m->DeleteMenu(ID_PLACEHOLDER, MF_BYCOMMAND);
120  if (cur_field != -1)
121  m->CheckMenuItem(ID_FIELD_MENU + cur_field, MF_BYCOMMAND | MF_CHECKED);
122 
123  CDialog::OnInitMenu(pMenu);
124 }
125 
127 {
128  int id;
129 
130  id = LOWORD(wParam);
131  if (id >= ID_FIELD_MENU && id < ID_FIELD_MENU + 1) { //MAX_ASTEROID_FIELDS) {
132  cur_field = id - ID_FIELD_MENU;
133  update_init();
134  }
135 
136  return CDialog::OnCommand(wParam, lParam);
137 }
138 
140 {
141  int i;
142 
143  for (i=0; i<1 /*MAX_ASTEROID_FIELDS*/; i++) {
144  if (a_field[i].num_initial_asteroids != Asteroid_field.num_initial_asteroids)
145  return 1;
146  if (vm_vec_dist_quick(&a_field[i].vel, &Asteroid_field.vel) == 0.0f)
147  return 1;
148  if (a_field[i].min_bound.xyz.x != Asteroid_field.min_bound.xyz.x)
149  return 1;
150  if (a_field[i].min_bound.xyz.y != Asteroid_field.min_bound.xyz.y)
151  return 1;
152  if (a_field[i].min_bound.xyz.z != Asteroid_field.min_bound.xyz.z)
153  return 1;
154  if (a_field[i].max_bound.xyz.x != Asteroid_field.max_bound.xyz.x)
155  return 1;
156  if (a_field[i].max_bound.xyz.y != Asteroid_field.max_bound.xyz.y)
157  return 1;
158  if (a_field[i].max_bound.xyz.z != Asteroid_field.max_bound.xyz.z)
159  return 1;
160 
161 
162  if (a_field[i].has_inner_bound != Asteroid_field.has_inner_bound)
163  return 1;
164 
165  if (a_field[i].field_type != Asteroid_field.field_type)
166  return 1;
167 
168  if (a_field[i].has_inner_bound) {
169  if (a_field[i].inner_max_bound.xyz.x != Asteroid_field.inner_max_bound.xyz.x)
170  return 1;
171 
172  if (a_field[i].inner_max_bound.xyz.y != Asteroid_field.inner_max_bound.xyz.y)
173  return 1;
174 
175  if (a_field[i].inner_max_bound.xyz.z != Asteroid_field.inner_max_bound.xyz.z)
176  return 1;
177 
178  if (a_field[i].inner_min_bound.xyz.x != Asteroid_field.inner_min_bound.xyz.x)
179  return 1;
180 
181  if (a_field[i].inner_min_bound.xyz.y != Asteroid_field.inner_min_bound.xyz.y)
182  return 1;
183 
184  if (a_field[i].inner_min_bound.xyz.z != Asteroid_field.inner_min_bound.xyz.z)
185  return 1;
186  }
187 
188  }
189 
190  return 0;
191 }
192 
193 #define MIN_BOX_THICKNESS 400
195 {
196  if (!m_enable_asteroids) {
197  return 1;
198  } else {
199  // check x
200  if (a_field[0].max_bound.xyz.x < a_field[0].min_bound.xyz.x) {
201  MessageBox("Asteroid x min is greater than max");
202  return 0;
203  }
204 
205  // check y
206  if (a_field[0].max_bound.xyz.y < a_field[0].min_bound.xyz.y) {
207  MessageBox("Asteroid y min is greater than max");
208  return 0;
209  }
210 
211  // check z
212  if (a_field[0].max_bound.xyz.z < a_field[0].min_bound.xyz.z) {
213  MessageBox("Asteroid z min is greater than max");
214  return 0;
215  }
216 
217  // check if inner bounds enabled
218  if (a_field[0].has_inner_bound) {
219  if (a_field[0].inner_max_bound.xyz.x < a_field[0].inner_min_bound.xyz.x) {
220  MessageBox("Asteroid x inner min is greater than inner max");
221  return 0;
222  }
223 
224  if (a_field[0].inner_max_bound.xyz.y < a_field[0].inner_min_bound.xyz.y) {
225  MessageBox("Asteroid y inner min is greater than inner max");
226  return 0;
227  }
228 
229  if (a_field[0].inner_max_bound.xyz.z < a_field[0].inner_min_bound.xyz.z) {
230  MessageBox("Asteroid z inner min is greater than inner max");
231  return 0;
232  }
233 
234  // check x thickness
235  if (a_field[0].inner_min_bound.xyz.x - MIN_BOX_THICKNESS < a_field[0].min_bound.xyz.x) {
236  MessageBox("Asteroid x thickness from outer box to inner box must be > 400");
237  return 0;
238  }
239 
240  if (a_field[0].inner_max_bound.xyz.x + MIN_BOX_THICKNESS > a_field[0].max_bound.xyz.x) {
241  MessageBox("Asteroid x thickness from outer box to inner box must be > 400");
242  return 0;
243  }
244 
245  // check y thickness
246  if (a_field[0].inner_min_bound.xyz.y - MIN_BOX_THICKNESS < a_field[0].min_bound.xyz.y) {
247  MessageBox("Asteroid y thickness from outer box to inner box must be > 400");
248  return 0;
249  }
250 
251  if (a_field[0].inner_max_bound.xyz.y + MIN_BOX_THICKNESS > a_field[0].max_bound.xyz.y) {
252  MessageBox("Asteroid y thickness from outer box to inner box must be > 400");
253  return 0;
254  }
255 
256  // check z thickness
257  if (a_field[0].inner_min_bound.xyz.z - MIN_BOX_THICKNESS < a_field[0].min_bound.xyz.z) {
258  MessageBox("Asteroid z thickness from outer box to inner box must be > 400");
259  return 0;
260  }
261 
262  if (a_field[0].inner_max_bound.xyz.z + MIN_BOX_THICKNESS > a_field[0].max_bound.xyz.z) {
263  MessageBox("Asteroid z thickness from outer box to inner box must be > 400");
264  return 0;
265  }
266  }
267 
268  // check if passive, ship debris field, at least one speceis selected
269  if (a_field[0].field_type == FT_PASSIVE) {
270  if (a_field[0].debris_genre == DG_SHIP) {
271  if ( (a_field[0].field_debris_type[0] == -1) && (a_field[0].field_debris_type[1] == -1) && (a_field[0].field_debris_type[2] == -1) ) {
272  MessageBox("You must choose one or more types of ship debris");
273  return 0;
274  }
275  }
276  }
277 
278  // check at least one asteroid subtype is selected
279  if (a_field[0].debris_genre == DG_ASTEROID) {
280  if ( (a_field[0].field_debris_type[0] == -1) && (a_field[0].field_debris_type[1] == -1) && (a_field[0].field_debris_type[2] == -1) ) {
281  MessageBox("You must choose one or more asteroid subtypes");
282  return 0;
283  }
284  }
285 
286  }
287 
288  return 1;
289 }
290 
291 
292 
293 
295 {
296  int i;
297 
298  update_init();
299  if (!validate_data()) {
300  return;
301  }
302  for (i=0; i<1 /*MAX_ASTEROID_FIELDS*/; i++)
303  Asteroid_field = a_field[i];
304 
307  CDialog::OnOK();
308 }
309 
311 {
312 
313 
314  cur_field = 0;
315  CDialog::OnInitDialog();
316  update_init();
318 
319  m_density_spin.SetRange(1, MAX_ASTEROIDS);
320  return TRUE;
321 }
322 
324 {
325  int num_asteroids, idx, cur_choice;
326 
327  UpdateData(TRUE);
328  if (last_field >= 0) {
329  // store into temp asteroid field
330  num_asteroids = a_field[last_field].num_initial_asteroids;
332  if (a_field[last_field].num_initial_asteroids < 0)
334 
335  if (a_field[last_field].num_initial_asteroids > MAX_ASTEROIDS)
337 
338  if (num_asteroids != a_field[last_field].num_initial_asteroids)
339  set_modified();
340 
341  vec3d vel_vec = {1.0f, 0.0f, 0.0f};
342  vm_vec_scale(&vel_vec, (float) m_avg_speed);
343 
344  MODIFY(a_field[last_field].vel.xyz.x, vel_vec.xyz.x);
345  MODIFY(a_field[last_field].vel.xyz.y, vel_vec.xyz.y);
346  MODIFY(a_field[last_field].vel.xyz.z, vel_vec.xyz.z);
347 
348  MODIFY(a_field[last_field].min_bound.xyz.x, (float) atof(m_min_x));
349  MODIFY(a_field[last_field].min_bound.xyz.y, (float) atof(m_min_y));
350  MODIFY(a_field[last_field].min_bound.xyz.z, (float) atof(m_min_z));
351  MODIFY(a_field[last_field].max_bound.xyz.x, (float) atof(m_max_x));
352  MODIFY(a_field[last_field].max_bound.xyz.y, (float) atof(m_max_y));
353  MODIFY(a_field[last_field].max_bound.xyz.z, (float) atof(m_max_z));
354 
355  // type of field
356  MODIFY(a_field[last_field].field_type, m_field_type);
357  MODIFY(a_field[last_field].debris_genre, m_debris_genre);
358  if ( (m_field_type == FT_PASSIVE) && (m_debris_genre == DG_SHIP) ) {
359  // we should have ship debris
360  for (idx=0; idx<MAX_ACTIVE_DEBRIS_TYPES; idx++) {
361  // loop over combo boxes, store the item data of the cur selection, -1 in no cur selection
362  int cur_sel = ((CComboBox*)GetDlgItem(Dlg_id[idx]))->GetCurSel();
363  if (cur_sel != CB_ERR) {
364  cur_choice = ((CComboBox*)GetDlgItem(Dlg_id[idx]))->GetItemData(cur_sel);
365  } else {
366  cur_choice = -1;
367  }
368  MODIFY(a_field[cur_field].field_debris_type[idx], cur_choice);
369  }
370  }
371 
372  if ( m_debris_genre == DG_ASTEROID ) {
373  if ( ((CButton *)GetDlgItem(IDC_SUBTYPE1))->GetCheck() == 1) {
374  cur_choice = 1;
375  } else {
376  cur_choice = -1;
377  }
378  MODIFY(a_field[cur_field].field_debris_type[0], cur_choice);
379 
380 
381  if ( ((CButton *)GetDlgItem(IDC_SUBTYPE2))->GetCheck() == 1) {
382  cur_choice = 1;
383  } else {
384  cur_choice = -1;
385  }
386  MODIFY(a_field[cur_field].field_debris_type[1], cur_choice);
387 
388 
389  if ( ((CButton *)GetDlgItem(IDC_SUBTYPE3))->GetCheck() == 1) {
390  cur_choice = 1;
391  } else {
392  cur_choice = -1;
393  }
394  MODIFY(a_field[cur_field].field_debris_type[2], cur_choice);
395  }
396 
397  MODIFY(a_field[last_field].has_inner_bound, m_enable_inner_bounds);
398 
399  MODIFY(a_field[last_field].inner_min_bound.xyz.x, (float) atof(m_box_min_x));
400  MODIFY(a_field[last_field].inner_min_bound.xyz.y, (float) atof(m_box_min_y));
401  MODIFY(a_field[last_field].inner_min_bound.xyz.z, (float) atof(m_box_min_z));
402  MODIFY(a_field[last_field].inner_max_bound.xyz.x, (float) atof(m_box_max_x));
403  MODIFY(a_field[last_field].inner_max_bound.xyz.y, (float) atof(m_box_max_y));
404  MODIFY(a_field[last_field].inner_max_bound.xyz.z, (float) atof(m_box_max_z));
405  }
406 
407  Assert(cur_field >= 0);
408  // get from temp asteroid field into class
412  if (!m_enable_asteroids)
413  m_density = 10;
414 
415  // set field type
418 // m_debris_species = a_field[cur_field].debris_species;
419 
421  m_min_x.Format("%.1f", a_field[cur_field].min_bound.xyz.x);
422  m_min_y.Format("%.1f", a_field[cur_field].min_bound.xyz.y);
423  m_min_z.Format("%.1f", a_field[cur_field].min_bound.xyz.z);
424  m_max_x.Format("%.1f", a_field[cur_field].max_bound.xyz.x);
425  m_max_y.Format("%.1f", a_field[cur_field].max_bound.xyz.y);
426  m_max_z.Format("%.1f", a_field[cur_field].max_bound.xyz.z);
427 
428  m_box_min_x.Format("%.1f", a_field[cur_field].inner_min_bound.xyz.x);
429  m_box_min_y.Format("%.1f", a_field[cur_field].inner_min_bound.xyz.y);
430  m_box_min_z.Format("%.1f", a_field[cur_field].inner_min_bound.xyz.z);
431  m_box_max_x.Format("%.1f", a_field[cur_field].inner_max_bound.xyz.x);
432  m_box_max_y.Format("%.1f", a_field[cur_field].inner_max_bound.xyz.y);
433  m_box_max_z.Format("%.1f", a_field[cur_field].inner_max_bound.xyz.z);
434 
435  // set up combo boxes
436  uint i;
437  int j, k, index, box_index;
438 
439  // add "None" to each box
440  for (k = 0; k < MAX_ACTIVE_DEBRIS_TYPES; k++)
441  {
442  box_index = ((CComboBox*)GetDlgItem(Dlg_id[k]))->AddString("None");
443  ((CComboBox*)GetDlgItem(Dlg_id[k]))->SetItemData(box_index, static_cast<DWORD_PTR>(-1));
444  }
445 
446  // now add each kind of debris to each box
447  CString name;
448  char *debris_size[NUM_DEBRIS_SIZES] = { "Small", "Medium", "Large" };
449 
450  // each species
451  for (i = 0; i < Species_info.size(); i++)
452  {
453  // each size
454  for (j = 0; j < NUM_DEBRIS_SIZES; j++)
455  {
456  name = CString(Species_info[i].species_name) + " " + debris_size[j];
457  index = NUM_DEBRIS_SIZES + ((i * NUM_DEBRIS_SIZES) + j);
458 
459  // each box
460  for (k = 0; k < MAX_ACTIVE_DEBRIS_TYPES; k++)
461  {
462  box_index = ((CComboBox*)GetDlgItem(Dlg_id[k]))->AddString(name);
463  ((CComboBox*)GetDlgItem(Dlg_id[k]))->SetItemData(box_index, index);
464  }
465  }
466  }
467 
468  // set active debris type for each combo box
469  int box_count, cur_box_data;
470  for (idx=0;idx<MAX_ACTIVE_DEBRIS_TYPES; idx++) {
471  // Only set selection if not "None"
472  if (a_field[cur_field].field_debris_type[idx] != -1) {
473  box_count = ((CComboBox*)GetDlgItem(Dlg_id[idx]))->GetCount();
474  for (box_index=0; box_index<box_count; box_index++) {
475  cur_box_data = ((CComboBox*)GetDlgItem(Dlg_id[idx]))->GetItemData(box_index);
476  if (cur_box_data == a_field[cur_field].field_debris_type[idx]) {
477  // set cur sel
478  ((CComboBox*)GetDlgItem(Dlg_id[idx]))->SetCurSel(box_index);
479  break;
480  }
481  }
482  }
483  }
484 
485  // set up asteroid subtype checkboxes
486  ((CButton*)GetDlgItem(IDC_SUBTYPE1))->SetCheck(a_field[cur_field].field_debris_type[0] == 1);
487  ((CButton*)GetDlgItem(IDC_SUBTYPE2))->SetCheck(a_field[cur_field].field_debris_type[1] == 1);
488  ((CButton*)GetDlgItem(IDC_SUBTYPE3))->SetCheck(a_field[cur_field].field_debris_type[2] == 1);
489 
490 
491  UpdateData(FALSE);
493 
495 }
496 
498 {
499  UpdateData(TRUE);
500  GetDlgItem(IDC_DENSITY)->EnableWindow(m_enable_asteroids);
501  GetDlgItem(IDC_DENSITY_SPIN)->EnableWindow(m_enable_asteroids);
502  GetDlgItem(IDC_AVG_SPEED)->EnableWindow(m_enable_asteroids);
503  GetDlgItem(IDC_MIN_X)->EnableWindow(m_enable_asteroids);
504  GetDlgItem(IDC_MIN_Y)->EnableWindow(m_enable_asteroids);
505  GetDlgItem(IDC_MIN_Z)->EnableWindow(m_enable_asteroids);
506  GetDlgItem(IDC_MAX_X)->EnableWindow(m_enable_asteroids);
507  GetDlgItem(IDC_MAX_Y)->EnableWindow(m_enable_asteroids);
508  GetDlgItem(IDC_MAX_Z)->EnableWindow(m_enable_asteroids);
509 
510  GetDlgItem(IDC_ENABLE_INNER_BOX)->EnableWindow(m_enable_asteroids);
511  GetDlgItem(IDC_PASSIVE_FIELD)->EnableWindow(m_enable_asteroids);
512  GetDlgItem(IDC_ACTIVE_FIELD)->EnableWindow(m_enable_asteroids);
513 
514  GetDlgItem(IDC_FIELD_SHIP)->EnableWindow(m_enable_asteroids);
515  GetDlgItem(IDC_FIELD_ASTEROID)->EnableWindow(m_enable_asteroids);
516  GetDlgItem(IDC_SHIP_DEBRIS1)->EnableWindow(m_enable_asteroids && (Asteroid_field.debris_genre == DG_SHIP));
517  GetDlgItem(IDC_SHIP_DEBRIS2)->EnableWindow(m_enable_asteroids && (Asteroid_field.debris_genre == DG_SHIP));
518  GetDlgItem(IDC_SHIP_DEBRIS3)->EnableWindow(m_enable_asteroids && (Asteroid_field.debris_genre == DG_SHIP));
519  GetDlgItem(IDC_SUBTYPE1)->EnableWindow(m_enable_asteroids && (Asteroid_field.debris_genre == DG_ASTEROID));
520  GetDlgItem(IDC_SUBTYPE2)->EnableWindow(m_enable_asteroids && (Asteroid_field.debris_genre == DG_ASTEROID));
521  GetDlgItem(IDC_SUBTYPE3)->EnableWindow(m_enable_asteroids && (Asteroid_field.debris_genre == DG_ASTEROID));
522 
524  OnEnableField();
525 }
526 
528 {
530  CDialog::OnCancel();
531 }
532 
534 {
535  int z;
536 
537  update_init();
538  if (query_modified()) {
539  z = MessageBox("Do you want to keep your changes?", "Close", MB_ICONQUESTION | MB_YESNOCANCEL);
540  if (z == IDCANCEL)
541  return;
542 
543  if (z == IDYES) {
544  OnOK();
545  return;
546  }
547  }
548 
549  CDialog::OnClose();
550 }
551 
552 // enable inner box (asteroid free zone)
553 // only allowed for active debris field
555 {
556  UpdateData(TRUE);
557 
558  GetDlgItem(IDC_INNER_MIN_X)->EnableWindow(m_enable_inner_bounds && m_enable_asteroids);
559  GetDlgItem(IDC_INNER_MAX_X)->EnableWindow(m_enable_inner_bounds && m_enable_asteroids);
560  GetDlgItem(IDC_INNER_MIN_Y)->EnableWindow(m_enable_inner_bounds && m_enable_asteroids);
561  GetDlgItem(IDC_INNER_MAX_Y)->EnableWindow(m_enable_inner_bounds && m_enable_asteroids);
562  GetDlgItem(IDC_INNER_MIN_Z)->EnableWindow(m_enable_inner_bounds && m_enable_asteroids);
563  GetDlgItem(IDC_INNER_MAX_Z)->EnableWindow(m_enable_inner_bounds && m_enable_asteroids);
564 }
565 
566 //
568 {
569  // set check in active
570  if (m_enable_asteroids) {
571  if (m_field_type == FT_ACTIVE) {
572  OnActiveField();
573  } else {
574  OnPassiveField();
575  }
576  }
577 
578  // maybe enable species
580  OnFieldShip();
581  }
582 }
583 
584 
586 {
587  // set field type
590 
591  // gray out ship and species
592  GetDlgItem(IDC_FIELD_SHIP)->EnableWindow(FALSE);
593  GetDlgItem(IDC_SHIP_DEBRIS1)->EnableWindow(FALSE);
594  GetDlgItem(IDC_SHIP_DEBRIS2)->EnableWindow(FALSE);
595  GetDlgItem(IDC_SHIP_DEBRIS3)->EnableWindow(FALSE);
596  GetDlgItem(IDC_SUBTYPE1)->EnableWindow(TRUE);
597  GetDlgItem(IDC_SUBTYPE2)->EnableWindow(TRUE);
598  GetDlgItem(IDC_SUBTYPE3)->EnableWindow(TRUE);
599 
600  // force check of asteroid
601  ((CButton*)GetDlgItem(IDC_FIELD_ASTEROID))->SetCheck(1);
602  ((CButton*)GetDlgItem(IDC_FIELD_SHIP))->SetCheck(0);
603 
604  // force check of active field
605  ((CButton*)GetDlgItem(IDC_ACTIVE_FIELD))->SetCheck(1);
606  ((CButton*)GetDlgItem(IDC_PASSIVE_FIELD))->SetCheck(0);
607 
608  // enable inner box
609  GetDlgItem(IDC_ENABLE_INNER_BOX)->EnableWindow(TRUE);
610 }
611 
613 {
614  // set field type
616 
617  // acivate ship
618  GetDlgItem(IDC_FIELD_SHIP)->EnableWindow(TRUE);
619 
620  // maybe activate species
621  GetDlgItem(IDC_SHIP_DEBRIS1)->EnableWindow(m_debris_genre == DG_SHIP);
622  GetDlgItem(IDC_SHIP_DEBRIS2)->EnableWindow(m_debris_genre == DG_SHIP);
623  GetDlgItem(IDC_SHIP_DEBRIS3)->EnableWindow(m_debris_genre == DG_SHIP);
624 
625  // maybe activate asteroid subtype
626  GetDlgItem(IDC_SUBTYPE1)->EnableWindow(m_debris_genre == DG_ASTEROID);
627  GetDlgItem(IDC_SUBTYPE2)->EnableWindow(m_debris_genre == DG_ASTEROID);
628  GetDlgItem(IDC_SUBTYPE3)->EnableWindow(m_debris_genre == DG_ASTEROID);
629 
630 
631  // force check of current debris type
632  ((CButton*)GetDlgItem(IDC_FIELD_ASTEROID))->SetCheck(m_debris_genre == DG_ASTEROID);
633  ((CButton*)GetDlgItem(IDC_FIELD_SHIP))->SetCheck(m_debris_genre == DG_SHIP);
634 
635  // force check of passive field
636  ((CButton*)GetDlgItem(IDC_ACTIVE_FIELD))->SetCheck(0);
637  ((CButton*)GetDlgItem(IDC_PASSIVE_FIELD))->SetCheck(1);
638 
639  // disable inner box
640  GetDlgItem(IDC_ENABLE_INNER_BOX)->EnableWindow(FALSE);
641 }
642 
644 {
645  // set debris type
647 
648  GetDlgItem(IDC_SHIP_DEBRIS1)->EnableWindow(TRUE);
649  GetDlgItem(IDC_SHIP_DEBRIS2)->EnableWindow(TRUE);
650  GetDlgItem(IDC_SHIP_DEBRIS3)->EnableWindow(TRUE);
651 
652  GetDlgItem(IDC_SUBTYPE1)->EnableWindow(FALSE);
653  GetDlgItem(IDC_SUBTYPE2)->EnableWindow(FALSE);
654  GetDlgItem(IDC_SUBTYPE3)->EnableWindow(FALSE);
655 
656  // force check of ship
657  ((CButton*)GetDlgItem(IDC_FIELD_ASTEROID))->SetCheck(0);
658  ((CButton*)GetDlgItem(IDC_FIELD_SHIP))->SetCheck(1);
659 
660 }
661 
663 {
664  // set debris type
666 
667  GetDlgItem(IDC_SHIP_DEBRIS1)->EnableWindow(FALSE);
668  GetDlgItem(IDC_SHIP_DEBRIS2)->EnableWindow(FALSE);
669  GetDlgItem(IDC_SHIP_DEBRIS3)->EnableWindow(FALSE);
670 
671 
672  GetDlgItem(IDC_SUBTYPE1)->EnableWindow(TRUE);
673  GetDlgItem(IDC_SUBTYPE2)->EnableWindow(TRUE);
674  GetDlgItem(IDC_SUBTYPE3)->EnableWindow(TRUE);
675 
676  // force check of asteroid
677  ((CButton*)GetDlgItem(IDC_FIELD_ASTEROID))->SetCheck(1);
678  ((CButton*)GetDlgItem(IDC_FIELD_SHIP))->SetCheck(0);
679 }
void record_window_data(window_data *wndd, CWnd *wnd)
Definition: fred.cpp:670
field_type_t field_type
Definition: asteroid.h:136
virtual BOOL OnInitDialog()
afx_msg void OnFieldAsteroid()
int i
Definition: multi_pxo.cpp:466
CFREDApp theApp
Definition: fred.cpp:115
#define IDC_AVG_SPEED
Definition: resource.h:723
#define IDC_SUBTYPE2
Definition: resource.h:1035
float vm_vec_mag(const vec3d *v)
Definition: vecmat.cpp:325
GLuint index
Definition: Glext.h:5608
#define IDC_MAX_Y
Definition: resource.h:719
Assert(pm!=NULL)
Definition: pstypes.h:88
int init_window(window_data *wndd, CWnd *wnd, int adjust=0, int pre=0)
Definition: fred.cpp:639
#define MB_ICONQUESTION
Definition: config.h:188
int Dlg_id[MAX_ACTIVE_DEBRIS_TYPES]
struct vec3d::@225::@227 xyz
#define NUM_DEBRIS_SIZES
Definition: asteroid.h:26
#define TRUE
Definition: pstypes.h:399
UINT WPARAM wParam
Definition: msacm.h:1064
#define IDC_INNER_MAX_Z
Definition: resource.h:750
#define IDC_INNER_MIN_Z
Definition: resource.h:748
#define MB_YESNOCANCEL
Definition: config.h:183
UINT WPARAM LPARAM lParam
Definition: msacm.h:1064
afx_msg void OnPassiveField()
#define IDC_MAX_X
Definition: resource.h:717
vec3d inner_min_bound
Definition: asteroid.h:131
vec3d min_bound
Definition: asteroid.h:127
#define MODIFY(a, b)
Definition: fred.h:26
afx_msg void OnEnableInnerBox()
vec3d max_bound
Definition: asteroid.h:128
#define IDC_MIN_Y
Definition: resource.h:718
long LPARAM
Definition: config.h:101
#define IDC_INNER_MIN_X
Definition: resource.h:740
CSpinButtonCtrl m_density_spin
int num_initial_asteroids
Definition: asteroid.h:135
#define IDC_ACTIVE_FIELD
Definition: resource.h:237
typedef int(SCP_EXT_CALLCONV *SCPDLL_PFVERSION)(SCPDLL_Version *)
afx_msg void OnActiveField()
window_data Asteroid_wnd_data
Definition: fred.cpp:74
unsigned int uint
Definition: pstypes.h:64
void vm_vec_scale(vec3d *dest, float s)
Definition: vecmat.cpp:248
#define IDC_SUBTYPE1
Definition: resource.h:1033
field_type_t m_field_type
#define IDC_MIN_X
Definition: resource.h:716
#define MIN_BOX_THICKNESS
GLdouble GLdouble z
Definition: Glext.h:5451
#define IDC_DENSITY
Definition: resource.h:722
afx_msg void OnEnableAsteroids()
#define IDC_SHIP_DEBRIS1
Definition: resource.h:530
asteroid_editor(CWnd *pParent=NULL)
GLenum GLuint id
Definition: Glext.h:5156
#define ID_FIELD_MENU
int idx
Definition: multiui.cpp:761
#define IDC_MAX_Z
Definition: resource.h:721
#define IDC_INNER_MAX_X
Definition: resource.h:742
#define IDC_SUBTYPE3
Definition: resource.h:1038
void set_modified(BOOL arg)
Definition: freddoc.cpp:676
GLuint const GLchar * name
Definition: Glext.h:5608
#define IDC_SHIP_DEBRIS3
Definition: resource.h:549
int BOOL
Definition: config.h:80
#define IDC_INNER_MIN_Y
Definition: resource.h:744
debris_genre_t m_debris_genre
float vm_vec_dist_quick(const vec3d *v0, const vec3d *v1)
Definition: vecmat.cpp:417
afx_msg void OnFieldShip()
afx_msg void OnClose()
int MessageBox(HWND h, const char *s1, const char *s2, int i)
int has_inner_bound
Definition: asteroid.h:130
SCP_vector< species_info > Species_info
const GLfloat * m
Definition: Glext.h:10319
vec3d inner_max_bound
Definition: asteroid.h:132
debris_genre_t debris_genre
Definition: asteroid.h:137
#define ID_PLACEHOLDER
Definition: resource.h:1288
virtual void DoDataExchange(CDataExchange *pDX)
#define IDC_INNER_MAX_Y
Definition: resource.h:746
#define MAX_ASTEROIDS
Definition: asteroid.h:24
#define IDC_FIELD_ASTEROID
Definition: resource.h:228
asteroid_field Asteroid_field
Definition: asteroid.cpp:64
void clear_menu(CMenu *ptr)
#define IDC_MIN_Z
Definition: resource.h:720
#define IDC_ENABLE_ASTEROIDS
Definition: resource.h:182
asteroid_field a_field[1]
#define FALSE
Definition: pstypes.h:400
#define MAX_ACTIVE_DEBRIS_TYPES
Definition: asteroid.h:34
#define IDC_ENABLE_INNER_BOX
Definition: resource.h:990
#define IDC_PASSIVE_FIELD
Definition: resource.h:244
#define IDC_FIELD_SHIP
Definition: resource.h:218
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam)
#define IDC_SHIP_DEBRIS2
Definition: resource.h:546
void update_map_window()
Definition: fred.cpp:532
#define IDC_DENSITY_SPIN
Definition: resource.h:724