2 * Copyright (C) Volition, Inc. 1999. All rights reserved.
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
9 // ShipFlagsDlg.cpp : implementation file
14 #include "shipflagsdlg.h"
20 static char THIS_FILE[] = __FILE__;
23 /////////////////////////////////////////////////////////////////////////////
24 // ship_flags_dlg dialog
26 ship_flags_dlg::ship_flags_dlg(CWnd* pParent /*=NULL*/)
27 : CDialog(ship_flags_dlg::IDD, pParent)
29 //{{AFX_DATA_INIT(ship_flags_dlg)
33 void ship_flags_dlg::DoDataExchange(CDataExchange* pDX)
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);
58 if (pDX->m_bSaveAndValidate) { // get dialog control values
59 GetDlgItem(IDC_DESTROY_VALUE)->GetWindowText(str);
64 m_destroy_value.init(n);
66 GetDlgItem(IDC_KDAMAGE)->GetWindowText(str);
67 m_kdamage.init(atoi(str));
69 // get escort priority
70 GetDlgItem(IDC_ESCORT_PRIORITY)->GetWindowText(str);
71 m_escort_value.init(atoi(str));
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));
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)
100 /////////////////////////////////////////////////////////////////////////////
101 // ship_flags_dlg message handlers
103 void ship_flags_dlg::setup(int n)
108 BOOL ship_flags_dlg::OnInitDialog()
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;
115 bool ship_in_wing = false;
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) {
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;
137 destroy_before_mission = (Ships[i].flags & SF_KILL_BEFORE_MISSION) ? 1 : 0;
138 m_destroy_value.init(Ships[i].final_death_time);
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 );
143 escort = (Ships[i].flags & SF_ESCORT) ? 1 : 0;
144 m_escort_value.init(Ships[i].escort_priority);
146 if(The_mission.game_type & MISSION_TYPE_MULTI){
147 m_respawn_priority.init(Ships[i].respawn_priority);
150 for (j=0; j<Num_reinforcements; j++){
151 if (!stricmp(Reinforcements[j].name, Ships[i].ship_name)){
156 reinforcement = (j < Num_reinforcements) ? 1 : 0;
158 // check if ship in wing
159 ship_in_wing = (Ships[i].wingnum != -1);;
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 );
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);
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 );
183 escort = tristate_set(Ships[i].flags & SF_ESCORT, escort);
184 m_escort_value.init(Ships[i].escort_priority);
186 if(The_mission.game_type & MISSION_TYPE_MULTI){
187 m_respawn_priority.init(Ships[i].escort_priority);
190 for (j=0; j<Num_reinforcements; j++){
191 if (!stricmp(Reinforcements[j].name, Ships[i].ship_name)){
195 reinforcement = tristate_set(j < Num_reinforcements, reinforcement);
197 // check if ship in wing
198 ship_in_wing = (Ships[i].wingnum != -1);;
204 objp = GET_NEXT(objp);
207 CDialog::OnInitDialog();
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);
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);
229 if(The_mission.game_type & MISSION_TYPE_MULTI){
230 m_respawn_priority.setup(IDC_RESPAWN_PRIORITY, this);
232 m_destroy_spin.SetRange(0, UD_MAXVAL);
234 m_destroy_value.display();
236 m_escort_value.display();
238 if(The_mission.game_type & MISSION_TYPE_MULTI){
239 m_respawn_priority.display();
241 GetDlgItem(IDC_RESPAWN_PRIORITY)->EnableWindow(FALSE);
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);
252 // disable the spinner and edit window if the corrsponding check box
254 if (m_destroy.GetCheck() != 1) {
255 GetDlgItem(IDC_DESTROY_VALUE)->EnableWindow(FALSE);
256 GetDlgItem(IDC_DESTROY_SPIN)->EnableWindow(FALSE);
259 // disable destroy option for ship in wing
261 GetDlgItem(IDC_DESTROY_CHECK)->EnableWindow(FALSE);
262 GetDlgItem(IDC_DESTROY_VALUE)->EnableWindow(FALSE);
263 GetDlgItem(IDC_DESTROY_SPIN)->EnableWindow(FALSE);
266 // maybe disable escort priority window
267 if (m_escort.GetCheck() == 1)
268 GetDlgItem(IDC_ESCORT_PRIORITY)->EnableWindow(TRUE);
270 GetDlgItem(IDC_ESCORT_PRIORITY)->EnableWindow(FALSE);
272 // maybe disable kamikaze damage window
273 if (m_kamikaze.GetCheck() == 1)
274 GetDlgItem(IDC_KDAMAGE)->EnableWindow(TRUE);
276 GetDlgItem(IDC_KDAMAGE)->EnableWindow(FALSE);
281 void ship_flags_dlg::OnOK()
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);
292 objp = GET_NEXT(objp);
298 void ship_flags_dlg::update_ship(int ship)
300 if (m_reinforcement.GetCheck() != 2)
301 set_reinforcement(Ships[ship].ship_name, m_reinforcement.GetCheck());
303 switch (m_cargo_known.GetCheck()) {
305 if ( !(Ships[ship].flags & SF_CARGO_REVEALED) )
308 Ships[ship].flags |= SF_CARGO_REVEALED;
312 if ( Ships[ship].flags & SF_CARGO_REVEALED )
315 Ships[ship].flags &= ~SF_CARGO_REVEALED;
319 // update the flags for IGNORE_COUNT and PROTECT_SHIP
320 switch (m_protect_ship.GetCheck()) {
322 if (!(Objects[Ships[ship].objnum].flags & OF_PROTECTED) )
325 Objects[Ships[ship].objnum].flags |= OF_PROTECTED;
329 if ( Objects[Ships[ship].objnum].flags & OF_PROTECTED )
332 Objects[Ships[ship].objnum].flags &= ~OF_PROTECTED;
336 switch (m_beam_protect_ship.GetCheck()) {
338 if (!(Objects[Ships[ship].objnum].flags & OF_BEAM_PROTECTED) )
341 Objects[Ships[ship].objnum].flags |= OF_BEAM_PROTECTED;
345 if ( Objects[Ships[ship].objnum].flags & OF_BEAM_PROTECTED )
348 Objects[Ships[ship].objnum].flags &= ~OF_BEAM_PROTECTED;
352 switch (m_invulnerable.GetCheck()) {
354 if ( !(Ships[ship].flags & SF_INVULNERABLE) )
357 Ships[ship].flags |= SF_INVULNERABLE;
361 if ( Ships[ship].flags & SF_INVULNERABLE )
364 Ships[ship].flags &= ~SF_INVULNERABLE;
368 switch (m_hidden.GetCheck()) {
370 if ( !(Ships[ship].flags & SF_HIDDEN_FROM_SENSORS) )
373 Ships[ship].flags |= SF_HIDDEN_FROM_SENSORS;
377 if ( Ships[ship].flags & SF_HIDDEN_FROM_SENSORS )
380 Ships[ship].flags &= ~SF_HIDDEN_FROM_SENSORS;
384 switch (m_ignore_count.GetCheck()) {
386 if ( !(Ships[ship].flags & SF_IGNORE_COUNT) )
389 Ships[ship].flags |= SF_IGNORE_COUNT;
393 if (Ships[ship].flags & SF_IGNORE_COUNT)
396 Ships[ship].flags &= ~SF_IGNORE_COUNT;
400 switch (m_escort.GetCheck()) {
402 if (!(Ships[ship].flags & SF_ESCORT))
405 Ships[ship].flags |= SF_ESCORT;
406 m_escort_value.save(&Ships[ship].escort_priority);
410 if (Ships[ship].flags & SF_ESCORT)
413 Ships[ship].flags &= ~SF_ESCORT;
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 )
423 Ships[ship].flags &= ~SF_KILL_BEFORE_MISSION;
426 case 1: // this means checkbox is checked
427 if ( !(Ships[ship].flags & SF_KILL_BEFORE_MISSION) )
430 Ships[ship].flags |= SF_KILL_BEFORE_MISSION;
431 m_destroy_value.save(&Ships[ship].final_death_time);
433 } // a mixed state is 2, and since it's not handled, it doesn't change
435 switch (m_no_arrival_music.GetCheck()) {
437 if (Ships[ship].flags & SF_NO_ARRIVAL_MUSIC)
440 Ships[ship].flags &= ~SF_NO_ARRIVAL_MUSIC;
444 if (!(Ships[ship].flags & SF_NO_ARRIVAL_MUSIC))
447 Ships[ship].flags |= SF_NO_ARRIVAL_MUSIC;
451 switch (m_scannable.GetCheck()) {
453 if ( !(Ships[ship].flags & SF_SCANNABLE) )
456 Ships[ship].flags |= SF_SCANNABLE;
460 if ( Ships[ship].flags & SF_SCANNABLE )
463 Ships[ship].flags &= ~SF_SCANNABLE;
467 switch (m_red_alert_carry.GetCheck()) {
469 if ( !(Ships[ship].flags & SF_RED_ALERT_STORE_STATUS) )
472 Ships[ship].flags |= SF_RED_ALERT_STORE_STATUS;
476 if ( Ships[ship].flags & SF_RED_ALERT_STORE_STATUS )
479 Ships[ship].flags &= ~SF_RED_ALERT_STORE_STATUS;
483 switch (m_special_warp.GetCheck()) {
485 if ( !(Objects[Ships[ship].objnum].flags & OF_SPECIAL_WARP) )
488 Objects[Ships[ship].objnum].flags |= OF_SPECIAL_WARP;
492 if ( (Objects[Ships[ship].objnum].flags & OF_SPECIAL_WARP) )
495 Objects[Ships[ship].objnum].flags &= (~OF_SPECIAL_WARP);
499 switch (m_no_dynamic.GetCheck()) {
501 if ( !(Ai_info[Ships[ship].ai_index].ai_flags & AIF_NO_DYNAMIC) )
504 Ai_info[Ships[ship].ai_index].ai_flags |= AIF_NO_DYNAMIC;
508 if ( Ai_info[Ships[ship].ai_index].ai_flags & AIF_NO_DYNAMIC )
511 Ai_info[Ships[ship].ai_index].ai_flags &= ~AIF_NO_DYNAMIC;
515 switch (m_kamikaze.GetCheck()) {
519 if ( !(Ai_info[Ships[ship].ai_index].ai_flags & AIF_KAMIKAZE) )
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);
529 if ( Ai_info[Ships[ship].ai_index].ai_flags & AIF_KAMIKAZE )
532 Ai_info[Ships[ship].ai_index].ai_flags &= ~AIF_KAMIKAZE;
533 Ai_info[Ships[ship].ai_index].kamikaze_damage = 0.0f;
537 Ships[ship].respawn_priority = 0;
538 if(The_mission.game_type & MISSION_TYPE_MULTI){
539 m_respawn_priority.save(&Ships[ship].respawn_priority);
543 int ship_flags_dlg::tristate_set(int val, int cur_state)
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()
564 void ship_flags_dlg::OnCargoKnown()
566 if (m_cargo_known.GetCheck() == 1){
567 m_cargo_known.SetCheck(0);
569 m_cargo_known.SetCheck(1);
573 void ship_flags_dlg::OnDestroyCheck()
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);
581 m_destroy.SetCheck(1);
582 GetDlgItem(IDC_DESTROY_VALUE)->EnableWindow(TRUE);
583 GetDlgItem(IDC_DESTROY_SPIN)->EnableWindow(TRUE);
587 void ship_flags_dlg::OnEscort()
589 if (m_escort.GetCheck() == 1) {
590 m_escort.SetCheck(0);
591 GetDlgItem(IDC_ESCORT_PRIORITY)->EnableWindow(FALSE);
593 m_escort.SetCheck(1);
594 GetDlgItem(IDC_ESCORT_PRIORITY)->EnableWindow(TRUE);
598 void ship_flags_dlg::OnHiddenFromSensors()
600 if (m_hidden.GetCheck() == 1){
601 m_hidden.SetCheck(0);
603 m_hidden.SetCheck(1);
607 void ship_flags_dlg::OnIgnoreCount()
609 if (m_ignore_count.GetCheck() == 1){
610 m_ignore_count.SetCheck(0);
612 m_ignore_count.SetCheck(1);
616 void ship_flags_dlg::OnInvulnerable()
618 if (m_invulnerable.GetCheck() == 1){
619 m_invulnerable.SetCheck(0);
621 m_invulnerable.SetCheck(1);
625 void ship_flags_dlg::OnKamikaze()
627 if (m_kamikaze.GetCheck() == 1) {
628 GetDlgItem(IDC_KDAMAGE)->EnableWindow(FALSE);
629 m_kamikaze.SetCheck(0);
632 GetDlgItem(IDC_KDAMAGE)->EnableWindow(TRUE);
633 m_kamikaze.SetCheck(1);
637 void ship_flags_dlg::OnNoArrivalMusic()
639 if (m_no_arrival_music.GetCheck() == 1){
640 m_no_arrival_music.SetCheck(0);
642 m_no_arrival_music.SetCheck(1);
646 void ship_flags_dlg::OnNoDynamic()
648 if (m_no_dynamic.GetCheck() == 1){
649 m_no_dynamic.SetCheck(0);
651 m_no_dynamic.SetCheck(1);
655 void ship_flags_dlg::OnProtectShip()
657 if (m_protect_ship.GetCheck() == 1){
658 m_protect_ship.SetCheck(0);
660 m_protect_ship.SetCheck(1);
664 void ship_flags_dlg::OnBeamProtectShip()
666 if (m_beam_protect_ship.GetCheck() == 1){
667 m_beam_protect_ship.SetCheck(0);
669 m_beam_protect_ship.SetCheck(1);
673 void ship_flags_dlg::OnReinforcement()
675 if (m_reinforcement.GetCheck() == 1){
676 m_reinforcement.SetCheck(0);
678 m_reinforcement.SetCheck(1);
682 void ship_flags_dlg::OnScannable()
684 if (m_scannable.GetCheck() == 1){
685 m_scannable.SetCheck(0);
687 m_scannable.SetCheck(1);
691 void ship_flags_dlg::OnRedalertcarry()
693 if (m_red_alert_carry.GetCheck() == 1){
694 m_red_alert_carry.SetCheck(0);
696 m_red_alert_carry.SetCheck(1);