// update wing structure(s) with dialog data.  The data is first checked for errors.  If
// no errors occur, returns 0.  If an error occurs, returns -1.  If the update is bypassed,
// returns 1.  Bypass is necessary to avoid an infinite loop, and it doesn't actually
// update the data.  Bypass only occurs if bypass mode is active and we still get an error.
// Once the error no longer occurs, bypass mode is cleared and data is updated.
int wing_editor::update_data(int redraw)
{
	char *str, old_name[255], buf[512];
	int i, z;
	object *ptr;

	nprintf(("Fred routing", "Wing dialog save\n"));
	if (!GetSafeHwnd())
		return 0;

	UpdateData(TRUE);
	UpdateData(TRUE);

	if (cur_wing >= 0) {
		if (!strnicmp(m_wing_name, "player ", 7)) {
			if (bypass_errors)
				return 1;

			bypass_errors = 1;
			z = MessageBox("Wing names can't start with the word 'player'\n"
				"Press OK to restore old name", "Error", MB_ICONEXCLAMATION | MB_OKCANCEL);

			if (z == IDCANCEL)
				return -1;

			m_wing_name = _T(Wings[cur_wing].name);
			UpdateData(FALSE);
		}

		for (i=0; i<MAX_WINGS; i++)
			if (Wings[i].wave_count && !stricmp(Wings[i].name, m_wing_name) && (i != cur_wing)) {
				if (bypass_errors)
					return 1;

				bypass_errors = 1;
				z = MessageBox("This wing name is already being used by another wing\n"
					"Press OK to restore old name", "Error", MB_ICONEXCLAMATION | MB_OKCANCEL);

				if (z == IDCANCEL)
					return -1;

				m_wing_name = _T(Wings[cur_wing].name);
				UpdateData(FALSE);
			}

		ptr = GET_FIRST(&obj_used_list);
		while (ptr != END_OF_LIST(&obj_used_list)) {
			if (ptr->type == OBJ_SHIP) {
				if (!stricmp(m_wing_name, Ships[ptr->instance].ship_name)) {
					if (bypass_errors)
						return 1;

					bypass_errors = 1;
					z = MessageBox("This wing name is already being used by a ship\n"
						"Press OK to restore old name", "Error", MB_ICONEXCLAMATION | MB_OKCANCEL);

					if (z == IDCANCEL)
						return -1;

					m_wing_name = _T(Wings[cur_wing].name);
					UpdateData(FALSE);
				}
			}

			ptr = GET_NEXT(ptr);
		}

		for (i=0; i<MAX_WAYPOINT_LISTS; i++)
			if (Waypoint_lists[i].count && !stricmp(Waypoint_lists[i].name, m_wing_name)) {
				if (bypass_errors)
					return 1;

				bypass_errors = 1;
				z = MessageBox("This wing name is already being used by a waypoint path\n"
					"Press OK to restore old name", "Error", MB_ICONEXCLAMATION | MB_OKCANCEL);

				if (z == IDCANCEL)
					return -1;

				m_wing_name = _T(Wings[cur_wing].name);
				UpdateData(FALSE);
			}

		for (i=0; i<Num_jump_nodes; i++)
			if (!stricmp(Jump_nodes[i].name, m_wing_name)) {
				if (bypass_errors)
					return 1;
 
				bypass_errors = 1;
				z = MessageBox("This wing name is already being used by a hyper buoy\n"
					"Press OK to restore old name", "Error", MB_ICONEXCLAMATION | MB_OKCANCEL);

				if (z == IDCANCEL)
					return -1;

				m_wing_name = _T(Wings[cur_wing].name);
				UpdateData(FALSE);
			}

		strcpy(old_name, Wings[cur_wing].name);
		string_copy(Wings[cur_wing].name, m_wing_name, NAME_LENGTH, 1);
		update_data_safe();

		bypass_errors = 0;
		modified = 0;
		str = Wings[cur_wing].name;
		if (stricmp(old_name, str)) {
			update_sexp_references(old_name, str);
			ai_update_goal_references(REF_TYPE_WING, old_name, str);
			for (i=0; i<Num_reinforcements; i++)
				if (!stricmp(old_name, Reinforcements[i].name)) {
					Assert(strlen(str) < NAME_LENGTH);
					strcpy(Reinforcements[i].name, str);
				}

			for (i=0; i<Wings[cur_wing].wave_count; i++) {
				if ((Objects[wing_objects[cur_wing][i]].type == OBJ_SHIP) || (Objects[wing_objects[cur_wing][i]].type == OBJ_START)) {
					sprintf(buf, "%s %d", str, i + 1);
					rename_ship(Wings[cur_wing].ship_index[i], buf);
				}
			}

			Update_window = 1;
		}

		if (set_reinforcement(str, m_reinforcement) == 1) {
			free_sexp2(Wings[cur_wing].arrival_cue);
			Wings[cur_wing].arrival_cue = Locked_sexp_false;
		}
	}

	if (redraw)
		update_map_window();

	return 0;
}
void ship_flags_dlg::update_ship(int ship)
{
	if (m_reinforcement.GetCheck() != 2)
		set_reinforcement(Ships[ship].ship_name, m_reinforcement.GetCheck());

	switch (m_cargo_known.GetCheck()) {
		case 1:
			if ( !(Ships[ship].flags & SF_CARGO_REVEALED) )
				set_modified();
   
			Ships[ship].flags |= SF_CARGO_REVEALED;
			break;

		case 0:
			if ( Ships[ship].flags & SF_CARGO_REVEALED )
				set_modified();

			Ships[ship].flags &= ~SF_CARGO_REVEALED;
			break;
	}

	// update the flags for IGNORE_COUNT and PROTECT_SHIP
	switch (m_protect_ship.GetCheck()) {
		case 1:
			if (!(Objects[Ships[ship].objnum].flags & OF_PROTECTED) )
				set_modified();

			Objects[Ships[ship].objnum].flags |= OF_PROTECTED;
			break;

		case 0:
			if ( Objects[Ships[ship].objnum].flags & OF_PROTECTED )
				set_modified();

			Objects[Ships[ship].objnum].flags &= ~OF_PROTECTED;
			break;
	}

	switch (m_beam_protect_ship.GetCheck()) {
		case 1:
			if (!(Objects[Ships[ship].objnum].flags & OF_BEAM_PROTECTED) )
				set_modified();

			Objects[Ships[ship].objnum].flags |= OF_BEAM_PROTECTED;
			break;

		case 0:
			if ( Objects[Ships[ship].objnum].flags & OF_BEAM_PROTECTED )
				set_modified();

			Objects[Ships[ship].objnum].flags &= ~OF_BEAM_PROTECTED;
			break;
	}

	switch (m_invulnerable.GetCheck()) {
		case 1:
			if ( !(Ships[ship].flags & SF_INVULNERABLE) )
				set_modified();

			Ships[ship].flags |= SF_INVULNERABLE;
			break;

		case 0:
			if ( Ships[ship].flags & SF_INVULNERABLE )
				set_modified();

			Ships[ship].flags &= ~SF_INVULNERABLE;
			break;
	}

	switch (m_hidden.GetCheck()) {
		case 1:
			if ( !(Ships[ship].flags & SF_HIDDEN_FROM_SENSORS) )
				set_modified();

			Ships[ship].flags |= SF_HIDDEN_FROM_SENSORS;
			break;

		case 0:
			if ( Ships[ship].flags & SF_HIDDEN_FROM_SENSORS )
				set_modified();

			Ships[ship].flags &= ~SF_HIDDEN_FROM_SENSORS;
			break;
	}

	switch (m_primitive_sensors.GetCheck()) {
		case 1:
			if ( !(Ships[ship].flags2 & SF2_PRIMITIVE_SENSORS) )
				set_modified();

			Ships[ship].flags2 |= SF2_PRIMITIVE_SENSORS;
			break;

		case 0:
			if ( Ships[ship].flags2 & SF2_PRIMITIVE_SENSORS )
				set_modified();

			Ships[ship].flags2 &= ~SF2_PRIMITIVE_SENSORS;
			break;
	}

	switch (m_no_subspace_drive.GetCheck()) {
		case 1:
			if ( !(Ships[ship].flags2 & SF2_NO_SUBSPACE_DRIVE) )
				set_modified();

			Ships[ship].flags2 |= SF2_NO_SUBSPACE_DRIVE;
			break;

		case 0:
			if ( Ships[ship].flags2 & SF2_NO_SUBSPACE_DRIVE )
				set_modified();

			Ships[ship].flags2 &= ~SF2_NO_SUBSPACE_DRIVE;
			break;
	}

	switch (m_weapon_jam.GetCheck()) {
		case 1:
			if ( !(Ships[ship].flags2 & SF2_JAMMER_ON) )
				set_modified();

			Ships[ship].flags2 |= SF2_JAMMER_ON;
			break;

		case 0:
			if ( Ships[ship].flags2 & SF2_JAMMER_ON )
				set_modified();

			Ships[ship].flags2 &= ~SF2_JAMMER_ON;
			break;
	}

	switch (m_ignore_count.GetCheck()) {
		case 1:
			if ( !(Ships[ship].flags & SF_IGNORE_COUNT) )
				set_modified();

			Ships[ship].flags |= SF_IGNORE_COUNT;
			break;

		case 0:
			if (Ships[ship].flags & SF_IGNORE_COUNT)
				set_modified();

			Ships[ship].flags &= ~SF_IGNORE_COUNT;
			break;
	}

	switch (m_escort.GetCheck()) {
		case 1:
			if (!(Ships[ship].flags & SF_ESCORT))
				set_modified();

			Ships[ship].flags |= SF_ESCORT;
			m_escort_value.save(&Ships[ship].escort_priority);
			break;

		case 0:
			if (Ships[ship].flags & SF_ESCORT)
				set_modified();

			Ships[ship].flags &= ~SF_ESCORT;
			break;
	}

	// deal with updating the "destroy before the mission" stuff
	switch (m_destroy.GetCheck()) {
		case 0:  // this means no check in checkbox
			if ( Ships[ship].flags & SF_KILL_BEFORE_MISSION )
				set_modified();

			Ships[ship].flags &= ~SF_KILL_BEFORE_MISSION;
			break;

		case 1:  // this means checkbox is checked
			if ( !(Ships[ship].flags & SF_KILL_BEFORE_MISSION) )
				set_modified();

			Ships[ship].flags |= SF_KILL_BEFORE_MISSION;
			m_destroy_value.save(&Ships[ship].final_death_time);
			break;
	}  // a mixed state is 2, and since it's not handled, it doesn't change

	switch (m_no_arrival_music.GetCheck()) {
		case 0:
			if (Ships[ship].flags & SF_NO_ARRIVAL_MUSIC)
				set_modified();

			Ships[ship].flags &= ~SF_NO_ARRIVAL_MUSIC;
			break;

		case 1:
			if (!(Ships[ship].flags & SF_NO_ARRIVAL_MUSIC))
				set_modified();

			Ships[ship].flags |= SF_NO_ARRIVAL_MUSIC;
			break;
	}

	switch (m_scannable.GetCheck()) {
		case 1:
			if ( !(Ships[ship].flags & SF_SCANNABLE) )
				set_modified();

			Ships[ship].flags |= SF_SCANNABLE;
			break;

		case 0:
			if ( Ships[ship].flags & SF_SCANNABLE )
				set_modified();

			Ships[ship].flags &= ~SF_SCANNABLE;
			break;
	}

	switch (m_red_alert_carry.GetCheck()) {
		case 1:
			if ( !(Ships[ship].flags & SF_RED_ALERT_STORE_STATUS) )
				set_modified();

			Ships[ship].flags |= SF_RED_ALERT_STORE_STATUS;
			break;

		case 0:
			if ( Ships[ship].flags & SF_RED_ALERT_STORE_STATUS )
				set_modified();

			Ships[ship].flags &= ~SF_RED_ALERT_STORE_STATUS;
			break;
	}

	switch (m_special_warp.GetCheck()) {
		case 1:
			if ( !(Objects[Ships[ship].objnum].flags & OF_SPECIAL_WARP) )
				set_modified();

			Objects[Ships[ship].objnum].flags |= OF_SPECIAL_WARP;
			break;

		case 0:
			if ( (Objects[Ships[ship].objnum].flags & OF_SPECIAL_WARP) )
				set_modified();

			Objects[Ships[ship].objnum].flags &= (~OF_SPECIAL_WARP);
			break;
	}

	switch (m_no_dynamic.GetCheck()) {
		case 1:
			if ( !(Ai_info[Ships[ship].ai_index].ai_flags & AIF_NO_DYNAMIC) )
				set_modified();

			Ai_info[Ships[ship].ai_index].ai_flags |= AIF_NO_DYNAMIC;
			break;

		case 0:
			if ( Ai_info[Ships[ship].ai_index].ai_flags & AIF_NO_DYNAMIC )
				set_modified();

			Ai_info[Ships[ship].ai_index].ai_flags &= ~AIF_NO_DYNAMIC;
			break;
	}

	switch (m_kamikaze.GetCheck()) {
		case 1: {
			int damage;

			if ( !(Ai_info[Ships[ship].ai_index].ai_flags & AIF_KAMIKAZE) )
				set_modified();

			Ai_info[Ships[ship].ai_index].ai_flags |= AIF_KAMIKAZE;
			m_kdamage.save(&damage);
			Ai_info[Ships[ship].ai_index].kamikaze_damage = i2fl(damage);
			break;
		}

		case 0:
			if ( Ai_info[Ships[ship].ai_index].ai_flags & AIF_KAMIKAZE )
				set_modified();

			Ai_info[Ships[ship].ai_index].ai_flags &= ~AIF_KAMIKAZE;
			Ai_info[Ships[ship].ai_index].kamikaze_damage = 0.0f;
			break;
	}

	Ships[ship].respawn_priority = 0;
	if(The_mission.game_type & MISSION_TYPE_MULTI){
		m_respawn_priority.save(&Ships[ship].respawn_priority);
	}
}
void ship_flags_dlg::update_ship(int shipnum)
{
	ship *shipp = &Ships[shipnum];
	object *objp = &Objects[shipp->objnum];

	if (m_reinforcement.GetCheck() != 2)
	{
		//Check if we're trying to add more and we've got too many.
		if( (Num_reinforcements >= MAX_REINFORCEMENTS) && (m_reinforcement.GetCheck() == 1))
		{
			char error_message[256];
			sprintf(error_message, "Too many reinforcements; could not add ship '%s' to reinforcement list!", shipp->ship_name); 
			MessageBox(error_message);
		}
		//Otherwise, just update as normal.
		else
		{
			set_reinforcement(shipp->ship_name, m_reinforcement.GetCheck());	
		}
	}

	switch (m_cargo_known.GetCheck()) {
		case 1:
			if ( !(shipp->flags & SF_CARGO_REVEALED) )
				set_modified();

			shipp->flags |= SF_CARGO_REVEALED;
			break;

		case 0:
			if ( shipp->flags & SF_CARGO_REVEALED )
				set_modified();

			shipp->flags &= ~SF_CARGO_REVEALED;
			break;
	}

	// update the flags for IGNORE_COUNT and PROTECT_SHIP
	switch (m_protect_ship.GetCheck()) {
		case 1:
			if (!(objp->flags & OF_PROTECTED) )
				set_modified();

			objp->flags |= OF_PROTECTED;
			break;

		case 0:
			if ( objp->flags & OF_PROTECTED )
				set_modified();

			objp->flags &= ~OF_PROTECTED;
			break;
	}

	switch (m_beam_protect_ship.GetCheck()) {
		case 1:
			if (!(objp->flags & OF_BEAM_PROTECTED) )
				set_modified();

			objp->flags |= OF_BEAM_PROTECTED;
			break;

		case 0:
			if ( objp->flags & OF_BEAM_PROTECTED )
				set_modified();

			objp->flags &= ~OF_BEAM_PROTECTED;
			break;
	}

	switch (m_flak_protect_ship.GetCheck()) {
		case 1:
			if (!(objp->flags & OF_FLAK_PROTECTED) )
				set_modified();

			objp->flags |= OF_FLAK_PROTECTED;
			break;

		case 0:
			if ( objp->flags & OF_FLAK_PROTECTED )
				set_modified();

			objp->flags &= ~OF_FLAK_PROTECTED;
			break;
	}

	switch (m_laser_protect_ship.GetCheck()) {
		case 1:
			if (!(objp->flags & OF_LASER_PROTECTED) )
				set_modified();

			objp->flags |= OF_LASER_PROTECTED;
			break;

		case 0:
			if ( objp->flags & OF_LASER_PROTECTED )
				set_modified();

			objp->flags &= ~OF_LASER_PROTECTED;
			break;
	}

	switch (m_missile_protect_ship.GetCheck()) {
		case 1:
			if (!(objp->flags & OF_MISSILE_PROTECTED) )
				set_modified();

			objp->flags |= OF_MISSILE_PROTECTED;
			break;

		case 0:
			if ( objp->flags & OF_MISSILE_PROTECTED )
				set_modified();

			objp->flags &= ~OF_MISSILE_PROTECTED;
			break;
	}

	switch (m_invulnerable.GetCheck()) {
		case 1:
			if ( !(objp->flags & OF_INVULNERABLE) )
				set_modified();

			objp->flags |= OF_INVULNERABLE;
			break;

		case 0:
			if ( objp->flags & OF_INVULNERABLE )
				set_modified();

			objp->flags &= ~OF_INVULNERABLE;
			break;
	}

	switch (m_targetable_as_bomb.GetCheck()) {
		case 1:
			if ( !(objp->flags & OF_TARGETABLE_AS_BOMB) )
				set_modified();

			objp->flags |= OF_TARGETABLE_AS_BOMB;
			break;

		case 0:
			if ( objp->flags & OF_TARGETABLE_AS_BOMB )
				set_modified();

			objp->flags &= ~OF_TARGETABLE_AS_BOMB;
			break;
	}

	switch (m_immobile.GetCheck()) {
		case 1:
			if ( !(objp->flags & OF_IMMOBILE) )
				set_modified();

			objp->flags |= OF_IMMOBILE;
			break;

		case 0:
			if ( objp->flags & OF_IMMOBILE )
				set_modified();

			objp->flags &= ~OF_IMMOBILE;
			break;
	}

	switch (m_hidden.GetCheck()) {
		case 1:
			if ( !(shipp->flags & SF_HIDDEN_FROM_SENSORS) )
				set_modified();

			shipp->flags |= SF_HIDDEN_FROM_SENSORS;
			break;

		case 0:
			if ( shipp->flags & SF_HIDDEN_FROM_SENSORS )
				set_modified();

			shipp->flags &= ~SF_HIDDEN_FROM_SENSORS;
			break;
	}

	switch (m_primitive_sensors.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_PRIMITIVE_SENSORS) )
				set_modified();

			shipp->flags2 |= SF2_PRIMITIVE_SENSORS;
			break;

		case 0:
			if ( shipp->flags2 & SF2_PRIMITIVE_SENSORS )
				set_modified();

			shipp->flags2 &= ~SF2_PRIMITIVE_SENSORS;
			break;
	}

	switch (m_no_subspace_drive.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_NO_SUBSPACE_DRIVE) )
				set_modified();

			shipp->flags2 |= SF2_NO_SUBSPACE_DRIVE;
			break;

		case 0:
			if ( shipp->flags2 & SF2_NO_SUBSPACE_DRIVE )
				set_modified();

			shipp->flags2 &= ~SF2_NO_SUBSPACE_DRIVE;
			break;
	}

	switch (m_affected_by_gravity.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_AFFECTED_BY_GRAVITY) )
				set_modified();

			shipp->flags2 |= SF2_AFFECTED_BY_GRAVITY;
			break;

		case 0:
			if ( shipp->flags2 & SF2_AFFECTED_BY_GRAVITY )
				set_modified();

			shipp->flags2 &= ~SF2_AFFECTED_BY_GRAVITY;
			break;
	}

	switch (m_toggle_subsystem_scanning.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_TOGGLE_SUBSYSTEM_SCANNING) )
				set_modified();

			shipp->flags2 |= SF2_TOGGLE_SUBSYSTEM_SCANNING;
			break;

		case 0:
			if ( shipp->flags2 & SF2_TOGGLE_SUBSYSTEM_SCANNING )
				set_modified();

			shipp->flags2 &= ~SF2_TOGGLE_SUBSYSTEM_SCANNING;
			break;
	}

	switch (m_ignore_count.GetCheck()) {
		case 1:
			if ( !(shipp->flags & SF_IGNORE_COUNT) )
				set_modified();

			shipp->flags |= SF_IGNORE_COUNT;
			break;

		case 0:
			if (shipp->flags & SF_IGNORE_COUNT)
				set_modified();

			shipp->flags &= ~SF_IGNORE_COUNT;
			break;
	}

	switch (m_escort.GetCheck()) {
		case 1:
			if (!(shipp->flags & SF_ESCORT))
				set_modified();

			shipp->flags |= SF_ESCORT;
			m_escort_value.save(&shipp->escort_priority);
			break;

		case 0:
			if (shipp->flags & SF_ESCORT)
				set_modified();

			shipp->flags &= ~SF_ESCORT;
			break;
	}

	// deal with updating the "destroy before the mission" stuff
	switch (m_destroy.GetCheck()) {
		case 0:  // this means no check in checkbox
			if ( shipp->flags & SF_KILL_BEFORE_MISSION )
				set_modified();

			shipp->flags &= ~SF_KILL_BEFORE_MISSION;
			break;

		case 1:  // this means checkbox is checked
			if ( !(shipp->flags & SF_KILL_BEFORE_MISSION) )
				set_modified();

			shipp->flags |= SF_KILL_BEFORE_MISSION;
			m_destroy_value.save(&shipp->final_death_time);
			break;
	}  // a mixed state is 2, and since it's not handled, it doesn't change

	switch (m_no_arrival_music.GetCheck()) {
		case 0:
			if (shipp->flags & SF_NO_ARRIVAL_MUSIC)
				set_modified();

			shipp->flags &= ~SF_NO_ARRIVAL_MUSIC;
			break;

		case 1:
			if (!(shipp->flags & SF_NO_ARRIVAL_MUSIC))
				set_modified();

			shipp->flags |= SF_NO_ARRIVAL_MUSIC;
			break;
	}

	switch (m_scannable.GetCheck()) {
		case 1:
			if ( !(shipp->flags & SF_SCANNABLE) )
				set_modified();

			shipp->flags |= SF_SCANNABLE;
			break;

		case 0:
			if ( shipp->flags & SF_SCANNABLE )
				set_modified();

			shipp->flags &= ~SF_SCANNABLE;
			break;
	}

	switch (m_red_alert_carry.GetCheck()) {
		case 1:
			if ( !(shipp->flags & SF_RED_ALERT_STORE_STATUS) )
				set_modified();

			shipp->flags |= SF_RED_ALERT_STORE_STATUS;
			break;

		case 0:
			if ( shipp->flags & SF_RED_ALERT_STORE_STATUS )
				set_modified();

			shipp->flags &= ~SF_RED_ALERT_STORE_STATUS;
			break;
	}

	switch (m_special_warpin.GetCheck()) {
		case 1:
			if ( !(objp->flags & OF_SPECIAL_WARPIN) )
				set_modified();

			objp->flags |= OF_SPECIAL_WARPIN;
			break;

		case 0:
			if ( (objp->flags & OF_SPECIAL_WARPIN) )
				set_modified();

			objp->flags &= (~OF_SPECIAL_WARPIN);
			break;
	}

	switch (m_no_dynamic.GetCheck()) {
		case 1:
			if ( !(Ai_info[shipp->ai_index].ai_flags & AIF_NO_DYNAMIC) )
				set_modified();

			Ai_info[shipp->ai_index].ai_flags |= AIF_NO_DYNAMIC;
			break;

		case 0:
			if ( Ai_info[shipp->ai_index].ai_flags & AIF_NO_DYNAMIC )
				set_modified();

			Ai_info[shipp->ai_index].ai_flags &= ~AIF_NO_DYNAMIC;
			break;
	}

	switch (m_kamikaze.GetCheck()) {
		case 1: {
			int damage;

			if ( !(Ai_info[shipp->ai_index].ai_flags & AIF_KAMIKAZE) )
				set_modified();

			Ai_info[shipp->ai_index].ai_flags |= AIF_KAMIKAZE;
			m_kdamage.save(&damage);
			Ai_info[shipp->ai_index].kamikaze_damage = damage;
			break;
		}

		case 0:
			if ( Ai_info[shipp->ai_index].ai_flags & AIF_KAMIKAZE )
				set_modified();

			Ai_info[shipp->ai_index].ai_flags &= ~AIF_KAMIKAZE;
			Ai_info[shipp->ai_index].kamikaze_damage = 0;
			break;
	}

	switch (m_disable_messages.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_NO_BUILTIN_MESSAGES) )
				set_modified();

			shipp->flags2 |= SF2_NO_BUILTIN_MESSAGES;
			break;

		case 0:
			if ( shipp->flags2 & SF2_NO_BUILTIN_MESSAGES )
				set_modified();

			shipp->flags2 &= ~SF2_NO_BUILTIN_MESSAGES;
			break;
	}

	switch (m_set_class_dynamically.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_SET_CLASS_DYNAMICALLY) )
				set_modified();

			shipp->flags2 |= SF2_SET_CLASS_DYNAMICALLY;
			break;

		case 0:
			if ( shipp->flags2 & SF2_SET_CLASS_DYNAMICALLY )
				set_modified();

			shipp->flags2 &= ~SF2_SET_CLASS_DYNAMICALLY;
			break;
	}

	switch (m_no_death_scream.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_NO_DEATH_SCREAM) )
				set_modified();

			shipp->flags2 |= SF2_NO_DEATH_SCREAM;
			break;

		case 0:
			if ( shipp->flags2 & SF2_NO_DEATH_SCREAM )
				set_modified();

			shipp->flags2 &= ~SF2_NO_DEATH_SCREAM;
			break;
	}

	switch (m_always_death_scream.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_ALWAYS_DEATH_SCREAM) )
				set_modified();

			shipp->flags2 |= SF2_ALWAYS_DEATH_SCREAM;
			break;

		case 0:
			if ( shipp->flags2 & SF2_ALWAYS_DEATH_SCREAM )
				set_modified();

			shipp->flags2 &= ~SF2_ALWAYS_DEATH_SCREAM;
			break;
	}

	switch (m_nav_carry.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_NAVPOINT_CARRY) )
				set_modified();

			shipp->flags2 |= SF2_NAVPOINT_CARRY;
			break;

		case 0:
			if ( shipp->flags2 & SF2_NAVPOINT_CARRY )
				set_modified();

			shipp->flags2 &= ~SF2_NAVPOINT_CARRY;
			break;
	}

	switch (m_nav_needslink.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_NAVPOINT_NEEDSLINK) )
				set_modified();

			shipp->flags2 |= SF2_NAVPOINT_NEEDSLINK;
			break;

		case 0:
			if ( shipp->flags2 & SF2_NAVPOINT_NEEDSLINK )
				set_modified();

			shipp->flags2 &= ~SF2_NAVPOINT_NEEDSLINK;
			break;
	}

	switch (m_hide_ship_name.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_HIDE_SHIP_NAME) )
				set_modified();

			shipp->flags2 |= SF2_HIDE_SHIP_NAME;
			break;

		case 0:
			if ( shipp->flags2 & SF2_HIDE_SHIP_NAME )
				set_modified();

			shipp->flags2 &= ~SF2_HIDE_SHIP_NAME;
			break;
	}

	switch (m_disable_ets.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_NO_ETS) )
				set_modified();

			shipp->flags2 |= SF2_NO_ETS;
			break;

		case 0:
			if ( shipp->flags2 & SF2_NO_ETS )
				set_modified();

			shipp->flags2 &= ~SF2_NO_ETS;
			break;
	}

	switch (m_cloaked.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_CLOAKED) )
				set_modified();

			shipp->flags2 |= SF2_CLOAKED;
			break;

		case 0:
			if ( shipp->flags2 & SF2_CLOAKED )
				set_modified();

			shipp->flags2 &= ~SF2_CLOAKED;
			break;
	}

	switch (m_guardian.GetCheck()) {
		case 1:
			if ( !(shipp->ship_guardian_threshold) )
				set_modified();

			shipp->ship_guardian_threshold = SHIP_GUARDIAN_THRESHOLD_DEFAULT;
			break;

		case 0:
			if ( shipp->ship_guardian_threshold )
				set_modified();

			shipp->ship_guardian_threshold = 0;
			break;
	}

	switch (m_vaporize.GetCheck()) {
		case 1:
			if ( !(shipp->flags & SF_VAPORIZE) )
				set_modified();

			shipp->flags |= SF_VAPORIZE;
			break;

		case 0:
			if ( shipp->flags & SF_VAPORIZE )
				set_modified();

			shipp->flags &= ~SF_VAPORIZE;
			break;
	}

	switch (m_stealth.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_STEALTH) )
				set_modified();

			shipp->flags2 |= SF2_STEALTH;
			break;

		case 0:
			if ( shipp->flags2 & SF2_STEALTH )
				set_modified();

			shipp->flags2 &= ~SF2_STEALTH;
			break;
	}

	switch (m_friendly_stealth_invisible.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_FRIENDLY_STEALTH_INVIS) )
				set_modified();

			shipp->flags2 |= SF2_FRIENDLY_STEALTH_INVIS;
			break;

		case 0:
			if ( shipp->flags2 & SF2_FRIENDLY_STEALTH_INVIS )
				set_modified();

			shipp->flags2 &= ~SF2_FRIENDLY_STEALTH_INVIS;
			break;
	}

	switch (m_scramble_messages.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_SCRAMBLE_MESSAGES) )
				set_modified();

			shipp->flags2 |= SF2_SCRAMBLE_MESSAGES;
			break;

		case 0:
			if ( shipp->flags2 & SF2_SCRAMBLE_MESSAGES )
				set_modified();

			shipp->flags2 &= ~SF2_SCRAMBLE_MESSAGES;
			break;
	}

	switch (m_no_collide.GetCheck()) {
		case 1:
			if (objp->flags & OF_COLLIDES)
				set_modified();

			objp->flags &= ~OF_COLLIDES;
			break;

		case 0:
			if (!(objp->flags & OF_COLLIDES))
				set_modified();

			objp->flags |= OF_COLLIDES;
			break;
	}

	switch (m_no_disabled_self_destruct.GetCheck()) {
		case 1:
			if (!(shipp->flags2 & SF2_NO_DISABLED_SELF_DESTRUCT))
				set_modified();

			shipp->flags2 |= SF2_NO_DISABLED_SELF_DESTRUCT;
			break;

		case 0:
			if (shipp->flags2 & SF2_NO_DISABLED_SELF_DESTRUCT)
				set_modified();

			shipp->flags2 &= ~SF2_NO_DISABLED_SELF_DESTRUCT;
			break;
	}


	shipp->respawn_priority = 0;
	if(The_mission.game_type & MISSION_TYPE_MULTI) {
		m_respawn_priority.save(&shipp->respawn_priority);
	}
}
Example #4
0
void ship_flags_dlg::update_ship(int shipnum)
{
	ship *shipp = &Ships[shipnum];
	object *objp = &Objects[shipp->objnum];

	if (m_reinforcement.GetCheck() != 2)
		set_reinforcement(shipp->ship_name, m_reinforcement.GetCheck());

	switch (m_cargo_known.GetCheck()) {
		case 1:
			if ( !(shipp->flags & SF_CARGO_REVEALED) )
				set_modified();

			shipp->flags |= SF_CARGO_REVEALED;
			break;

		case 0:
			if ( shipp->flags & SF_CARGO_REVEALED )
				set_modified();

			shipp->flags &= ~SF_CARGO_REVEALED;
			break;
	}

	// update the flags for IGNORE_COUNT and PROTECT_SHIP
	switch (m_protect_ship.GetCheck()) {
		case 1:
			if (!(objp->flags & OF_PROTECTED) )
				set_modified();

			objp->flags |= OF_PROTECTED;
			break;

		case 0:
			if ( objp->flags & OF_PROTECTED )
				set_modified();

			objp->flags &= ~OF_PROTECTED;
			break;
	}

	switch (m_beam_protect_ship.GetCheck()) {
		case 1:
			if (!(objp->flags & OF_BEAM_PROTECTED) )
				set_modified();

			objp->flags |= OF_BEAM_PROTECTED;
			break;

		case 0:
			if ( objp->flags & OF_BEAM_PROTECTED )
				set_modified();

			objp->flags &= ~OF_BEAM_PROTECTED;
			break;
	}

	switch (m_invulnerable.GetCheck()) {
		case 1:
			if ( !(objp->flags & OF_INVULNERABLE) )
				set_modified();

			objp->flags |= OF_INVULNERABLE;
			break;

		case 0:
			if ( objp->flags & OF_INVULNERABLE )
				set_modified();

			objp->flags &= ~OF_INVULNERABLE;
			break;
	}

	switch (m_targetable_as_bomb.GetCheck()) {
		case 1:
			if ( !(objp->flags & OF_TARGETABLE_AS_BOMB) )
				set_modified();

			objp->flags |= OF_TARGETABLE_AS_BOMB;
			break;

		case 0:
			if ( objp->flags & OF_TARGETABLE_AS_BOMB )
				set_modified();

			objp->flags &= ~OF_TARGETABLE_AS_BOMB;
			break;
	}

	switch (m_hidden.GetCheck()) {
		case 1:
			if ( !(shipp->flags & SF_HIDDEN_FROM_SENSORS) )
				set_modified();

			shipp->flags |= SF_HIDDEN_FROM_SENSORS;
			break;

		case 0:
			if ( shipp->flags & SF_HIDDEN_FROM_SENSORS )
				set_modified();

			shipp->flags &= ~SF_HIDDEN_FROM_SENSORS;
			break;
	}

	switch (m_primitive_sensors.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_PRIMITIVE_SENSORS) )
				set_modified();

			shipp->flags2 |= SF2_PRIMITIVE_SENSORS;
			break;

		case 0:
			if ( shipp->flags2 & SF2_PRIMITIVE_SENSORS )
				set_modified();

			shipp->flags2 &= ~SF2_PRIMITIVE_SENSORS;
			break;
	}

	switch (m_no_subspace_drive.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_NO_SUBSPACE_DRIVE) )
				set_modified();

			shipp->flags2 |= SF2_NO_SUBSPACE_DRIVE;
			break;

		case 0:
			if ( shipp->flags2 & SF2_NO_SUBSPACE_DRIVE )
				set_modified();

			shipp->flags2 &= ~SF2_NO_SUBSPACE_DRIVE;
			break;
	}

	switch (m_affected_by_gravity.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_AFFECTED_BY_GRAVITY) )
				set_modified();

			shipp->flags2 |= SF2_AFFECTED_BY_GRAVITY;
			break;

		case 0:
			if ( shipp->flags2 & SF2_AFFECTED_BY_GRAVITY )
				set_modified();

			shipp->flags2 &= ~SF2_AFFECTED_BY_GRAVITY;
			break;
	}

	switch (m_toggle_subsystem_scanning.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_TOGGLE_SUBSYSTEM_SCANNING) )
				set_modified();

			shipp->flags2 |= SF2_TOGGLE_SUBSYSTEM_SCANNING;
			break;

		case 0:
			if ( shipp->flags2 & SF2_TOGGLE_SUBSYSTEM_SCANNING )
				set_modified();

			shipp->flags2 &= ~SF2_TOGGLE_SUBSYSTEM_SCANNING;
			break;
	}

	switch (m_ignore_count.GetCheck()) {
		case 1:
			if ( !(shipp->flags & SF_IGNORE_COUNT) )
				set_modified();

			shipp->flags |= SF_IGNORE_COUNT;
			break;

		case 0:
			if (shipp->flags & SF_IGNORE_COUNT)
				set_modified();

			shipp->flags &= ~SF_IGNORE_COUNT;
			break;
	}

	switch (m_escort.GetCheck()) {
		case 1:
			if (!(shipp->flags & SF_ESCORT))
				set_modified();

			shipp->flags |= SF_ESCORT;
			m_escort_value.save(&shipp->escort_priority);
			break;

		case 0:
			if (shipp->flags & SF_ESCORT)
				set_modified();

			shipp->flags &= ~SF_ESCORT;
			break;
	}

	// deal with updating the "destroy before the mission" stuff
	switch (m_destroy.GetCheck()) {
		case 0:  // this means no check in checkbox
			if ( shipp->flags & SF_KILL_BEFORE_MISSION )
				set_modified();

			shipp->flags &= ~SF_KILL_BEFORE_MISSION;
			break;

		case 1:  // this means checkbox is checked
			if ( !(shipp->flags & SF_KILL_BEFORE_MISSION) )
				set_modified();

			shipp->flags |= SF_KILL_BEFORE_MISSION;
			m_destroy_value.save(&shipp->final_death_time);
			break;
	}  // a mixed state is 2, and since it's not handled, it doesn't change

	switch (m_no_arrival_music.GetCheck()) {
		case 0:
			if (shipp->flags & SF_NO_ARRIVAL_MUSIC)
				set_modified();

			shipp->flags &= ~SF_NO_ARRIVAL_MUSIC;
			break;

		case 1:
			if (!(shipp->flags & SF_NO_ARRIVAL_MUSIC))
				set_modified();

			shipp->flags |= SF_NO_ARRIVAL_MUSIC;
			break;
	}

	switch (m_scannable.GetCheck()) {
		case 1:
			if ( !(shipp->flags & SF_SCANNABLE) )
				set_modified();

			shipp->flags |= SF_SCANNABLE;
			break;

		case 0:
			if ( shipp->flags & SF_SCANNABLE )
				set_modified();

			shipp->flags &= ~SF_SCANNABLE;
			break;
	}

	switch (m_red_alert_carry.GetCheck()) {
		case 1:
			if ( !(shipp->flags & SF_RED_ALERT_STORE_STATUS) )
				set_modified();

			shipp->flags |= SF_RED_ALERT_STORE_STATUS;
			break;

		case 0:
			if ( shipp->flags & SF_RED_ALERT_STORE_STATUS )
				set_modified();

			shipp->flags &= ~SF_RED_ALERT_STORE_STATUS;
			break;
	}

	switch (m_special_warpin.GetCheck()) {
		case 1:
			if ( !(objp->flags & OF_SPECIAL_WARPIN) )
				set_modified();

			objp->flags |= OF_SPECIAL_WARPIN;
			break;

		case 0:
			if ( (objp->flags & OF_SPECIAL_WARPIN) )
				set_modified();

			objp->flags &= (~OF_SPECIAL_WARPIN);
			break;
	}

	switch (m_no_dynamic.GetCheck()) {
		case 1:
			if ( !(Ai_info[shipp->ai_index].ai_flags & AIF_NO_DYNAMIC) )
				set_modified();

			Ai_info[shipp->ai_index].ai_flags |= AIF_NO_DYNAMIC;
			break;

		case 0:
			if ( Ai_info[shipp->ai_index].ai_flags & AIF_NO_DYNAMIC )
				set_modified();

			Ai_info[shipp->ai_index].ai_flags &= ~AIF_NO_DYNAMIC;
			break;
	}

	switch (m_kamikaze.GetCheck()) {
		case 1: {
			int damage;

			if ( !(Ai_info[shipp->ai_index].ai_flags & AIF_KAMIKAZE) )
				set_modified();

			Ai_info[shipp->ai_index].ai_flags |= AIF_KAMIKAZE;
			m_kdamage.save(&damage);
			Ai_info[shipp->ai_index].kamikaze_damage = i2fl(damage);
			break;
		}

		case 0:
			if ( Ai_info[shipp->ai_index].ai_flags & AIF_KAMIKAZE )
				set_modified();

			Ai_info[shipp->ai_index].ai_flags &= ~AIF_KAMIKAZE;
			Ai_info[shipp->ai_index].kamikaze_damage = 0.0f;
			break;
	}

	switch (m_disable_messages.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_NO_BUILTIN_MESSAGES) )
				set_modified();

			shipp->flags2 |= SF2_NO_BUILTIN_MESSAGES;
			break;

		case 0:
			if ( shipp->flags2 & SF2_NO_BUILTIN_MESSAGES )
				set_modified();

			shipp->flags2 &= ~SF2_NO_BUILTIN_MESSAGES;
			break;
	}

	switch (m_set_class_dynamically.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_SET_CLASS_DYNAMICALLY) )
				set_modified();

			shipp->flags2 |= SF2_SET_CLASS_DYNAMICALLY;
			break;

		case 0:
			if ( shipp->flags2 & SF2_SET_CLASS_DYNAMICALLY )
				set_modified();

			shipp->flags2 &= ~SF2_SET_CLASS_DYNAMICALLY;
			break;
	}

	switch (m_no_death_scream.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_NO_DEATH_SCREAM) )
				set_modified();

			shipp->flags2 |= SF2_NO_DEATH_SCREAM;
			break;

		case 0:
			if ( shipp->flags2 & SF2_NO_DEATH_SCREAM )
				set_modified();

			shipp->flags2 &= ~SF2_NO_DEATH_SCREAM;
			break;
	}

	switch (m_always_death_scream.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_ALWAYS_DEATH_SCREAM) )
				set_modified();

			shipp->flags2 |= SF2_ALWAYS_DEATH_SCREAM;
			break;

		case 0:
			if ( shipp->flags2 & SF2_ALWAYS_DEATH_SCREAM )
				set_modified();

			shipp->flags2 &= ~SF2_ALWAYS_DEATH_SCREAM;
			break;
	}

	switch (m_nav_carry.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_NAVPOINT_CARRY) )
				set_modified();

			shipp->flags2 |= SF2_NAVPOINT_CARRY;
			break;

		case 0:
			if ( shipp->flags2 & SF2_NAVPOINT_CARRY )
				set_modified();

			shipp->flags2 &= ~SF2_NAVPOINT_CARRY;
			break;
	}

	switch (m_nav_needslink.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_NAVPOINT_NEEDSLINK) )
				set_modified();

			shipp->flags2 |= SF2_NAVPOINT_NEEDSLINK;
			break;

		case 0:
			if ( shipp->flags2 & SF2_NAVPOINT_NEEDSLINK )
				set_modified();

			shipp->flags2 &= ~SF2_NAVPOINT_NEEDSLINK;
			break;
	}

	switch (m_hide_ship_name.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_HIDE_SHIP_NAME) )
				set_modified();

			shipp->flags2 |= SF2_HIDE_SHIP_NAME;
			break;

		case 0:
			if ( shipp->flags2 & SF2_HIDE_SHIP_NAME )
				set_modified();

			shipp->flags2 &= ~SF2_HIDE_SHIP_NAME;
			break;
	}

	switch (m_is_harmless.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_IS_HARMLESS) )
				set_modified();

			shipp->flags2 |= SF2_IS_HARMLESS;
			break;

		case 0:
			if ( shipp->flags2 & SF2_IS_HARMLESS )
				set_modified();

			shipp->flags2 &= ~SF2_IS_HARMLESS;
			break;
	}

	switch (m_hide_log_entries.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_HIDE_LOG_ENTRIES) )
				set_modified();

			shipp->flags2 |= SF2_HIDE_LOG_ENTRIES;
			break;

		case 0:
			if ( shipp->flags2 & SF2_HIDE_LOG_ENTRIES )
				set_modified();

			shipp->flags2 &= ~SF2_HIDE_LOG_ENTRIES;
			break;
	}

	switch (m_guardian.GetCheck()) {
		case 1:
			if ( !(shipp->ship_guardian_threshold) )
				set_modified();

			shipp->ship_guardian_threshold = SHIP_GUARDIAN_THRESHOLD_DEFAULT;
			break;

		case 0:
			if ( shipp->ship_guardian_threshold )
				set_modified();

			shipp->ship_guardian_threshold = 0;
			break;
	}

	switch (m_vaporize.GetCheck()) {
		case 1:
			if ( !(shipp->flags & SF_VAPORIZE) )
				set_modified();

			shipp->flags |= SF_VAPORIZE;
			break;

		case 0:
			if ( shipp->flags & SF_VAPORIZE )
				set_modified();

			shipp->flags &= ~SF_VAPORIZE;
			break;
	}

	switch (m_stealth.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_STEALTH) )
				set_modified();

			shipp->flags2 |= SF2_STEALTH;
			break;

		case 0:
			if ( shipp->flags2 & SF2_STEALTH )
				set_modified();

			shipp->flags2 &= ~SF2_STEALTH;
			break;
	}

	switch (m_friendly_stealth_invisible.GetCheck()) {
		case 1:
			if ( !(shipp->flags2 & SF2_FRIENDLY_STEALTH_INVIS) )
				set_modified();

			shipp->flags2 |= SF2_FRIENDLY_STEALTH_INVIS;
			break;

		case 0:
			if ( shipp->flags2 & SF2_FRIENDLY_STEALTH_INVIS )
				set_modified();

			shipp->flags2 &= ~SF2_FRIENDLY_STEALTH_INVIS;
			break;
	}

	shipp->respawn_priority = 0;
	if(The_mission.game_type & MISSION_TYPE_MULTI) {
		m_respawn_priority.save(&shipp->respawn_priority);
	}
}
void ship_flags_dlg::update_ship(int shipnum)
{
	ship *shipp = &Ships[shipnum];
	object *objp = &Objects[shipp->objnum];

	if (m_reinforcement.GetCheck() != 2)
	{
		//Check if we're trying to add more and we've got too many.
		if( (Num_reinforcements >= MAX_REINFORCEMENTS) && (m_reinforcement.GetCheck() == 1))
		{
			char error_message[256];
			sprintf(error_message, "Too many reinforcements; could not add ship '%s' to reinforcement list!", shipp->ship_name); 
			MessageBox(error_message);
		}
		//Otherwise, just update as normal.
		else
		{
			set_reinforcement(shipp->ship_name, m_reinforcement.GetCheck());	
		}
	}

	switch (m_cargo_known.GetCheck()) {
		case 1:
			if ( !(shipp->flags[Ship::Ship_Flags::Cargo_revealed]) )
				set_modified();

            shipp->flags.set(Ship::Ship_Flags::Cargo_revealed);
			break;

		case 0:
			if ( shipp->flags[Ship::Ship_Flags::Cargo_revealed] )
				set_modified();

            shipp->flags.remove(Ship::Ship_Flags::Cargo_revealed);
			break;
	}

	// update the flags for IGNORE_COUNT and PROTECT_SHIP
	switch (m_protect_ship.GetCheck()) {
		case 1:
			if (!(objp->flags[Object::Object_Flags::Protected]) )
				set_modified();

			objp->flags.set(Object::Object_Flags::Protected);
			break;

		case 0:
			if ( objp->flags[Object::Object_Flags::Protected] )
				set_modified();

			objp->flags.remove(Object::Object_Flags::Protected);
			break;
	}

	switch (m_beam_protect_ship.GetCheck()) {
		case 1:
			if (!(objp->flags[Object::Object_Flags::Beam_protected]) )
				set_modified();

			objp->flags.set(Object::Object_Flags::Beam_protected);
			break;

		case 0:
			if ( objp->flags[Object::Object_Flags::Beam_protected] )
				set_modified();

			objp->flags.remove(Object::Object_Flags::Beam_protected);
			break;
	}

	switch (m_flak_protect_ship.GetCheck()) {
		case 1:
			if (!(objp->flags[Object::Object_Flags::Flak_protected]) )
				set_modified();

			objp->flags.set(Object::Object_Flags::Flak_protected);
			break;

		case 0:
			if ( objp->flags[Object::Object_Flags::Flak_protected] )
				set_modified();

			objp->flags.remove(Object::Object_Flags::Flak_protected);
			break;
	}

	switch (m_laser_protect_ship.GetCheck()) {
		case 1:
			if (!(objp->flags[Object::Object_Flags::Laser_protected]) )
				set_modified();

			objp->flags.set(Object::Object_Flags::Laser_protected);
			break;

		case 0:
			if ( objp->flags[Object::Object_Flags::Laser_protected] )
				set_modified();

			objp->flags.remove(Object::Object_Flags::Laser_protected);
			break;
	}

	switch (m_missile_protect_ship.GetCheck()) {
		case 1:
			if (!(objp->flags[Object::Object_Flags::Missile_protected]) )
				set_modified();

			objp->flags.set(Object::Object_Flags::Missile_protected);
			break;

		case 0:
			if ( objp->flags[Object::Object_Flags::Missile_protected] )
				set_modified();

			objp->flags.remove(Object::Object_Flags::Missile_protected);
			break;
	}

	switch (m_invulnerable.GetCheck()) {
		case 1:
			if ( !(objp->flags[Object::Object_Flags::Invulnerable]) )
				set_modified();

			objp->flags.set(Object::Object_Flags::Invulnerable);
			break;

		case 0:
			if ( objp->flags[Object::Object_Flags::Invulnerable] )
				set_modified();

			objp->flags.remove(Object::Object_Flags::Invulnerable);
			break;
	}

	switch (m_targetable_as_bomb.GetCheck()) {
		case 1:
			if ( !(objp->flags[Object::Object_Flags::Targetable_as_bomb]) )
				set_modified();

			objp->flags.set(Object::Object_Flags::Targetable_as_bomb);
			break;

		case 0:
			if ( objp->flags[Object::Object_Flags::Targetable_as_bomb] )
				set_modified();

			objp->flags.remove(Object::Object_Flags::Targetable_as_bomb);
			break;
	}

	switch (m_immobile.GetCheck()) {
		case 1:
			if ( !(objp->flags[Object::Object_Flags::Immobile]) )
				set_modified();

			objp->flags.set(Object::Object_Flags::Immobile);
			break;

		case 0:
			if ( objp->flags[Object::Object_Flags::Immobile] )
				set_modified();

			objp->flags.remove(Object::Object_Flags::Immobile);
			break;
	}

	switch (m_hidden.GetCheck()) {
		case 1:
			if ( !(shipp->flags[Ship::Ship_Flags::Hidden_from_sensors]) )
				set_modified();

            shipp->flags.set(Ship::Ship_Flags::Hidden_from_sensors);
			break;

		case 0:
			if ( shipp->flags[Ship::Ship_Flags::Hidden_from_sensors] )
				set_modified();

            shipp->flags.remove(Ship::Ship_Flags::Hidden_from_sensors);
			break;
	}

	switch (m_primitive_sensors.GetCheck()) {
		case 1:
			if ( !(shipp->flags[Ship::Ship_Flags::Primitive_sensors]) )
				set_modified();

            shipp->flags.set(Ship::Ship_Flags::Primitive_sensors);
			break;

		case 0:
			if ( shipp->flags[Ship::Ship_Flags::Primitive_sensors] )
				set_modified();

            shipp->flags.remove(Ship::Ship_Flags::Primitive_sensors);
			break;
	}

	switch (m_no_subspace_drive.GetCheck()) {
		case 1:
			if ( !(shipp->flags[Ship::Ship_Flags::No_subspace_drive]) )
				set_modified();

            shipp->flags.set(Ship::Ship_Flags::No_subspace_drive);
			break;

		case 0:
			if ( shipp->flags[Ship::Ship_Flags::No_subspace_drive] )
				set_modified();

            shipp->flags.remove(Ship::Ship_Flags::No_subspace_drive);
			break;
	}

	switch (m_affected_by_gravity.GetCheck()) {
		case 1:
			if ( !(shipp->flags[Ship::Ship_Flags::Affected_by_gravity]) )
				set_modified();

			shipp->flags.set(Ship::Ship_Flags::Affected_by_gravity);
			break;

		case 0:
			if ( shipp->flags[Ship::Ship_Flags::Affected_by_gravity] )
				set_modified();

            shipp->flags.remove(Ship::Ship_Flags::Affected_by_gravity);
			break;
	}

	switch (m_toggle_subsystem_scanning.GetCheck()) {
		case 1:
			if ( !(shipp->flags[Ship::Ship_Flags::Toggle_subsystem_scanning]) )
				set_modified();

            shipp->flags.set(Ship::Ship_Flags::Toggle_subsystem_scanning);
			break;

		case 0:
			if ( shipp->flags[Ship::Ship_Flags::Toggle_subsystem_scanning] )
				set_modified();

            shipp->flags.remove(Ship::Ship_Flags::Toggle_subsystem_scanning);
			break;
	}

	switch (m_ignore_count.GetCheck()) {
		case 1:
			if ( !(shipp->flags[Ship::Ship_Flags::Ignore_count]) )
				set_modified();

            shipp->flags.set(Ship::Ship_Flags::Ignore_count);
			break;

		case 0:
			if (shipp->flags[Ship::Ship_Flags::Ignore_count])
				set_modified();

            shipp->flags.remove(Ship::Ship_Flags::Ignore_count);
			break;
	}

	switch (m_escort.GetCheck()) {
		case 1:
			if (!(shipp->flags[Ship::Ship_Flags::Escort]))
				set_modified();

			shipp->flags.set(Ship::Ship_Flags::Escort);
			m_escort_value.save(&shipp->escort_priority);
			break;

		case 0:
			if (shipp->flags[Ship::Ship_Flags::Escort])
				set_modified();

            shipp->flags.remove(Ship::Ship_Flags::Escort);
			break;
	}

	// deal with updating the "destroy before the mission" stuff
	switch (m_destroy.GetCheck()) {
		case 0:  // this means no check in checkbox
			if ( shipp->flags[Ship::Ship_Flags::Kill_before_mission] )
				set_modified();

            shipp->flags.remove(Ship::Ship_Flags::Kill_before_mission);
			break;

		case 1:  // this means checkbox is checked
			if ( !(shipp->flags[Ship::Ship_Flags::Kill_before_mission]) )
				set_modified();

            shipp->flags.set(Ship::Ship_Flags::Kill_before_mission);
			m_destroy_value.save(&shipp->final_death_time);
			break;
	}  // a mixed state is 2, and since it's not handled, it doesn't change

	switch (m_no_arrival_music.GetCheck()) {
		case 0:
			if (shipp->flags[Ship::Ship_Flags::No_arrival_music])
				set_modified();

            shipp->flags.remove(Ship::Ship_Flags::No_arrival_music);
			break;

		case 1:
			if (!(shipp->flags[Ship::Ship_Flags::No_arrival_music]))
				set_modified();

            shipp->flags.set(Ship::Ship_Flags::No_arrival_music);
			break;
	}

	switch (m_scannable.GetCheck()) {
		case 1:
			if ( !(shipp->flags[Ship::Ship_Flags::Scannable]) )
				set_modified();

            shipp->flags.set(Ship::Ship_Flags::Scannable);
			break;

		case 0:
			if ( shipp->flags[Ship::Ship_Flags::Scannable] )
				set_modified();

            shipp->flags.remove(Ship::Ship_Flags::Scannable);
			break;
	}

	switch (m_red_alert_carry.GetCheck()) {
		case 1:
			if ( !(shipp->flags[Ship::Ship_Flags::Red_alert_store_status]) )
				set_modified();

			shipp->flags.set(Ship::Ship_Flags::Red_alert_store_status);
			break;

		case 0:
			if ( shipp->flags[Ship::Ship_Flags::Red_alert_store_status] )
				set_modified();

            shipp->flags.remove(Ship::Ship_Flags::Red_alert_store_status);
			break;
	}

	switch (m_special_warpin.GetCheck()) {
		case 1:
			if ( !(objp->flags[Object::Object_Flags::Special_warpin]) )
				set_modified();

			objp->flags.set(Object::Object_Flags::Special_warpin);
			break;

		case 0:
			if ( (objp->flags[Object::Object_Flags::Special_warpin]) )
				set_modified();

            objp->flags.remove(Object::Object_Flags::Special_warpin);
			break;
	}

	switch (m_no_dynamic.GetCheck()) {
		case 1:
			if ( !(Ai_info[shipp->ai_index].ai_flags[AI::AI_Flags::No_dynamic]) )
				set_modified();

			Ai_info[shipp->ai_index].ai_flags.set(AI::AI_Flags::No_dynamic);
			break;

		case 0:
			if ( Ai_info[shipp->ai_index].ai_flags[AI::AI_Flags::No_dynamic] )
				set_modified();

			Ai_info[shipp->ai_index].ai_flags.remove(AI::AI_Flags::No_dynamic);
			break;
	}

	switch (m_kamikaze.GetCheck()) {
		case 1: {
			int damage;

			if ( !(Ai_info[shipp->ai_index].ai_flags[AI::AI_Flags::Kamikaze]) )
				set_modified();

			Ai_info[shipp->ai_index].ai_flags.set(AI::AI_Flags::Kamikaze);
			m_kdamage.save(&damage);
			Ai_info[shipp->ai_index].kamikaze_damage = damage;
			break;
		}

		case 0:
			if ( Ai_info[shipp->ai_index].ai_flags[AI::AI_Flags::Kamikaze] )
				set_modified();

			Ai_info[shipp->ai_index].ai_flags.remove(AI::AI_Flags::Kamikaze);
			Ai_info[shipp->ai_index].kamikaze_damage = 0;
			break;
	}

    switch (m_disable_messages.GetCheck()) {
    case 1:
        if (!(shipp->flags[Ship::Ship_Flags::No_builtin_messages]))
            set_modified();

        shipp->flags.set(Ship::Ship_Flags::No_builtin_messages);
        break;

    case 0:
        if (shipp->flags[Ship::Ship_Flags::No_builtin_messages])
            set_modified();

        shipp->flags.set(Ship::Ship_Flags::No_builtin_messages, false);
        break;
    }

    switch (m_set_class_dynamically.GetCheck()) {
    case 1:
        if (!(shipp->flags[Ship::Ship_Flags::Set_class_dynamically]))
            set_modified();

        shipp->flags.set(Ship::Ship_Flags::Set_class_dynamically);
        break;

    case 0:
        if (shipp->flags[Ship::Ship_Flags::Set_class_dynamically])
            set_modified();

        shipp->flags.remove(Ship::Ship_Flags::Set_class_dynamically);
        break;
    }

    switch (m_no_death_scream.GetCheck()) {
    case 1:
        if (!(shipp->flags[Ship::Ship_Flags::No_death_scream]))
            set_modified();

        shipp->flags.set(Ship::Ship_Flags::No_death_scream);
        break;

    case 0:
        if (shipp->flags[Ship::Ship_Flags::No_death_scream])
            set_modified();

        shipp->flags.remove(Ship::Ship_Flags::No_death_scream);
        break;
    }

    switch (m_always_death_scream.GetCheck()) {
    case 1:
        if (!(shipp->flags[Ship::Ship_Flags::Always_death_scream]))
            set_modified();

        shipp->flags.set(Ship::Ship_Flags::Always_death_scream);
        break;

    case 0:
        if (shipp->flags[Ship::Ship_Flags::Always_death_scream])
            set_modified();

        shipp->flags.remove(Ship::Ship_Flags::Always_death_scream);
        break;
    }

    switch (m_nav_carry.GetCheck()) {
    case 1:
        if (!(shipp->flags[Ship::Ship_Flags::Navpoint_carry]))
            set_modified();

        shipp->flags.set(Ship::Ship_Flags::Navpoint_carry);
        break;

    case 0:
        if (shipp->flags[Ship::Ship_Flags::Navpoint_carry])
            set_modified();

        shipp->flags.remove(Ship::Ship_Flags::Navpoint_carry);
        break;
    }

    switch (m_nav_needslink.GetCheck()) {
    case 1:
        if (!(shipp->flags[Ship::Ship_Flags::Navpoint_needslink]))
            set_modified();

        shipp->flags.set(Ship::Ship_Flags::Navpoint_needslink);
        break;

    case 0:
        if (shipp->flags[Ship::Ship_Flags::Navpoint_needslink])
            set_modified();

        shipp->flags.remove(Ship::Ship_Flags::Navpoint_needslink);
        break;
    }

    switch (m_hide_ship_name.GetCheck()) {
    case 1:
        if (!(shipp->flags[Ship::Ship_Flags::Hide_ship_name]))
            set_modified();

        shipp->flags.set(Ship::Ship_Flags::Hide_ship_name);
        break;

    case 0:
        if (shipp->flags[Ship::Ship_Flags::Hide_ship_name])
            set_modified();

        shipp->flags.remove(Ship::Ship_Flags::Hide_ship_name);
        break;
    }

    switch (m_disable_ets.GetCheck()) {
    case 1:
        if (!(shipp->flags[Ship::Ship_Flags::No_ets]))
            set_modified();

        shipp->flags.set(Ship::Ship_Flags::No_ets);
        break;

    case 0:
        if (shipp->flags[Ship::Ship_Flags::No_ets])
            set_modified();

        shipp->flags.remove(Ship::Ship_Flags::No_ets);
        break;
    }

    switch (m_cloaked.GetCheck()) {
    case 1:
        if (!(shipp->flags[Ship::Ship_Flags::Cloaked]))
            set_modified();

        shipp->flags.set(Ship::Ship_Flags::Cloaked);
        break;

    case 0:
        if (shipp->flags[Ship::Ship_Flags::Cloaked])
            set_modified();

        shipp->flags.remove(Ship::Ship_Flags::Cloaked);
        break;
    }

    switch (m_guardian.GetCheck()) {
    case 1:
        if (!(shipp->ship_guardian_threshold))
            set_modified();

        shipp->ship_guardian_threshold = SHIP_GUARDIAN_THRESHOLD_DEFAULT;
        break;

    case 0:
        if (shipp->ship_guardian_threshold)
            set_modified();

        shipp->ship_guardian_threshold = 0;
        break;
    }

    switch (m_vaporize.GetCheck()) {
    case 1:
        if (!(shipp->flags[Ship::Ship_Flags::Vaporize]))
            set_modified();

        shipp->flags.set(Ship::Ship_Flags::Vaporize);
        break;

    case 0:
        if (shipp->flags[Ship::Ship_Flags::Vaporize])
            set_modified();

        shipp->flags.remove(Ship::Ship_Flags::Vaporize);
        break;
    }

    switch (m_stealth.GetCheck()) {
    case 1:
        if (!(shipp->flags[Ship::Ship_Flags::Stealth]))
            set_modified();

        shipp->flags.set(Ship::Ship_Flags::Stealth);
        break;

    case 0:
        if (shipp->flags[Ship::Ship_Flags::Stealth])
            set_modified();

        shipp->flags.remove(Ship::Ship_Flags::Stealth);
        break;
    }

    switch (m_friendly_stealth_invisible.GetCheck()) {
    case 1:
        if (!(shipp->flags[Ship::Ship_Flags::Friendly_stealth_invis]))
            set_modified();

        shipp->flags.set(Ship::Ship_Flags::Friendly_stealth_invis);
        break;

    case 0:
        if (shipp->flags[Ship::Ship_Flags::Friendly_stealth_invis])
            set_modified();

        shipp->flags.remove(Ship::Ship_Flags::Friendly_stealth_invis);
        break;
    }

    switch (m_scramble_messages.GetCheck()) {
    case 1:
        if (!(shipp->flags[Ship::Ship_Flags::Scramble_messages]))
            set_modified();

        shipp->flags.set(Ship::Ship_Flags::Scramble_messages);
        break;

    case 0:
        if (shipp->flags[Ship::Ship_Flags::Scramble_messages])
            set_modified();

        shipp->flags.remove(Ship::Ship_Flags::Scramble_messages);
        break;
    }

    switch (m_no_collide.GetCheck()) {
    case 1:
        if (objp->flags[Object::Object_Flags::Collides])
            set_modified();

        objp->flags.remove(Object::Object_Flags::Collides);
        break;

    case 0:
        if (!(objp->flags[Object::Object_Flags::Collides]))
            set_modified();

        objp->flags.set(Object::Object_Flags::Collides);
        break;
    }

    switch (m_no_disabled_self_destruct.GetCheck()) {
    case 1:
        if (!(shipp->flags[Ship::Ship_Flags::No_disabled_self_destruct]))
            set_modified();

        shipp->flags.set(Ship::Ship_Flags::No_disabled_self_destruct);
        break;

    case 0:
        if (shipp->flags[Ship::Ship_Flags::No_disabled_self_destruct])
            set_modified();

        shipp->flags.remove(Ship::Ship_Flags::No_disabled_self_destruct);
        break;
    }

	shipp->respawn_priority = 0;
	if(The_mission.game_type & MISSION_TYPE_MULTI) {
		m_respawn_priority.save(&shipp->respawn_priority);
	}
}