]> icculus.org git repositories - taylor/freespace2.git/blob - src/fred2/shipflagsdlg.cpp
fix issue with looping audio streams
[taylor/freespace2.git] / src / fred2 / shipflagsdlg.cpp
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
6  * the source.
7  */
8
9 // ShipFlagsDlg.cpp : implementation file
10 //
11
12 #include "stdafx.h"
13 #include "fred.h"
14 #include "shipflagsdlg.h"
15 #include "linklist.h"
16
17 #ifdef _DEBUG
18 #define new DEBUG_NEW
19 #undef THIS_FILE
20 static char THIS_FILE[] = __FILE__;
21 #endif
22
23 /////////////////////////////////////////////////////////////////////////////
24 // ship_flags_dlg dialog
25
26 ship_flags_dlg::ship_flags_dlg(CWnd* pParent /*=NULL*/)
27         : CDialog(ship_flags_dlg::IDD, pParent)
28 {
29         //{{AFX_DATA_INIT(ship_flags_dlg)
30         //}}AFX_DATA_INIT
31 }
32
33 void ship_flags_dlg::DoDataExchange(CDataExchange* pDX)
34 {
35         int n;
36         CString str;
37
38         CDialog::DoDataExchange(pDX);
39         //{{AFX_DATA_MAP(ship_flags_dlg)
40         DDX_Control(pDX, IDC_REDALERTCARRY, m_red_alert_carry);
41         DDX_Control(pDX, IDC_SCANNABLE, m_scannable);
42         DDX_Control(pDX, IDC_REINFORCEMENT, m_reinforcement);
43         DDX_Control(pDX, IDC_PROTECT_SHIP, m_protect_ship);
44         DDX_Control(pDX, IDC_BEAM_PROTECT_SHIP, m_beam_protect_ship);
45         DDX_Control(pDX, IDC_NO_DYNAMIC, m_no_dynamic);
46         DDX_Control(pDX, IDC_NO_ARRIVAL_MUSIC, m_no_arrival_music);
47         DDX_Control(pDX, IDC_KAMIKAZE, m_kamikaze);
48         DDX_Control(pDX, IDC_INVULNERABLE, m_invulnerable);
49         DDX_Control(pDX, IDC_IGNORE_COUNT, m_ignore_count);
50         DDX_Control(pDX, IDC_HIDDEN_FROM_SENSORS, m_hidden);
51         DDX_Control(pDX, IDC_ESCORT, m_escort);
52         DDX_Control(pDX, IDC_DESTROY_CHECK, m_destroy);
53         DDX_Control(pDX, IDC_CARGO_KNOWN, m_cargo_known);
54         DDX_Control(pDX, IDC_DESTROY_SPIN, m_destroy_spin);     
55         DDX_Control(pDX, IDC_SPECIAL_WARP, m_special_warp);     
56         //}}AFX_DATA_MAP
57
58         if (pDX->m_bSaveAndValidate) {  // get dialog control values
59                 GetDlgItem(IDC_DESTROY_VALUE)->GetWindowText(str);
60                 n = atoi(str);
61                 if (n < 0)
62                         n = 0;
63
64                 m_destroy_value.init(n);
65
66                 GetDlgItem(IDC_KDAMAGE)->GetWindowText(str);
67                 m_kdamage.init(atoi(str));
68
69                 //  get escort priority
70                 GetDlgItem(IDC_ESCORT_PRIORITY)->GetWindowText(str);
71                 m_escort_value.init(atoi(str));
72
73                 // get respawn priority
74                 if(The_mission.game_type & MISSION_TYPE_MULTI){
75                         GetDlgItem(IDC_RESPAWN_PRIORITY)->GetWindowText(str);
76                         m_respawn_priority.init(atoi(str));
77                 }
78         }
79 }
80
81 BEGIN_MESSAGE_MAP(ship_flags_dlg, CDialog)
82         //{{AFX_MSG_MAP(ship_flags_dlg)
83         ON_BN_CLICKED(IDC_CARGO_KNOWN, OnCargoKnown)
84         ON_BN_CLICKED(IDC_DESTROY_CHECK, OnDestroyCheck)
85         ON_BN_CLICKED(IDC_ESCORT, OnEscort)
86         ON_BN_CLICKED(IDC_HIDDEN_FROM_SENSORS, OnHiddenFromSensors)
87         ON_BN_CLICKED(IDC_IGNORE_COUNT, OnIgnoreCount)
88         ON_BN_CLICKED(IDC_INVULNERABLE, OnInvulnerable)
89         ON_BN_CLICKED(IDC_KAMIKAZE, OnKamikaze)
90         ON_BN_CLICKED(IDC_NO_ARRIVAL_MUSIC, OnNoArrivalMusic)
91         ON_BN_CLICKED(IDC_NO_DYNAMIC, OnNoDynamic)
92         ON_BN_CLICKED(IDC_PROTECT_SHIP, OnProtectShip)
93         ON_BN_CLICKED(IDC_BEAM_PROTECT_SHIP, OnBeamProtectShip)
94         ON_BN_CLICKED(IDC_REINFORCEMENT, OnReinforcement)
95         ON_BN_CLICKED(IDC_SCANNABLE, OnScannable)
96         ON_BN_CLICKED(IDC_REDALERTCARRY, OnRedalertcarry)
97         //}}AFX_MSG_MAP
98 END_MESSAGE_MAP()
99
100 /////////////////////////////////////////////////////////////////////////////
101 // ship_flags_dlg message handlers
102
103 void ship_flags_dlg::setup(int n)
104 {
105         p_enable = n;
106 }
107
108 BOOL ship_flags_dlg::OnInitDialog() 
109 {
110         int i, j, first;
111         int protect_ship = 0, beam_protect_ship = 0, ignore_count = 0, reinforcement = 0, cargo_known = 0, destroy_before_mission = 0;
112         int no_arrival_music = 0, escort = 0, invulnerable = 0, hidden_from_sensors = 0;
113         int scannable = 0, kamikaze = 0, no_dynamic = 0, red_alert_carry = 0, special_warp = 0;
114         object *objp;
115         bool ship_in_wing = false;
116
117         first = 1;
118         objp = GET_FIRST(&obj_used_list);
119         while (objp != END_OF_LIST(&obj_used_list)) {
120                 if ((objp->type == OBJ_START) || (objp->type == OBJ_SHIP)) {
121                         if (objp->flags & OF_MARKED) {
122                                 i = objp->instance;
123                                 if (first) {
124                                         first = 0;
125                                         scannable = (Ships[i].flags & SF_SCANNABLE) ? 1 : 0;
126                                         red_alert_carry = (Ships[i].flags & SF_RED_ALERT_STORE_STATUS) ? 1 : 0;
127                                         special_warp = (Objects[Ships[i].objnum].flags & OF_SPECIAL_WARP) ? 1 : 0;
128                                         protect_ship = (Objects[Ships[i].objnum].flags & OF_PROTECTED) ? 1 : 0;
129                                         beam_protect_ship = (Objects[Ships[i].objnum].flags & OF_BEAM_PROTECTED) ? 1 : 0;
130                                         invulnerable = (Ships[i].flags & SF_INVULNERABLE) ? 1 : 0;
131                                         hidden_from_sensors = (Ships[i].flags & SF_HIDDEN_FROM_SENSORS) ? 1 : 0;
132                                         ignore_count = (Ships[i].flags & SF_IGNORE_COUNT) ? 1 : 0;
133                                         no_arrival_music = (Ships[i].flags & SF_NO_ARRIVAL_MUSIC) ? 1 : 0;
134                                         cargo_known = (Ships[i].flags & SF_CARGO_REVEALED) ? 1 : 0;
135                                         no_dynamic = (Ai_info[Ships[i].ai_index].ai_flags & AIF_NO_DYNAMIC) ? 1 : 0;
136
137                                         destroy_before_mission = (Ships[i].flags & SF_KILL_BEFORE_MISSION) ? 1 : 0;
138                                         m_destroy_value.init(Ships[i].final_death_time);
139
140                                         kamikaze = (Ai_info[Ships[i].ai_index].ai_flags & AIF_KAMIKAZE) ? 1 : 0;
141                                         m_kdamage.init( (int) Ai_info[Ships[i].ai_index].kamikaze_damage );
142
143                                         escort = (Ships[i].flags & SF_ESCORT) ? 1 : 0;
144                                         m_escort_value.init(Ships[i].escort_priority);
145                                         
146                                         if(The_mission.game_type & MISSION_TYPE_MULTI){
147                                                 m_respawn_priority.init(Ships[i].respawn_priority);
148                                         }
149
150                                         for (j=0; j<Num_reinforcements; j++){
151                                                 if (!stricmp(Reinforcements[j].name, Ships[i].ship_name)){
152                                                         break;
153                                                 }
154                                         }
155
156                                         reinforcement = (j < Num_reinforcements) ? 1 : 0;
157
158                                         // check if ship in wing
159                                         ship_in_wing = (Ships[i].wingnum != -1);;
160                                 } else {
161
162                                         scannable = tristate_set( Ships[i].flags & SF_SCANNABLE, scannable );
163                                         red_alert_carry = tristate_set( Ships[i].flags & SF_RED_ALERT_STORE_STATUS, red_alert_carry );
164                                         special_warp = tristate_set( Objects[Ships[i].objnum].flags & OF_SPECIAL_WARP, special_warp );
165                                         protect_ship = tristate_set(Objects[Ships[i].objnum].flags & OF_PROTECTED, protect_ship);
166                                         beam_protect_ship = tristate_set(Objects[Ships[i].objnum].flags & OF_BEAM_PROTECTED, beam_protect_ship);
167                                         invulnerable = tristate_set(Ships[i].flags & SF_INVULNERABLE, invulnerable);
168                                         hidden_from_sensors = tristate_set(Ships[i].flags & SF_HIDDEN_FROM_SENSORS, hidden_from_sensors);
169                                         ignore_count = tristate_set(Ships[i].flags & SF_IGNORE_COUNT, ignore_count);
170                                         no_arrival_music = tristate_set(Ships[i].flags & SF_NO_ARRIVAL_MUSIC, no_arrival_music);
171                                         cargo_known = tristate_set(Ships[i].flags & SF_CARGO_REVEALED, cargo_known);
172                                         no_dynamic = tristate_set( Ai_info[Ships[i].ai_index].ai_flags & AIF_NO_DYNAMIC, no_dynamic );
173
174                                         // check the final death time and set the internal variable according to whether or not
175                                         // the final_death_time is set.  Also, the value in the edit box must be set if all the
176                                         // values are the same, and cleared if the values are not the same.
177                                         destroy_before_mission = tristate_set(Ships[i].flags & SF_KILL_BEFORE_MISSION, destroy_before_mission);
178                                         m_destroy_value.set(Ships[i].final_death_time);
179
180                                         kamikaze = tristate_set( Ai_info[Ships[i].ai_index].ai_flags & AIF_KAMIKAZE, kamikaze );
181                                         m_kdamage.set( (int) Ai_info[Ships[i].ai_index].kamikaze_damage );
182
183                                         escort = tristate_set(Ships[i].flags & SF_ESCORT, escort);
184                                         m_escort_value.init(Ships[i].escort_priority);
185
186                                         if(The_mission.game_type & MISSION_TYPE_MULTI){
187                                                 m_respawn_priority.init(Ships[i].escort_priority);
188                                         }
189
190                                         for (j=0; j<Num_reinforcements; j++){
191                                                 if (!stricmp(Reinforcements[j].name, Ships[i].ship_name)){
192                                                         break;
193                                                 }
194                                         }
195                                         reinforcement = tristate_set(j < Num_reinforcements, reinforcement);
196
197                                         // check if ship in wing
198                                         ship_in_wing = (Ships[i].wingnum != -1);;
199                                 }
200
201                         }
202                 }
203
204                 objp = GET_NEXT(objp);
205         }
206
207         CDialog::OnInitDialog();
208         
209         m_protect_ship.SetCheck(protect_ship);
210         m_beam_protect_ship.SetCheck(beam_protect_ship);
211         m_ignore_count.SetCheck(ignore_count);
212         m_reinforcement.SetCheck(reinforcement);
213         m_cargo_known.SetCheck(cargo_known);
214         m_destroy.SetCheck(destroy_before_mission);
215         m_no_arrival_music.SetCheck(no_arrival_music);
216         m_escort.SetCheck(escort);
217         m_invulnerable.SetCheck(invulnerable);
218         m_hidden.SetCheck(hidden_from_sensors);
219         m_scannable.SetCheck(scannable);
220         m_kamikaze.SetCheck(kamikaze);
221         m_no_dynamic.SetCheck(no_dynamic);
222         m_red_alert_carry.SetCheck(red_alert_carry);
223         m_special_warp.SetCheck(special_warp);
224                 
225         m_kdamage.setup(IDC_KDAMAGE, this);
226         m_destroy_value.setup(IDC_DESTROY_VALUE, this);
227         m_escort_value.setup(IDC_ESCORT_PRIORITY, this);
228
229         if(The_mission.game_type & MISSION_TYPE_MULTI){
230                 m_respawn_priority.setup(IDC_RESPAWN_PRIORITY, this);
231         }
232         m_destroy_spin.SetRange(0, UD_MAXVAL);
233
234         m_destroy_value.display();
235         m_kdamage.display();
236         m_escort_value.display();
237
238         if(The_mission.game_type & MISSION_TYPE_MULTI){
239                 m_respawn_priority.display();
240         } else {
241                 GetDlgItem(IDC_RESPAWN_PRIORITY)->EnableWindow(FALSE);
242         }
243
244         GetDlgItem(IDC_REINFORCEMENT)->EnableWindow(p_enable);
245         GetDlgItem(IDC_CARGO_KNOWN)->EnableWindow(p_enable);
246         GetDlgItem(IDC_PROTECT_SHIP)->EnableWindow(p_enable);
247         GetDlgItem(IDC_DESTROY_CHECK)->EnableWindow(p_enable);
248         GetDlgItem(IDC_DESTROY_VALUE)->EnableWindow(p_enable);
249         GetDlgItem(IDC_DESTROY_SPIN)->EnableWindow(p_enable);
250         GetDlgItem(IDC_SCANNABLE)->EnableWindow(p_enable);
251
252         // disable the spinner and edit window if the corrsponding check box
253         // is not checked!
254         if (m_destroy.GetCheck() != 1) {
255                 GetDlgItem(IDC_DESTROY_VALUE)->EnableWindow(FALSE);
256                 GetDlgItem(IDC_DESTROY_SPIN)->EnableWindow(FALSE);
257         }
258
259         // disable destroy option for ship in wing
260         if (ship_in_wing) {
261                 GetDlgItem(IDC_DESTROY_CHECK)->EnableWindow(FALSE);
262                 GetDlgItem(IDC_DESTROY_VALUE)->EnableWindow(FALSE);
263                 GetDlgItem(IDC_DESTROY_SPIN)->EnableWindow(FALSE);
264         }
265
266         // maybe disable escort priority window
267         if (m_escort.GetCheck() == 1)
268                 GetDlgItem(IDC_ESCORT_PRIORITY)->EnableWindow(TRUE);
269         else
270                 GetDlgItem(IDC_ESCORT_PRIORITY)->EnableWindow(FALSE);
271
272         // maybe disable kamikaze damage window
273         if (m_kamikaze.GetCheck() == 1)
274                 GetDlgItem(IDC_KDAMAGE)->EnableWindow(TRUE);
275         else
276                 GetDlgItem(IDC_KDAMAGE)->EnableWindow(FALSE);
277
278         return TRUE;
279 }
280
281 void ship_flags_dlg::OnOK()
282 {
283         object *objp;
284
285         objp = GET_FIRST(&obj_used_list);
286         while (objp != END_OF_LIST(&obj_used_list)) {
287                 if ((objp->type == OBJ_START) || (objp->type == OBJ_SHIP)) {
288                         if (objp->flags & OF_MARKED)
289                                 update_ship(objp->instance);
290                 }
291
292                 objp = GET_NEXT(objp);
293         }
294
295         CDialog::OnOK();
296 }
297
298 void ship_flags_dlg::update_ship(int ship)
299 {
300         if (m_reinforcement.GetCheck() != 2)
301                 set_reinforcement(Ships[ship].ship_name, m_reinforcement.GetCheck());
302
303         switch (m_cargo_known.GetCheck()) {
304                 case 1:
305                         if ( !(Ships[ship].flags & SF_CARGO_REVEALED) )
306                                 set_modified();
307
308                         Ships[ship].flags |= SF_CARGO_REVEALED;
309                         break;
310
311                 case 0:
312                         if ( Ships[ship].flags & SF_CARGO_REVEALED )
313                                 set_modified();
314
315                         Ships[ship].flags &= ~SF_CARGO_REVEALED;
316                         break;
317         }
318
319         // update the flags for IGNORE_COUNT and PROTECT_SHIP
320         switch (m_protect_ship.GetCheck()) {
321                 case 1:
322                         if (!(Objects[Ships[ship].objnum].flags & OF_PROTECTED) )
323                                 set_modified();
324
325                         Objects[Ships[ship].objnum].flags |= OF_PROTECTED;
326                         break;
327
328                 case 0:
329                         if ( Objects[Ships[ship].objnum].flags & OF_PROTECTED )
330                                 set_modified();
331
332                         Objects[Ships[ship].objnum].flags &= ~OF_PROTECTED;
333                         break;
334         }
335
336         switch (m_beam_protect_ship.GetCheck()) {
337                 case 1:
338                         if (!(Objects[Ships[ship].objnum].flags & OF_BEAM_PROTECTED) )
339                                 set_modified();
340
341                         Objects[Ships[ship].objnum].flags |= OF_BEAM_PROTECTED;
342                         break;
343
344                 case 0:
345                         if ( Objects[Ships[ship].objnum].flags & OF_BEAM_PROTECTED )
346                                 set_modified();
347
348                         Objects[Ships[ship].objnum].flags &= ~OF_BEAM_PROTECTED;
349                         break;
350         }
351
352         switch (m_invulnerable.GetCheck()) {
353                 case 1:
354                         if ( !(Ships[ship].flags & SF_INVULNERABLE) )
355                                 set_modified();
356
357                         Ships[ship].flags |= SF_INVULNERABLE;
358                         break;
359
360                 case 0:
361                         if ( Ships[ship].flags & SF_INVULNERABLE )
362                                 set_modified();
363
364                         Ships[ship].flags &= ~SF_INVULNERABLE;
365                         break;
366         }
367
368         switch (m_hidden.GetCheck()) {
369                 case 1:
370                         if ( !(Ships[ship].flags & SF_HIDDEN_FROM_SENSORS) )
371                                 set_modified();
372
373                         Ships[ship].flags |= SF_HIDDEN_FROM_SENSORS;
374                         break;
375
376                 case 0:
377                         if ( Ships[ship].flags & SF_HIDDEN_FROM_SENSORS )
378                                 set_modified();
379
380                         Ships[ship].flags &= ~SF_HIDDEN_FROM_SENSORS;
381                         break;
382         }
383
384         switch (m_ignore_count.GetCheck()) {
385                 case 1:
386                         if ( !(Ships[ship].flags & SF_IGNORE_COUNT) )
387                                 set_modified();
388
389                         Ships[ship].flags |= SF_IGNORE_COUNT;
390                         break;
391
392                 case 0:
393                         if (Ships[ship].flags & SF_IGNORE_COUNT)
394                                 set_modified();
395
396                         Ships[ship].flags &= ~SF_IGNORE_COUNT;
397                         break;
398         }
399
400         switch (m_escort.GetCheck()) {
401                 case 1:
402                         if (!(Ships[ship].flags & SF_ESCORT))
403                                 set_modified();
404
405                         Ships[ship].flags |= SF_ESCORT;
406                         m_escort_value.save(&Ships[ship].escort_priority);
407                         break;
408
409                 case 0:
410                         if (Ships[ship].flags & SF_ESCORT)
411                                 set_modified();
412
413                         Ships[ship].flags &= ~SF_ESCORT;
414                         break;
415         }
416
417         // deal with updating the "destroy before the mission" stuff
418         switch (m_destroy.GetCheck()) {
419                 case 0:  // this means no check in checkbox
420                         if ( Ships[ship].flags & SF_KILL_BEFORE_MISSION )
421                                 set_modified();
422
423                         Ships[ship].flags &= ~SF_KILL_BEFORE_MISSION;
424                         break;
425
426                 case 1:  // this means checkbox is checked
427                         if ( !(Ships[ship].flags & SF_KILL_BEFORE_MISSION) )
428                                 set_modified();
429
430                         Ships[ship].flags |= SF_KILL_BEFORE_MISSION;
431                         m_destroy_value.save(&Ships[ship].final_death_time);
432                         break;
433         }  // a mixed state is 2, and since it's not handled, it doesn't change
434
435         switch (m_no_arrival_music.GetCheck()) {
436                 case 0:
437                         if (Ships[ship].flags & SF_NO_ARRIVAL_MUSIC)
438                                 set_modified();
439
440                         Ships[ship].flags &= ~SF_NO_ARRIVAL_MUSIC;
441                         break;
442
443                 case 1:
444                         if (!(Ships[ship].flags & SF_NO_ARRIVAL_MUSIC))
445                                 set_modified();
446
447                         Ships[ship].flags |= SF_NO_ARRIVAL_MUSIC;
448                         break;
449         }
450
451         switch (m_scannable.GetCheck()) {
452                 case 1:
453                         if ( !(Ships[ship].flags & SF_SCANNABLE) )
454                                 set_modified();
455
456                         Ships[ship].flags |= SF_SCANNABLE;
457                         break;
458
459                 case 0:
460                         if ( Ships[ship].flags & SF_SCANNABLE )
461                                 set_modified();
462
463                         Ships[ship].flags &= ~SF_SCANNABLE;
464                         break;
465         }
466
467         switch (m_red_alert_carry.GetCheck()) {
468                 case 1:
469                         if ( !(Ships[ship].flags & SF_RED_ALERT_STORE_STATUS) )
470                                 set_modified();
471
472                         Ships[ship].flags |= SF_RED_ALERT_STORE_STATUS;
473                         break;
474
475                 case 0:
476                         if ( Ships[ship].flags & SF_RED_ALERT_STORE_STATUS )
477                                 set_modified();
478
479                         Ships[ship].flags &= ~SF_RED_ALERT_STORE_STATUS;
480                         break;
481         }
482
483         switch (m_special_warp.GetCheck()) {
484                 case 1:
485                         if ( !(Objects[Ships[ship].objnum].flags & OF_SPECIAL_WARP) )
486                                 set_modified();
487
488                         Objects[Ships[ship].objnum].flags |= OF_SPECIAL_WARP;
489                         break;
490
491                 case 0:
492                         if ( (Objects[Ships[ship].objnum].flags & OF_SPECIAL_WARP) )
493                                 set_modified();
494
495                         Objects[Ships[ship].objnum].flags &= (~OF_SPECIAL_WARP);
496                         break;
497         }
498
499         switch (m_no_dynamic.GetCheck()) {
500                 case 1:
501                         if ( !(Ai_info[Ships[ship].ai_index].ai_flags & AIF_NO_DYNAMIC) )
502                                 set_modified();
503
504                         Ai_info[Ships[ship].ai_index].ai_flags |= AIF_NO_DYNAMIC;
505                         break;
506
507                 case 0:
508                         if ( Ai_info[Ships[ship].ai_index].ai_flags & AIF_NO_DYNAMIC )
509                                 set_modified();
510
511                         Ai_info[Ships[ship].ai_index].ai_flags &= ~AIF_NO_DYNAMIC;
512                         break;
513         }
514
515         switch (m_kamikaze.GetCheck()) {
516                 case 1: {
517                         int damage;
518
519                         if ( !(Ai_info[Ships[ship].ai_index].ai_flags & AIF_KAMIKAZE) )
520                                 set_modified();
521
522                         Ai_info[Ships[ship].ai_index].ai_flags |= AIF_KAMIKAZE;
523                         m_kdamage.save(&damage);
524                         Ai_info[Ships[ship].ai_index].kamikaze_damage = i2fl(damage);
525                         break;
526                 }
527
528                 case 0:
529                         if ( Ai_info[Ships[ship].ai_index].ai_flags & AIF_KAMIKAZE )
530                                 set_modified();
531
532                         Ai_info[Ships[ship].ai_index].ai_flags &= ~AIF_KAMIKAZE;
533                         Ai_info[Ships[ship].ai_index].kamikaze_damage = 0.0f;
534                         break;
535         }
536
537         Ships[ship].respawn_priority = 0;
538         if(The_mission.game_type & MISSION_TYPE_MULTI){
539                 m_respawn_priority.save(&Ships[ship].respawn_priority);
540         }
541 }
542
543 int ship_flags_dlg::tristate_set(int val, int cur_state)
544 {
545         if (val) {
546                 if (!cur_state){
547                         return 2;
548                 }
549         } else {
550                 if (cur_state){
551                         return 2;
552                 }
553         }
554
555         return cur_state;
556 }
557
558 // a stub for now, but might be useful later.  Easier than ripping out the calls to this
559 // everywhere at least.
560 void ship_flags_dlg::set_modified()
561 {
562 }
563
564 void ship_flags_dlg::OnCargoKnown() 
565 {
566         if (m_cargo_known.GetCheck() == 1){
567                 m_cargo_known.SetCheck(0);
568         } else {
569                 m_cargo_known.SetCheck(1);
570         }
571 }
572
573 void ship_flags_dlg::OnDestroyCheck() 
574 {
575         if (m_destroy.GetCheck() == 1) {
576                 m_destroy.SetCheck(0);
577                 GetDlgItem(IDC_DESTROY_VALUE)->EnableWindow(FALSE);
578                 GetDlgItem(IDC_DESTROY_SPIN)->EnableWindow(FALSE);
579
580         } else {
581                 m_destroy.SetCheck(1);
582                 GetDlgItem(IDC_DESTROY_VALUE)->EnableWindow(TRUE);
583                 GetDlgItem(IDC_DESTROY_SPIN)->EnableWindow(TRUE);
584         }
585 }
586
587 void ship_flags_dlg::OnEscort() 
588 {
589         if (m_escort.GetCheck() == 1) {
590                 m_escort.SetCheck(0);
591                 GetDlgItem(IDC_ESCORT_PRIORITY)->EnableWindow(FALSE);
592         } else {
593                 m_escort.SetCheck(1);
594                 GetDlgItem(IDC_ESCORT_PRIORITY)->EnableWindow(TRUE);
595         }
596 }
597
598 void ship_flags_dlg::OnHiddenFromSensors() 
599 {
600         if (m_hidden.GetCheck() == 1){
601                 m_hidden.SetCheck(0);
602         } else {
603                 m_hidden.SetCheck(1);
604         }
605 }
606
607 void ship_flags_dlg::OnIgnoreCount() 
608 {
609         if (m_ignore_count.GetCheck() == 1){
610                 m_ignore_count.SetCheck(0);
611         } else {
612                 m_ignore_count.SetCheck(1);
613         }
614 }
615
616 void ship_flags_dlg::OnInvulnerable() 
617 {
618         if (m_invulnerable.GetCheck() == 1){
619                 m_invulnerable.SetCheck(0);
620         } else {
621                 m_invulnerable.SetCheck(1);
622         }
623 }
624
625 void ship_flags_dlg::OnKamikaze() 
626 {
627         if (m_kamikaze.GetCheck() == 1) {
628                 GetDlgItem(IDC_KDAMAGE)->EnableWindow(FALSE);
629                 m_kamikaze.SetCheck(0);
630
631         } else {
632                 GetDlgItem(IDC_KDAMAGE)->EnableWindow(TRUE);
633                 m_kamikaze.SetCheck(1);
634         }
635 }
636
637 void ship_flags_dlg::OnNoArrivalMusic() 
638 {
639         if (m_no_arrival_music.GetCheck() == 1){
640                 m_no_arrival_music.SetCheck(0);
641         } else {
642                 m_no_arrival_music.SetCheck(1);
643         }
644 }
645
646 void ship_flags_dlg::OnNoDynamic() 
647 {
648         if (m_no_dynamic.GetCheck() == 1){
649                 m_no_dynamic.SetCheck(0);
650         } else {
651                 m_no_dynamic.SetCheck(1);
652         }
653 }
654
655 void ship_flags_dlg::OnProtectShip() 
656 {
657         if (m_protect_ship.GetCheck() == 1){
658                 m_protect_ship.SetCheck(0);
659         } else {
660                 m_protect_ship.SetCheck(1);
661         }
662 }
663
664 void ship_flags_dlg::OnBeamProtectShip() 
665 {
666         if (m_beam_protect_ship.GetCheck() == 1){
667                 m_beam_protect_ship.SetCheck(0);
668         } else {
669                 m_beam_protect_ship.SetCheck(1);
670         }
671 }
672
673 void ship_flags_dlg::OnReinforcement() 
674 {
675         if (m_reinforcement.GetCheck() == 1){
676                 m_reinforcement.SetCheck(0);
677         } else {
678                 m_reinforcement.SetCheck(1);
679         }
680 }
681
682 void ship_flags_dlg::OnScannable() 
683 {
684         if (m_scannable.GetCheck() == 1){
685                 m_scannable.SetCheck(0);
686         } else {
687                 m_scannable.SetCheck(1);
688         }
689 }
690
691 void ship_flags_dlg::OnRedalertcarry() 
692 {
693         if (m_red_alert_carry.GetCheck() == 1){
694                 m_red_alert_carry.SetCheck(0);
695         } else {
696                 m_red_alert_carry.SetCheck(1);
697         }
698 }
699