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