diff --git a/code/ai/aibig.cpp b/code/ai/aibig.cpp index db6f43f072..9616b82cde 100644 --- a/code/ai/aibig.cpp +++ b/code/ai/aibig.cpp @@ -510,7 +510,7 @@ int ai_big_maybe_start_strafe(ai_info *aip, ship_info *sip) { // if moving slowly (or stopped), and SIF_SMALL_SHIP, then enter STRAFE mode if enemy fighter/bombers // are near - if ( sip->flags & SIF_SMALL_SHIP ) { + if ( sip->is_small_ship() ) { if ( timestamp_elapsed(aip->scan_for_enemy_timestamp) ) { ship_obj *so; object *test_objp; @@ -525,7 +525,7 @@ int ai_big_maybe_start_strafe(ai_info *aip, ship_info *sip) test_sp = &Ships[test_objp->instance]; if ( iff_x_attacks_y(Ships[Pl_objp->instance].team, test_sp->team) ) { - if ( Ship_info[test_sp->ship_info_index].flags & SIF_SMALL_SHIP ) { + if ( Ship_info[test_sp->ship_info_index].is_small_ship() ) { dist_squared = vm_vec_dist_squared(&Pl_objp->pos, &test_objp->pos); if ( dist_squared < ENTER_STRAFE_THREAT_DIST_SQUARED ) { return 1; @@ -641,7 +641,7 @@ void ai_big_chase_attack(ai_info *aip, ship_info *sip, vec3d *enemy_pos, float d accelerate_ship(aip, 1.0f); ship *shipp = &Ships[Pl_objp->instance]; - if ((aip->ai_flags & AIF_FREE_AFTERBURNER_USE) && !(shipp->flags2 & SF2_AFTERBURNER_LOCKED) && (dot_to_enemy > 0.75f)) { + if ((aip->ai_flags & AIF_FREE_AFTERBURNER_USE) && !(shipp->flags[Ship::Ship_Flags::Afterburner_locked]) && (dot_to_enemy > 0.75f)) { if (ai_maybe_fire_afterburner(Pl_objp, aip)) { afterburners_start(Pl_objp); aip->afterburner_stop_time = Missiontime + 3*F1_0; @@ -683,7 +683,7 @@ void ai_big_chase_attack(ai_info *aip, ship_info *sip, vec3d *enemy_pos, float d accelerate_ship(aip, accel); ship *shipp = &Ships[Pl_objp->instance]; - if ((aip->ai_flags & AIF_FREE_AFTERBURNER_USE) && !(shipp->flags2 & SF2_AFTERBURNER_LOCKED) && (accel > 0.95f)) { + if ((aip->ai_flags & AIF_FREE_AFTERBURNER_USE) && !(shipp->flags[Ship::Ship_Flags::Afterburner_locked]) && (accel > 0.95f)) { if (ai_maybe_fire_afterburner(Pl_objp, aip)) { afterburners_start(Pl_objp); aip->afterburner_stop_time = Missiontime + 3*F1_0; @@ -748,15 +748,15 @@ void ai_big_maybe_fire_weapons(float dist_to_enemy, float dot_to_enemy, vec3d *f } if (tswp->num_secondary_banks > 0) { - if (!(En_objp->flags & OF_PROTECTED) || (aip->goals[0].ai_mode & (AI_GOAL_DISABLE_SHIP | AI_GOAL_DISARM_SHIP))) { + if (!(En_objp->flags[Object::Object_Flags::Protected]) || (aip->goals[0].ai_mode & (AI_GOAL_DISABLE_SHIP | AI_GOAL_DISARM_SHIP))) { ai_choose_secondary_weapon(Pl_objp, aip, En_objp); int current_bank = tswp->current_secondary_bank; if (current_bank > -1) { weapon_info *swip = &Weapon_info[tswp->secondary_bank_weapons[current_bank]]; - if(!(En_objp->flags & OF_PROTECTED) || ((aip->goals[0].ai_mode & (AI_GOAL_DISABLE_SHIP | AI_GOAL_DISARM_SHIP)) && swip->wi_flags & WIF_PUNCTURE )) { //override lockdown on protected ships when using anti subsystem weapons - Valathil + if(!(En_objp->flags[Object::Object_Flags::Protected]) || ((aip->goals[0].ai_mode & (AI_GOAL_DISABLE_SHIP | AI_GOAL_DISARM_SHIP)) && swip->wi_flags & WIF_PUNCTURE )) { //override lockdown on protected ships when using anti subsystem weapons - Valathil // If ship is protected and very low on hits, don't fire missiles. - if (!(En_objp->flags & OF_PROTECTED) || (En_objp->hull_strength > 10*swip->damage)) { + if (!(En_objp->flags[Object::Object_Flags::Protected]) || (En_objp->hull_strength > 10*swip->damage)) { if (aip->ai_flags & AIF_UNLOAD_SECONDARIES) { if (timestamp_until(swp->next_secondary_fire_stamp[current_bank]) > swip->fire_wait*1000.0f) { swp->next_secondary_fire_stamp[current_bank] = timestamp((int) (swip->fire_wait*1000.0f)); @@ -771,7 +771,7 @@ void ai_big_maybe_fire_weapons(float dist_to_enemy, float dot_to_enemy, vec3d *f firing_range = MIN((swip->max_speed * swip->lifetime), swip->weapon_range); // reduce firing range of secondaries in nebula extern int Nebula_sec_range; - if ((The_mission.flags & MISSION_FLAG_FULLNEB) && Nebula_sec_range) { + if ((The_mission.flags[Mission::Mission_Flags::Fullneb]) && Nebula_sec_range) { firing_range *= 0.8f; } @@ -914,7 +914,7 @@ void ai_big_chase() dist_to_enemy = vm_vec_normalized_dir(&vec_to_enemy, &enemy_pos, &player_pos); // - En_objp->radius; dot_to_enemy = vm_vec_dot(&vec_to_enemy, &Pl_objp->orient.vec.fvec); update_aspect_lock_information(aip, &vec_to_enemy, dist_to_enemy, En_objp->radius); - } else if (En_objp->flags & OF_PROTECTED) { // If protected and we're not attacking a subsystem, stop attacking! + } else if (En_objp->flags[Object::Object_Flags::Protected]) { // If protected and we're not attacking a subsystem, stop attacking! update_aspect_lock_information(aip, &vec_to_enemy, dist_to_enemy - En_objp->radius, En_objp->radius); aip->target_objnum = -1; if (find_enemy(OBJ_INDEX(Pl_objp), MAX_ENEMY_DISTANCE, The_mission.ai_profile->max_attackers[Game_skill_level]) == -1) { @@ -1174,7 +1174,7 @@ void ai_big_attack_get_data(vec3d *enemy_pos, float *dist_to_enemy, float *dot_t Assert(aip->mode == AIM_STRAFE); // ensure that Pl_objp is still targeting a big ship - if ( !(esip->flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP)) ) { + if ( !(esip->is_big_or_huge()) ) { ai_big_switch_to_chase_mode(aip); return; } @@ -1654,7 +1654,7 @@ void ai_big_strafe() } */ // check if target is still a big ship... if not enter chase mode - if ( !(Ship_info[Ships[En_objp->instance].ship_info_index].flags & (SIF_BIG_SHIP|SIF_HUGE_SHIP)) ) { + if ( !(Ship_info[Ships[En_objp->instance].ship_info_index].is_big_or_huge()) ) { ai_big_switch_to_chase_mode(aip); return; } @@ -1727,12 +1727,12 @@ int ai_big_maybe_enter_strafe_mode(object *pl_objp, int weapon_objnum, int consi // if Pl_objp's target is not a big/capital ship, then cannot enter strafe mode // AL 12-31-97: Even though transports are considered big ships, don't enter strafe mode on them - if ( !(sip->flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP)) || (sip->flags & SIF_TRANSPORT) ) { + if ( !(sip->is_big_or_huge()) || (sip->flags[Ship::Info_Flags::Transport]) ) { return 0; } // If Pl_objp not a fighter or bomber, don't enter strafe mode. -- MK, 11/11/97. - if ( !(Ship_info[Ships[pl_objp->instance].ship_info_index].flags & (SIF_FIGHTER | SIF_BOMBER)) ) { + if ( !(Ship_info[Ships[pl_objp->instance].ship_info_index].is_fighter_bomber()) ) { return 0; } @@ -1754,7 +1754,7 @@ int ai_big_maybe_enter_strafe_mode(object *pl_objp, int weapon_objnum, int consi //JAS IMPOSSIBLE } else { // switch targets sip = &Ship_info[Ships[parent_objp->instance].ship_info_index]; - if ( !(sip->flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP)) || (sip->flags & SIF_TRANSPORT) ) { + if ( !(sip->is_big_or_huge()) || (sip->flags[Ship::Info_Flags::Transport]) ) { return 0; } set_target_objnum(aip, OBJ_INDEX(parent_objp)); diff --git a/code/ai/aicode.cpp b/code/ai/aicode.cpp index 8d6ce34ead..5229d446a8 100644 --- a/code/ai/aicode.cpp +++ b/code/ai/aicode.cpp @@ -881,7 +881,7 @@ void ai_level_init() bool is_object_stealth_ship(object* objp) { if (objp->type == OBJ_SHIP) { - if (Ships[objp->instance].flags2 & SF2_STEALTH) { + if (Ships[objp->instance].flags[Ship::Ship_Flags::Stealth]) { return true; } } @@ -976,7 +976,7 @@ int ai_is_stealth_visible(object *viewer_objp, object *stealth_objp) Assert(viewer_objp->type == OBJ_SHIP); // check if stealth ship - Assert(shipp->flags2 & SF2_STEALTH); + Assert(shipp->flags[Ship::Ship_Flags::Stealth]); // check if in neb and below awac level for visible if ( !ship_is_visible_by_team(stealth_objp, &Ships[viewer_objp->instance]) ) { @@ -1652,7 +1652,7 @@ int object_is_targetable(object *target, ship *viewer) } // for AI partially targetable works as fully targetable, except for stealth ship - if (Ships[target->instance].flags2 & SF2_STEALTH) { + if (Ships[target->instance].flags[Ship::Ship_Flags::Stealth]) { // if not team targetable, check if within frustum if ( ai_is_stealth_visible(&Objects[viewer->objnum], target) == STEALTH_IN_FRUSTUM ) { return 1; @@ -1694,7 +1694,7 @@ int num_enemies_attacking(int objnum) count++; // consider turrets that may be attacking objnum (but only turrets on SIF_BIG_SHIP ships) - if ( Ship_info[sp->ship_info_index].flags & SIF_BIG_SHIP ) { + if ( Ship_info[sp->ship_info_index].is_big_ship() ) { // loop through all the subsystems, check if turret has objnum as a target ssp = GET_FIRST(&sp->subsys_list); @@ -1788,7 +1788,7 @@ float get_wing_lowest_av_ab_speed(object *objp) wingnum = aip->wing; - if (((shipp->flags2 & SF2_AFTERBURNER_LOCKED) || !(sip->flags & SIF_AFTERBURNER)) || (shipp->current_max_speed < 5.0f) || (objp->phys_info.afterburner_max_vel.xyz.z <= shipp->current_max_speed) || !(aip->ai_flags & AIF_FREE_AFTERBURNER_USE)) { + if (((shipp->flags[Ship::Ship_Flags::Afterburner_locked]) || !(sip->flags[Ship::Info_Flags::Afterburner])) || (shipp->current_max_speed < 5.0f) || (objp->phys_info.afterburner_max_vel.xyz.z <= shipp->current_max_speed) || !(aip->ai_flags & AIF_FREE_AFTERBURNER_USE)) { lowest_max_av_ab_speed = shipp->current_max_speed; } else @@ -1813,7 +1813,7 @@ float get_wing_lowest_av_ab_speed(object *objp) if ((oaip->mode == AIM_WAYPOINTS) && (oaip->wing == wingnum) && (oaip->ai_flags & AIF_FORMATION)) { float cur_max; - if ((oshipp->flags2 & SF2_AFTERBURNER_LOCKED) || !(osip->flags & SIF_AFTERBURNER) || (o->phys_info.afterburner_max_vel.xyz.z <= oshipp->current_max_speed) || !(oaip->ai_flags & AIF_FREE_AFTERBURNER_USE)) { + if ((oshipp->flags[Ship::Ship_Flags::Afterburner_locked]) || !(osip->flags[Ship::Info_Flags::Afterburner]) || (o->phys_info.afterburner_max_vel.xyz.z <= oshipp->current_max_speed) || !(oaip->ai_flags & AIF_FREE_AFTERBURNER_USE)) { cur_max = oshipp->current_max_speed; } else @@ -1932,7 +1932,7 @@ void evaluate_object_as_nearest_objnum(eval_nearest_objnum *eno) attacking_subsystem = aip->targeted_subsys; - if ((attacking_subsystem != NULL) || !(eno->trial_objp->flags & OF_PROTECTED)) { + if ((attacking_subsystem != NULL) || !(eno->trial_objp->flags[Object::Object_Flags::Protected])) { if ( OBJ_INDEX(eno->trial_objp) != eno->objnum ) { #ifndef NDEBUG if (!Player_attacking_enabled && (eno->trial_objp == Player_obj)) @@ -1943,21 +1943,21 @@ void evaluate_object_as_nearest_objnum(eval_nearest_objnum *eno) return; // Don't keep firing at a ship that is in its death throes. - if (shipp->flags & SF_DYING) + if (shipp->flags[Ship::Ship_Flags::Dying]) return; if (is_ignore_object(aip, OBJ_INDEX(eno->trial_objp))) return; - if (eno->trial_objp->flags & OF_PROTECTED) + if (eno->trial_objp->flags[Object::Object_Flags::Protected]) return; - if (shipp->flags & SF_ARRIVING) + if (shipp->is_arriving()) return; ship_info *sip = &Ship_info[shipp->ship_info_index]; - if (sip->flags & (SIF_NO_SHIP_TYPE | SIF_NAVBUOY)) + if (sip->flags[Ship::Info_Flags::No_ship_type] || sip->flags[Ship::Info_Flags::Navbuoy]) return; if (iff_matches_mask(shipp->team, eno->enemy_team_mask)) { @@ -1970,14 +1970,14 @@ void evaluate_object_as_nearest_objnum(eval_nearest_objnum *eno) // check if can be targeted if inside nebula if ( !object_is_targetable(eno->trial_objp, &Ships[Objects[eno->objnum].instance]) ) { // check if stealth ship is visible, but not "targetable" - if ( !((shipp->flags2 & SF2_STEALTH) && ai_is_stealth_visible(&Objects[eno->objnum], eno->trial_objp)) ) { + if ( !((shipp->flags[Ship::Ship_Flags::Stealth]) && ai_is_stealth_visible(&Objects[eno->objnum], eno->trial_objp)) ) { return; } } } // if objnum is BIG or HUGE, find distance to bbox - if (sip->flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP)) { + if (sip->is_big_or_huge()) { vec3d box_pt; // check if inside bbox int inside = get_nearest_bbox_point(eno->trial_objp, &Objects[eno->objnum].pos, &box_pt); @@ -1992,17 +1992,19 @@ void evaluate_object_as_nearest_objnum(eval_nearest_objnum *eno) } // Make it more likely that fighters (or bombers) will be picked as an enemy by scaling up distance for other types. - if ((Ship_info[shipp->ship_info_index].flags & (SIF_FIGHTER | SIF_BOMBER))) { + if (Ship_info[shipp->ship_info_index].is_fighter_bomber()) { dist = dist * 0.5f; } num_attacking = num_enemies_attacking(OBJ_INDEX(eno->trial_objp)); - if ((sip->flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP)) || (num_attacking < eno->max_attackers)) { - if (!(sip->flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP))){ - dist *= (float) (num_attacking+2)/2.0f; // prevents lots of ships from attacking same target - } + + if (!sip->is_big_or_huge() && num_attacking < eno->max_attackers) { + dist *= (float)(num_attacking + 2) / 2.0f; // prevents lots of ships from attacking same target + } + + if ((sip->is_big_or_huge()) || (num_attacking < eno->max_attackers)) { - if (eno->trial_objp->flags & OF_PLAYER_SHIP){ + if (eno->trial_objp->flags[Object::Object_Flags::Player_ship]){ dist *= 1.0f + (NUM_SKILL_LEVELS - Game_skill_level - 1)/NUM_SKILL_LEVELS; // Favor attacking non-players based on skill level. } @@ -2107,11 +2109,11 @@ int find_nearby_threat(int objnum, int enemy_team_mask, float range, int *count) objp = &Objects[so->objnum]; if ( OBJ_INDEX(objp) != objnum ) { - if (Ships[objp->instance].flags & SF_DYING) + if (Ships[objp->instance].flags[Ship::Ship_Flags::Dying]) continue; - if (Ship_info[Ships[objp->instance].ship_info_index].flags & (SIF_NO_SHIP_TYPE | SIF_NAVBUOY)) - continue; + if (Ship_info[Ships[objp->instance].ship_info_index].flags[Ship::Info_Flags::No_ship_type] || Ship_info[Ships[objp->instance].ship_info_index].flags[Ship::Info_Flags::Navbuoy]) + continue; if (iff_matches_mask(Ships[objp->instance].team, enemy_team_mask)) { float dist; @@ -2205,7 +2207,7 @@ int find_enemy(int objnum, float range, int max_attackers) // This could cause attack on ship on fringe on nebula to stop if attackee moves our of nebula range. (BAD) if ( Objects[target_objnum].signature == aip->target_signature ) { if (iff_matches_mask(Ships[Objects[target_objnum].instance].team, enemy_team_mask)) { - if (!(Objects[target_objnum].flags & OF_PROTECTED)) { + if (!(Objects[target_objnum].flags[Object::Object_Flags::Protected])) { return target_objnum; } } @@ -2276,7 +2278,7 @@ void ai_attack_object(object *attacker, object *attacked, ship_subsys *ssp) } // Only set to chase if a fighter or bomber, otherwise just return. - if (!(Ship_info[Ships[attacker->instance].ship_info_index].flags & SIF_SMALL_SHIP) && (attacked != NULL)) { + if (!(Ship_info[Ships[attacker->instance].ship_info_index].is_small_ship()) && (attacked != NULL)) { nprintf(("AI", "AI ship %s is large ship ordered to attack %s\n", Ships[attacker->instance].ship_name, Ships[attacked->instance].ship_name)); } @@ -2314,7 +2316,7 @@ void ai_attack_object(object *attacker, object *attacked, ship_subsys *ssp) if (ssp == NULL) { set_targeted_subsys(aip, NULL, -1); if (aip->target_objnum != -1) { - Objects[aip->target_objnum].flags &= ~OF_PROTECTED; // If ship had been protected, unprotect it. + Objects[aip->target_objnum].flags.remove(Object::Object_Flags::Protected); // If ship had been protected, unprotect it. } } else { Int3(); // Not supported yet! @@ -2477,7 +2479,7 @@ void ai_ignore_object(object *ignorer, object *ignored, int ignore_new) aip->ignore_objnum = OBJ_INDEX(ignored); aip->ignore_signature = ignored->signature; aip->ai_flags &= ~AIF_TEMPORARY_IGNORE; - ignored->flags |= OF_PROTECTED; // set protected bit of ignored ship. + ignored->flags.set(Object::Object_Flags::Protected); // set protected bit of ignored ship. } } @@ -2849,7 +2851,7 @@ int pp_collide_any(vec3d *curpos, vec3d *goalpos, float radius, object *ignore_o object *objp = &Objects[so->objnum]; if (big_only_flag) { - if (!(Ship_info[Ships[objp->instance].ship_info_index].flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP))) + if (!Ship_info[Ships[objp->instance].ship_info_index].is_big_or_huge()) continue; } @@ -3024,15 +3026,15 @@ void ai_do_objects_docked_stuff(object *docker, int docker_point, object *dockee if (docker->type == OBJ_SHIP && dockee->type == OBJ_SHIP) { // maybe set support ship info - if ((Ship_info[Ships[docker->instance].ship_info_index].flags & SIF_SUPPORT) - || (Ship_info[Ships[dockee->instance].ship_info_index].flags & SIF_SUPPORT)) + if ((Ship_info[Ships[docker->instance].ship_info_index].flags[Ship::Info_Flags::Support]) + || (Ship_info[Ships[dockee->instance].ship_info_index].flags[Ship::Info_Flags::Support])) { ai_info *docker_aip = &Ai_info[Ships[docker->instance].ai_index]; ai_info *dockee_aip = &Ai_info[Ships[dockee->instance].ai_index]; #ifndef NDEBUG // support ship can only dock with one thing at a time - if (Ship_info[Ships[docker->instance].ship_info_index].flags & SIF_SUPPORT) + if (Ship_info[Ships[docker->instance].ship_info_index].flags[Ship::Info_Flags::Support]) Assert(docker->dock_list->next == NULL); else Assert(dockee->dock_list->next == NULL); @@ -3191,7 +3193,7 @@ void ai_start_fly_to_ship(object *objp, int shipnum) aip = &Ai_info[Ships[objp->instance].ai_index]; - if (The_mission.flags & MISSION_FLAG_USE_AP_CINEMATICS && AutoPilotEngaged) + if (The_mission.flags[Mission::Mission_Flags::Use_ap_cinematics] && AutoPilotEngaged) { aip->ai_flags &= ~AIF_FORMATION_WING; aip->ai_flags &= ~AIF_FORMATION_OBJECT; @@ -3231,7 +3233,7 @@ void ai_start_waypoints(object *objp, waypoint_list *wp_list, int wp_flags) return; } - if (The_mission.flags & MISSION_FLAG_USE_AP_CINEMATICS && AutoPilotEngaged) + if (The_mission.flags[Mission::Mission_Flags::Use_ap_cinematics] && AutoPilotEngaged) { aip->ai_flags &= ~AIF_FORMATION_WING; aip->ai_flags &= ~AIF_FORMATION_OBJECT; @@ -3309,7 +3311,7 @@ void ai_form_on_wing(object *objp, object *goal_objp) sip = &Ship_info[shipp->ship_info_index]; // Only fighters or bombers allowed to form on wing. - if (!(sip->flags & (SIF_FIGHTER | SIF_BOMBER))) { + if (!(sip->is_fighter_bomber())) { nprintf(("AI", "Warning: Ship %s tried to form on player's wing, but not fighter or bomber.\n", shipp->ship_name)); return; } @@ -4120,24 +4122,26 @@ int get_enemy_team_range(object *my_objp, float range, int enemy_team_mask, vec3 ship_obj *so; int count = 0; - for ( so = GET_FIRST(&Ship_obj_list); so != END_OF_LIST(&Ship_obj_list); so = GET_NEXT(so) ) { - objp = &Objects[so->objnum]; - if (iff_matches_mask(Ships[objp->instance].team, enemy_team_mask)) { - if (Ship_info[Ships[objp->instance].ship_info_index].flags & (SIF_FIGHTER | SIF_BOMBER | SIF_CRUISER | SIF_CAPITAL | SIF_SUPERCAP | SIF_DRYDOCK | SIF_CORVETTE | SIF_AWACS | SIF_GAS_MINER)) - if (vm_vec_dist_quick(&my_objp->pos, &objp->pos) < range) { - if (count == 0) { - *min_vec = objp->pos; - *max_vec = objp->pos; - count++; - } else { - update_min_max(objp->pos.xyz.x, &min_vec->xyz.x, &max_vec->xyz.x); - update_min_max(objp->pos.xyz.y, &min_vec->xyz.y, &max_vec->xyz.y); - update_min_max(objp->pos.xyz.z, &min_vec->xyz.z, &max_vec->xyz.z); - } - } + for (so = GET_FIRST(&Ship_obj_list); so != END_OF_LIST(&Ship_obj_list); so = GET_NEXT(so)) { + objp = &Objects[so->objnum]; + if (iff_matches_mask(Ships[objp->instance].team, enemy_team_mask)) { + ship_info* sip = &Ship_info[Ships[objp->instance].ship_info_index]; + if (sip->is_fighter_bomber() || sip->flags[Ship::Info_Flags::Cruiser] || sip->flags[Ship::Info_Flags::Capital] || sip->flags[Ship::Info_Flags::Supercap] || sip->flags[Ship::Info_Flags::Drydock] || sip->flags[Ship::Info_Flags::Corvette] || sip->flags[Ship::Info_Flags::Awacs] || sip->flags[Ship::Info_Flags::Gas_miner]) + if (vm_vec_dist_quick(&my_objp->pos, &objp->pos) < range) { + if (count == 0) { + *min_vec = objp->pos; + *max_vec = objp->pos; + count++; + } + else { + update_min_max(objp->pos.xyz.x, &min_vec->xyz.x, &max_vec->xyz.x); + update_min_max(objp->pos.xyz.y, &min_vec->xyz.y, &max_vec->xyz.y); + update_min_max(objp->pos.xyz.z, &min_vec->xyz.z, &max_vec->xyz.z); + } + } - } - } + } + } return count; } @@ -4322,7 +4326,7 @@ void ai_fly_to_target_position(vec3d* target_pos, bool* pl_done_p=NULL, bool* pl vec3d perp, goal_point; - bool carry_flag = ((shipp->flags2 & SF2_NAVPOINT_CARRY) || ((shipp->wingnum >= 0) && (Wings[shipp->wingnum].flags & WF_NAV_CARRY))); + bool carry_flag = ((shipp->flags[Ship::Ship_Flags::Navpoint_carry]) || ((shipp->wingnum >= 0) && (Wings[shipp->wingnum].flags & WF_NAV_CARRY))); if (AutoPilotEngaged) ab_allowed = false; @@ -4330,11 +4334,11 @@ void ai_fly_to_target_position(vec3d* target_pos, bool* pl_done_p=NULL, bool* pl if (AutoPilotEngaged && timestamp_elapsed(LockAPConv) && carry_flag - && ((The_mission.flags & MISSION_FLAG_USE_AP_CINEMATICS) || (Pl_objp != Autopilot_flight_leader)) ) + && ((The_mission.flags[Mission::Mission_Flags::Use_ap_cinematics]) || (Pl_objp != Autopilot_flight_leader)) ) { Assertion( Autopilot_flight_leader != NULL, "When under autopilot there must be a flight leader" ); // snap wings into formation them into formation - if (The_mission.flags & MISSION_FLAG_USE_AP_CINEMATICS) { + if (The_mission.flags[Mission::Mission_Flags::Use_ap_cinematics]) { if (aip->wing != -1) { int wing_index = get_wing_index(Pl_objp, aip->wing); object *wing_leader = get_wing_leader(aip->wing); @@ -4419,7 +4423,7 @@ void ai_fly_to_target_position(vec3d* target_pos, bool* pl_done_p=NULL, bool* pl } } - if (sip->flags & SIF_SMALL_SHIP) { + if (sip->is_small_ship()) { set_accel_for_target_speed(Pl_objp, dot1 * dist_to_goal/5.0f); } else { set_accel_for_target_speed(Pl_objp, dot1 * dist_to_goal/10.0f); @@ -4428,7 +4432,7 @@ void ai_fly_to_target_position(vec3d* target_pos, bool* pl_done_p=NULL, bool* pl ab_allowed = false; } - if (!(sip->flags & SIF_AFTERBURNER) || (shipp->flags2 & SF2_AFTERBURNER_LOCKED) || !(aip->ai_flags & AIF_FREE_AFTERBURNER_USE)) { + if (!(sip->flags[Ship::Info_Flags::Afterburner]) || (shipp->flags[Ship::Ship_Flags::Afterburner_locked]) || !(aip->ai_flags & AIF_FREE_AFTERBURNER_USE)) { ab_allowed = false; } @@ -4827,7 +4831,7 @@ int static_rand_timed(int num, int modulus) int ai_maybe_fire_afterburner(object *objp, ai_info *aip) { // bail if the ship doesn't even have an afterburner - if (!(Ship_info[Ships[objp->instance].ship_info_index].flags & SIF_AFTERBURNER)) { + if (!(Ship_info[Ships[objp->instance].ship_info_index].flags[Ship::Info_Flags::Afterburner])) { return 0; } if (aip->ai_aburn_use_factor == INT_MIN && aip->ai_class == 0) { @@ -5349,7 +5353,7 @@ int ai_select_primary_weapon(object *objp, object *other_objp, int flags) } } - if ( (other_objp->type == OBJ_SHIP) && (Ship_info[Ships[other_objp->instance].ship_info_index].flags & (SIF_BIG_SHIP|SIF_HUGE_SHIP) ) ) + if ( (other_objp->type == OBJ_SHIP) && (Ship_info[Ships[other_objp->instance].ship_info_index].is_big_or_huge() ) ) { //Check if we have a capital+ weapon on board for (int i = 0; i < swp->num_primary_banks; i++) @@ -5513,24 +5517,24 @@ void set_primary_weapon_linkage(object *objp) aip = &Ai_info[shipp->ai_index]; swp = &shipp->weapons; - shipp->flags &= ~SF_PRIMARY_LINKED; + shipp->flags.remove(Ship::Ship_Flags::Primary_linked); // AL: ensure target is a ship! if ( (aip->target_objnum != -1) && (Objects[aip->target_objnum].type == OBJ_SHIP) ) { // If trying to destroy a big ship (i.e., not disable/disarm), always unleash all weapons - if ( ship_get_SIF(&Ships[Objects[aip->target_objnum].instance]) & SIF_BIG_SHIP) { + if ( Ship_info[Ships[Objects[aip->target_objnum].instance].ship_info_index].is_big_ship() ) { if ( aip->targeted_subsys == NULL ) { - shipp->flags |= SF_PRIMARY_LINKED; - shipp->flags |= SF_SECONDARY_DUAL_FIRE; + shipp->flags.set(Ship::Ship_Flags::Primary_linked); + shipp->flags.set(Ship::Ship_Flags::Secondary_dual_fire); return; } } } - if (Num_weapons > (int) (MAX_WEAPONS * 0.75f) || sip->flags2 & SIF2_NO_PRIMARY_LINKING) { - if (shipp->flags & SF_PRIMARY_LINKED) + if (Num_weapons > (int) (MAX_WEAPONS * 0.75f) || sip->flags[Ship::Info_Flags::No_primary_linking]) { + if (shipp->flags[Ship::Ship_Flags::Primary_linked]) nprintf(("AI", "Frame %i, ship %s: Unlinking primaries.\n", Framecount, shipp->ship_name)); - shipp->flags &= ~SF_PRIMARY_LINKED; + shipp->flags.remove(Ship::Ship_Flags::Primary_linked); return; // If low on slots or primary linking disallowed, don't link. } @@ -5573,15 +5577,15 @@ void set_primary_weapon_linkage(object *objp) // make linking decision based on weapon energy if (energy > aip->ai_link_energy_levels_always) { - shipp->flags |= SF_PRIMARY_LINKED; + shipp->flags.set(Ship::Ship_Flags::Primary_linked); } else if (energy > aip->ai_link_ammo_levels_maybe) { if (objp->hull_strength < shipp->ship_max_hull_strength/3.0f) { - shipp->flags |= SF_PRIMARY_LINKED; + shipp->flags.set(Ship::Ship_Flags::Primary_linked); } } // also check ballistics - Goober5000 - if (sip->flags & SIF_BALLISTIC_PRIMARIES) + if (sip->flags[Ship::Info_Flags::Ballistic_primaries]) { total_ammo = 0; current_ammo = 0; @@ -5608,13 +5612,13 @@ void set_primary_weapon_linkage(object *objp) // link according to defined levels if (ammo_pct > aip->ai_link_ammo_levels_always) { - shipp->flags |= SF_PRIMARY_LINKED; + shipp->flags.set(Ship::Ship_Flags::Primary_linked); } else if (ammo_pct > aip->ai_link_ammo_levels_maybe) { if (objp->hull_strength < shipp->ship_max_hull_strength/3.0f) { - shipp->flags |= SF_PRIMARY_LINKED; + shipp->flags.set(Ship::Ship_Flags::Primary_linked); } } } @@ -5685,7 +5689,7 @@ int ai_fire_primary_weapon(object *objp) if (The_mission.ai_profile->primary_ammo_burst_mult[Game_skill_level] > 0 && //Make sure we are using burst fire enemy_objp != NULL && enemy_sip != NULL && //We need a target, obviously (enemy_objp->phys_info.speed >= 1.0f) && //Only burst for moving ships - (enemy_sip->flags & (SIF_SMALL_SHIP | SIF_TRANSPORT)) && //Only burst for small ships (transports count) + (enemy_sip->is_small_ship() || enemy_sip->flags[Ship::Info_Flags::Transport]) && //Only burst for small ships (transports count) swp->primary_bank_start_ammo[swp->current_primary_bank] > 0 && //Prevent div by 0 Weapon_info[swp->primary_bank_weapons[swp->current_primary_bank]].wi_flags2 & WIF2_BALLISTIC) //Current weapon must be ballistic { @@ -5713,7 +5717,7 @@ int ai_fire_primary_weapon(object *objp) // by multiple banks it can fire from. if (aip->target_objnum != -1) { object *tobjp = &Objects[aip->target_objnum]; - if (tobjp->flags & OF_PROTECTED) { + if (tobjp->flags[Object::Object_Flags::Protected]) { if (aip->targeted_subsys != NULL) { int type; @@ -5730,7 +5734,7 @@ int ai_fire_primary_weapon(object *objp) } // If enemy is protected, not firing a puncture weapon and enemy's hull is low, don't fire. - if ((enemy_objp != NULL) && (enemy_objp->flags & OF_PROTECTED)) { + if ((enemy_objp != NULL) && (enemy_objp->flags[Object::Object_Flags::Protected])) { // AL: 3-6-98: Check if current_primary_bank is valid if ((enemy_objp->hull_strength < 750.0f) && ((aip->targeted_subsys == NULL) || (enemy_objp->hull_strength < aip->targeted_subsys->current_hits + 50.0f)) && @@ -5749,9 +5753,9 @@ int ai_fire_primary_weapon(object *objp) ship_fire_primary(objp, 0); // fire streaming weapons - shipp->flags |= SF_TRIGGER_DOWN; + shipp->flags.set(Ship::Ship_Flags::Trigger_down); ship_fire_primary(objp, 1); - shipp->flags &= ~SF_TRIGGER_DOWN; + shipp->flags.remove(Ship::Ship_Flags::Trigger_down); return 1;//if it got down to here then it tryed to fire } @@ -5775,7 +5779,7 @@ int num_nearby_fighters(int enemy_team_mask, vec3d *pos, float threshold) ship_objp = &Objects[so->objnum]; if (iff_matches_mask(Ships[ship_objp->instance].team, enemy_team_mask)) { - if (Ship_info[Ships[ship_objp->instance].ship_info_index].flags & (SIF_FIGHTER | SIF_BOMBER)) { + if (Ship_info[Ships[ship_objp->instance].ship_info_index].is_fighter_bomber()) { if (vm_vec_dist_quick(pos, &ship_objp->pos) < threshold) count++; } @@ -6001,7 +6005,7 @@ int check_ok_to_fire(int objnum, int target_objnum, weapon_info *wip) // AL 3-4-98: Ensure objp target is a ship first if ( tobjp->type == OBJ_SHIP ) { - if (Ship_info[Ships[tobjp->instance].ship_info_index].flags & SIF_SMALL_SHIP) { + if (Ship_info[Ships[tobjp->instance].ship_info_index].is_small_ship()) { num_homers = compute_num_homing_objects(&Objects[target_objnum]); } } @@ -6009,7 +6013,7 @@ int check_ok_to_fire(int objnum, int target_objnum, weapon_info *wip) // If player, maybe fire based on Skill_level and number of incoming weapons. // If non-player, maybe fire based on payload of incoming weapons. if (wip->wi_flags & WIF_HOMING) { - if ((target_objnum > -1) && (tobjp->flags & OF_PLAYER_SHIP)) { + if ((target_objnum > -1) && (tobjp->flags[Object::Object_Flags::Player_ship])) { if (Ai_info[Ships[tobjp->instance].ai_index].target_objnum != objnum) { // Don't allow AI ships to fire at player for fixed periods of time based on skill level. // With 5 skill levels, at Very Easy, they fire in 1/7 of every 10 second interval. @@ -6858,7 +6862,7 @@ int will_collide_with_big_ship_all(object *objp, object *ignore_objp, vec3d *goa if (big_objp == ignore_objp) continue; - if (Ship_info[Ships[big_objp->instance].ship_info_index].flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP)) { + if (Ship_info[Ships[big_objp->instance].ship_info_index].is_big_or_huge()) { vec3d cur_collision_point; float cur_dist; @@ -7402,7 +7406,7 @@ int ai_set_attack_subsystem(object *objp, int subnum) aip->ignore_objnum = UNUSED_OBJNUM; } - // -- Done at caller in ai_process_mission_orders -- attacked_objp->flags |= OF_PROTECTED; + // -- Done at caller in ai_process_mission_orders -- attacked_objp->flags .add(Object::Object_Flags::Protected); ai_set_goal_maybe_abort_dock(objp, aip); aip->ok_to_target_timestamp = timestamp(DELAY_TARGET_TIME); @@ -7605,7 +7609,7 @@ void update_aspect_lock_information(ai_info *aip, vec3d *vec_to_enemy, float dis wip = &Weapon_info[swp->secondary_bank_weapons[swp->current_secondary_bank]]; - if (num_weapon_types && (wip->wi_flags & WIF_LOCKED_HOMING) && !(shipp->flags2 & SF2_NO_SECONDARY_LOCKON)) { + if (num_weapon_types && (wip->wi_flags & WIF_LOCKED_HOMING) && !(shipp->flags[Ship::Ship_Flags::No_secondary_lockon])) { if (dist_to_enemy > 300.0f - MIN(enemy_radius, 100.0f)) aip->ai_flags |= AIF_SEEK_LOCK; else @@ -7736,7 +7740,7 @@ void ai_choose_secondary_weapon(object *objp, ai_info *aip, object *en_objp) } if ( esip ) { - is_big_ship = esip->flags & (SIF_HUGE_SHIP | SIF_BIG_SHIP); + is_big_ship = esip->is_big_or_huge(); } else { is_big_ship=0; } @@ -7748,7 +7752,7 @@ void ai_choose_secondary_weapon(object *objp, ai_info *aip, object *en_objp) wif2_priority1 = WIF2_CAPITAL_PLUS; wif2_priority2 = 0; } - else if ( (esip != NULL) && (esip->flags & SIF_BOMBER) ) + else if ( (esip != NULL) && (esip->flags[Ship::Info_Flags::Bomber]) ) { wif_priority1 = WIF_BOMBER_PLUS; wif_priority2 = WIF_HOMING; @@ -8154,9 +8158,11 @@ void ai_chase() vec3d player_pos, enemy_pos, predicted_enemy_pos, real_vec_to_enemy, predicted_vec_to_enemy; ship *shipp = &Ships[Pl_objp->instance]; ship_info *sip = &Ship_info[shipp->ship_info_index]; + ship_info *enemy_sip = NULL; ship_weapon *swp = &shipp->weapons; ai_info *aip = &Ai_info[shipp->ai_index]; - int enemy_sip_flags, enemy_shipp_flags2; + flagset enemy_sip_flags; + flagset enemy_shipp_flags; int has_fired = -1; if (aip->mode != AIM_CHASE) { @@ -8206,15 +8212,16 @@ void ai_chase() Assert( En_objp != NULL ); if ( En_objp->type == OBJ_SHIP ) { - enemy_sip_flags = Ship_info[Ships[En_objp->instance].ship_info_index].flags; - enemy_shipp_flags2 = Ships[En_objp->instance].flags2; + enemy_sip_flags = Ship_info[Ships[En_objp->instance].ship_info_index].flags; + enemy_sip = &Ship_info[Ships[En_objp->instance].ship_info_index]; + enemy_shipp_flags = Ships[En_objp->instance].flags; } else { - enemy_sip_flags = 0; - enemy_shipp_flags2 = 0; + enemy_sip_flags.reset(); + enemy_shipp_flags.reset(); } - if ( enemy_sip_flags > 0 ) { - if (enemy_sip_flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP)) { + if ( enemy_sip_flags.any_set() ) { + if (Ship_info[Ships[En_objp->instance].ship_info_index].is_big_or_huge()) { ai_big_chase(); return; } @@ -8240,14 +8247,14 @@ void ai_chase() real_dot_to_enemy = vm_vec_dot(&real_vec_to_enemy, &Pl_objp->orient.vec.fvec); int is_stealthy_ship = 0; - if ( (enemy_sip_flags > 0) && (enemy_shipp_flags2 & SF2_STEALTH) ) { + if ( (enemy_sip_flags.any_set() ) && (enemy_shipp_flags[Ship::Ship_Flags::Stealth]) ) { if ( ai_is_stealth_visible(Pl_objp, En_objp) != STEALTH_FULLY_TARGETABLE ) { is_stealthy_ship = 1; } } // Can only acquire lock on a target that isn't hidden from sensors - if ( En_objp->type == OBJ_SHIP && !(Ships[En_objp->instance].flags & SF_HIDDEN_FROM_SENSORS) && !is_stealthy_ship ) { + if ( En_objp->type == OBJ_SHIP && !(Ships[En_objp->instance].flags[Ship::Ship_Flags::Hidden_from_sensors]) && !is_stealthy_ship ) { update_aspect_lock_information(aip, &real_vec_to_enemy, dist_to_enemy, En_objp->radius); } else { aip->current_target_is_locked = 0; @@ -8457,7 +8464,7 @@ void ai_chase() aip->submode = SM_GET_AWAY; aip->submode_start_time = Missiontime; aip->last_hit_target_time = Missiontime; - } else if ((enemy_sip_flags & SIF_SMALL_SHIP) + } else if (enemy_sip != NULL && (enemy_sip->is_small_ship()) && (dot_to_enemy < dot_from_enemy) && (En_objp->phys_info.speed > 15.0f) && (dist_to_enemy < 200.0f) @@ -8469,7 +8476,7 @@ void ai_chase() } else if ((dot_to_enemy > 0.2f) && (dot_from_enemy > -0.2f) && (dot_from_enemy < 0.1f)) { aip->submode = SM_GET_BEHIND; aip->submode_start_time = Missiontime; - } else if ((enemy_sip_flags & SIF_SMALL_SHIP) && (dist_to_enemy < 150.0f) && (dot_from_enemy > dot_to_enemy + 0.5f + aip->ai_courage*.002)) { + } else if ( enemy_sip != NULL && (enemy_sip->is_small_ship()) && (dist_to_enemy < 150.0f) && (dot_from_enemy > dot_to_enemy + 0.5f + aip->ai_courage*.002)) { float get_away_chance = (aip->ai_get_away_chance == FLT_MIN) ? (float)(aip->ai_class + Game_skill_level)/(Num_ai_classes + NUM_SKILL_LEVELS) : aip->ai_get_away_chance; @@ -8481,7 +8488,7 @@ void ai_chase() aip->submode = SM_EVADE_SQUIGGLE; aip->submode_start_time = Missiontime; } - } else if ((enemy_sip_flags & SIF_SMALL_SHIP) && (Missiontime - aip->submode_start_time > F1_0*2)) { + } else if ( enemy_sip != NULL && (enemy_sip->is_small_ship()) && (Missiontime - aip->submode_start_time > F1_0 * 2)) { if ((dot_to_enemy < 0.8f) && (dot_from_enemy > dot_to_enemy)) { if (frand() > 0.5f) { aip->submode = SM_CONTINUOUS_TURN; @@ -8562,7 +8569,7 @@ void ai_chase() aip->submode = AIS_CHASE_CIRCLESTRAFE; aip->submode_start_time = Missiontime; aip->last_attack_time = Missiontime; - } else if ((dist_to_enemy < 100.0f) && (dot_to_enemy < 0.8f) && (enemy_sip_flags & SIF_SMALL_SHIP) && (Missiontime - aip->submode_start_time > i2f(5) )) { + } else if ((dist_to_enemy < 100.0f) && (dot_to_enemy < 0.8f) && (enemy_sip->is_small_ship()) && (Missiontime - aip->submode_start_time > i2f(5) )) { aip->ai_flags &= ~AIF_ATTACK_SLOWLY; // Just in case, clear here. float get_away_chance = (aip->ai_get_away_chance == FLT_MIN) @@ -8782,7 +8789,7 @@ void ai_chase() if ( tswp->num_secondary_banks > 0) { // Don't fire secondaries at a protected ship. - if (!(En_objp->flags & OF_PROTECTED)) { + if (!(En_objp->flags[Object::Object_Flags::Protected])) { ai_choose_secondary_weapon(Pl_objp, aip, En_objp); int current_bank = tswp->current_secondary_bank; @@ -8814,7 +8821,7 @@ void ai_chase() // reduce firing range in nebula extern int Nebula_sec_range; - if ((The_mission.flags & MISSION_FLAG_FULLNEB) && Nebula_sec_range) { + if ((The_mission.flags[Mission::Mission_Flags::Fullneb]) && Nebula_sec_range) { firing_range *= 0.8f; } @@ -9159,7 +9166,7 @@ float dock_orient_and_approach(object *docker_objp, int docker_index, object *do float speed_scale = 1.0f; - if (sip0->flags & SIF_SUPPORT) { + if (sip0->flags[Ship::Info_Flags::Support]) { speed_scale = 3.0f; } @@ -9181,7 +9188,7 @@ float dock_orient_and_approach(object *docker_objp, int docker_index, object *do vel_limit = docker_objp->phys_info.max_rotvel; vm_vec_copy_scale(&acc_limit, &vel_limit, 0.3f); - if (sip0->flags & SIF_SUPPORT) + if (sip0->flags[Ship::Info_Flags::Support]) vm_vec_scale(&acc_limit, 2.0f); // 1 at end of line prevent overshoot @@ -9232,7 +9239,7 @@ float dock_orient_and_approach(object *docker_objp, int docker_index, object *do vel_limit = docker_objp->phys_info.max_rotvel; vm_vec_copy_scale(&acc_limit, &vel_limit, 0.3f); - if (sip0->flags & SIF_SUPPORT) + if (sip0->flags[Ship::Info_Flags::Support]) vm_vec_scale(&acc_limit, 2.0f); vm_matrix_interpolate(&dom, &docker_objp->orient, &omega_in, flFrametime, &nm, &omega_out, &vel_limit, &acc_limit); @@ -9369,7 +9376,7 @@ int num_ships_attacking(int target_objnum) { if (attacking_aip->target_objnum == target_objnum) { - if ( ((Game_mode & GM_MULTIPLAYER) && (attacking_objp->flags & OF_PLAYER_SHIP)) + if ( ((Game_mode & GM_MULTIPLAYER) && (attacking_objp->flags[Object::Object_Flags::Player_ship])) || (attacking_aip->mode == AIM_CHASE) ) { count++; @@ -9396,7 +9403,7 @@ void remove_farthest_attacker(int objnum) for ( so = GET_FIRST(&Ship_obj_list); so != END_OF_LIST(&Ship_obj_list); so = GET_NEXT(so) ) { objp = &Objects[so->objnum]; - if ( !(objp->flags & OF_PLAYER_SHIP)) { + if ( !(objp->flags[Object::Object_Flags::Player_ship])) { if (objp->instance != -1) { ai_info *aip2; @@ -9452,7 +9459,7 @@ int ai_maybe_limit_attackers(int attacked_objnum) { int rval=-1; - if ( Objects[attacked_objnum].flags & OF_PLAYER_SHIP) { + if ( Objects[attacked_objnum].flags[Object::Object_Flags::Player_ship]) { int num_attacking; num_attacking = num_ships_attacking(attacked_objnum); @@ -9523,7 +9530,7 @@ void guard_object_was_hit(object *guard_objp, object *hitter_objp) if ((aip->submode == AIS_GUARD_PATROL) || (aip->submode == AIS_GUARD_STATIC)) { if ( hitter_objp->type == OBJ_SHIP ) { - if (!(Ship_info[Ships[guard_objp->instance].ship_info_index].flags & SIF_SMALL_SHIP)) { + if (!(Ship_info[Ships[guard_objp->instance].ship_info_index].is_small_ship())) { return; } @@ -9943,7 +9950,7 @@ void ai_big_guard() ai_turn_towards_vector(&goal_pt, Pl_objp, flFrametime, Ship_info[Ships[Pl_objp->instance].ship_info_index].srotation_time, NULL, NULL, 0.0f, 0); accelerate_ship(aip, 1.0f); - if ((aip->ai_flags & AIF_FREE_AFTERBURNER_USE) && !(shipp->flags2 & SF2_AFTERBURNER_LOCKED) && (cur_guard_rad > 1.1f * max_guard_dist)) { + if ((aip->ai_flags & AIF_FREE_AFTERBURNER_USE) && !(shipp->flags[Ship::Ship_Flags::Afterburner_locked]) && (cur_guard_rad > 1.1f * max_guard_dist)) { vec3d v2g; float dot_to_goal_point; @@ -10066,7 +10073,7 @@ void ai_guard() compute_desired_rvec(&rvec, &goal_point, &Pl_objp->pos); ai_turn_towards_vector(&goal_point, Pl_objp, flFrametime, Ship_info[shipp->ship_info_index].srotation_time, NULL, NULL, 0.0f, 0, &rvec); - if ((aip->ai_flags & AIF_FREE_AFTERBURNER_USE) && !(shipp->flags2 & SF2_AFTERBURNER_LOCKED) && (accel_scale * (0.25f + dist_to_goal_point/700.0f) > 0.8f)) { + if ((aip->ai_flags & AIF_FREE_AFTERBURNER_USE) && !(shipp->flags[Ship::Ship_Flags::Afterburner_locked]) && (accel_scale * (0.25f + dist_to_goal_point/700.0f) > 0.8f)) { if (ai_maybe_fire_afterburner(Pl_objp, aip)) { afterburners_start(Pl_objp); aip->afterburner_stop_time = Missiontime + 3*F1_0; @@ -10220,7 +10227,7 @@ void ai_do_objects_repairing_stuff( object *repaired_objp, object *repair_objp, stamp = timestamp(-1); // if this is a player ship, then subtract the repair penalty from this player's score - if ( repaired_objp->flags & OF_PLAYER_SHIP ) { + if ( repaired_objp->flags[Object::Object_Flags::Player_ship] ) { if ( !(Game_mode & GM_MULTIPLAYER) ) { Player->stats.m_score -= The_mission.ai_profile->repair_penalty[Game_skill_level]; // subtract the penalty } @@ -10284,7 +10291,7 @@ void ai_do_objects_repairing_stuff( object *repaired_objp, object *repair_objp, } // add log entry if this is a player - if ( repaired_objp->flags & OF_PLAYER_SHIP ){ + if ( repaired_objp->flags[Object::Object_Flags::Player_ship] ){ mission_log_add_entry(LOG_PLAYER_ABORTED_REARM, Ships[repaired_objp->instance].ship_name, NULL); } @@ -10750,7 +10757,7 @@ void ai_dock() Assert(dist != UNINITIALIZED_VALUE); float tolerance; - if (goal_objp->flags & OF_PLAYER_SHIP) + if (goal_objp->flags[Object::Object_Flags::Player_ship]) tolerance = 6*flFrametime + 1.0f; else tolerance = 4*flFrametime + 0.5f; @@ -10994,7 +11001,7 @@ void ai_dock() // NOTE: the speed check has an etra 5 thousandths added on to account for some floating point error if ((dist < 2.0f) || (vm_vec_dist_quick(&Pl_objp->pos, &goal_objp->pos) > (Pl_objp->radius + goal_objp->radius)*2) || ((goal_objp->phys_info.speed + 0.005f) > MAX_UNDOCK_ABORT_SPEED) ) { // reset the dock flags. If rearm/repair, reset rearm repair flags for those ships as well. - if ( sip->flags & SIF_SUPPORT ) { + if ( sip->flags[Ship::Info_Flags::Support] ) { ai_do_objects_repairing_stuff( &Objects[aip->support_ship_objnum], Pl_objp, REPAIR_INFO_END ); } @@ -11038,7 +11045,7 @@ void ai_dock() // possible that this flag hasn't been cleared yet. When aborting a rearm, this submode might // be entered directly. - if ( (sip->flags & SIF_SUPPORT) && (aip->ai_flags & AIF_REPAIRING) ) { + if ( (sip->flags[Ship::Info_Flags::Support]) && (aip->ai_flags & AIF_REPAIRING) ) { ai_do_objects_repairing_stuff( goal_objp, Pl_objp, REPAIR_INFO_ABORT ); } } @@ -11208,7 +11215,7 @@ void process_subobjects(int objnum) if (ship_get_subsystem_strength(shipp, SUBSYSTEM_ENGINE) == 0.0f) { // Karajorma - if Player_use_ai is ever fixed to work on multiplayer it should be checked that any player ships // aren't under AI control here - if ( (!(objp->flags & OF_PLAYER_SHIP) ) && (sip->flags & (SIF_FIGHTER | SIF_BOMBER)) && !(shipp->flags & SF_DYING) ) { + if ( (!(objp->flags[Object::Object_Flags::Player_ship]) ) && (sip->is_fighter_bomber()) && !(shipp->flags[Ship::Ship_Flags::Dying]) ) { // Goober5000 - don't do anything if docked if (!object_is_docked(objp)) { // AL: Only attack forever if not trying to depart to a docking bay. Need to have this in, since @@ -11418,7 +11425,7 @@ void get_absolute_wing_pos(vec3d *result_pos, object *leader_objp, int wing_inde wing_spread_size = MAX(50.0f, 3.0f * get_wing_largest_radius(leader_objp, formation_object_flag) + 15.0f); // for player obj (1) move ships up 20% (2) scale formation up 20% - if (leader_objp->flags & OF_PLAYER_SHIP) { + if (leader_objp->flags[Object::Object_Flags::Player_ship]) { wing_delta.xyz.y *= Wing_y_scale; wing_spread_size *= Wing_scale; } @@ -11775,7 +11782,7 @@ int ai_formation() ship_info *sip = &Ship_info[shipp->ship_info_index]; bool ab_allowed = false; - if ((sip->flags & SIF_AFTERBURNER) && !(shipp->flags2 & SF2_AFTERBURNER_LOCKED) && (aip->ai_flags & AIF_FREE_AFTERBURNER_USE)) { + if ((sip->flags[Ship::Info_Flags::Afterburner]) && !(shipp->flags[Ship::Ship_Flags::Afterburner_locked]) && (aip->ai_flags & AIF_FREE_AFTERBURNER_USE)) { ab_allowed = true; } else { if (Pl_objp->phys_info.flags & PF_AFTERBURNER_ON) @@ -12094,7 +12101,7 @@ void ai_maybe_launch_cmeasure(object *objp, ai_info *aip) shipp = &Ships[objp->instance]; sip = &Ship_info[shipp->ship_info_index]; - if (!(sip->flags & (SIF_SMALL_SHIP | SIF_TRANSPORT))) + if (!(sip->is_small_ship() || sip->flags[Ship::Info_Flags::Transport])) return; if (object_is_docked(objp)) @@ -12338,7 +12345,7 @@ void ai_manage_shield(object *objp, ai_info *aip) // set timestamp aip->shield_manage_timestamp = timestamp((int) (delay * 1000.0f)); - if (sip->flags & SIF_SMALL_SHIP || (aip->ai_profile_flags2 & AIPF2_ALL_SHIPS_MANAGE_SHIELDS)) { + if (sip->is_small_ship() || (aip->ai_profile_flags2 & AIPF2_ALL_SHIPS_MANAGE_SHIELDS)) { if (Missiontime - aip->last_hit_time < F1_0*10) ai_transfer_shield(objp, aip->last_hit_quadrant); else @@ -12355,7 +12362,7 @@ void ai_maybe_evade_locked_missile(object *objp, ai_info *aip) shipp = &Ships[objp->instance]; // Only small ships evade an incoming missile. Why would a capital ship try to swerve? - if (!(Ship_info[Ships[objp->instance].ship_info_index].flags & SIF_SMALL_SHIP)) { + if (!Ship_info[Ships[objp->instance].ship_info_index].is_small_ship()) { return; } @@ -12458,7 +12465,7 @@ void ai_maybe_evade_locked_missile(object *objp, ai_info *aip) void maybe_evade_dumbfire_weapon(ai_info *aip) { // Only small ships evade an incoming missile. Why would a capital ship try to swerve? - if (!(Ship_info[Ships[Pl_objp->instance].ship_info_index].flags & SIF_SMALL_SHIP)) { + if (!Ship_info[Ships[Pl_objp->instance].ship_info_index].is_small_ship()) { return; } @@ -12551,7 +12558,7 @@ void maybe_evade_dumbfire_weapon(ai_info *aip) case AIM_WAYPOINTS: case AIM_FLY_TO_SHIP: case AIM_SAFETY: - if (!(aip->ai_flags & (AIF_NO_DYNAMIC | AIF_KAMIKAZE)) && (Ship_info[Ships[aip->shipnum].ship_info_index].flags & SIF_SMALL_SHIP)) { + if (!(aip->ai_flags & (AIF_NO_DYNAMIC | AIF_KAMIKAZE)) && Ship_info[Ships[aip->shipnum].ship_info_index].is_small_ship()) { aip->active_goal = AI_ACTIVE_GOAL_DYNAMIC; aip->previous_mode = aip->mode; aip->previous_submode = aip->submode; @@ -12779,7 +12786,7 @@ void ai_bay_emerge() if ( !parent_died ) { Assert(Objects[aip->goal_objnum].type == OBJ_SHIP); - if ( Ships[Objects[aip->goal_objnum].instance].flags & SF_DYING ) { + if ( Ships[Objects[aip->goal_objnum].instance].flags[Ship::Ship_Flags::Dying] ) { parent_died = 1; } } @@ -12948,7 +12955,7 @@ int ai_acquire_depart_path(object *pl_objp, int parent_objnum, int allowed_path_ aip->goal_signature = parent_objp->signature; aip->mode = AIM_BAY_DEPART; - shipp->flags |= SF_DEPART_DOCKBAY; + shipp->flags.set(Ship::Ship_Flags::Depart_dockbay); return 0; } @@ -12975,7 +12982,7 @@ void ai_bay_depart() mprintf(("Aborting bay departure!\n")); aip->mode = AIM_NONE; - Ships[Pl_objp->instance].flags &= ~SF_DEPART_DOCKBAY; + Ships[Pl_objp->instance].flags.remove(Ship::Ship_Flags::Depart_dockbay); return; } @@ -13048,7 +13055,7 @@ void ai_execute_behavior(ai_info *aip) ship_info *sip = &Ship_info[shipp->ship_info_index]; if (strnicmp(shipp->ship_name, INSTRUCTOR_SHIP_NAME, strlen(INSTRUCTOR_SHIP_NAME))) { - if (sip->flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP)) { + if (sip->is_big_or_huge()) { aip->mode = AIM_NONE; } else { ai_chase_circle(Pl_objp); @@ -13130,7 +13137,7 @@ void ai_execute_behavior(ai_info *aip) break; } - if ( !(ship_get_SIF(aip->shipnum) & SIF_NOT_FLYABLE) ) { + if ( Ship_info[Ships[aip->shipnum].ship_info_index].is_flyable() ) { maybe_evade_dumbfire_weapon(aip); } } @@ -13197,7 +13204,7 @@ int maybe_request_support(object *objp) sip = &Ship_info[shipp->ship_info_index]; // Only fighters and bombers request support. - if (!(sip->flags & (SIF_FIGHTER | SIF_BOMBER))) + if (!(sip->is_fighter_bomber())) return 0; // A ship that is currently awaiting does not need support! @@ -13225,7 +13232,7 @@ int maybe_request_support(object *objp) // Set desire based on hull strength. // Note: We no longer repair hull, so this would cause repeated repair requests. // Added back in upon mission flag condition - Goober5000 - if (The_mission.flags & MISSION_FLAG_SUPPORT_REPAIRS_HULL) + if (The_mission.flags[Mission::Mission_Flags::Support_repairs_hull]) { desire += 6 - (int) (get_hull_pct(objp) * 6.0f); } @@ -13248,7 +13255,7 @@ int maybe_request_support(object *objp) } // Set desire based on ballistic weapons - Goober5000 - if (sip->flags & SIF_BALLISTIC_PRIMARIES) + if (sip->flags[Ship::Info_Flags::Ballistic_primaries]) { for (i = 0; i < swp->num_primary_banks; i++) { @@ -13332,11 +13339,11 @@ void ai_maybe_depart(object *objp) // If a support ship with no goals and low hull, depart. Be sure that there are no pending goals // in the support ships ai_goal array. Just process this ships goals. - if (sip->flags & SIF_SUPPORT) { + if (sip->flags[Ship::Info_Flags::Support]) { if ( timestamp_elapsed(aip->warp_out_timestamp) ) { ai_process_mission_orders( OBJ_INDEX(objp), aip ); if ( (aip->support_ship_objnum == -1) && (get_hull_pct(objp) < 0.25f) ) { - if (!(shipp->flags & SF_DEPARTING)) { + if (!shipp->is_departing()) { if (!mission_do_departure(objp)) { // if departure failed, try again at a later point // (timestamp taken from ai_do_objects_repairing_stuff) @@ -13351,8 +13358,8 @@ void ai_maybe_depart(object *objp) if (Iff_info[shipp->team].flags & IFFF_SUPPORT_ALLOWED) return; - if (!(shipp->flags & SF_DEPARTING)) { - if (sip->flags & (SIF_FIGHTER | SIF_BOMBER)) { + if (!shipp->is_departing()) { + if (sip->is_fighter_bomber()) { if (aip->warp_out_timestamp == 0) { //if (ship_get_subsystem_strength(shipp, SUBSYSTEM_WEAPONS) == 0.0f) { // aip->warp_out_timestamp = timestamp(((myrand() % 10) + 10) * 1000); @@ -13373,7 +13380,7 @@ void ai_warp_out(object *objp) ai_info *aip = &Ai_info[shipp->ai_index]; // if dying, don't warp out. - if (shipp->flags & SF_DYING) + if (shipp->flags[Ship::Ship_Flags::Dying]) return; // Goober5000 - check for engine or navigation failure @@ -13381,7 +13388,7 @@ void ai_warp_out(object *objp) { // you shouldn't hit this... if you do, then I need to add a check for it // in whatever function initiates a warpout - Assert (!(shipp->flags2 & SF2_NO_SUBSPACE_DRIVE)); + Assert (!(shipp->flags[Ship::Ship_Flags::No_subspace_drive])); // flag us as trying to warp so that this function keeps getting called // (in other words, if we can't warp just yet, we want to warp at the first @@ -13412,7 +13419,7 @@ void ai_warp_out(object *objp) aip->submode_start_time = Missiontime; // maybe recalculate collision pairs. - if ((objp->flags & OF_COLLIDES) && (ship_get_warpout_speed(objp) > ship_get_max_speed(shipp))) { + if ((objp->flags[Object::Object_Flags::Collides]) && (ship_get_warpout_speed(objp) > ship_get_max_speed(shipp))) { // recalculate collision pairs OBJ_RECALC_PAIRS(objp); } @@ -13432,7 +13439,7 @@ void ai_warp_out(object *objp) goal_speed = ship_get_warpout_speed(objp); // HUGE ships go immediately to AIS_WARP_4 - if (Ship_info[shipp->ship_info_index].flags & SIF_HUGE_SHIP) { + if (Ship_info[shipp->ship_info_index].is_huge_ship()) { aip->submode = AIS_WARP_4; aip->submode_start_time = Missiontime; break; @@ -13548,7 +13555,7 @@ int ai_find_shockwave_ship(object *objp, ai_info *aip) Assert((A->instance >= 0) && (A->instance < MAX_SHIPS)); shipp = &Ships[A->instance]; // Only look at objects in the process of dying. - if (shipp->flags & SF_DYING) { + if (shipp->flags[Ship::Ship_Flags::Dying]) { float damage = ship_get_exp_damage(objp); if (damage >= EVADE_SHOCKWAVE_DAMAGE_THRESHOLD) { // Only evade quite large blasts @@ -13716,7 +13723,7 @@ int ai_avoid_shockwave(object *objp, ai_info *aip) // BIG|HUGE do not respond to shockwaves // Goober5000 - let's treat shockwave response the same way whether from weapon or ship - if (!(Ship_info[Ships[objp->instance].ship_info_index].flags & (SIF_AVOID_SHOCKWAVE))) { + if (!Ship_info[Ships[objp->instance].ship_info_index].avoids_shockwaves()) { // don't come here again aip->ai_flags &= ~AIF_AVOID_SHOCKWAVE; return 0; @@ -13780,7 +13787,7 @@ int ai_await_repair_frame(object *objp, ai_info *aip) aip->ai_flags &= ~AIF_FORMATION_OBJECT; // Prevents endless rotation. - if (!(sip->flags & SIF_SUPPORT)) + if (!(sip->flags[Ship::Info_Flags::Support])) return 0; vec3d goal_point; @@ -13827,7 +13834,7 @@ void ai_maybe_self_destruct(object *objp, ai_info *aip) // Note: Don't blow up if not in a wing for two reasons: One, won't affect re-emergence of waves and (1) disable the Dragon // mission would be broken. // Also, don't blow up the ship if it has a ship flag preventing this - Goober5000 - if ((Ship_info[shipp->ship_info_index].flags & SIF_SMALL_SHIP) && (shipp->wingnum >= 0) && !(shipp->flags2 & SF2_NO_DISABLED_SELF_DESTRUCT)) { + if ((Ship_info[shipp->ship_info_index].is_small_ship()) && (shipp->wingnum >= 0) && !(shipp->flags[Ship::Ship_Flags::No_disabled_self_destruct])) { if ((ship_get_subsystem_strength(shipp, SUBSYSTEM_ENGINE) <= 0.0f) || (ship_get_subsystem_strength(shipp, SUBSYSTEM_WEAPONS) <= 0.0f)) { if (aip->self_destruct_timestamp < 0) @@ -13864,7 +13871,7 @@ int ai_need_new_target(object *pl_objp, int target_objnum) } if ( objp->type == OBJ_SHIP ) { - if ( Ships[objp->instance].flags & SF_DYING ) { + if ( Ships[objp->instance].flags[Ship::Ship_Flags::Dying] ) { return 1; } else if (Ships[objp->instance].team == Ships[pl_objp->instance].team) { // Goober5000 - targeting the same team is allowed if pl_objp is going bonkers @@ -14033,7 +14040,7 @@ void ai_frame(int objnum) ai_manage_shield(Pl_objp, aip); if ( maybe_request_support(Pl_objp) ) { - if ( Ships[Pl_objp->instance].flags & SF_FROM_PLAYER_WING ) { + if ( Ships[Pl_objp->instance].flags[Ship::Ship_Flags::From_player_wing] ) { ship_maybe_tell_about_rearm(shipp); } } @@ -14072,7 +14079,7 @@ void ai_frame(int objnum) // set base stealth info each frame aip->ai_flags &= ~AIF_STEALTH_PURSUIT; if (En_objp && En_objp->type == OBJ_SHIP) { - if (Ships[En_objp->instance].flags2 & SF2_STEALTH) { + if (Ships[En_objp->instance].flags[Ship::Ship_Flags::Stealth]) { int stealth_state = ai_is_stealth_visible(Pl_objp, En_objp); float dist = vm_vec_dist_quick(&En_objp->pos, &Pl_objp->pos); @@ -14233,11 +14240,11 @@ int Last_ai_obj = -1; void ai_process( object * obj, int ai_index, float frametime ) { - if (obj->flags & OF_SHOULD_BE_DEAD) + if (obj->flags[Object::Object_Flags::Should_be_dead]) return; // return if ship is dead, unless it's a big ship...then its turrets still fire, like I was quoted in a magazine. -- MK, 5/15/98. - if ((Ships[obj->instance].flags & SF_DYING ) && !(Ship_info[Ships[obj->instance].ship_info_index].flags & (SIF_HUGE_SHIP | SIF_BIG_SHIP))){ + if ((Ships[obj->instance].flags[Ship::Ship_Flags::Dying] ) && !(Ship_info[Ships[obj->instance].ship_info_index].is_big_or_huge())) { return; } @@ -14565,42 +14572,42 @@ void init_aip_from_class_and_profile(ai_info *aip, ai_class *aicp, ai_profile_t void ai_do_default_behavior(object *obj) { - Assert(obj != NULL); - Assert(obj->instance != -1); - Assert(Ships[obj->instance].ai_index != -1); + Assert(obj != NULL); + Assert(obj->instance != -1); + Assert(Ships[obj->instance].ai_index != -1); - ai_info *aip = &Ai_info[Ships[obj->instance].ai_index]; - int si_flags = Ship_info[Ships[obj->instance].ship_info_index].flags; + ai_info *aip = &Ai_info[Ships[obj->instance].ai_index]; + ship_info* sip = &Ship_info[Ships[obj->instance].ship_info_index]; - // default behavior in most cases (especially if we're docked) is to just stay put - aip->mode = AIM_NONE; - aip->submode_start_time = Missiontime; - aip->active_goal = AI_GOAL_NONE; + // default behavior in most cases (especially if we're docked) is to just stay put + aip->mode = AIM_NONE; + aip->submode_start_time = Missiontime; + aip->active_goal = AI_GOAL_NONE; - // if we're not docked, we may modify the behavior a bit - if (!object_is_docked(obj)) - { - // fighters automatically chase things - if (!is_instructor(obj) && (si_flags & (SIF_FIGHTER | SIF_BOMBER))) - { - int enemy_objnum = find_enemy(OBJ_INDEX(obj), 1000.0f, The_mission.ai_profile->max_attackers[Game_skill_level]); - set_target_objnum(aip, enemy_objnum); - aip->mode = AIM_CHASE; - aip->submode = SM_ATTACK; - } - // support ships automatically keep a safe distance - else if (si_flags & SIF_SUPPORT) - { - aip->mode = AIM_SAFETY; - aip->submode = AISS_1; - aip->ai_flags &= ~(AIF_REPAIRING); - } - // sentry guns... do their thing - else if (si_flags & SIF_SENTRYGUN) - { - aip->mode = AIM_SENTRYGUN; - } - } + // if we're not docked, we may modify the behavior a bit + if (!object_is_docked(obj)) + { + // fighters automatically chase things + if (!is_instructor(obj) && (sip->is_fighter_bomber())) + { + int enemy_objnum = find_enemy(OBJ_INDEX(obj), 1000.0f, The_mission.ai_profile->max_attackers[Game_skill_level]); + set_target_objnum(aip, enemy_objnum); + aip->mode = AIM_CHASE; + aip->submode = SM_ATTACK; + } + // support ships automatically keep a safe distance + else if (sip->flags[Ship::Info_Flags::Support]) + { + aip->mode = AIM_SAFETY; + aip->submode = AISS_1; + aip->ai_flags &= ~AIF_REPAIRING; + } + // sentry guns... do their thing + else if (sip->flags[Ship::Info_Flags::Sentrygun]) + { + aip->mode = AIM_SENTRYGUN; + } + } } #define FRIENDLY_DAMAGE_THRESHOLD 50.0f // Display a message at this threshold. Note, this gets scaled by Skill_level @@ -14617,23 +14624,23 @@ void process_friendly_hit_message( int message, object *objp ) } // don't send this message if a player ship was hit. - if ( objp->flags & OF_PLAYER_SHIP ){ + if ( objp->flags[Object::Object_Flags::Player_ship] ){ return; } // check if objp is a fighter/bomber -- if not, then find a new ship to send the message index = objp->instance; - if ( !(Ship_info[Ships[objp->instance].ship_info_index].flags & (SIF_FIGHTER|SIF_BOMBER)) ){ + if ( !Ship_info[Ships[objp->instance].ship_info_index].is_fighter_bomber() ){ index = -1; } // If the ship can't send messages pick someone else - if (Ships[objp->instance].flags2 & SF2_NO_BUILTIN_MESSAGES) { + if (Ships[objp->instance].flags[Ship::Ship_Flags::No_builtin_messages]) { index = -1; } // Karajorma - pick a random ship to send Command messages if command is silenced. - if (index < 0 && (The_mission.flags & MISSION_FLAG_NO_BUILTIN_COMMAND) ) { + if (index < 0 && (The_mission.flags[Mission::Mission_Flags::No_builtin_command]) ) { index = ship_get_random_player_wing_ship( SHIP_GET_UNSILENCED ); } @@ -14658,7 +14665,7 @@ void maybe_process_friendly_hit(object *objp_hitter, object *objp_hit, object *o } // ditto if mission says no traitors allowed - if (The_mission.flags & MISSION_FLAG_NO_TRAITOR) { + if (The_mission.flags[Mission::Mission_Flags::No_traitor]) { return; } @@ -14783,7 +14790,7 @@ void maybe_process_friendly_hit(object *objp_hitter, object *objp_hit, object *o */ void maybe_set_dynamic_chase(ai_info *aip, int hitter_objnum) { - Assert(Ship_info[Ships[aip->shipnum].ship_info_index].flags & (SIF_FIGHTER | SIF_BOMBER)); + Assert(Ship_info[Ships[aip->shipnum].ship_info_index].is_fighter_bomber()); // limit the number of ships attacking hitter_objnum (for now, only if hitter_objnum is player) if ( ai_maybe_limit_attackers(hitter_objnum) == 1 ) { @@ -14907,7 +14914,7 @@ void ai_update_lethality(object *pship_obj, object *other_obj, float damage) weapon_info *wif = &Weapon_info[wp->weapon_info_index]; // if parent is BIG|HUGE, don't count beam - if (Ship_info[Ships[Objects[parent].instance].ship_info_index].flags & (SIF_BIG_SHIP|SIF_HUGE_SHIP)) { + if ( Ship_info[Ships[Objects[parent].instance].ship_info_index].is_big_or_huge() ) { if (wif->wi_flags & WIF_BEAM) { dont_count = TRUE; } @@ -14943,7 +14950,7 @@ void ai_ship_hit(object *objp_ship, object *hit_objp, vec3d *hitpos, int shield_ shipp = &Ships[objp_ship->instance]; aip = &Ai_info[shipp->ai_index]; - if (objp_ship->flags & OF_PLAYER_SHIP) { + if (objp_ship->flags[Object::Object_Flags::Player_ship]) { //SUSHI: So that hitting a player ship actually resets the last_hit_target_time counter for whoever hit the player. //This is all copypasted from code below // Added OBJ_BEAM for traitor detection - FUBAR @@ -14971,9 +14978,9 @@ void ai_ship_hit(object *objp_ship, object *hit_objp, vec3d *hitpos, int shield_ if (hit_objp->type == OBJ_SHIP) { // If the object that this ship collided with is a big ship - if (Ship_info[Ships[hit_objp->instance].ship_info_index].flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP)) { + if (Ship_info[Ships[hit_objp->instance].ship_info_index].is_big_or_huge()) { // And the current object is _not_ a big ship - if (!(Ship_info[Ships[objp_ship->instance].ship_info_index].flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP))) { + if (!Ship_info[Ships[objp_ship->instance].ship_info_index].is_big_or_huge()) { // Recover from hitting a big ship. Note, if two big ships collide, they just pound away at each other. Oh well. Recovery looks dumb and it's very late. big_ship_collide_recover_start(objp_ship, hit_objp, hitpos, hit_normal); } @@ -14998,9 +15005,9 @@ void ai_ship_hit(object *objp_ship, object *hit_objp, vec3d *hitpos, int shield_ return; // Hit by a protected ship, don't attack it. - if (objp_hitter->flags & OF_PROTECTED) { + if (objp_hitter->flags[Object::Object_Flags::Protected]) { if (!object_is_docked(objp_ship)) { - if ((Ship_info[shipp->ship_info_index].flags & (SIF_FIGHTER | SIF_BOMBER)) && (aip->target_objnum == -1)) { + if ((Ship_info[shipp->ship_info_index].is_fighter_bomber()) && (aip->target_objnum == -1)) { if (aip->mode == AIM_CHASE) { if (aip->submode != SM_EVADE_WEAPON) { aip->mode = AIM_CHASE; @@ -15036,11 +15043,11 @@ void ai_ship_hit(object *objp_ship, object *hit_objp, vec3d *hitpos, int shield_ // traitor detection was the only reason for OBJ_BEAM to make it this far. // so bail if it wasn't fired by a player. - if ((hit_objp->type == OBJ_BEAM) && (!(objp_hitter->flags & OF_PLAYER_SHIP))) + if ((hit_objp->type == OBJ_BEAM) && (!(objp_hitter->flags[Object::Object_Flags::Player_ship]))) return; // Collided into a protected ship, don't attack it. - if (hit_objp->flags & OF_PROTECTED) + if (hit_objp->flags[Object::Object_Flags::Protected]) return; Assert(objp_hitter != NULL); @@ -15060,7 +15067,7 @@ void ai_ship_hit(object *objp_ship, object *hit_objp, vec3d *hitpos, int shield_ if (get_hull_pct(objp_ship) < 0.3f) { // Note, only abort if hull below a certain level. aip->next_rearm_request_timestamp = timestamp(NEXT_REARM_TIMESTAMP/2); // Might request again after 15 seconds. - if ( !(objp_ship->flags & OF_PLAYER_SHIP) ) // mwa -- don't abort rearm for a player + if ( !(objp_ship->flags[Object::Object_Flags::Player_ship]) ) // mwa -- don't abort rearm for a player ai_abort_rearm_request(objp_ship); } } @@ -15089,12 +15096,12 @@ void ai_ship_hit(object *objp_ship, object *hit_objp, vec3d *hitpos, int shield_ maybe_update_guard_object(objp_ship, objp_hitter); // Big ships don't go any further. - if (!(Ship_info[shipp->ship_info_index].flags & SIF_SMALL_SHIP)) + if (!(Ship_info[shipp->ship_info_index].is_small_ship())) return; // If the hitter object is the ignore object, don't attack it. ship_info *sip = &Ship_info[shipp->ship_info_index]; - if ((is_ignore_object(aip, OBJ_INDEX(objp_hitter))) && (sip->flags & (SIF_BOMBER | SIF_FIGHTER))) { + if (is_ignore_object(aip, OBJ_INDEX(objp_hitter)) && (sip->is_fighter_bomber())) { if (!object_is_docked(objp_ship)) { if (aip->mode == AIM_NONE) { aip->mode = AIM_CHASE; // This will cause the ship to move, if not attack. @@ -15146,7 +15153,7 @@ void ai_ship_hit(object *objp_ship, object *hit_objp, vec3d *hitpos, int shield_ } break; case AIM_WAYPOINTS: - if (sip->flags & (SIF_FIGHTER | SIF_BOMBER)) + if (sip->is_fighter_bomber()) break; else return; @@ -15174,7 +15181,7 @@ void ai_ship_hit(object *objp_ship, object *hit_objp, vec3d *hitpos, int shield_ // If the hitter is not on the same team as the hittee, do some stuff. if (iff_x_attacks_y(shipp->team, Ships[objp_hitter->instance].team)) { - if ((hitter_objnum != aip->target_objnum) && (sip->flags & (SIF_FIGHTER | SIF_BOMBER))) { + if ((hitter_objnum != aip->target_objnum) && (sip->is_fighter_bomber())) { maybe_set_dynamic_chase(aip, hitter_objnum); maybe_afterburner_after_ship_hit(objp_ship, aip, &Objects[hitter_objnum]); } else { @@ -15185,7 +15192,7 @@ void ai_ship_hit(object *objp_ship, object *hit_objp, vec3d *hitpos, int shield_ case SM_GET_AWAY: break; default: - if (sip->flags & (SIF_FIGHTER | SIF_BOMBER)) { + if (sip->is_fighter_bomber()) { maybe_set_dynamic_chase(aip, hitter_objnum); } maybe_afterburner_after_ship_hit(objp_ship, aip, &Objects[hitter_objnum]); @@ -15210,7 +15217,7 @@ void ai_ship_hit(object *objp_ship, object *hit_objp, vec3d *hitpos, int shield_ aip->submode_start_time = Missiontime; break; default: - if (sip->flags & (SIF_BOMBER | SIF_FIGHTER)) { + if (sip->is_fighter_bomber()) { maybe_set_dynamic_chase(aip, hitter_objnum); maybe_afterburner_after_ship_hit(objp_ship, aip, &Objects[hitter_objnum]); } @@ -15219,7 +15226,7 @@ void ai_ship_hit(object *objp_ship, object *hit_objp, vec3d *hitpos, int shield_ } } else { // AL 3-15-98: Prevent escape pods from entering chase mode - if ( (sip->flags & (SIF_BOMBER | SIF_FIGHTER)) ) { + if (sip->is_fighter_bomber()) { maybe_set_dynamic_chase(aip, hitter_objnum); } maybe_afterburner_after_ship_hit(objp_ship, aip, &Objects[hitter_objnum]); @@ -15435,7 +15442,7 @@ void ai_add_rearm_goal( object *requester_objp, object *support_objp ) // if the requester is a player object, issue the order as the squadmate messaging code does. Doing so // ensures that the player get a higher priority! requester_aip->ai_flags |= AIF_AWAITING_REPAIR; // Tell that I'm awaiting repair. - if ( requester_objp->flags & OF_PLAYER_SHIP ) + if ( requester_objp->flags[Object::Object_Flags::Player_ship] ) ai_add_ship_goal_player( AIG_TYPE_PLAYER_SHIP, AI_GOAL_REARM_REPAIR, -1, requester_shipp->ship_name, support_aip ); else ai_add_goal_ship_internal( support_aip, AI_GOAL_REARM_REPAIR, requester_shipp->ship_name, -1, -1 ); @@ -15577,7 +15584,7 @@ void cheat_fire_synaptic(object *objp, ship *shipp, ai_info *aip) void maybe_cheat_fire_synaptic(object *objp, ai_info *aip) { // Only do in subspace missions. - if (!(The_mission.flags & MISSION_FLAG_SUBSPACE)) + if (!(The_mission.flags[Mission::Mission_Flags::Subspace])) return; // Only do in sm3-09a diff --git a/code/ai/aigoals.cpp b/code/ai/aigoals.cpp index 8d5eb25b0e..b31f2dfe7a 100644 --- a/code/ai/aigoals.cpp +++ b/code/ai/aigoals.cpp @@ -584,10 +584,10 @@ void ai_goal_fixup_dockpoints(ai_info *aip, ai_goal *aigp) // look for docking points of the appriopriate type. Use cargo docks for cargo ships. /* - if (Ship_info[Ships[shipnum].ship_info_index].flags & SIF_CARGO) { + if (Ship_info[Ships[shipnum].ship_info_index].flags[Ship::Info_Flags::Cargo]) { docker_index = ai_goal_find_dockpoint(aip->shipnum, DOCK_TYPE_CARGO); dockee_index = ai_goal_find_dockpoint(shipnum, DOCK_TYPE_CARGO); - } else if (Ship_info[Ships[aip->shipnum].ship_info_index].flags & SIF_SUPPORT) { + } else if (Ship_info[Ships[aip->shipnum].ship_info_index].flags[Ship::Info_Flags::Support]) { docker_index = ai_goal_find_dockpoint(aip->shipnum, DOCK_TYPE_REARM); dockee_index = ai_goal_find_dockpoint(shipnum, DOCK_TYPE_REARM); } @@ -1387,7 +1387,7 @@ int ai_mission_goal_achievable( int objnum, ai_goal *aigp ) ship *shipp = &Ships[objp->instance]; // always valid if has subspace drive - if (!(shipp->flags2 & SF2_NO_SUBSPACE_DRIVE)) + if (!(shipp->flags[Ship::Ship_Flags::No_subspace_drive])) return AI_GOAL_ACHIEVABLE; // if no subspace drive, only valid if our mothership is present @@ -1661,7 +1661,7 @@ int ai_mission_goal_achievable( int objnum, ai_goal *aigp ) } // if ship is disabled, don't know if it can dock or not - if ( Ships[objp->instance].flags & SF_DISABLED ) + if ( Ships[objp->instance].flags[Ship::Ship_Flags::Disabled] ) return AI_GOAL_NOT_KNOWN; // we must also determine if we're prevented from docking for any reason @@ -1807,7 +1807,7 @@ int ai_mission_goal_achievable( int objnum, ai_goal *aigp ) // if the destination ship is dying or departing (but not completed yet), the mark goal as // not achievable. - if ( Ships[sindex].flags & (SF_DYING | SF_DEPARTING) ) + if ( Ships[sindex].is_dying_or_departing()) return AI_GOAL_NOT_ACHIEVABLE; // if the destination object is no longer awaiting repair, then remove the item @@ -2042,7 +2042,7 @@ void ai_process_mission_orders( int objnum, ai_info *aip ) // Goober5000 - we may want to use AI for the player // AL 3-7-98: If this is a player ship, and the goal is not a formation goal, then do a quick out - if ( !(Player_use_ai) && (objp->flags & OF_PLAYER_SHIP) && (current_goal->ai_mode != AI_GOAL_FORM_ON_WING) ) + if ( !(Player_use_ai) && (objp->flags[Object::Object_Flags::Player_ship]) && (current_goal->ai_mode != AI_GOAL_FORM_ON_WING) ) { return; } @@ -2199,11 +2199,11 @@ void ai_process_mission_orders( int objnum, ai_info *aip ) if (aip->target_objnum != -1) { // Only protect if _not_ a capital ship. We don't want the Lucifer accidentally getting protected. if (Ship_types[Ship_info[Ships[shipnum].ship_info_index].class_type].ai_bools & STI_AI_PROTECTED_ON_CRIPPLE) - Objects[aip->target_objnum].flags |= OF_PROTECTED; + Objects[aip->target_objnum].flags.set(Object::Object_Flags::Protected); } } else // Just in case this ship had been protected, unprotect it. if (aip->target_objnum != -1) - Objects[aip->target_objnum].flags &= ~OF_PROTECTED; + Objects[aip->target_objnum].flags.remove(Object::Object_Flags::Protected); break; } diff --git a/code/ai/aiturret.cpp b/code/ai/aiturret.cpp index eed672a3fc..e0a5f6a63c 100644 --- a/code/ai/aiturret.cpp +++ b/code/ai/aiturret.cpp @@ -522,17 +522,17 @@ int valid_turret_enemy(object *objp, object *turret_parent) sip = &Ship_info[shipp->ship_info_index]; // don't fire at ships with protected bit set!!! - if ( objp->flags & OF_PROTECTED ) { + if ( objp->flags[Object::Object_Flags::Protected] ) { return 0; } // don't shoot at ships without collision check - if (!(objp->flags & OF_COLLIDES)) { + if (!(objp->flags[Object::Object_Flags::Collides])) { return 0; } // don't shoot at arriving ships - if (shipp->flags & SF_ARRIVING) { + if (shipp->is_arriving()) { return 0; } @@ -604,48 +604,48 @@ void evaluate_obj_as_target(object *objp, eval_enemy_obj_struct *eeo) } // check if protected - if (objp->flags & OF_PROTECTED) { + if (objp->flags[Object::Object_Flags::Protected]) { return; } // check if beam protected if (eeo->eeo_flags & EEOF_BEAM) { - if (objp->flags & OF_BEAM_PROTECTED) { + if (objp->flags[Object::Object_Flags::Beam_protected]) { return; } } // check if flak protected if (eeo->eeo_flags & EEOF_FLAK) { - if (objp->flags & OF_FLAK_PROTECTED) { + if (objp->flags[Object::Object_Flags::Flak_protected]) { return; } } // check if laser protected if (eeo->eeo_flags & EEOF_LASER) { - if (objp->flags & OF_LASER_PROTECTED) { + if (objp->flags[Object::Object_Flags::Laser_protected]) { return; } } // check if missile protected if (eeo->eeo_flags & EEOF_MISSILE) { - if (objp->flags & OF_MISSILE_PROTECTED) { + if (objp->flags[Object::Object_Flags::Missile_protected]) { return; } } // don't shoot at small ships if we shouldn't if (eeo->eeo_flags & EEOF_BIG_ONLY) { - if (!(Ship_info[shipp->ship_info_index].flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP))) { + if (!(Ship_info[shipp->ship_info_index].is_big_or_huge())) { return; } } // don't shoot at big ships if we shouldn't if (eeo->eeo_flags & EEOF_SMALL_ONLY) { - if ((Ship_info[shipp->ship_info_index].flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP))) { + if ((Ship_info[shipp->ship_info_index].is_big_or_huge())) { return; } } @@ -753,7 +753,7 @@ void evaluate_obj_as_target(object *objp, eval_enemy_obj_struct *eeo) } // end weapon section // maybe recalculate dist for big or huge ship -// if (shipp && (Ship_info[shipp->ship_info_index].flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP))) { +// if (shipp && (Ship_info[shipp->ship_info_index].is_big_or_huge())) { // fvi_ray_boundingbox(min, max, start, direction, hit); // dist = vm_vec_dist_quick(hit, tvec); // } @@ -770,11 +770,11 @@ void evaluate_obj_as_target(object *objp, eval_enemy_obj_struct *eeo) // return if we're over the cap // int max_turrets = 3 + Game_skill_level * Game_skill_level; int max_turrets = The_mission.ai_profile->max_turret_ownage_target[Game_skill_level]; - if (objp->flags & OF_PLAYER_SHIP) { + if (objp->flags[Object::Object_Flags::Player_ship]) { max_turrets = The_mission.ai_profile->max_turret_ownage_player[Game_skill_level]; } // Apply the per-turret limit for small targets, if there is one and this is a small target - if (ss->turret_max_target_ownage != -1 && (Ship_info[shipp->ship_info_index].flags & (SIF_SMALL_SHIP))) { + if (ss->turret_max_target_ownage != -1 && (Ship_info[shipp->ship_info_index].is_small_ship())) { max_turrets = MIN(max_turrets, ss->system_info->turret_max_target_ownage); } if (num_att_turrets > max_turrets) { @@ -783,7 +783,7 @@ void evaluate_obj_as_target(object *objp, eval_enemy_obj_struct *eeo) // modify distance based on lethality of objp to my ship float active_lethality = aip->lethality; - if (objp->flags & OF_PLAYER_SHIP) { + if (objp->flags[Object::Object_Flags::Player_ship]) { active_lethality += Player_lethality_bump[Game_skill_level]; } @@ -843,12 +843,12 @@ int is_target_beam_valid(ship_weapon *swp, object *objp) { // check if turret has beam weapon if (all_turret_weapons_have_flags(swp, WIF_BEAM)) { - if (objp->flags & OF_BEAM_PROTECTED) { + if (objp->flags[Object::Object_Flags::Beam_protected]) { return 0; } if (all_turret_weapons_have_flags(swp, WIF_HUGE)) { - if (objp->type == OBJ_SHIP && !(Ship_info[Ships[objp->instance].ship_info_index].flags & (SIF_BIG_SHIP|SIF_HUGE_SHIP)) ) { + if (objp->type == OBJ_SHIP && !(Ship_info[Ships[objp->instance].ship_info_index].is_big_or_huge()) ) { return 0; } } @@ -1015,14 +1015,14 @@ int get_nearest_turret_objnum(int turret_parent_objnum, ship_subsys *turret_subs } } - if( ( ( tt->sif_flags != 0 ) || ( tt->sif2_flags != 0 ) ) && (ptr->type == OBJ_SHIP) ) { - if( ( (Ship_info[Ships[ptr->instance].ship_info_index].flags & tt->sif_flags) == tt->sif_flags) - && ( (Ship_info[Ships[ptr->instance].ship_info_index].flags2 & tt->sif2_flags) == tt->sif2_flags) ) { - found_something = true; + if( ( tt->sif_flags.any_set() && (ptr->type == OBJ_SHIP) ) ) { + if( (Ship_info[Ships[ptr->instance].ship_info_index].flags & tt->sif_flags) == tt->sif_flags) + { + found_something = true; } } - if((tt->obj_flags != 0) && !((ptr->flags & tt->obj_flags) == tt->obj_flags)) { + if ((tt->obj_flags.any_set()) && !((ptr->flags & tt->obj_flags) == tt->obj_flags)) { found_something = true; } @@ -1209,7 +1209,7 @@ int find_turret_enemy(ship_subsys *turret_subsys, int objnum, vec3d *tpos, vec3d if (Objects[target_objnum].signature == aip->target_signature) { if (iff_matches_mask(Ships[Objects[target_objnum].instance].team, enemy_team_mask)) { - if ( !(Objects[target_objnum].flags & OF_PROTECTED) ) { // check this flag as well + if ( !(Objects[target_objnum].flags[Object::Object_Flags::Protected]) ) { // check this flag as well // nprintf(("AI", "Frame %i: Object %i resuming goal of object %i\n", AI_FrameCount, objnum, target_objnum)); return target_objnum; } @@ -1224,8 +1224,8 @@ int find_turret_enemy(ship_subsys *turret_subsys, int objnum, vec3d *tpos, vec3d if ((frand() < 0.8f) && (aip->target_objnum != -1) && Use_parent_target) { //check if aip->target_objnum is valid target - int target_flags = Objects[aip->target_objnum].flags; - if ( target_flags & OF_PROTECTED ) { + auto target_flags = Objects[aip->target_objnum].flags; + if ( target_flags[Object::Object_Flags::Protected] ) { // AL 2-27-98: why is a protected ship being targeted? set_target_objnum(aip, -1); return -1; @@ -1234,15 +1234,15 @@ int find_turret_enemy(ship_subsys *turret_subsys, int objnum, vec3d *tpos, vec3d // maybe use ship target_objnum if valid for turret // check for beam weapon and beam protected, etc. bool skip = false; - if ( (target_flags & OF_BEAM_PROTECTED) && beam_flag ) skip = true; - else if ( (target_flags & OF_FLAK_PROTECTED) && flak_flag ) skip = true; - else if ( (target_flags & OF_LASER_PROTECTED) && laser_flag ) skip = true; - else if ( (target_flags & OF_MISSILE_PROTECTED) && missile_flag ) skip = true; + if ( target_flags[Object::Object_Flags::Beam_protected] && beam_flag ) skip = true; + else if ( target_flags[Object::Object_Flags::Flak_protected] && flak_flag ) skip = true; + else if ( target_flags[Object::Object_Flags::Laser_protected] && laser_flag ) skip = true; + else if ( target_flags[Object::Object_Flags::Missile_protected] && missile_flag) skip = true; if (!skip) { if ( Objects[aip->target_objnum].type == OBJ_SHIP ) { // check for huge weapon and huge ship - if ( !big_only_flag || (Ship_info[Ships[Objects[aip->target_objnum].instance].ship_info_index].flags & (SIF_BIG_SHIP|SIF_HUGE_SHIP)) ) { + if ( !big_only_flag || (Ship_info[Ships[Objects[aip->target_objnum].instance].ship_info_index].is_big_or_huge()) ) { // check for tagged only and tagged ship if ( tagged_only_flag && ship_is_tagged(&Objects[aip->target_objnum]) ) { // select new target if aip->target_objnum is out of field of view @@ -1272,12 +1272,12 @@ int find_turret_enemy(ship_subsys *turret_subsys, int objnum, vec3d *tpos, vec3d enemy_objnum = get_nearest_turret_objnum(objnum, turret_subsys, enemy_team_mask, tpos, tvec, current_enemy, big_only_flag, small_only_flag, tagged_only_flag, beam_flag, flak_flag, laser_flag, missile_flag); if ( enemy_objnum >= 0 ) { - Assert( !((Objects[enemy_objnum].flags & OF_BEAM_PROTECTED) && beam_flag) ); - Assert( !((Objects[enemy_objnum].flags & OF_FLAK_PROTECTED) && flak_flag) ); - Assert( !((Objects[enemy_objnum].flags & OF_LASER_PROTECTED) && laser_flag) ); - Assert( !((Objects[enemy_objnum].flags & OF_MISSILE_PROTECTED) && missile_flag) ); + Assert( !((Objects[enemy_objnum].flags[Object::Object_Flags::Beam_protected]) && beam_flag) ); + Assert( !((Objects[enemy_objnum].flags[Object::Object_Flags::Flak_protected]) && flak_flag) ); + Assert( !((Objects[enemy_objnum].flags[Object::Object_Flags::Laser_protected]) && laser_flag) ); + Assert( !((Objects[enemy_objnum].flags[Object::Object_Flags::Missile_protected]) && missile_flag) ); - if ( Objects[enemy_objnum].flags & OF_PROTECTED ) { + if ( Objects[enemy_objnum].flags[Object::Object_Flags::Protected] ) { Int3(); enemy_objnum = aip->target_objnum; } @@ -1364,7 +1364,7 @@ void ship_get_global_turret_gun_info(object *objp, ship_subsys *ssp, vec3d *gpos vm_vec_unrotate(&enemy_point, &ssp->targeted_subsys->system_info->pnt, &Objects[ssp->turret_enemy_objnum].orient); vm_vec_add2(&enemy_point, &ssp->last_aim_enemy_pos); } else { - if ((lep->type == OBJ_SHIP) && (Ship_info[Ships[lep->instance].ship_info_index].flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP))) { + if ((lep->type == OBJ_SHIP) && (Ship_info[Ships[lep->instance].ship_info_index].is_big_or_huge())) { vm_vec_unrotate(&turret_norm, &tp->turret_norm, &objp->orient); ai_big_pick_attack_point_turret(lep, ssp, &tmp_pos, &turret_norm, &enemy_point, MIN(wip->max_speed * wip->lifetime, wip->weapon_range), tp->turret_fov); } @@ -1462,7 +1462,7 @@ int aifft_rotate_turret(ship *shipp, int parent_objnum, ship_subsys *ss, object vm_vec_add2(&enemy_point, &ss->last_aim_enemy_pos); } } else { - if ((lep->type == OBJ_SHIP) && (Ship_info[Ships[lep->instance].ship_info_index].flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP))) { + if ((lep->type == OBJ_SHIP) && (Ship_info[Ships[lep->instance].ship_info_index].is_big_or_huge())) { ai_big_pick_attack_point_turret(lep, ss, &gun_pos, &gun_vec, &enemy_point, tp->turret_fov, MIN(wip->max_speed * wip->lifetime, wip->weapon_range)); } else { enemy_point = ss->last_aim_enemy_pos; @@ -1616,7 +1616,7 @@ ship_subsys *aifft_find_turret_subsys(object *objp, ship_subsys *ssp, object *en vm_vec_add2(&abs_gun_pos, &objp->pos); // Only pick a turret to attack on large ships. - if (!(esip->flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP))) + if (!esip->is_big_or_huge()) return best_subsysp; // Make sure big or huge ship *actually* has subsystems (ie, knossos) @@ -1868,22 +1868,22 @@ bool turret_fire_weapon(int weapon_num, ship_subsys *turret, int parent_objnum, object *tobjp = &Objects[turret->turret_enemy_objnum]; // should not get this far. check if ship is protected from beam and weapon is type beam - if ( (wip->wi_flags & WIF_BEAM) && (tobjp->flags & OF_BEAM_PROTECTED) ) { + if ( (wip->wi_flags & WIF_BEAM) && (tobjp->flags[Object::Object_Flags::Beam_protected]) ) { Int3(); return 0; } // should not get this far. check if ship is protected from flak and weapon is type flak - else if ( (wip->wi_flags & WIF_FLAK) && (tobjp->flags & OF_FLAK_PROTECTED) ) { + else if ( (wip->wi_flags & WIF_FLAK) && (tobjp->flags[Object::Object_Flags::Flak_protected]) ) { Int3(); return 0; } // should not get this far. check if ship is protected from laser and weapon is type laser - else if ( (wip->subtype == WP_LASER) && (tobjp->flags & OF_LASER_PROTECTED) ) { + else if ( (wip->subtype == WP_LASER) && (tobjp->flags[Object::Object_Flags::Laser_protected]) ) { Int3(); return 0; } // should not get this far. check if ship is protected from missile and weapon is type missile - else if ( (wip->subtype == WP_MISSILE) && (tobjp->flags & OF_MISSILE_PROTECTED) ) { + else if ( (wip->subtype == WP_MISSILE) && (tobjp->flags[Object::Object_Flags::Missile_protected]) ) { Int3(); return 0; } @@ -2442,13 +2442,13 @@ void ai_fire_from_turret(ship *shipp, ship_subsys *ss, int parent_objnum) if ( lep->type != OBJ_SHIP ) { continue; } - if ( !(Ship_info[Ships[lep->instance].ship_info_index].flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP)) ) { + if ( !(Ship_info[Ships[lep->instance].ship_info_index].is_big_or_huge()) ) { continue; } } if ( wip->wi_flags2 & WIF2_SMALL_ONLY ) { - if ( (lep->type == OBJ_SHIP) && (Ship_info[Ships[lep->instance].ship_info_index].flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP)) ) { + if ( (lep->type == OBJ_SHIP) && (Ship_info[Ships[lep->instance].ship_info_index].is_big_or_huge()) ) { continue; } } @@ -2457,32 +2457,32 @@ void ai_fire_from_turret(ship *shipp, ship_subsys *ss, int parent_objnum) if (lep->type == OBJ_SHIP) { // Check if we're targeting a protected ship - if (lep->flags & OF_PROTECTED) { + if (lep->flags[Object::Object_Flags::Protected]) { ss->turret_enemy_objnum = -1; ss->turret_time_enemy_in_range = 0.0f; continue; } // Check if we're targeting a beam protected ship with a beam weapon - if ( (lep->flags & OF_BEAM_PROTECTED) && (wip->wi_flags & WIF_BEAM) ) { + if ( (lep->flags[Object::Object_Flags::Beam_protected]) && (wip->wi_flags & WIF_BEAM) ) { ss->turret_enemy_objnum = -1; ss->turret_time_enemy_in_range = 0.0f; continue; } // Check if we're targeting a flak protected ship with a flak weapon - else if ( (lep->flags & OF_FLAK_PROTECTED) && (wip->wi_flags & WIF_FLAK) ) { + else if ( (lep->flags[Object::Object_Flags::Flak_protected]) && (wip->wi_flags & WIF_FLAK) ) { ss->turret_enemy_objnum = -1; ss->turret_time_enemy_in_range = 0.0f; continue; } // Check if we're targeting a laser protected ship with a laser weapon - else if ( (lep->flags & OF_LASER_PROTECTED) && (wip->subtype == WP_LASER) ) { + else if ( (lep->flags[Object::Object_Flags::Laser_protected]) && (wip->subtype == WP_LASER) ) { ss->turret_enemy_objnum = -1; ss->turret_time_enemy_in_range = 0.0f; continue; } // Check if we're targeting a missile protected ship with a missile weapon - else if ( (lep->flags & OF_MISSILE_PROTECTED) && (wip->subtype == WP_MISSILE) ) { + else if ( (lep->flags[Object::Object_Flags::Missile_protected]) && (wip->subtype == WP_MISSILE) ) { ss->turret_enemy_objnum = -1; ss->turret_time_enemy_in_range = 0.0f; continue; @@ -2563,7 +2563,7 @@ void ai_fire_from_turret(ship *shipp, ship_subsys *ss, int parent_objnum) return; } - if (Objects[ss->turret_enemy_objnum].flags & OF_PROTECTED) { + if (Objects[ss->turret_enemy_objnum].flags[Object::Object_Flags::Protected]) { // This can happen if the enemy was selected before it became protected. ss->turret_enemy_objnum = -1; return; diff --git a/code/asteroid/asteroid.cpp b/code/asteroid/asteroid.cpp index cb63475032..824a2e395e 100644 --- a/code/asteroid/asteroid.cpp +++ b/code/asteroid/asteroid.cpp @@ -320,8 +320,12 @@ object *asteroid_create(asteroid_field *asfieldp, int asteroid_type, int asteroi } vm_angles_2_matrix(&orient, &angs); - - objnum = obj_create( OBJ_ASTEROID, -1, n, &orient, &pos, radius, OF_RENDERS | OF_PHYSICS | OF_COLLIDES); + flagset asteroid_default_flagset; + asteroid_default_flagset += Object::Object_Flags::Renders; + asteroid_default_flagset += Object::Object_Flags::Physics; + asteroid_default_flagset += Object::Object_Flags::Collides; + + objnum = obj_create(OBJ_ASTEROID, -1, n, &orient, &pos, radius, asteroid_default_flagset); if ( (objnum == -1) || (objnum >= MAX_OBJECTS) ) { mprintf(("Couldn't create asteroid -- out of object slots\n")); @@ -804,7 +808,7 @@ void maybe_throw_asteroid(int count) // if asteroid is inside inner bound, kill it if (asteroid_in_inner_bound(&Asteroid_field, &objp->pos, 0.0f)) { - objp->flags |= OF_SHOULD_BE_DEAD; + objp->flags.set(Object::Object_Flags::Should_be_dead); } else { Asteroids[objp->instance].target_objnum = so->objnum; @@ -870,7 +874,7 @@ void asteroid_maybe_reposition(object *objp, asteroid_field *asfieldp) if ( (dot < 0.7f) || (dist > asfieldp->bound_rad) ) { if (Num_asteroids > MAX_ASTEROIDS-10) { - objp->flags |= OF_SHOULD_BE_DEAD; + objp->flags.set(Object::Object_Flags::Should_be_dead); } else { // check to ensure player won't see asteroid appear either asteroid_wrap_pos(objp, asfieldp); @@ -1336,7 +1340,7 @@ void asteroid_do_area_effect(object *asteroid_objp) ship_objp = &Objects[so->objnum]; // don't blast navbuoys - if ( ship_get_SIF(ship_objp->instance) & SIF_NAVBUOY ) { + if ( ship_get_SIF(ship_objp->instance)[Ship::Info_Flags::Navbuoy] ) { continue; } @@ -1363,7 +1367,7 @@ void asteroid_hit( object * pasteroid_obj, object * other_obj, vec3d * hitpos, f asp = &Asteroids[pasteroid_obj->instance]; - if (pasteroid_obj->flags & OF_SHOULD_BE_DEAD){ + if (pasteroid_obj->flags[Object::Object_Flags::Should_be_dead]){ return; } @@ -1419,7 +1423,7 @@ void asteroid_level_close() if (Asteroids[i].flags & AF_USED) { Asteroids[i].flags &= ~AF_USED; Assert(Asteroids[i].objnum >=0 && Asteroids[i].objnum < MAX_OBJECTS); - Objects[Asteroids[i].objnum].flags |= OF_SHOULD_BE_DEAD; + Objects[Asteroids[i].objnum].flags.set(Object::Object_Flags::Should_be_dead); } } @@ -1484,7 +1488,7 @@ void asteroid_maybe_break_up(object *pasteroid_obj) Script_system.SetHookObject("Self", pasteroid_obj); if(!Script_system.IsConditionOverride(CHA_DEATH, pasteroid_obj)) { - pasteroid_obj->flags |= OF_SHOULD_BE_DEAD; + pasteroid_obj->flags.set(Object::Object_Flags::Should_be_dead); // multiplayer clients won't go through the following code. asteroid_sub_create will send // a create packet to the client in the above named function @@ -1669,11 +1673,11 @@ int asteroid_will_collide(object *pasteroid_obj, object *escort_objp) */ int asteroid_valid_ship_to_warn_collide(ship *shipp) { - if ( !(Ship_info[shipp->ship_info_index].flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP)) ) { + if ( !(Ship_info[shipp->ship_info_index].is_big_or_huge()) ) { return 0; } - if ( shipp->flags & (SF_DYING|SF_DEPART_WARP) ) { + if ( shipp->flags[Ship::Ship_Flags::Dying] || shipp->flags[Ship::Ship_Flags::Depart_warp] ) { return 0; } @@ -2095,7 +2099,7 @@ int set_asteroid_throw_objnum() ship_objp = &Objects[so->objnum]; float radius = ship_objp->radius*2.0f; - if (Ship_info[Ships[ship_objp->instance].ship_info_index].flags & (SIF_HUGE_SHIP | SIF_BIG_SHIP)) { + if (Ship_info[Ships[ship_objp->instance].ship_info_index].is_big_or_huge()) { if (ship_objp->pos.xyz.x + radius > Asteroid_field.min_bound.xyz.x) if (ship_objp->pos.xyz.y + radius > Asteroid_field.min_bound.xyz.y) if (ship_objp->pos.xyz.z + radius > Asteroid_field.min_bound.xyz.z) diff --git a/code/autopilot/autopilot.cpp b/code/autopilot/autopilot.cpp index 1ece2640f1..49bdf1185e 100644 --- a/code/autopilot/autopilot.cpp +++ b/code/autopilot/autopilot.cpp @@ -178,7 +178,7 @@ bool CanAutopilot(vec3d targetPos, bool send_msg) object *other_objp = &Objects[so->objnum]; // attacks player? if (iff_x_attacks_y(obj_team(other_objp), obj_team(Player_obj)) - && !(Ship_info[Ships[other_objp->instance].ship_info_index].flags & SIF_CARGO)) // ignore cargo + && !(Ship_info[Ships[other_objp->instance].ship_info_index].flags[Ship::Info_Flags::Cargo])) // ignore cargo { // Cannot autopilot if enemy within AutopilotMinEnemyDistance meters if (vm_vec_dist_quick(&targetPos, &other_objp->pos) < AutopilotMinEnemyDistance) { @@ -233,7 +233,7 @@ bool StartAutopilot() // If the support ship is doing something then tell the user such. for ( object *objp = GET_FIRST(&obj_used_list); objp !=END_OF_LIST(&obj_used_list); objp = GET_NEXT(objp) ) { - if ((objp->type == OBJ_SHIP) && !(objp->flags & OF_SHOULD_BE_DEAD)) + if ((objp->type == OBJ_SHIP) && !(objp->flags[Object::Object_Flags::Should_be_dead])) { Assertion((objp->instance >= 0) && (objp->instance < MAX_SHIPS), "objp does not have a valid pointer to a ship. Pointer is %d, which is smaller than 0 or bigger than %d", @@ -248,11 +248,11 @@ bool StartAutopilot() shipp->ship_name, shipp->ship_info_index, static_cast(Ship_info.size())); ship_info *sip = &Ship_info[shipp->ship_info_index]; - if ( !(sip->flags & SIF_SUPPORT) ) + if ( !(sip->flags[Ship::Info_Flags::Support]) ) continue; // don't deal with dying or departing support ships - if ( shipp->flags & (SF_DYING | SF_DEPARTING) ) + if ( shipp->is_dying_or_departing() ) continue; Assert(shipp->ai_index != -1); @@ -286,7 +286,7 @@ bool StartAutopilot() Autopilot_flight_leader = Player_obj; } - if (The_mission.flags & MISSION_FLAG_USE_AP_CINEMATICS) + if (The_mission.flags[Mission::Mission_Flags::Use_ap_cinematics]) LockAPConv = timestamp(); // lock convergence instantly else LockAPConv = timestamp(3000); // 3 seconds before we lock convergence @@ -325,7 +325,7 @@ bool StartAutopilot() // instantly turn player toward tpos - if (The_mission.flags & MISSION_FLAG_USE_AP_CINEMATICS) + if (The_mission.flags[Mission::Mission_Flags::Use_ap_cinematics]) { vm_vec_sub(&norm1, Navs[CurrentNav].GetPosition(), &Player_obj->pos); vm_vector_2_matrix(&Player_obj->orient, &norm1, NULL, NULL); @@ -334,7 +334,7 @@ bool StartAutopilot() for (i = 0; i < MAX_SHIPS; i++) { if (Ships[i].objnum != -1 && - (Ships[i].flags2 & SF2_NAVPOINT_CARRY || + (Ships[i].flags[Ship::Ship_Flags::Navpoint_carry] || (Ships[i].wingnum != -1 && Wings[Ships[i].wingnum].flags & WF_NAV_CARRY) ) ) @@ -345,7 +345,7 @@ bool StartAutopilot() } // damp speed_cap to 90% of actual -- to make sure ships stay in formation - if (The_mission.flags & MISSION_FLAG_USE_AP_CINEMATICS) + if (The_mission.flags[Mission::Mission_Flags::Use_ap_cinematics]) speed_cap = 0.90f * speed_cap; if ( speed_cap < 1.0f ) { @@ -367,28 +367,27 @@ bool StartAutopilot() for (i = 0; i < MAX_SHIPS; i++) { if (Ships[i].objnum != -1 && - (Ships[i].flags2 & SF2_NAVPOINT_CARRY || + (Ships[i].flags[Ship::Ship_Flags::Navpoint_carry] || (Ships[i].wingnum != -1 && Wings[Ships[i].wingnum].flags & WF_NAV_CARRY) ) ) { // do we have capital ships in the area? - if (Ship_info[Ships[i].ship_info_index].flags - & ( SIF_CRUISER | SIF_CAPITAL | SIF_SUPERCAP | SIF_CORVETTE | SIF_AWACS | SIF_GAS_MINER | SIF_FREIGHTER | SIF_TRANSPORT)) + if (Ship_info[Ships[i].ship_info_index].is_big_ship() || Ship_info[Ships[i].ship_info_index].flags[Ship::Info_Flags::Capital] || Ship_info[Ships[i].ship_info_index].flags[Ship::Info_Flags::Supercap]) { capshipPresent = true; capIndexes.push_back(i); // ok.. what size class - if (Ship_info[Ships[i].ship_info_index].flags & (SIF_CAPITAL | SIF_SUPERCAP)) - { - capship_counts[0]++; - if (capship_spreads[0] < Objects[Ships[i].objnum].radius) - capship_spreads[0] = Objects[Ships[i].objnum].radius; - } - else if (Ship_info[Ships[i].ship_info_index].flags & (SIF_CORVETTE)) - { + if (Ship_info[Ships[i].ship_info_index].flags[Ship::Info_Flags::Capital] || Ship_info[Ships[i].ship_info_index].flags[Ship::Info_Flags::Supercap]) + { + capship_counts[0]++; + if (capship_spreads[0] < Objects[Ships[i].objnum].radius) + capship_spreads[0] = Objects[Ships[i].objnum].radius; + } + else if (Ship_info[Ships[i].ship_info_index].flags[Ship::Info_Flags::Corvette]) + { capship_counts[1]++; if (capship_spreads[1] < Objects[Ships[i].objnum].radius) capship_spreads[1] = Objects[Ships[i].objnum].radius; @@ -416,14 +415,14 @@ bool StartAutopilot() radius = Objects[Ships[i].objnum].radius; } - if (The_mission.flags & MISSION_FLAG_USE_AP_CINEMATICS) + if (The_mission.flags[Mission::Mission_Flags::Use_ap_cinematics]) {// instantly turn the ship to match the direction player is looking //vm_vec_sub(&norm1, Navs[CurrentNav].GetPosition(), &Player_obj->pos); vm_vector_2_matrix(&Objects[Ships[i].objnum].orient, &norm1, NULL, NULL); } // snap wings into formation - if (The_mission.flags & MISSION_FLAG_USE_AP_CINEMATICS && // only if using cinematics + if (The_mission.flags[Mission::Mission_Flags::Use_ap_cinematics] && // only if using cinematics (Ships[i].wingnum != -1 && Wings[Ships[i].wingnum].flags & WF_NAV_CARRY) // only if in a wing && Autopilot_flight_leader != &Objects[Ships[i].objnum]) //only if not flight leader's object { @@ -470,8 +469,10 @@ bool StartAutopilot() } } // lock primary and secondary weapons - if ( LockWeaponsDuringAutopilot ) - Ships[i].flags2 |= (SF2_PRIMARIES_LOCKED | SF2_SECONDARIES_LOCKED); + if (LockWeaponsDuringAutopilot) { + Ships[i].flags.set(Ship::Ship_Flags::Primaries_locked); + Ships[i].flags.set(Ship::Ship_Flags::Secondaries_locked); + } // clear the ship goals and cap the waypoint speed ai_clear_ship_goals(&Ai_info[Ships[i].ai_index]); @@ -479,7 +480,7 @@ bool StartAutopilot() // if they're not part of a wing set their goal - if (Ships[i].wingnum == -1 || The_mission.flags & MISSION_FLAG_USE_AP_CINEMATICS) + if (Ships[i].wingnum == -1 || The_mission.flags[Mission::Mission_Flags::Use_ap_cinematics]) { if (Navs[CurrentNav].flags & NP_WAYPOINT) { @@ -496,7 +497,7 @@ bool StartAutopilot() } // assign wing goals - if (!(The_mission.flags & MISSION_FLAG_USE_AP_CINEMATICS)) + if (!(The_mission.flags[Mission::Mission_Flags::Use_ap_cinematics])) { for (i = 0; i < MAX_WINGS; i++) { @@ -538,7 +539,7 @@ bool StartAutopilot() { if (Ships[i].objnum != -1) { - if (Ships[i].flags2 & SF2_NAVPOINT_CARRY || + if (Ships[i].flags[Ship::Ship_Flags::Navpoint_carry] || (Ships[i].wingnum != -1 && Wings[Ships[i].wingnum].flags & WF_NAV_CARRY)) for (j = 0; j < MAX_AI_GOALS; j++) { @@ -557,7 +558,7 @@ bool StartAutopilot() start_dist = DistanceTo(CurrentNav); // ----------------------------- setup cinematic ----------------------------- - if (The_mission.flags & MISSION_FLAG_USE_AP_CINEMATICS) + if (The_mission.flags[Mission::Mission_Flags::Use_ap_cinematics]) { if (capshipPresent) { @@ -570,7 +571,7 @@ bool StartAutopilot() vm_vec_add(&front, &Autopilot_flight_leader->orient.vec.fvec, &zero); vm_vec_add(&up, &Autopilot_flight_leader->orient.vec.uvec, &zero); vm_vec_add(&offset, &zero, &zero); - if (Ship_info[Ships[*idx].ship_info_index].flags & (SIF_CAPITAL | SIF_SUPERCAP)) + if (Ship_info[Ships[*idx].ship_info_index].flags[Ship::Info_Flags::Capital] || Ship_info[Ships[*idx].ship_info_index].flags[Ship::Info_Flags::Supercap]) { //0 - below - three lines of position @@ -604,7 +605,7 @@ bool StartAutopilot() capship_placed[0]++; } - else if (Ship_info[Ships[*idx].ship_info_index].flags & SIF_CORVETTE) + else if (Ship_info[Ships[*idx].ship_info_index].flags[Ship::Info_Flags::Corvette]) { //1 above - 3 lines of position // front/back to zero @@ -913,14 +914,16 @@ void EndAutoPilot() { if (Ships[i].objnum != -1 && ( - Ships[i].flags2 & SF2_NAVPOINT_CARRY || + Ships[i].flags[Ship::Ship_Flags::Navpoint_carry] || (Ships[i].wingnum != -1 && Wings[Ships[i].wingnum].flags & WF_NAV_CARRY ) ) ) { //unlock their weaponry - if ( LockWeaponsDuringAutopilot ) - Ships[i].flags2 &= ~(SF2_PRIMARIES_LOCKED | SF2_SECONDARIES_LOCKED); + if (LockWeaponsDuringAutopilot) { + Ships[i].flags.remove(Ship::Ship_Flags::Primaries_locked); + Ships[i].flags.remove(Ship::Ship_Flags::Secondaries_locked); + } Ai_info[Ships[i].ai_index].waypoint_speed_cap = -1; // uncap their speed Ai_info[Ships[i].ai_index].mode = AIM_NONE; // make AI re-evaluate current ship mode @@ -955,7 +958,7 @@ void EndAutoPilot() } // un-assign wing goals - if ( !(The_mission.flags & MISSION_FLAG_USE_AP_CINEMATICS) ) + if ( !(The_mission.flags[Mission::Mission_Flags::Use_ap_cinematics]) ) { for (i = 0; i < MAX_WINGS; i++) { @@ -1041,7 +1044,7 @@ void nav_warp(bool prewarp=false) for (int i = 0; i < MAX_SHIPS; i++) { if (Ships[i].objnum != -1 - && (Ships[i].flags2 & SF2_NAVPOINT_CARRY + && (Ships[i].flags[Ship::Ship_Flags::Navpoint_carry] || (Ships[i].wingnum != -1 && Wings[Ships[i].wingnum].flags & WF_NAV_CARRY))) { vm_vec_add(&Objects[Ships[i].objnum].pos, &Objects[Ships[i].objnum].pos, &targetPos); @@ -1069,7 +1072,7 @@ void NavSystem_Do() { if (AutoPilotEngaged) { - if (The_mission.flags & MISSION_FLAG_USE_AP_CINEMATICS) + if (The_mission.flags[Mission::Mission_Flags::Use_ap_cinematics]) { camera *cam = nav_get_set_camera(); if (CinematicStarted) @@ -1148,7 +1151,7 @@ void NavSystem_Do() } // ramp time compression - only if not using cinematics - if (AutoPilotEngaged && !(The_mission.flags & MISSION_FLAG_USE_AP_CINEMATICS)) + if (AutoPilotEngaged && !(The_mission.flags[Mission::Mission_Flags::Use_ap_cinematics])) { int dstfrm_start = start_dist - DistanceTo(CurrentNav); @@ -1193,14 +1196,14 @@ void NavSystem_Do() */ for (int i = 0; i < MAX_SHIPS; i++) { - if (Ships[i].objnum != -1 && Ships[i].flags2 & SF2_NAVPOINT_NEEDSLINK) + if (Ships[i].objnum != -1 && Ships[i].flags[Ship::Ship_Flags::Navpoint_needslink]) { object *other_objp = &Objects[Ships[i].objnum]; if (vm_vec_dist_quick(&Player_obj->pos, &other_objp->pos) < (NavLinkDistance + other_objp->radius)) { - Ships[i].flags2 &= ~SF2_NAVPOINT_NEEDSLINK; - Ships[i].flags2 |= SF2_NAVPOINT_CARRY; + Ships[i].flags.remove(Ship::Ship_Flags::Navpoint_needslink); + Ships[i].flags.set(Ship::Ship_Flags::Navpoint_carry); send_autopilot_msgID(NP_MSG_MISC_LINKED); } diff --git a/code/cmeasure/cmeasure.cpp b/code/cmeasure/cmeasure.cpp index 83e9d2627b..274bfe9194 100644 --- a/code/cmeasure/cmeasure.cpp +++ b/code/cmeasure/cmeasure.cpp @@ -93,7 +93,7 @@ void cmeasure_maybe_alert_success(object *objp) if ( objp->parent == OBJ_INDEX(Player_obj) ) { hud_start_text_flash(XSTR("Evaded", 1430), 800); snd_play(&Snds[ship_get_sound(Player_obj, SND_MISSILE_EVADED_POPUP)]); - } else if ( Objects[objp->parent].flags & OF_PLAYER_SHIP ) { + } else if ( Objects[objp->parent].flags[Object::Object_Flags::Player_ship] ) { send_countermeasure_success_packet( objp->parent ); } } diff --git a/code/debris/debris.cpp b/code/debris/debris.cpp index e6d8b19355..ee947949cd 100644 --- a/code/debris/debris.cpp +++ b/code/debris/debris.cpp @@ -78,7 +78,7 @@ static void debris_start_death_roll(object *debris_obj, debris *debris_p) } } - debris_obj->flags |= OF_SHOULD_BE_DEAD; + debris_obj->flags.set(Object::Object_Flags::Should_be_dead); } /** @@ -201,7 +201,7 @@ void maybe_delete_debris(debris *db) db->next_distance_check = timestamp(DEBRIS_DISTANCE_CHECK_TIME); } else { for ( objp = GET_FIRST(&obj_used_list); objp !=END_OF_LIST(&obj_used_list); objp = GET_NEXT(objp) ) { - if (objp->flags & OF_PLAYER_SHIP) { + if (objp->flags[Object::Object_Flags::Player_ship]) { if (vm_vec_dist_quick(&objp->pos, &Objects[db->objnum].pos) < MAX_DEBRIS_DIST) { db->next_distance_check = timestamp(DEBRIS_DISTANCE_CHECK_TIME); return; @@ -378,7 +378,7 @@ int debris_find_oldest() oldest_time = 0x7fffffff; for ( db = GET_FIRST(&Hull_debris_list); db != END_OF_LIST(&Hull_debris_list); db = GET_NEXT(db) ) { - if ( (db->time_started < oldest_time) && !(Objects[db->objnum].flags & OF_SHOULD_BE_DEAD) ) { + if ( (db->time_started < oldest_time) && !(Objects[db->objnum].flags[Object::Object_Flags::Should_be_dead]) ) { oldest_index = DEBRIS_INDEX(db); oldest_time = db->time_started; } @@ -418,7 +418,7 @@ object *debris_create(object *source_obj, int model_num, int submodel_num, vec3d Assert( source_obj->instance >= 0 && source_obj->instance < MAX_SHIPS ); shipp = &Ships[source_obj->instance]; sip = &Ship_info[shipp->ship_info_index]; - vaporize = (shipp->flags &SF_VAPORIZE); + vaporize = (shipp->flags[Ship::Ship_Flags::Vaporize]); if ( !hull_flag ) { // Make vaporize debris seen from farther away @@ -548,10 +548,12 @@ object *debris_create(object *source_obj, int model_num, int submodel_num, vec3d if ( pos == NULL ) pos = &source_obj->pos; - uint flags = OF_RENDERS | OF_PHYSICS; - if ( hull_flag ) - flags |= OF_COLLIDES; - objnum = obj_create( OBJ_DEBRIS, parent_objnum, n, &source_obj->orient, pos, radius, flags ); + flagset default_flags; + default_flags.set(Object::Object_Flags::Renders); + default_flags.set(Object::Object_Flags::Physics); + default_flags.set(Object::Object_Flags::Collides, hull_flag != 0); + + objnum = obj_create( OBJ_DEBRIS, parent_objnum, n, &source_obj->orient, pos, radius, default_flags); if ( objnum == -1 ) { mprintf(("Couldn't create debris object -- out of object slots\n")); return NULL; diff --git a/code/fireball/fireballs.cpp b/code/fireball/fireballs.cpp index d21f7a826d..d318acb19a 100644 --- a/code/fireball/fireballs.cpp +++ b/code/fireball/fireballs.cpp @@ -76,10 +76,10 @@ void fireball_play_warphole_open_sound(int ship_class, fireball *fb) if(fb->warp_open_sound_index > -1) { sound_index = fb->warp_open_sound_index; } else if ((ship_class >= 0) && (ship_class < static_cast(Ship_info.size()))) { - if ( Ship_info[ship_class].flags & SIF_HUGE_SHIP ) { + if ( Ship_info[ship_class].is_huge_ship() ) { sound_index = SND_CAPITAL_WARP_IN; fb->flags |= FBF_WARP_CAPITAL_SIZE; - } else if ( Ship_info[ship_class].flags & SIF_BIG_SHIP ) { + } else if ( Ship_info[ship_class].is_big_ship() ) { range_multiplier = 6.0f; fb->flags |= FBF_WARP_CRUISER_SIZE; } @@ -462,7 +462,7 @@ int fireball_is_perishable(object * obj) return 1; if ( !(fb->fireball_render_type == FIREBALL_WARP_EFFECT) ) { - if ( !(obj->flags & OF_WAS_RENDERED)) { + if ( !(obj->flags[Object::Object_Flags::Was_rendered])) { return 1; } } @@ -564,7 +564,7 @@ void fireball_process_post(object * obj, float frame_time) fb->time_elapsed += frame_time; if ( fb->time_elapsed > fb->total_time ) { - obj->flags |= OF_SHOULD_BE_DEAD; + obj->flags.set(Object::Object_Flags::Should_be_dead); } fireball_maybe_play_warp_close_sound(fb); @@ -767,7 +767,9 @@ int fireball_create( vec3d * pos, int fireball_type, int render_type, int parent } } - objnum = obj_create(OBJ_FIREBALL, parent_obj, n, &orient, pos, size, OF_RENDERS); + flagset default_flags; + default_flags.set(Object::Object_Flags::Renders); + objnum = obj_create(OBJ_FIREBALL, parent_obj, n, &orient, pos, size, default_flags); if (objnum < 0) { Int3(); // Get John, we ran out of objects for fireballs @@ -825,7 +827,7 @@ int fireball_create( vec3d * pos, int fireball_type, int render_type, int parent if ( velocity ) { // Make the explosion move at a constant velocity. - obj->flags |= OF_PHYSICS; + obj->flags.set(Object::Object_Flags::Physics); obj->phys_info.mass = 1.0f; obj->phys_info.side_slip_time_const = 0.0f; obj->phys_info.rotdamp = 0.0f; diff --git a/code/fireball/warpineffect.cpp b/code/fireball/warpineffect.cpp index 73025f317b..d78802b8e4 100644 --- a/code/fireball/warpineffect.cpp +++ b/code/fireball/warpineffect.cpp @@ -114,7 +114,7 @@ void warpin_render(object *obj, matrix *orient, vec3d *pos, int texture_bitmap_n g3_transfer_vertex( &verts[4], &vecs[4] ); - float alpha = (The_mission.flags & MISSION_FLAG_FULLNEB) ? (1.0f - neb2_get_fog_intensity(obj)) : 1.0f; + float alpha = (The_mission.flags[Mission::Mission_Flags::Fullneb]) ? (1.0f - neb2_get_fog_intensity(obj)) : 1.0f; gr_set_bitmap( Warp_glow_bitmap, GR_ALPHABLEND_FILTER, GR_BITBLT_MODE_NORMAL, alpha ); g3_draw_bitmap( &verts[4], 0, r, TMAP_FLAG_TEXTURED | TMAP_HTL_3D_UNLIT ); @@ -252,7 +252,7 @@ void warpin_queue_render(draw_list *scene, object *obj, matrix *orient, vec3d *p g3_transfer_vertex( &verts[4], &vecs[4] ); - float alpha = (The_mission.flags & MISSION_FLAG_FULLNEB) ? (1.0f - neb2_get_fog_intensity(obj)) : 1.0f; + float alpha = (The_mission.flags[Mission::Mission_Flags::Fullneb]) ? (1.0f - neb2_get_fog_intensity(obj)) : 1.0f; batch_add_bitmap(Warp_glow_bitmap, TMAP_FLAG_TEXTURED | TMAP_HTL_3D_UNLIT | TMAP_FLAG_EMISSIVE , &verts[4], 0, r, alpha); } diff --git a/code/gamesnd/eventmusic.cpp b/code/gamesnd/eventmusic.cpp index a3c1c57cad..e6914a28d4 100644 --- a/code/gamesnd/eventmusic.cpp +++ b/code/gamesnd/eventmusic.cpp @@ -1619,11 +1619,11 @@ int hostile_ships_present() continue; // check if ship is threatening - if ( (shipp->flags & (SF_DISABLED|SF_DYING|SF_DEPARTING)) || (ship_subsys_disrupted(shipp, SUBSYSTEM_ENGINE)) ) + if ( shipp->is_dying_or_departing() || shipp->flags[Ship::Ship_Flags::Disabled] || (ship_subsys_disrupted(shipp, SUBSYSTEM_ENGINE)) ) continue; // check if ship is flyable - if ( Ship_info[shipp->ship_info_index].flags & SIF_NOT_FLYABLE ) { + if (!Ship_info[shipp->ship_info_index].is_flyable()) { continue; } @@ -1652,7 +1652,7 @@ int hostile_ships_to_arrive() for (p_objp = GET_FIRST(&Ship_arrival_list); p_objp != END_OF_LIST(&Ship_arrival_list); p_objp = GET_NEXT(p_objp)) { // check if ship can arrive - if (p_objp->flags & P_SF_CANNOT_ARRIVE) + if (p_objp->flags[Mission::Parse_Object_Flags::SF_Cannot_arrive]) continue; // check if ship is enemy ship (we attack it) diff --git a/code/globalincs/flagset.h b/code/globalincs/flagset.h new file mode 100644 index 0000000000..53f9e165ef --- /dev/null +++ b/code/globalincs/flagset.h @@ -0,0 +1,117 @@ +#ifndef _FLAGSET_ +#define _FLAGSET_ + +#include +#include + +template (T::NUM_VALUES)> +class flagset { +protected: + std::bitset values; +public: + + bool operator [] (const T idx) const { return values[(static_cast < size_t >(idx))]; }; + + flagset operator & (const flagset& other) const { + flagset result; + result.values = this->values & other.values; + return result; + } + + flagset operator + (const T flag) const { + flagset result = *this; + result.set(flag); + return result; + } + + flagset& operator += (const T flag) { + this->set(flag); + return *this; + } + + flagset operator - (const T flag) const { + flagset result = *this; + result.remove(flag); + return result; + } + + flagset& operator -= (const T flag) { + this->remove(flag); + return *this; + } + + flagset operator | (const flagset& other) const { + flagset result; + result.values = this->values | other.values; + return result; + } + + flagset& operator |= (const flagset& other) { + this->values |= other.values; + + return *this; + } + + void operator |= (const T flag) { + set(flag); + } + + bool operator == (const flagset& other) const { return this->values == other.values; } + bool operator != (const flagset& other) const { return this->values != other.values; } + + void reset() { values.reset(); } + + flagset& set(T idx, bool value = true) { + Assert(idx >= T::NUM_VALUES); + + values.set(static_cast < size_t >(idx), value); + return *this; + } + + template + flagset& set_multiple(TIter begin, TIter end) { + auto current = begin; + while (current != end) + { + set(*current, true); + + current = std::next(current); + } + + return *this; + } + + flagset& remove(T idx) { + return set(idx, false); + } + + template + flagset& remove_multiple(TIter begin, TIter end) { + auto current = begin; + while (current != end) + { + set(*current, false); + + current = std::next(current); + } + + return *this; + } + + flagset& toggle(T idx) { + values[static_cast < size_t >(idx)] = !values[static_cast < size_t >(idx)]; + + return *this; + } + + bool any_set() const { return values.any(); } + bool none_set() const { return values.none(); } + + void from_long(std::uint64_t num) { values = num; } + std::uint64_t to_long() const { return values.to_ulong(); } +}; + +#define FLAG_LIST(Type) enum class Type : size_t + + +#endif diff --git a/code/globalincs/pstypes.h b/code/globalincs/pstypes.h index 3c0edc4a72..07cbcbbe7f 100644 --- a/code/globalincs/pstypes.h +++ b/code/globalincs/pstypes.h @@ -18,6 +18,7 @@ #include #include #include +#include #include "globalincs/toolchain.h" #if defined( __x86_64__ ) || defined( _WIN64 ) @@ -222,6 +223,14 @@ typedef struct flag_def_list { ubyte var; } def_list; +template +struct flag_def_list_new { + const char* name; // The parseable representation of this flag + T def; // The flag definition for this flag + bool in_use; // Whether or not this flag is currently in use or obsolete + bool is_special; // Whether this flag requires special processing. See parse_string_flag_list for details +}; + // weapon count list (mainly for pilot files) typedef struct wep_t { int index; @@ -342,11 +351,13 @@ const size_t INVALID_SIZE = static_cast(-1); #undef USE_INLINE_ASM #define INTEL_INT(x) SDL_Swap32(x) +#define INTEL_LONG(x) SDL_Swap64(x) #define INTEL_SHORT(x) SDL_Swap16(x) #define INTEL_FLOAT(x) SDL_SwapFloat((*x)) #else // Little Endian - #define INTEL_INT(x) x +#define INTEL_LONG(x) x #define INTEL_SHORT(x) x #define INTEL_FLOAT(x) (*x) #endif // BYTE_ORDER diff --git a/code/hud/hud.cpp b/code/hud/hud.cpp index 0b4e88ec28..533cf7753f 100644 --- a/code/hud/hud.cpp +++ b/code/hud/hud.cpp @@ -1088,7 +1088,7 @@ bool HudGauge::canRender() } if (gauge_config == HUD_ETS_GAUGE) { - if (Ships[Player_obj->instance].flags2 & SF2_NO_ETS) { + if (Ships[Player_obj->instance].flags[Ship::Ship_Flags::No_ets]) { return false; } } @@ -1192,7 +1192,7 @@ void HUD_init() HUD_draw = 1; HUD_disable_except_messages = 0; - if(The_mission.flags & MISSION_FLAG_FULLNEB){ + if(The_mission.flags[Mission::Mission_Flags::Fullneb]){ HUD_contrast = 1; } @@ -1384,7 +1384,7 @@ void hud_update_frame(float frametime) if (Player_ai->target_objnum == -1){ retarget = 1; } else if (Objects[Player_ai->target_objnum].type == OBJ_SHIP) { - if (Ships[Objects[Player_ai->target_objnum].instance].flags & SF_DYING){ + if (Ships[Objects[Player_ai->target_objnum].instance].flags[Ship::Ship_Flags::Dying]){ if (timestamp_elapsed(Ships[Objects[Player_ai->target_objnum].instance].final_death_time)) { retarget = 1; } @@ -1395,8 +1395,8 @@ void hud_update_frame(float frametime) // only do this is not retargeting if ((!retarget) && (Player_ai->target_objnum != -1)) { if (Objects[Player_ai->target_objnum].type == OBJ_SHIP) { - if ( !(Ships[Objects[Player_ai->target_objnum].instance].flags & SF_DYING) ) { - if ( Ship_info[Ships[Objects[Player_ai->target_objnum].instance].ship_info_index].flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP) ) { + if ( !(Ships[Objects[Player_ai->target_objnum].instance].flags[Ship::Ship_Flags::Dying]) ) { + if ( Ship_info[Ships[Objects[Player_ai->target_objnum].instance].ship_info_index].is_big_or_huge() ) { ship_subsys *ss = Player_ai->targeted_subsys; if (ss != NULL) { if ((ss->system_info->type == SUBSYSTEM_TURRET) && (ss->current_hits == 0)) { @@ -1476,7 +1476,7 @@ void hud_update_frame(float frametime) int stop_targetting_this_thing = 0; // check to see if the target is still alive - if ( targetp->flags&OF_SHOULD_BE_DEAD ) { + if ( targetp->flags[Object::Object_Flags::Should_be_dead] ) { stop_targetting_this_thing = 1; } @@ -1486,10 +1486,10 @@ void hud_update_frame(float frametime) if ( targetp->type == OBJ_SHIP ) { Assert ( targetp->instance >=0 && targetp->instance < MAX_SHIPS ); target_shipp = &Ships[targetp->instance]; - Player->target_is_dying = target_shipp->flags & SF_DYING; + Player->target_is_dying = target_shipp->flags[Ship::Ship_Flags::Dying]; // If it is warping out (or exploded), turn off targeting - if ( target_shipp->flags & (SF_DEPART_WARP|SF_EXPLODED) ) { + if ( target_shipp->flags[Ship::Ship_Flags::Depart_warp] || target_shipp->flags[Ship::Ship_Flags::Exploded] ) { stop_targetting_this_thing = 1; } } @@ -2662,11 +2662,13 @@ int hud_support_find_closest( int objnum ) sop = GET_FIRST(&Ship_obj_list); while(sop != END_OF_LIST(&Ship_obj_list)){ - if ( Ship_info[Ships[Objects[sop->objnum].instance].ship_info_index].flags & SIF_SUPPORT ) { + if ( Ship_info[Ships[Objects[sop->objnum].instance].ship_info_index].flags[Ship::Info_Flags::Support] ) { int pship_index, sindex; // make sure support ship is not dying - if ( !(Ships[Objects[sop->objnum].instance].flags & (SF_DYING|SF_EXPLODED)) ) { + auto shipp = &Ships[Objects[sop->objnum].instance]; + + if ( !(shipp->flags[Ship::Ship_Flags::Dying] || shipp->flags[Ship::Ship_Flags::Exploded]) ) { Assert( objp->type == OBJ_SHIP ); aip = &Ai_info[Ships[Objects[sop->objnum].instance].ai_index]; diff --git a/code/hud/hudescort.cpp b/code/hud/hudescort.cpp index 23aaad4e64..a30efdc8dc 100644 --- a/code/hud/hudescort.cpp +++ b/code/hud/hudescort.cpp @@ -367,7 +367,7 @@ void HudGaugeEscort::renderIcon(int x, int y, int index) */ // draw a 'D' if a ship is disabled - if ( (sp->flags & SF_DISABLED) || (ship_subsys_disrupted(sp, SUBSYSTEM_ENGINE)) ) { + if ( (sp->flags[Ship::Ship_Flags::Disabled]) || (ship_subsys_disrupted(sp, SUBSYSTEM_ENGINE)) ) { renderString( x + ship_status_offsets[0], y + ship_status_offsets[1], EG_NULL, XSTR( "D", 284)); } @@ -488,7 +488,7 @@ void hud_escort_clear_all(bool clear_flags) Num_escort_ships = 0; for ( i = 0; i < Max_escort_ships; i++ ) { if(clear_flags && (Escort_ships[i].objnum >= 0) && (Objects[Escort_ships[i].objnum].type == OBJ_SHIP) && (Objects[Escort_ships[i].objnum].instance >= 0)){ - Ships[Objects[Escort_ships[i].objnum].instance].flags &= ~SF_ESCORT; + Ships[Objects[Escort_ships[i].objnum].instance].flags.remove(Ship::Ship_Flags::Escort); } Escort_ships[i].obj_signature = -99; Escort_ships[i].np_id = -1; @@ -599,22 +599,22 @@ void hud_create_complete_escort_list(escort_info *escorts, int *num_escorts) } // only process ships that might be on the list - if ( !(Ships[objp->instance].flags & SF_ESCORT) ){ + if ( !(Ships[objp->instance].flags[Ship::Ship_Flags::Escort]) ){ continue; } // only process ships that can be seen by sensors - if ( (Ships[objp->instance].flags & SF_HIDDEN_FROM_SENSORS) ){ + if ( (Ships[objp->instance].flags[Ship::Ship_Flags::Hidden_from_sensors]) ){ continue; } // don't process most stealth ships - if ( (Ships[objp->instance].flags2 & SF2_STEALTH) ) + if ( (Ships[objp->instance].flags[Ship::Ship_Flags::Stealth]) ) { if ( Ships[objp->instance].team == Player_ship->team ) { // friendly stealths are only not seen when explicitly specified - if ( Ships[objp->instance].flags2 & SF2_FRIENDLY_STEALTH_INVIS ) + if ( Ships[objp->instance].flags[Ship::Ship_Flags::Friendly_stealth_invis] ) { continue; } @@ -627,7 +627,7 @@ void hud_create_complete_escort_list(escort_info *escorts, int *num_escorts) } // don't process objects that should be dead - if ( objp->flags & OF_SHOULD_BE_DEAD ) { + if ( objp->flags[Object::Object_Flags::Should_be_dead] ) { continue; } @@ -761,7 +761,7 @@ void hud_remove_ship_from_escort_index(int dead_index, int objnum) // remove him from escort list if((objnum >= 0) && (Objects[objnum].type == OBJ_SHIP) && (Objects[objnum].instance >= 0)){ - Ships[Objects[objnum].instance].flags &= ~SF_ESCORT; + Ships[Objects[objnum].instance].flags.remove(Ship::Ship_Flags::Escort); } count = 0; @@ -816,15 +816,15 @@ void hud_escort_cull_list() int objnum = Escort_ships[i].objnum; Assert( objnum >=0 && objnum < MAX_OBJECTS ); - if ( Objects[objnum].flags & OF_SHOULD_BE_DEAD ) { + if ( Objects[objnum].flags[Object::Object_Flags::Should_be_dead] ) { hud_setup_escort_list(0); break; } else if ( Objects[objnum].type == OBJ_SHIP ) { int shipnum = Objects[objnum].instance; Assert( shipnum >= 0 && shipnum < MAX_SHIPS ); - if ( (Ships[shipnum].flags & SF_HIDDEN_FROM_SENSORS) - || ((Ships[shipnum].flags2 & SF2_STEALTH) && ((Ships[shipnum].team != Player_ship->team) || (Ships[shipnum].flags2 & SF2_FRIENDLY_STEALTH_INVIS))) + if ( (Ships[shipnum].flags[Ship::Ship_Flags::Hidden_from_sensors]) + || ((Ships[shipnum].flags[Ship::Ship_Flags::Stealth]) && ((Ships[shipnum].team != Player_ship->team) || (Ships[shipnum].flags[Ship::Ship_Flags::Friendly_stealth_invis]))) ) { hud_setup_escort_list(0); break; @@ -881,7 +881,7 @@ void hud_add_ship_to_escort(int objnum, int supress_feedback) complete_escorts[num_complete_escorts].escort_show_bright = false; // add him to escort list - Ships[Objects[objnum].instance].flags |= SF_ESCORT; + Ships[Objects[objnum].instance].flags.set(Ship::Ship_Flags::Escort); num_complete_escorts++; } diff --git a/code/hud/hudets.cpp b/code/hud/hudets.cpp index a3d85a1a4f..641a1a3903 100644 --- a/code/hud/hudets.cpp +++ b/code/hud/hudets.cpp @@ -44,7 +44,7 @@ void ets_init_ship(object* obj) sp = &Ships[obj->instance]; sp->weapon_energy = Ship_info[sp->ship_info_index].max_weapon_reserve; - if ((sp->flags2 & SF2_NO_ETS) == 0) { + if ((sp->flags[Ship::Ship_Flags::No_ets]) == 0) { sp->next_manage_ets = timestamp(AI_MODIFY_ETS_INTERVAL); } else { sp->next_manage_ets = -1; @@ -73,7 +73,7 @@ void update_ets(object* objp, float fl_frametime) float max_g=sinfo_p->max_weapon_reserve, max_s=ship_p->ship_max_shield_strength; - if ( ship_p->flags & SF_DYING ){ + if ( ship_p->flags[Ship::Ship_Flags::Dying] ){ return; } @@ -85,7 +85,7 @@ void update_ets(object* objp, float fl_frametime) // update weapon energy max_new_weapon_energy = fl_frametime * sinfo_p->max_weapon_regen_per_second * max_g; - if ( objp->flags & OF_PLAYER_SHIP ) { + if ( objp->flags[Object::Object_Flags::Player_ship] ) { ship_p->weapon_energy += Energy_levels[ship_p->weapon_recharge_index] * max_new_weapon_energy * The_mission.ai_profile->weapon_energy_scale[Game_skill_level]; } else { ship_p->weapon_energy += Energy_levels[ship_p->weapon_recharge_index] * max_new_weapon_energy; @@ -97,7 +97,7 @@ void update_ets(object* objp, float fl_frametime) float shield_delta; max_new_shield_energy = fl_frametime * sinfo_p->max_shield_regen_per_second * max_s; - if ( objp->flags & OF_PLAYER_SHIP ) { + if ( objp->flags[Object::Object_Flags::Player_ship] ) { shield_delta = Energy_levels[ship_p->shield_recharge_index] * max_new_shield_energy * The_mission.ai_profile->shield_energy_scale[Game_skill_level]; } else { shield_delta = Energy_levels[ship_p->shield_recharge_index] * max_new_shield_energy; @@ -132,7 +132,7 @@ void update_ets(object* objp, float fl_frametime) } if ( timestamp_elapsed(ship_p->next_manage_ets) ) { - if ( !(objp->flags & OF_PLAYER_SHIP) ) { + if ( !(objp->flags[Object::Object_Flags::Player_ship]) ) { ai_manage_ets(objp); ship_p->next_manage_ets = timestamp(AI_MODIFY_ETS_INTERVAL); } @@ -205,7 +205,7 @@ void ai_manage_ets(object* obj) if ( ship_info_p->power_output == 0 ) return; - if (ship_p->flags & SF_DYING) + if (ship_p->flags[Ship::Ship_Flags::Dying]) return; // check if any of the three systems are not being used. If so, don't allow energy management. @@ -221,13 +221,13 @@ void ai_manage_ets(object* obj) decrease_recharge_rate(obj, WEAPONS); } - if (!(obj->flags & OF_NO_SHIELDS) && (shield_left_percent == 1.0f)) { + if (!(obj->flags[Object::Object_Flags::No_shields]) && (shield_left_percent == 1.0f)) { decrease_recharge_rate(obj, SHIELDS); } // minimum check - if (!(obj->flags & OF_NO_SHIELDS) && (shield_left_percent < SHIELDS_MIN_LEVEL_PERCENT)) { + if (!(obj->flags[Object::Object_Flags::No_shields]) && (shield_left_percent < SHIELDS_MIN_LEVEL_PERCENT)) { if ( weapon_left_percent > WEAPONS_MIN_LEVEL_PERCENT ) increase_recharge_rate(obj, SHIELDS); } @@ -241,7 +241,7 @@ void ai_manage_ets(object* obj) } // emergency check - if (!(obj->flags & OF_NO_SHIELDS)) { + if (!(obj->flags[Object::Object_Flags::No_shields])) { if ( shield_left_percent < SHIELDS_EMERG_LEVEL_PERCENT ) { if (ship_p->target_shields_delta == 0.0f) transfer_energy_to_shields(obj); @@ -286,7 +286,7 @@ void set_default_recharge_rates(object* obj) if (ship_has_energy_weapons(ship_p)) ship_properties |= HAS_WEAPONS; - if (!(obj->flags & OF_NO_SHIELDS)) + if (!(obj->flags[Object::Object_Flags::No_shields])) ship_properties |= HAS_SHIELDS; if (ship_has_engine_power(ship_p)) @@ -352,7 +352,7 @@ void increase_recharge_rate(object* obj, SYSTEM_TYPE ship_system) int count=0; ship *ship_p = &Ships[obj->instance]; - if (ship_p->flags2 & SF2_NO_ETS) + if (ship_p->flags[Ship::Ship_Flags::No_ets]) return; switch ( ship_system ) { @@ -362,7 +362,7 @@ void increase_recharge_rate(object* obj, SYSTEM_TYPE ship_system) gain_index = &ship_p->weapon_recharge_index; - if ( obj->flags & OF_NO_SHIELDS ) + if ( obj->flags[Object::Object_Flags::No_shields] ) lose_index1 = NULL; else lose_index1 = &ship_p->shield_recharge_index; @@ -375,7 +375,7 @@ void increase_recharge_rate(object* obj, SYSTEM_TYPE ship_system) break; case SHIELDS: - if ( obj->flags & OF_NO_SHIELDS ) + if ( obj->flags[Object::Object_Flags::No_shields] ) return; gain_index = &ship_p->shield_recharge_index; @@ -403,7 +403,7 @@ void increase_recharge_rate(object* obj, SYSTEM_TYPE ship_system) else lose_index1 = &ship_p->weapon_recharge_index; - if ( obj->flags & OF_NO_SHIELDS ) + if ( obj->flags[Object::Object_Flags::No_shields] ) lose_index2 = NULL; else lose_index2 = &ship_p->shield_recharge_index; @@ -476,7 +476,7 @@ void decrease_recharge_rate(object* obj, SYSTEM_TYPE ship_system) int count; ship *ship_p = &Ships[obj->instance]; - if (ship_p->flags2 & SF2_NO_ETS) + if (ship_p->flags[Ship::Ship_Flags::No_ets]) return; switch ( ship_system ) { @@ -486,7 +486,7 @@ void decrease_recharge_rate(object* obj, SYSTEM_TYPE ship_system) lose_index = &ship_p->weapon_recharge_index; - if ( obj->flags & OF_NO_SHIELDS ) + if ( obj->flags[Object::Object_Flags::No_shields] ) gain_index1 = NULL; else gain_index1 = &ship_p->shield_recharge_index; @@ -499,7 +499,7 @@ void decrease_recharge_rate(object* obj, SYSTEM_TYPE ship_system) break; case SHIELDS: - if ( obj->flags & OF_NO_SHIELDS ) + if ( obj->flags[Object::Object_Flags::No_shields] ) return; lose_index = &ship_p->shield_recharge_index; @@ -527,7 +527,7 @@ void decrease_recharge_rate(object* obj, SYSTEM_TYPE ship_system) else gain_index1 = &ship_p->weapon_recharge_index; - if ( obj->flags & OF_NO_SHIELDS ) + if ( obj->flags[Object::Object_Flags::No_shields] ) gain_index2 = NULL; else gain_index2 = &ship_p->shield_recharge_index; @@ -615,10 +615,10 @@ void transfer_energy_to_shields(object* obj) { ship* ship_p = &Ships[obj->instance]; - if (ship_p->flags & SF_DYING) + if (ship_p->flags[Ship::Ship_Flags::Dying]) return; - if ( !ship_has_energy_weapons(ship_p) || obj->flags & OF_NO_SHIELDS ) + if ( !ship_has_energy_weapons(ship_p) || obj->flags[Object::Object_Flags::No_shields] ) { return; } @@ -634,10 +634,10 @@ void transfer_energy_to_weapons(object* obj) ship* ship_p = &Ships[obj->instance]; ship_info* sinfo_p = &Ship_info[ship_p->ship_info_index]; - if (ship_p->flags & SF_DYING) + if (ship_p->flags[Ship::Ship_Flags::Dying]) return; - if ( !ship_has_energy_weapons(ship_p) || obj->flags & OF_NO_SHIELDS ) + if ( !ship_has_energy_weapons(ship_p) || obj->flags[Object::Object_Flags::No_shields] ) { return; } @@ -729,7 +729,7 @@ bool validate_ship_ets_indxes(const int &ship_idx, int (&ets_indexes)[num_retail } ship *ship_p = &Ships[ship_idx]; - if (ship_p->flags2 & SF2_NO_ETS) + if (ship_p->flags[Ship::Ship_Flags::No_ets]) return false; // handle ships that are missing parts of the ETS @@ -738,7 +738,7 @@ bool validate_ship_ets_indxes(const int &ship_idx, int (&ets_indexes)[num_retail ship_properties |= HAS_WEAPONS; } - if (!(Objects[ship_p->objnum].flags & OF_NO_SHIELDS)) { + if (!(Objects[ship_p->objnum].flags[Object::Object_Flags::No_shields])) { ship_properties |= HAS_SHIELDS; } @@ -919,7 +919,7 @@ void HudGaugeEtsRetail::render(float frametime) // if at least two gauges are not shown, don't show any i = 0; if (!ship_has_energy_weapons(ship_p)) i++; - if (Player_obj->flags & OF_NO_SHIELDS) i++; + if (Player_obj->flags[Object::Object_Flags::No_shields]) i++; if (!ship_has_engine_power(ship_p)) i++; if (i >= 2) return; @@ -933,7 +933,7 @@ void HudGaugeEtsRetail::render(float frametime) position[0] = Gauge_positions[initial_position++]; renderPrintf(position[0] + Letter_offsets[0], position[1] + Letter_offsets[1], NOX("%c"), Letter); } - if (!(Player_obj->flags & OF_NO_SHIELDS)) { + if (!(Player_obj->flags[Object::Object_Flags::No_shields])) { Letter = Letters[1]; position[0] = Gauge_positions[initial_position++]; renderPrintf(position[0] + Letter_offsets[0], position[1] + Letter_offsets[1], NOX("%c"), Letter); @@ -951,7 +951,7 @@ void HudGaugeEtsRetail::render(float frametime) position[0] = Gauge_positions[initial_position++]; blitGauge(ship_p->weapon_recharge_index); } - if (!(Player_obj->flags & OF_NO_SHIELDS)) { + if (!(Player_obj->flags[Object::Object_Flags::No_shields])) { Letter = Letters[1]; position[0] = Gauge_positions[initial_position++]; blitGauge(ship_p->shield_recharge_index); @@ -1002,7 +1002,7 @@ void HudGaugeEtsWeapons::render(float frametime) // if at least two gauges are not shown, don't show any i = 0; if (!ship_has_energy_weapons(ship_p)) i++; - if (Player_obj->flags & OF_NO_SHIELDS) i++; + if (Player_obj->flags[Object::Object_Flags::No_shields]) i++; if (!ship_has_engine_power(ship_p)) i++; if (i >= 2) return; @@ -1039,12 +1039,12 @@ void HudGaugeEtsShields::render(float frametime) // if at least two gauges are not shown, don't show any i = 0; if (!ship_has_energy_weapons(ship_p)) i++; - if (Player_obj->flags & OF_NO_SHIELDS) i++; + if (Player_obj->flags[Object::Object_Flags::No_shields]) i++; if (!ship_has_engine_power(ship_p)) i++; if (i >= 2) return; // no shields, no shields gauge - if (Player_obj->flags & OF_NO_SHIELDS) { + if (Player_obj->flags[Object::Object_Flags::No_shields]) { return; } @@ -1075,7 +1075,7 @@ void HudGaugeEtsEngines::render(float frametime) // if at least two gauges are not shown, don't show any i = 0; if (!ship_has_energy_weapons(ship_p)) i++; - if (Player_obj->flags & OF_NO_SHIELDS) i++; + if (Player_obj->flags[Object::Object_Flags::No_shields]) i++; if (!ship_has_engine_power(ship_p)) i++; if (i >= 2) return; diff --git a/code/hud/hudlock.cpp b/code/hud/hudlock.cpp index 39d6be5211..1f3e274fee 100644 --- a/code/hud/hudlock.cpp +++ b/code/hud/hudlock.cpp @@ -332,7 +332,7 @@ int hud_lock_world_pos_in_range(vec3d *target_world_pos, vec3d *vec_to_target) // reduce firing range in nebula - if ((The_mission.flags & MISSION_FLAG_FULLNEB) && Nebula_sec_range) { + if ((The_mission.flags[Mission::Mission_Flags::Fullneb]) && Nebula_sec_range) { weapon_range *= 0.8f; } @@ -391,7 +391,7 @@ int hud_abort_lock() return 1; } - if ( Player_ship->flags2 & SF2_NO_SECONDARY_LOCKON ) { + if ( Player_ship->flags[Ship::Ship_Flags::No_secondary_lockon] ) { return 1; } @@ -1021,7 +1021,7 @@ void hud_lock_get_new_lock_pos(object *target_objp) wip = &Weapon_info[swp->secondary_bank_weapons[swp->current_secondary_bank]]; // if a large ship, lock to pos closest to center and within range - if ( (target_shipp) && (Ship_info[target_shipp->ship_info_index].flags & (SIF_BIG_SHIP|SIF_HUGE_SHIP)) && + if ( (target_shipp) && (Ship_info[target_shipp->ship_info_index].is_big_or_huge()) && !(wip->wi_flags & WIF_HOMING_JAVELIN) ) { // check all the subsystems and the center of the ship diff --git a/code/hud/hudobserver.cpp b/code/hud/hudobserver.cpp index f498f19bc5..75216310a3 100644 --- a/code/hud/hudobserver.cpp +++ b/code/hud/hudobserver.cpp @@ -33,7 +33,6 @@ void hud_observer_init(ship *shipp, ai_info *aip) Hud_obs_ship.team = shipp->team; Hud_obs_ship.ai_index = shipp->ai_index; Hud_obs_ship.flags = shipp->flags; - Hud_obs_ship.flags2 = shipp->flags2; Hud_obs_ship.ship_info_index = shipp->ship_info_index; Hud_obs_ship.objnum = shipp->objnum; Hud_obs_ship.wingnum = shipp->wingnum; diff --git a/code/hud/hudreticle.cpp b/code/hud/hudreticle.cpp index 7ca716a8ce..c91ce95b6d 100644 --- a/code/hud/hudreticle.cpp +++ b/code/hud/hudreticle.cpp @@ -306,14 +306,14 @@ void HudGaugeReticle::getFirepointStatus() { bankactive = 1; else if (timestamp_elapsed(shipp->weapons.primary_animation_done_time[i])) bankactive = 1; - else if (i == shipp->weapons.current_primary_bank || shipp->flags & SF_PRIMARY_LINKED) + else if (i == shipp->weapons.current_primary_bank || shipp->flags[Ship::Ship_Flags::Primary_linked]) bankactive = 2; int num_slots = pm->gun_banks[i].num_slots; for (int j = 0; j < num_slots; j++) { int fpactive = bankactive; - if (sip->flags2 & SIF2_DYN_PRIMARY_LINKING) { + if (sip->flags[Ship::Info_Flags::Dyn_primary_linking]) { // If this firepoint is not among the next shot(s) to be fired, dim it one step if ( !( (j >= (shipp->last_fired_point[i]+1) % num_slots) && (j <= (shipp->last_fired_point[i]+swp->primary_bank_slot_count[i]) % num_slots) ) ) { fpactive--; @@ -919,7 +919,7 @@ void HudGaugeWeaponLinking::render(float frametime) if ( swp->current_primary_bank == -1 ) { frame_offset = 0; } else { - if ( Player_ship->flags & SF_PRIMARY_LINKED ) { + if ( Player_ship->flags[Ship::Ship_Flags::Primary_linked] ) { frame_offset = 3; } else { if ( swp->current_primary_bank == 0 ) { diff --git a/code/hud/hudshield.cpp b/code/hud/hudshield.cpp index ba01c43132..5102dd9a4b 100644 --- a/code/hud/hudshield.cpp +++ b/code/hud/hudshield.cpp @@ -224,7 +224,7 @@ void hud_shield_equalize(object *objp, player *pl) return; // Goober5000 - quick out if we have no shields - if (objp->flags & OF_NO_SHIELDS) + if (objp->flags[Object::Object_Flags::No_shields]) return; // are all quadrants equal? @@ -284,7 +284,7 @@ void hud_augment_shield_quadrant(object *objp, int direction) float max_quadrant_val; int i; - if (sip->flags2 & SIF2_MODEL_POINT_SHIELDS) { + if (sip->flags[Ship::Info_Flags::Model_point_shields]) { direction = sip->shield_point_augment_ctrls[direction]; // The re-mapped direction can be -1 if this direction cannot be augmented @@ -426,7 +426,7 @@ void hud_shield_show_mini(object *objp, int x_force, int y_force, int x_hull_off for ( i = 0; i < objp->n_quadrants; i++ ) { - if ( objp->flags & OF_NO_SHIELDS || i >= DEFAULT_SHIELD_SECTIONS) { + if ( objp->flags[Object::Object_Flags::No_shields] || i >= DEFAULT_SHIELD_SECTIONS) { break; } @@ -565,7 +565,7 @@ void hud_shield_quadrant_hit(object *objp, int quadrant) Assertion(shi->hull_hit_index < (int) shi->shield_hit_timers.size(), "Shield hit info object for object '%s' has a hull_hit_index of %d (should be between 0 and " SIZE_T_ARG "); get a coder!\n", Ships[objp->instance].ship_name, shi->hull_hit_index, shi->shield_hit_timers.size() - 1); if ( quadrant >= 0 ) { - if ( !(Ship_info[Ships[objp->instance].ship_info_index].flags2 & SIF2_MODEL_POINT_SHIELDS) ) + if ( !(Ship_info[Ships[objp->instance].ship_info_index].flags[Ship::Info_Flags::Model_point_shields]) ) num = Quadrant_xlate[quadrant]; else num = quadrant; @@ -606,14 +606,14 @@ void HudGaugeShield::showShields(object *objp, int mode) return; // Goober5000 - don't show if primitive sensors - if ( Ships[Player_obj->instance].flags2 & SF2_PRIMITIVE_SENSORS ) + if ( Ships[Player_obj->instance].flags[Ship::Ship_Flags::Primitive_sensors] ) return; sp = &Ships[objp->instance]; sip = &Ship_info[sp->ship_info_index]; // bool digitus_improbus = (fod_model != -2 && strstr(sp->ship_name, "Sathanas") != NULL); - if ( sip->shield_icon_index == 255 && !(sip->flags2 & SIF2_GENERATE_HUD_ICON) /*&& !digitus_improbus*/) { + if ( sip->shield_icon_index == 255 && !(sip->flags[Ship::Info_Flags::Generate_hud_icon]) /*&& !digitus_improbus*/) { return; } @@ -724,11 +724,11 @@ void HudGaugeShield::showShields(object *objp, int mode) for ( i = 0; i < objp->n_quadrants; i++ ) { - if ( objp->flags & OF_NO_SHIELDS ) { + if ( objp->flags[Object::Object_Flags::No_shields] ) { break; } - if ( !(sip->flags2 & SIF2_MODEL_POINT_SHIELDS) ) { + if ( !(sip->flags[Ship::Info_Flags::Model_point_shields]) ) { if ( objp->shield_quadrant[Quadrant_xlate[i]] < 0.1f ) continue; } else { @@ -738,7 +738,7 @@ void HudGaugeShield::showShields(object *objp, int mode) range = MAX(HUD_COLOR_ALPHA_MAX, HUD_color_alpha + objp->n_quadrants); - if ( !(sip->flags2 & SIF2_MODEL_POINT_SHIELDS) ) + if ( !(sip->flags[Ship::Info_Flags::Model_point_shields]) ) hud_color_index = fl2i( (objp->shield_quadrant[Quadrant_xlate[i]] / max_shield) * range); else hud_color_index = fl2i( (objp->shield_quadrant[i] / max_shield) * range); @@ -1010,7 +1010,7 @@ void HudGaugeShieldMini::showMiniShields(object *objp) for ( i = 0; i < objp->n_quadrants; i++ ) { - if ( objp->flags & OF_NO_SHIELDS ) { + if ( objp->flags[Object::Object_Flags::No_shields] ) { break; } diff --git a/code/hud/hudsquadmsg.cpp b/code/hud/hudsquadmsg.cpp index 73ba165f21..b3b83035b2 100644 --- a/code/hud/hudsquadmsg.cpp +++ b/code/hud/hudsquadmsg.cpp @@ -320,7 +320,7 @@ bool hud_squadmsg_exist_fighters( ) continue; // ship must be a fighter/bomber - if ( !(Ship_info[shipp->ship_info_index].flags & (SIF_FIGHTER | SIF_BOMBER)) ) + if ( !(Ship_info[shipp->ship_info_index].is_fighter_bomber()) ) continue; // this ship satisfies everything @@ -351,7 +351,7 @@ bool hud_squadmsg_ship_valid(ship *shipp, object *objp) #endif // departing or dying ships cannot be on list - if ( shipp->flags & (SF_DEPARTING|SF_DYING) ) + if ( shipp->is_dying_or_departing() ) return false; // cannot be my ship or an instructor @@ -363,7 +363,7 @@ bool hud_squadmsg_ship_valid(ship *shipp, object *objp) return false; // if it is a player ship, we must be in multiplayer - if ( (objp->flags & OF_PLAYER_SHIP) && !(Game_mode & GM_MULTIPLAYER) ) + if ( (objp->flags[Object::Object_Flags::Player_ship]) && !(Game_mode & GM_MULTIPLAYER) ) return false; // if a messaging shortcut, be sure this ship can process the order @@ -777,11 +777,11 @@ int hud_squadmsg_ship_order_valid( int shipnum, int order ) { case DEPART_ITEM: // disabled ships can't depart. - if (shipp->flags & SF_DISABLED) + if (shipp->flags[Ship::Ship_Flags::Disabled]) return 0; // Goober5000: also can't depart if no subspace drives and no valid mothership - if (shipp->flags2 & SF2_NO_SUBSPACE_DRIVE) + if (shipp->flags[Ship::Ship_Flags::No_subspace_drive]) { // check that we have a mothership and that we can depart to it if (shipp->departure_location == DEPART_AT_DOCK_BAY) @@ -863,7 +863,7 @@ int hud_squadmsg_is_target_order_valid(int order, int find_order, ai_info *aip ) shipp = &Ships[objp->instance]; // if target is a navbouy, return 0 - if ( Ship_info[shipp->ship_info_index].flags & SIF_NAVBUOY ){ + if ( Ship_info[shipp->ship_info_index].flags[Ship::Info_Flags::Navbuoy] ){ return 0; } @@ -873,7 +873,7 @@ int hud_squadmsg_is_target_order_valid(int order, int find_order, ai_info *aip ) } // if the order is a disable order or depart, and the ship is disabled, order isn't active - if ( (Comm_orders[order].item == DISABLE_TARGET_ITEM) && (shipp->flags & SF_DISABLED) ){ + if ( (Comm_orders[order].item == DISABLE_TARGET_ITEM) && (shipp->flags[Ship::Ship_Flags::Disabled]) ){ return 0; } @@ -962,7 +962,7 @@ void hud_squadmsg_send_to_all_fighters( int command, int player_num ) continue; // can't message if ship not fighter/bomber if the command isn't to everyone. - if ( !(Ship_info[shipp->ship_info_index].flags & (SIF_FIGHTER | SIF_BOMBER)) ) + if ( !(Ship_info[shipp->ship_info_index].is_fighter_bomber()) ) continue; // don't send the command if the "wing" won't accept the command. We do this by looking at @@ -995,11 +995,11 @@ void hud_squadmsg_send_to_all_fighters( int command, int player_num ) continue; // don't send message to non fighter wings - if ( !(Ship_info[shipp->ship_info_index].flags & (SIF_FIGHTER | SIF_BOMBER)) ) + if ( !(Ship_info[shipp->ship_info_index].is_fighter_bomber()) ) continue; // skip departing/dying ships - if ( shipp->flags & (SF_DEPARTING|SF_DYING) ) + if ( shipp->is_dying_or_departing() ) continue; // don't send command if ship won't accept if @@ -1043,7 +1043,9 @@ int hud_squadmsg_enemies_present() return 0; } -#define OVERRIDE_PROTECT_SHIP_TYPE (SIF_FIGHTER|SIF_BOMBER|SIF_FREIGHTER|SIF_TRANSPORT) +inline bool override_protect_ship_type(ship_info* sip) { + return sip->is_fighter_bomber() || sip->flags[Ship::Info_Flags::Freighter] || sip->flags[Ship::Info_Flags::Transport]; +} // function which sends a message to a specific ship. This routine can be called from one of two // places. Either after selecting a ship when using a hotkey, or after selecting a command when // using the entire messaging menu system @@ -1117,9 +1119,10 @@ int hud_squadmsg_send_ship_command( int shipnum, int command, int send_message, Assert( ship_team != target_team ); // Orders to override protect - if (Ship_info[Ships[Objects[ainfo->target_objnum].instance].ship_info_index].flags & OVERRIDE_PROTECT_SHIP_TYPE) { - Objects[ainfo->target_objnum].flags &= ~OF_PROTECTED; - } + if (override_protect_ship_type(&Ship_info[Ships[Objects[ainfo->target_objnum].instance].ship_info_index])) { + Objects[ainfo->target_objnum].flags.remove(Object::Object_Flags::Protected); + } + ai_mode = AI_GOAL_CHASE; ai_submode = SM_ATTACK; @@ -1136,8 +1139,8 @@ int hud_squadmsg_send_ship_command( int shipnum, int command, int send_message, Assert( ship_team != target_team ); // Orders to override protect - if (Ship_info[Ships[Objects[ainfo->target_objnum].instance].ship_info_index].flags & OVERRIDE_PROTECT_SHIP_TYPE) { - Objects[ainfo->target_objnum].flags &= ~OF_PROTECTED; + if (override_protect_ship_type(&Ship_info[Ships[Objects[ainfo->target_objnum].instance].ship_info_index])) { + Objects[ainfo->target_objnum].flags.remove(Object::Object_Flags::Protected); } ai_mode = AI_GOAL_DISABLE_SHIP; @@ -1150,8 +1153,8 @@ int hud_squadmsg_send_ship_command( int shipnum, int command, int send_message, Assert( ship_team != target_team ); // Orders to override protect - if (Ship_info[Ships[Objects[ainfo->target_objnum].instance].ship_info_index].flags & OVERRIDE_PROTECT_SHIP_TYPE) { - Objects[ainfo->target_objnum].flags &= ~OF_PROTECTED; + if (override_protect_ship_type(&Ship_info[Ships[Objects[ainfo->target_objnum].instance].ship_info_index])) { + Objects[ainfo->target_objnum].flags.remove(Object::Object_Flags::Protected); } ai_mode = AI_GOAL_DISARM_SHIP; @@ -1166,8 +1169,8 @@ int hud_squadmsg_send_ship_command( int shipnum, int command, int send_message, Assert( ainfo->targeted_subsys->current_hits > 0.0f); // Orders to override protect - if (Ship_info[Ships[Objects[ainfo->target_objnum].instance].ship_info_index].flags & OVERRIDE_PROTECT_SHIP_TYPE) { - Objects[ainfo->target_objnum].flags &= ~OF_PROTECTED; + if (override_protect_ship_type(&Ship_info[Ships[Objects[ainfo->target_objnum].instance].ship_info_index])) { + Objects[ainfo->target_objnum].flags.remove(Object::Object_Flags::Protected); } ai_mode = AI_GOAL_DESTROY_SUBSYSTEM; @@ -1182,9 +1185,9 @@ int hud_squadmsg_send_ship_command( int shipnum, int command, int send_message, Assert(ainfo->target_objnum > -1); - Objects[ainfo->target_objnum].flags |= OF_PROTECTED; - - ai_mode = AI_GOAL_DOCK; + Objects[ainfo->target_objnum].flags.set(Object::Object_Flags::Protected); + + ai_mode = AI_GOAL_DOCK; ai_submode = AIS_DOCK_0; message = MESSAGE_DOCK_YES; break; @@ -1243,7 +1246,7 @@ int hud_squadmsg_send_ship_command( int shipnum, int command, int send_message, ai_mode = AI_GOAL_WARP; ai_submode = -1; message = MESSAGE_WARP_OUT; - Ships[shipnum].flags |= SF_DEPARTURE_ORDERED; + Ships[shipnum].flags.set(Ship::Ship_Flags::Departure_ordered); break; // the following are support ship options!!! @@ -1319,7 +1322,7 @@ int hud_squadmsg_send_ship_command( int shipnum, int command, int send_message, } // this is the _response_ - if ( send_message && (!(Ships[shipnum].flags2 & SF2_NO_BUILTIN_MESSAGES))) + if ( send_message && (!(Ships[shipnum].flags[Ship::Ship_Flags::No_builtin_messages]))) { message_send_builtin_to_player( message, &Ships[shipnum], MESSAGE_PRIORITY_NORMAL, MESSAGE_TIME_ANYTIME, 0, 0, player_num, message_team_filter ); } @@ -1833,7 +1836,7 @@ void hud_squadmsg_call_reinforcement(int reinforcement_num, int player_num) if ( p_objp ) { // by resetting the reinforcement flag, we will allow code which normally handles arrivals // to make this reinforcement arrive. Doing so keeps the data structures clean. - p_objp->flags &= ~P_SF_REINFORCEMENT; + p_objp->flags.remove(Mission::Parse_Object_Flags::SF_Reinforcement); // set up the arrival delay delay = rp->arrival_delay; @@ -2014,7 +2017,7 @@ void hud_squadmsg_ship_command() continue; // don't send message to non fighter wings - if ( !(Ship_info[shipp->ship_info_index].flags & (SIF_FIGHTER | SIF_BOMBER)) ) + if ( !(Ship_info[shipp->ship_info_index].is_fighter_bomber()) ) continue; all_accept &= shipp->orders_accepted; // 'and'ing will either keep this bit set or zero it properly diff --git a/code/hud/hudtarget.cpp b/code/hud/hudtarget.cpp index 2bdca4e351..1bf8b9d23a 100644 --- a/code/hud/hudtarget.cpp +++ b/code/hud/hudtarget.cpp @@ -45,9 +45,6 @@ #include "weapon/emp.h" #include "weapon/weapon.h" -// If any of these bits in the ship->flags are set, ignore this ship when targeting -int TARGET_SHIP_IGNORE_FLAGS = (SF_EXPLODED|SF_DEPART_WARP|SF_DYING|SF_ARRIVING_STAGE_1|SF_HIDDEN_FROM_SENSORS); - // Global values for the target bracket width and height, used for debugging int Hud_target_w, Hud_target_h; @@ -498,7 +495,7 @@ void hud_maybe_set_sorted_turret_subsys(ship *shipp) return; } - if (Ship_info[shipp->ship_info_index].flags & (SIF_BIG_SHIP|SIF_HUGE_SHIP)) { + if (Ship_info[shipp->ship_info_index].is_big_or_huge()) { if (shipp->last_targeted_subobject[Player_num] == NULL) { hud_target_live_turret(1, 1); } @@ -544,7 +541,7 @@ void hud_check_reticle_list() rl = GET_FIRST(&Reticle_cur_list); while( rl !=END_OF_LIST(&Reticle_cur_list) ) { temp = GET_NEXT(rl); - if ( rl->objp->flags & OF_SHOULD_BE_DEAD ) { + if ( rl->objp->flags[Object::Object_Flags::Should_be_dead] ) { list_remove( &Reticle_cur_list, rl ); rl->flags = 0; } @@ -792,7 +789,7 @@ void hud_target_hotkey_add_remove( int k, object *ctarget, int how_to_add ) return; // don't put dying or departing - if ( Ships[ctarget->instance].flags & (SF_DYING|SF_DEPARTING) ) + if ( Ships[ctarget->instance].is_dying_or_departing() ) return; // don't add mission file added hotkey assignments if there are player added assignments @@ -1065,7 +1062,7 @@ void hud_init_targeting() Target_newest_ship_timestamp = timestamp(0); Target_next_turret_timestamp = timestamp(0); - if(The_mission.flags & MISSION_FLAG_FULLNEB) { + if(The_mission.flags[Mission::Mission_Flags::Fullneb]) { Toggle_text_alpha = TOGGLE_TEXT_NEBULA_ALPHA; } else { Toggle_text_alpha = TOGGLE_TEXT_NORMAL_ALPHA; @@ -1191,7 +1188,7 @@ void hud_target_common(int team_mask, int next_flag) } if (A->type == OBJ_SHIP) { - if (Ships[A->instance].flags & TARGET_SHIP_IGNORE_FLAGS) + if (should_be_ignored(&Ships[A->instance])) continue; is_ship = 1; @@ -1217,7 +1214,7 @@ void hud_target_common(int team_mask, int next_flag) continue; } - if ( A == Player_obj || (shipp->flags & TARGET_SHIP_IGNORE_FLAGS) ){ + if ( A == Player_obj || (should_be_ignored(shipp)) ){ continue; } @@ -1293,123 +1290,135 @@ ship_obj *advance_ship(ship_obj *so, int next_flag) /// /// \returns The next object to target if targeting was successful. /// Returns NULL if targeting was unsuccessful. -static object* select_next_target_by_distance( const bool targeting_from_closest_to_farthest, const int valid_team_mask, const int attacked_object_number = -1, const int target_filters = (SIF_CARGO | SIF_NAVBUOY)) { - object *minimum_object_ptr, *maximum_object_ptr, *nearest_object_ptr; - minimum_object_ptr = maximum_object_ptr = nearest_object_ptr = NULL; - float current_distance = hud_find_target_distance(&Objects[Player_ai->target_objnum], Player_obj); - float minimum_distance = 1e20f; - float maximum_distance = 0.0f; - int player_object_index = OBJ_INDEX(Player_obj); - - float nearest_distance; - if ( targeting_from_closest_to_farthest ) { - nearest_distance = 1e20f; - } else { - nearest_distance = 0.0f; - } - - ship_obj *ship_object_ptr; - object *prospective_victim_ptr; - ship *prospective_victim_ship_ptr; - for ( ship_object_ptr = GET_FIRST(&Ship_obj_list); ship_object_ptr != END_OF_LIST(&Ship_obj_list); ship_object_ptr = GET_NEXT( ship_object_ptr) ) { - prospective_victim_ptr = &Objects[ ship_object_ptr->objnum]; - // get a pointer to the ship information - prospective_victim_ship_ptr = &Ships[prospective_victim_ptr->instance]; - - float new_distance; - if ( (prospective_victim_ptr == Player_obj) || (prospective_victim_ship_ptr->flags & TARGET_SHIP_IGNORE_FLAGS) ) { - continue; - } - - // choose from the correct team - if ( !iff_matches_mask(prospective_victim_ship_ptr->team, valid_team_mask) ) { - continue; - } - - // don't use object if it is already a target - if ( OBJ_INDEX(prospective_victim_ptr) == Player_ai->target_objnum ) { - continue; - } - - - if( attacked_object_number == -1 ) { - // always ignore navbuoys and cargo - if ( Ship_info[prospective_victim_ship_ptr->ship_info_index].flags & target_filters ) { - continue; - } - - if(hud_target_invalid_awacs(prospective_victim_ptr)){ - continue; - } - - new_distance = hud_find_target_distance(prospective_victim_ptr,Player_obj); - } else { - // Filter out any target that is not targeting the player --Mastadon - if ( (attacked_object_number == player_object_index) && (Ai_info[prospective_victim_ship_ptr->ai_index].target_objnum != player_object_index) ) { - continue; - } - esct eval_ship_as_closest_target_args; - eval_ship_as_closest_target_args.attacked_objnum = attacked_object_number; - eval_ship_as_closest_target_args.check_all_turrets = (attacked_object_number == player_object_index); - eval_ship_as_closest_target_args.check_nearest_turret = FALSE; - // We don't ever filter our target selection to just bombers or fighters - // because the select next attacker logic doesn't. --Mastadon - eval_ship_as_closest_target_args.filter = 0; - eval_ship_as_closest_target_args.team_mask = valid_team_mask; - // We always get the turret attacking, since that's how the select next - // attacker logic does it. --Mastadon - eval_ship_as_closest_target_args.turret_attacking_target = 1; - eval_ship_as_closest_target_args.shipp = prospective_victim_ship_ptr; - evaluate_ship_as_closest_target( &eval_ship_as_closest_target_args ); - - new_distance = eval_ship_as_closest_target_args.min_distance; - } - - - if (new_distance <= minimum_distance) { - minimum_distance = new_distance; - minimum_object_ptr = prospective_victim_ptr; - } - - if (new_distance >= maximum_distance) { - maximum_distance = new_distance; - maximum_object_ptr = prospective_victim_ptr; - } - - float diff = 0.0f; - if ( targeting_from_closest_to_farthest ) { - diff = new_distance - current_distance; - if ( diff > 0.0f ) { - if ( diff < ( nearest_distance - current_distance ) ) { - nearest_distance = new_distance; - nearest_object_ptr = prospective_victim_ptr; - } - } - } else { - diff = current_distance - new_distance; - if ( diff > 0.0f ) { - if ( diff < ( current_distance - nearest_distance ) ) { - nearest_distance = new_distance; - nearest_object_ptr = prospective_victim_ptr; - } - } - } - } +static object* select_next_target_by_distance(const bool targeting_from_closest_to_farthest, const int valid_team_mask, const int attacked_object_number = -1, flagset* target_filters = NULL) { + object *minimum_object_ptr, *maximum_object_ptr, *nearest_object_ptr; + minimum_object_ptr = maximum_object_ptr = nearest_object_ptr = NULL; + float current_distance = hud_find_target_distance(&Objects[Player_ai->target_objnum], Player_obj); + float minimum_distance = 1e20f; + float maximum_distance = 0.0f; + int player_object_index = OBJ_INDEX(Player_obj); + flagset filter; - if ( nearest_object_ptr == NULL ) { + if (target_filters != NULL) { + filter = *target_filters; + } else { + filter.set(Ship::Info_Flags::Cargo); + filter.set(Ship::Info_Flags::Navbuoy); + } - if ( targeting_from_closest_to_farthest ) { - if ( minimum_object_ptr != NULL ) { - nearest_object_ptr = minimum_object_ptr; - } - } else { - if ( maximum_object_ptr != NULL ) { - nearest_object_ptr = maximum_object_ptr; - } - } - } + float nearest_distance; + if (targeting_from_closest_to_farthest) { + nearest_distance = 1e20f; + } + else { + nearest_distance = 0.0f; + } - return nearest_object_ptr; + ship_obj *ship_object_ptr; + object *prospective_victim_ptr; + ship *prospective_victim_ship_ptr; + for (ship_object_ptr = GET_FIRST(&Ship_obj_list); ship_object_ptr != END_OF_LIST(&Ship_obj_list); ship_object_ptr = GET_NEXT(ship_object_ptr)) { + prospective_victim_ptr = &Objects[ship_object_ptr->objnum]; + // get a pointer to the ship information + prospective_victim_ship_ptr = &Ships[prospective_victim_ptr->instance]; + + float new_distance; + if ((prospective_victim_ptr == Player_obj) || (should_be_ignored(prospective_victim_ship_ptr))) { + continue; + } + + // choose from the correct team + if (!iff_matches_mask(prospective_victim_ship_ptr->team, valid_team_mask)) { + continue; + } + + // don't use object if it is already a target + if (OBJ_INDEX(prospective_victim_ptr) == Player_ai->target_objnum) { + continue; + } + + + if (attacked_object_number == -1) { + // always ignore navbuoys and cargo + if ((Ship_info[prospective_victim_ship_ptr->ship_info_index].flags & filter).any_set()) { + continue; + } + + if (hud_target_invalid_awacs(prospective_victim_ptr)) { + continue; + } + + new_distance = hud_find_target_distance(prospective_victim_ptr, Player_obj); + } + else { + // Filter out any target that is not targeting the player --Mastadon + if ((attacked_object_number == player_object_index) && (Ai_info[prospective_victim_ship_ptr->ai_index].target_objnum != player_object_index)) { + continue; + } + esct eval_ship_as_closest_target_args; + eval_ship_as_closest_target_args.attacked_objnum = attacked_object_number; + eval_ship_as_closest_target_args.check_all_turrets = (attacked_object_number == player_object_index); + eval_ship_as_closest_target_args.check_nearest_turret = FALSE; + // We don't ever filter our target selection to just bombers or fighters + // because the select next attacker logic doesn't. --Mastadon + eval_ship_as_closest_target_args.filter = 0; + eval_ship_as_closest_target_args.team_mask = valid_team_mask; + // We always get the turret attacking, since that's how the select next + // attacker logic does it. --Mastadon + eval_ship_as_closest_target_args.turret_attacking_target = 1; + eval_ship_as_closest_target_args.shipp = prospective_victim_ship_ptr; + evaluate_ship_as_closest_target(&eval_ship_as_closest_target_args); + + new_distance = eval_ship_as_closest_target_args.min_distance; + } + + + if (new_distance <= minimum_distance) { + minimum_distance = new_distance; + minimum_object_ptr = prospective_victim_ptr; + } + + if (new_distance >= maximum_distance) { + maximum_distance = new_distance; + maximum_object_ptr = prospective_victim_ptr; + } + + float diff = 0.0f; + if (targeting_from_closest_to_farthest) { + diff = new_distance - current_distance; + if (diff > 0.0f) { + if (diff < (nearest_distance - current_distance)) { + nearest_distance = new_distance; + nearest_object_ptr = prospective_victim_ptr; + } + } + } + else { + diff = current_distance - new_distance; + if (diff > 0.0f) { + if (diff < (current_distance - nearest_distance)) { + nearest_distance = new_distance; + nearest_object_ptr = prospective_victim_ptr; + } + } + } + } + + if (nearest_object_ptr == NULL) { + + if (targeting_from_closest_to_farthest) { + if (minimum_object_ptr != NULL) { + nearest_object_ptr = minimum_object_ptr; + } + } + else { + if (maximum_object_ptr != NULL) { + nearest_object_ptr = maximum_object_ptr; + } + } + } + + return nearest_object_ptr; } ship_obj *get_ship_obj_ptr_from_index(int index); @@ -1493,8 +1502,8 @@ void hud_target_missile(object *source_obj, int next_flag) if ( (aip->target_objnum != -1) && (Objects[aip->target_objnum].type == OBJ_SHIP) - && ((Ship_info[Ships[Objects[aip->target_objnum].instance].ship_info_index].flags & SIF_BOMBER) - || (Objects[aip->target_objnum].flags & OF_TARGETABLE_AS_BOMB))) { + && ((Ship_info[Ships[Objects[aip->target_objnum].instance].ship_info_index].flags[Ship::Info_Flags::Bomber]) + || (Objects[aip->target_objnum].flags[Object::Object_Flags::Targetable_as_bomb]))) { int index = Ships[Objects[aip->target_objnum].instance].ship_list_index; startShip = get_ship_obj_ptr_from_index(index); } else { @@ -1519,12 +1528,12 @@ void hud_target_missile(object *source_obj, int next_flag) } // check if ship type is bomber - if ( !(Ship_info[Ships[A->instance].ship_info_index].flags & SIF_BOMBER) && !(A->flags & OF_TARGETABLE_AS_BOMB) ) { + if ( !(Ship_info[Ships[A->instance].ship_info_index].flags[Ship::Info_Flags::Bomber]) && !(A->flags[Object::Object_Flags::Targetable_as_bomb]) ) { continue; } // check if ignore - if ( Ships[A->instance].flags & TARGET_SHIP_IGNORE_FLAGS ){ + if ( should_be_ignored(&Ships[A->instance]) ){ continue; } @@ -1549,11 +1558,11 @@ int hud_target_ship_can_be_scanned(ship *shipp) sip = &Ship_info[shipp->ship_info_index]; // ignore cargo that has already been scanned - if (shipp->flags & SF_CARGO_REVEALED) + if (shipp->flags[Ship::Ship_Flags::Cargo_revealed]) return 0; // allow ships with scannable flag set - if (shipp->flags & SF_SCANNABLE) + if (shipp->flags[Ship::Ship_Flags::Scannable]) return 1; // ignore ships that don't carry cargo @@ -1589,7 +1598,7 @@ void hud_target_uninspected_cargo(int next_flag) shipp = &Ships[A->instance]; // get a pointer to the ship information - if ( shipp->flags & TARGET_SHIP_IGNORE_FLAGS ) { + if ( should_be_ignored(shipp) ) { continue; } @@ -1644,11 +1653,11 @@ void hud_target_newest_ship() A = &Objects[so->objnum]; shipp = &Ships[A->instance]; // get a pointer to the ship information - if ( (A == Player_obj) || (shipp->flags & TARGET_SHIP_IGNORE_FLAGS) ) + if ( (A == Player_obj) || (should_be_ignored(shipp)) ) continue; // ignore navbuoys - if ( Ship_info[shipp->ship_info_index].flags & SIF_NAVBUOY ) { + if ( Ship_info[shipp->ship_info_index].flags[Ship::Info_Flags::Navbuoy] ) { continue; } @@ -2093,7 +2102,7 @@ bool evaluate_ship_as_closest_target(esct *esct_p) } // check if player or ignore ship - if ( (esct_p->shipp->objnum == OBJ_INDEX(Player_obj)) || (esct_p->shipp->flags & TARGET_SHIP_IGNORE_FLAGS) ) { + if ( (esct_p->shipp->objnum == OBJ_INDEX(Player_obj)) || (should_be_ignored(esct_p->shipp)) ) { return false; } @@ -2109,13 +2118,13 @@ bool evaluate_ship_as_closest_target(esct *esct_p) // If filter is set, only target fighters and bombers if ( esct_p->filter ) { - if ( !(Ship_info[esct_p->shipp->ship_info_index].flags & (SIF_FIGHTER | SIF_BOMBER)) ) { + if ( !(Ship_info[esct_p->shipp->ship_info_index].is_fighter_bomber()) ) { return false; } } // find closest turret to player if BIG or HUGE ship - if (Ship_info[esct_p->shipp->ship_info_index].flags & (SIF_BIG_SHIP|SIF_HUGE_SHIP)) { + if (Ship_info[esct_p->shipp->ship_info_index].is_big_or_huge()) { for (ss=GET_FIRST(&esct_p->shipp->subsys_list); ss!=END_OF_LIST(&esct_p->shipp->subsys_list); ss=GET_NEXT(ss)) { if (ss->flags & SSF_UNTARGETABLE) @@ -2239,7 +2248,7 @@ int hud_target_closest(int team_mask, int attacked_objnum, int play_fail_snd, in } // bail if ship is to be ignored - if (Ships[Objects[attacked_objnum].instance].flags & TARGET_SHIP_IGNORE_FLAGS) { + if (should_be_ignored(&Ships[Objects[attacked_objnum].instance])) { goto Target_closest_done; } } @@ -2419,7 +2428,7 @@ void hud_target_targets_target() goto ttt_fail; } - if ( Ships[tt_objp->instance].flags & TARGET_SHIP_IGNORE_FLAGS ) { + if ( should_be_ignored(&Ships[tt_objp->instance]) ) { goto ttt_fail; } @@ -2515,7 +2524,7 @@ void hud_target_in_reticle_new() if ( A->type == OBJ_SHIP ) { - if ( Ships[A->instance].flags & TARGET_SHIP_IGNORE_FLAGS ){ + if ( should_be_ignored(&Ships[A->instance]) ){ continue; } } @@ -2623,7 +2632,7 @@ void hud_target_in_reticle_old() } if ( A->type == OBJ_SHIP ) { - if ( Ships[A->instance].flags & TARGET_SHIP_IGNORE_FLAGS ){ + if ( should_be_ignored(&Ships[A->instance]) ){ continue; } } @@ -2699,7 +2708,7 @@ void hud_target_subsystem_in_reticle() int shipnum = targetp->instance; if ( targetp->type == OBJ_SHIP ) { - if ( Ships[shipnum].flags & TARGET_SHIP_IGNORE_FLAGS ) { + if ( should_be_ignored(&Ships[shipnum]) ) { return; } } @@ -3282,7 +3291,7 @@ void hud_show_message_sender() } // Goober5000 - don't draw if primitive sensors - if ( Ships[Player_obj->instance].flags2 & SF2_PRIMITIVE_SENSORS ) { + if ( Ships[Player_obj->instance].flags[Ship::Ship_Flags::Primitive_sensors] ) { return; } @@ -3290,8 +3299,8 @@ void hud_show_message_sender() // their position cause they're feeling chatty // MageKing17 - Make the check see if they're actually stealthed at the time, and may as well include a check for // being hidden from sensors, too; logic copied from a similar check in hudescort.cpp - if ( (Ships[Message_shipnum].flags & SF_HIDDEN_FROM_SENSORS) - || ((Ships[Message_shipnum].flags2 & SF2_STEALTH) && ((Ships[Message_shipnum].team != Player_ship->team) || (Ships[Message_shipnum].flags2 & SF2_FRIENDLY_STEALTH_INVIS))) + if ( (Ships[Message_shipnum].flags[Ship::Ship_Flags::Hidden_from_sensors]) + || ((Ships[Message_shipnum].flags[Ship::Ship_Flags::Stealth]) && ((Ships[Message_shipnum].team != Player_ship->team) || (Ships[Message_shipnum].flags[Ship::Ship_Flags::Friendly_stealth_invis]))) ) { return; } @@ -3299,7 +3308,7 @@ void hud_show_message_sender() Assert ( targetp->instance >=0 && targetp->instance < MAX_SHIPS ); // check the object flags to see if this ship is gone. If so, then don't do this stuff anymore - if ( targetp->flags & OF_SHOULD_BE_DEAD ) { + if ( targetp->flags[Object::Object_Flags::Should_be_dead] ) { Message_shipnum = -1; return; } @@ -3358,7 +3367,7 @@ void hud_prune_hotkeys() // check to see if the object is dying -- if so, remove it from the list // check to see if the ship is departing -- if so, remove it from the list - if ( remove_item || (objp->flags & OF_SHOULD_BE_DEAD) || (sp->flags & (SF_DEPARTING|SF_DYING)) ) { + if ( remove_item || (objp->flags[Object::Object_Flags::Should_be_dead]) || (sp->is_dying_or_departing()) ) { if ( sp != NULL ) { nprintf(("Network", "Hotkey: Pruning %s\n", sp->ship_name)); } @@ -3582,7 +3591,7 @@ void hud_show_hostile_triangle() aip = &Ai_info[Ships[A->instance].ai_index]; // don't look at ignore ships - if ( sp->flags & TARGET_SHIP_IGNORE_FLAGS ) { + if ( should_be_ignored(sp) ) { continue; } @@ -3599,7 +3608,7 @@ void hud_show_hostile_triangle() turret_is_attacking = 0; // check if any turrets on ship are firing at the player (only on non fighter-bombers) - if ( !(Ship_info[sp->ship_info_index].flags & (SIF_FIGHTER|SIF_BOMBER)) ) { + if ( !(Ship_info[sp->ship_info_index].is_fighter_bomber()) ) { for (ss = GET_FIRST(&sp->subsys_list); ss != END_OF_LIST(&sp->subsys_list); ss = GET_NEXT(ss) ) { if (ss->flags & SSF_UNTARGETABLE) continue; @@ -3728,7 +3737,7 @@ int hud_get_best_primary_bank(float *range) farthest_weapon_range = 0.0f; best_bank = -1; - if ( Player_ship->flags & SF_PRIMARY_LINKED ) { + if ( Player_ship->flags[Ship::Ship_Flags::Primary_linked] ) { num_to_test = swp->num_primary_banks; } else { num_to_test = MIN(1, swp->num_primary_banks); @@ -4615,11 +4624,11 @@ int hud_communications_state(ship *sp) } // Goober5000 - if the ship is the player, and he's dying, return OK (so laments can be played) - if ((sp == Player_ship) && (sp->flags & SF_DYING)) + if ((sp == Player_ship) && (sp->flags[Ship::Ship_Flags::Dying])) return COMM_OK; // Goober5000 - check for scrambled communications - if ( emp_active_local() || sp->flags2 & SF2_SCRAMBLE_MESSAGES ) + if ( emp_active_local() || sp->flags[Ship::Ship_Flags::Scramble_messages] ) return COMM_SCRAMBLED; str = ship_get_subsystem_strength( sp, SUBSYSTEM_COMMUNICATION ); @@ -4731,7 +4740,7 @@ void HudGaugeAutoTarget::initOffColor(int r, int g, int b, int a) void HudGaugeAutoTarget::render(float frametime) { - if (Player_ship->flags2 & SF2_PRIMITIVE_SENSORS) + if (Player_ship->flags[Ship::Ship_Flags::Primitive_sensors]) return; int frame_offset; @@ -4817,7 +4826,7 @@ void HudGaugeAutoSpeed::initOffColor(int r, int g, int b, int a) void HudGaugeAutoSpeed::render(float frametime) { - if (Player_ship->flags2 & SF2_PRIMITIVE_SENSORS) + if (Player_ship->flags[Ship::Ship_Flags::Primitive_sensors]) return; int frame_offset; @@ -4870,11 +4879,11 @@ int hud_target_closest_repair_ship(int goal_objnum) shipp = &Ships[A->instance]; // get a pointer to the ship information // ignore all ships that aren't repair ships - if ( !(Ship_info[shipp->ship_info_index].flags & SIF_SUPPORT) ) { + if ( !(Ship_info[shipp->ship_info_index].flags[Ship::Info_Flags::Support]) ) { continue; } - if ( (A == Player_obj) || (shipp->flags & TARGET_SHIP_IGNORE_FLAGS) ) + if ( (A == Player_obj) || (should_be_ignored(shipp)) ) continue; // only consider friendly ships @@ -4919,11 +4928,11 @@ int hud_target_closest_repair_ship(int goal_objnum) void hud_target_toggle_hidden_from_sensors() { - if ( TARGET_SHIP_IGNORE_FLAGS & SF_HIDDEN_FROM_SENSORS ) { - TARGET_SHIP_IGNORE_FLAGS &= ~SF_HIDDEN_FROM_SENSORS; + if ( Ignore_List[Ship::Ship_Flags::Hidden_from_sensors] ) { + Ignore_List.remove(Ship::Ship_Flags::Hidden_from_sensors); HUD_sourced_printf(HUD_SOURCE_HIDDEN, NOX("Target hiding from sensors disabled")); } else { - TARGET_SHIP_IGNORE_FLAGS |= SF_HIDDEN_FROM_SENSORS; + Ignore_List.set(Ship::Ship_Flags::Hidden_from_sensors); HUD_sourced_printf(HUD_SOURCE_HIDDEN, NOX("Target hiding from sensors enabled")); } } @@ -4942,7 +4951,7 @@ void hud_target_closest_uninspected_object() A = &Objects[so->objnum]; shipp = &Ships[A->instance]; // get a pointer to the ship information - if ( (A == Player_obj) || (shipp->flags & TARGET_SHIP_IGNORE_FLAGS) ){ + if ( (A == Player_obj) || (should_be_ignored(shipp)) ){ continue; } @@ -5005,7 +5014,7 @@ void hud_target_uninspected_object(int next_flag) A = &Objects[so->objnum]; shipp = &Ships[A->instance]; // get a pointer to the ship information - if ( (A == Player_obj) || (shipp->flags & TARGET_SHIP_IGNORE_FLAGS) ) + if ( (A == Player_obj) || (should_be_ignored(shipp)) ) continue; // ignore all non-cargo carrying craft @@ -5150,7 +5159,7 @@ void hud_target_last_transmit() play_fail_sound = 0; } else { if ( Transmit_target_list[transmit_index].objsig == Objects[Transmit_target_list[transmit_index].objnum].signature ) { - if ( !(Ships[Objects[transmit_objnum].instance].flags & TARGET_SHIP_IGNORE_FLAGS) ) { + if ( !(should_be_ignored(&Ships[Objects[transmit_objnum].instance])) ) { Transmit_target_current_slot = transmit_index-1; if ( Transmit_target_current_slot < 0 ) { Transmit_target_current_slot = MAX_TRANSMIT_TARGETS - 1; @@ -5269,7 +5278,7 @@ void hudtarget_page_in() void hud_stuff_ship_name(char *ship_name_text, ship *shipp) { // print ship name - if ( ((Iff_info[shipp->team].flags & IFFF_WING_NAME_HIDDEN) && (shipp->wingnum != -1)) || (shipp->flags2 & SF2_HIDE_SHIP_NAME) ) { + if ( ((Iff_info[shipp->team].flags & IFFF_WING_NAME_HIDDEN) && (shipp->wingnum != -1)) || (shipp->flags[Ship::Ship_Flags::Hide_ship_name]) ) { *ship_name_text = 0; } else { strcpy(ship_name_text, shipp->ship_name); @@ -5437,7 +5446,7 @@ void HudGaugeAfterburner::render(float frametime) } Assert(Player_ship); - if ( !(Ship_info[Player_ship->ship_info_index].flags & SIF_AFTERBURNER) ) { + if ( !(Ship_info[Player_ship->ship_info_index].flags[Ship::Info_Flags::Afterburner]) ) { // Goober5000 - instead of drawing an empty burner gauge, don't draw the gauge at all return; } else { @@ -5532,7 +5541,7 @@ void HudGaugeWeaponEnergy::render(float frametime) bool use_new_gauge = false; // Goober5000 - only check for the new gauge in case of command line + a ballistic-capable ship - if (Cmdline_ballistic_gauge && Ship_info[Player_ship->ship_info_index].flags & SIF_BALLISTIC_PRIMARIES) + if (Cmdline_ballistic_gauge && Ship_info[Player_ship->ship_info_index].flags[Ship::Info_Flags::Ballistic_primaries]) { for(x = 0; x < Player_ship->weapons.num_primary_banks; x++) { @@ -5590,7 +5599,7 @@ void HudGaugeWeaponEnergy::render(float frametime) continue; //Draw the weapon bright or normal depending if it's active or not. - if(x == Player_ship->weapons.current_primary_bank || (Player_ship->flags & SF_PRIMARY_LINKED)) { + if(x == Player_ship->weapons.current_primary_bank || (Player_ship->flags[Ship::Ship_Flags::Primary_linked])) { setGaugeColor(HUD_C_BRIGHT); } else { setGaugeColor(HUD_C_NORMAL); @@ -5642,8 +5651,8 @@ void HudGaugeWeaponEnergy::render(float frametime) sw = &Player_ship->weapons; // show ballistic ammunition in energy gauge if need be - if ( Show_ballistic && Ship_info[Player_ship->ship_info_index].flags & SIF_BALLISTIC_PRIMARIES ) { - if ( Player_ship->flags & SF_PRIMARY_LINKED ) { + if ( Show_ballistic && Ship_info[Player_ship->ship_info_index].flags[Ship::Info_Flags::Ballistic_primaries] ) { + if ( Player_ship->flags[Ship::Ship_Flags::Primary_linked] ) { // go through all ballistic primaries and add up their ammunition totals and max capacities for ( i = 0; i < sw->num_primary_banks; i++ ) { @@ -5709,7 +5718,7 @@ void HudGaugeWeaponEnergy::render(float frametime) // list currently armed primary banks if we have to if ( Show_armed ) { - if ( Player_ship->flags & SF_PRIMARY_LINKED ) { + if ( Player_ship->flags[Ship::Ship_Flags::Primary_linked] ) { // show all primary banks for ( i = 0; i < Player_ship->weapons.num_primary_banks; i++ ) { wip = &Weapon_info[sw->primary_bank_weapons[i]]; @@ -6032,7 +6041,7 @@ void HudGaugeWeapons::render(float frametime) } // indicate if this is linked or currently armed - if ( ((sw->current_primary_bank == i) && !(Player_ship->flags & SF_PRIMARY_LINKED)) || ((Player_ship->flags & SF_PRIMARY_LINKED) && !(Weapon_info[sw->primary_bank_weapons[i]].wi_flags3 & WIF3_NOLINK))) { + if ( ((sw->current_primary_bank == i) && !(Player_ship->flags[Ship::Ship_Flags::Primary_linked])) || ((Player_ship->flags[Ship::Ship_Flags::Primary_linked]) && !(Weapon_info[sw->primary_bank_weapons[i]].wi_flags3 & WIF3_NOLINK))) { renderPrintf(position[0] + Weapon_plink_offset_x, name_y, EG_NULL, "%c", Weapon_link_icon); } @@ -6100,7 +6109,7 @@ void HudGaugeWeapons::render(float frametime) renderPrintf(position[0] + Weapon_sunlinked_offset_x, name_y, EG_NULL, "%c", Weapon_link_icon); // indicate if this is linked - if ( Player_ship->flags & SF_SECONDARY_DUAL_FIRE ) { + if ( Player_ship->flags[Ship::Ship_Flags::Secondary_dual_fire] ) { renderPrintf(position[0] + Weapon_slinked_offset_x, name_y, EG_NULL, "%c", Weapon_link_icon); } @@ -6900,7 +6909,7 @@ void HudGaugePrimaryWeapons::render(float frametime) } // indicate if this is linked or currently armed - if ( (sw->current_primary_bank == i) || (Player_ship->flags & SF_PRIMARY_LINKED) ) { + if ( (sw->current_primary_bank == i) || (Player_ship->flags[Ship::Ship_Flags::Primary_linked]) ) { renderPrintf(position[0] + _plink_offset_x, position[1] + text_y_offset, EG_NULL, "%c", Weapon_link_icon); } @@ -7014,7 +7023,7 @@ void HudGaugeSecondaryWeapons::render(float frametime) renderPrintf(position[0] + _sunlinked_offset_x, position[1] + text_y_offset, EG_NULL, "%c", Weapon_link_icon); // indicate if this is linked - if ( Player_ship->flags & SF_SECONDARY_DUAL_FIRE ) { + if ( Player_ship->flags[Ship::Ship_Flags::Secondary_dual_fire] ) { renderPrintf(position[0] + _slinked_offset_x, position[1] + text_y_offset, EG_NULL, "%c", Weapon_link_icon); } @@ -7216,7 +7225,7 @@ void HudGaugeHardpoints::render(float frametime) model_render_params weapon_render_info; - if ( swp->current_secondary_bank == i && ( swp->secondary_next_slot[i] == k || ( swp->secondary_next_slot[i]+1 == k && sp->flags & SF_SECONDARY_DUAL_FIRE ) ) ) { + if ( swp->current_secondary_bank == i && ( swp->secondary_next_slot[i] == k || ( swp->secondary_next_slot[i]+1 == k && sp->flags[Ship::Ship_Flags::Secondary_dual_fire] ) ) ) { weapon_render_info.set_color(Color_bright_blue); } else { weapon_render_info.set_color(Color_bright_white); diff --git a/code/hud/hudtargetbox.cpp b/code/hud/hudtargetbox.cpp index 8f09e479aa..ec748a9c22 100644 --- a/code/hud/hudtargetbox.cpp +++ b/code/hud/hudtargetbox.cpp @@ -621,7 +621,7 @@ void HudGaugeTargetBox::renderTargetShip(object *target_objp) // set glowmap flag here since model_render (etc) require an objnum to handle glowmaps // if we did pass the objnum, we'd also have thrusters drawn in the targetbox - if (target_shipp->flags2 & SF2_GLOWMAPS_DISABLED) { + if (target_shipp->flags[Ship::Ship_Flags::Glowmaps_disabled]) { flags |= MR_NO_GLOWMAPS; } @@ -967,7 +967,7 @@ void HudGaugeTargetBox::renderTargetWeapon(object *target_objp) // set glowmap flag here since model_render (etc) require an objnum to handle glowmaps // if we did pass the objnum, we'd also have thrusters drawn in the targetbox - if (homing_shipp->flags2 & SF2_GLOWMAPS_DISABLED) { + if (homing_shipp->flags[Ship::Ship_Flags::Glowmaps_disabled]) { flags |= MR_NO_GLOWMAPS; } } @@ -1435,7 +1435,7 @@ void HudGaugeExtraTargetData::render(float frametime) // Print out current orders if the targeted ship is friendly // AL 12-26-97: only show orders and time to target for friendly ships // Backslash: actually let's consult the IFF table. Maybe we want to show orders for certain teams, or hide orders for friendlies - if ( ((Player_ship->team == target_shipp->team) || ((Iff_info[target_shipp->team].flags & IFFF_ORDERS_SHOWN) && !(Iff_info[target_shipp->team].flags & IFFF_ORDERS_HIDDEN)) ) && !(ship_get_SIF(target_shipp) & SIF_NOT_FLYABLE) ) { + if ( ((Player_ship->team == target_shipp->team) || ((Iff_info[target_shipp->team].flags & IFFF_ORDERS_SHOWN) && !(Iff_info[target_shipp->team].flags & IFFF_ORDERS_HIDDEN)) ) && !(Ship_info[target_shipp->ship_info_index].is_flyable() ) ) { extra_data_shown=1; if ( ship_return_orders(outstr, target_shipp) ) { font::force_fit_string(outstr, 255, order_max_w); @@ -1762,8 +1762,8 @@ void HudGaugeTargetBox::renderTargetShipInfo(object *target_objp) } // print out 'disabled' on the monitor if the target is disabled - if ( (target_shipp->flags & SF_DISABLED) || (ship_subsys_disrupted(target_shipp, SUBSYSTEM_ENGINE)) ) { - if ( target_shipp->flags & SF_DISABLED ) { + if ( (target_shipp->flags[Ship::Ship_Flags::Disabled]) || (ship_subsys_disrupted(target_shipp, SUBSYSTEM_ENGINE)) ) { + if ( target_shipp->flags[Ship::Ship_Flags::Disabled] ) { strcpy_s(outstr, XSTR( "DISABLED", 342)); } else { strcpy_s(outstr, XSTR( "DISRUPTED", 343)); @@ -2248,7 +2248,7 @@ void hud_update_ship_status(object *targetp) if ( (targetp->instance >= 0) && (targetp->instance < MAX_SHIPS) ) { // print out status of ship for the targetbox - if ( (Ships[targetp->instance].flags & SF_DISABLED) || (ship_subsys_disrupted(&Ships[targetp->instance], SUBSYSTEM_ENGINE)) ) { + if ( (Ships[targetp->instance].flags[Ship::Ship_Flags::Disabled]) || (ship_subsys_disrupted(&Ships[targetp->instance], SUBSYSTEM_ENGINE)) ) { Current_ts = TS_DIS; } else { if ( Pl_target_integrity > 0.9 ) { diff --git a/code/hud/hudwingmanstatus.cpp b/code/hud/hudwingmanstatus.cpp index 80da2fc3c4..1bd02ea412 100644 --- a/code/hud/hudwingmanstatus.cpp +++ b/code/hud/hudwingmanstatus.cpp @@ -187,10 +187,10 @@ void hud_wingman_status_update() wing_index = shipp->wing_status_wing_index; wing_pos = shipp->wing_status_wing_pos; - if ( (wing_index >= 0) && (wing_pos >= 0) && !(ship_objp->flags & OF_SHOULD_BE_DEAD) ) { + if ( (wing_index >= 0) && (wing_pos >= 0) && !(ship_objp->flags[Object::Object_Flags::Should_be_dead]) ) { HUD_wingman_status[wing_index].used = 1; - if (!(shipp->flags & SF_DEPARTING) ) { + if (!(shipp->is_departing()) ) { HUD_wingman_status[wing_index].status[wing_pos] = HUD_WINGMAN_STATUS_ALIVE; } HUD_wingman_status[wing_index].hull[wing_pos] = get_hull_pct(ship_objp); diff --git a/code/iff_defs/iff_defs.cpp b/code/iff_defs/iff_defs.cpp index 2c30fb3146..f4901f08df 100644 --- a/code/iff_defs/iff_defs.cpp +++ b/code/iff_defs/iff_defs.cpp @@ -387,53 +387,18 @@ void iff_init() } } - // get default ship flags - iff->default_parse_flags = 0; - if (optional_string("$Default Ship Flags:")) - { - i = 0; - j = 0; - char flag_strings[MAX_PARSE_OBJECT_FLAGS][NAME_LENGTH]; - int num_strings = stuff_string_list(flag_strings, MAX_PARSE_OBJECT_FLAGS); - for (i = 0; i < num_strings; i++) - { - for (j = 0; j < MAX_PARSE_OBJECT_FLAGS; j++) - { - if (!stricmp(flag_strings[i], Parse_object_flags[j])) - { - iff->default_parse_flags |= (1 << j); - break; - } - } - } + // get default ship flags + iff->default_parse_flags.reset(); + if (optional_string("$Default Ship Flags:")) + { + parse_string_flag_list>(&iff->default_parse_flags, Parse_object_flags, num_parse_object_flags, NULL); + } - if (j == MAX_PARSE_OBJECT_FLAGS) - Warning(LOCATION, "Bogus string in iff default ship flags: %s\n", flag_strings[i]); - } - - // again - iff->default_parse_flags2 = 0; - if (optional_string("$Default Ship Flags2:")) - { - i = 0; - j = 0; - char flag_strings[MAX_PARSE_OBJECT_FLAGS_2][NAME_LENGTH]; - int num_strings = stuff_string_list(flag_strings, MAX_PARSE_OBJECT_FLAGS_2); - for (i = 0; i < num_strings; i++) - { - for (j = 0; j < MAX_PARSE_OBJECT_FLAGS_2; j++) - { - if (!stricmp(flag_strings[i], Parse_object_flags_2[j])) - { - iff->default_parse_flags2 |= (1 << j); - break; - } - } - } - - if (j == MAX_PARSE_OBJECT_FLAGS_2) - Warning(LOCATION, "Bogus string in iff default ship flags2: %s\n", flag_strings[i]); - } + // again, for compatibility reasons + if (optional_string("$Default Ship Flags2:")) + { + parse_string_flag_list>(&iff->default_parse_flags, Parse_object_flags, num_parse_object_flags, NULL); + } // this is cleared between each level but let's just set it here for thoroughness iff->ai_rearm_timestamp = timestamp(-1); diff --git a/code/iff_defs/iff_defs.h b/code/iff_defs/iff_defs.h index f6a1ad660b..fc27b735cf 100644 --- a/code/iff_defs/iff_defs.h +++ b/code/iff_defs/iff_defs.h @@ -12,6 +12,7 @@ #include "globalincs/globals.h" #include "globalincs/pstypes.h" #include "graphics/2d.h" +#include "mission/mission_flags.h" class object; @@ -43,8 +44,7 @@ typedef struct iff_info { // flags int flags; - int default_parse_flags; - int default_parse_flags2; + flagset default_parse_flags; // used internally, not parsed int ai_rearm_timestamp; diff --git a/code/io/keycontrol.cpp b/code/io/keycontrol.cpp index 4f423d53f9..cd502548b6 100644 --- a/code/io/keycontrol.cpp +++ b/code/io/keycontrol.cpp @@ -497,7 +497,7 @@ void debug_cycle_player_ship(int delta) si_index = static_cast(Ship_info.size() - 1); } sip = &Ship_info[si_index]; - if ( sip->flags & SIF_PLAYER_SHIP ){ + if ( sip->flags[Ship::Info_Flags::Player_ship] ){ break; } @@ -552,7 +552,7 @@ void debug_cycle_targeted_ship(int delta) if ( strstr(name,NOX("test")) != NULL ) continue; - if ( sip->species == species && (sip->flags & (SIF_FIGHTER | SIF_BOMBER | SIF_TRANSPORT) ) ) + if (sip->species == species && (sip->is_fighter_bomber() || sip->flags[Ship::Info_Flags::Transport])) break; // just in case @@ -588,7 +588,7 @@ void debug_max_primary_weapons(object *objp) // Goober5000 ship_weapon *swp = &shipp->weapons; weapon_info *wip; - if (sip->flags & SIF_BALLISTIC_PRIMARIES) + if (sip->flags[Ship::Info_Flags::Ballistic_primaries]) { for ( index = 0; index < MAX_SHIP_PRIMARY_BANKS; index++ ) { @@ -709,11 +709,12 @@ void process_debug_keys(int k) case KEY_DEBUGGED + KEY_C: case KEY_DEBUGGED1 + KEY_C: - if(Player_obj->flags & OF_COLLIDES){ - obj_set_flags(Player_obj, Player_obj->flags & ~(OF_COLLIDES)); + + if(Player_obj->flags[Object::Object_Flags::Collides]){ + obj_set_flags(Player_obj, Player_obj->flags - Object::Object_Flags::Collides); HUD_sourced_printf(HUD_SOURCE_HIDDEN, "Player no longer collides"); - } else { - obj_set_flags(Player_obj, Player_obj->flags | OF_COLLIDES); + } else { + obj_set_flags(Player_obj, Player_obj->flags + Object::Object_Flags::Collides); HUD_sourced_printf(HUD_SOURCE_HIDDEN, "Player collides"); } break; @@ -862,7 +863,7 @@ void process_debug_keys(int k) if ( sp->subsys_info[SUBSYSTEM_ENGINE].aggregate_current_hits <= 0.0f ) { mission_log_add_entry(LOG_SHIP_DISABLED, sp->ship_name, NULL ); - sp->flags |= SF_DISABLED; // add the disabled flag + sp->flags.set(Ship::Ship_Flags::Disabled); // add the disabled flag } if ( sp->subsys_info[SUBSYSTEM_TURRET].aggregate_current_hits <= 0.0f ) { @@ -890,8 +891,8 @@ void process_debug_keys(int k) // Select next object to be viewed by AI. case KEY_DEBUGGED + KEY_I: case KEY_DEBUGGED1 + KEY_I: - Player_obj->flags ^= OF_INVULNERABLE; - HUD_sourced_printf(HUD_SOURCE_HIDDEN, XSTR( "You are %s", 10), Player_obj->flags & OF_INVULNERABLE ? XSTR( "now INVULNERABLE!", 11) : XSTR( "no longer invulnerable...", 12)); + Player_obj->flags.toggle(Object::Object_Flags::Invulnerable); + HUD_sourced_printf(HUD_SOURCE_HIDDEN, XSTR( "You are %s", 10), Player_obj->flags[Object::Object_Flags::Invulnerable] ? XSTR( "now INVULNERABLE!", 11) : XSTR( "no longer invulnerable...", 12)); break; case KEY_DEBUGGED + KEY_SHIFTED + KEY_I: @@ -899,8 +900,8 @@ void process_debug_keys(int k) if (Player_ai->target_objnum != -1) { object *objp = &Objects[Player_ai->target_objnum]; - objp->flags ^= OF_INVULNERABLE; - HUD_sourced_printf(HUD_SOURCE_HIDDEN, XSTR( "Player's target [%s] is %s", 13), Ships[objp->instance].ship_name, objp->flags & OF_INVULNERABLE ? XSTR( "now INVULNERABLE!", 11) : XSTR( "no longer invulnerable...", 12)); + objp->flags.toggle(Object::Object_Flags::Invulnerable); + HUD_sourced_printf(HUD_SOURCE_HIDDEN, XSTR( "Player's target [%s] is %s", 13), Ships[objp->instance].ship_name, objp->flags[Object::Object_Flags::Invulnerable] ? XSTR( "now INVULNERABLE!", 11) : XSTR( "no longer invulnerable...", 12)); } break; @@ -1587,7 +1588,7 @@ void game_process_cheats(int k) ship_idx++; } while(1); - shipp->flags |= SF_ESCORT; + shipp->flags.set(Ship::Ship_Flags::Escort); shipp->escort_priority = 1000 - ship_idx; // now make sure we're not colliding with anyone @@ -1646,7 +1647,7 @@ void game_process_keys() } //If topdown view in non-2D mission, go back to cockpit view. - if ( (Viewer_mode & VM_TOPDOWN) && !(The_mission.flags & MISSION_FLAG_2D_MISSION) && !(Perspective_locked) ) { + if ( (Viewer_mode & VM_TOPDOWN) && !(The_mission.flags[Mission::Mission_Flags::Mission_2d]) && !(Perspective_locked) ) { Viewer_mode &= ~VM_TOPDOWN; break; } @@ -1756,7 +1757,7 @@ int button_function_critical(int n, net_player *p = NULL) npl = p; at_self = 0; - if ( NETPLAYER_IS_DEAD(npl) || (Ships[Objects[pl->objnum].instance].flags & SF_DYING) ) + if ( NETPLAYER_IS_DEAD(npl) || (Ships[Objects[pl->objnum].instance].flags[Ship::Ship_Flags::Dying]) ) return 0; } @@ -1768,7 +1769,7 @@ int button_function_critical(int n, net_player *p = NULL) ship * shipp = &Ships[objp->instance]; ship_weapon *swp = &shipp->weapons; ship_info *sip = &Ship_info[shipp->ship_info_index]; - if (sip->flags2 & SIF2_DYN_PRIMARY_LINKING) { + if (sip->flags[Ship::Info_Flags::Dyn_primary_linking]) { polymodel *pm = model_get( sip->model_num ); count = (int)ftables.getNext( pm->gun_banks[ swp->current_primary_bank ].num_slots, swp->primary_bank_slot_count[ swp->current_primary_bank ] ); swp->primary_bank_slot_count[ swp->current_primary_bank ] = count; @@ -1858,15 +1859,15 @@ int button_function_critical(int n, net_player *p = NULL) int firepoints = pm->missile_banks[Ships[objp->instance].weapons.current_secondary_bank].num_slots; - if ( Ships[objp->instance].flags & SF_SECONDARY_DUAL_FIRE || firepoints < 2) { - Ships[objp->instance].flags &= ~SF_SECONDARY_DUAL_FIRE; + if (Ships[objp->instance].flags[Ship::Ship_Flags::Secondary_dual_fire] || firepoints < 2) { + Ships[objp->instance].flags.remove(Ship::Ship_Flags::Secondary_dual_fire); if(at_self) { HUD_sourced_printf(HUD_SOURCE_HIDDEN, XSTR( "Secondary weapon set to normal fire mode", 34)); snd_play( &Snds[ship_get_sound(Player_obj, SND_SECONDARY_CYCLE)] ); hud_gauge_popup_start(HUD_WEAPONS_GAUGE); } } else { - Ships[objp->instance].flags |= SF_SECONDARY_DUAL_FIRE; + Ships[objp->instance].flags.set(Ship::Ship_Flags::Secondary_dual_fire); if(at_self) { HUD_sourced_printf(HUD_SOURCE_HIDDEN, XSTR( "Secondary weapon set to dual fire mode", 35)); snd_play( &Snds[ship_get_sound(Player_obj, SND_SECONDARY_CYCLE)] ); @@ -2231,7 +2232,7 @@ int button_function(int n) } // Goober5000 - if the ship doesn't have subspace drive, jump key doesn't work: so test and exit early - if (Player_ship->flags2 & SF2_NO_SUBSPACE_DRIVE) + if (Player_ship->flags[Ship::Ship_Flags::No_subspace_drive]) { switch(n) { @@ -2242,7 +2243,7 @@ int button_function(int n) } // Goober5000 - if we have primitive sensors, some keys don't work: so test and exit early - if (Player_ship->flags2 & SF2_PRIMITIVE_SENSORS) + if (Player_ship->flags[Ship::Ship_Flags::Primitive_sensors]) { switch (n) { @@ -2323,7 +2324,7 @@ int button_function(int n) case INCREASE_ENGINE: // increase energy to engines case DECREASE_ENGINE: // decrease energy to engines case ETS_EQUALIZE: - if ((Player_ship->flags2 & SF2_NO_ETS) == 0) { + if ((Player_ship->flags[Ship::Ship_Flags::No_ets]) == 0) { hud_gauge_popup_start(HUD_ETS_GAUGE); return button_function_critical(n); } @@ -2501,7 +2502,7 @@ int button_function(int n) // Autopilot key control case AUTO_PILOT_TOGGLE: - if (!(The_mission.flags & MISSION_FLAG_DEACTIVATE_AP)) { + if (!(The_mission.flags[Mission::Mission_Flags::Deactivate_ap])) { if (AutoPilotEngaged) { if (Cmdline_autopilot_interruptable == 1) //allow WCS to disable autopilot interrupt via commandline EndAutoPilot(); diff --git a/code/jumpnode/jumpnode.cpp b/code/jumpnode/jumpnode.cpp index 4d709df251..ee036f9e6d 100644 --- a/code/jumpnode/jumpnode.cpp +++ b/code/jumpnode/jumpnode.cpp @@ -53,7 +53,9 @@ CJumpNode::CJumpNode(vec3d *position) : m_radius(0.0f), m_modelnum(-1), m_objnum m_pos.xyz.z = position->xyz.z; // Create the object - m_objnum = obj_create(OBJ_JUMP_NODE, -1, -1, NULL, &m_pos, m_radius, OF_RENDERS); + flagset default_flags; + default_flags.set(Object::Object_Flags::Renders); + m_objnum = obj_create(OBJ_JUMP_NODE, -1, -1, NULL, &m_pos, m_radius, default_flags); } CJumpNode::CJumpNode(CJumpNode&& other) diff --git a/code/lab/lab.cpp b/code/lab/lab.cpp index acf8d18e6b..dd5e936950 100644 --- a/code/lab/lab.cpp +++ b/code/lab/lab.cpp @@ -641,7 +641,7 @@ void labviewer_add_model_thrusters(model_render_params *render_info, ship_info * // Add noise to thruster geometry. if ( Lab_mode == LAB_MODE_SHIP ) { - if (!(sip->flags2 & SIF2_NO_THRUSTER_GEO_NOISE)) { + if (!(sip->flags[Ship::Info_Flags::No_thruster_geo_noise])) { mst.length.xyz.z *= (1.0f + frand()/5.0f - 0.1f); mst.length.xyz.y *= (1.0f + frand()/5.0f - 0.1f); mst.length.xyz.x *= (1.0f + frand()/5.0f - 0.1f); @@ -706,9 +706,9 @@ void labviewer_render_model(float frametime) rev_rate = REVOLUTION_RATE; if (sip != NULL) { - if (sip->flags & SIF_BIG_SHIP) { + if (sip->is_big_ship()) { rev_rate *= 1.7f; - } else if (sip->flags & SIF_HUGE_SHIP) { + } else if (sip->is_huge_ship()) { rev_rate *= 3.0f; } @@ -1391,8 +1391,6 @@ void labviewer_flags_add(int *X, int *Y, char *flag_name, int flag, bool flags2 void labviewer_populate_flags_window() { - int y; - if (Lab_mode == LAB_MODE_NONE) { return; } @@ -1403,71 +1401,19 @@ void labviewer_populate_flags_window() // clear out anything that already exists labviewer_flags_clear(); - - y = 0; - - // ship flags ... - if (Lab_mode == LAB_MODE_SHIP) { - labviewer_flags_add(NULL, &y, "SUPPORT", SIF_SUPPORT); - labviewer_flags_add(NULL, &y, "CARGO", SIF_CARGO); - labviewer_flags_add(NULL, &y, "FIGHTER", SIF_FIGHTER); - labviewer_flags_add(NULL, &y, "BOMBER", SIF_BOMBER); - labviewer_flags_add(NULL, &y, "CRUISER", SIF_CRUISER); - labviewer_flags_add(NULL, &y, "CORVETTE", SIF_CORVETTE); - labviewer_flags_add(NULL, &y, "FREIGHTER", SIF_FREIGHTER); - labviewer_flags_add(NULL, &y, "CAPITAL", SIF_CAPITAL); - labviewer_flags_add(NULL, &y, "TRANSPORT", SIF_TRANSPORT); - labviewer_flags_add(NULL, &y, "NAVBUOY", SIF_NAVBUOY); - labviewer_flags_add(NULL, &y, "SENTRYGUN", SIF_SENTRYGUN); - labviewer_flags_add(NULL, &y, "ESCAPEPOD", SIF_ESCAPEPOD); - labviewer_flags_add(NULL, &y, "GAS MINER", SIF_GAS_MINER); - labviewer_flags_add(NULL, &y, "AWACS", SIF_AWACS); - labviewer_flags_add(NULL, &y, "STEALTH", SIF_STEALTH); - labviewer_flags_add(NULL, &y, "SUPERCAP", SIF_SUPERCAP); - labviewer_flags_add(NULL, &y, "KNOSSOS DEVICE", SIF_KNOSSOS_DEVICE); - labviewer_flags_add(NULL, &y, "DRYDOCK", SIF_DRYDOCK); - labviewer_flags_add(NULL, &y, "SHIP COPY", SIF_SHIP_COPY); - labviewer_flags_add(NULL, &y, "BIG DAMAGE", SIF_BIG_DAMAGE); - labviewer_flags_add(NULL, &y, "HAS AWACS", SIF_HAS_AWACS); - labviewer_flags_add(NULL, &y, "NO COLLIDE INVISIBLE", SIF_SHIP_CLASS_DONT_COLLIDE_INVIS); - labviewer_flags_add(NULL, &y, "DO COLLISION CHECK", SIF_NO_COLLIDE); - labviewer_flags_add(NULL, &y, "PLAYER SHIP", SIF_PLAYER_SHIP); - labviewer_flags_add(NULL, &y, "DEFAULT PLAYER SHIP", SIF_DEFAULT_PLAYER_SHIP); - labviewer_flags_add(NULL, &y, "BALLISTIC PRIMARIES", SIF_BALLISTIC_PRIMARIES); - labviewer_flags_add(NULL, &y, "FLASH", SIF2_FLASH, true); - labviewer_flags_add(NULL, &y, "SURFACE SHIELDS", SIF2_SURFACE_SHIELDS, true); - labviewer_flags_add(NULL, &y, "SHOW SHIP MODEL", SIF2_SHOW_SHIP_MODEL, true); - labviewer_flags_add(NULL, &y, "IN TECH DATABASE", SIF_IN_TECH_DATABASE); - labviewer_flags_add(NULL, &y, "IN TECH DATABASE MULTI", SIF_IN_TECH_DATABASE_M); - } - // weapon flags ... - else if (Lab_mode == LAB_MODE_WEAPON) { - labviewer_flags_add(NULL, &y, "HEAT SEEKING", WIF_HOMING_HEAT); - labviewer_flags_add(NULL, &y, "ASPECT SEEKING", WIF_HOMING_ASPECT); - labviewer_flags_add(NULL, &y, "ELECTRONICS", WIF_ELECTRONICS); - labviewer_flags_add(NULL, &y, "PUNCTURE", WIF_PUNCTURE); - labviewer_flags_add(NULL, &y, "SUPERCAP", WIF_SUPERCAP); - labviewer_flags_add(NULL, &y, "COUNTERMEASURE", WIF_CMEASURE); - labviewer_flags_add(NULL, &y, "BIG ONLY", WIF_BIG_ONLY); - labviewer_flags_add(NULL, &y, "HUGE", WIF_HUGE); - labviewer_flags_add(NULL, &y, "PLAYER ALLOWED", WIF_PLAYER_ALLOWED); - labviewer_flags_add(NULL, &y, "PARTICLE SPEW", WIF_PARTICLE_SPEW); - labviewer_flags_add(NULL, &y, "EMP", WIF_EMP); - labviewer_flags_add(NULL, &y, "ENERGY SUCK", WIF_ENERGY_SUCK); - labviewer_flags_add(NULL, &y, "SHUDDER", WIF_SHUDDER); - labviewer_flags_add(NULL, &y, "BALLISTIC", WIF2_BALLISTIC, true); - labviewer_flags_add(NULL, &y, "PIERCE SHIELDS", WIF2_PIERCE_SHIELDS, true); - labviewer_flags_add(NULL, &y, "CYCLE", WIF2_CYCLE, true); - labviewer_flags_add(NULL, &y, "NO LIGHTING", WIF2_MR_NO_LIGHTING, true); - labviewer_flags_add(NULL, &y, "TRANSPARENT", WIF2_TRANSPARENT, true); - labviewer_flags_add(NULL, &y, "IN TECH DATABASE", WIF_IN_TECH_DATABASE); - } + + // ship flags ... + if (Lab_mode == LAB_MODE_SHIP) { + //Needs reimplementation + } + // weapon flags ... + else if (Lab_mode == LAB_MODE_WEAPON) { + //Needs reimplementation + } } void labviewer_update_flags_window() { - size_t i; - if ( (Lab_selected_index < 0) || (Lab_mode == LAB_MODE_NONE) ) { return; } @@ -1478,27 +1424,12 @@ void labviewer_update_flags_window() } - if (Lab_mode == LAB_MODE_SHIP) { - ship_info *sip = &Ship_info[Lab_selected_index]; - - for (i = 0; i < Lab_flags.size(); i++) { - if (Lab_flags[i].second) { - Lab_flags[i].cb->SetFlag(&sip->flags2, Lab_flags[i].flag); - } else { - Lab_flags[i].cb->SetFlag(&sip->flags, Lab_flags[i].flag); - } - } - } else if (Lab_mode == LAB_MODE_WEAPON) { - weapon_info *wip = &Weapon_info[Lab_selected_index]; - - for (i = 0; i < Lab_flags.size(); i++) { - if (Lab_flags[i].second) { - Lab_flags[i].cb->SetFlag(&wip->wi_flags2, Lab_flags[i].flag); - } else { - Lab_flags[i].cb->SetFlag(&wip->wi_flags, Lab_flags[i].flag); - } - } - } + if (Lab_mode == LAB_MODE_SHIP) { + //Needs reimplementation + } + else if (Lab_mode == LAB_MODE_WEAPON) { + //Needs reimplementation + } } void labviewer_close_flags_window(GUIObject *caller) diff --git a/code/menuui/techmenu.cpp b/code/menuui/techmenu.cpp index a3e757a7f1..0fadb8932a 100644 --- a/code/menuui/techmenu.cpp +++ b/code/menuui/techmenu.cpp @@ -464,7 +464,7 @@ void techroom_ships_render(float frametime) // now render the trackball ship, which is unique to the ships tab float rev_rate = REVOLUTION_RATE; angles rot_angles, view_angles; - int z, i, j; + int i, j; ship_info *sip = &Ship_info[Cur_entry_index]; model_render_params render_info; @@ -473,11 +473,10 @@ void techroom_ships_render(float frametime) } // get correct revolution rate - z = sip->flags; - if (z & SIF_BIG_SHIP) { + if (sip->is_big_ship()) { rev_rate *= 1.7f; } - if (z & SIF_HUGE_SHIP) { + if (sip->is_huge_ship()) { rev_rate *= 3.0f; } @@ -578,7 +577,7 @@ void techroom_ships_render(float frametime) uint render_flags = MR_AUTOCENTER; - if(sip->flags2 & SIF2_NO_LIGHTING) + if(sip->flags[Ship::Info_Flags::No_lighting]) render_flags |= MR_NO_LIGHTING; render_info.set_flags(render_flags); @@ -737,7 +736,8 @@ void techroom_anim_render(float frametime) void techroom_change_tab(int num) { - int i, multi = 0, mask, mask2, font_height, max_num_entries_viewable; + int multi = 0, wi_mask, wi_mask2, font_height, max_num_entries_viewable; + Ship::Info_Flags si_mask, si_mask2; //unload the current animation, we load another one for the new current entry if(Tab != SHIPS_DATA_TAB) @@ -748,7 +748,7 @@ void techroom_change_tab(int num) Cur_entry = 0; multi = Player->flags & PLAYER_FLAGS_IS_MULTI; - for (i=0; iflags & mask) || (it->flags2 & mask2)) + if (Techroom_show_all || (it->flags[si_mask]) || (it->flags[si_mask2])) { // this ship should be displayed, fill out the entry struct Ship_list[Ship_list_size].bitmap = -1; @@ -788,9 +788,9 @@ void techroom_change_tab(int num) Ship_list[Ship_list_size].model_num = -1; Ship_list[Ship_list_size].textures_loaded = 0; - Ship_list_size++; - } - } + Ship_list_size++; + } + } // make sure that at least the default entry is cleared out if we didn't grab anything if (!Ship_info.empty() && !Ship_list_size) { @@ -829,12 +829,12 @@ void techroom_change_tab(int num) } Weapon_list_size = 0; - mask = multi ? WIF_PLAYER_ALLOWED : WIF_IN_TECH_DATABASE; - mask2 = WIF2_DEFAULT_IN_TECH_DATABASE; + wi_mask = multi ? WIF_PLAYER_ALLOWED : WIF_IN_TECH_DATABASE; + wi_mask2 = WIF2_DEFAULT_IN_TECH_DATABASE; - for (i=0; iflags2 & SIF2_DEFAULT_IN_TECH_DATABASE) - it->flags |= SIF_IN_TECH_DATABASE; - else - it->flags &= ~SIF_IN_TECH_DATABASE; + for (auto it = Ship_info.begin(); it != Ship_info.end(); ++it) + { + if (it->flags[Ship::Info_Flags::Default_in_tech_database]) + it->flags.set(Ship::Info_Flags::In_tech_database); + else + it->flags.remove(Ship::Info_Flags::Default_in_tech_database); + + if (it->flags[Ship::Info_Flags::Default_in_tech_database_m]) + it->flags.set(Ship::Info_Flags::In_tech_database_m); + else + it->flags.remove(Ship::Info_Flags::Default_in_tech_database_m); + } - if (it->flags2 & SIF2_DEFAULT_IN_TECH_DATABASE_M) - it->flags |= SIF_IN_TECH_DATABASE_M; - else - it->flags &= ~SIF_IN_TECH_DATABASE_M; - } // weapons - for (i=0; iflags & SIF_PLAYER_SHIP ) - Campaign.ships_allowed[std::distance(Ship_info.cbegin(), it)] = 1; - } + // set allowable ships to the SIF_PLAYER_SHIPs + memset(Campaign.ships_allowed, 0, sizeof(Campaign.ships_allowed)); + for (auto it = Ship_info.cbegin(); it != Ship_info.cend(); ++it) { + if (it->flags[Ship::Info_Flags::Player_ship]) + Campaign.ships_allowed[std::distance(Ship_info.cbegin(), it)] = 1; + } - for (i = 0; i < MAX_WEAPON_TYPES; i++ ) - Campaign.weapons_allowed[i] = 1; + for (i = 0; i < MAX_WEAPON_TYPES; i++) + Campaign.weapons_allowed[i] = 1; - if ( optional_string("+Starting Ships:") ) { - for (i = 0; i < static_cast(Ship_info.size()); i++ ) - Campaign.ships_allowed[i] = 0; + if (optional_string("+Starting Ships:")) { + for (i = 0; i < static_cast(Ship_info.size()); i++) + Campaign.ships_allowed[i] = 0; - count = stuff_int_list(ship_list, MAX_SHIP_CLASSES, SHIP_INFO_TYPE); + count = stuff_int_list(ship_list, MAX_SHIP_CLASSES, SHIP_INFO_TYPE); - // now set the array elements stating which ships we are allowed - for (i = 0; i < count; i++ ) { - if ( Ship_info[ship_list[i]].flags & SIF_PLAYER_SHIP ) - Campaign.ships_allowed[ship_list[i]] = 1; - } - } + // now set the array elements stating which ships we are allowed + for (i = 0; i < count; i++) { + if (Ship_info[ship_list[i]].flags[Ship::Info_Flags::Player_ship]) + Campaign.ships_allowed[ship_list[i]] = 1; + } + } - if ( optional_string("+Starting Weapons:") ) { - for (i = 0; i < MAX_WEAPON_TYPES; i++ ) - Campaign.weapons_allowed[i] = 0; + if (optional_string("+Starting Weapons:")) { + for (i = 0; i < MAX_WEAPON_TYPES; i++) + Campaign.weapons_allowed[i] = 0; - count = stuff_int_list(weapon_list, MAX_WEAPON_TYPES, WEAPON_POOL_TYPE); + count = stuff_int_list(weapon_list, MAX_WEAPON_TYPES, WEAPON_POOL_TYPE); - // now set the array elements stating which ships we are allowed - for (i = 0; i < count; i++ ) - Campaign.weapons_allowed[weapon_list[i]] = 1; - } + // now set the array elements stating which ships we are allowed + for (i = 0; i < count; i++) + Campaign.weapons_allowed[weapon_list[i]] = 1; + } } /** @@ -1833,7 +1833,7 @@ void mission_campaign_skip_to_next(int start_game) // closes out mission stuff, sets up next one mission_campaign_mission_over(); - if ( Campaign.next_mission == -1 || (The_mission.flags & MISSION_FLAG_END_TO_MAINHALL) ) { + if ( Campaign.next_mission == -1 || (The_mission.flags[Mission::Mission_Flags::End_to_mainhall]) ) { // go to main hall, either the campaign is over or the FREDer requested it. gameseq_post_event(GS_EVENT_MAIN_MENU); } else { diff --git a/code/mission/missionhotkey.cpp b/code/mission/missionhotkey.cpp index f615e9ea4e..94117ab373 100644 --- a/code/mission/missionhotkey.cpp +++ b/code/mission/missionhotkey.cpp @@ -607,7 +607,7 @@ int hotkey_build_team_listing(int enemy_team_mask, int y, bool list_enemies) continue; // don't process ships invisible to sensors, dying or departing - if ( Ships[shipnum].flags & (SF_HIDDEN_FROM_SENSORS|SF_DYING|SF_DEPARTING) ) + if ( Ships[shipnum].flags[Ship::Ship_Flags::Hidden_from_sensors] || Ships[shipnum].is_dying_or_departing() ) continue; // if a ship's hotkey is the last hotkey on the list, then maybe make the hotkey -1 if @@ -641,7 +641,7 @@ int hotkey_build_team_listing(int enemy_team_mask, int y, bool list_enemies) // don't add any wing data whose ships are hidden from sensors for ( j = 0; j < Wings[i].current_count; j++ ) { - if ( Ships[Wings[i].ship_index[j]].flags & SF_HIDDEN_FROM_SENSORS ) + if ( Ships[Wings[i].ship_index[j]].flags[Ship::Ship_Flags::Hidden_from_sensors] ) break; } // if we didn't reach the end of the list, don't display the wing diff --git a/code/mission/missionlog.cpp b/code/mission/missionlog.cpp index 4f0d42966a..9d3e0679c6 100644 --- a/code/mission/missionlog.cpp +++ b/code/mission/missionlog.cpp @@ -294,7 +294,7 @@ void mission_log_add_entry(int type, char *pname, char *sname, int info_index) } else { nprintf(("missionlog", "No secondary name for ship destroyed log entry!\n")); } - } else if ( (type == LOG_SHIP_SUBSYS_DESTROYED) && (Ship_info[Ships[index].ship_info_index].flags & SIF_SMALL_SHIP) ) { + } else if ( (type == LOG_SHIP_SUBSYS_DESTROYED) && (Ship_info[Ships[index].ship_info_index].is_small_ship()) ) { // make subsystem destroyed entries for small ships hidden entry->flags |= MLF_HIDDEN; } else if ( (type == LOG_SHIP_ARRIVED) && (Ships[index].wingnum != -1 ) ) { diff --git a/code/mission/missionmessage.cpp b/code/mission/missionmessage.cpp index 761cdebc49..f7da574594 100644 --- a/code/mission/missionmessage.cpp +++ b/code/mission/missionmessage.cpp @@ -1336,7 +1336,7 @@ void message_queue_process() // see if the ship sending this message is dying. If do, kill wave and anim if ( Playing_messages[i].shipnum != -1 ) { - if ( (Ships[Playing_messages[i].shipnum].flags & SF_DYING) && (Playing_messages[i].builtin_type != MESSAGE_WINGMAN_SCREAM) ) { + if ( (Ships[Playing_messages[i].shipnum].flags[Ship::Ship_Flags::Dying]) && (Playing_messages[i].builtin_type != MESSAGE_WINGMAN_SCREAM) ) { int shipnum; shipnum = Playing_messages[i].shipnum; @@ -1347,7 +1347,7 @@ void message_queue_process() // MWA 3/24/98 -- save shipnum before killing message // Assert( shipnum >= 0 ); - if ( !(Ships[shipnum].flags & SF_SHIP_HAS_SCREAMED) && !(Ships[shipnum].flags2 & SF2_NO_DEATH_SCREAM) ) { + if ( !(Ships[shipnum].flags[Ship::Ship_Flags::Ship_has_screamed]) && !(Ships[shipnum].flags[Ship::Ship_Flags::No_death_scream]) ) { ship_scream( &Ships[shipnum] ); } continue; // this should keep us in the while() loop with same value of i. @@ -1547,7 +1547,7 @@ void message_queue_process() if (Message_shipnum < 0) { goto all_done; } - if (!((Ship_info[Ships[Message_shipnum].ship_info_index].flags & SIF_SMALL_SHIP) || (Ships[Message_shipnum].flags2 & SF2_ALWAYS_DEATH_SCREAM)) ) { + if (!(Ship_info[Ships[Message_shipnum].ship_info_index].is_small_ship() || (Ships[Message_shipnum].flags[Ship::Ship_Flags::Always_death_scream])) ) { goto all_done; } } @@ -1578,7 +1578,7 @@ void message_queue_process() ship *shipp = &Ships[Message_shipnum]; if ( shipp->callsign_index >= 0 ) { hud_stuff_ship_callsign( who_from, shipp ); - } else if ( ((Iff_info[shipp->team].flags & IFFF_WING_NAME_HIDDEN) && (shipp->wingnum != -1)) || (shipp->flags2 & SF2_HIDE_SHIP_NAME) ) { + } else if ( ((Iff_info[shipp->team].flags & IFFF_WING_NAME_HIDDEN) && (shipp->wingnum != -1)) || (shipp->flags[Ship::Ship_Flags::Hide_ship_name]) ) { hud_stuff_ship_class( who_from, shipp ); } else { end_string_at_first_hash_symbol(who_from); @@ -1714,7 +1714,8 @@ void message_queue_message( int message_num, int priority, int timing, char *who // type personas. ship is the ship we should assign a persona to int message_get_persona( ship *shipp ) { - int i = 0, ship_type, count; + int i = 0, count; + ship_info* sip; int *slist = new int[Num_personas]; memset( slist, 0, sizeof(int) * Num_personas ); @@ -1727,15 +1728,15 @@ int message_get_persona( ship *shipp ) } // get the type of ship (i.e. support, fighter/bomber, etc) - ship_type = Ship_info[shipp->ship_info_index].flags; + sip = &Ship_info[shipp->ship_info_index]; int persona_needed; count = 0; - if ( ship_type & (SIF_FIGHTER|SIF_BOMBER) ) + if ( sip->is_fighter_bomber() ) { persona_needed = PERSONA_FLAG_WINGMAN; - } else if ( ship_type & SIF_SUPPORT ) + } else if ( sip->flags[Ship::Info_Flags::Support] ) { persona_needed = PERSONA_FLAG_SUPPORT; } @@ -1935,11 +1936,11 @@ void message_send_builtin_to_player( int type, ship *shipp, int priority, int ti // if we aren't showing builtin msgs, bail - if (The_mission.flags & MISSION_FLAG_NO_BUILTIN_MSGS) + if (The_mission.flags[Mission::Mission_Flags::No_builtin_msgs]) return; // Karajorma - If we aren't showing builtin msgs from command and this is not a ship, bail - if ( (shipp == NULL) && (The_mission.flags & MISSION_FLAG_NO_BUILTIN_COMMAND) ) + if ( (shipp == NULL) && (The_mission.flags[Mission::Mission_Flags::No_builtin_command]) ) return; // builtin type isn't supported by this version of the table @@ -1964,7 +1965,7 @@ void message_send_builtin_to_player( int type, ship *shipp, int priority, int ti // see if there is a persona assigned to this ship. If not, then try to assign one!!! if ( shipp ) { // Karajorma - the game should assert if a silenced ship gets this far - Assert( !(shipp->flags2 & SF2_NO_BUILTIN_MESSAGES) ); + Assert( !(shipp->flags[Ship::Ship_Flags::No_builtin_messages]) ); if ( shipp->persona_index == -1 ) shipp->persona_index = message_get_persona( shipp ); @@ -1975,7 +1976,7 @@ void message_send_builtin_to_player( int type, ship *shipp, int priority, int ti nprintf(("messaging", "Couldn't find persona for %s\n", shipp->ship_name )); // be sure that this ship can actually send a message!!! (i.e. not-not-flyable -- get it!) - Assert( !(Ship_info[shipp->ship_info_index].flags & SIF_NOT_FLYABLE) ); // get allender or alan + Assert( !Ship_info[shipp->ship_info_index].is_flyable() ); // get allender or alan } else { persona_index = The_mission.command_persona; // use the terran command persona } diff --git a/code/mission/missionparse.cpp b/code/mission/missionparse.cpp index a0d5e2d04f..294f2205a6 100644 --- a/code/mission/missionparse.cpp +++ b/code/mission/missionparse.cpp @@ -257,63 +257,61 @@ char *Old_game_types[OLD_MAX_GAME_TYPES] = { "Training mission" }; -char *Parse_object_flags[MAX_PARSE_OBJECT_FLAGS] = { - "cargo-known", - "ignore-count", - "protect-ship", - "reinforcement", - "no-shields", - "escort", - "player-start", - "no-arrival-music", - "no-arrival-warp", - "no-departure-warp", - "locked", - "invulnerable", - "hidden-from-sensors", - "scannable", - "kamikaze", - "no-dynamic", - "red-alert-carry", - "beam-protect-ship", - "flak-protect-ship", - "laser-protect-ship", - "missile-protect-ship", - "guardian", - "special-warp", - "vaporize", - "stealth", - "friendly-stealth-invisible", - "don't-collide-invisible", +flag_def_list_new Parse_object_flags[] = { + { "cargo-known", Mission::Parse_Object_Flags::SF_Cargo_known, true, false }, + { "ignore-count", Mission::Parse_Object_Flags::SF_Ignore_count, true, false }, + { "protect-ship", Mission::Parse_Object_Flags::OF_Protected, true, false }, + { "reinforcement", Mission::Parse_Object_Flags::SF_Reinforcement, true, false }, + { "no-shields", Mission::Parse_Object_Flags::OF_No_shields, true, false }, + { "escort", Mission::Parse_Object_Flags::SF_Escort, true, false }, + { "player-start", Mission::Parse_Object_Flags::OF_Player_start, true, false }, + { "no-arrival-music", Mission::Parse_Object_Flags::SF_No_arrival_music, true, false }, + { "no-arrival-warp", Mission::Parse_Object_Flags::SF_No_arrival_warp, true, false }, + { "no-departure-warp", Mission::Parse_Object_Flags::SF_No_departure_warp, true, false }, + { "locked", Mission::Parse_Object_Flags::SF_Locked, true, false }, + { "invulnerable", Mission::Parse_Object_Flags::OF_Invulnerable, true, false }, + { "hidden-from-sensors", Mission::Parse_Object_Flags::SF_Hidden_from_sensors, true, false }, + { "scannable", Mission::Parse_Object_Flags::SF_Scannable, true, false }, + { "kamikaze", Mission::Parse_Object_Flags::AIF_Kamikaze, true, false }, + { "no-dynamic", Mission::Parse_Object_Flags::AIF_No_dynamic, true, false }, + { "red-alert-carry", Mission::Parse_Object_Flags::SF_Red_alert_store_status, true, false }, + { "beam-protect-ship", Mission::Parse_Object_Flags::OF_Beam_protected, true, false }, + { "flak-protect-ship", Mission::Parse_Object_Flags::OF_Flak_protected, true, false }, + { "laser-protect-ship", Mission::Parse_Object_Flags::OF_Laser_protected, true, false }, + { "missile-protect-ship", Mission::Parse_Object_Flags::OF_Missile_protected, true, false }, + { "guardian", Mission::Parse_Object_Flags::SF_Guardian, true, false }, + { "special-warp", Mission::Parse_Object_Flags::Knossos_warp_in, true, false }, + { "vaporize", Mission::Parse_Object_Flags::SF_Vaporize, true, false }, + { "stealth", Mission::Parse_Object_Flags::SF_Stealth, true, false }, + { "friendly-stealth-invisible", Mission::Parse_Object_Flags::SF_Friendly_stealth_invis, true, false }, + { "don't-collide-invisible", Mission::Parse_Object_Flags::SF_Dont_collide_invis, true, false }, + { "primitive-sensors", Mission::Parse_Object_Flags::SF_Primitive_sensors, true, false }, + { "no-subspace-drive", Mission::Parse_Object_Flags::SF_No_subspace_drive, true, false }, + { "nav-carry-status", Mission::Parse_Object_Flags::SF_Nav_carry_status, true, false }, + { "affected-by-gravity", Mission::Parse_Object_Flags::SF_Affected_by_gravity, true, false }, + { "toggle-subsystem-scanning", Mission::Parse_Object_Flags::SF_Toggle_subsystem_scanning, true, false }, + { "targetable-as-bomb", Mission::Parse_Object_Flags::OF_Targetable_as_bomb, true, false }, + { "no-builtin-messages", Mission::Parse_Object_Flags::SF_No_builtin_messages, true, false }, + { "primaries-locked", Mission::Parse_Object_Flags::SF_Primaries_locked, true, false }, + { "secondaries-locked", Mission::Parse_Object_Flags::SF_Secondaries_locked, true, false }, + { "no-death-scream", Mission::Parse_Object_Flags::SF_No_death_scream, true, false }, + { "always-death-scream", Mission::Parse_Object_Flags::SF_Always_death_scream, true, false }, + { "nav-needslink", Mission::Parse_Object_Flags::SF_Nav_needslink, true, false }, + { "hide-ship-name", Mission::Parse_Object_Flags::SF_Hide_ship_name, true, false }, + { "set-class-dynamically", Mission::Parse_Object_Flags::SF_Set_class_dynamically, true, false }, + { "lock-all-turrets", Mission::Parse_Object_Flags::SF_Lock_all_turrets_initially, true, false }, + { "afterburners-locked", Mission::Parse_Object_Flags::SF_Afterburner_locked, true, false }, + { "force-shields-on", Mission::Parse_Object_Flags::OF_Force_shields_on, true, false }, + { "immobile", Mission::Parse_Object_Flags::OF_Immobile, true, false }, + { "no-ets", Mission::Parse_Object_Flags::SF_No_ets, true, false }, + { "cloaked", Mission::Parse_Object_Flags::SF_Cloaked, true, false }, + { "ship-locked", Mission::Parse_Object_Flags::SF_Ship_locked, true, false }, + { "weapons-locked", Mission::Parse_Object_Flags::SF_Weapons_locked, true, false }, + { "scramble-messages", Mission::Parse_Object_Flags::SF_Scramble_messages, true, false }, + { "no_collide", Mission::Parse_Object_Flags::OF_No_collide, true, false }, }; -char *Parse_object_flags_2[MAX_PARSE_OBJECT_FLAGS_2] = { - "primitive-sensors", - "no-subspace-drive", - "nav-carry-status", - "affected-by-gravity", - "toggle-subsystem-scanning", - "targetable-as-bomb", - "no-builtin-messages", - "primaries-locked", - "secondaries-locked", - "no-death-scream", - "always-death-scream", - "nav-needslink", - "hide-ship-name", - "set-class-dynamically", - "lock-all-turrets", - "afterburners-locked", - "force-shields-on", - "immobile", - "no-ets", - "cloaked", - "ship-locked", - "weapons-locked", - "scramble-messages", - "no-collide", - "no-disabled-self-destruct", -}; +const size_t num_parse_object_flags = sizeof(Parse_object_flags) / sizeof(flag_def_list_new); char *Mission_event_log_flags[MAX_MISSION_EVENT_LOG_FLAGS] = { "true", @@ -433,7 +431,6 @@ void parse_custom_bitmap(const char *expected_string_640, const char *expected_s void parse_mission_info(mission *pm, bool basic = false) { - int i; char game_string[NAME_LENGTH]; // Goober5000 @@ -472,7 +469,7 @@ void parse_mission_info(mission *pm, bool basic = false) // old style missions may have carriage returns, deal with it here. ignore_white_space(); stuff_string(game_string, F_NAME, NAME_LENGTH); - for ( i = 0; i < OLD_MAX_GAME_TYPES; i++ ) { + for ( int i = 0; i < OLD_MAX_GAME_TYPES; i++ ) { if ( !stricmp(game_string, Old_game_types[i]) ) { // this block of code is now old mission compatibility code. We specify game @@ -500,9 +497,9 @@ void parse_mission_info(mission *pm, bool basic = false) stuff_int(&pm->game_type); } - pm->flags = 0; + pm->flags.reset(); if (optional_string("+Flags:")){ - stuff_int(&pm->flags); + stuff_flagset>(&pm->flags); } // nebula mission stuff @@ -558,21 +555,15 @@ void parse_mission_info(mission *pm, bool basic = false) int temp; stuff_int(&temp); - if (temp) - pm->flags |= MISSION_FLAG_RED_ALERT; - else - pm->flags &= ~MISSION_FLAG_RED_ALERT; - } + pm->flags.set(Mission::Mission_Flags::Red_alert, temp != 0); + } red_alert_invalidate_timestamp(); if ( optional_string("+Scramble:")) { int temp; stuff_int(&temp); - if (temp) - pm->flags |= MISSION_FLAG_SCRAMBLE; - else - pm->flags &= ~MISSION_FLAG_SCRAMBLE; + pm->flags.set(Mission::Mission_Flags::Scramble, temp != 0); } // if we are just requesting basic info then skip everything else. the reason @@ -601,9 +592,9 @@ void parse_mission_info(mission *pm, bool basic = false) // for each species, store whether support is available for (int species = 0; species < (int)Species_info.size(); species++) { - for (auto it = Ship_info.cbegin(); it != Ship_info.cend(); ++it) + for (auto it = Ship_info.cbegin(); it != Ship_info.cend(); ++it) { - if ((it->flags & SIF_SUPPORT) && (it->species == species)) + if ((it->flags[Ship::Info_Flags::Support]) && (it->species == species)) { pm->support_ships.support_available_for_species |= (1 << species); break; @@ -761,7 +752,7 @@ void parse_mission_info(mission *pm, bool basic = false) Assert( The_mission.ai_profile != NULL ); // Kazan - player use AI at start? - if (pm->flags & MISSION_FLAG_PLAYER_START_AI) + if (pm->flags[Mission::Mission_Flags::Player_start_ai]) Player_use_ai = 1; pm->sound_environment.id = -1; @@ -1642,7 +1633,7 @@ void position_ship_for_knossos_warpin(p_object *p_objp) { object *ship_objp = &Objects[so->objnum]; - if (Ship_info[Ships[ship_objp->instance].ship_info_index].flags & SIF_KNOSSOS_DEVICE) + if (Ship_info[Ships[ship_objp->instance].ship_info_index].flags[Ship::Info_Flags::Knossos_device]) { // be close to the right device (allow multiple knossoses) if ( vm_vec_dist_quick(&ship_objp->pos, &p_objp->pos) < 2.0f*(ship_objp->radius + objp->radius) ) @@ -1667,8 +1658,8 @@ void position_ship_for_knossos_warpin(p_object *p_objp) float desired_dist = -pm->mins.xyz.z; vm_vec_scale_add2(&objp->pos, &objp->orient.vec.fvec, (dist - desired_dist)); - // if ship is BIG or HUGE, make it go through the center of the knossos - if (Ship_info[shipp->ship_info_index].flags & SIF_HUGE_SHIP) + // if ship is HUGE, make it go through the center of the knossos + if (Ship_info[shipp->ship_info_index].is_huge_ship()) { vec3d offset; vm_vec_sub(&offset, &knossos_objp->pos, &new_point); @@ -1761,7 +1752,7 @@ int parse_create_object(p_object *pobjp) // we should only be calling this for dock leaders, because the dock leader // governs the creation of his entire group - Assert((pobjp->flags & P_SF_DOCK_LEADER)); + Assert((pobjp->flags[Mission::Parse_Object_Flags::SF_Dock_leader])); // if the leader will be destroyed before the mission starts, then *only* create the leader; // don't create the rest of the group (this is what retail did) @@ -1840,7 +1831,7 @@ int parse_create_object_sub(p_object *p_objp) // Goober5000 - if this object is being created because he's docked to something, // and he's in a wing, then mark the wing as having arrived - if (object_is_docked(p_objp) && !(p_objp->flags & P_SF_DOCK_LEADER) && (p_objp->wingnum >= 0)) + if (object_is_docked(p_objp) && !(p_objp->flags[Mission::Parse_Object_Flags::SF_Dock_leader]) && (p_objp->wingnum >= 0)) { if (!Fred_running) parse_bring_in_docked_wing(p_objp, p_objp->wingnum, shipnum); @@ -1848,7 +1839,7 @@ int parse_create_object_sub(p_object *p_objp) // if arriving through knossos, adjust objpj->pos to plane of knossos and set flag // special warp is single player only - if ((p_objp->flags & P_KNOSSOS_WARP_IN) && !(Game_mode & GM_MULTIPLAYER)) + if ((p_objp->flags[Mission::Parse_Object_Flags::Knossos_warp_in]) && !(Game_mode & GM_MULTIPLAYER)) { if (!Fred_running) position_ship_for_knossos_warpin(p_objp); @@ -2005,7 +1996,7 @@ int parse_create_object_sub(p_object *p_objp) } // check the parse object's flags for possible things to set on this newly created ship - resolve_parse_flags(&Objects[objnum], p_objp->flags, p_objp->flags2); + resolve_parse_flags(&Objects[objnum], p_objp->flags); // other flag checks @@ -2014,49 +2005,49 @@ int parse_create_object_sub(p_object *p_objp) // forcing the shields on or off depending on flags -- but only if shield strength supports it // no strength means we can't have shields, period - if (p_objp->ship_max_shield_strength == 0.0f) - Objects[objnum].flags |= OF_NO_SHIELDS; - // force shields on means we have them regardless of other flags; per r5332 this ranks above the next check - else if (p_objp->flags2 & P2_OF_FORCE_SHIELDS_ON) - Objects[objnum].flags &= ~OF_NO_SHIELDS; - // intrinsic no-shields means we have them off in-game - else if (!Fred_running && (sip->flags2 & SIF2_INTRINSIC_NO_SHIELDS)) - Objects[objnum].flags |= OF_NO_SHIELDS; + if (p_objp->ship_max_shield_strength == 0.0f) + Objects[objnum].flags.set(Object::Object_Flags::No_shields); + // force shields on means we have them regardless of other flags; per r5332 this ranks above the next check + else if (p_objp->flags[Mission::Parse_Object_Flags::OF_Force_shields_on]) + Objects[objnum].flags.remove(Object::Object_Flags::No_shields); + // intrinsic no-shields means we have them off in-game + else if (!Fred_running && (sip->flags[Ship::Info_Flags::Intrinsic_no_shields])) + Objects[objnum].flags.set(Object::Object_Flags::No_shields); // don't set the flag if the mission is ongoing in a multiplayer situation. This will be set by the players in the // game only before the game or during respawning. // MWA -- changed the next line to remove the !(Game_mode & GM_MULTIPLAYER). We shouldn't be setting // this flag in single player mode -- it gets set in post process mission. - if ((p_objp->flags & P_OF_PLAYER_START) && (Fred_running || ((Game_mode & GM_MULTIPLAYER) && !(Game_mode & GM_IN_MISSION)))) - Objects[objnum].flags |= OF_PLAYER_SHIP; + if ((p_objp->flags[Mission::Parse_Object_Flags::OF_Player_start]) && (Fred_running || ((Game_mode & GM_MULTIPLAYER) && !(Game_mode & GM_IN_MISSION)))) + Objects[objnum].flags.set(Object::Object_Flags::Player_ship); // a couple of ai_info flags. Also, do a reasonable default for the kamikaze damage regardless of // whether this flag is set or not - if (p_objp->flags & P_AIF_KAMIKAZE) + if (p_objp->flags[Mission::Parse_Object_Flags::AIF_Kamikaze]) { Ai_info[shipp->ai_index].ai_flags |= AIF_KAMIKAZE; Ai_info[shipp->ai_index].kamikaze_damage = p_objp->kamikaze_damage; } - if (p_objp->flags & P_AIF_NO_DYNAMIC) + if (p_objp->flags[Mission::Parse_Object_Flags::AIF_No_dynamic]) Ai_info[shipp->ai_index].ai_flags |= AIF_NO_DYNAMIC; - if (p_objp->flags & P_SF_RED_ALERT_STORE_STATUS) + if (p_objp->flags[Mission::Parse_Object_Flags::SF_Red_alert_store_status]) { if (!(Game_mode & GM_MULTIPLAYER)) { - shipp->flags |= SF_RED_ALERT_STORE_STATUS; + shipp->flags.set(Ship::Ship_Flags::Red_alert_store_status); } } - if (p_objp->flags & P_KNOSSOS_WARP_IN) + if (p_objp->flags[Mission::Parse_Object_Flags::Knossos_warp_in]) { - Objects[objnum].flags |= OF_SPECIAL_WARPIN; + Objects[objnum].flags.set(Object::Object_Flags::Special_warpin); Knossos_warp_ani_used = 1; } // set the orders that this ship will accept. It will have already been set to default from the // ship create code, so only set them if the parse object flags say they are unique - if (p_objp->flags & P_SF_USE_UNIQUE_ORDERS) + if (p_objp->flags[Mission::Parse_Object_Flags::SF_Use_unique_orders]) { shipp->orders_accepted = p_objp->orders_accepted; @@ -2078,28 +2069,28 @@ int parse_create_object_sub(p_object *p_objp) #endif } - if (p_objp->flags & P_SF_DOCK_LEADER) - shipp->flags |= SF_DOCK_LEADER; + if (p_objp->flags[Mission::Parse_Object_Flags::SF_Dock_leader]) + shipp->flags.set(Ship::Ship_Flags::Dock_leader); - if (p_objp->flags & P_SF_WARP_BROKEN) - shipp->flags |= SF_WARP_BROKEN; + if (p_objp->flags[Mission::Parse_Object_Flags::SF_Warp_broken]) + shipp->flags.set(Ship::Ship_Flags::Warp_broken); - if (p_objp->flags & P_SF_WARP_NEVER) - shipp->flags |= SF_WARP_NEVER; + if (p_objp->flags[Mission::Parse_Object_Flags::SF_Warp_never]) + shipp->flags.set(Ship::Ship_Flags::Warp_never); //////////////////////// // if ship is in a wing, and the wing's no_warp_effect flag is set, then set the equivalent // flag for the ship - if ((shipp->wingnum != -1) && (Wings[shipp->wingnum].flags & WF_NO_ARRIVAL_WARP)) - shipp->flags |= SF_NO_ARRIVAL_WARP; + if ((shipp->wingnum != -1) && (Wings[shipp->wingnum].flags & WF_NO_ARRIVAL_WARP)) + shipp->flags.set(Ship::Ship_Flags::No_arrival_warp); - if ((shipp->wingnum != -1) && (Wings[shipp->wingnum].flags & WF_NO_DEPARTURE_WARP)) - shipp->flags |= SF_NO_DEPARTURE_WARP; + if ((shipp->wingnum != -1) && (Wings[shipp->wingnum].flags & WF_NO_DEPARTURE_WARP)) + shipp->flags.set(Ship::Ship_Flags::No_departure_warp); - // ditto for Kazan - if ((shipp->wingnum != -1) && (Wings[shipp->wingnum].flags & WF_NAV_CARRY)) - shipp->flags2 |= SF2_NAVPOINT_CARRY; + // ditto for Kazan + if ((shipp->wingnum != -1) && (Wings[shipp->wingnum].flags & WF_NAV_CARRY)) + shipp->flags.set(Ship::Ship_Flags::Navpoint_carry); // if the wing index and wing pos are set for this parse object, set them for the ship. This // is useful in multiplayer when ships respawn @@ -2203,7 +2194,7 @@ int parse_create_object_sub(p_object *p_objp) while (ptr != END_OF_LIST(&shipp->subsys_list)) { // check the mission flag to possibly free all beam weapons - Goober5000, taken from SEXP.CPP - if (The_mission.flags & MISSION_FLAG_BEAM_FREE_ALL_BY_DEFAULT) + if (The_mission.flags[Mission::Mission_Flags::Beam_free_all_by_default]) { // mark all turrets as beam free if(ptr->system_info->type == SUBSYSTEM_TURRET) @@ -2213,7 +2204,7 @@ int parse_create_object_sub(p_object *p_objp) } } - if (shipp->flags2 & SF2_LOCK_ALL_TURRETS_INITIALLY || ptr->system_info->flags & MSS_FLAG_TURRET_LOCKED) + if (shipp->flags[Ship::Ship_Flags::Lock_all_turrets_initially] || ptr->system_info->flags & MSS_FLAG_TURRET_LOCKED) { // mark all turrets as locked if(ptr->system_info->type == SUBSYSTEM_TURRET) @@ -2392,7 +2383,7 @@ int parse_create_object_sub(p_object *p_objp) mission_hotkey_mf_add(Wings[shipp->wingnum].hotkey, shipp->objnum, HOTKEY_MISSION_FILE_ADDED); // possibly add this ship to the hud escort list - if (shipp->flags & SF_ESCORT) + if (shipp->flags[Ship::Ship_Flags::Escort]) hud_add_remove_ship_escort(objnum, 1); } @@ -2406,7 +2397,7 @@ int parse_create_object_sub(p_object *p_objp) // Goober5000 - for an initially docked group, only send the packet for the dock leader... this is necessary so that the // docked hierarchy of objects can be created in the right order on the client side - if (!object_is_docked(p_objp) || (p_objp->flags & P_SF_DOCK_LEADER)) + if (!object_is_docked(p_objp) || (p_objp->flags[Mission::Parse_Object_Flags::SF_Dock_leader])) { if ((Game_mode & GM_IN_MISSION) && MULTIPLAYER_MASTER && (p_objp->wingnum == -1)) send_ship_create_packet(&Objects[objnum], (p_objp == Arriving_support_ship) ? 1 : 0); @@ -2476,7 +2467,7 @@ void parse_bring_in_docked_wing(p_object *p_objp, int wingnum, int shipnum) for (j = 0; j < MAX_STARTING_WINGS; j++) { if (!stricmp(Starting_wing_names[j], wingp->name)) - Ships[shipnum].flags |= SF_FROM_PLAYER_WING; + Ships[shipnum].flags[Ship::Ship_Flags::From_player_wing]; } // handle AI @@ -2495,172 +2486,171 @@ void parse_bring_in_docked_wing(p_object *p_objp, int wingnum, int shipnum) } // Goober5000 -void resolve_parse_flags(object *objp, int parse_flags, int parse_flags2) +void resolve_parse_flags(object *objp, flagset &parse_flags) { - Assert(objp != NULL); - ship *shipp = &Ships[objp->instance]; + Assert(objp != NULL); + ship *shipp = &Ships[objp->instance]; - if (parse_flags & P_SF_CARGO_KNOWN) - shipp->flags |= SF_CARGO_REVEALED; + if (parse_flags[Mission::Parse_Object_Flags::SF_Cargo_known]) + shipp->flags.set(Ship::Ship_Flags::Cargo_revealed); - if (parse_flags & P_SF_IGNORE_COUNT) - shipp->flags |= SF_IGNORE_COUNT; + if (parse_flags[Mission::Parse_Object_Flags::SF_Ignore_count]) + shipp->flags.set(Ship::Ship_Flags::Ignore_count); - if (parse_flags & P_OF_PROTECTED) - objp->flags |= OF_PROTECTED; + if (parse_flags[Mission::Parse_Object_Flags::OF_Protected]) + objp->flags.set(Object::Object_Flags::Protected); - if (parse_flags & P_SF_REINFORCEMENT) - { - //Individual ships in wings can't be reinforcements - FUBAR - if(shipp->wingnum >= 0) - { - Warning(LOCATION, "Ship %s is a reinforcement unit but is a member of a wing. Ignoring reinforcement flag.", shipp->ship_name); - } - else - { - shipp->flags |= SF_REINFORCEMENT; - } - } - - if ((parse_flags & P_OF_NO_SHIELDS) && (parse_flags2 & P2_OF_FORCE_SHIELDS_ON)) - { - Warning(LOCATION, "The parser found a ship with both the \"force-shields-on\" and \"no-shields\" flags; this is inconsistent!"); - } - if (parse_flags & P_OF_NO_SHIELDS) - objp->flags |= OF_NO_SHIELDS; + if (parse_flags[Mission::Parse_Object_Flags::SF_Reinforcement]) + { + //Individual ships in wings can't be reinforcements - FUBAR + if (shipp->wingnum >= 0) + { + Warning(LOCATION, "Ship %s is a reinforcement unit but is a member of a wing. Ignoring reinforcement flag.", shipp->ship_name); + } + else + { + shipp->flags.set(Ship::Ship_Flags::Reinforcement); + } + } - if (parse_flags & P_SF_ESCORT) - shipp->flags |= SF_ESCORT; + if ((parse_flags[Mission::Parse_Object_Flags::OF_No_shields]) && (parse_flags[Mission::Parse_Object_Flags::OF_Force_shields_on])) + { + Warning(LOCATION, "The parser found a ship with both the \"force-shields-on\" and \"no-shields\" flags; this is inconsistent!"); + } + if (parse_flags[Mission::Parse_Object_Flags::OF_No_shields]) + objp->flags.set(Object::Object_Flags::No_shields); - // P_OF_PLAYER_START is handled in parse_create_object_sub + if (parse_flags[Mission::Parse_Object_Flags::SF_Escort]) + shipp->flags.set(Ship::Ship_Flags::Escort); - if (parse_flags & P_SF_NO_ARRIVAL_MUSIC) - shipp->flags |= SF_NO_ARRIVAL_MUSIC; + // P_OF_PLAYER_START is handled in parse_create_object_sub - if (parse_flags & P_SF_NO_ARRIVAL_WARP) - shipp->flags |= SF_NO_ARRIVAL_WARP; + if (parse_flags[Mission::Parse_Object_Flags::SF_No_arrival_music]) + shipp->flags.set(Ship::Ship_Flags::No_arrival_music); - if (parse_flags & P_SF_NO_DEPARTURE_WARP) - shipp->flags |= SF_NO_DEPARTURE_WARP; + if (parse_flags[Mission::Parse_Object_Flags::SF_No_arrival_warp]) + shipp->flags.set(Ship::Ship_Flags::No_arrival_warp); - if (parse_flags & P_SF_LOCKED) { - shipp->flags2 |= SF2_SHIP_LOCKED; - shipp->flags2 |= SF2_WEAPONS_LOCKED; - } + if (parse_flags[Mission::Parse_Object_Flags::SF_No_departure_warp]) + shipp->flags.set(Ship::Ship_Flags::No_departure_warp); - if (parse_flags & P_OF_INVULNERABLE) - objp->flags |= OF_INVULNERABLE; + if (parse_flags[Mission::Parse_Object_Flags::SF_Locked]) { + shipp->flags.set(Ship::Ship_Flags::Ship_locked); + shipp->flags.set(Ship::Ship_Flags::Weapons_locked); + } - if (parse_flags & P_SF_HIDDEN_FROM_SENSORS) - shipp->flags |= SF_HIDDEN_FROM_SENSORS; + if (parse_flags[Mission::Parse_Object_Flags::OF_Invulnerable]) + objp->flags.set(Object::Object_Flags::Invulnerable); - if (parse_flags & P_SF_SCANNABLE) - shipp->flags |= SF_SCANNABLE; + if (parse_flags[Mission::Parse_Object_Flags::SF_Hidden_from_sensors]) + shipp->flags.set(Ship::Ship_Flags::Hidden_from_sensors); - // P_AIF_KAMIKAZE, P_AIF_NO_DYNAMIC, and P_SF_RED_ALERT_CARRY are handled in parse_create_object_sub - - if (parse_flags & P_OF_BEAM_PROTECTED) - objp->flags |= OF_BEAM_PROTECTED; + if (parse_flags[Mission::Parse_Object_Flags::SF_Scannable]) + shipp->flags.set(Ship::Ship_Flags::Scannable); - if (parse_flags & P_OF_FLAK_PROTECTED) - objp->flags |= OF_FLAK_PROTECTED; + // P_AIF_KAMIKAZE, P_AIF_NO_DYNAMIC, and P_SF_RED_ALERT_CARRY are handled in parse_create_object_sub - if (parse_flags & P_OF_LASER_PROTECTED) - objp->flags |= OF_LASER_PROTECTED; + if (parse_flags[Mission::Parse_Object_Flags::OF_Beam_protected]) + objp->flags.set(Object::Object_Flags::Beam_protected); - if (parse_flags & P_OF_MISSILE_PROTECTED) - objp->flags |= OF_MISSILE_PROTECTED; + if (parse_flags[Mission::Parse_Object_Flags::OF_Flak_protected]) + objp->flags.set(Object::Object_Flags::Flak_protected); - if (parse_flags & P_SF_GUARDIAN) - shipp->ship_guardian_threshold = SHIP_GUARDIAN_THRESHOLD_DEFAULT; + if (parse_flags[Mission::Parse_Object_Flags::OF_Laser_protected]) + objp->flags.set(Object::Object_Flags::Laser_protected); - if (parse_flags & P_SF_VAPORIZE) - shipp->flags |= SF_VAPORIZE; + if (parse_flags[Mission::Parse_Object_Flags::OF_Missile_protected]) + objp->flags.set(Object::Object_Flags::Missile_protected); - if (parse_flags & P_SF2_STEALTH) - shipp->flags2 |= SF2_STEALTH; + if (parse_flags[Mission::Parse_Object_Flags::SF_Guardian]) + shipp->ship_guardian_threshold = SHIP_GUARDIAN_THRESHOLD_DEFAULT; - if (parse_flags & P_SF2_FRIENDLY_STEALTH_INVIS) - shipp->flags2 |= SF2_FRIENDLY_STEALTH_INVIS; + if (parse_flags[Mission::Parse_Object_Flags::SF_Vaporize]) + shipp->flags.set(Ship::Ship_Flags::Vaporize); - if (parse_flags & P_SF2_DONT_COLLIDE_INVIS) - shipp->flags2 |= SF2_DONT_COLLIDE_INVIS; + if (parse_flags[Mission::Parse_Object_Flags::SF_Stealth]) + shipp->flags.set(Ship::Ship_Flags::Stealth); - if (parse_flags2 & P2_SF2_PRIMITIVE_SENSORS) - shipp->flags2 |= SF2_PRIMITIVE_SENSORS; + if (parse_flags[Mission::Parse_Object_Flags::SF_Friendly_stealth_invis]) + shipp->flags.set(Ship::Ship_Flags::Friendly_stealth_invis); - if (parse_flags2 & P2_SF2_NO_SUBSPACE_DRIVE) - shipp->flags2 |= SF2_NO_SUBSPACE_DRIVE; + if (parse_flags[Mission::Parse_Object_Flags::SF_Dont_collide_invis]) + shipp->flags.set(Ship::Ship_Flags::Dont_collide_invis); - if (parse_flags2 & P2_SF2_NAV_CARRY_STATUS) - shipp->flags2 |= SF2_NAVPOINT_CARRY; + if (parse_flags[Mission::Parse_Object_Flags::SF_Primitive_sensors]) + shipp->flags.set(Ship::Ship_Flags::Primitive_sensors); - if (parse_flags2 & P2_SF2_AFFECTED_BY_GRAVITY) - shipp->flags2 |= SF2_AFFECTED_BY_GRAVITY; + if (parse_flags[Mission::Parse_Object_Flags::SF_No_subspace_drive]) + shipp->flags.set(Ship::Ship_Flags::No_subspace_drive); - if (parse_flags2 & P2_SF2_TOGGLE_SUBSYSTEM_SCANNING) - shipp->flags2 |= SF2_TOGGLE_SUBSYSTEM_SCANNING; + if (parse_flags[Mission::Parse_Object_Flags::SF_Nav_carry_status]) + shipp->flags.set(Ship::Ship_Flags::Navpoint_carry); - if (parse_flags2 & P2_OF_TARGETABLE_AS_BOMB) - objp->flags |= OF_TARGETABLE_AS_BOMB; + if (parse_flags[Mission::Parse_Object_Flags::SF_Affected_by_gravity]) + shipp->flags.set(Ship::Ship_Flags::Affected_by_gravity); - if (parse_flags2 & P2_SF2_NO_BUILTIN_MESSAGES) - shipp->flags2 |= SF2_NO_BUILTIN_MESSAGES; + if (parse_flags[Mission::Parse_Object_Flags::SF_Toggle_subsystem_scanning]) + shipp->flags.set(Ship::Ship_Flags::Toggle_subsystem_scanning); - if (parse_flags2 & P2_SF2_PRIMARIES_LOCKED) - shipp->flags2 |= SF2_PRIMARIES_LOCKED; + if (parse_flags[Mission::Parse_Object_Flags::OF_Targetable_as_bomb]) + objp->flags.set(Object::Object_Flags::Targetable_as_bomb); - if (parse_flags2 & P2_SF2_SECONDARIES_LOCKED) - shipp->flags2 |= SF2_SECONDARIES_LOCKED; + if (parse_flags[Mission::Parse_Object_Flags::SF_No_builtin_messages]) + shipp->flags.set(Ship::Ship_Flags::No_builtin_messages); - if (parse_flags2 & P2_SF2_SET_CLASS_DYNAMICALLY) - shipp->flags2 |= SF2_SET_CLASS_DYNAMICALLY; - - if (parse_flags2 & P2_SF2_NO_DEATH_SCREAM) - shipp->flags2 |= SF2_NO_DEATH_SCREAM; - - if (parse_flags2 & P2_SF2_ALWAYS_DEATH_SCREAM) - shipp->flags2 |= SF2_ALWAYS_DEATH_SCREAM; - - if (parse_flags2 & P2_SF2_NAV_NEEDSLINK) - shipp->flags2 |= SF2_NAVPOINT_NEEDSLINK; - - if (parse_flags2 & P2_SF2_HIDE_SHIP_NAME) - shipp->flags2 |= SF2_HIDE_SHIP_NAME; + if (parse_flags[Mission::Parse_Object_Flags::SF_Primaries_locked]) + shipp->flags.set(Ship::Ship_Flags::Primaries_locked); - if (parse_flags2 & P2_SF2_LOCK_ALL_TURRETS_INITIALLY) - shipp->flags2 |= SF2_LOCK_ALL_TURRETS_INITIALLY; + if (parse_flags[Mission::Parse_Object_Flags::SF_Secondaries_locked]) + shipp->flags.set(Ship::Ship_Flags::Secondaries_locked); - if (parse_flags2 & P2_SF2_AFTERBURNER_LOCKED) - shipp->flags2 |= SF2_AFTERBURNER_LOCKED; + if (parse_flags[Mission::Parse_Object_Flags::SF_Set_class_dynamically]) + shipp->flags.set(Ship::Ship_Flags::Set_class_dynamically); - if (parse_flags2 & P2_OF_FORCE_SHIELDS_ON) - shipp->flags2 |= SF2_FORCE_SHIELDS_ON; + if (parse_flags[Mission::Parse_Object_Flags::SF_No_death_scream]) + shipp->flags.set(Ship::Ship_Flags::No_death_scream); - if (parse_flags2 & P2_OF_IMMOBILE) - objp->flags |= OF_IMMOBILE; + if (parse_flags[Mission::Parse_Object_Flags::SF_Always_death_scream]) + shipp->flags.set(Ship::Ship_Flags::Always_death_scream); - if (parse_flags2 & P2_SF2_NO_ETS) - shipp->flags2 |= SF2_NO_ETS; + if (parse_flags[Mission::Parse_Object_Flags::SF_Nav_needslink]) + shipp->flags.set(Ship::Ship_Flags::Navpoint_needslink); - if (parse_flags2 & P2_SF2_CLOAKED) - shipp->flags2 |= SF2_CLOAKED; + if (parse_flags[Mission::Parse_Object_Flags::SF_Hide_ship_name]) + shipp->flags.set(Ship::Ship_Flags::Hide_ship_name); - if (parse_flags2 & P2_SF2_SHIP_LOCKED) - shipp->flags2 |= SF2_SHIP_LOCKED; + if (parse_flags[Mission::Parse_Object_Flags::SF_Lock_all_turrets_initially]) + shipp->flags.set(Ship::Ship_Flags::Lock_all_turrets_initially); - if (parse_flags2 & P2_SF2_WEAPONS_LOCKED) - shipp->flags2 |= SF2_WEAPONS_LOCKED; + if (parse_flags[Mission::Parse_Object_Flags::SF_Afterburner_locked]) + shipp->flags.set(Ship::Ship_Flags::Afterburner_locked); - if (parse_flags2 & P2_SF2_SCRAMBLE_MESSAGES) - shipp->flags2 |= SF2_SCRAMBLE_MESSAGES; + if (parse_flags[Mission::Parse_Object_Flags::OF_Force_shields_on]) + shipp->flags.set(Ship::Ship_Flags::Force_shields_on); - if (parse_flags2 & P2_SF2_NO_DISABLED_SELF_DESTRUCT) - shipp->flags2 |= SF2_NO_DISABLED_SELF_DESTRUCT; + if (parse_flags[Mission::Parse_Object_Flags::OF_Immobile]) + objp->flags.set(Object::Object_Flags::Immobile); - // don't remove no-collide if not set in the mission - if (parse_flags2 & P2_OF_NO_COLLIDE) - obj_set_flags(objp, objp->flags & ~OF_COLLIDES); + if (parse_flags[Mission::Parse_Object_Flags::SF_No_ets]) + shipp->flags.set(Ship::Ship_Flags::No_ets); + + if (parse_flags[Mission::Parse_Object_Flags::SF_Cloaked]) + shipp->flags.set(Ship::Ship_Flags::Cloaked); + + if (parse_flags[Mission::Parse_Object_Flags::SF_Ship_locked]) + shipp->flags.set(Ship::Ship_Flags::Ship_locked); + + if (parse_flags[Mission::Parse_Object_Flags::SF_Weapons_locked]) + shipp->flags.set(Ship::Ship_Flags::Weapons_locked); + + if (parse_flags[Mission::Parse_Object_Flags::SF_Scramble_messages]) + shipp->flags.set(Ship::Ship_Flags::Scramble_messages); + + if (parse_flags[Mission::Parse_Object_Flags::OF_No_collide]) + objp->flags.remove(Object::Object_Flags::Collides); + + if (parse_flags[Mission::Parse_Object_Flags::SF_No_disabled_self_destruct]) + shipp->flags.set(Ship::Ship_Flags::No_disabled_self_destruct); } void fix_old_special_explosions(p_object *p_objp, int variable_index) @@ -2728,8 +2718,7 @@ p_object::~p_object() int parse_object(mission *pm, int flag, p_object *p_objp) { int i, j, count, delay; - char name[NAME_LENGTH], flag_strings[MAX_PARSE_OBJECT_FLAGS][NAME_LENGTH]; - char flag_strings_2[MAX_PARSE_OBJECT_FLAGS_2][NAME_LENGTH]; + char name[NAME_LENGTH]; Assert(pm != NULL); @@ -2812,7 +2801,7 @@ int parse_object(mission *pm, int flag, p_object *p_objp) } // if this is a multiplayer dogfight mission, skip support ships - if(MULTI_DOGFIGHT && (Ship_info[p_objp->ship_class].flags & SIF_SUPPORT)) + if(MULTI_DOGFIGHT && (Ship_info[p_objp->ship_class].flags[Ship::Info_Flags::Support])) return 0; // optional alternate name type @@ -3021,47 +3010,30 @@ int parse_object(mission *pm, int flag, p_object *p_objp) int dummy; stuff_int(&dummy); - // set flags - p_objp->flags = 0; - if (optional_string("+Flags:")) - { - count = stuff_string_list(flag_strings, MAX_PARSE_OBJECT_FLAGS); - for (i=0; iflags |= (1 << j); - break; - } - } + // set flags + p_objp->flags.reset(); + if (optional_string("+Flags:")) + { + SCP_vector unparsed; + parse_string_flag_list>(&p_objp->flags, Parse_object_flags, num_parse_object_flags, &unparsed); + if (unparsed.size() > 0) { + for (size_t k = 0; k < unparsed.size(); ++k) { + WarningEx(LOCATION, "Unknown flag in parse object flags: %s", unparsed[k].c_str()); + } + } + } - if (j == MAX_PARSE_OBJECT_FLAGS) - Warning(LOCATION, "Unknown flag in mission file: %s\n", flag_strings[i]); - } - } - - // second set - Goober5000 - p_objp->flags2 = 0; - if (optional_string("+Flags2:")) - { - count = stuff_string_list(flag_strings_2, MAX_PARSE_OBJECT_FLAGS_2); - for (i=0; iflags2 |= (1 << j); - break; - } - } - - if (j == MAX_PARSE_OBJECT_FLAGS_2) - Warning(LOCATION, "Unknown flag2 in mission file: %s\n", flag_strings_2[i]); - } - } + // second set - Goober5000 + if (optional_string("+Flags2:")) + { + SCP_vector unparsed; + parse_string_flag_list>(&p_objp->flags, Parse_object_flags, num_parse_object_flags, &unparsed); + if (unparsed.size() > 0) { + for (size_t k = 0; k < unparsed.size(); ++k) { + WarningEx(LOCATION, "Unknown flag in parse object flags: %s", unparsed[k].c_str()); + } + } + } // always store respawn priority, just for ease of implementation @@ -3070,17 +3042,17 @@ int parse_object(mission *pm, int flag, p_object *p_objp) stuff_int(&p_objp->respawn_priority); p_objp->escort_priority = 0; - if (optional_string("+Escort Priority:")) - { - Assert(p_objp->flags & P_SF_ESCORT); - stuff_int(&p_objp->escort_priority); - } + if (optional_string("+Escort Priority:")) + { + Assert(p_objp->flags[Mission::Parse_Object_Flags::SF_Escort]); + stuff_int(&p_objp->escort_priority); + } - if (p_objp->flags & P_OF_PLAYER_START) - { - p_objp->flags |= P_SF_CARGO_KNOWN; // make cargo known for players - Player_starts++; - } + if (p_objp->flags[Mission::Parse_Object_Flags::OF_Player_start]) + { + p_objp->flags.set(Mission::Parse_Object_Flags::SF_Cargo_known); // make cargo known for players + Player_starts++; + } p_objp->use_special_explosion = false; p_objp->special_exp_damage = -1; @@ -3255,13 +3227,13 @@ int parse_object(mission *pm, int flag, p_object *p_objp) } // check for the optional "orders accepted" string which contains the orders from the default - // set that this ship will actually listen to - if (optional_string("+Orders Accepted:")) - { - stuff_int(&p_objp->orders_accepted); - if (p_objp->orders_accepted != -1) - p_objp->flags |= P_SF_USE_UNIQUE_ORDERS; - } + // set that this ship will actually listen to + if (optional_string("+Orders Accepted:")) + { + stuff_int(&p_objp->orders_accepted); + if (p_objp->orders_accepted != -1) + p_objp->flags.set(Mission::Parse_Object_Flags::SF_Use_unique_orders); + } p_objp->group = 0; if (optional_string("+Group:")) @@ -3401,7 +3373,7 @@ int parse_object(mission *pm, int flag, p_object *p_objp) // Goober5000 - preload stuff for certain object flags // (done after parsing object, but before creating it) - if (p_objp->flags & P_KNOSSOS_WARP_IN) + if (p_objp->flags[Mission::Parse_Object_Flags::Knossos_warp_in]) Knossos_warp_ani_used = 1; // this is a valid/legal ship to create @@ -3456,7 +3428,10 @@ void mission_parse_maybe_create_parse_object(p_object *pobjp) // a) he's not cued to arrive yet // b) his arrival delay hasn't elapsed // c) he's reinforcement - if ( (object_is_docked(pobjp) && !(pobjp->flags & P_SF_DOCK_LEADER)) || (!Fred_running && (!eval_sexp(pobjp->arrival_cue) || !timestamp_elapsed(pobjp->arrival_delay) || (pobjp->flags & P_SF_REINFORCEMENT))) ) + if ((object_is_docked(pobjp) && !(pobjp->flags[Mission::Parse_Object_Flags::SF_Dock_leader])) || + (!Fred_running && (!eval_sexp(pobjp->arrival_cue) || + !timestamp_elapsed(pobjp->arrival_delay) || + (pobjp->flags[Mission::Parse_Object_Flags::SF_Reinforcement])))) { // we can't add ships getting destroyed to the arrival list!!! Assert (pobjp->destroy_before_mission_time < 0); @@ -3488,7 +3463,7 @@ void mission_parse_maybe_create_parse_object(p_object *pobjp) { int i; shipfx_blow_up_model(objp, Ship_info[Ships[objp->instance].ship_info_index].model_num, 0, 0, &objp->pos); - objp->flags |= OF_SHOULD_BE_DEAD; + objp->flags.set(Object::Object_Flags::Should_be_dead); // once the ship is exploded, find the debris pieces belonging to this object, mark them // as not to expire, and move them forward in time N seconds @@ -3515,7 +3490,7 @@ void mission_parse_maybe_create_parse_object(p_object *pobjp) { // be sure to set the variable in the ships structure for the final death time!!! Ships[objp->instance].final_death_time = pobjp->destroy_before_mission_time; - Ships[objp->instance].flags |= SF_KILL_BEFORE_MISSION; + Ships[objp->instance].flags[Ship::Ship_Flags::Kill_before_mission]; } } } @@ -3705,7 +3680,7 @@ void process_loadout_objects() for (size_t i=0; i < Parse_objects.size(); i++) { p_object *p_objp = &Parse_objects[i]; - if (p_objp->flags2 & P2_SF2_SET_CLASS_DYNAMICALLY) + if (p_objp->flags[Mission::Parse_Object_Flags::SF_Set_class_dynamically]) { if (!(is_ship_assignable(p_objp))) { @@ -3722,7 +3697,7 @@ void process_loadout_objects() p_object *p_objp = &Parse_objects[reassignments[m]]; team_data *current_team = &Team_data[p_objp->team]; bool loadout_assigned = false; - Assert (p_objp->flags2 & P2_SF2_SET_CLASS_DYNAMICALLY); + Assert(p_objp->flags[Mission::Parse_Object_Flags::SF_Set_class_dynamically]); // First thing to check is whether we actually have any ships left to assign if (current_team->loadout_total == 0) @@ -4103,7 +4078,7 @@ int parse_wing_create_ships( wing *wingp, int num_to_create, int force, int spec continue; } // when not creating a specific ship, we should skip over any ships that weren't carried along in the red-alert - else if (p_objp->flags2 & P2_RED_ALERT_DELETED) + else if (p_objp->flags[Mission::Parse_Object_Flags::Red_alert_deleted]) { num_to_create--; num_create_save--; @@ -4111,7 +4086,7 @@ int parse_wing_create_ships( wing *wingp, int num_to_create, int force, int spec wingp->red_alert_skipped_ships++; // clear the flag so that this parse object can be used for the next wave - p_objp->flags2 &= ~P2_RED_ALERT_DELETED; + p_objp->flags.remove(Mission::Parse_Object_Flags::Red_alert_deleted); // skip over this parse object if (num_to_create == 0) @@ -4120,7 +4095,7 @@ int parse_wing_create_ships( wing *wingp, int num_to_create, int force, int spec continue; } - Assert (!(p_objp->flags & P_SF_CANNOT_ARRIVE)); // get allender + Assert(!(p_objp->flags[Mission::Parse_Object_Flags::SF_Cannot_arrive])); // get allender // if we have the maximum number of ships in the wing, we must bail as well if (wingp->current_count >= MAX_SHIPS_PER_WING) @@ -4178,7 +4153,7 @@ int parse_wing_create_ships( wing *wingp, int num_to_create, int force, int spec // keep any player ship on the parse object list -- used for respawns // 5/8/98 -- MWA -- don't remove ships from the list when you are ingame joining - if (!(p_objp->flags & P_OF_PLAYER_START)) + if (!(p_objp->flags[Mission::Parse_Object_Flags::OF_Player_start])) { if ((Game_mode & GM_NORMAL) || !(Net_player->flags & NETINFO_FLAG_INGAME_JOIN)) { @@ -4202,7 +4177,7 @@ int parse_wing_create_ships( wing *wingp, int num_to_create, int force, int spec for (j = 0; j < MAX_TVT_WINGS; j++) { if (!stricmp(TVT_wing_names[j], wingp->name)) - Ships[Objects[objnum].instance].flags |= SF_FROM_PLAYER_WING; + Ships[Objects[objnum].instance].flags.set(Ship::Ship_Flags::From_player_wing); } } else @@ -4210,7 +4185,7 @@ int parse_wing_create_ships( wing *wingp, int num_to_create, int force, int spec for (j = 0; j < MAX_STARTING_WINGS; j++) { if (!stricmp(Starting_wing_names[j], wingp->name)) - Ships[Objects[objnum].instance].flags |= SF_FROM_PLAYER_WING; + Ships[Objects[objnum].instance].flags.set(Ship::Ship_Flags::From_player_wing); } } @@ -4269,7 +4244,7 @@ int parse_wing_create_ships( wing *wingp, int num_to_create, int force, int spec mission_log_add_entry( LOG_WING_ARRIVED, wingp->name, NULL, wingp->current_wave ); ship_num = wingp->ship_index[0]; - if ( !(Ships[ship_num].flags & SF_NO_ARRIVAL_MUSIC) && !(wingp->flags & WF_NO_ARRIVAL_MUSIC) ) { + if ( !(Ships[ship_num].flags[Ship::Ship_Flags::No_arrival_music]) && !(wingp->flags & WF_NO_ARRIVAL_MUSIC) ) { if ( timestamp_elapsed(Allow_arrival_music_timestamp) ) { Allow_arrival_music_timestamp = timestamp(ARRIVAL_MUSIC_MIN_SEPARATION); event_music_arrival(Ships[ship_num].team); @@ -4609,7 +4584,7 @@ void parse_wing(mission *pm) assigned++; // Goober5000 - if this is a player start object, there shouldn't be a wing arrival delay (Mantis #2678) - if ((p_objp->flags & P_OF_PLAYER_START) && (saved_arrival_delay != 0)) { + if ((p_objp->flags[Mission::Parse_Object_Flags::OF_Player_start]) && (saved_arrival_delay != 0)) { Warning(LOCATION, "Wing %s specifies an arrival delay of %ds, but it also contains a player. The arrival delay will be reset to 0.", wingp->name, saved_arrival_delay); if (!Fred_running && wingp->arrival_delay > 0) { // timestamp has been set, so set it again @@ -5262,12 +5237,12 @@ void parse_bitmaps(mission *pm) stuff_int(&Neb2_poof_flags); // initialize neb effect. its gross to do this here, but Fred is dumb so I have no choice ... :( - if(Fred_running && (pm->flags & MISSION_FLAG_FULLNEB)){ + if(Fred_running && (pm->flags[Mission::Mission_Flags::Fullneb])){ neb2_post_level_init(); } } - if(pm->flags & MISSION_FLAG_FULLNEB){ + if(pm->flags[Mission::Mission_Flags::Fullneb]){ // no regular nebula stuff nebula_close(); } else { @@ -5276,7 +5251,7 @@ void parse_bitmaps(mission *pm) // parse the proper nebula type (full or not) for (z=0; zflags & MISSION_FLAG_FULLNEB){ + if(pm->flags[Mission::Mission_Flags::Fullneb]){ if (!stricmp(str, Neb2_filenames[z])) { Nebula_index = z; break; @@ -5675,7 +5650,7 @@ void post_process_mission() Player->objnum = objnum; } - Player_obj->flags |= OF_PLAYER_SHIP; // make this object a player controlled ship. + Player_obj->flags.set(Object::Object_Flags::Player_ship); // make this object a player controlled ship. Player_ship = &Ships[Player_start_shipnum]; Player_ai = &Ai_info[Player_ship->ai_index]; @@ -5800,9 +5775,9 @@ void post_process_mission() shipnum = Objects[so->objnum].instance; // pass over non-ship objects and player ship objects - if ( Ships[shipnum].objnum == -1 || (Objects[Ships[shipnum].objnum].flags & OF_PLAYER_SHIP) ) + if ( Ships[shipnum].objnum == -1 || (Objects[Ships[shipnum].objnum].flags[Object::Object_Flags::Player_ship]) ) continue; - if ( Ships[shipnum].flags & SF_IGNORE_COUNT ) + if ( Ships[shipnum].flags[Ship::Ship_Flags::Ignore_count] ) continue; if ( (Ships[shipnum].wingnum != -1) && (Wings[Ships[shipnum].wingnum].flags & WF_IGNORE_COUNT) ) continue; @@ -5818,7 +5793,7 @@ void post_process_mission() int num; // go through similar motions as above - if ( p_objp->flags & P_SF_IGNORE_COUNT ) + if ( p_objp->flags[Mission::Parse_Object_Flags::SF_Ignore_count] ) continue; if ( (p_objp->wingnum != -1) && (Wings[p_objp->wingnum].flags & WF_IGNORE_COUNT) ) continue; @@ -5842,7 +5817,7 @@ void post_process_mission() ship *shipp = &Ships[Objects[so->objnum].instance]; // don't process non player wing ships - if ( !(shipp->flags & SF_FROM_PLAYER_WING ) ) + if ( !(shipp->flags[Ship::Ship_Flags::From_player_wing] ) ) continue; swp = &shipp->weapons; @@ -6210,12 +6185,12 @@ void parse_object_mark_dock_leader_helper(p_object *pobjp, p_dock_function_info } // otherwise, unmark the existing leader and set his arrival cue to false - existing_leader->flags &= ~P_SF_DOCK_LEADER; + existing_leader->flags.remove(Mission::Parse_Object_Flags::SF_Dock_leader); reset_arrival_to_false(existing_leader, true); } // mark and save me as the leader - pobjp->flags |= P_SF_DOCK_LEADER; + pobjp->flags.set(Mission::Parse_Object_Flags::SF_Dock_leader); infop->maintained_variables.objp_value = pobjp; } } @@ -6223,13 +6198,13 @@ void parse_object_mark_dock_leader_helper(p_object *pobjp, p_dock_function_info // Goober5000 void parse_object_set_handled_flag_helper(p_object *pobjp, p_dock_function_info *infop) { - pobjp->flags2 |= P2_ALREADY_HANDLED; + pobjp->flags.set(Mission::Parse_Object_Flags::Already_handled); } // Goober5000 void parse_object_clear_handled_flag_helper(p_object *pobjp, p_dock_function_info *infop) { - pobjp->flags2 &= ~P2_ALREADY_HANDLED; + pobjp->flags.remove(Mission::Parse_Object_Flags::Already_handled); } // Goober5000 @@ -6246,7 +6221,7 @@ void parse_object_clear_all_handled_flags() continue; // has this object (by extension, this group of docked objects) been cleared already? - if (!(pobjp->flags2 & P2_ALREADY_HANDLED)) + if (!(pobjp->flags[Mission::Parse_Object_Flags::Already_handled])) continue; // clear the handled flag for this group @@ -6319,7 +6294,7 @@ void mission_parse_set_up_initial_docks() continue; // has this object (by extension, this group of docked objects) been handled already? - if (pobjp->flags2 & P2_ALREADY_HANDLED) + if (pobjp->flags[Mission::Parse_Object_Flags::Already_handled]) continue; // find the dock leader(s) @@ -6648,7 +6623,7 @@ int mission_did_ship_arrive(p_object *objp) // we must first check to see if this ship is a reinforcement or not. If so, then don't // process - if ( objp->flags & P_SF_REINFORCEMENT ) { + if ( objp->flags[Mission::Parse_Object_Flags::SF_Reinforcement] ) { // if this ship did arrive, mark the reinforcement as available, and tell clients if in multiplayer // mode @@ -6702,7 +6677,7 @@ int mission_did_ship_arrive(p_object *objp) } } - if ( objp->flags & P_SF_CANNOT_ARRIVE ) { + if ( objp->flags[Mission::Parse_Object_Flags::SF_Cannot_arrive] ) { WarningEx(LOCATION, "Warning: Ship %s cannot arrive. Ship not created.\n", objp->name); return -1; } @@ -6715,7 +6690,7 @@ int mission_did_ship_arrive(p_object *objp) Assert(object_num >= 0 && object_num < MAX_OBJECTS); // Play the music track for an arrival - if ( !(Ships[Objects[object_num].instance].flags & SF_NO_ARRIVAL_MUSIC) ) + if ( !(Ships[Objects[object_num].instance].flags[Ship::Ship_Flags::No_arrival_music]) ) if ( timestamp_elapsed(Allow_arrival_music_timestamp) ) { Allow_arrival_music_timestamp = timestamp(ARRIVAL_MUSIC_MIN_SEPARATION); event_music_arrival(Ships[Objects[object_num].instance].team); @@ -6745,7 +6720,7 @@ void mission_maybe_make_ship_arrive(p_object *p_objp) void mission_parse_mark_non_arrival(p_object *p_objp) { // mark the flag - p_objp->flags |= P_SF_CANNOT_ARRIVE; + p_objp->flags.set(Mission::Parse_Object_Flags::SF_Cannot_arrive); } // Goober5000 @@ -6757,8 +6732,8 @@ void mission_parse_mark_non_arrival(wing *wingp) for (p_object *p_objp = GET_FIRST(&Ship_arrival_list); p_objp != END_OF_LIST(&Ship_arrival_list); p_objp = GET_NEXT(p_objp)) { // ...and mark the ones in this wing - if (p_objp->wingnum == wingnum) - p_objp->flags |= P_SF_CANNOT_ARRIVE; + if (p_objp->wingnum == wingnum) + p_objp->flags.set(Mission::Parse_Object_Flags::SF_Cannot_arrive); } } @@ -6772,12 +6747,12 @@ void mission_parse_mark_non_arrivals() if (p_objp->wingnum != -1) { if (!object_is_docked(p_objp) && (Sexp_nodes[Wings[p_objp->wingnum].arrival_cue].value == SEXP_KNOWN_FALSE)) - p_objp->flags |= P_SF_CANNOT_ARRIVE; + p_objp->flags.set(Mission::Parse_Object_Flags::SF_Cannot_arrive); } else { if (Sexp_nodes[p_objp->arrival_cue].value == SEXP_KNOWN_FALSE) - p_objp->flags |= P_SF_CANNOT_ARRIVE; + p_objp->flags.set(Mission::Parse_Object_Flags::SF_Cannot_arrive); } } } @@ -6809,7 +6784,7 @@ void mission_parse_support_arrived( int objnum ) } } - Ships[Objects[objnum].instance].flags |= SF_WARPED_SUPPORT; + Ships[Objects[objnum].instance].flags.set(Ship::Ship_Flags::Warped_support); Arriving_support_ship = NULL; Num_arriving_repair_targets = 0; @@ -7003,7 +6978,7 @@ void mission_eval_arrivals() int ship_can_use_warp_drive(ship *shipp) { // must *have* a subspace drive - if (shipp->flags2 & SF2_NO_SUBSPACE_DRIVE) + if (shipp->flags[Ship::Ship_Flags::No_subspace_drive]) return 0; // navigation must work @@ -7034,7 +7009,7 @@ int mission_do_departure(object *objp, bool goal_is_to_warp) if (goal_is_to_warp) { // aha, but not if we were ORDERED to depart, because the comms menu ALSO uses the goal code, and yet the comms menu means any departure method! - if ((shipp->flags & SF_DEPARTURE_ORDERED) || ((shipp->wingnum >= 0) && (Wings[shipp->wingnum].flags & WF_DEPARTURE_ORDERED))) + if ((shipp->flags[Ship::Ship_Flags::Departure_ordered]) || ((shipp->wingnum >= 0) && (Wings[shipp->wingnum].flags & WF_DEPARTURE_ORDERED))) { mprintf(("Looks like we were ordered to depart; initiating the standard departure logic\n")); } @@ -7130,7 +7105,8 @@ try_to_warp: // 4) An instructor in a training mission has been fired upon mprintf(("Can't warp! Doing something else instead.\n")); - shipp->flags &= ~SF_DEPARTING; + shipp->flags.remove(Ship::Ship_Flags::Depart_dockbay); + shipp->flags.remove(Ship::Ship_Flags::Depart_warp); ai_do_default_behavior(objp); return 0; @@ -7161,7 +7137,7 @@ void mission_eval_departures() // don't process a ship that is already departing or dying or disabled // AL 12-30-97: Added SF_CANNOT_WARP to check // Goober5000 - fixed so that it WILL eval when SF_CANNOT_WARP if departing to dockbay - if ( (shipp->flags & (SF_DEPARTING | SF_DYING)) || ((shipp->flags & SF_CANNOT_WARP) && (shipp->departure_location != DEPART_AT_DOCK_BAY)) || ship_subsys_disrupted(shipp, SUBSYSTEM_ENGINE) ) { + if ( shipp->is_dying_or_departing() || (shipp->cannot_warp() && (shipp->departure_location != DEPART_AT_DOCK_BAY)) || ship_subsys_disrupted(shipp, SUBSYSTEM_ENGINE) ) { continue; } @@ -7211,7 +7187,7 @@ void mission_eval_departures() ship *shipp; shipp = &Ships[wingp->ship_index[j]]; - if ( (shipp->flags & SF_DEPARTING) || (shipp->flags & SF_DYING) ) + if ( (shipp->is_departing()) || (shipp->flags[Ship::Ship_Flags::Dying]) ) continue; Assert ( shipp->objnum != -1 ); @@ -7459,7 +7435,7 @@ void mission_parse_fixup_players() object *objp; for ( objp = GET_FIRST(&obj_used_list); objp != END_OF_LIST(&obj_used_list); objp = GET_NEXT(objp) ) { - if ( (objp->type == OBJ_SHIP) && (objp->flags & OF_PLAYER_SHIP) ) { + if ( (objp->type == OBJ_SHIP) && (objp->flags[Object::Object_Flags::Player_ship]) ) { game_busy( NOX("** fixing up player/ai stuff **") ); // animate the loading screen, doesn't nothing if the screen is not active ai_clear_ship_goals( &Ai_info[Ships[objp->instance].ai_index] ); init_ai_object( OBJ_INDEX(objp) ); @@ -7610,7 +7586,7 @@ void mission_bring_in_support_ship( object *requester_objp ) i = -1; // get index of correct species support ship for (auto it = Ship_info.cbegin(); it != Ship_info.cend(); ++it) { - if ( (it->species == requester_species) && (it->flags & SIF_SUPPORT) ) { + if ((it->species == requester_species) && (it->flags[Ship::Info_Flags::Support])) { i = (int)std::distance(Ship_info.cbegin(), it); break; } @@ -7682,11 +7658,10 @@ void mission_bring_in_support_ship( object *requester_objp ) pobj->wingnum = -1; - pobj->flags = 0; - pobj->flags2 = 0; + pobj->flags.reset(); - if ( Player_obj->flags & OF_NO_SHIELDS ) - pobj->flags |= P_OF_NO_SHIELDS; // support ships have no shields when player has not shields + if (Player_obj->flags[Object::Object_Flags::No_shields]) + pobj->flags.set(Mission::Parse_Object_Flags::OF_No_shields); // support ships have no shields when player has not shields pobj->ai_class = Ship_info[pobj->ship_class].ai_class; pobj->hotkey = -1; diff --git a/code/mission/missionparse.h b/code/mission/missionparse.h index e6c79bf401..875a9f04bf 100644 --- a/code/mission/missionparse.h +++ b/code/mission/missionparse.h @@ -20,6 +20,7 @@ #include "object/object.h" #include "parse/sexp.h" #include "sound/sound.h" +#include "mission/mission_flags.h" //WMC - This should be here #define FS_MISSION_FILE_EXT NOX(".fs2") @@ -65,32 +66,6 @@ struct p_dock_instance; #define MISSION_TYPE_MULTI_TEAMS (1<<4) #define MISSION_TYPE_MULTI_DOGFIGHT (1<<5) -#define MISSION_FLAG_SUBSPACE (1<<0) // mission takes place in subspace -#define MISSION_FLAG_NO_PROMOTION (1<<1) // cannot get promoted or badges in this mission -#define MISSION_FLAG_FULLNEB (1<<2) // mission is a full nebula mission -#define MISSION_FLAG_NO_BUILTIN_MSGS (1<<3) // disables builtin msgs -#define MISSION_FLAG_NO_TRAITOR (1<<4) // player cannot become a traitor -#define MISSION_FLAG_TOGGLE_SHIP_TRAILS (1<<5) // toggles ship trails (off in nebula, on outside nebula) -#define MISSION_FLAG_SUPPORT_REPAIRS_HULL (1<<6) // Toggles support ship repair of ship hulls -#define MISSION_FLAG_BEAM_FREE_ALL_BY_DEFAULT (1<<7) // Beam-free-all by default - Goober5000 -#define MISSION_FLAG_CURRENTLY_UNUSED_1 (1<<8) -#define MISSION_FLAG_CURRENTLY_UNUSED_2 (1<<9) -#define MISSION_FLAG_NO_BRIEFING (1<<10) // no briefing, jump right into mission - Goober5000 -#define MISSION_FLAG_TOGGLE_DEBRIEFING (1<<11) // Turn on debriefing for dogfight. Off for everything else - Goober5000 -#define MISSION_FLAG_CURRENTLY_UNUSED_3 (1<<12) -#define MISSION_FLAG_ALLOW_DOCK_TREES (1<<13) // toggle between hub and tree model for ship docking (see objectdock.cpp) - Gooober5000 -#define MISSION_FLAG_2D_MISSION (1<<14) // Mission is meant to be played top-down style; 2D physics and movement. -#define MISSION_FLAG_CURRENTLY_UNUSED_4 (1<<15) -#define MISSION_FLAG_RED_ALERT (1<<16) // a red-alert mission - Goober5000 -#define MISSION_FLAG_SCRAMBLE (1<<17) // a scramble mission - Goober5000 -#define MISSION_FLAG_NO_BUILTIN_COMMAND (1<<18) // turns off Command without turning off pilots - Karajorma -#define MISSION_FLAG_PLAYER_START_AI (1<<19) // Player Starts mission under AI Control (NOT MULTI COMPATABLE) - Kazan -#define MISSION_FLAG_ALL_ATTACK (1<<20) // all teams at war - Goober5000 -#define MISSION_FLAG_USE_AP_CINEMATICS (1<<21) // Kazan - use autopilot cinematics -#define MISSION_FLAG_DEACTIVATE_AP (1<<22) // KeldorKatarn - deactivate autopilot (patch approved by Kazan) -#define MISSION_FLAG_ALWAYS_SHOW_GOALS (1<<23) // Karajorma - Show the mission goals, even for training missions -#define MISSION_FLAG_END_TO_MAINHALL (1<<24) // niffiwan - Return to the mainhall after debrief - // some mice macros for mission type #define IS_MISSION_MULTI_COOP (The_mission.game_type & MISSION_TYPE_MULTI_COOP) #define IS_MISSION_MULTI_TEAMS (The_mission.game_type & MISSION_TYPE_MULTI_TEAMS) @@ -136,7 +111,7 @@ typedef struct mission { char notes[NOTES_LENGTH]; char mission_desc[MISSION_DESC_LENGTH]; int game_type; - int flags; + flagset flags; int num_players; // valid in multiplayer missions -- number of players supported uint num_respawns; // valid in multiplayer missions -- number of respawns allowed int max_respawn_delay; // valid in multiplayer missions -- number of respawns allowed @@ -180,7 +155,7 @@ typedef struct mission { notes[ 0 ] = '\0'; mission_desc[ 0 ] = '\0'; game_type = 0; - flags = 0; + flags.reset(); num_players = 0; num_respawns = 0; max_respawn_delay = 0; @@ -277,8 +252,8 @@ extern char *Goal_type_names[MAX_GOAL_TYPE_NAMES]; extern char *Reinforcement_type_names[]; extern char *Object_flags[]; -extern char *Parse_object_flags[]; -extern char *Parse_object_flags_2[]; +extern flag_def_list_new Parse_object_flags[]; +extern const size_t num_parse_object_flags; extern char *Icon_names[]; extern char *Mission_event_log_flags[]; @@ -384,8 +359,7 @@ public: int wingnum; // set to -1 if not in a wing -- Wing array index otherwise int pos_in_wing; // Goober5000 - needed for FRED with the new way things work - int flags; // mission savable flags - int flags2; // Goober5000 + flagset flags; // mission savable flags int escort_priority; // priority in escort list int ai_class; int hotkey; // hotkey number (between 0 and 9) -1 means no hotkey @@ -438,86 +412,6 @@ public: ~p_object(); }; -// defines for flags used for p_objects when they are created. Used to help create special -// circumstances for those ships. This list of bitfield indicators MUST correspond EXACTLY -// (i.e., order and position must be the same) to its counterpart in MissionParse.cpp!!!! - -#define MAX_PARSE_OBJECT_FLAGS 27 - -#define P_SF_CARGO_KNOWN (1<<0) -#define P_SF_IGNORE_COUNT (1<<1) -#define P_OF_PROTECTED (1<<2) -#define P_SF_REINFORCEMENT (1<<3) -#define P_OF_NO_SHIELDS (1<<4) -#define P_SF_ESCORT (1<<5) -#define P_OF_PLAYER_START (1<<6) -#define P_SF_NO_ARRIVAL_MUSIC (1<<7) -#define P_SF_NO_ARRIVAL_WARP (1<<8) -#define P_SF_NO_DEPARTURE_WARP (1<<9) -#define P_SF_LOCKED (1<<10) -#define P_OF_INVULNERABLE (1<<11) -#define P_SF_HIDDEN_FROM_SENSORS (1<<12) -#define P_SF_SCANNABLE (1<<13) // ship is a "scannable" ship -#define P_AIF_KAMIKAZE (1<<14) -#define P_AIF_NO_DYNAMIC (1<<15) -#define P_SF_RED_ALERT_STORE_STATUS (1<<16) -#define P_OF_BEAM_PROTECTED (1<<17) -#define P_OF_FLAK_PROTECTED (1<<18) -#define P_OF_LASER_PROTECTED (1<<19) -#define P_OF_MISSILE_PROTECTED (1<<20) -#define P_SF_GUARDIAN (1<<21) -#define P_KNOSSOS_WARP_IN (1<<22) -#define P_SF_VAPORIZE (1<<23) -#define P_SF2_STEALTH (1<<24) -#define P_SF2_FRIENDLY_STEALTH_INVIS (1<<25) -#define P_SF2_DONT_COLLIDE_INVIS (1<<26) - -// the following parse object flags are used internally by FreeSpace -#define P_SF_USE_UNIQUE_ORDERS (1<<27) // tells a newly created ship to use the default orders for that ship -#define P_SF_DOCK_LEADER (1<<28) // Goober5000 - a docked parse object that is the leader of its group -#define P_SF_CANNOT_ARRIVE (1<<29) // used to indicate that this ship's arrival cue will never be true -#define P_SF_WARP_BROKEN (1<<30) // warp engine should be broken for this ship -#define P_SF_WARP_NEVER (1<<31) // warp drive is destroyed - -// more parse flags! -- Goober5000 -// same caveat: This list of bitfield indicators MUST correspond EXACTLY -// (i.e., order and position must be the same) to its counterpart in MissionParse.cpp!!!! - -#define MAX_PARSE_OBJECT_FLAGS_2 25 - -#define P2_SF2_PRIMITIVE_SENSORS (1<<0) -#define P2_SF2_NO_SUBSPACE_DRIVE (1<<1) -#define P2_SF2_NAV_CARRY_STATUS (1<<2) -#define P2_SF2_AFFECTED_BY_GRAVITY (1<<3) -#define P2_SF2_TOGGLE_SUBSYSTEM_SCANNING (1<<4) -#define P2_OF_TARGETABLE_AS_BOMB (1<<5) -#define P2_SF2_NO_BUILTIN_MESSAGES (1<<6) -#define P2_SF2_PRIMARIES_LOCKED (1<<7) -#define P2_SF2_SECONDARIES_LOCKED (1<<8) -#define P2_SF2_NO_DEATH_SCREAM (1<<9) -#define P2_SF2_ALWAYS_DEATH_SCREAM (1<<10) -#define P2_SF2_NAV_NEEDSLINK (1<<11) -#define P2_SF2_HIDE_SHIP_NAME (1<<12) -#define P2_SF2_SET_CLASS_DYNAMICALLY (1<<13) -#define P2_SF2_LOCK_ALL_TURRETS_INITIALLY (1<<14) -#define P2_SF2_AFTERBURNER_LOCKED (1<<15) -#define P2_OF_FORCE_SHIELDS_ON (1<<16) -#define P2_OF_IMMOBILE (1<<17) -#define P2_SF2_NO_ETS (1<<18) -#define P2_SF2_CLOAKED (1<<19) -#define P2_SF2_SHIP_LOCKED (1<<20) -#define P2_SF2_WEAPONS_LOCKED (1<<21) -#define P2_SF2_SCRAMBLE_MESSAGES (1<<22) -#define P2_OF_NO_COLLIDE (1<<23) // This actually changes the OF_COLLIDES object flag -#define P2_SF2_NO_DISABLED_SELF_DESTRUCT (1<<24) - -// and again: these flags do not appear in the array -//#define blah (1<<28) -//#define blah (1<<29) -#define P2_RED_ALERT_DELETED (1<<30) // Goober5000 - used analogously to SEF_PLAYER_DELETED -#define P2_ALREADY_HANDLED (1<<31) // Goober5000 - used for docking currently, but could be used generically - - // Goober5000 - this is now dynamic extern SCP_vector Parse_objects; #define POBJ_INDEX(pobjp) (int)(pobjp - &Parse_objects[0]) // yes, this arithmetic is valid :D @@ -581,7 +475,7 @@ p_object *mission_parse_get_arrival_ship(const char *name); p_object *mission_parse_get_parse_object(ushort net_signature); p_object *mission_parse_get_parse_object(const char *name); int parse_create_object(p_object *objp); -void resolve_parse_flags(object *objp, int parse_flags, int parse_flags2); +void resolve_parse_flags(object *objp, flagset &parse_flags); void mission_parse_close(); diff --git a/code/mission/missiontraining.cpp b/code/mission/missiontraining.cpp index 2714fc854f..a70fba4e24 100644 --- a/code/mission/missiontraining.cpp +++ b/code/mission/missiontraining.cpp @@ -207,7 +207,7 @@ bool HudGaugeDirectives::canRender() } if (gauge_config == HUD_ETS_GAUGE) { - if (Ships[Player_obj->instance].flags2 & SF2_NO_ETS) { + if (Ships[Player_obj->instance].flags[Ship::Ship_Flags::No_ets]) { return false; } } @@ -932,7 +932,7 @@ void message_training_queue_check() // if the instructor is dying or departing, do nothing if ( iship_num != -1 ) // added by Goober5000 - if (Ships[iship_num].flags & (SF_DYING | SF_DEPARTING)) + if (Ships[iship_num].is_dying_or_departing()) return; if (Training_failure) diff --git a/code/missionui/missionbrief.cpp b/code/missionui/missionbrief.cpp index afe402da25..22c57b4696 100644 --- a/code/missionui/missionbrief.cpp +++ b/code/missionui/missionbrief.cpp @@ -348,7 +348,7 @@ void brief_skip_training_pressed() mission_campaign_eval_next_mission(); mission_campaign_mission_over(); - if ( The_mission.flags & MISSION_FLAG_END_TO_MAINHALL ) { + if ( The_mission.flags[Mission::Mission_Flags::End_to_mainhall] ) { gameseq_post_event( GS_EVENT_MAIN_MENU ); } else { gameseq_post_event( GS_EVENT_START_GAME ); @@ -880,7 +880,7 @@ void brief_init() return; } - if (The_mission.flags & MISSION_FLAG_ALWAYS_SHOW_GOALS || !(The_mission.game_type & MISSION_TYPE_TRAINING)) + if (The_mission.flags[Mission::Mission_Flags::Always_show_goals] || !(The_mission.game_type & MISSION_TYPE_TRAINING)) Num_brief_stages = Briefing->num_stages + 1; else Num_brief_stages = Briefing->num_stages; @@ -1058,12 +1058,10 @@ void brief_render_closeup(int ship_class, float frametime) model_clear_instance( Closeup_icon->modelnum ); - int is_neb = The_mission.flags & MISSION_FLAG_FULLNEB; // maybe switch off nebula rendering - if(is_neb){ - The_mission.flags &= ~MISSION_FLAG_FULLNEB; - } + auto neb_restore = The_mission.flags[Mission::Mission_Flags::Fullneb]; + The_mission.flags.remove(Mission::Mission_Flags::Fullneb); model_render_params render_info; render_info.set_detail_level_lock(0); @@ -1077,9 +1075,7 @@ void brief_render_closeup(int ship_class, float frametime) model_render_immediate( &render_info, Closeup_icon->modelnum, &Closeup_orient, &Closeup_pos ); - if (is_neb) { - The_mission.flags |= MISSION_FLAG_FULLNEB; - } + The_mission.flags.set(Mission::Mission_Flags::Fullneb, neb_restore); gr_end_view_matrix(); gr_end_proj_matrix(); @@ -1472,7 +1468,7 @@ void brief_do_frame(float frametime) // commit if skipping briefing, but not in multi - Goober5000 if (!(Game_mode & GM_MULTIPLAYER)) { - if (The_mission.flags & MISSION_FLAG_NO_BRIEFING) + if (The_mission.flags[Mission::Mission_Flags::No_briefing]) { commit_pressed(); return; @@ -1987,7 +1983,7 @@ int brief_only_allow_briefing() return 1; } - if ( The_mission.flags & (MISSION_FLAG_SCRAMBLE | MISSION_FLAG_RED_ALERT) ) { + if ( The_mission.flags[Mission::Mission_Flags::Scramble] || The_mission.flags[Mission::Mission_Flags::Red_alert] ) { return 1; } diff --git a/code/missionui/missiondebrief.cpp b/code/missionui/missiondebrief.cpp index 500acdb48d..92ba0a938d 100644 --- a/code/missionui/missiondebrief.cpp +++ b/code/missionui/missiondebrief.cpp @@ -774,7 +774,7 @@ int debrief_set_stages_and_multi_stuff() if ( !(Game_mode & GM_MULTIPLAYER) ) { // although the no traitor flag check seems redundant it allows the mission designer to turn the traitor // debriefing off before the mission ends and supply one themselves - if ((Player_ship->team == Iff_traitor) && !(The_mission.flags & MISSION_FLAG_NO_TRAITOR)) + if ((Player_ship->team == Iff_traitor) && !(The_mission.flags[Mission::Mission_Flags::No_traitor])) debriefp = &Traitor_debriefing; } @@ -1389,7 +1389,7 @@ void debrief_accept(int ok_to_post_start_game_event) } // check if campaign is over, or if FREDer wants the mainhall - if ( Campaign.next_mission == -1 || (The_mission.flags & MISSION_FLAG_END_TO_MAINHALL) ) { + if ( Campaign.next_mission == -1 || (The_mission.flags[Mission::Mission_Flags::End_to_mainhall]) ) { gameseq_post_event(GS_EVENT_MAIN_MENU); } else { if ( ok_to_post_start_game_event ) { @@ -1404,7 +1404,7 @@ void debrief_accept(int ok_to_post_start_game_event) } // Goober5000 - if ( play_commit_sound && !(The_mission.flags & MISSION_FLAG_TOGGLE_DEBRIEFING)) { + if ( play_commit_sound && !(The_mission.flags[Mission::Mission_Flags::Toggle_debriefing])) { gamesnd_play_iface(SND_COMMIT_PRESSED); } @@ -2287,7 +2287,7 @@ void debrief_do_frame(float frametime) Assert(Debrief_inited); // Goober5000 - accept immediately if skipping debriefing - if (The_mission.flags & MISSION_FLAG_TOGGLE_DEBRIEFING) + if (The_mission.flags[Mission::Mission_Flags::Toggle_debriefing]) { // make sure that we can actually advance - we don't want an endless loop!!! if ( !((/*Cheats_enabled ||*/ Turned_traitor || Must_replay_mission) && (Game_mode & GM_CAMPAIGN_MODE)) ) diff --git a/code/missionui/missionscreencommon.cpp b/code/missionui/missionscreencommon.cpp index 5be1f403fd..f5f7c5dccc 100644 --- a/code/missionui/missionscreencommon.cpp +++ b/code/missionui/missionscreencommon.cpp @@ -11,6 +11,7 @@ #include // this is need even when not building debug!! +#include #include "anim/animplay.h" #include "cmdline/cmdline.h" @@ -1527,7 +1528,7 @@ int restore_wss_data(ubyte *block) return offset; } -void draw_model_icon(int model_id, int flags, float closeup_zoom, int x, int y, int w, int h, const ship_info *sip, int resize_mode, const vec3d *closeup_pos) +void draw_model_icon(int model_id, int flags, float closeup_zoom, int x, int y, int w, int h, ship_info *sip, int resize_mode, const vec3d *closeup_pos) { matrix object_orient = IDENTITY_MATRIX; angles rot_angles = {0.0f,0.0f,0.0f}; @@ -1543,11 +1544,11 @@ void draw_model_icon(int model_id, int flags, float closeup_zoom, int x, int y, // If non-zero model_icon_angles exists, always use that rot_angles = sip->model_icon_angles; } - else if(sip->flags & SIF_SMALL_SHIP) + else if(sip->is_small_ship()) { rot_angles.p = -(PI_2); } - else if((sip->max_speed <= 0.0f) && !(sip->flags & SIF_CARGO)) + else if((sip->max_speed <= 0.0f) && !(sip->flags[Ship::Info_Flags::Cargo])) { //Probably an installation or Knossos rot_angles.h = PI; diff --git a/code/missionui/missionscreencommon.h b/code/missionui/missionscreencommon.h index ab40f6f67a..aa7b29c91e 100644 --- a/code/missionui/missionscreencommon.h +++ b/code/missionui/missionscreencommon.h @@ -205,7 +205,7 @@ int store_wss_data(ubyte *block, int max_size, int sound,int player_index); int restore_wss_data(ubyte *block); class ship_info; -void draw_model_icon(int model_id, int flags, float closeup_zoom, int x1, int x2, int y1, int y2, const ship_info* sip = NULL, int resize_mode = GR_RESIZE_FULL, const vec3d *closeup_pos = &vmd_zero_vector); +void draw_model_icon(int model_id, int flags, float closeup_zoom, int x1, int x2, int y1, int y2, ship_info* sip = NULL, int resize_mode = GR_RESIZE_FULL, const vec3d *closeup_pos = &vmd_zero_vector); void draw_model_rotating(model_render_params *render_info, int model_id, int x1, int y1, int x2, int y2, float *rotation_buffer, vec3d *closeup_pos=NULL, float closeup_zoom = .65f, float rev_rate = REVOLUTION_RATE, int flags = MR_AUTOCENTER | MR_NO_FOGGING, int resize_mode=GR_RESIZE_FULL, int effect = 2); void common_set_team_pointers(int team); diff --git a/code/missionui/missionshipchoice.cpp b/code/missionui/missionshipchoice.cpp index fb911e1350..258efd1278 100644 --- a/code/missionui/missionshipchoice.cpp +++ b/code/missionui/missionshipchoice.cpp @@ -1451,10 +1451,10 @@ void ship_select_do(float frametime) { ship_info *sip = &Ship_info[Selected_ss_class]; float rev_rate = REVOLUTION_RATE; - if (sip->flags & SIF_BIG_SHIP) { + if (sip->is_big_ship()) { rev_rate *= 1.7f; } - if (sip->flags & SIF_HUGE_SHIP) { + if (sip->is_huge_ship()) { rev_rate *= 3.0f; } @@ -1906,7 +1906,7 @@ void commit_pressed() mission_hotkey_validate(); // Goober5000 - no sound when skipping briefing - if (!(The_mission.flags & MISSION_FLAG_NO_BRIEFING)) + if (!(The_mission.flags[Mission::Mission_Flags::No_briefing])) gamesnd_play_iface(SND_COMMIT_PRESSED); // save the player loadout @@ -3029,10 +3029,10 @@ void ss_init_units() // going to be able to modify that ship. if ( ss_slot->sa_index == -1 ) { int objnum; - if ( Ships[wp->ship_index[j]].flags2 & SF2_SHIP_LOCKED ) { + if ( Ships[wp->ship_index[j]].flags[Ship::Ship_Flags::Ship_locked] ) { ss_slot->status |= WING_SLOT_SHIPS_DISABLED; } - if ( Ships[wp->ship_index[j]].flags2 & SF2_WEAPONS_LOCKED ) { + if ( Ships[wp->ship_index[j]].flags[Ship::Ship_Flags::Weapons_locked] ) { ss_slot->status |= WING_SLOT_WEAPONS_DISABLED; } @@ -3042,7 +3042,7 @@ void ss_init_units() } objnum = Ships[wp->ship_index[j]].objnum; - if ( Objects[objnum].flags & OF_PLAYER_SHIP ) { + if ( Objects[objnum].flags[Object::Object_Flags::Player_ship] ) { if ( ss_slot->status & WING_SLOT_LOCKED ) { // Int3(); // Get Alan @@ -3055,10 +3055,10 @@ void ss_init_units() } } } else { - if ( Parse_objects[ss_slot->sa_index].flags2 & P2_SF2_SHIP_LOCKED ) { + if (Parse_objects[ss_slot->sa_index].flags[Mission::Parse_Object_Flags::SF_Ship_locked]) { ss_slot->status |= WING_SLOT_SHIPS_DISABLED; } - if ( Parse_objects[ss_slot->sa_index].flags2 & P2_SF2_WEAPONS_LOCKED ) { + if ( Parse_objects[ss_slot->sa_index].flags[Mission::Parse_Object_Flags::SF_Weapons_locked] ) { ss_slot->status |= WING_SLOT_WEAPONS_DISABLED; } @@ -3066,7 +3066,7 @@ void ss_init_units() if (!(ss_slot->status & WING_SLOT_DISABLED)) { ss_slot->status = WING_SLOT_FILLED; } - if ( Parse_objects[ss_slot->sa_index].flags & P_OF_PLAYER_START ) { + if ( Parse_objects[ss_slot->sa_index].flags[Mission::Parse_Object_Flags::OF_Player_start] ) { if ( ss_slot->status & WING_SLOT_LOCKED ) { // Int3(); // Get Alan diff --git a/code/missionui/missionweaponchoice.cpp b/code/missionui/missionweaponchoice.cpp index 40927e1caa..44a2baa63d 100644 --- a/code/missionui/missionweaponchoice.cpp +++ b/code/missionui/missionweaponchoice.cpp @@ -848,10 +848,10 @@ void wl_render_overhead_view(float frametime) { float rev_rate; rev_rate = REVOLUTION_RATE; - if (sip->flags & SIF_BIG_SHIP) { + if (sip->is_big_ship()) { rev_rate *= 1.7f; } - if (sip->flags & SIF_HUGE_SHIP) { + if (sip->is_huge_ship()) { rev_rate *= 3.0f; } @@ -1124,7 +1124,7 @@ void wl_set_disabled_weapons(int ship_class) if (Weapon_info[i].wi_flags2 & WIF2_BALLISTIC) { // not allowed if this ship is not ballistic - if (!(sip->flags & SIF_BALLISTIC_PRIMARIES)) + if (!(sip->flags[Ship::Info_Flags::Ballistic_primaries])) { Wl_icons[i].can_use = 0; } @@ -4044,7 +4044,7 @@ void wl_apply_current_loadout_to_all_ships_in_current_wing() // make sure this ship can accept this weapon if (!eval_weapon_flag_for_game_type(sip->allowed_weapons[weapon_type_to_add]) - || ((wip->wi_flags2 & WIF2_BALLISTIC) && !(sip->flags & SIF_BALLISTIC_PRIMARIES))) + || ((wip->wi_flags2 & WIF2_BALLISTIC) && !(sip->flags[Ship::Info_Flags::Ballistic_primaries]))) { SCP_string temp; sprintf(temp, XSTR("%s is unable to carry %s weaponry", 1629), ship_name, wep_display_name); diff --git a/code/missionui/redalert.cpp b/code/missionui/redalert.cpp index 430d8971c9..8f3d9809b1 100644 --- a/code/missionui/redalert.cpp +++ b/code/missionui/redalert.cpp @@ -390,7 +390,7 @@ void red_alert_do_frame(float frametime) // commit if skipping briefing, but not in multi - Goober5000 if (!(Game_mode & GM_MULTIPLAYER)) { - if (The_mission.flags & MISSION_FLAG_NO_BRIEFING) + if (The_mission.flags[Mission::Mission_Flags::No_briefing]) { red_alert_button_pressed(RA_CONTINUE); return; @@ -725,11 +725,11 @@ void red_alert_store_wingman_status() Assert(ship_objp->type == OBJ_SHIP); shipp = &Ships[ship_objp->instance]; - if ( shipp->flags & SF_DYING ) { + if ( shipp->flags[Ship::Ship_Flags::Dying] ) { continue; } - if ( !(shipp->flags & SF_FROM_PLAYER_WING) && !(shipp->flags & SF_RED_ALERT_STORE_STATUS) ) { + if ( !(shipp->flags[Ship::Ship_Flags::From_player_wing]) && !(shipp->flags[Ship::Ship_Flags::Red_alert_store_status]) ) { continue; } @@ -800,10 +800,10 @@ void red_alert_delete_ship(p_object *pobjp, int ship_state) { if (ship_state == RED_ALERT_DESTROYED_SHIP_CLASS || ship_state == RED_ALERT_PLAYER_DEL_SHIP_CLASS) { - pobjp->flags2 |= P2_RED_ALERT_DELETED; + pobjp->flags[Mission::Parse_Object_Flags::Red_alert_deleted]; - if (pobjp->wingnum < 0) - pobjp->flags |= P_SF_CANNOT_ARRIVE; + if (pobjp->wingnum < 0) + pobjp->flags.set(Mission::Parse_Object_Flags::SF_Cannot_arrive); } else Error(LOCATION, "Red Alert: asked to delete ship (%s) with invalid ship state (%d)", pobjp->name, ship_state); @@ -842,7 +842,7 @@ void red_alert_bash_wingman_status() Assert(ship_objp->type == OBJ_SHIP); ship *shipp = &Ships[ship_objp->instance]; - if ( !(shipp->flags & SF_FROM_PLAYER_WING) && !(shipp->flags & SF_RED_ALERT_STORE_STATUS) ) { + if ( !(shipp->flags[Ship::Ship_Flags::From_player_wing]) && !(shipp->flags[Ship::Ship_Flags::Red_alert_store_status]) ) { so = GET_NEXT(so); continue; } @@ -932,7 +932,7 @@ void red_alert_bash_wingman_status() } // same condition as in ship_obj loop - if ( !from_player_wing && !(pobjp->flags & P_SF_RED_ALERT_STORE_STATUS) ) { + if ( !from_player_wing && !(pobjp->flags[Mission::Parse_Object_Flags::SF_Red_alert_store_status]) ) { continue; } @@ -1016,11 +1016,11 @@ void red_alert_bash_wingman_status() if (pobjp->wingnum == ii->first) { // no waves left to arrive, so mark ships accordingly - if (wingp->num_waves == 0) - pobjp->flags |= P_SF_CANNOT_ARRIVE; - // we skipped one complete wave, so clear the flag so the next wave creates all ships - else - pobjp->flags2 &= ~P2_RED_ALERT_DELETED; + if (wingp->num_waves == 0) + pobjp->flags.set(Mission::Parse_Object_Flags::SF_Cannot_arrive); + // we skipped one complete wave, so clear the flag so the next wave creates all ships + else + pobjp->flags.remove(Mission::Parse_Object_Flags::Red_alert_deleted); } } } @@ -1030,7 +1030,7 @@ void red_alert_bash_wingman_status() // return !0 if this is a red alert mission, otherwise return 0 int red_alert_mission() { - return (The_mission.flags & MISSION_FLAG_RED_ALERT); + return (The_mission.flags[Mission::Mission_Flags::Red_alert]); } // called from sexpression code to start a red alert mission diff --git a/code/model/model_flags.h b/code/model/model_flags.h new file mode 100644 index 0000000000..fb4d0a3643 --- /dev/null +++ b/code/model/model_flags.h @@ -0,0 +1,88 @@ +#ifndef MODEL_FLAGS_H +#define MODEL_FLAGS_H + +#include "globalincs/flagset.h" + +namespace Model { + + FLAG_LIST(Subsystem_Flags) { + Rotates, // This means the object rotates automatically with "turn_rate" + Stepped_rotate, // This means that the rotation occurs in steps + Ai_rotate, // This means that the rotation is controlled by ai + Crewpoint, // If set, this is a crew point. + Turret_matrix, // If set, this has it's turret matrix created correctly. + Awacs, // If set, this subsystem has AWACS capability + Artillery, // if this rotates when weapons are fired - Goober5000 + Triggered, // rotates when triggered by something + Untargetable, // Goober5000 + Carry_no_damage, // WMC + Use_multiple_guns, // WMC + Fire_on_normal, // forces a turret to fire down its normal vecs + Turret_hull_check, // makes the turret check to see if it's going to shoot through it's own hull before fireing - Bobboau + Turret_fixed_fp, // forces turret (when defined with multiple weapons) to prevent the firepoints from alternating + Turret_salvo, // forces turret to fire salvos (all guns simultaneously) - independent targeting + Fire_on_target, // prevents turret from firing unless it is pointing at the firingpoints are pointing at the target + No_ss_targeting, // toggles the subsystem targeting for the turret + Turret_reset_idle, // makes turret reset to their initial position if the target is out of field of view + Turret_alt_math, // tells the game to use additional calculations should turret have a defined y fov + Dum_rotates, // Bobboau + Carry_shockwave, // subsystem - even with 'carry no damage' flag - will carry shockwave damage to the hull + Allow_landing, // This subsystem can be landed on + Fov_edge_check, // Tells the game to use better FOV edge checking with this turret + Fov_required, // Tells game not to allow this turret to attempt targeting objects out of FOV + No_replace, // set the subsys not to draw replacement ('destroyed') model + No_live_debris, // sets the subsys not to release live debris + Ignore_if_dead, // tells homing missiles to ignore the subsys if its dead and home on to hull instead of earlier subsys pos + Allow_vanishing, // allows subsystem to vanish (prevents explosions & sounds effects from being played) + Damage_as_hull, // applies armor damage to subsystem instead of subsystem damage - FUBAR + Turret_locked, // Turret starts locked by default - Sushi + No_aggregate, // Don't include with aggregate subsystem types - Goober5000 + Turret_anim_wait, // Turret won't fire until animation is complete - Sushi + Player_turret_sound, + Turret_only_target_if_can_fire,// Turrets only target things they're allowed to shoot at (e.g. if check-hull fails, won't keep targeting) + No_disappear, // Submodel won't disappear when subsystem destroyed + Collide_submodel, // subsystem takes damage only from hits which impact the associated submodel + Destroyed_rotation, // allows subobjects to continue to rotate even if they have been destroyed + + NUM_VALUES + }; + + FLAG_LIST(Render_Flags) { + Normal, // Draw a normal object + Show_outline, // Draw the object in outline mode. Color specified by model_set_outline_color + Show_pivots, // Show the pivot points + Show_paths, // Show the paths associated with a model + Show_radius, // Show the radius around the object + Show_shields, // Show the shield mesh + Show_thrusters, // Show the engine thrusters. See model_set_thrust for how long it draws. + Lock_detail, // Only draw the detail level defined in model_set_detail_level + No_polys, // Don't draw the polygons. + No_lighting, // Don't perform any lighting on the model. + No_texturing, // Draw textures as flat-shaded polygons. + No_correct, // Don't to correct texture mapping + No_smoothing, // Don't perform smoothing on vertices. + Is_asteroid, // When set, treat this as an asteroid. + Is_missile, // When set, treat this as a missilie. No lighting, small thrusters. + Show_outline_preset, // Draw the object in outline mode. Color assumed to be set already. + Show_invisible_faces, // Show invisible faces as green... + Autocenter, // Always use the center of the hull bounding box as the center, instead of the pivot point + Bay_paths, // draw bay paths + All_xparent, // render it fully transparent + No_zbuffer, // switch z-buffering off completely + No_cull, // don't cull backfacing poly's + Force_texture, // force a given texture to always be used + Force_lower_detail, // force the model to draw 1 LOD lower, if possible + Edge_alpha, // makes norms that are faceing away from you render more transparent -Bobboau + Center_alpha, // oposite of above -Bobboau + No_fogging, // Don't fog - taylor + Show_outline_htl, // Show outlines (wireframe view) using HTL method + No_glowmaps, // disable rendering of glowmaps - taylor + Full_detail, // render all valid objects, particularly ones that are otherwise in/out of render boxes - taylor + Force_clamp, // force clamp - Hery + Animated_shader, // Use a animated Shader - Valathil + + NUM_VALUES + }; +} + +#endif \ No newline at end of file diff --git a/code/model/modelread.cpp b/code/model/modelread.cpp index baba6e3792..ea88d0d37b 100644 --- a/code/model/modelread.cpp +++ b/code/model/modelread.cpp @@ -3045,7 +3045,7 @@ void model_set_bay_path_nums(polymodel *pm) /* // currently only capital ships have fighter bays - if ( !(sip->flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP)) ) { + if ( !(sip->is_big_or_huge()) ) { return; } */ diff --git a/code/model/modelrender.cpp b/code/model/modelrender.cpp index 19619a78aa..ca2151d57c 100644 --- a/code/model/modelrender.cpp +++ b/code/model/modelrender.cpp @@ -1140,7 +1140,7 @@ float model_render_determine_depth(int obj_num, int model_num, matrix* orient, v } // nebula ? - if (The_mission.flags & MISSION_FLAG_FULLNEB) { + if (The_mission.flags[Mission::Mission_Flags::Fullneb]) { depth *= neb2_get_lod_scale(obj_num); } @@ -1745,7 +1745,7 @@ void submodel_render_queue(model_render_params *render_info, draw_list *scene, i uint tmap_flags = TMAP_FLAG_GOURAUD | TMAP_FLAG_RGB; // if we're in nebula mode - if( ( The_mission.flags & MISSION_FLAG_FULLNEB ) && ( Neb2_render_mode != NEB2_RENDER_NONE ) ) { + if( ( The_mission.flags[Mission::Mission_Flags::Fullneb] ) && ( Neb2_render_mode != NEB2_RENDER_NONE ) ) { tmap_flags |= TMAP_FLAG_PIXEL_FOG; } @@ -1878,7 +1878,7 @@ void model_render_glowpoint(int point_num, vec3d *pos, matrix *orient, glow_poin vm_vec_unrotate(&world_norm, &loc_norm, orient); if ( shipp != NULL ) { - if ( (shipp->flags & (SF_ARRIVING) ) && (shipp->warpin_effect) && Ship_info[shipp->ship_info_index].warpin_type != WT_HYPERSPACE) { + if ( (shipp->is_arriving() ) && (shipp->warpin_effect) && Ship_info[shipp->ship_info_index].warpin_type != WT_HYPERSPACE) { vec3d warp_pnt, tmp; matrix warp_orient; @@ -1891,7 +1891,7 @@ void model_render_glowpoint(int point_num, vec3d *pos, matrix *orient, glow_poin } } - if ( (shipp->flags & (SF_DEPART_WARP) ) && (shipp->warpout_effect) && Ship_info[shipp->ship_info_index].warpout_type != WT_HYPERSPACE) { + if ( (shipp->flags[Ship::Ship_Flags::Depart_warp] ) && (shipp->warpout_effect) && Ship_info[shipp->ship_info_index].warpout_type != WT_HYPERSPACE) { vec3d warp_pnt, tmp; matrix warp_orient; @@ -1932,7 +1932,7 @@ void model_render_glowpoint(int point_num, vec3d *pos, matrix *orient, glow_poin // fade them in the nebula as well - if ( The_mission.flags & MISSION_FLAG_FULLNEB ) { + if ( The_mission.flags[Mission::Mission_Flags::Fullneb] ) { //vec3d npnt; //vm_vec_add(&npnt, &loc_offset, pos); @@ -2078,7 +2078,7 @@ void model_render_glowpoint(int point_num, vec3d *pos, matrix *orient, glow_poin vm_vec_sub(&tempv,&View_position,&loc_offset); vm_vec_normalize(&tempv); - if ( The_mission.flags & MISSION_FLAG_FULLNEB ) { + if ( The_mission.flags[Mission::Mission_Flags::Fullneb] ) { batch_add_quad(bank->glow_neb_bitmap, TMAP_FLAG_TILED | TMAP_FLAG_TEXTURED | TMAP_FLAG_CORRECT | TMAP_HTL_3D_UNLIT | TMAP_FLAG_EMISSIVE, verts); } else { batch_add_quad(bank->glow_bitmap, TMAP_FLAG_TILED | TMAP_FLAG_TEXTURED | TMAP_FLAG_CORRECT | TMAP_HTL_3D_UNLIT | TMAP_FLAG_EMISSIVE, verts); @@ -2326,7 +2326,7 @@ void model_queue_render_thrusters(model_render_params *interp, polymodel *pm, in if (shipp) { // if ship is warping out, check position of the engine glow to the warp plane - if ( (shipp->flags & (SF_ARRIVING) ) && (shipp->warpin_effect) && Ship_info[shipp->ship_info_index].warpin_type != WT_HYPERSPACE) { + if ( (shipp->is_arriving() ) && (shipp->warpin_effect) && Ship_info[shipp->ship_info_index].warpin_type != WT_HYPERSPACE) { vec3d warp_pnt, tmp; matrix warp_orient; @@ -2339,7 +2339,7 @@ void model_queue_render_thrusters(model_render_params *interp, polymodel *pm, in } } - if ( (shipp->flags & (SF_DEPART_WARP) ) && (shipp->warpout_effect) && Ship_info[shipp->ship_info_index].warpout_type != WT_HYPERSPACE) { + if ( (shipp->flags[Ship::Ship_Flags::Depart_warp] ) && (shipp->warpout_effect) && Ship_info[shipp->ship_info_index].warpout_type != WT_HYPERSPACE) { vec3d warp_pnt, tmp; matrix warp_orient; @@ -2395,7 +2395,7 @@ void model_queue_render_thrusters(model_render_params *interp, polymodel *pm, in float fog_int = 1.0f; // fade them in the nebula as well - if (The_mission.flags & MISSION_FLAG_FULLNEB) { + if (The_mission.flags[Mission::Mission_Flags::Fullneb]) { vm_vec_unrotate(&npnt, &gpt->pnt, orient); vm_vec_add2(&npnt, pos); @@ -2465,7 +2465,7 @@ void model_queue_render_thrusters(model_render_params *interp, polymodel *pm, in vm_vec_scale_add(&norm2, &pnt, &fvec, wVal * 2 * thruster_info.glow_length_factor); - if (The_mission.flags & MISSION_FLAG_FULLNEB) { + if (The_mission.flags[Mission::Mission_Flags::Fullneb]) { vm_vec_add(&npnt, &pnt, pos); d *= fog_int; } @@ -2786,7 +2786,7 @@ void model_render_queue(model_render_params *interp, draw_list *scene, int model uint tmap_flags = TMAP_FLAG_GOURAUD | TMAP_FLAG_RGB; // if we're in nebula mode, fog everything except for the warp holes and other non-fogged models - if((The_mission.flags & MISSION_FLAG_FULLNEB) && (Neb2_render_mode != NEB2_RENDER_NONE) && !(model_flags & MR_NO_FOGGING)){ + if((The_mission.flags[Mission::Mission_Flags::Fullneb]) && (Neb2_render_mode != NEB2_RENDER_NONE) && !(model_flags & MR_NO_FOGGING)){ tmap_flags |= TMAP_FLAG_PIXEL_FOG; } diff --git a/code/nebula/neb.cpp b/code/nebula/neb.cpp index d7344a5d36..8bdf08dafa 100644 --- a/code/nebula/neb.cpp +++ b/code/nebula/neb.cpp @@ -345,7 +345,7 @@ void neb2_post_level_init() } // if the mission is not a fullneb mission, skip - if ( !((The_mission.flags & MISSION_FLAG_FULLNEB) || Nebula_sexp_used) ) { + if ( !((The_mission.flags[Mission::Mission_Flags::Fullneb]) || Nebula_sexp_used) ) { Neb2_render_mode = NEB2_RENDER_NONE; Neb2_awacs = -1.0f; return; @@ -414,7 +414,7 @@ void neb2_post_level_init() neb2_eye_changed(); // if we are going to use fullneb, but aren't fullneb yet, then be sure to reset our mode - if ( !(The_mission.flags & MISSION_FLAG_FULLNEB) ) { + if ( !(The_mission.flags[Mission::Mission_Flags::Fullneb]) ) { Neb2_render_mode = NEB2_RENDER_NONE; Neb2_awacs = -1.0f; } @@ -431,7 +431,7 @@ void neb2_level_close() } // if the mission is not a fullneb mission, skip - if ( !((The_mission.flags & MISSION_FLAG_FULLNEB) || Nebula_sexp_used) ) { + if ( !((The_mission.flags[Mission::Mission_Flags::Fullneb]) || Nebula_sexp_used) ) { return; } @@ -444,7 +444,7 @@ void neb2_level_close() } // unflag the mission as being fullneb so stuff doesn't fog in the techdata room :D - The_mission.flags &= ~MISSION_FLAG_FULLNEB; + The_mission.flags.remove(Mission::Mission_Flags::Fullneb); if (Neb2_htl_fog_data) { delete[] Neb2_htl_fog_data; @@ -461,7 +461,7 @@ void neb2_render_setup(camid cid) } // if the mission is not a fullneb mission, skip - if ( !(The_mission.flags & MISSION_FLAG_FULLNEB) ) { + if ( !(The_mission.flags[Mission::Mission_Flags::Fullneb]) ) { return; } @@ -496,7 +496,7 @@ void neb2_page_in() int idx; // load in all nebula bitmaps - if ( (The_mission.flags & MISSION_FLAG_FULLNEB) || Nebula_sexp_used ) { + if ( (The_mission.flags[Mission::Mission_Flags::Fullneb]) || Nebula_sexp_used ) { for (idx = 0; idx < Neb2_poof_count; idx++) { if ( (Neb2_poofs[idx] >= 0) && (Neb2_poof_flags & (1<flags & SIF_SMALL_SHIP) && (z_depth >= (fog_far * 1.5f)) ) { + if ( (sip->is_small_ship()) && (z_depth >= (fog_far * 1.5f)) ) { return 1; } // big ships - if ( (sip->flags & SIF_BIG_SHIP) && (z_depth >= (fog_far * 2.0f)) ) { + if ( (sip->is_big_ship()) && (z_depth >= (fog_far * 2.0f)) ) { return 1; } // huge ships - if ( (sip->flags & SIF_HUGE_SHIP) && (z_depth >= (fog_far * 3.0f)) ) { + if ( (sip->is_huge_ship()) && (z_depth >= (fog_far * 3.0f)) ) { return 1; } break; @@ -620,9 +620,9 @@ float neb2_get_lod_scale(int objnum) sip = &Ship_info[shipp->ship_info_index]; // small ship? - if (sip->flags & SIF_SMALL_SHIP) { + if (sip->is_small_ship()) { return 1.8f; - } else if (sip->flags & SIF_BIG_SHIP) { + } else if (sip->is_big_ship()) { return 1.4f; } @@ -929,7 +929,7 @@ void neb2_render_player() } // if the mission is not a fullneb mission, skip - if (!(The_mission.flags & MISSION_FLAG_FULLNEB)) { + if (!(The_mission.flags[Mission::Mission_Flags::Fullneb])) { return; } @@ -1221,7 +1221,7 @@ int tbmap = -1; void neb2_pre_render(camid cid) { // if the mission is not a fullneb mission, skip - if (!(The_mission.flags & MISSION_FLAG_FULLNEB)) { + if (!(The_mission.flags[Mission::Mission_Flags::Fullneb])) { return; } diff --git a/code/nebula/neblightning.cpp b/code/nebula/neblightning.cpp index 8e0817fe3c..c8162e609c 100644 --- a/code/nebula/neblightning.cpp +++ b/code/nebula/neblightning.cpp @@ -325,7 +325,7 @@ void nebl_render_all() bolt_type *bi; // no lightning in non-nebula missions - if(!(The_mission.flags & MISSION_FLAG_FULLNEB)){ + if(!(The_mission.flags[Mission::Mission_Flags::Fullneb])){ return; } @@ -459,7 +459,7 @@ void nebl_process() uint num_bolts, idx; // non-nebula mission - if(!(The_mission.flags & MISSION_FLAG_FULLNEB)){ + if(!(The_mission.flags[Mission::Mission_Flags::Fullneb])){ return; } @@ -570,7 +570,7 @@ void nebl_bolt(size_t type, vec3d *start, vec3d *strike) bolt_type *bi; float bolt_len; - if(!(The_mission.flags & MISSION_FLAG_FULLNEB)){ + if(!(The_mission.flags[Mission::Mission_Flags::Fullneb])){ return; } diff --git a/code/network/multi.cpp b/code/network/multi.cpp index ffdb59ac89..76567b0a58 100644 --- a/code/network/multi.cpp +++ b/code/network/multi.cpp @@ -1242,7 +1242,7 @@ void multi_do_frame() // send my observer position/object update send_observer_update_packet(); } - } else if ( !(Player_ship->flags & SF_DEPARTING ) ){ + } else if ( !(Player_ship->is_departing() ) ){ // if the rate limiting system says its ok if(multi_oo_cirate_can_send()){ // use the new method diff --git a/code/network/multi_ingame.cpp b/code/network/multi_ingame.cpp index 4f447bf6aa..709ddf0f97 100644 --- a/code/network/multi_ingame.cpp +++ b/code/network/multi_ingame.cpp @@ -900,7 +900,7 @@ void multi_ingame_join_display_avail() moveup = GET_FIRST(&Ship_obj_list); while(moveup != END_OF_LIST(&Ship_obj_list)){ - if( !(Ships[Objects[moveup->objnum].instance].flags & (SF_DYING|SF_DEPARTING)) && (Objects[moveup->objnum].flags & OF_COULD_BE_PLAYER) ) { + if( !(Ships[Objects[moveup->objnum].instance].is_dying_or_departing()) && (Objects[moveup->objnum].flags[Object::Object_Flags::Could_be_player]) ) { // display the ship multi_ingame_join_display_ship(&Objects[moveup->objnum],Mi_name_field[gr_screen.res][MI_FIELD_Y] + (Multi_ingame_num_avail * Mi_spacing[gr_screen.res])); @@ -971,7 +971,8 @@ void multi_ingame_handle_timeout() void process_ingame_ships_packet( ubyte *data, header *hinfo ) { - int offset, sflags, sflags2, oflags, team, j; + int offset, team, j; + uint64_t oflags, sflags; ubyte p_type; ushort net_signature; short wing_data; @@ -1008,9 +1009,8 @@ void process_ingame_ships_packet( ubyte *data, header *hinfo ) GET_STRING( ship_name ); GET_USHORT( net_signature ); - GET_INT( sflags ); - GET_INT( sflags2 ); - GET_INT( oflags ); + GET_ULONG( sflags ); + GET_ULONG( oflags ); GET_INT( team ); GET_SHORT( wing_data ); net_sig_modify = 0; @@ -1039,13 +1039,12 @@ void process_ingame_ships_packet( ubyte *data, header *hinfo ) multi_set_network_signature( net_signature, MULTI_SIG_SHIP ); objnum = parse_create_object( p_objp ); ship_num = Objects[objnum].instance; - Objects[objnum].flags = oflags; + Objects[objnum].flags.from_long(oflags); Objects[objnum].net_signature = net_signature; // assign any common data strcpy_s(Ships[ship_num].ship_name, ship_name); - Ships[ship_num].flags = sflags; - Ships[ship_num].flags2 = sflags2; + Ships[ship_num].flags.from_long(sflags); Ships[ship_num].team = team; Ships[ship_num].wingnum = (int)wing_data; @@ -1077,15 +1076,15 @@ void process_ingame_ships_packet( ubyte *data, header *hinfo ) wl_bash_ship_weapons(&Ships[idx].weapons, &Wss_slots_teams[team_val][slot_index]); // Be sure to mark this ship as as a could_be_player - obj_set_flags( objp, objp->flags | OF_COULD_BE_PLAYER ); - objp->flags &= ~OF_PLAYER_SHIP; + obj_set_flags( objp, objp->flags + Object::Object_Flags::Could_be_player ); + objp->flags.remove(Object::Object_Flags::Player_ship); // if this is a player ship, make sure we find out who's it is and set their objnum accordingly for( j = 0; j < MAX_PLAYERS; j++){ if(MULTI_CONNECTED(Net_players[j]) && (Net_players[j].m_player->objnum == Objects[Ships[idx].objnum].net_signature)) { multi_assign_player_ship( j, objp, Ships[idx].ship_info_index ); - objp->flags |= OF_PLAYER_SHIP; - objp->flags &= ~OF_COULD_BE_PLAYER; + objp->flags.set(Object::Object_Flags::Player_ship); + objp->flags.remove(Object::Object_Flags::Could_be_player); break; } } @@ -1133,9 +1132,8 @@ void send_ingame_ships_packet(net_player *player) ADD_DATA( p_type ); ADD_STRING( shipp->ship_name ); ADD_USHORT( Objects[so->objnum].net_signature ); - ADD_INT( shipp->flags ); - ADD_INT( shipp->flags2 ); - ADD_INT( Objects[so->objnum].flags ); + ADD_ULONG( shipp->flags.to_long() ); + ADD_ULONG( Objects[so->objnum].flags.to_long() ); ADD_INT( shipp->team ); wing_data = (short)shipp->wingnum; ADD_SHORT(wing_data); @@ -1279,7 +1277,7 @@ void process_ingame_wings_packet( ubyte *data, header *hinfo ) // Be sure to mark this ship as as a could_be_player obj_set_flags( objp, objp->flags | OF_COULD_BE_PLAYER ); - objp->flags &= ~OF_PLAYER_SHIP; + objp->flags .remove(Object::Object_flags::Player_ship); } // if this is a player ship, make sure we find out who's it is and set their objnum accordingly @@ -1288,7 +1286,7 @@ void process_ingame_wings_packet( ubyte *data, header *hinfo ) Assert( team != -1 ); // to help trap errors!!! nprintf(("Network", "Making %s ship for %s\n", Ships[shipnum].ship_name, Net_players[j].player->callsign)); multi_assign_player_ship( j, objp, Ships[shipnum].ship_info_index ); - objp->flags |= OF_PLAYER_SHIP; + objp->flags .set(Object::Object_Flags::Player_ship); objp->flags &= ~OF_COULD_BE_PLAYER; break; } @@ -1443,7 +1441,7 @@ void send_ingame_ship_request_packet(int code,int rdata,net_player *pl) // add the ballistic primary flag - Goober5000 val = 0; - if(sip->flags & SIF_BALLISTIC_PRIMARIES){ + if(sip->flags[Ship::Info_Flags::Ballistic_primaries]){ val |= (1<<0); } ADD_DATA(val); @@ -1476,10 +1474,10 @@ void send_ingame_ship_request_packet(int code,int rdata,net_player *pl) // add the link status of weapons // primary link status val = 0; - if(shipp->flags & SF_PRIMARY_LINKED){ + if(shipp->flags[Ship::Ship_Flags::Primary_linked]){ val |= (1<<0); } - if(shipp->flags & SF_SECONDARY_DUAL_FIRE){ + if(shipp->flags[Ship::Ship_Flags::Secondary_dual_fire]){ val |= (1<<1); } ADD_DATA(val); @@ -1591,7 +1589,7 @@ void process_ingame_ship_request_packet(ubyte *data, header *hinfo) // try and find the object objp = NULL; objp = multi_get_network_object(sig_request); - if(objp == NULL || !(objp->flags & OF_COULD_BE_PLAYER)){ + if(objp == NULL || !(objp->flags[Object::Object_Flags::Could_be_player])){ send_ingame_ship_request_packet(INGAME_SR_DENY,0,&Net_players[player_num]); break; } @@ -1605,8 +1603,8 @@ void process_ingame_ship_request_packet(ubyte *data, header *hinfo) // update his ets and link status stuff multi_server_update_player_weapons(&Net_players[player_num],&Ships[objp->instance]); - objp->flags &= ~(OF_COULD_BE_PLAYER); - objp->flags |= OF_PLAYER_SHIP; + objp->flags.remove(Object::Object_Flags::Could_be_player); + objp->flags.set(Object::Object_Flags::Player_ship); // send a player settings packet to update all other players of this guy's final choices send_player_settings_packet(); @@ -1662,8 +1660,8 @@ void process_ingame_ship_request_packet(ubyte *data, header *hinfo) // setup our object Net_player->m_player->objnum = OBJ_INDEX(objp); Player_obj = objp; - Player_obj->flags &= ~(OF_COULD_BE_PLAYER); - Player_obj->flags |= OF_PLAYER_SHIP; + Player_obj->flags.remove(Object::Object_Flags::Could_be_player); + Player_obj->flags.set(Object::Object_Flags::Player_ship); multi_assign_player_ship( MY_NET_PLAYER_NUM, objp, Ships[objp->instance].ship_info_index ); // must change the ship type and weapons. An ingame joiner know about the default class @@ -1690,7 +1688,7 @@ void process_ingame_ship_request_packet(ubyte *data, header *hinfo) // handle the ballistic primary flag - Goober5000 GET_DATA(val); if(val & (1<<0)){ - Player_ship->flags |= SIF_BALLISTIC_PRIMARIES; + Ship_info[Player_ship->ship_info_index].flags.set(Ship::Info_Flags::Ballistic_primaries); } // get current primary and secondary banks, and add link status @@ -1719,10 +1717,10 @@ void process_ingame_ship_request_packet(ubyte *data, header *hinfo) // get the link status of weapons GET_DATA(val); if(val & (1<<0)){ - Player_ship->flags |= SF_PRIMARY_LINKED; + Player_ship->flags.set(Ship::Ship_Flags::Primary_linked); } if(val & (1<<1)){ - Player_ship->flags |= SF_SECONDARY_DUAL_FIRE; + Player_ship->flags.set(Ship::Ship_Flags::Secondary_dual_fire); } PACKET_SET_SIZE(); @@ -1770,8 +1768,8 @@ void process_ingame_ship_request_packet(ubyte *data, header *hinfo) nprintf(("Network", "Couldn't find ship for ingame joiner %s\n", Net_players[player_num].m_player->callsign)); break; } - objp->flags |= OF_PLAYER_SHIP; - objp->flags &= ~OF_COULD_BE_PLAYER; + objp->flags.set(Object::Object_Flags::Player_ship); + objp->flags.remove(Object::Object_Flags::Could_be_player); multi_assign_player_ship( player_num, objp, Ships[objp->instance].ship_info_index ); @@ -1795,7 +1793,7 @@ void multi_ingame_send_ship_update(net_player *p) // go through the list and send all ships which are mark as OF_COULD_BE_PLAYER while(moveup!=END_OF_LIST(&Ship_obj_list)){ //Make sure the object can be a player and is on the same team as this guy - if(Objects[moveup->objnum].flags & OF_COULD_BE_PLAYER && obj_team(&Objects[moveup->objnum]) == p->p_info.team){ + if(Objects[moveup->objnum].flags[Object::Object_Flags::Could_be_player] && obj_team(&Objects[moveup->objnum]) == p->p_info.team){ // send the update send_ingame_ship_update_packet(p,&Ships[Objects[moveup->objnum].instance]); } @@ -1819,7 +1817,7 @@ void send_ingame_ship_update_packet(net_player *p,ship *sp) // just send net signature, shield and hull percentages objp = &Objects[sp->objnum]; ADD_USHORT(objp->net_signature); - ADD_UINT(objp->flags); + ADD_ULONG(objp->flags.to_long()); ADD_INT(objp->n_quadrants); ADD_FLOAT(objp->hull_strength); @@ -1836,7 +1834,7 @@ void process_ingame_ship_update_packet(ubyte *data, header *hinfo) { int offset; float garbage; - int flags; + uint64_t flags; int idx; int n_quadrants; ushort net_sig; @@ -1846,7 +1844,7 @@ void process_ingame_ship_update_packet(ubyte *data, header *hinfo) offset = HEADER_LENGTH; // get the net sig for the ship and do a lookup GET_USHORT(net_sig); - GET_INT(flags); + GET_ULONG(flags); GET_INT(n_quadrants); // get the object @@ -1863,7 +1861,7 @@ void process_ingame_ship_update_packet(ubyte *data, header *hinfo) return; } // otherwise read in the ship values - lookup->flags = flags; + lookup->flags.from_long(flags); lookup->n_quadrants = n_quadrants; GET_FLOAT(lookup->hull_strength); for(idx=0;idxobjnum].flags & OF_SHOULD_BE_DEAD){ + if (Objects[moveup->objnum].flags[Object::Object_Flags::Should_be_dead]){ continue; } // don't send info for dying ships - if (Ships[Objects[moveup->objnum].instance].flags & SF_DYING){ + if (Ships[Objects[moveup->objnum].instance].flags[Ship::Ship_Flags::Dying]){ continue; } // never update the knossos device - if ((Ships[Objects[moveup->objnum].instance].ship_info_index >= 0) && (Ships[Objects[moveup->objnum].instance].ship_info_index < static_cast(Ship_info.size())) && (Ship_info[Ships[Objects[moveup->objnum].instance].ship_info_index].flags & SIF_KNOSSOS_DEVICE)){ + if ((Ships[Objects[moveup->objnum].instance].ship_info_index >= 0) && (Ships[Objects[moveup->objnum].instance].ship_info_index < static_cast(Ship_info.size())) && (Ship_info[Ships[Objects[moveup->objnum].instance].ship_info_index].flags[Ship::Info_Flags::Knossos_device])){ continue; } @@ -289,7 +289,7 @@ int multi_oo_pack_client_data(ubyte *data) if ( Player->locking_on_center ){ out_flags |= OOC_LOCKING_ON_CENTER; } - if ( (Player_ship != NULL) && (Player_ship->flags & SF_TRIGGER_DOWN) ){ + if ( (Player_ship != NULL) && (Player_ship->flags[Ship::Ship_Flags::Trigger_down]) ){ out_flags |= OOC_TRIGGER_DOWN; } @@ -304,7 +304,7 @@ int multi_oo_pack_client_data(ubyte *data) } // linked or not - if(Player_ship->flags & SF_PRIMARY_LINKED){ + if(Player_ship->flags[Ship::Ship_Flags::Primary_linked]){ out_flags |= OOC_PRIMARY_LINKED; } } @@ -518,7 +518,7 @@ int multi_oo_pack_data(net_player *pl, object *objp, ubyte oo_flags, ubyte *data // if this ship is a support ship, send some extra info ubyte support_extra = 0; - if(MULTIPLAYER_MASTER && (sip->flags & SIF_SUPPORT) && (shipp->ai_index >= 0) && (shipp->ai_index < MAX_AI_INFO)){ + if(MULTIPLAYER_MASTER && (sip->flags[Ship::Info_Flags::Support]) && (shipp->ai_index >= 0) && (shipp->ai_index < MAX_AI_INFO)){ ushort dock_sig; // flag @@ -617,9 +617,9 @@ int multi_oo_unpack_client_data(net_player *pl, ubyte *data) // trigger down, bank info if(shipp != NULL){ if(in_flags & OOC_TRIGGER_DOWN){ - shipp->flags |= SF_TRIGGER_DOWN; + shipp->flags.set(Ship::Ship_Flags::Trigger_down); } else { - shipp->flags &= ~SF_TRIGGER_DOWN; + shipp->flags.remove(Ship::Ship_Flags::Trigger_down); } if(in_flags & OOC_PRIMARY_BANK){ @@ -629,9 +629,9 @@ int multi_oo_unpack_client_data(net_player *pl, ubyte *data) } // linked or not - shipp->flags &= ~SF_PRIMARY_LINKED; + shipp->flags.remove(Ship::Ship_Flags::Primary_linked); if(in_flags & OOC_PRIMARY_LINKED){ - shipp->flags |= SF_PRIMARY_LINKED; + shipp->flags.set(Ship::Ship_Flags::Primary_linked); } } @@ -988,15 +988,15 @@ int multi_oo_unpack_data(net_player *pl, ubyte *data) } // linked or not - shipp->flags &= ~SF_PRIMARY_LINKED; + shipp->flags.remove(Ship::Ship_Flags::Primary_linked); if(oo_flags & OO_PRIMARY_LINKED){ - shipp->flags |= SF_PRIMARY_LINKED; + shipp->flags.set(Ship::Ship_Flags::Primary_linked); } // trigger down or not - server doesn't care about this. he'll get it from clients anyway - shipp->flags &= ~SF_TRIGGER_DOWN; + shipp->flags.remove(Ship::Ship_Flags::Trigger_down); if(oo_flags & OO_TRIGGER_DOWN){ - shipp->flags |= SF_TRIGGER_DOWN; + shipp->flags.set(Ship::Ship_Flags::Trigger_down); } } @@ -1149,19 +1149,19 @@ int multi_oo_maybe_update(net_player *pl, object *obj, ubyte *data) oo_flags = OO_POS_NEW | OO_ORIENT_NEW; // if its a small ship, add weapon link info - if((sip != NULL) && (sip->flags & (SIF_FIGHTER | SIF_BOMBER))){ + if((sip != NULL) && (sip->is_fighter_bomber())){ // primary bank 0 or 1 if(shipp->weapons.current_primary_bank > 0){ oo_flags |= OO_PRIMARY_BANK; } // linked or not - if(shipp->flags & SF_PRIMARY_LINKED){ + if(shipp->flags[Ship::Ship_Flags::Primary_linked]){ oo_flags |= OO_PRIMARY_LINKED; } // trigger down or not - if(shipp->flags & SF_TRIGGER_DOWN){ + if(shipp->flags[Ship::Ship_Flags::Trigger_down]){ oo_flags |= OO_TRIGGER_DOWN; } } @@ -1345,7 +1345,7 @@ void multi_oo_process() // do firing stuff for this player if((Net_players[idx].m_player != NULL) && (Net_players[idx].m_player->objnum >= 0) && !(Net_players[idx].flags & NETINFO_FLAG_LIMBO) && !(Net_players[idx].flags & NETINFO_FLAG_RESPAWNING)){ - if((Objects[Net_players[idx].m_player->objnum].flags & OF_PLAYER_SHIP) && !(Objects[Net_players[idx].m_player->objnum].flags & OF_SHOULD_BE_DEAD)){ + if((Objects[Net_players[idx].m_player->objnum].flags[Object::Object_Flags::Player_ship]) && !(Objects[Net_players[idx].m_player->objnum].flags[Object::Object_Flags::Should_be_dead])){ obj_player_fire_stuff( &Objects[Net_players[idx].m_player->objnum], Net_players[idx].m_player->ci ); } } @@ -1442,7 +1442,7 @@ void multi_oo_send_control_info() int packet_size = 0; // if I'm dying or my object type is not a ship, bail here - if((Player_obj != NULL) && (Player_ship->flags & SF_DYING)){ + if((Player_obj != NULL) && (Player_ship->flags[Ship::Ship_Flags::Dying])){ return; } @@ -1849,7 +1849,7 @@ int multi_oo_is_interp_object(object *objp) } // servers only interpolate other player ships - if(!(objp->flags & OF_PLAYER_SHIP)){ + if(!(objp->flags[Object::Object_Flags::Player_ship])){ return 0; } diff --git a/code/network/multi_observer.cpp b/code/network/multi_observer.cpp index abe627972e..17eb300631 100644 --- a/code/network/multi_observer.cpp +++ b/code/network/multi_observer.cpp @@ -106,7 +106,7 @@ void multi_obs_create_observer(net_player *pl) // create the basic observer object objnum = observer_create( &vmd_identity_matrix, &vmd_zero_vector); Assert(objnum != -1); - Objects[objnum].flags |= OF_PLAYER_SHIP; + Objects[objnum].flags.set(Object::Object_Flags::Player_ship); Objects[objnum].net_signature = 0; // put it a 1,1,1 @@ -135,12 +135,13 @@ void multi_obs_create_observer_client() // create the default player ship object and use that as my default virtual "ship", and make it "invisible" pobj_num = parse_create_object(Player_start_pobject); Assert(pobj_num != -1); - obj_set_flags(&Objects[pobj_num],OF_PLAYER_SHIP); + + obj_set_flags(&Objects[pobj_num], Objects[pobj_num].flags + Object::Object_Flags::Player_ship); Player_ship = &Ships[Objects[pobj_num].instance]; // make ship hidden from sensors so that this observer cannot target it. Observers really have two ships // one observer, and one "Player_ship". Observer needs to ignore the Player_ship. - Player_ship->flags |= SF_HIDDEN_FROM_SENSORS; + Player_ship->flags.set(Ship::Ship_Flags::Hidden_from_sensors); strcpy_s(Player_ship->ship_name, XSTR("Observer Ship",688)); Player_ai = &Ai_info[Ships[Objects[pobj_num].instance].ai_index]; diff --git a/code/network/multi_respawn.cpp b/code/network/multi_respawn.cpp index 05fd326a68..bcebbc8846 100644 --- a/code/network/multi_respawn.cpp +++ b/code/network/multi_respawn.cpp @@ -143,7 +143,7 @@ void multi_respawn_check(object *objp) } // if we need to respawn this ai ship, add him to a list of ships to get respawned - if ( (pobjp->flags & P_OF_PLAYER_START) && (pobjp->respawn_count < Netgame.respawn) && !(Netgame.type_flags & NG_TYPE_DOGFIGHT) ){ + if ( (pobjp->flags[Mission::Parse_Object_Flags::OF_Player_start]) && (pobjp->respawn_count < Netgame.respawn) && !(Netgame.type_flags & NG_TYPE_DOGFIGHT) ){ int i; for (i = 0; i < MAX_AI_RESPAWNS; i++ ) { @@ -201,7 +201,7 @@ void multi_respawn_player_leave(net_player *pl) // if we need to respawn this ai ship, add him to a list of ships to get respawned p_object *pobjp = pl->p_info.p_objp; - if ( (pobjp->flags & P_OF_PLAYER_START) && (pobjp->respawn_count < Netgame.respawn) ){ + if ( (pobjp->flags[Mission::Parse_Object_Flags::OF_Player_start]) && (pobjp->respawn_count < Netgame.respawn) ){ int i; for (i = 0; i < MAX_AI_RESPAWNS; i++ ) { @@ -254,14 +254,14 @@ void multi_respawn_handle_invul_players() int idx; object *objp; for(idx=0;idxobjnum].flags & OF_INVULNERABLE)){ + if(MULTI_CONNECTED(Net_players[idx]) && (Objects[Net_players[idx].m_player->objnum].flags[Object::Object_Flags::Invulnerable])){ // make him normal (_non_ invulnerable) on either of 2 conditions : // 1.) More than 5 seconds have passed // 2.) He's fired either a primary or a secondary weapon if( ((Net_players[idx].s_info.invul_timestamp != -1) && (timestamp_elapsed(Net_players[idx].s_info.invul_timestamp))) || ((Net_players[idx].m_player->ci.fire_primary_count > 0) || (Net_players[idx].m_player->ci.fire_secondary_count > 0)) ) { objp = &Objects[Net_players[idx].m_player->objnum]; - obj_set_flags(objp,objp->flags & ~(OF_INVULNERABLE)); + obj_set_flags(objp, objp->flags - Object::Object_Flags::Invulnerable); } } } @@ -279,7 +279,7 @@ void multi_respawn_build_points() moveup = GET_FIRST(&Ship_obj_list); while(moveup != END_OF_LIST(&Ship_obj_list)){ // player ships - if(Objects[moveup->objnum].flags & (OF_PLAYER_SHIP | OF_COULD_BE_PLAYER)){ + if(Objects[moveup->objnum].flags[Object::Object_Flags::Player_ship] || Objects[moveup->objnum].flags[Object::Object_Flags::Could_be_player]){ r = &Multi_respawn_points[Multi_respawn_point_count++]; r->pos = Objects[moveup->objnum].pos; @@ -386,12 +386,12 @@ void multi_respawn_player(net_player *pl, char cur_primary_bank, char cur_second shipp = &Ships[objp->instance]; // this is a player, so mark him as a player, - objp->flags |= OF_PLAYER_SHIP; - objp->flags &= ~OF_COULD_BE_PLAYER; + objp->flags.set(Object::Object_Flags::Player_ship); + objp->flags.remove(Object::Object_Flags::Could_be_player); // server should mark this player as invulerable for a short time if ( MULTIPLAYER_MASTER ) { - objp->flags |= OF_INVULNERABLE; + objp->flags.set(Object::Object_Flags::Invulnerable); pl->s_info.invul_timestamp = timestamp(RESPAWN_INVUL_TIMESTAMP); multi_respawn_place( objp, shipp->team ); } @@ -410,7 +410,7 @@ void multi_respawn_player(net_player *pl, char cur_primary_bank, char cur_second Player_ai = &Ai_info[Player_ship->ai_index]; // this is a hack to ensure that old (dead) player ships are destroyed, since at this point he's actually an OBJ_GHOST - oldplr->flags |= OF_SHOULD_BE_DEAD; + oldplr->flags.set(Object::Object_Flags::Should_be_dead); obj_delete(OBJ_INDEX(oldplr)); // get rid of the annoying HUD dead message text. @@ -426,15 +426,16 @@ void multi_respawn_player(net_player *pl, char cur_primary_bank, char cur_second shipp->weapons.current_primary_bank = (int)cur_primary_bank; shipp->weapons.current_secondary_bank = (int)cur_secondary_bank; if(cur_link_status & (1<<0)){ - shipp->flags |= SF_PRIMARY_LINKED; + shipp->flags.set(Ship::Ship_Flags::Primary_linked); } else { - shipp->flags &= ~(SF_PRIMARY_LINKED); + shipp->flags.remove(Ship::Ship_Flags::Primary_linked); } if(cur_link_status & (1<<1)){ - shipp->flags |= SF_SECONDARY_DUAL_FIRE; - } else { - shipp->flags &= ~(SF_SECONDARY_DUAL_FIRE); - } + shipp->flags.set(Ship::Ship_Flags::Secondary_dual_fire); + } + else { + shipp->flags.remove(Ship::Ship_Flags::Secondary_dual_fire); + } Assert( ship_ets != 0 ); // find dave or allender @@ -494,8 +495,8 @@ void multi_respawn_ai( p_object *pobjp ) objp = &Objects[objnum]; // be sure the the OF_PLAYER_SHIP flag is unset, and the could be player flag is set - obj_set_flags( objp, objp->flags | OF_COULD_BE_PLAYER ); - objp->flags &= ~OF_PLAYER_SHIP; + obj_set_flags(objp, objp->flags + Object::Object_Flags::Could_be_player); + objp->flags.remove(Object::Object_Flags::Player_ship); } // make the given player an observer @@ -525,7 +526,7 @@ void multi_respawn_as_observer() hud_config_as_observer(Player_ship,Player_ai); // blow away my old player object - Player_obj->flags |= OF_SHOULD_BE_DEAD; + Player_obj->flags.set(Object::Object_Flags::Should_be_dead); obj_delete(OBJ_INDEX(Player_obj)); // create a new shiny observer object for me diff --git a/code/network/multi_sexp.cpp b/code/network/multi_sexp.cpp index 53147e18ea..3806ed9fdb 100644 --- a/code/network/multi_sexp.cpp +++ b/code/network/multi_sexp.cpp @@ -270,6 +270,23 @@ void multi_send_int(int value) current_argument_count += sizeof(int); } +template +void multi_send_flag(T value) +{ + if (cannot_send_data()) { + return; + } + + multi_sexp_ensure_space_remains(sizeof(int)); + + //Write INT into the Type buffer. + type[packet_size] = TYPE_INT; + //Write the int into the data buffer + ADD_INT(static_cast(value)); + //Increment the COUNT by 4 (i.e the size of an int). + current_argument_count += sizeof(int); +} + /** * Adds a ship's net sig to the SEXP packet. */ @@ -625,6 +642,22 @@ bool multi_get_int(int &value) return true; } +template +bool multi_get_flag(T &value) +{ + if (!Multi_sexp_bytes_left || !current_argument_count) { + return false; + } + int tmp = 0; + GET_INT(tmp); + + value = static_cast(tmp); + + multi_reduce_counts(sizeof(int)); + + return true; +} + /** * Attempts to get an index for the Ships array based on the net sig it removes from the SEXP packet. Returns it as the value * parameter. Returns false if unable to do so. diff --git a/code/network/multimsgs.cpp b/code/network/multimsgs.cpp index 76a2b24700..8e9f5fbf60 100644 --- a/code/network/multimsgs.cpp +++ b/code/network/multimsgs.cpp @@ -2476,7 +2476,7 @@ void send_ship_kill_packet( object *objp, object *other_objp, float percent_kill Assert ( Net_player->flags & NETINFO_FLAG_AM_MASTER ); // special deaths - vaporized = ( (Ships[objp->instance].flags & SF_VAPORIZE) > 0 ); + vaporized = Ships[objp->instance].flags[Ship::Ship_Flags::Vaporize]; extra_death_info = 0; if ( vaporized ) { @@ -2519,7 +2519,7 @@ void send_ship_kill_packet( object *objp, object *other_objp, float percent_kill // if the ship who died is a player, then send some extra info, like who killed him, etc. was_player = 0; - if ( objp->flags & OF_PLAYER_SHIP ) { + if ( objp->flags[Object::Object_Flags::Player_ship] ) { int pnum; char temp; short temp2; @@ -2599,7 +2599,7 @@ void process_ship_kill_packet( ubyte *data, header *hinfo ) // maybe set vaporized if (extra_death_info & EXTRA_DEATH_VAPORIZED) { - Ships[sobjp->instance].flags |= SF_VAPORIZE; + Ships[sobjp->instance].flags.set(Ship::Ship_Flags::Vaporize); } // maybe set wash_killed @@ -2638,7 +2638,7 @@ void process_ship_kill_packet( ubyte *data, header *hinfo ) if ( !(Net_player->flags & NETINFO_FLAG_INGAME_JOIN) ) { ship_hit_kill( sobjp, oobjp, percent_killed, sd ); } else { - sobjp->flags |= OF_SHOULD_BE_DEAD; + sobjp->flags.set(Object::Object_Flags::Should_be_dead); ship_cleanup(sobjp->instance, SHIP_DESTROYED); obj_delete( OBJ_INDEX(sobjp) ); } @@ -2949,7 +2949,7 @@ void send_secondary_fired_packet( ship *shipp, ushort starting_sig, int starting // get the object for this ship. If it is an AI object, send all the info to all player. Otherwise, // we might send the info to the other player different than the one who fired objp = &Objects[shipp->objnum]; - if ( !(objp->flags & OF_PLAYER_SHIP) ) { + if ( !(objp->flags[Object::Object_Flags::Player_ship]) ) { if ( num_fired == 0 ) { return; } @@ -2973,7 +2973,7 @@ void send_secondary_fired_packet( ship *shipp, ushort starting_sig, int starting sinfo |= SFPF_ALLOW_SWARM; } - if ( shipp->flags & SF_SECONDARY_DUAL_FIRE ){ + if ( shipp->flags[Ship::Ship_Flags::Secondary_dual_fire] ){ sinfo |= SFPF_DUAL_FIRE; } @@ -3006,7 +3006,7 @@ void send_secondary_fired_packet( ship *shipp, ushort starting_sig, int starting ADD_DATA( t_subsys ); // just send this packet to everyone, then bail if an AI ship fired. - if ( !(objp->flags & OF_PLAYER_SHIP) ) { + if ( !(objp->flags[Object::Object_Flags::Player_ship]) ) { multi_io_send_to_all(data, packet_size); return; } @@ -3102,11 +3102,7 @@ void process_secondary_fired_packet(ubyte* data, header* hinfo, int from_player) } // set the dual fire properties of the ship - if ( sinfo & SFPF_DUAL_FIRE ){ - shipp->flags |= SF_SECONDARY_DUAL_FIRE; - } else { - shipp->flags &= ~SF_SECONDARY_DUAL_FIRE; - } + shipp->flags.set(Ship::Ship_Flags::Secondary_dual_fire, (sinfo & SFPF_DUAL_FIRE) != 0); // determine whether current target is locked Assert( shipp->ai_index != -1 ); @@ -4076,8 +4072,8 @@ void process_netplayer_slot_packet(ubyte *data, header *hinfo) } multi_assign_player_ship( player_num, objp, ship_class ); Net_players[player_num].p_info.ship_index = ship_index; - objp->flags &= ~(OF_COULD_BE_PLAYER); - objp->flags |= OF_PLAYER_SHIP; + objp->flags.remove(Object::Object_Flags::Could_be_player); + objp->flags.set(Object::Object_Flags::Player_ship); } } GET_DATA(stop); @@ -4148,18 +4144,10 @@ void process_ship_weapon_change( ubyte *data, header *hinfo ) shipp = &Ships[objp->instance]; if ( what == MULTI_PRIMARY_CHANGED ) { shipp->weapons.current_primary_bank = new_bank; - if ( link_status ){ - shipp->flags |= SF_PRIMARY_LINKED; - } else { - shipp->flags &= ~SF_PRIMARY_LINKED; - } + shipp->flags.set(Ship::Ship_Flags::Primary_linked, link_status != 0); } else { shipp->weapons.current_secondary_bank = new_bank; - if ( link_status ){ - shipp->flags |= SF_SECONDARY_DUAL_FIRE; - } else { - shipp->flags &= ~SF_SECONDARY_DUAL_FIRE; - } + shipp->flags.set(Ship::Ship_Flags::Secondary_dual_fire, link_status != 0); } } @@ -4956,7 +4944,7 @@ void send_ai_info_update_packet( object *objp, char what, object * other_objp ) aip = &Ai_info[Ships[objp->instance].ai_index]; // do an out here - if ( Ships[objp->instance].flags & (SF_DEPARTING | SF_DYING) ) + if ( Ships[objp->instance].is_dying_or_departing()) return; switch( what ) { @@ -5526,8 +5514,8 @@ void send_firing_info_packet() Assert( !(Net_player->flags & NETINFO_FLAG_AM_MASTER) ); BUILD_HEADER(FIRING_INFO); - plinked = (ubyte)((Player_ship->flags & SF_PRIMARY_LINKED)?1:0); - sdual = (ubyte)((Player_ship->flags & SF_SECONDARY_DUAL_FIRE)?1:0); + plinked = (ubyte)((Player_ship->flags[Ship::Ship_Flags::Primary_linked])?1:0); + sdual = (ubyte)((Player_ship->flags[Ship::Ship_Flags::Secondary_dual_fire])?1:0); ADD_DATA( plinked ); ADD_DATA( sdual ); @@ -5556,15 +5544,9 @@ void process_firing_info_packet( ubyte *data, header *hinfo ) // get the ship pointer for this player and set the flags accordingly. shipp = &(Ships[Objects[Net_players[player_num].m_player->objnum].instance]); - if ( plinked ) - shipp->flags |= SF_PRIMARY_LINKED; - else - shipp->flags &= ~SF_PRIMARY_LINKED; + shipp->flags.set(Ship::Ship_Flags::Primary_linked, plinked != 0); + shipp->flags.set(Ship::Ship_Flags::Secondary_dual_fire, sdual != 0); - if ( sdual ) - shipp->flags |= SF_SECONDARY_DUAL_FIRE; - else - shipp->flags &= ~SF_SECONDARY_DUAL_FIRE; } // packet to deal with changing status of mission goals. used to be sent every so often from server @@ -5812,7 +5794,7 @@ void send_post_sync_data_packet(net_player *p, int std_request) shipp = &Ships[Objects[so->objnum].instance]; // don't process non player wing ships - if ( !(shipp->flags & SF_FROM_PLAYER_WING ) ) + if ( !(shipp->flags[Ship::Ship_Flags::From_player_wing] ) ) continue; ship_count++; @@ -5827,7 +5809,7 @@ void send_post_sync_data_packet(net_player *p, int std_request) shipp = &Ships[Objects[so->objnum].instance]; // don't process non player wing ships - if ( !(shipp->flags & SF_FROM_PLAYER_WING ) ) + if ( !(shipp->flags[Ship::Ship_Flags::From_player_wing] ) ) continue; // add the net signature of the object for look up @@ -5847,7 +5829,7 @@ void send_post_sync_data_packet(net_player *p, int std_request) shipp = &Ships[Objects[so->objnum].instance]; // don't process non player wing ships - if ( !(shipp->flags & SF_FROM_PLAYER_WING ) ) + if ( !(shipp->flags[Ship::Ship_Flags::From_player_wing] ) ) continue; // if this is a ship owned by a player, we should mark down his weapons bank/link settings now if we're the server @@ -5907,20 +5889,20 @@ void send_post_sync_data_packet(net_player *p, int std_request) // send primary and secondary weapon link status val = 0x0; - if(shipp->flags & SF_PRIMARY_LINKED){ + if(shipp->flags[Ship::Ship_Flags::Primary_linked]){ if(pl != NULL){ pl->s_info.cur_link_status |= (1<<0); } val |= (1<<0); } - if(shipp->flags & SF_SECONDARY_DUAL_FIRE){ + if(shipp->flags[Ship::Ship_Flags::Secondary_dual_fire]){ if(pl != NULL){ pl->s_info.cur_link_status |= (1<<1); } val |= (1<<1); } // if this is a player ship add (1<<2) - if(Objects[shipp->objnum].flags & OF_PLAYER_SHIP){ + if(Objects[shipp->objnum].flags[Object::Object_Flags::Player_ship]){ val |= (1<<2); } ADD_DATA(val); @@ -6109,17 +6091,17 @@ void process_post_sync_data_packet(ubyte *data, header *hinfo) GET_DATA(val); if(val & (1<<0)){ - shipp->flags |= SF_PRIMARY_LINKED; + shipp->flags.set(Ship::Ship_Flags::Primary_linked); } if(val & (1<<1)){ - shipp->flags |= SF_SECONDARY_DUAL_FIRE; + shipp->flags.set(Ship::Ship_Flags::Secondary_dual_fire); } - Objects[shipp->objnum].flags &= ~(OF_PLAYER_SHIP); - Objects[shipp->objnum].flags &= ~(OF_COULD_BE_PLAYER); + Objects[shipp->objnum].flags.remove(Object::Object_Flags::Player_ship); + Objects[shipp->objnum].flags.remove(Object::Object_Flags::Could_be_player); if(val & (1<<2)){ - Objects[shipp->objnum].flags |= OF_PLAYER_SHIP; + Objects[shipp->objnum].flags.set(Object::Object_Flags::Player_ship); } else { - obj_set_flags( &Objects[shipp->objnum], Objects[shipp->objnum].flags | OF_COULD_BE_PLAYER ); + obj_set_flags( &Objects[shipp->objnum], Objects[shipp->objnum].flags + Object::Object_Flags::Could_be_player); } // get ship ets @@ -7651,7 +7633,7 @@ void send_NEW_primary_fired_packet(ship *shipp, int banks_fired) // ubanks_fired |= (current_bank << CURRENT_BANK_BIT); // append the SF_PRIMARY_LINKED flag on the top nibble of the banks_fired - // if ( shipp->flags & SF_PRIMARY_LINKED ){ + // if ( shipp->flags[Ship::Ship_Flags::Primary_linked] ){ // ubanks_fired |= (1<<7); // } @@ -7734,7 +7716,7 @@ void process_NEW_primary_fired_packet(ubyte *data, header *hinfo) // if ( !linked ){ // shipp->flags &= ~SF_PRIMARY_LINKED; // } else { - // shipp->flags |= SF_PRIMARY_LINKED; + // shipp->flags.set(Ship::Ship_Flags::Primary_linked); // } // if we're in client firing mode, ignore ones for myself @@ -7745,15 +7727,15 @@ void process_NEW_primary_fired_packet(ubyte *data, header *hinfo) ship_fire_primary( objp, 0, 1 ); // Karajorma - It's still a hack but at least this way it only affects AI ships - if (!(objp->flags & OF_PLAYER_SHIP)) + if (!(objp->flags[Object::Object_Flags::Player_ship])) { // Juke - this is the hackiest hack, but hopefully it will fix stream weapon // notifications generated by AI ships. - uint flags = shipp->flags & SF_TRIGGER_DOWN; + bool flags = shipp->flags[Ship::Ship_Flags::Trigger_down]; - shipp->flags |= SF_TRIGGER_DOWN; + shipp->flags.set(Ship::Ship_Flags::Trigger_down); ship_fire_primary( objp, 1, 1 ); - shipp->flags &= flags | ~SF_TRIGGER_DOWN; + shipp->flags.set(Ship::Ship_Flags::Trigger_down, flags); } } @@ -7965,7 +7947,7 @@ void process_beam_fired_packet(ubyte *data, header *hinfo) ship *shipp = &Ships[fire_info.shooter->instance]; // this check is a little convoluted but should cover all bases until we decide to just break the protocol - if ( Ship_info[shipp->ship_info_index].flags & (SIF_FIGHTER | SIF_BOMBER) ) { + if ( Ship_info[shipp->ship_info_index].is_fighter_bomber() ) { // make sure the beam is a primary weapon and not attached to a turret or something for (i = 0; i < shipp->weapons.num_primary_banks; i++) { if ( shipp->weapons.primary_bank_weapons[i] == fire_info.beam_info_index ) { diff --git a/code/network/multimsgs.h b/code/network/multimsgs.h index 404e1ddaf7..f0cc4e6925 100644 --- a/code/network/multimsgs.h +++ b/code/network/multimsgs.h @@ -39,6 +39,7 @@ class ship_subsys; #define ADD_USHORT(d) do { static_assert(sizeof(d) == sizeof(std::uint16_t), "Size of unsigned short is not right!"); Assert((packet_size + sizeof(d)) < MAX_PACKET_SIZE); ushort swap = INTEL_SHORT(d); memcpy(data+packet_size, &swap, sizeof(d) ); packet_size += sizeof(d); } while (0) #define ADD_INT(d) do { static_assert(sizeof(d) == sizeof(std::int32_t), "Size of int is not right!"); Assert((packet_size + sizeof(d)) < MAX_PACKET_SIZE); int swap = INTEL_INT(d); memcpy(data+packet_size, &swap, sizeof(d) ); packet_size += sizeof(d); } while (0) #define ADD_UINT(d) do { static_assert(sizeof(d) == sizeof(std::uint32_t), "Size of unsigned int is not right!"); Assert((packet_size + sizeof(d)) < MAX_PACKET_SIZE); uint swap = INTEL_INT(d); memcpy(data+packet_size, &swap, sizeof(d) ); packet_size += sizeof(d); } while (0) +#define ADD_ULONG(d) do { static_assert(sizeof(d) == sizeof(std::uint64_t), "Size of unsigned long is not right!"); Assert((packet_size + sizeof(d)) < MAX_PACKET_SIZE); std::uint64_t swap = INTEL_LONG(d); memcpy(data+packet_size, &swap, sizeof(d) ); packet_size += sizeof(d); } while (0) #define ADD_FLOAT(d) do { Assert((packet_size + sizeof(d)) < MAX_PACKET_SIZE); float swap = INTEL_FLOAT(&d); memcpy(data+packet_size, &swap, sizeof(d) ); packet_size += sizeof(d); } while (0) #define ADD_STRING(s) do { Assert((packet_size + strlen(s) + 4) < MAX_PACKET_SIZE);int len = (int)strlen(s); int len_tmp = INTEL_INT(len); ADD_DATA(len_tmp); memcpy(data+packet_size, s, len ); packet_size += len; } while(0) #define ADD_ORIENT(d) { Assert((packet_size + 17) < MAX_PACKET_SIZE); ubyte dt[17]; multi_pack_orient_matrix(dt,&d); memcpy(data+packet_size,dt,17); packet_size += 17; } @@ -49,6 +50,7 @@ class ship_subsys; #define GET_USHORT(d) do { ushort swap; memcpy(&swap, data+offset, sizeof(d) ); d = INTEL_SHORT(swap); offset += sizeof(d); } while(0) #define GET_INT(d) do { int swap; memcpy(&swap, data+offset, sizeof(d) ); d = INTEL_INT(swap); offset += sizeof(d); } while(0) #define GET_UINT(d) do { uint swap; memcpy(&swap, data+offset, sizeof(d) ); d = INTEL_INT(swap); offset += sizeof(d); } while(0) +#define GET_ULONG(d) do { ulong swap; memcpy(&swap, data+offset, sizeof(d) ); d = INTEL_LONG(swap); offset += sizeof(d); } while(0) #define GET_FLOAT(d) do { float swap; memcpy(&swap, data+offset, sizeof(d) ); d = INTEL_FLOAT(&swap); offset += sizeof(d); } while(0) #define GET_STRING(s) do { int len; memcpy(&len, data+offset, sizeof(len)); len = INTEL_INT(len); offset += sizeof(len); memcpy(s, data+offset, len); offset += len; s[len] = '\0'; } while(0) #define GET_ORIENT(d) { ubyte dt[17]; memcpy(dt,data+offset,17); offset+=17; multi_unpack_orient_matrix(dt,&d); } diff --git a/code/network/multiteamselect.cpp b/code/network/multiteamselect.cpp index a095644163..1967aa88af 100644 --- a/code/network/multiteamselect.cpp +++ b/code/network/multiteamselect.cpp @@ -731,7 +731,7 @@ int multi_ts_disabled_slot(int slot_num, int player_index) if(Netgame.type_flags & NG_TYPE_TEAM){ // if i'm the team captain I can mess with my own ships as well as those of the ai ships on my team if(pl->flags & NETINFO_FLAG_TEAM_CAPTAIN){ - if((Multi_ts_team[pl->p_info.team].multi_ts_player[slot_num] != NULL) && (Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[slot_num]].flags & OF_PLAYER_SHIP) && (slot_num != pl->p_info.ship_index)){ + if((Multi_ts_team[pl->p_info.team].multi_ts_player[slot_num] != NULL) && (Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[slot_num]].flags[Object::Object_Flags::Player_ship]) && (slot_num != pl->p_info.ship_index)){ return 1; } @@ -743,7 +743,7 @@ int multi_ts_disabled_slot(int slot_num, int player_index) // if we're the host, we can our own ship and ai ships if(pl->flags & NETINFO_FLAG_GAME_HOST){ // can't grab player ships - if((Multi_ts_team[pl->p_info.team].multi_ts_player[slot_num] != NULL) && (Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[slot_num]].flags & OF_PLAYER_SHIP) && (slot_num != pl->p_info.ship_index)){ + if((Multi_ts_team[pl->p_info.team].multi_ts_player[slot_num] != NULL) && (Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[slot_num]].flags[Object::Object_Flags::Player_ship]) && (slot_num != pl->p_info.ship_index)){ return 1; } @@ -870,7 +870,7 @@ void multi_ts_assign_players_all() objp = GET_FIRST(&obj_used_list); while(objp != END_OF_LIST(&obj_used_list)){ // find a valid player ship - ignoring the ship which was assigned to the host - if((objp->flags & OF_PLAYER_SHIP) && stricmp(Ships[objp->instance].ship_name,name_lookup)){ + if((objp->flags[Object::Object_Flags::Player_ship]) && stricmp(Ships[objp->instance].ship_name,name_lookup)){ // determine what team and slot this ship is multi_ts_get_team_and_slot(Ships[objp->instance].ship_name,&team_index,&slot_index, true); Assert((team_index != -1) && (slot_index != -1)); @@ -909,8 +909,8 @@ void multi_ts_assign_players_all() // decrement the player count player_count--; } else { - objp->flags &= ~OF_PLAYER_SHIP; - obj_set_flags( objp, objp->flags | OF_COULD_BE_PLAYER ); + objp->flags.remove(Object::Object_Flags::Player_ship); + obj_set_flags( objp, objp->flags + Object::Object_Flags::Could_be_player); } // if we've assigned all players, we're done @@ -926,9 +926,9 @@ void multi_ts_assign_players_all() // go through and change any ships marked as player ships to be COULD_BE_PLAYER if ( objp != END_OF_LIST(&obj_used_list) ) { for ( objp = GET_NEXT(objp); objp != END_OF_LIST(&obj_used_list); objp = GET_NEXT(objp) ) { - if ( objp->flags & OF_PLAYER_SHIP ){ - objp->flags &= ~OF_PLAYER_SHIP; - obj_set_flags( objp, objp->flags | OF_COULD_BE_PLAYER ); + if ( objp->flags[Object::Object_Flags::Player_ship] ){ + objp->flags.remove(Object::Object_Flags::Player_ship); + obj_set_flags( objp, objp->flags + Object::Object_Flags::Could_be_player); } } } @@ -1010,8 +1010,8 @@ void multi_ts_handle_player_drop() if((Multi_ts_team[idx].multi_ts_player[s_idx] != NULL) && !MULTI_CONNECTED((*Multi_ts_team[idx].multi_ts_player[s_idx]))){ Assert(Multi_ts_team[idx].multi_ts_objnum[s_idx] != -1); Multi_ts_team[idx].multi_ts_player[s_idx] = NULL; - Objects[Multi_ts_team[idx].multi_ts_objnum[s_idx]].flags &= ~(OF_PLAYER_SHIP); - obj_set_flags( &Objects[Multi_ts_team[idx].multi_ts_objnum[s_idx]], Objects[Multi_ts_team[idx].multi_ts_objnum[s_idx]].flags | OF_COULD_BE_PLAYER); + Objects[Multi_ts_team[idx].multi_ts_objnum[s_idx]].flags.remove(Object::Object_Flags::Player_ship); + obj_set_flags( &Objects[Multi_ts_team[idx].multi_ts_objnum[s_idx]], Objects[Multi_ts_team[idx].multi_ts_objnum[s_idx]].flags + Object::Object_Flags::Could_be_player); } } } @@ -1263,7 +1263,7 @@ void multi_ts_blit_wing_callsigns() } else { // determine if this is a locked AI ship pobj = mission_parse_get_arrival_ship(Ships[Objects[Multi_ts_team[Net_player->p_info.team].multi_ts_objnum[idx]].instance].ship_name); - if((pobj == NULL) || !(pobj->flags & P_OF_PLAYER_START)){ + if ((pobj == NULL) || !(pobj->flags[Mission::Parse_Object_Flags::OF_Player_start])) { strcpy_s(callsign, NOX("<")); strcat_s(callsign, XSTR("AI",738)); // [[ Artificial Intellegence ]] strcat_s(callsign, NOX(">")); @@ -2075,7 +2075,7 @@ int multi_ts_can_perform(int from_type,int from_index,int to_type,int to_index,i // if this is not a player ship type object if(Multi_ts_team[pl->p_info.team].multi_ts_objnum[to_index] != -1){ pobj = mission_parse_get_arrival_ship(Ships[Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[to_index]].instance].ship_name); - if((pobj == NULL) || !(pobj->flags & P_OF_PLAYER_START)){ + if((pobj == NULL) || !(pobj->flags[Mission::Parse_Object_Flags::OF_Player_start])){ return 0; } } @@ -2112,7 +2112,7 @@ int multi_ts_can_perform(int from_type,int from_index,int to_type,int to_index,i // if this is not a player ship type object if(Multi_ts_team[pl->p_info.team].multi_ts_objnum[to_index] != -1){ pobj = mission_parse_get_arrival_ship(Ships[Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[to_index]].instance].ship_name); - if((pobj == NULL) || !(pobj->flags & P_OF_PLAYER_START)){ + if((pobj == NULL) || !(pobj->flags[Mission::Parse_Object_Flags::OF_Player_start])){ return 0; } } @@ -2325,15 +2325,15 @@ int multi_ts_swap_player_player(int from_index,int to_index,int *sound,int playe } // update ship flags - Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[to_index]].flags &= ~(OF_COULD_BE_PLAYER); - Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[to_index]].flags &= ~(OF_PLAYER_SHIP); + Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[to_index]].flags.remove(Object::Object_Flags::Could_be_player); + Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[to_index]].flags.remove(Object::Object_Flags::Player_ship); if(Multi_ts_team[pl->p_info.team].multi_ts_player[to_index] != NULL){ - Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[to_index]].flags |= OF_PLAYER_SHIP; + Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[to_index]].flags.set(Object::Object_Flags::Player_ship); } - Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[from_index]].flags &= ~(OF_COULD_BE_PLAYER); - Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[from_index]].flags &= ~(OF_PLAYER_SHIP); + Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[from_index]].flags.remove(Object::Object_Flags::Could_be_player); + Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[from_index]].flags.remove(Object::Object_Flags::Player_ship); if(Multi_ts_team[pl->p_info.team].multi_ts_player[from_index] != NULL){ - Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[from_index]].flags |= OF_PLAYER_SHIP; + Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[from_index]].flags.set(Object::Object_Flags::Player_ship); } // recalcalate which slots are locked/unlocked, etc @@ -2381,15 +2381,15 @@ int multi_ts_move_player(int from_index,int to_index,int *sound,int player_index } // update ship flags - Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[to_index]].flags &= ~(OF_COULD_BE_PLAYER); - Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[to_index]].flags &= ~(OF_PLAYER_SHIP); + Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[to_index]].flags.remove(Object::Object_Flags::Could_be_player); + Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[to_index]].flags.remove(Object::Object_Flags::Player_ship); if(Multi_ts_team[pl->p_info.team].multi_ts_player[to_index] != NULL){ - Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[to_index]].flags |= OF_PLAYER_SHIP; + Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[to_index]].flags.set(Object::Object_Flags::Player_ship); } - Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[from_index]].flags &= ~(OF_COULD_BE_PLAYER); - Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[from_index]].flags &= ~(OF_PLAYER_SHIP); + Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[from_index]].flags.remove(Object::Object_Flags::Could_be_player); + Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[from_index]].flags.remove(Object::Object_Flags::Player_ship); if(Multi_ts_team[pl->p_info.team].multi_ts_player[from_index] != NULL){ - Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[from_index]].flags |= OF_PLAYER_SHIP; + Objects[Multi_ts_team[pl->p_info.team].multi_ts_objnum[from_index]].flags.set(Object::Object_Flags::Player_ship); } // recalcalate which slots are locked/unlocked, etc @@ -2723,8 +2723,8 @@ int multi_ts_ok_to_commit() // if the ship in this slot has a ship which can be a player but has 0 primary or secondary weapons, then he cannot continue if( (Multi_ts_team[Net_player->p_info.team].multi_ts_objnum[idx] != -1) && - ((Objects[Multi_ts_team[Net_player->p_info.team].multi_ts_objnum[idx]].flags & OF_COULD_BE_PLAYER) || - (Objects[Multi_ts_team[Net_player->p_info.team].multi_ts_objnum[idx]].flags & OF_PLAYER_SHIP)) && + ((Objects[Multi_ts_team[Net_player->p_info.team].multi_ts_objnum[idx]].flags[Object::Object_Flags::Could_be_player]) || + (Objects[Multi_ts_team[Net_player->p_info.team].multi_ts_objnum[idx]].flags[Object::Object_Flags::Player_ship])) && !multi_ts_disabled_slot(idx)){ primary_ok = 0; @@ -2861,9 +2861,9 @@ void send_pslot_update_packet(int team,int code,int sound) } // add a byte indicating what object flag should be set (0 == ~(OF_COULD_BE_PLAYER | OF_PLAYER_SHIP), 1 == player ship, 2 == could be player ship) - if(Objects[Multi_ts_team[team].multi_ts_objnum[idx]].flags & OF_COULD_BE_PLAYER){ + if(Objects[Multi_ts_team[team].multi_ts_objnum[idx]].flags[Object::Object_Flags::Could_be_player]){ val = 2; - } else if(Objects[Multi_ts_team[team].multi_ts_objnum[idx]].flags & OF_PLAYER_SHIP){ + } else if(Objects[Multi_ts_team[team].multi_ts_objnum[idx]].flags[Object::Object_Flags::Player_ship]){ val = 1; } else { val = 0; @@ -2998,13 +2998,14 @@ void process_pslot_update_packet(ubyte *data, header *hinfo) // get the ship flag byte GET_DATA(val); - Objects[objnum].flags &= ~(OF_PLAYER_SHIP | OF_COULD_BE_PLAYER); + Objects[objnum].flags.remove(Object::Object_Flags::Player_ship); + Objects[objnum].flags.remove(Object::Object_Flags::Could_be_player); switch(val){ case 1 : - Objects[objnum].flags |= OF_PLAYER_SHIP; + Objects[objnum].flags.set(Object::Object_Flags::Player_ship); break; case 2 : - obj_set_flags( &Objects[objnum], Objects[objnum].flags | OF_COULD_BE_PLAYER ); + obj_set_flags( &Objects[objnum], Objects[objnum].flags + Object::Object_Flags::Could_be_player); break; } diff --git a/code/network/multiutil.cpp b/code/network/multiutil.cpp index 78571e644d..43781c168f 100644 --- a/code/network/multiutil.cpp +++ b/code/network/multiutil.cpp @@ -847,9 +847,8 @@ void multi_make_player_ai( object *pobj ) if ( pobj->type != OBJ_SHIP ) return; - pobj->flags &= ~(OF_PLAYER_SHIP); - obj_set_flags( pobj, pobj->flags | OF_COULD_BE_PLAYER ); - obj_set_flags( pobj, pobj->flags & ~(OF_INVULNERABLE)); // Newly respawned players will still be invulnerable + pobj->flags.remove(Object::Object_Flags::Player_ship); + obj_set_flags(pobj, pobj->flags + Object::Object_Flags::Could_be_player - Object::Object_Flags::Invulnerable); // target_objnum must be -1 or else new AI ship will fire on whatever this player // had targeted. @@ -1144,7 +1143,7 @@ void multi_do_client_warp(float frame_time) moveup = GET_FIRST(&Ship_obj_list); while(moveup!=END_OF_LIST(&Ship_obj_list)){ // do all _necessary_ ship warp in (arrival) processing - if ( Ships[Objects[moveup->objnum].instance].flags & SF_ARRIVING ) + if ( Ships[Objects[moveup->objnum].instance].is_arriving() ) shipfx_warpin_frame( &Objects[moveup->objnum], frame_time ); moveup = GET_NEXT(moveup); } @@ -1407,9 +1406,9 @@ void multi_untag_player_ships() moveup = GET_FIRST(&Ship_obj_list); while(moveup != END_OF_LIST(&Ship_obj_list)){ - if(Objects[moveup->objnum].flags & OF_PLAYER_SHIP){ - Objects[moveup->objnum].flags &= ~(OF_PLAYER_SHIP); - obj_set_flags( &Objects[moveup->objnum], Objects[moveup->objnum].flags | OF_COULD_BE_PLAYER ); + if(Objects[moveup->objnum].flags[Object::Object_Flags::Player_ship]){ + Objects[moveup->objnum].flags.remove(Object::Object_Flags::Player_ship); + obj_set_flags( &Objects[moveup->objnum], Objects[moveup->objnum].flags + Object::Object_Flags::Could_be_player); } moveup = GET_NEXT(moveup); } @@ -1582,21 +1581,21 @@ void multi_create_standalone_object() } Player_obj = &Objects[objnum]; - obj_set_flags(Player_obj, Player_obj->flags & (~OF_COLLIDES) ); - //obj_set_flags(Player_obj, Player_obj->flags | OF_SHOULD_BE_DEAD); - obj_set_flags(Player_obj, Player_obj->flags & (~OF_PLAYER_SHIP)); + Player_obj->flags.remove(Object::Object_Flags::Player_ship); + obj_set_flags(Player_obj, Player_obj->flags - Object::Object_Flags::Collides); Net_player->m_player->objnum = objnum; // create the default player ship object and use that as my default virtual "ship", and make it "invisible" pobj_num = parse_create_object(Player_start_pobject); Assert(pobj_num != -1); - obj_set_flags(&Objects[pobj_num],OF_PLAYER_SHIP); + flagset tmp_flags; + obj_set_flags(&Objects[pobj_num], tmp_flags + Object::Object_Flags::Player_ship); Objects[pobj_num].net_signature = STANDALONE_SHIP_SIG; Player_ship = &Ships[Objects[pobj_num].instance]; // make ship hidden from sensors so that this observer cannot target it. Observers really have two ships // one observer, and one "Player_ship". Observer needs to ignore the Player_ship. - Player_ship->flags |= SF_HIDDEN_FROM_SENSORS; + Player_ship->flags.set(Ship::Ship_Flags::Hidden_from_sensors); strcpy_s(Player_ship->ship_name, XSTR("Standalone Ship",904)); Player_ai = &Ai_info[Ships[Objects[pobj_num].instance].ai_index]; @@ -2162,8 +2161,7 @@ void multi_warpout_all_players() if(MULTI_CONNECTED(Net_players[idx]) && (Net_player != &Net_players[idx]) && (Objects[Net_players[idx].m_player->objnum].type == OBJ_SHIP)){ objp = &Objects[Net_players[idx].m_player->objnum]; - - obj_set_flags( objp, objp->flags & (~OF_COLLIDES) ); + obj_set_flags( objp, objp->flags - Object::Object_Flags::Collides); shipfx_warpout_start( objp ); } } @@ -2173,7 +2171,7 @@ void multi_warpout_all_players() // if we're an observer, or we're respawning, or we can't warp out. so just jump into the debrief state if((Net_player->flags & NETINFO_FLAG_OBSERVER) || (Net_player->flags & NETINFO_FLAG_RESPAWNING) || - ((Player_obj->type == OBJ_SHIP) && (Player_ship->flags & SF_CANNOT_WARP)) ){ + ((Player_obj->type == OBJ_SHIP) && ( Player_ship->cannot_warp())) ){ multi_handle_sudden_mission_end(); @@ -2186,7 +2184,7 @@ void multi_warpout_all_players() // if we're a ship, then begin the warpout process else { // turn off collision detection for my ship - obj_set_flags(Player_obj, Player_obj->flags & (~OF_COLLIDES) ); + obj_set_flags(Player_obj, Player_obj->flags - Object::Object_Flags::Collides); // turn off gliding too or ships can't get upt to speed if(object_get_gliding(Player_obj)) { @@ -2719,7 +2717,7 @@ void multi_player_ships_available(int *team_0,int *team_1) moveup = GET_FIRST(&Ship_obj_list); while(moveup!=END_OF_LIST(&Ship_obj_list)){ // if this ship is flagged as OF_COULD_BE_PLAYER - if(Objects[moveup->objnum].flags & OF_COULD_BE_PLAYER){ + if(Objects[moveup->objnum].flags[Object::Object_Flags::Could_be_player]){ // get the team # for this ship mp_team_num = multi_ts_get_team(Ships[Objects[moveup->objnum].instance].ship_name); if(mp_team_num == 0){ @@ -2737,7 +2735,7 @@ void multi_player_ships_available(int *team_0,int *team_1) void multi_server_update_player_weapons(net_player *pl,ship *shipp) { // don't process when the ship is dying. - if ( (shipp->flags & SF_DYING) || NETPLAYER_IS_DEAD(pl) ) + if ( (shipp->flags[Ship::Ship_Flags::Dying]) || NETPLAYER_IS_DEAD(pl) ) return; // primary bank status @@ -2745,7 +2743,7 @@ void multi_server_update_player_weapons(net_player *pl,ship *shipp) // primary link status pl->s_info.cur_link_status &= ~(1<<0); - if(shipp->flags & SF_PRIMARY_LINKED){ + if(shipp->flags[Ship::Ship_Flags::Primary_linked]){ pl->s_info.cur_link_status |= (1<<0); } @@ -2758,7 +2756,7 @@ void multi_server_update_player_weapons(net_player *pl,ship *shipp) // secondary link status pl->s_info.cur_link_status &= ~(1<<1); - if(shipp->flags & SF_SECONDARY_DUAL_FIRE){ + if(shipp->flags[Ship::Ship_Flags::Secondary_dual_fire]){ pl->s_info.cur_link_status |= (1<<1); } @@ -4158,7 +4156,7 @@ int multi_pack_unpack_desired_rotvel( int write, ubyte *data, matrix *orient, ve // Currently supports the dogfight kill matrix and normal debriefing stages but if new types are created they should be added here void send_debrief_event() { // we have a special debriefing screen multiplayer furballs use by default - if((Game_mode & GM_MULTIPLAYER) && IS_MISSION_MULTI_DOGFIGHT && !(The_mission.flags & MISSION_FLAG_TOGGLE_DEBRIEFING)) { + if((Game_mode & GM_MULTIPLAYER) && IS_MISSION_MULTI_DOGFIGHT && !(The_mission.flags[Mission::Mission_Flags::Toggle_debriefing])) { gameseq_post_event( GS_EVENT_MULTI_DOGFIGHT_DEBRIEF); } // do the normal debriefing for all other situations diff --git a/code/object/collidedebrisship.cpp b/code/object/collidedebrisship.cpp index ba5d0aa8a6..f147fed3dc 100644 --- a/code/object/collidedebrisship.cpp +++ b/code/object/collidedebrisship.cpp @@ -44,7 +44,7 @@ int collide_debris_ship( obj_pair * pair ) Assert( pship->type == OBJ_SHIP ); // don't check collision if it's our own debris and we are dying - if ( (pdebris->parent == OBJ_INDEX(pship)) && (Ships[pship->instance].flags & SF_DYING) ) + if ( (pdebris->parent == OBJ_INDEX(pship)) && (Ships[pship->instance].flags[Ship::Ship_Flags::Dying]) ) return 0; dist = vm_vec_dist( &pdebris->pos, &pship->pos ); @@ -98,7 +98,7 @@ int collide_debris_ship( obj_pair * pair ) ship_damage *= Debris[pdebris->instance].damage_mult; // supercaps cap damage at 10-20% max hull ship damage - if (Ship_info[Ships[pship->instance].ship_info_index].flags & SIF_SUPERCAP) { + if (Ship_info[Ships[pship->instance].ship_info_index].flags[Ship::Info_Flags::Supercap]) { float cap_percent_damage = frand_range(0.1f, 0.2f); ship_damage = MIN(ship_damage, cap_percent_damage * Ships[pship->instance].ship_max_hull_strength); } @@ -112,7 +112,7 @@ int collide_debris_ship( obj_pair * pair ) if ( debris_hit_info.heavy == pship ) { quadrant_num = get_ship_quadrant_from_global(&hitpos, pship); - if ((pship->flags & OF_NO_SHIELDS) || !ship_is_shield_up(pship, quadrant_num) ) { + if ((pship->flags[Object::Object_Flags::No_shields]) || !ship_is_shield_up(pship, quadrant_num) ) { quadrant_num = -1; } if (apply_ship_damage) { @@ -277,7 +277,7 @@ int collide_asteroid_ship( obj_pair * pair ) int quadrant_num; if ( asteroid_hit_info.heavy == pship ) { quadrant_num = get_ship_quadrant_from_global(&hitpos, pship); - if ((pship->flags & OF_NO_SHIELDS) || !ship_is_shield_up(pship, quadrant_num) ) { + if ((pship->flags[Object::Object_Flags::No_shields]) || !ship_is_shield_up(pship, quadrant_num) ) { quadrant_num = -1; } ship_apply_local_damage(asteroid_hit_info.heavy, asteroid_hit_info.light, &hitpos, ship_damage, quadrant_num, CREATE_SPARKS, asteroid_hit_info.submodel_num); diff --git a/code/object/collideshipship.cpp b/code/object/collideshipship.cpp index fa48f34e3e..061bbdf947 100644 --- a/code/object/collideshipship.cpp +++ b/code/object/collideshipship.cpp @@ -132,7 +132,7 @@ int ship_ship_check_collision(collision_info_struct *ship_ship_hit_info, vec3d * } // Make ships that are warping in not get collision detection done - if ( heavy_shipp->flags & SF_ARRIVING_STAGE_1 ) { + if ( heavy_shipp->flags[Ship::Ship_Flags::Arriving_stage_1] ) { return 0; } @@ -150,7 +150,7 @@ int ship_ship_check_collision(collision_info_struct *ship_ship_hit_info, vec3d * // Also, this is the only clean way I could figure to get ships to not do damage to each other for one frame // when they are docked and departing. Due to sequencing, they would not show up as docked, yet they // would still come through here, so they would harm each other, if on opposing teams. -- MK, 2/2/98 - if ((heavy_obj->flags & OF_SHOULD_BE_DEAD) || (light_obj->flags & OF_SHOULD_BE_DEAD)) { + if ((heavy_obj->flags[Object::Object_Flags::Should_be_dead]) || (light_obj->flags[Object::Object_Flags::Should_be_dead])) { return 0; } @@ -167,7 +167,7 @@ int ship_ship_check_collision(collision_info_struct *ship_ship_hit_info, vec3d * // Apparently we're doing same team collisions. // But, if both are offscreen, ignore the collision if (heavy_shipp->team == light_shipp->team) { - if ( (!(heavy_obj->flags & OF_WAS_RENDERED) && !(light_obj->flags & OF_WAS_RENDERED)) ) { + if ( (!(heavy_obj->flags[Object::Object_Flags::Was_rendered]) && !(light_obj->flags[Object::Object_Flags::Was_rendered])) ) { return 0; } } @@ -221,8 +221,8 @@ int ship_ship_check_collision(collision_info_struct *ship_ship_hit_info, vec3d * mc.flags = (MC_CHECK_MODEL | MC_CHECK_SPHERELINE); // flags // Only check invisible face polygons for ship:ship of different teams. - if ( !(heavy_shipp->flags2 & SF2_DONT_COLLIDE_INVIS) ) { - if ((heavy_obj->flags & OF_PLAYER_SHIP) || (light_obj->flags & OF_PLAYER_SHIP) || (heavy_shipp->team != light_shipp->team) ) { + if ( !(heavy_shipp->flags[Ship::Ship_Flags::Dont_collide_invis]) ) { + if ((heavy_obj->flags[Object::Object_Flags::Player_ship]) || (light_obj->flags[Object::Object_Flags::Player_ship]) || (heavy_shipp->team != light_shipp->team) ) { mc.flags |= MC_CHECK_INVISIBLE_FACES; } } @@ -360,7 +360,7 @@ int ship_ship_check_collision(collision_info_struct *ship_ship_hit_info, vec3d * } else if (light_obj == Player_obj) { collide_obj = heavy_obj; } - if ((collide_obj != NULL) && (Ship_info[Ships[collide_obj->instance].ship_info_index].flags & (SIF_FIGHTER | SIF_BOMBER))) { + if ((collide_obj != NULL) && (Ship_info[Ships[collide_obj->instance].ship_info_index].is_fighter_bomber())) { char *submode_string = ""; ai_info *aip; @@ -407,8 +407,8 @@ int ship_ship_check_collision(collision_info_struct *ship_ship_hit_info, vec3d * if (heavy_shipp->team == light_shipp->team) { // If a couple of small ships, just move them apart. - if ((heavy_sip->flags & SIF_SMALL_SHIP) && (light_sip->flags & SIF_SMALL_SHIP)) { - if ((heavy_obj->flags & OF_PLAYER_SHIP) || (light_obj->flags & OF_PLAYER_SHIP)) { + if ((heavy_sip->is_small_ship()) && (light_sip->is_small_ship())) { + if ((heavy_obj->flags[Object::Object_Flags::Player_ship]) || (light_obj->flags[Object::Object_Flags::Player_ship])) { vec3d h_to_l_vec; vec3d rel_vel_h; vec3d perp_rel_vel; @@ -463,7 +463,7 @@ int check_special_cruiser_asteroid_collision(object *heavy, object *lighter, flo if (heavy->type == OBJ_ASTEROID) { Assert(lighter->type == OBJ_SHIP); - if (Ship_info[Ships[lighter->instance].ship_info_index].flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP)) { + if (Ship_info[Ships[lighter->instance].ship_info_index].is_big_or_huge()) { asteroid_type = Asteroids[heavy->instance].asteroid_type; if (asteroid_type == 0) { @@ -481,7 +481,7 @@ int check_special_cruiser_asteroid_collision(object *heavy, object *lighter, flo } } else if (lighter->type == OBJ_ASTEROID) { Assert(heavy->type == OBJ_SHIP); - if (Ship_info[Ships[heavy->instance].ship_info_index].flags & SIF_BIG_SHIP) { + if (Ship_info[Ships[heavy->instance].ship_info_index].is_big_or_huge()) { asteroid_type = Asteroids[lighter->instance].asteroid_type; if (asteroid_type == 0) { @@ -505,7 +505,7 @@ int check_special_cruiser_asteroid_collision(object *heavy, object *lighter, flo * Find the subobject corresponding to the submodel hit */ bool check_subsystem_landing_allowed(ship_info *heavy_sip, collision_info_struct *ship_ship_hit_info) { - if (!(heavy_sip->flags2 & SIF2_ALLOW_LANDINGS)) + if (!(heavy_sip->flags[Ship::Info_Flags::Allow_landings])) return false; for (int i = 0; i < heavy_sip->n_subsystems; i++) { @@ -914,12 +914,12 @@ int maybe_collide_planet (object *obj1, object *obj2) sip1 = &Ship_info[Ships[obj1->instance].ship_info_index]; sip2 = &Ship_info[Ships[obj2->instance].ship_info_index]; - if (sip1->flags & SIF_PLAYER_SHIP) { + if (sip1->flags[Ship::Info_Flags::Player_ship]) { if (is_planet(obj2)) { mcp_1(obj1, obj2); return 1; } - } else if (sip2->flags & SIF_PLAYER_SHIP) { + } else if (sip2->flags[Ship::Info_Flags::Player_ship]) { if (is_planet(obj1)) { mcp_1(obj2, obj1); return 1; @@ -1008,12 +1008,12 @@ void do_kamikaze_crash(object *obj1, object *obj2) if (ship1->team != ship2->team) { if (aip1->ai_flags & AIF_KAMIKAZE) { - if (Ship_info[ship2->ship_info_index].flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP)) { + if (Ship_info[ship2->ship_info_index].is_big_or_huge()) { obj1->hull_strength = KAMIKAZE_HULL_ON_DEATH; shield_set_strength(obj1, 0.0f); } } if (aip2->ai_flags & AIF_KAMIKAZE) { - if (Ship_info[ship1->ship_info_index].flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP)) { + if (Ship_info[ship1->ship_info_index].is_big_or_huge()) { obj2->hull_strength = KAMIKAZE_HULL_ON_DEATH; shield_set_strength(obj2, 0.0f); } @@ -1215,7 +1215,7 @@ int collide_ship_ship( obj_pair * pair ) //Only do damage if not a landing if (!ship_ship_hit_info.is_landing) { // Scale damage based on skill level for player. - if ((LightOne->flags & OF_PLAYER_SHIP) || (HeavyOne->flags & OF_PLAYER_SHIP)) { + if ((LightOne->flags[Object::Object_Flags::Player_ship]) || (HeavyOne->flags[Object::Object_Flags::Player_ship])) { damage *= (float) (Game_skill_level*Game_skill_level+1)/(NUM_SKILL_LEVELS+1); } else if (Ships[LightOne->instance].team == Ships[HeavyOne->instance].team) { // Decrease damage if non-player ships and not large. @@ -1228,7 +1228,7 @@ int collide_ship_ship( obj_pair * pair ) float dam2 = (100.0f * damage/LightOne->phys_info.mass); int quadrant_num = get_ship_quadrant_from_global(&world_hit_pos, ship_ship_hit_info.heavy); - if ((ship_ship_hit_info.heavy->flags & OF_NO_SHIELDS) || !ship_is_shield_up(ship_ship_hit_info.heavy, quadrant_num) ) { + if ((ship_ship_hit_info.heavy->flags[Object::Object_Flags::No_shields]) || !ship_is_shield_up(ship_ship_hit_info.heavy, quadrant_num) ) { quadrant_num = -1; } @@ -1258,18 +1258,16 @@ int collide_ship_ship( obj_pair * pair ) Script_system.RemHookVars(4, "Ship", "ShipB", "Self", "Object"); return 0; } - } else { - // estimate earliest time at which pair can hit + } + else { + // estimate earliest time at which pair can hit - // cap ships warping in/out can exceed ship's expected velocity - // if ship is warping in, in stage 1, its velocity is 0, so make ship try to collide next frame - int sif_a_flags, sif_b_flags; - sif_a_flags = Ship_info[Ships[A->instance].ship_info_index].flags; - sif_b_flags = Ship_info[Ships[B->instance].ship_info_index].flags; + // cap ships warping in/out can exceed ship's expected velocity + // if ship is warping in, in stage 1, its velocity is 0, so make ship try to collide next frame - // if ship is huge and warping in or out - if ( ((Ships[A->instance].flags & SF_ARRIVING_STAGE_1) && (sif_a_flags & (SIF_HUGE_SHIP))) - || ((Ships[B->instance].flags & SF_ARRIVING_STAGE_1) && (sif_b_flags & (SIF_HUGE_SHIP))) ) { + // if ship is huge and warping in or out + if (((Ships[A->instance].flags[Ship::Ship_Flags::Arriving_stage_1]) && (Ship_info[Ships[A->instance].ship_info_index].is_huge_ship())) + || ((Ships[B->instance].flags[Ship::Ship_Flags::Arriving_stage_1]) && (Ship_info[Ships[B->instance].ship_info_index].is_huge_ship())) ) { pair->next_check_time = timestamp(0); // check next time return 0; } diff --git a/code/object/collideshipweapon.cpp b/code/object/collideshipweapon.cpp index 2b0fca4c39..a3149657b7 100644 --- a/code/object/collideshipweapon.cpp +++ b/code/object/collideshipweapon.cpp @@ -92,7 +92,7 @@ void ship_weapon_do_hit_stuff(object *pship_obj, object *weapon_obj, vec3d *worl vm_vec_copy_scale(&force, &weapon_obj->phys_info.vel, blast ); // send player pain packet - if ( (MULTIPLAYER_MASTER) && !(shipp->flags & SF_DYING) ){ + if ( (MULTIPLAYER_MASTER) && !(shipp->flags[Ship::Ship_Flags::Dying]) ){ int np_index = multi_find_player_by_object(pship_obj); // if this is a player ship @@ -149,7 +149,7 @@ int ship_weapon_check_collision(object *ship_objp, object *weapon_objp, float ti Assert( shipp->objnum == OBJ_INDEX(ship_objp)); // Make ships that are warping in not get collision detection done - if ( shipp->flags & SF_ARRIVING ) return 0; + if ( shipp->is_arriving() ) return 0; // Return information for AI to detect incoming fire. // Could perhaps be done elsewhere at lower cost --MK, 11/7/97 @@ -206,8 +206,8 @@ int ship_weapon_check_collision(object *ship_objp, object *weapon_objp, float ti int hull_collision = 0; // check shields for impact - if (!(ship_objp->flags & OF_NO_SHIELDS)) { - if (sip->flags2 & SIF2_AUTO_SPREAD_SHIELDS) { + if (!(ship_objp->flags[Object::Object_Flags::No_shields])) { + if (sip->flags[Ship::Info_Flags::Auto_spread_shields]) { // The weapon is not allowed to impact the shield before it reaches this point vec3d shield_ignored_until = weapon_objp->last_pos; @@ -305,7 +305,7 @@ int ship_weapon_check_collision(object *ship_objp, object *weapon_objp, float ti vm_vec_sub(&tempv, &mc_shield.hit_point_world, &ship_objp->pos); vm_vec_rotate(&mc_shield.hit_point, &tempv, &ship_objp->orient); } - } else if (sip->flags2 & SIF2_SURFACE_SHIELDS) { + } else if (sip->flags[Ship::Info_Flags::Surface_shields]) { if (pm->shield.ntris > 0) { // If there is a shield mesh, we need to check that first mc_shield.flags = MC_CHECK_SHIELD; @@ -352,7 +352,7 @@ int ship_weapon_check_collision(object *ship_objp, object *weapon_objp, float ti quadrant_num = get_quadrant(&mc_shield.hit_point, ship_objp); // make sure that the shield is active in that quadrant - if (shipp->flags & SF_DYING || !ship_is_shield_up(ship_objp, quadrant_num)) + if (shipp->flags[Ship::Ship_Flags::Dying] || !ship_is_shield_up(ship_objp, quadrant_num)) quadrant_num = -1; // see if we hit the shield @@ -384,7 +384,7 @@ int ship_weapon_check_collision(object *ship_objp, object *weapon_objp, float ti } // check if the hit point is beyond the clip plane when warping out. - if ((shipp->flags & SF_DEPART_WARP) && + if ((shipp->flags[Ship::Ship_Flags::Depart_warp]) && (shipp->warpout_effect) && (valid_hit_occurred)) { @@ -449,7 +449,7 @@ int ship_weapon_check_collision(object *ship_objp, object *weapon_objp, float ti if (vm_vec_dot(&vec_to_ship, &weapon_objp->orient.vec.fvec) < 0.0f) { // check if we're colliding against "invisible" ship - if (!(shipp->flags2 & SF2_DONT_COLLIDE_INVIS)) { + if (!(shipp->flags[Ship::Ship_Flags::Dont_collide_invis])) { wp->lifeleft = 0.001f; if (ship_objp == Player_obj) nprintf(("Jim", "Frame %i: Weapon %d set to detonate, dist = %7.3f.\n", Framecount, OBJ_INDEX(weapon_objp), dist)); @@ -493,13 +493,13 @@ int collide_ship_weapon( obj_pair * pair ) // If it does hit, don't check the pair until about 200 ms before collision. // If it does not hit and is within error tolerance, cull the pair. - if ( (sip->flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP)) && (Weapon_info[Weapons[weapon_obj->instance].weapon_info_index].subtype == WP_LASER) ) { + if ( (sip->is_big_or_huge()) && (Weapon_info[Weapons[weapon_obj->instance].weapon_info_index].subtype == WP_LASER) ) { // Check when within ~1.1 radii. // This allows good transition between sphere checking (leaving the laser about 200 ms from radius) and checking // within the sphere with little time between. There may be some time for "small" big ships // Note: culling ships with auto spread shields seems to waste more performance than it saves, // so we're not doing that here - if ( !(sip->flags2 & SIF2_AUTO_SPREAD_SHIELDS) && vm_vec_dist_squared(&ship->pos, &weapon_obj->pos) < (1.2f*ship->radius*ship->radius) ) { + if ( !(sip->flags[Ship::Info_Flags::Auto_spread_shields]) && vm_vec_dist_squared(&ship->pos, &weapon_obj->pos) < (1.2f*ship->radius*ship->radius) ) { return check_inside_radius_for_big_ships( ship, weapon_obj, pair ); } } diff --git a/code/object/objcollide.cpp b/code/object/objcollide.cpp index 9ac1f2c86e..0a242f9315 100644 --- a/code/object/objcollide.cpp +++ b/code/object/objcollide.cpp @@ -62,7 +62,7 @@ public: SCP_unordered_map Collision_cached_pairs; -struct checkobject; +class checkobject; extern checkobject CheckObjects[MAX_OBJECTS]; extern int Cmdline_old_collision_sys; @@ -183,10 +183,10 @@ void obj_add_pair( object *A, object *B, int check_time, int add_to_end ) if ( A==B ) return; // Don't check collisions with yourself - if ( !(A->flags&OF_COLLIDES) ) return; // This object doesn't collide with anything - if ( !(B->flags&OF_COLLIDES) ) return; // This object doesn't collide with anything + if ( !(A->flags[Object::Object_Flags::Collides]) ) return; // This object doesn't collide with anything + if ( !(B->flags[Object::Object_Flags::Collides]) ) return; // This object doesn't collide with anything - if ((A->flags & OF_IMMOBILE) && (B->flags & OF_IMMOBILE)) return; // Two immobile objects will never collide with each other + if ((A->flags[Object::Object_Flags::Immobile]) && (B->flags[Object::Object_Flags::Immobile])) return; // Two immobile objects will never collide with each other // Make sure you're not checking a parent with it's kid or vicy-versy // if ( A->parent_sig == B->signature && !(A->type == OBJ_SHIP && B->type == OBJ_DEBRIS) ) return; @@ -223,26 +223,26 @@ void obj_add_pair( object *A, object *B, int check_time, int add_to_end ) break; case COLLISION_OF(OBJ_ASTEROID, OBJ_WEAPON): // Only check collision's with player weapons -// if ( Objects[B->parent].flags & OF_PLAYER_SHIP ) { +// if ( Objects[B->parent].flags[Object::Object_Flags::Player_ship] ) { check_collision = collide_asteroid_weapon; // } break; case COLLISION_OF(OBJ_WEAPON, OBJ_ASTEROID): swapped = 1; // Only check collision's with player weapons -// if ( Objects[A->parent].flags & OF_PLAYER_SHIP ) { +// if ( Objects[A->parent].flags[Object::Object_Flags::Player_ship] ) { check_collision = collide_asteroid_weapon; // } break; case COLLISION_OF(OBJ_ASTEROID, OBJ_SHIP): // Only check collisions with player ships -// if ( B->flags & OF_PLAYER_SHIP ) { +// if ( B->flags[Object::Object_Flags::Player_ship] ) { check_collision = collide_asteroid_ship; // } break; case COLLISION_OF(OBJ_SHIP, OBJ_ASTEROID): // Only check collisions with player ships -// if ( A->flags & OF_PLAYER_SHIP ) { +// if ( A->flags[Object::Object_Flags::Player_ship] ) { check_collision = collide_asteroid_ship; // } swapped = 1; @@ -389,7 +389,7 @@ void obj_add_pair( object *A, object *B, int check_time, int add_to_end ) } // for nonplayer ships, only create collision pair if close enough - if ( (B->parent >= 0) && !((Objects[B->parent].signature == B->parent_sig) && (Objects[B->parent].flags & OF_PLAYER_SHIP)) && (vm_vec_dist(&B->pos, &A->pos) < (4.0f*A->radius + 200.0f)) ) + if ( (B->parent >= 0) && !((Objects[B->parent].signature == B->parent_sig) && (Objects[B->parent].flags[Object::Object_Flags::Player_ship])) && (vm_vec_dist(&B->pos, &A->pos) < (4.0f*A->radius + 200.0f)) ) return; } } @@ -399,9 +399,9 @@ void obj_add_pair( object *A, object *B, int check_time, int add_to_end ) // weapon is B if ( (B->parent >= 0) && (Objects[B->parent].signature == B->parent_sig) - && !(Objects[B->parent].flags & OF_PLAYER_SHIP) + && !(Objects[B->parent].flags[Object::Object_Flags::Player_ship]) && (Ships[Objects[B->parent].instance].team == Ships[A->instance].team) - && (Ship_info[Ships[A->instance].ship_info_index].flags & SIF_SMALL_SHIP) + && (Ship_info[Ships[A->instance].ship_info_index].is_small_ship()) && (Weapon_info[Weapons[B->instance].weapon_info_index].subtype == WP_LASER) ) { pairs_not_created++; return; @@ -978,14 +978,14 @@ int collide_predict_large_ship(object *objp, float distance) for ( objp2 = GET_FIRST(&obj_used_list); objp2 != END_OF_LIST(&obj_used_list); objp2 = GET_NEXT(objp2) ) { if ((objp != objp2) && (objp2->type == OBJ_SHIP)) { - if (Ship_info[Ships[objp2->instance].ship_info_index].flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP)) { + if (Ship_info[Ships[objp2->instance].ship_info_index].is_big_or_huge()) { if (dock_check_find_docked_object(objp, objp2)) continue; if (cpls_aux(&goal_pos, objp2, objp)) return 1; } - } else if (!(sip->flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP)) && (objp2->type == OBJ_ASTEROID)) { + } else if (!(sip->is_big_or_huge()) && (objp2->type == OBJ_ASTEROID)) { if (vm_vec_dist_quick(&objp2->pos, &objp->pos) < (distance + objp2->radius)*2.5f) { vec3d pos, delvec; int count; @@ -1167,24 +1167,24 @@ void obj_add_collider(int obj_index) #ifdef OBJECT_CHECK CheckObjects[obj_index].type = objp->type; CheckObjects[obj_index].signature = objp->signature; - CheckObjects[obj_index].flags = objp->flags & ~(OF_NOT_IN_COLL); + CheckObjects[obj_index].flags = objp->flags - Object::Object_Flags::Not_in_coll; CheckObjects[obj_index].parent_sig = objp->parent_sig; CheckObjects[obj_index].parent_type = objp->parent_type; #endif - if(!(objp->flags & OF_NOT_IN_COLL)){ + if(!(objp->flags[Object::Object_Flags::Not_in_coll])){ return; } Collision_sort_list.push_back(obj_index); - objp->flags &= ~OF_NOT_IN_COLL; + objp->flags.remove(Object::Object_Flags::Not_in_coll); } void obj_remove_collider(int obj_index) { #ifdef OBJECT_CHECK - CheckObjects[obj_index].flags |= OF_NOT_IN_COLL; + CheckObjects[obj_index].flags.set(Object::Object_Flags::Not_in_coll); #endif size_t i; @@ -1197,7 +1197,7 @@ void obj_remove_collider(int obj_index) } } - Objects[obj_index].flags |= OF_NOT_IN_COLL; + Objects[obj_index].flags.set(Object::Object_Flags::Not_in_coll); } void obj_reset_colliders() @@ -1385,10 +1385,10 @@ void obj_collide_pair(object *A, object *B) if ( A==B ) return; // Don't check collisions with yourself - if ( !(A->flags&OF_COLLIDES) ) return; // This object doesn't collide with anything - if ( !(B->flags&OF_COLLIDES) ) return; // This object doesn't collide with anything + if ( !(A->flags[Object::Object_Flags::Collides]) ) return; // This object doesn't collide with anything + if ( !(B->flags[Object::Object_Flags::Collides]) ) return; // This object doesn't collide with anything - if ((A->flags & OF_IMMOBILE) && (B->flags & OF_IMMOBILE)) return; // Two immobile objects will never collide with each other + if ((A->flags[Object::Object_Flags::Immobile]) && (B->flags[Object::Object_Flags::Immobile])) return; // Two immobile objects will never collide with each other // Make sure you're not checking a parent with it's kid or vicy-versy // if ( A->parent_sig == B->signature && !(A->type == OBJ_SHIP && B->type == OBJ_DEBRIS) ) return; @@ -1425,26 +1425,26 @@ void obj_collide_pair(object *A, object *B) break; case COLLISION_OF(OBJ_ASTEROID, OBJ_WEAPON): // Only check collision's with player weapons -// if ( Objects[B->parent].flags & OF_PLAYER_SHIP ) { +// if ( Objects[B->parent].flags[Object::Object_Flags::Player_ship] ) { check_collision = collide_asteroid_weapon; // } break; case COLLISION_OF(OBJ_WEAPON, OBJ_ASTEROID): swapped = 1; // Only check collision's with player weapons -// if ( Objects[A->parent].flags & OF_PLAYER_SHIP ) { +// if ( Objects[A->parent].flags[Object::Object_Flags::Player_ship] ) { check_collision = collide_asteroid_weapon; // } break; case COLLISION_OF(OBJ_ASTEROID, OBJ_SHIP): // Only check collisions with player ships -// if ( B->flags & OF_PLAYER_SHIP ) { +// if ( B->flags[Object::Object_Flags::Player_ship] ) { check_collision = collide_asteroid_ship; // } break; case COLLISION_OF(OBJ_SHIP, OBJ_ASTEROID): // Only check collisions with player ships -// if ( A->flags & OF_PLAYER_SHIP ) { +// if ( A->flags[Object::Object_Flags::Player_ship] ) { check_collision = collide_asteroid_ship; // } swapped = 1; @@ -1621,7 +1621,7 @@ void obj_collide_pair(object *A, object *B) } // for nonplayer ships, only create collision pair if close enough - if ( (B->parent >= 0) && !((Objects[B->parent].signature == B->parent_sig) && (Objects[B->parent].flags & OF_PLAYER_SHIP)) && (vm_vec_dist(&B->pos, &A->pos) < (4.0f*A->radius + 200.0f)) ) { + if ( (B->parent >= 0) && !((Objects[B->parent].signature == B->parent_sig) && (Objects[B->parent].flags[Object::Object_Flags::Player_ship])) && (vm_vec_dist(&B->pos, &A->pos) < (4.0f*A->radius + 200.0f)) ) { collision_info->next_check_time = -1; return; } @@ -1633,9 +1633,9 @@ void obj_collide_pair(object *A, object *B) // weapon is B if ( (B->parent >= 0) && (Objects[B->parent].signature == B->parent_sig) - && !(Objects[B->parent].flags & OF_PLAYER_SHIP) + && !(Objects[B->parent].flags[Object::Object_Flags::Player_ship]) && (Ships[Objects[B->parent].instance].team == Ships[A->instance].team) - && (Ship_info[Ships[A->instance].ship_info_index].flags & SIF_SMALL_SHIP) + && (Ship_info[Ships[A->instance].ship_info_index].is_small_ship()) && (Weapon_info[Weapons[B->instance].weapon_info_index].subtype == WP_LASER) ) { collision_info->next_check_time = -1; return; diff --git a/code/object/object.cpp b/code/object/object.cpp index 814f6e8560..a170d4baba 100644 --- a/code/object/object.cpp +++ b/code/object/object.cpp @@ -95,18 +95,26 @@ char *Object_type_names[MAX_OBJECT_TYPES] = { }; obj_flag_name Object_flag_names[] = { - {OF_INVULNERABLE, "invulnerable", 1, }, - {OF_PROTECTED, "protect-ship", 1, }, - {OF_BEAM_PROTECTED, "beam-protect-ship", 1, }, - {OF_NO_SHIELDS, "no-shields", 1, }, - {OF_TARGETABLE_AS_BOMB, "targetable-as-bomb", 1, }, - {OF_FLAK_PROTECTED, "flak-protect-ship", 1, }, - {OF_LASER_PROTECTED, "laser-protect-ship", 1, }, - {OF_MISSILE_PROTECTED, "missile-protect-ship", 1, }, - {OF_IMMOBILE, "immobile", 1, }, - {OF_COLLIDES, "collides", 1, }, + { Object::Object_Flags::Invulnerable, "invulnerable", 1, }, + { Object::Object_Flags::Protected, "protect-ship", 1, }, + { Object::Object_Flags::Beam_protected, "beam-protect-ship", 1, }, + { Object::Object_Flags::No_shields, "no-shields", 1, }, + { Object::Object_Flags::Targetable_as_bomb, "targetable-as-bomb", 1, }, + { Object::Object_Flags::Flak_protected, "flak-protect-ship", 1, }, + { Object::Object_Flags::Laser_protected, "laser-protect-ship", 1, }, + { Object::Object_Flags::Missile_protected, "missile-protect-ship", 1, }, + { Object::Object_Flags::Immobile, "immobile", 1, }, + { Object::Object_Flags::Collides, "collides", 1, }, }; +#ifdef OBJECT_CHECK +checkobject::checkobject() + : type(0), signature(0), parent_sig(0), parent_type(0) +{ + flags.reset(); +} +#endif + // all we need to set are the pointers, but type, parent, and instance are useful to set as well object::object() : next(NULL), prev(NULL), type(OBJ_NONE), parent(-1), instance(-1), n_quadrants(0), hull_strength(0.0), @@ -129,7 +137,7 @@ void object::clear() signature = num_pairs = collision_group_id = 0; parent = parent_sig = instance = -1; type = parent_type = OBJ_NONE; - flags = 0; + flags.reset(); pos = last_pos = vmd_zero_vector; orient = last_orient = vmd_identity_matrix; radius = hull_strength = sim_hull_strength = 0.0f; @@ -167,7 +175,7 @@ int free_object_slots(int num_used) return 0; for ( objp = GET_FIRST(&obj_used_list); objp != END_OF_LIST(&obj_used_list); objp = GET_NEXT(objp) ) { - if (objp->flags & OF_SHOULD_BE_DEAD) { + if (objp->flags[Object::Object_Flags::Should_be_dead]) { num_already_free++; if (MAX_OBJECTS - num_already_free < num_used) return num_already_free; @@ -216,7 +224,7 @@ int free_object_slots(int num_used) if ( (Objects[obj_list[i]].type == OBJ_DEBRIS) && (Debris[Objects[obj_list[i]].instance].flags & DEBRIS_EXPIRE) ) { num_to_free--; nprintf(("allender", "Freeing DEBRIS object %3i\n", obj_list[i])); - Objects[obj_list[i]].flags |= OF_SHOULD_BE_DEAD; + Objects[obj_list[i]].flags.set(Object::Object_Flags::Should_be_dead); } if (!num_to_free) @@ -227,7 +235,7 @@ int free_object_slots(int num_used) if ( (tmp_obj->type == OBJ_FIREBALL) && (fireball_is_perishable(tmp_obj)) ) { num_to_free--; nprintf(("allender", "Freeing FIREBALL object %3i\n", obj_list[i])); - tmp_obj->flags |= OF_SHOULD_BE_DEAD; + tmp_obj->flags.set(Object::Object_Flags::Should_be_dead); } } @@ -245,7 +253,7 @@ int free_object_slots(int num_used) for (i=0; i &flags ) { int objnum; object *obj; @@ -496,7 +504,8 @@ int obj_create(ubyte type,int parent_obj,int instance, matrix * orient, obj->parent_type = obj->type; } - obj->flags = flags | OF_NOT_IN_COLL; + obj->flags = flags; + obj->flags.set(Object::Object_Flags::Not_in_coll); if (pos) { obj->pos = *pos; obj->last_pos = *pos; @@ -544,7 +553,7 @@ void obj_delete(int objnum) case OBJ_SHIP: if ((objp == Player_obj) && !Fred_running) { objp->type = OBJ_GHOST; - objp->flags &= ~(OF_SHOULD_BE_DEAD); + objp->flags.remove(Object::Object_Flags::Should_be_dead); // we have to traverse the ship_obj list and remove this guy from it as well ship_obj *moveup = GET_FIRST(&Ship_obj_list); @@ -587,7 +596,7 @@ void obj_delete(int objnum) case OBJ_GHOST: if(!(Game_mode & GM_MULTIPLAYER)){ mprintf(("Warning: Tried to delete a ghost!\n")); - objp->flags &= ~OF_SHOULD_BE_DEAD; + objp->flags.remove(Object::Object_Flags::Should_be_dead); return; } else { // we need to be able to delete GHOST objects in multiplayer to allow for player respawns. @@ -634,10 +643,10 @@ void obj_delete_all_that_should_be_dead() objp = GET_FIRST(&obj_used_list); while( objp !=END_OF_LIST(&obj_used_list) ) { // Goober5000 - HACK HACK HACK - see obj_move_all - objp->flags &= ~OF_DOCKED_ALREADY_HANDLED; + objp->flags.remove(Object::Object_Flags::Docked_already_handled); temp = GET_NEXT(objp); - if ( objp->flags&OF_SHOULD_BE_DEAD ) + if ( objp->flags[Object::Object_Flags::Should_be_dead] ) obj_delete( OBJ_INDEX(objp) ); // MWA says that john says that let obj_delete handle everything because of the editor objp = temp; } @@ -721,7 +730,7 @@ void obj_player_fire_stuff( object *objp, control_info ci ) { ship *shipp; - Assert( objp->flags & OF_PLAYER_SHIP); + Assert( objp->flags[Object::Object_Flags::Player_ship]); // try and get the ship pointer shipp = NULL; @@ -737,7 +746,7 @@ void obj_player_fire_stuff( object *objp, control_info ci ) if ( ci.fire_primary_count ) { // flag the ship as having the trigger down if(shipp != NULL){ - shipp->flags |= SF_TRIGGER_DOWN; + shipp->flags.set(Ship::Ship_Flags::Trigger_down); } // fire non-streaming primaries here @@ -745,7 +754,7 @@ void obj_player_fire_stuff( object *objp, control_info ci ) } else { // unflag the ship as having the trigger down if(shipp != NULL){ - shipp->flags &= ~(SF_TRIGGER_DOWN); + shipp->flags.remove(Ship::Ship_Flags::Trigger_down); ship_stop_fire_primary(objp); //if it hasn't fired do the "has just stoped fireing" stuff } } @@ -783,9 +792,9 @@ void obj_move_call_physics(object *objp, float frametime) int has_fired = -1; //stop fireing stuff-Bobboau // Do physics for objects with OF_PHYSICS flag set and with some engine strength remaining. - if ( objp->flags & OF_PHYSICS ) { + if ( objp->flags[Object::Object_Flags::Physics] ) { // only set phys info if ship is not dead - if ((objp->type == OBJ_SHIP) && !(Ships[objp->instance].flags & SF_DYING)) { + if ((objp->type == OBJ_SHIP) && !(Ships[objp->instance].flags[Ship::Ship_Flags::Dying])) { ship *shipp = &Ships[objp->instance]; float engine_strength; @@ -883,8 +892,8 @@ void obj_move_call_physics(object *objp, float frametime) // in multiplayer, if this object was just updatd (i.e. clients send their own positions), // then reset the flag and don't move the object. - if ( MULTIPLAYER_MASTER && (objp->flags & OF_JUST_UPDATED) ) { - objp->flags &= ~OF_JUST_UPDATED; + if (MULTIPLAYER_MASTER && (objp->flags[Object::Object_Flags::Just_updated])) { + objp->flags.remove(Object::Object_Flags::Just_updated); goto obj_maybe_fire; } @@ -894,7 +903,7 @@ void obj_move_call_physics(object *objp, float frametime) // is moved (like firing weapons, etc). This routine will get called either single // or multiplayer. We must find the player object to get to the control info field obj_maybe_fire: - if ( (objp->flags & OF_PLAYER_SHIP) && (objp->type != OBJ_OBSERVER) && (objp == Player_obj)) { + if ( (objp->flags[Object::Object_Flags::Player_ship]) && (objp->type != OBJ_OBSERVER) && (objp == Player_obj)) { player *pp; if(Player != NULL){ pp = Player; @@ -918,7 +927,7 @@ obj_maybe_fire: //2D MODE //THIS IS A FREAKIN' HACK //Do not let ship change position on Y axis - if(The_mission.flags & MISSION_FLAG_2D_MISSION) + if(The_mission.flags[Mission::Mission_Flags::Mission_2d]) { angles old_angles, new_angles; objp->pos.xyz.y = objp->last_pos.xyz.y; @@ -974,7 +983,7 @@ void obj_check_object( object *obj ) mprintf(( "Object signature changed!\n" )); Int3(); } - if ( (CheckObjects[objnum].flags&IMPORTANT_FLAGS) != (obj->flags&IMPORTANT_FLAGS) ) { + if ( (CheckObjects[objnum].flags[Object::Object_Flags::Collides]) != (obj->flags[Object::Object_Flags::Collides]) ) { mprintf(( "Object flags changed!\n" )); Int3(); } @@ -997,12 +1006,12 @@ void obj_check_object( object *obj ) * this you shouldn't get Int3's in the checkobject code. If you * do, then put code in here to correctly handle the case. */ -void obj_set_flags( object *obj, uint new_flags ) +void obj_set_flags( object *obj, const flagset& new_flags ) { int objnum = OBJ_INDEX(obj); // turning collision detection off - if ( (obj->flags & OF_COLLIDES) && (!(new_flags&OF_COLLIDES))) { + if ( (obj->flags[Object::Object_Flags::Collides]) && (!(new_flags[Object::Object_Flags::Collides]))) { // Remove all object pairs if ( Cmdline_old_collision_sys ) { obj_remove_pairs( obj ); @@ -1012,17 +1021,17 @@ void obj_set_flags( object *obj, uint new_flags ) // update object flags properly obj->flags = new_flags; - obj->flags |= OF_NOT_IN_COLL; + obj->flags.set(Object::Object_Flags::Not_in_coll); #ifdef OBJECT_CHECK CheckObjects[objnum].flags = new_flags; - CheckObjects[objnum].flags |= OF_NOT_IN_COLL; + CheckObjects[objnum].flags.set(Object::Object_Flags::Not_in_coll); #endif return; } // turning collision detection on - if ( (!(obj->flags & OF_COLLIDES)) && (new_flags&OF_COLLIDES) ) { + if ( (!(obj->flags[Object::Object_Flags::Collides])) && (new_flags[Object::Object_Flags::Collides]) ) { // observers can't collide or be hit, and they therefore have no hit or collide functions // So, don't allow this bit to be set @@ -1031,7 +1040,7 @@ void obj_set_flags( object *obj, uint new_flags ) Int3(); } - obj->flags |= OF_COLLIDES; + obj->flags.set(Object::Object_Flags::Collides); // Turn on collision detection if ( Cmdline_old_collision_sys ) { @@ -1041,10 +1050,10 @@ void obj_set_flags( object *obj, uint new_flags ) } obj->flags = new_flags; - obj->flags &= ~(OF_NOT_IN_COLL); + obj->flags.remove(Object::Object_Flags::Not_in_coll); #ifdef OBJECT_CHECK CheckObjects[objnum].flags = new_flags; - CheckObjects[objnum].flags &= ~(OF_NOT_IN_COLL); + CheckObjects[objnum].flags.remove(Object::Object_Flags::Not_in_coll); #endif return; } @@ -1053,7 +1062,7 @@ void obj_set_flags( object *obj, uint new_flags ) // marked as OF_COULD_BE_PLAYER // this code is pretty much debug code and shouldn't be relied on to always do the right thing // for flags other than - if ( MULTIPLAYER_MASTER && !(obj->flags & OF_COULD_BE_PLAYER) && (new_flags & OF_COULD_BE_PLAYER) ) { + if ( MULTIPLAYER_MASTER && !(obj->flags[Object::Object_Flags::Could_be_player]) && (new_flags[Object::Object_Flags::Could_be_player]) ) { ship *shipp; int team, slot; @@ -1086,7 +1095,7 @@ void obj_set_flags( object *obj, uint new_flags ) } // Check for unhandled flag changing - if ( (new_flags&IMPORTANT_FLAGS) != (obj->flags&IMPORTANT_FLAGS) ) { + if ( (new_flags[Object::Object_Flags::Collides]) != (obj->flags[Object::Object_Flags::Collides]) ) { mprintf(( "Unhandled flag changing in obj_set_flags!!\n" )); mprintf(( "Add code to support it, see John for questions!!\n" )); Int3(); @@ -1400,7 +1409,7 @@ void obj_move_all(float frametime) for (objp = GET_FIRST(&obj_used_list); objp != END_OF_LIST(&obj_used_list); objp = GET_NEXT(objp)) { // skip objects which should be dead - if (objp->flags & OF_SHOULD_BE_DEAD) { + if (objp->flags[Object::Object_Flags::Should_be_dead]) { continue; } @@ -1423,7 +1432,7 @@ void obj_move_all(float frametime) objp->last_orient = objp->orient; // Goober5000 - skip objects which don't move, but only until they're destroyed - if (!(objp->flags & OF_IMMOBILE && objp->hull_strength > 0.0f)) { + if (!(objp->flags[Object::Object_Flags::Immobile] && objp->hull_strength > 0.0f)) { // if this is an object which should be interpolated in multiplayer, do so if (multi_oo_is_interp_object(objp)) { multi_oo_interp(objp); @@ -1496,7 +1505,7 @@ void obj_move_all(float frametime) } // unflag all objects as being updates - objp->flags &= ~OF_JUST_UPDATED; + objp->flags.remove(Object::Object_Flags::Just_updated); objp = GET_NEXT(objp); } @@ -1558,7 +1567,7 @@ void obj_render(object *obj) void obj_queue_render(object* obj, draw_list* scene) { - if ( obj->flags & OF_SHOULD_BE_DEAD ) return; + if ( obj->flags[Object::Object_Flags::Should_be_dead] ) return; // need to figure out what to do with this hook. // maybe save an array of these and run the script conditions after we finish drawing @@ -1659,7 +1668,7 @@ void obj_client_pre_interpolate() } // for all non-dead object which are _not_ ships - if ( !(objp->flags&OF_SHOULD_BE_DEAD) ) { + if ( !(objp->flags[Object::Object_Flags::Should_be_dead]) ) { // pre-move step obj_move_all_pre(objp, flFrametime); @@ -1721,7 +1730,7 @@ void obj_observer_move(float frame_time) ft = flFrametime; obj_move_call_physics( objp, ft ); obj_move_all_post(objp, frame_time); - objp->flags &= ~OF_JUST_UPDATED; + objp->flags.remove(Object::Object_Flags::Just_updated); } /** @@ -1747,25 +1756,6 @@ void obj_get_average_ship_pos( vec3d *pos ) vm_vec_scale( pos, 1.0f/(float)count ); } - -int obj_get_SIF(object *objp) -{ - if ((objp->type == OBJ_SHIP) || (objp->type == OBJ_START)) - return Ship_info[Ships[objp->instance].ship_info_index].flags; - - Int3(); - return 0; -} - -int obj_get_SIF(int obj) -{ - if ((Objects[obj].type == OBJ_SHIP) || (Objects[obj].type == OBJ_START)) - return Ship_info[Ships[Objects[obj].instance].ship_info_index].flags; - - Int3(); - return 0; -} - /** * Return the team for the object passed as a parameter * @@ -1840,14 +1830,15 @@ void obj_add_pairs(int objnum) objp = &Objects[objnum]; // don't do anything if its already in the object pair list - if(!(objp->flags & OF_NOT_IN_COLL)){ + if(!(objp->flags[Object::Object_Flags::Not_in_coll])){ return; } #ifdef OBJECT_CHECK CheckObjects[objnum].type = objp->type; CheckObjects[objnum].signature = objp->signature; - CheckObjects[objnum].flags = objp->flags & ~(OF_NOT_IN_COLL); + CheckObjects[objnum].flags = objp->flags; + CheckObjects[objnum].flags.remove(Object::Object_Flags::Not_in_coll); CheckObjects[objnum].parent_sig = objp->parent_sig; CheckObjects[objnum].parent_type = objp->parent_type; #endif @@ -1859,7 +1850,7 @@ void obj_add_pairs(int objnum) obj_add_pair( objp, A ); } - objp->flags &= ~OF_NOT_IN_COLL; + objp->flags.remove(Object::Object_Flags::Not_in_coll); } /** @@ -1873,9 +1864,9 @@ void obj_remove_pairs( object * a ) { obj_pair *parent, *tmp; - a->flags |= OF_NOT_IN_COLL; + a->flags.set(Object::Object_Flags::Not_in_coll); #ifdef OBJECT_CHECK - CheckObjects[OBJ_INDEX(a)].flags |= OF_NOT_IN_COLL; + CheckObjects[OBJ_INDEX(a)].flags.set(Object::Object_Flags::Not_in_coll); #endif if ( a->num_pairs < 1 ) { @@ -1920,7 +1911,9 @@ void obj_reset_all_collisions() { // clear checkobjects #ifndef NDEBUG - memset(CheckObjects, 0, sizeof(checkobject) * MAX_OBJECTS); + for (int i = 0; i < MAX_OBJECTS; ++i) { + CheckObjects[i] = checkobject(); + } #endif // clear object pairs @@ -1935,7 +1928,7 @@ void obj_reset_all_collisions() moveup = GET_FIRST(&obj_used_list); while(moveup != END_OF_LIST(&obj_used_list)){ // he's not in the collision list - moveup->flags |= OF_NOT_IN_COLL; + moveup->flags.set(Object::Object_Flags::Not_in_coll); // recalc pairs for this guy if ( Cmdline_old_collision_sys ) { diff --git a/code/object/object.h b/code/object/object.h index 28fda45845..4f2649cd73 100644 --- a/code/object/object.h +++ b/code/object/object.h @@ -16,6 +16,7 @@ #include "globalincs/pstypes.h" #include "math/vecmat.h" #include "physics/physics.h" +#include "object/object_flags.h" /* * CONSTANTS @@ -69,7 +70,7 @@ extern char *Object_type_names[MAX_OBJECT_TYPES]; // {Put a call to this in OBJECT.C, function obj_delete_all_that_should_be_dead } // WARNING: To kill an object, set it's OF_SHOULD_BE_DEAD flag. Then, // this function will get called when it's time to clean up the data. -// Assert( obj->flags & OF_SHOULD_BE_DEAD ); +// Assert( obj->flags[Object::Object_Flags::Should_be_dead] ); // ... // ... Free up all weapon-specfic data // obj_delete(objnum); @@ -99,35 +100,8 @@ extern char *Object_type_names[MAX_OBJECT_TYPES]; // ... Reducing shields, etc // } -//Misc object flags -#define OF_RENDERS (1<<0) // It renders as something ( objtype_render gets called) -#define OF_COLLIDES (1<<1) // It collides with stuff (objtype_check_impact & objtype_hit gets called) -#define OF_PHYSICS (1<<2) // It moves with standard physics. -#define OF_SHOULD_BE_DEAD (1<<3) // this object should be dead, so next time we can, we should delete this object. -#define OF_INVULNERABLE (1<<4) // invulnerable -#define OF_PROTECTED (1<<5) // Don't kill this object, probably mission-critical. -#define OF_PLAYER_SHIP (1<<6) // this object under control of some player -- don't do ai stuff on it!!! -#define OF_NO_SHIELDS (1<<7) // object has no shield generator system (i.e. no shields) -#define OF_JUST_UPDATED (1<<8) // for multiplayer -- indicates that we received object update this frame -#define OF_COULD_BE_PLAYER (1<<9) // for multiplayer -- indicates that it is selectable ingame joiners as their ship -#define OF_WAS_RENDERED (1<<10) // Set if this object was rendered this frame. Only gets set if OF_RENDERS set. Gets cleared or set in obj_render_all(). -#define OF_NOT_IN_COLL (1<<11) // object has not been added to collision list -#define OF_BEAM_PROTECTED (1<<12) // don't fire beam weapons at this type of object, probably mission critical. -#define OF_SPECIAL_WARPIN (1<<13) // Object has special warp-in enabled. -#define OF_DOCKED_ALREADY_HANDLED (1<<14) // Goober5000 - a docked object that we already moved -#define OF_TARGETABLE_AS_BOMB (1<<15) -#define OF_FLAK_PROTECTED (1<<16) // Goober5000 - protected from flak turrets -#define OF_LASER_PROTECTED (1<<17) // Goober5000 - protected from laser turrets -#define OF_MISSILE_PROTECTED (1<<18) // Goober5000 - protected from missile turrets -#define OF_IMMOBILE (1<<19) // Goober5000 - doesn't move, no matter what - -// Flags used by Fred -#define OF_MARKED (1<<29) // Object is marked (Fred). Can be reused in FreeSpace for anything that won't be used by Fred. -#define OF_TEMP_MARKED (1<<30) // Temporarily marked (Fred). -#define OF_HIDDEN (1<<31) // Object is hidden (not shown) and can't be manipulated - typedef struct obj_flag_name { - int flag; + Object::Object_Flags flag; char flag_name[TOKEN_LENGTH]; int flag_list; } obj_flag_name; @@ -148,7 +122,7 @@ public: int parent_sig; // This object's parent's signature char parent_type; // This object's parent's type int instance; // which instance. ie.. if type is Robot, then this indexes into the Robots array - uint flags; // misc flags. Call obj_set_flags to change this. + flagset flags; // misc flags. Call obj_set_flags to change this. vec3d pos; // absolute x,y,z coordinate of center of object matrix orient; // orientation of object in world float radius; // 3d size of object - for collision detection @@ -194,14 +168,17 @@ typedef struct object_orient_pos { } object_orient_pos; #ifdef OBJECT_CHECK -typedef struct checkobject +class checkobject { +public: int type; int signature; - uint flags; + flagset flags; int parent_sig; int parent_type; -} checkobject; + + checkobject(); +}; #endif /* @@ -246,7 +223,7 @@ void obj_init(); //object. Returns 0 if failed, otherwise object index. //You can pass 0 for parent if you don't care about that. //You can pass null for orient and/or pos if you don't care. -int obj_create(ubyte type,int parent_obj, int instance, matrix * orient, vec3d * pos, float radius, uint flags ); +int obj_create(ubyte type,int parent_obj, int instance, matrix * orient, vec3d * pos, float radius, const flagset &flags ); void obj_render(object* obj); @@ -268,7 +245,7 @@ void obj_delete(int objnum); void obj_merge_created_list(void); // recalculate object pairs for an object -#define OBJ_RECALC_PAIRS(obj_to_reset) do { obj_set_flags(obj_to_reset, obj_to_reset->flags & ~(OF_COLLIDES)); obj_set_flags(obj_to_reset, obj_to_reset->flags | OF_COLLIDES); } while(0); +#define OBJ_RECALC_PAIRS(obj_to_reset) do { obj_set_flags(obj_to_reset, obj_to_reset->flags - Object::Object_Flags::Collides); obj_set_flags(obj_to_reset, obj_to_reset->flags + Object::Object_Flags::Collides); } while(0); // Removes any occurances of object 'a' from the pairs list. void obj_remove_pairs( object * a ); @@ -307,11 +284,7 @@ void obj_player_fire_stuff( object *objp, control_info ci ); // actually turn the object collision detection off. By calling // this you shouldn't get Int3's in the checkobject code. If you // do, then put code in here to correctly handle the case. -void obj_set_flags(object *obj, uint new_flags); - -// get the Ship_info flags for a given ship (if you have the object) -int obj_get_SIF(object *objp); -int obj_get_SIF(int obj); +void obj_set_flags(object *obj, const flagset& new_flags); // get the team for any object int obj_team(object *objp); diff --git a/code/object/object_flags.h b/code/object/object_flags.h new file mode 100644 index 0000000000..cc44b37757 --- /dev/null +++ b/code/object/object_flags.h @@ -0,0 +1,36 @@ +#ifndef OBJECT_FLAGS_H +#define OBJECT_FLAGS_H + +#include "globalincs/flagset.h" + +namespace Object { + FLAG_LIST(Object_Flags) { + Renders, // It renders as something ( objtype_render gets called) + Collides, // It collides with stuff (objtype_check_impact & objtype_hit gets called) + Physics, // It moves with standard physics. + Should_be_dead, // this object should be dead, so next time we can, we should delete this object. + Invulnerable, // invulnerable + Protected, // Don't kill this object, probably mission-critical. + Player_ship, // this object under control of some player -- don't do ai stuff on it!!! + No_shields, // object has no shield generator system (i.e. no shields) + Just_updated, // for multiplayer -- indicates that we received object update this frame + Could_be_player, // for multiplayer -- indicates that it is selectable ingame joiners as their ship + Was_rendered, // Set if this object was rendered this frame. Only gets set if OF_RENDERS set. Gets cleared or set in obj_render_all(). + Not_in_coll, // object has not been added to collision list + Beam_protected, // don't fire beam weapons at this type of object, probably mission critical. + Special_warpin, // Object has special warp-in enabled. + Docked_already_handled, // Goober5000 - a docked object that we already moved + Targetable_as_bomb, + Flak_protected, // Goober5000 - protected from flak turrets + Laser_protected, // Goober5000 - protected from laser turrets + Missile_protected, // Goober5000 - protected from missile turrets + Immobile, // Goober5000 - doesn't move, no matter what + Marked, // Object is marked (Fred). Can be reused in FreeSpace for anything that won't be used by Fred. + Temp_marked, // Temporarily marked (Fred). + Hidden, // Object is hidden (not shown) and can't be manipulated + + NUM_VALUES + }; +} + +#endif \ No newline at end of file diff --git a/code/object/objectdock.cpp b/code/object/objectdock.cpp index 8fd850800e..99c6d4f630 100644 --- a/code/object/objectdock.cpp +++ b/code/object/objectdock.cpp @@ -377,7 +377,7 @@ void dock_move_docked_objects(object *objp) return; // has this object (by extension, this group of docked objects) been handled already? - if (objp->flags & OF_DOCKED_ALREADY_HANDLED) + if (objp->flags[Object::Object_Flags::Docked_already_handled]) return; Assert((objp->instance >= 0) && (objp->instance < MAX_SHIPS)); @@ -414,11 +414,11 @@ void dock_move_docked_objects(object *objp) void dock_move_docked_children_tree(object *objp, object *parent_objp) { // has this object been handled already? - if (objp->flags & OF_DOCKED_ALREADY_HANDLED) + if (objp->flags[Object::Object_Flags::Docked_already_handled]) return; // mark as handled - objp->flags |= OF_DOCKED_ALREADY_HANDLED; + objp->flags.set(Object::Object_Flags::Docked_already_handled); // if parent_objp exists if (parent_objp != NULL) @@ -646,7 +646,7 @@ bool dock_check_assume_hub() // evaluation fail. // Assume level 2 optimization unless the mission specifies level 3. - return !(The_mission.flags & MISSION_FLAG_ALLOW_DOCK_TREES); + return !(The_mission.flags[Mission::Mission_Flags::Allow_dock_trees]); } object *dock_get_hub(object *objp) diff --git a/code/object/objectshield.cpp b/code/object/objectshield.cpp index 7c015e6778..c5d31e9566 100644 --- a/code/object/objectshield.cpp +++ b/code/object/objectshield.cpp @@ -21,7 +21,7 @@ float shield_get_strength(object *objp) { // no shield system, no strength! - if (objp->flags & OF_NO_SHIELDS) + if (objp->flags[Object::Object_Flags::No_shields]) return 0.0f; int i; @@ -135,7 +135,7 @@ float scale_quad(float generator_fraction, float quad_strength) float shield_get_quad(object *objp, int quadrant_num) { // no shield system, no strength! - if (objp->flags & OF_NO_SHIELDS) + if (objp->flags[Object::Object_Flags::No_shields]) return 0.0f; // check array bounds diff --git a/code/object/objectsnd.cpp b/code/object/objectsnd.cpp index d85d5476e4..42cc98f33e 100644 --- a/code/object/objectsnd.cpp +++ b/code/object/objectsnd.cpp @@ -426,7 +426,7 @@ void maybe_play_flyby_snd(float closest_dist, object *closest_objp, object *list ship_info *sip = &Ship_info[Ships[closest_objp->instance].ship_info_index]; game_snd *snd; - if (sip->flags & SIF_BOMBER) + if (sip->flags[Ship::Info_Flags::Bomber]) snd = &Species_info[sip->species].snd_flyby_bomber; else snd = &Species_info[sip->species].snd_flyby_fighter; @@ -514,7 +514,7 @@ void obj_snd_do_frame() // save closest distance (used for flyby sound) if this is a small ship (and not the observer) if ( (objp->type == OBJ_SHIP) && (distance < closest_dist) && (objp != observer_obj) ) { - if ( Ship_info[Ships[objp->instance].ship_info_index].flags & SIF_SMALL_SHIP ) { + if ( Ship_info[Ships[objp->instance].ship_info_index].is_small_ship() ) { closest_dist = distance; closest_objp = objp; } @@ -527,7 +527,7 @@ void obj_snd_do_frame() alive_vol_mult = 1.0f; if ( objp->type == OBJ_SHIP ) { ship_info *sip = &Ship_info[Ships[objp->instance].ship_info_index]; - if ( !(sip->flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP)) ) { + if ( !(sip->is_big_or_huge()) ) { if ( objp->phys_info.max_vel.xyz.z <= 0.0f ) { percent_max = 0.0f; } @@ -664,7 +664,7 @@ void obj_snd_do_frame() channel = ds_get_channel(osp->instance); // for DirectSound3D sounds, re-establish the maximum speed based on the // speed_vol_multiplier - if ( sp == NULL || ( (sp != NULL) && (sp->flags & SF_ENGINES_ON) ) ) { + if ( sp == NULL || ( (sp != NULL) && (sp->flags[Ship::Ship_Flags::Engines_on]) ) ) { snd_set_volume( osp->instance, gs->default_volume*speed_vol_multiplier*rot_vol_mult*alive_vol_mult ); } else { @@ -676,7 +676,7 @@ void obj_snd_do_frame() // Don't play doppler effect for cruisers or capitals if ( sp ) { - if ( ship_get_SIF(sp) & (SIF_BIG_SHIP | SIF_HUGE_SHIP) ) { + if ( Ship_info[sp->ship_info_index].is_big_or_huge() ) { vel = vmd_zero_vector; } } diff --git a/code/object/objectsort.cpp b/code/object/objectsort.cpp index 4e18725f44..05dcb48aab 100644 --- a/code/object/objectsort.cpp +++ b/code/object/objectsort.cpp @@ -180,8 +180,8 @@ void obj_render_all(void (*render_function)(object *objp), bool *draw_viewer_las objp = Objects; for (i=0;i<=Highest_object_index;i++,objp++) { - if ( (objp->type != OBJ_NONE) && (objp->flags&OF_RENDERS) ) { - objp->flags &= ~OF_WAS_RENDERED; + if ( (objp->type != OBJ_NONE) && (objp->flags[Object::Object_Flags::Renders]) ) { + objp->flags.remove(Object::Object_Flags::Was_rendered); if ( obj_in_view_cone(objp) ) { sorted_obj osp; @@ -239,7 +239,7 @@ void obj_render_all(void (*render_function)(object *objp), bool *draw_viewer_las Interp_no_flush = 1; - bool full_neb = ((The_mission.flags & MISSION_FLAG_FULLNEB) && (Neb2_render_mode != NEB2_RENDER_NONE) && !Fred_running); + bool full_neb = ((The_mission.flags[Mission::Mission_Flags::Fullneb]) && (Neb2_render_mode != NEB2_RENDER_NONE) && !Fred_running); bool c_viewer = (!Viewer_mode || (Viewer_mode & VM_PADLOCK_ANY) || (Viewer_mode & VM_OTHER_SHIP) || (Viewer_mode & VM_TRACK)); // now draw them @@ -248,13 +248,13 @@ void obj_render_all(void (*render_function)(object *objp), bool *draw_viewer_las for (os = Sorted_objects.begin(); os != Sorted_objects.end(); ++os) { object *obj = os->obj; - obj->flags |= OF_WAS_RENDERED; + obj->flags.set(Object::Object_Flags::Was_rendered); //This is for ship cockpits. Bobb, feel free to optimize this any way you see fit if ( (obj == Viewer_obj) && (obj->type == OBJ_SHIP) && c_viewer - && (Ship_info[Ships[obj->instance].ship_info_index].flags2 & SIF2_SHOW_SHIP_MODEL) ) + && (Ship_info[Ships[obj->instance].ship_info_index].flags[Ship::Info_Flags::Show_ship_model]) ) { (*draw_viewer_last) = true; continue; @@ -300,13 +300,13 @@ void obj_render_all(void (*render_function)(object *objp), bool *draw_viewer_las for (os = Sorted_objects.begin(); os != Sorted_objects.end(); ++os) { object *obj = os->obj; - obj->flags |= OF_WAS_RENDERED; + obj->flags.set(Object::Object_Flags::Was_rendered); if ( obj_render_is_model(obj) ) continue; // if we're fullneb, fire up the fog - this also generates a fog table - if((The_mission.flags & MISSION_FLAG_FULLNEB) && (Neb2_render_mode != NEB2_RENDER_NONE) && !Fred_running){ + if((The_mission.flags[Mission::Mission_Flags::Fullneb]) && (Neb2_render_mode != NEB2_RENDER_NONE) && !Fred_running){ // get the fog values neb2_get_adjusted_fog_values(&fog_near, &fog_far, obj); @@ -332,7 +332,7 @@ void obj_render_all(void (*render_function)(object *objp), bool *draw_viewer_las batch_render_man_thrusters(); // if we're fullneb, switch off the fog effet - if((The_mission.flags & MISSION_FLAG_FULLNEB) && (Neb2_render_mode != NEB2_RENDER_NONE)){ + if((The_mission.flags[Mission::Mission_Flags::Fullneb]) && (Neb2_render_mode != NEB2_RENDER_NONE)){ gr_fog_set(GR_FOGMODE_NONE, 0, 0, 0); } @@ -352,14 +352,14 @@ void obj_render_queue_all() scene.init(); for ( i = 0; i <= Highest_object_index; i++,objp++ ) { - if ( (objp->type != OBJ_NONE) && ( objp->flags & OF_RENDERS ) ) { - objp->flags &= ~OF_WAS_RENDERED; + if ( (objp->type != OBJ_NONE) && ( objp->flags [Object::Object_Flags::Renders] ) ) { + objp->flags.remove(Object::Object_Flags::Was_rendered); if ( !obj_in_view_cone(objp) ) { continue; } - if ( (The_mission.flags & MISSION_FLAG_FULLNEB) && (Neb2_render_mode != NEB2_RENDER_NONE) && !Fred_running ) { + if ( (The_mission.flags[Mission::Mission_Flags::Fullneb]) && (Neb2_render_mode != NEB2_RENDER_NONE) && !Fred_running ) { vec3d to_obj; vm_vec_sub( &to_obj, &objp->pos, &Eye_position ); float z = vm_vec_dot( &Eye_matrix.vec.fvec, &to_obj ); @@ -375,7 +375,7 @@ void obj_render_queue_all() } } - objp->flags |= OF_WAS_RENDERED; + objp->flags.set(Object::Object_Flags::Was_rendered); profile_begin("Queue Render"); obj_queue_render(objp, &scene); profile_end("Queue Render"); @@ -426,7 +426,7 @@ void obj_render_queue_all() batch_render_man_thrusters(); // if we're fullneb, switch off the fog effet - if((The_mission.flags & MISSION_FLAG_FULLNEB) && (Neb2_render_mode != NEB2_RENDER_NONE)){ + if((The_mission.flags[Mission::Mission_Flags::Fullneb]) && (Neb2_render_mode != NEB2_RENDER_NONE)){ gr_fog_set(GR_FOGMODE_NONE, 0, 0, 0); } diff --git a/code/object/parseobjectdock.cpp b/code/object/parseobjectdock.cpp index 827d6b281b..b5c459d49f 100644 --- a/code/object/parseobjectdock.cpp +++ b/code/object/parseobjectdock.cpp @@ -170,10 +170,10 @@ void dock_dock_docked_objects(p_object *objp) return; // has this object (by extension, this group of docked objects) been handled already? - if (objp->flags2 & P2_ALREADY_HANDLED) + if (objp->flags[Mission::Parse_Object_Flags::Already_handled]) return; - Assert(objp->flags & P_SF_DOCK_LEADER); + Assert(objp->flags[Mission::Parse_Object_Flags::SF_Dock_leader]); p_dock_function_info dfi; @@ -189,11 +189,11 @@ void dock_dock_docked_objects(p_object *objp) void dock_dock_docked_children_tree(p_object *objp, p_object *parent_objp) { // has this object been handled already? - if (objp->flags2 & P2_ALREADY_HANDLED) + if (objp->flags[Mission::Parse_Object_Flags::Already_handled]) return; // mark as handled - objp->flags2 |= P2_ALREADY_HANDLED; + objp->flags.set(Mission::Parse_Object_Flags::Already_handled); // if parent_objp exists if (parent_objp != NULL) diff --git a/code/object/waypoint.cpp b/code/object/waypoint.cpp index 2bdbe4146b..61054681af 100644 --- a/code/object/waypoint.cpp +++ b/code/object/waypoint.cpp @@ -139,7 +139,9 @@ void waypoint_create_game_object(waypoint *wpt, int list_index, int wpt_index) Assert(wpt != NULL); Assert(list_index >= 0); Assert(wpt_index >= 0); - wpt->objnum = obj_create(OBJ_WAYPOINT, -1, calc_waypoint_instance(list_index, wpt_index), NULL, wpt->get_pos(), 0.0f, OF_RENDERS); + flagset default_flags; + default_flags.set(Object::Object_Flags::Renders); + wpt->objnum = obj_create(OBJ_WAYPOINT, -1, calc_waypoint_instance(list_index, wpt_index), NULL, wpt->get_pos(), 0.0f, default_flags); } // done immediately after mission load; originally found in aicode.cpp diff --git a/code/observer/observer.cpp b/code/observer/observer.cpp index 4c04e7123f..6443b4ea2c 100644 --- a/code/observer/observer.cpp +++ b/code/observer/observer.cpp @@ -46,14 +46,15 @@ int observer_create(matrix *orient, vec3d *pos) } // attempt to create the object - objnum = obj_create(OBJ_OBSERVER,-1,idx,orient,pos,1.0f,0); + flagset default_flagset; + objnum = obj_create(OBJ_OBSERVER,-1,idx,orient,pos,1.0f, default_flagset); // fail situation if(objnum == -1) return -1; // give the observer Descent style physics - Objects[objnum].flags |= OF_PHYSICS; + Objects[objnum].flags.set(Object::Object_Flags::Physics); physics_init(&Objects[objnum].phys_info); pi = &Objects[objnum].phys_info; pi->flags |= PF_ACCELERATES | PF_SLIDE_ENABLED; diff --git a/code/parse/lua.cpp b/code/parse/lua.cpp index 3dda2097ed..8f59306da7 100644 --- a/code/parse/lua.cpp +++ b/code/parse/lua.cpp @@ -6411,9 +6411,9 @@ ADE_FUNC(isInTechroom, l_Shipclass, NULL, "Gets whether or not the ship class is return ade_set_error(L, "b", false); bool b = false; - if(Player != NULL && (Player->flags & PLAYER_FLAGS_IS_MULTI) && (Ship_info[idx].flags & SIF_IN_TECH_DATABASE_M)) { + if(Player != NULL && (Player->flags & PLAYER_FLAGS_IS_MULTI) && (Ship_info[idx].flags[Ship::Info_Flags::In_tech_database_m])) { b = true; - } else if(Ship_info[idx].flags & SIF_IN_TECH_DATABASE) { + } else if(Ship_info[idx].flags[Ship::Info_Flags::In_tech_database]) { b = true; } @@ -6485,7 +6485,7 @@ ADE_FUNC(renderTechModel, l_Shipclass, "X1, Y1, X2, Y2, [Rotation %=0, Pitch %=0 uint render_flags = MR_AUTOCENTER | MR_NO_FOGGING; - if(sip->flags2 & SIF2_NO_LIGHTING) + if(sip->flags[Ship::Info_Flags::No_lighting]) render_flags |= MR_NO_LIGHTING; render_info.set_flags(render_flags); @@ -6558,7 +6558,7 @@ ADE_FUNC(renderTechModel2, l_Shipclass, "X1, Y1, X2, Y2, [orientation Orientatio uint render_flags = MR_AUTOCENTER | MR_NO_FOGGING; - if(sip->flags2 & SIF2_NO_LIGHTING) + if(sip->flags[Ship::Info_Flags::No_lighting]) render_flags |= MR_NO_LIGHTING; render_info.set_flags(render_flags); @@ -7173,13 +7173,10 @@ ADE_VIRTVAR(Linked, l_WeaponBankType, "boolean", "Whether bank is in linked or u { case SWH_PRIMARY: if(ADE_SETTING_VAR && numargs > 1) { - if(newlink) - Ships[bh->objp->instance].flags |= SF_PRIMARY_LINKED; - else - Ships[bh->objp->instance].flags &= ~SF_PRIMARY_LINKED; + Ships[bh->objp->instance].flags.set(Ship::Ship_Flags::Primary_linked, newlink); } - return ade_set_args(L, "b", (Ships[bh->objp->instance].flags & SF_PRIMARY_LINKED) > 0); + return ade_set_args(L, "b", (Ships[bh->objp->instance].flags[Ship::Ship_Flags::Primary_linked])); case SWH_SECONDARY: case SWH_TERTIARY: @@ -7205,13 +7202,10 @@ ADE_VIRTVAR(DualFire, l_WeaponBankType, "boolean", "Whether bank is in dual fire { case SWH_SECONDARY: if(ADE_SETTING_VAR && numargs > 1) { - if(newfire) - Ships[bh->objp->instance].flags |= SF_SECONDARY_DUAL_FIRE; - else - Ships[bh->objp->instance].flags &= ~SF_SECONDARY_DUAL_FIRE; + Ships[bh->objp->instance].flags.set(Ship::Ship_Flags::Secondary_dual_fire, newfire); } - return ade_set_args(L, "b", (Ships[bh->objp->instance].flags & SF_SECONDARY_DUAL_FIRE) > 0); + return ade_set_args(L, "b", (Ships[bh->objp->instance].flags[Ship::Ship_Flags::Secondary_dual_fire])); case SWH_PRIMARY: case SWH_TERTIARY: @@ -9564,12 +9558,12 @@ ADE_VIRTVAR(PrimaryTriggerDown, l_Ship, "boolean", "Determines if primary trigge if(ADE_SETTING_VAR) { if(trig) - shipp->flags |= SF_TRIGGER_DOWN; + shipp->flags.set(Ship::Ship_Flags::Trigger_down); else - shipp->flags &= ~SF_TRIGGER_DOWN; + shipp->flags.remove(Ship::Ship_Flags::Trigger_down); } - if (shipp->flags & SF_TRIGGER_DOWN) + if (shipp->flags[Ship::Ship_Flags::Trigger_down]) return ADE_RETURN_TRUE; else return ADE_RETURN_FALSE; @@ -9817,13 +9811,10 @@ ADE_VIRTVAR(FlagAffectedByGravity, l_Ship, "boolean", "Checks for the \"affected if(ADE_SETTING_VAR) { - if(set) - shipp->flags2 |= SF2_AFFECTED_BY_GRAVITY; - else - shipp->flags2 &= ~SF2_AFFECTED_BY_GRAVITY; + shipp->flags.set(Ship::Ship_Flags::Affected_by_gravity, set); } - if (shipp->flags2 & SF2_AFFECTED_BY_GRAVITY) + if (shipp->flags[Ship::Ship_Flags::Affected_by_gravity]) return ADE_RETURN_TRUE; else return ADE_RETURN_FALSE; @@ -9845,19 +9836,18 @@ ADE_VIRTVAR(Disabled, l_Ship, "boolean", "The disabled state of this ship", "boo if(ADE_SETTING_VAR) { + shipp->flags.set(Ship::Ship_Flags::Disabled, set); if(set) { mission_log_add_entry(LOG_SHIP_DISABLED, shipp->ship_name, NULL ); - shipp->flags |= SF_DISABLED; } else { - shipp->flags &= ~SF_DISABLED; ship_reset_disabled_physics( &Objects[shipp->objnum], shipp->ship_info_index ); } } - if (shipp->flags & SF_DISABLED) + if (shipp->flags[Ship::Ship_Flags::Disabled]) return ADE_RETURN_TRUE; else return ADE_RETURN_FALSE; @@ -9878,17 +9868,10 @@ ADE_VIRTVAR(Stealthed, l_Ship, "boolean", "Stealth status of this ship", "boolea if(ADE_SETTING_VAR) { - if(stealthed) - { - shipp->flags2 &= ~SF2_STEALTH; - } - else - { - shipp->flags2 |= SF2_STEALTH; - } + shipp->flags.set(Ship::Ship_Flags::Stealth, stealthed); } - if (shipp->flags2 & SF2_STEALTH) + if (shipp->flags[Ship::Ship_Flags::Stealth]) return ADE_RETURN_TRUE; else return ADE_RETURN_FALSE; @@ -9909,17 +9892,10 @@ ADE_VIRTVAR(HiddenFromSensors, l_Ship, "boolean", "Hidden from sensors status of if(ADE_SETTING_VAR) { - if(hidden) - { - shipp->flags &= ~SF_HIDDEN_FROM_SENSORS; - } - else - { - shipp->flags |= SF_HIDDEN_FROM_SENSORS; - } + shipp->flags.set(Ship::Ship_Flags::Hidden_from_sensors, hidden); } - if (shipp->flags & SF_HIDDEN_FROM_SENSORS) + if (shipp->flags[Ship::Ship_Flags::Hidden_from_sensors]) return ADE_RETURN_TRUE; else return ADE_RETURN_FALSE; @@ -10081,7 +10057,7 @@ ADE_FUNC(hasShipExploded, l_Ship, NULL, "Checks if the ship explosion event has ship *shipp = &Ships[shiph->objp->instance]; - if (shipp->flags & SF_DYING) { + if (shipp->flags[Ship::Ship_Flags::Dying]) { if (shipp->final_death_time == 0) { return ade_set_args(L, "i", 2); } @@ -10557,7 +10533,7 @@ ADE_FUNC(canWarp, l_Ship, NULL, "Checks whether ship has a working subspace driv return ADE_RETURN_NIL; ship *shipp = &Ships[objh->objp->instance]; - if(shipp->flags & SF2_NO_SUBSPACE_DRIVE){ + if(shipp->flags[Ship::Ship_Flags::No_subspace_drive]){ return ADE_RETURN_FALSE; } @@ -10575,7 +10551,7 @@ ADE_FUNC(isWarpingIn, l_Ship, NULL, "Checks if ship is warping in", "boolean", " return ADE_RETURN_NIL; ship *shipp = &Ships[objh->objp->instance]; - if(shipp->flags & SF_ARRIVING_STAGE_1){ + if(shipp->flags[Ship::Ship_Flags::Arriving_stage_1]){ return ADE_RETURN_TRUE; } diff --git a/code/parse/parselo.cpp b/code/parse/parselo.cpp index d439a3cf26..d4758127eb 100644 --- a/code/parse/parselo.cpp +++ b/code/parse/parselo.cpp @@ -2329,6 +2329,25 @@ int atoi2() } +long atol2() +{ + char ch; + + my_errno = 0; + + ignore_white_space(); + + ch = *Mp; + + if ((ch != '-') && (ch != '+') && ((ch < '0') || (ch > '9'))) { + error_display(1, "Expecting long, found [%.32s].\n", next_tokens()); + my_errno = 1; + return 0; + } + else + return atol(Mp); +} + // Stuff a floating point value pointed at by Mp. // Advances past float characters. void stuff_float(float *f) @@ -2950,7 +2969,7 @@ int stuff_loadout_list (int *ilp, int max_ints, int lookup_type) } // similarly, complain if this is a valid ship or weapon class that the player can't use - if ((lookup_type == MISSION_LOADOUT_SHIP_LIST) && (!(Ship_info[index].flags & SIF_PLAYER_SHIP)) ) { + if ((lookup_type == MISSION_LOADOUT_SHIP_LIST) && (!(Ship_info[index].flags[Ship::Info_Flags::Player_ship])) ) { clean_loadout_list_entry(); Warning(LOCATION, "Ship type \"%s\" found in loadout of mission file. This class is not marked as a player ship...skipping", str); continue; diff --git a/code/parse/parselo.h b/code/parse/parselo.h index 5229599c92..b66b84c4b6 100644 --- a/code/parse/parselo.h +++ b/code/parse/parselo.h @@ -142,6 +142,63 @@ extern void stuff_ubyte(ubyte *i); extern int stuff_string_list(SCP_vector& slp); extern int stuff_string_list(char slp[][NAME_LENGTH], int max_strings); extern int parse_string_flag_list(int *dest, flag_def_list defs[], int defs_size); + + +// A templated version of parse_string_flag_list, to go along with the templated flag_def_list_new. +// If the "is_special" flag is set, or a string was not found in the def list, it will be added to the unparsed_or_special_strings Vector +// so that you can process it properly later +template +int parse_string_flag_list(Flagset *dest, flag_def_list_new defs[], size_t n_defs, SCP_vector* unparsed_or_special_strings) +{ + + Assert(dest != NULL); + + char(*slp)[NAME_LENGTH] = (char(*)[32])new char[n_defs*NAME_LENGTH]; + size_t num_strings = stuff_string_list(slp, n_defs); + size_t i, j; + + for (i = 0; i < num_strings; i++) + { + bool string_parsed = false; + for (j = 0; j < n_defs; j++) + { + if (!stricmp(slp[i], defs[j].name)) { + if (defs[j].def != Flags::NUM_VALUES) + dest->set(defs[j].def); + + if (!defs[j].is_special) + string_parsed = true; + } + } + if (!string_parsed && unparsed_or_special_strings != NULL) { + SCP_string s = SCP_string(slp[i]); + unparsed_or_special_strings->push_back(s); + } + } + + delete[] slp; //>_> + //nobody saw that right + + return num_strings; +} + +extern long atol2(); +extern int my_errno; +template +void stuff_flagset(Flagset *dest) { + dest->from_long(atol2()); + + if (my_errno) + skip_token(); + else + Mp += strspn(Mp, "+-0123456789"); + + if (*Mp == ',') + Mp++; + + diag_printf("Stuffed flagset: %i\n", dest->to_long()); +} + extern int stuff_int_list(int *ilp, int max_ints, int lookup_type = RAW_INTEGER_TYPE); extern size_t stuff_float_list(float* flp, size_t max_floats); extern int stuff_vec3d_list(vec3d *vlp, int max_vecs); diff --git a/code/parse/scripting.cpp b/code/parse/scripting.cpp index 8c9f7f0ac0..3e70b36d9f 100644 --- a/code/parse/scripting.cpp +++ b/code/parse/scripting.cpp @@ -343,7 +343,7 @@ bool ConditionedHook::ConditionsValid(int action, object *objp, int more_data) if (!(primary || secondary)) return false; - if ((shipp->flags & SF_PRIMARY_LINKED) && primary && (Weapon_info[shipp->weapons.primary_bank_weapons[shipp->weapons.current_primary_bank]].wi_flags3 & WIF3_NOLINK)) + if ((shipp->flags[Ship::Ship_Flags::Primary_linked]) && primary && (Weapon_info[shipp->weapons.primary_bank_weapons[shipp->weapons.current_primary_bank]].wi_flags3 & WIF3_NOLINK)) return false; break; @@ -353,7 +353,7 @@ bool ConditionedHook::ConditionsValid(int action, object *objp, int more_data) secondary = stricmp(Weapon_info[shipp->weapons.secondary_bank_weapons[shipp->weapons.current_secondary_bank]].name, scp->data.name) == 0; prev_secondary = stricmp(Weapon_info[shipp->weapons.secondary_bank_weapons[shipp->weapons.previous_secondary_bank]].name, scp->data.name) == 0; - if ((shipp->flags & SF_PRIMARY_LINKED) && prev_primary && (Weapon_info[shipp->weapons.primary_bank_weapons[shipp->weapons.previous_primary_bank]].wi_flags3 & WIF3_NOLINK)) + if ((shipp->flags[Ship::Ship_Flags::Primary_linked]) && prev_primary && (Weapon_info[shipp->weapons.primary_bank_weapons[shipp->weapons.previous_primary_bank]].wi_flags3 & WIF3_NOLINK)) return true; if ( !prev_secondary && ! secondary && !prev_primary && !primary ) @@ -408,7 +408,7 @@ bool ConditionedHook::ConditionsValid(int action, object *objp, int more_data) secondary = stricmp(Weapon_info[shipp->weapons.secondary_bank_weapons[shipp->weapons.current_secondary_bank]].name, scp->data.name) == 0; } - if ((shipp->flags & SF_PRIMARY_LINKED) && primary && (Weapon_info[shipp->weapons.primary_bank_weapons[shipp->weapons.current_primary_bank]].wi_flags3 & WIF3_NOLINK)) + if ((shipp->flags[Ship::Ship_Flags::Primary_linked]) && primary && (Weapon_info[shipp->weapons.primary_bank_weapons[shipp->weapons.current_primary_bank]].wi_flags3 & WIF3_NOLINK)) return false; return more_data == 1 ? primary : secondary; diff --git a/code/parse/sexp.cpp b/code/parse/sexp.cpp index 1842aa616f..afa8531510 100755 --- a/code/parse/sexp.cpp +++ b/code/parse/sexp.cpp @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include "ai/aigoals.h" #include "asteroid/asteroid.h" @@ -88,6 +88,7 @@ #include "ship/awacs.h" #include "ship/ship.h" #include "ship/shiphit.h" +#include "ship/ship_flags.h" #include "sound/audiostr.h" #include "sound/ds.h" #include "sound/sound.h" @@ -494,8 +495,8 @@ sexp_oper Operators[] = { { "turret-set-rate-of-fire", OP_TURRET_SET_RATE_OF_FIRE, 3, INT_MAX, SEXP_ACTION_OPERATOR, }, //FUBAR { "turret-set-optimum-range", OP_TURRET_SET_OPTIMUM_RANGE, 3, INT_MAX, SEXP_ACTION_OPERATOR, }, //FUBAR { "turret-set-target-priorities", OP_TURRET_SET_TARGET_PRIORITIES, 3, INT_MAX, SEXP_ACTION_OPERATOR, }, //FUBAR - { "turret-set-target-order", OP_TURRET_SET_TARGET_ORDER, 2, 2+NUM_TURRET_ORDER_TYPES, SEXP_ACTION_OPERATOR, }, //WMC - { "ship-turret-target-order", OP_SHIP_TURRET_TARGET_ORDER, 1, 1+NUM_TURRET_ORDER_TYPES, SEXP_ACTION_OPERATOR, }, //WMC + { "turret-set-target-order", OP_TURRET_SET_TARGET_ORDER, 2, 2+ NUM_TURRET_ORDER_TYPES, SEXP_ACTION_OPERATOR, }, //WMC + { "ship-turret-target-order", OP_SHIP_TURRET_TARGET_ORDER, 1, 1+ NUM_TURRET_ORDER_TYPES, SEXP_ACTION_OPERATOR, }, //WMC { "turret-subsys-target-disable", OP_TURRET_SUBSYS_TARGET_DISABLE, 2, INT_MAX, SEXP_ACTION_OPERATOR, }, { "turret-subsys-target-enable", OP_TURRET_SUBSYS_TARGET_ENABLE, 2, INT_MAX, SEXP_ACTION_OPERATOR, }, { "turret-set-primary-ammo", OP_TURRET_SET_PRIMARY_AMMO, 4, 4, SEXP_ACTION_OPERATOR, }, // DahBlount @@ -2340,20 +2341,20 @@ int check_sexp_syntax(int node, int return_type, int recursive, int *bad_node, i if (!stricmp(CTEXT(node), "")) break; - i = -1; - for ( auto it = Ship_info.cbegin(); it != Ship_info.cend(); ++it ) { - if ( !stricmp(CTEXT(node), it->name) ) - { - if (it->flags & SIF_SUPPORT) - { - i = std::distance(Ship_info.cbegin(), it); - break; - } - } - } + i = -1; + for (auto it = Ship_info.cbegin(); it != Ship_info.cend(); ++it) { + if (!stricmp(CTEXT(node), it->name)) + { + if (it->flags[Ship::Info_Flags::Support]) + { + i = std::distance(Ship_info.cbegin(), it); + break; + } + } + } - if ( i == -1 ) - return SEXP_CHECK_INVALID_SUPPORT_SHIP_CLASS; + if (i == -1) + return SEXP_CHECK_INVALID_SUPPORT_SHIP_CLASS; break; @@ -4359,7 +4360,7 @@ int rand_sexp(int n, bool multiple) // need to keep. int sexp_or(int n) { - int all_false, result; + int all_false, result; all_false = 1; result = 0; @@ -5617,7 +5618,7 @@ int sexp_special_warp_dist( int n) object *ship_objp = &Objects[Ships[shipnum].objnum]; object *warp_objp = &Objects[Ships[shipnum].special_warpout_objnum]; if (warp_objp->type == OBJ_SHIP) { - if (Ship_info[Ships[warp_objp->instance].ship_info_index].flags & SIF_KNOSSOS_DEVICE) { + if (Ship_info[Ships[warp_objp->instance].ship_info_index].flags[Ship::Info_Flags::Knossos_device]) { valid = TRUE; } } @@ -6040,7 +6041,7 @@ int sexp_is_ship_stealthy(int n) return SEXP_NAN; } - if (Ships[shipnum].flags2 & SF2_STEALTH) + if (Ships[shipnum].flags[Ship::Ship_Flags::Stealth]) return SEXP_TRUE; else return SEXP_FALSE; @@ -6066,7 +6067,7 @@ int sexp_is_friendly_stealth_visible(int n) return SEXP_NAN; } - if (Ships[shipnum].flags2 & SF2_FRIENDLY_STEALTH_INVIS) + if (Ships[shipnum].flags[Ship::Ship_Flags::Friendly_stealth_invis]) return SEXP_FALSE; else return SEXP_TRUE; @@ -6915,7 +6916,7 @@ void set_object_for_clients(object *objp) } // Tell the player (if this is a client) that they've moved. - if ((objp->flags & OF_PLAYER_SHIP) && (objp != Player_obj) ){ + if ((objp->flags[Object::Object_Flags::Player_ship]) && (objp != Player_obj) ){ multi_oo_send_changed_object(objp); } } @@ -6951,7 +6952,7 @@ void sexp_set_object_position(int n) extern neb2_detail *Nd; if ( (oswpt.objp == Player_obj) - && (The_mission.flags & MISSION_FLAG_FULLNEB) + && (The_mission.flags[Mission::Mission_Flags::Fullneb]) && (vm_vec_dist(&oswpt.objp->pos, &target_vec) >= Nd->cube_inner) ) { neb2_eye_changed(); @@ -7395,7 +7396,7 @@ int sexp_num_players() count = 0; for ( objp = GET_FIRST(&obj_used_list); objp != END_OF_LIST(&obj_used_list); objp = GET_NEXT(objp) ) { - if ( (objp->type == OBJ_SHIP) && (objp->flags & OF_PLAYER_SHIP) ) + if ( (objp->type == OBJ_SHIP) && (objp->flags[Object::Object_Flags::Player_ship]) ) count++; } @@ -7831,7 +7832,7 @@ int sexp_is_cargo_known( int n, int check_delay ) // and we've already checked exited if ( ship_num != -1 ) { - if ( Ships[ship_num].flags & SF_CARGO_REVEALED ) + if ( Ships[ship_num].flags[Ship::Ship_Flags::Cargo_revealed] ) { time_known = Missiontime - Ships[ship_num].time_cargo_revealed; if ( f2i(time_known) >= delay ) @@ -10079,12 +10080,7 @@ void sexp_allow_treason (int n) { n = CDR(n); if (n != -1) { - if ( is_sexp_true(n) ) { - The_mission.flags |= MISSION_FLAG_NO_TRAITOR; - } - else { - The_mission.flags &= ~MISSION_FLAG_NO_TRAITOR; - } + The_mission.flags.set(Mission::Mission_Flags::No_traitor, is_sexp_true(n) != 0); } } @@ -10627,7 +10623,7 @@ void sexp_set_explosion_option(int node) shipp->special_exp_deathroll_time = val; // hmm, it would be cool to modify the explosion in progress - if (shipp->flags & SF_DYING && val >= 2) { + if (shipp->flags[Ship::Ship_Flags::Dying] && val >= 2) { shipp->final_death_time = timestamp(val); } } @@ -10792,7 +10788,7 @@ void sexp_explosion_effect(int n) // don't blast navbuoys if ( objp->type == OBJ_SHIP ) { - if ( ship_get_SIF(objp->instance) & SIF_NAVBUOY ) + if ( ship_get_SIF(objp->instance)[Ship::Info_Flags::Navbuoy] ) { continue; } @@ -11186,7 +11182,7 @@ void sexp_end_campaign(int n) } // if the player is dead we may want to let the death screen handle things - if (!ignore_player_mortality && (Player_ship->flags & SF_DYING)) { + if (!ignore_player_mortality && (Player_ship->flags[Ship::Ship_Flags::Dying])) { return; } @@ -11825,7 +11821,7 @@ void sexp_transfer_cargo(int n) // transfer cargo from ship1 to ship2 #ifndef NDEBUG // Don't give warning for large ships (cruiser on up) - if (! (Ship_info[Ships[shipnum2].ship_info_index].flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP)) ) { + if (! (Ship_info[Ships[shipnum2].ship_info_index].is_big_or_huge()) ) { if ( stricmp(Cargo_names[Ships[shipnum2].cargo1 & CARGO_INDEX_MASK], "nothing") ) { Warning(LOCATION, "Transferring cargo to %s which already\nhas cargo %s.\nCargo will be replaced", Ships[shipnum2].ship_name, Cargo_names[Ships[shipnum2].cargo1 & CARGO_INDEX_MASK] ); } @@ -12010,7 +12006,7 @@ void sexp_cargo_no_deplete(int n) return; } - if ( !(Ship_info[Ships[ship_index].ship_info_index].flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP)) ) { + if ( !(Ship_info[Ships[ship_index].ship_info_index].is_big_or_huge()) ) { Warning(LOCATION, "Trying to make non BIG or HUGE ship %s with non-depletable cargo.\n", Ships[ship_index].ship_name); return; } @@ -12065,15 +12061,15 @@ extern void game_stop_subspace_ambient_sound(); void sexp_mission_set_subspace(int n) { - if (eval_num(n) > 0) { - The_mission.flags |= MISSION_FLAG_SUBSPACE; + if (eval_num(n) > 0) { Game_subspace_effect = 1; game_start_subspace_ambient_sound(); } else { - The_mission.flags &= ~MISSION_FLAG_SUBSPACE; - Game_subspace_effect = 0; + Game_subspace_effect = 0; game_stop_subspace_ambient_sound(); } + + The_mission.flags.set(Mission::Mission_Flags::Subspace, Game_subspace_effect != 0); } void sexp_add_background_bitmap(int n) @@ -12269,7 +12265,7 @@ void sexp_remove_sun_bitmap(int n) void sexp_nebula_change_storm(int n) { - if (!(The_mission.flags & MISSION_FLAG_FULLNEB)) return; + if (!(The_mission.flags[Mission::Mission_Flags::Fullneb])) return; nebl_set_storm(CTEXT(n)); } @@ -12298,7 +12294,7 @@ void sexp_nebula_toggle_poof(int n) void sexp_nebula_change_pattern(int n) { - if (!(The_mission.flags & MISSION_FLAG_FULLNEB)) return; + if (!(The_mission.flags[Mission::Mission_Flags::Fullneb])) return; strcpy_s(Neb2_texture_name,(CTEXT(n))); @@ -12330,17 +12326,13 @@ void sexp_end_mission(int n) } // if the player is dead we may want to let the death screen handle things - if (!ignore_player_mortality && (Player_ship->flags & SF_DYING)) { + if (!ignore_player_mortality && (Player_ship->flags[Ship::Ship_Flags::Dying])) { return; } // ending via debrief and then going to mainhall could maybe work with multiplayer? - if (from_debrief_to_main_hall) { - The_mission.flags |= MISSION_FLAG_END_TO_MAINHALL; - } else { - The_mission.flags &= ~MISSION_FLAG_END_TO_MAINHALL; - } - + The_mission.flags.set(Mission::Mission_Flags::End_to_mainhall, from_debrief_to_main_hall != 0); + // if we go straight to the main hall we have to clean up the mission without entering the debriefing if (boot_to_main_hall && !(Game_mode & GM_MULTIPLAYER)) { gameseq_post_event(GS_EVENT_END_GAME); @@ -12359,10 +12351,7 @@ void sexp_end_mission(int n) // Goober5000 void sexp_set_debriefing_toggled(int node) { - if (is_sexp_true(node)) - The_mission.flags |= MISSION_FLAG_TOGGLE_DEBRIEFING; - else - The_mission.flags &= ~MISSION_FLAG_TOGGLE_DEBRIEFING; + The_mission.flags.set(Mission::Mission_Flags::Toggle_debriefing, is_sexp_true(node) != 0); } /** @@ -12515,8 +12504,8 @@ void sexp_tech_add_ship(int node) while (node >= 0) { name = CTEXT(node); i = ship_info_lookup(name); - if (i >= 0) - Ship_info[i].flags |= SIF_IN_TECH_DATABASE; + if (i >= 0) + Ship_info[i].flags.set(Ship::Info_Flags::In_tech_database); else Warning(LOCATION, "In tech-add-ship, ship class \"%s\" invalid", name); @@ -12654,10 +12643,11 @@ void sexp_allow_weapon(int n) /** * generic function for all those sexps that set flags + * For all flag type parameters: If a particular flag should not be set, use the ::NUM_VALUES member of that enum * * @note this function has a similar purpose to sexp_alter_ship_flag_helper; make sure you check/update both */ -void sexp_deal_with_ship_flag(int node, bool process_subsequent_nodes, int object_flag, int object_flag2, int ship_flag, int ship_flag2, int p_object_flag, int p_object_flag2, bool set_it, bool send_multiplayer = false, bool include_players_in_ship_lookup = false) +void sexp_deal_with_ship_flag(int node, bool process_subsequent_nodes, Object::Object_Flags object_flag, Ship::Ship_Flags ship_flag, Mission::Parse_Object_Flags p_object_flag, bool set_it, bool send_multiplayer = false, bool include_players_in_ship_lookup = false) { char *ship_name; int ship_index; @@ -12665,15 +12655,9 @@ void sexp_deal_with_ship_flag(int node, bool process_subsequent_nodes, int objec if (send_multiplayer && MULTIPLAYER_MASTER) { multi_start_callback(); - multi_send_int(object_flag); - /* Uncommenting this will break compatibility with earlier builds but it is pointless to send it until object_flag2 - is actually used by the engine - */ - // multi_send_int(object_flag2); - multi_send_int(ship_flag); - multi_send_int(ship_flag2); - multi_send_int(p_object_flag); - multi_send_int(p_object_flag2); + multi_send_int((int)object_flag); + multi_send_int((int)ship_flag); + multi_send_int((int)p_object_flag); multi_send_bool(set_it); } @@ -12696,61 +12680,33 @@ void sexp_deal_with_ship_flag(int node, bool process_subsequent_nodes, int objec if (ship_index >= 0) { // save flags for state change comparisons - int object_flag_orig = Objects[Ships[ship_index].objnum].flags; + auto object_flag_orig = Objects[Ships[ship_index].objnum].flags; - // see if we have an object flag to set - if (object_flag) - { - // set or clear? - if (set_it) - Objects[Ships[ship_index].objnum].flags |= object_flag; - else - Objects[Ships[ship_index].objnum].flags &= ~object_flag; - } + // see if we have an object flag to set + if (object_flag != Object::Object_Flags::NUM_VALUES) + { + // set or clear? + Objects[Ships[ship_index].objnum].flags.set((Object::Object_Flags)object_flag, set_it); + } // handle ETS when modifying shields - if (object_flag == OF_NO_SHIELDS) { + if (object_flag == Object::Object_Flags::No_shields) { if (set_it) { zero_one_ets(&Ships[ship_index].shield_recharge_index, &Ships[ship_index].weapon_recharge_index, &Ships[ship_index].engine_recharge_index); - } else if (object_flag_orig & OF_NO_SHIELDS) { + } else if (object_flag_orig[Object::Object_Flags::No_shields]) { set_default_recharge_rates(&Objects[Ships[ship_index].objnum]); } } - // see if we have an object flag2 to set - if (object_flag2) - { -/* - // set or clear? - if (set_it) - Objects[Ships[ship_index].objnum].flags2 |= object_flag2; - else - Objects[Ships[ship_index].objnum].flags2 &= ~object_flag2; -*/ - } - // see if we have a ship flag to set - if (ship_flag) + if (ship_flag != Ship::Ship_Flags::NUM_VALUES) { // set or clear? - if (set_it) - Ships[ship_index].flags |= ship_flag; - else - Ships[ship_index].flags &= ~ship_flag; - } - - // see if we have a ship flag2 to set - if (ship_flag2) - { - // set or clear? - if (set_it) - Ships[ship_index].flags2 |= ship_flag2; - else - Ships[ship_index].flags2 &= ~ship_flag2; + Ships[ship_index].flags.set((Ship::Ship_Flags)ship_flag, set_it); } // the lock afterburner SEXP also needs to set a physics flag - if (ship_flag2 == SF2_AFTERBURNER_LOCKED) { + if (ship_flag == Ship::Ship_Flags::Afterburner_locked) { if (set_it) { afterburners_stop(&Objects[Ships[ship_index].objnum], 1); } @@ -12773,23 +12729,10 @@ void sexp_deal_with_ship_flag(int node, bool process_subsequent_nodes, int objec } // see if we have a p_object flag to set - if (p_object_flag) + if (p_object_flag != Mission::Parse_Object_Flags::NUM_VALUES) { // set or clear? - if (set_it) - p_objp->flags |= p_object_flag; - else - p_objp->flags &= ~p_object_flag; - } - - // see if we have a p_object flag2 to set - if (p_object_flag2) - { - // set or clear? - if (set_it) - p_objp->flags2 |= p_object_flag2; - else - p_objp->flags2 &= ~p_object_flag2; + p_objp->flags.set((Mission::Parse_Object_Flags)p_object_flag, set_it); } if (send_multiplayer && MULTIPLAYER_MASTER) { @@ -12806,23 +12749,17 @@ void sexp_deal_with_ship_flag(int node, bool process_subsequent_nodes, int objec void multi_sexp_deal_with_ship_flag() { - int object_flag = 0; - // int object_flag2 = 0; - int ship_flag = 0; - int ship_flag2 = 0; - int p_object_flag = 0; - int p_object_flag2 = 0; + int object_flag = (int)Object::Object_Flags::NUM_VALUES; + int ship_flag = (int)Ship::Ship_Flags::NUM_VALUES; + int p_object_flag = (int)Mission::Parse_Object_Flags::NUM_VALUES; bool set_it = false; bool ship_arrived = true; ship *shipp = NULL; p_object *pobjp = NULL; multi_get_int(object_flag); - // multi_get_int(object_flag2); multi_get_int(ship_flag); - multi_get_int(ship_flag2); multi_get_int(p_object_flag); - multi_get_int(p_object_flag2); multi_get_bool(set_it); // if any of the above failed so will this loop @@ -12837,54 +12774,44 @@ void multi_sexp_deal_with_ship_flag() } // save flags for state change comparisons - int object_flag_orig = Objects[shipp->objnum].flags; + auto object_flag_orig = Objects[shipp->objnum].flags; - if (set_it) { - Objects[shipp->objnum].flags |= object_flag; - // Objects[shipp->objnum].flags2 |= object_flag2; - shipp->flags |= ship_flag; - shipp->flags2 |= ship_flag2; - } - else { - Objects[shipp->objnum].flags &= ~object_flag; - // Objects[shipp->objnum].flags2 &= ~object_flag2; - shipp->flags &= ~ship_flag; - shipp->flags2 &= ~ship_flag2; - } + Objects[shipp->objnum].flags.set((Object::Object_Flags)object_flag, set_it); + shipp->flags.set((Ship::Ship_Flags)ship_flag, set_it); // deal with side effects of these flags - if (object_flag == OF_NO_SHIELDS) { + if (object_flag == (int)Object::Object_Flags::No_shields) { if (set_it) { zero_one_ets(&shipp->shield_recharge_index, &shipp->weapon_recharge_index, &shipp->engine_recharge_index); - } else if (object_flag_orig & OF_NO_SHIELDS) { + } else if (object_flag_orig[Object::Object_Flags::No_shields]) { set_default_recharge_rates(&Objects[shipp->objnum]); } } - if (ship_flag2 == SF2_AFTERBURNER_LOCKED) { + if (ship_flag == (int)Ship::Ship_Flags::Afterburner_locked) { if (set_it) { afterburners_stop(&Objects[shipp->objnum], 1); } } - if ((ship_flag2 == SF2_STEALTH) && !set_it) { - if (shipp->flags & SF_ESCORT) { + if ((ship_flag == (int)Ship::Ship_Flags::Stealth) && !set_it) { + if (shipp->flags[Ship::Ship_Flags::Escort]) { hud_add_ship_to_escort(shipp->objnum, 1); } } - if ((ship_flag2 == SF2_FRIENDLY_STEALTH_INVIS) && !set_it && (shipp->flags2 & SF2_STEALTH) && (shipp->team == Player_ship->team)) { - if (shipp->flags & SF_ESCORT) { + if ((ship_flag == (int)Ship::Ship_Flags::Friendly_stealth_invis) && !set_it && (shipp->flags[Ship::Ship_Flags::Stealth]) && (shipp->team == Player_ship->team)) { + if (shipp->flags[Ship::Ship_Flags::Escort]) { hud_add_ship_to_escort(shipp->objnum, 1); } } - if (ship_flag == SF_HIDDEN_FROM_SENSORS) { + if (ship_flag == (int)Ship::Ship_Flags::Hidden_from_sensors) { if (set_it) { if (Player_ai->target_objnum == shipp->objnum) { hud_cease_targeting(); } } else { - if (shipp->flags & SF_ESCORT) { + if (shipp->flags[Ship::Ship_Flags::Escort]) { hud_add_ship_to_escort(shipp->objnum, 1); } } @@ -12893,14 +12820,7 @@ void multi_sexp_deal_with_ship_flag() else { multi_get_parse_object(pobjp); if (pobjp != NULL) { - if (set_it) { - pobjp->flags |= p_object_flag; - pobjp->flags2 |= p_object_flag2; - } - else { - pobjp->flags &= ~p_object_flag; - pobjp->flags2 &= ~p_object_flag2; - } + pobjp->flags.set((Mission::Parse_Object_Flags)p_object_flag, set_it); } } } @@ -12911,9 +12831,10 @@ void multi_sexp_deal_with_ship_flag() * * @note this function has a similar purpose to sexp_deal_with_ship_flag; make sure you check/update both */ -void sexp_alter_ship_flag_helper(object_ship_wing_point_team &oswpt, bool future_ships, int object_flag, int object_flag2, int ship_flag, int ship_flag2, int parse_obj_flag, int parse_obj_flag2, int ai_flag, int ai_flag2, bool set_flag) +void sexp_alter_ship_flag_helper(object_ship_wing_point_team &oswpt, bool future_ships, int object_flag, int ship_flag, int parse_obj_flag, int ai_flag, int ai_flag2, bool set_flag) { - int i, object_flag_orig; + int i; + flagset object_flag_orig; ship_obj *so; object_ship_wing_point_team oswpt2; p_object *p_objp; @@ -12932,7 +12853,7 @@ void sexp_alter_ship_flag_helper(object_ship_wing_point_team &oswpt, bool future object_ship_wing_point_team_set_ship(&oswpt2, so, future_ships); // recurse - sexp_alter_ship_flag_helper(oswpt2, future_ships, object_flag, object_flag2, ship_flag, ship_flag2, parse_obj_flag, parse_obj_flag2, ai_flag, ai_flag2, set_flag); + sexp_alter_ship_flag_helper(oswpt2, future_ships, object_flag, ship_flag, parse_obj_flag, ai_flag, ai_flag2, set_flag); } } @@ -12941,7 +12862,7 @@ void sexp_alter_ship_flag_helper(object_ship_wing_point_team &oswpt, bool future if (p_objp->team == oswpt.team) { oswpt2.p_objp = p_objp; oswpt2.type = OSWPT_TYPE_PARSE_OBJECT; - sexp_alter_ship_flag_helper(oswpt2, future_ships, object_flag, object_flag2, ship_flag, ship_flag2, parse_obj_flag, parse_obj_flag2, ai_flag, ai_flag2, set_flag); + sexp_alter_ship_flag_helper(oswpt2, future_ships, object_flag, ship_flag, parse_obj_flag, ai_flag, ai_flag2, set_flag); } } } @@ -12960,14 +12881,14 @@ void sexp_alter_ship_flag_helper(object_ship_wing_point_team &oswpt, bool future if (p_objp->wingnum == WING_INDEX(oswpt.wingp)) { oswpt2.p_objp = p_objp; oswpt2.type = OSWPT_TYPE_PARSE_OBJECT; - sexp_alter_ship_flag_helper(oswpt2, future_ships, object_flag, object_flag2, ship_flag, ship_flag2, parse_obj_flag, parse_obj_flag2, ai_flag, ai_flag2, set_flag); + sexp_alter_ship_flag_helper(oswpt2, future_ships, object_flag, ship_flag, parse_obj_flag, ai_flag, ai_flag2, set_flag); } } } for (i = 0; i < oswpt.wingp->current_count; i++) { object_ship_wing_point_team_set_ship(&oswpt2, &Ships[oswpt.wingp->ship_index[i]], future_ships); - sexp_alter_ship_flag_helper(oswpt2, future_ships, object_flag, object_flag2, ship_flag, ship_flag2, parse_obj_flag, parse_obj_flag2, ai_flag, ai_flag2, set_flag); + sexp_alter_ship_flag_helper(oswpt2, future_ships, object_flag, ship_flag, parse_obj_flag, ai_flag, ai_flag2, set_flag); } break; @@ -12978,52 +12899,33 @@ void sexp_alter_ship_flag_helper(object_ship_wing_point_team &oswpt, bool future object_flag_orig = oswpt.objp->flags; // see if we have an object flag to set - if (object_flag) + if (object_flag != (int)Object::Object_Flags::NUM_VALUES) { + auto tmp_flagset = oswpt.objp->flags; // set or clear? - if (set_flag) - obj_set_flags(oswpt.objp, oswpt.objp->flags | object_flag); - else - obj_set_flags(oswpt.objp, oswpt.objp->flags & ~object_flag); + tmp_flagset.set((Object::Object_Flags)object_flag, set_flag); + + obj_set_flags(oswpt.objp, tmp_flagset); } // handle ETS when modifying shields - if (object_flag == OF_NO_SHIELDS) { + if (object_flag == (int)Object::Object_Flags::No_shields) { if (set_flag) { zero_one_ets(&oswpt.shipp->shield_recharge_index, &oswpt.shipp->weapon_recharge_index, &oswpt.shipp->engine_recharge_index); - } else if (object_flag_orig & OF_NO_SHIELDS) { + } else if (object_flag_orig[Object::Object_Flags::No_shields]) { set_default_recharge_rates(oswpt.objp); } } - // see if we have an object flag2 to set - if (object_flag2) - { - // Add code here when have flag2 settings - } - // see if we have a ship flag to set - if (ship_flag) + if (ship_flag != (int)Ship::Ship_Flags::NUM_VALUES) { // set or clear? - if (set_flag) - oswpt.shipp->flags |= ship_flag; - else - oswpt.shipp->flags &= ~ship_flag; + oswpt.shipp->flags.set((Ship::Ship_Flags)ship_flag, set_flag); } - - // see if we have a ship flag2 to set - if (ship_flag2) - { - // set or clear? - if (set_flag) - oswpt.shipp->flags2 |= ship_flag2; - else - oswpt.shipp->flags2 &= ~ship_flag2; - } - + // the lock afterburner SEXP also needs to set a physics flag - if (ship_flag2 == SF2_AFTERBURNER_LOCKED) { + if (ship_flag == (int)Ship::Ship_Flags::Afterburner_locked) { if (set_flag) { afterburners_stop(oswpt.objp, 1); } @@ -13055,30 +12957,14 @@ void sexp_alter_ship_flag_helper(object_ship_wing_point_team &oswpt, bool future // see if we have a p_object flag to set if (parse_obj_flag && oswpt.p_objp != NULL) { - // set or clear? - if (set_flag) - oswpt.p_objp->flags |= parse_obj_flag; - else - oswpt.p_objp->flags &= ~parse_obj_flag; - } - - // see if we have a p_object flag2 to set - if (parse_obj_flag2 && oswpt.p_objp != NULL) - { - // set or clear? - if (set_flag) - oswpt.p_objp->flags2 |= parse_obj_flag2; - else - oswpt.p_objp->flags2 &= ~parse_obj_flag2; + oswpt.p_objp->flags.set((Mission::Parse_Object_Flags)parse_obj_flag, set_flag); } break; - - } } -void alter_flag_for_all_ships(bool future_ships, int object_flag, int object_flag2, int ship_flag, int ship_flag2, int parse_obj_flag, int parse_obj_flag2, int ai_flag, int ai_flag2, bool set_flag) +void alter_flag_for_all_ships(bool future_ships, int object_flag, int ship_flag, int parse_obj_flag, int ai_flag, int ai_flag2, bool set_flag) { ship_obj *so; p_object *p_objp; @@ -13088,7 +12974,7 @@ void alter_flag_for_all_ships(bool future_ships, int object_flag, int object_fla for ( so = GET_FIRST(&Ship_obj_list); so != END_OF_LIST(&Ship_obj_list); so = GET_NEXT(so) ) { object_ship_wing_point_team_set_ship(&oswpt, so, future_ships); - sexp_alter_ship_flag_helper(oswpt, future_ships, object_flag, object_flag2, ship_flag, ship_flag2, parse_obj_flag, parse_obj_flag2, ai_flag, ai_flag2, set_flag); + sexp_alter_ship_flag_helper(oswpt, future_ships, object_flag, ship_flag, parse_obj_flag, ai_flag, ai_flag2, set_flag); } // set up all the ships which have yet to arrive @@ -13098,12 +12984,12 @@ void alter_flag_for_all_ships(bool future_ships, int object_flag, int object_fla { oswpt.p_objp = p_objp; oswpt.type = OSWPT_TYPE_PARSE_OBJECT; - sexp_alter_ship_flag_helper(oswpt, future_ships, object_flag, object_flag2, ship_flag, ship_flag2, parse_obj_flag, parse_obj_flag2, ai_flag, ai_flag2, set_flag); + sexp_alter_ship_flag_helper(oswpt, future_ships, object_flag, ship_flag, parse_obj_flag, ai_flag, ai_flag2, set_flag); } } } -bool sexp_check_flag_arrays(char *flag_name, int &object_flag, int &object_flag2, int &ship_flags, int &ship_flags2, int &parse_obj_flag, int &parse_obj_flag2, int &ai_flag, int &ai_flag2) +bool sexp_check_flag_arrays(char *flag_name, Object::Object_Flags &object_flag, Ship::Ship_Flags &ship_flags, Mission::Parse_Object_Flags &parse_obj_flag, int &ai_flag, int &ai_flag2) { int i; bool send_multi = false; @@ -13114,9 +13000,6 @@ bool sexp_check_flag_arrays(char *flag_name, int &object_flag, int &object_flag2 if (Object_flag_names[i].flag_list == 1) { object_flag = Object_flag_names[i].flag; } - else if (Object_flag_names[i].flag_list == 2) { - object_flag2 = Object_flag_names[i].flag; - } break; } } @@ -13124,32 +13007,19 @@ bool sexp_check_flag_arrays(char *flag_name, int &object_flag, int &object_flag2 for ( i = 0; i < MAX_SHIP_FLAG_NAMES; i++) { if (!stricmp(Ship_flag_names[i].flag_name, flag_name)) { // make sure the list writes to the correct list of flags! - if (Ship_flag_names[i].flag_list == 1) { - ship_flags = Ship_flag_names[i].flag; - } - else if (Ship_flag_names[i].flag_list == 2) { - ship_flags2 = Ship_flag_names[i].flag; - // only ship flags2 and above need to be sent the game handles the first set of flags elsewhere - send_multi = true; - } + ship_flags = Ship_flag_names[i].flag; + send_multi = true; break; } } - // parse files already have a list of names in the same order as the flags, so we can do something slightly different here. - for ( i = 0; i < MAX_PARSE_OBJECT_FLAGS; i++) { - if (!stricmp(Parse_object_flags[i], flag_name)) { - parse_obj_flag = (1 << i); - break; - } - } - - for ( i = 0; i < MAX_PARSE_OBJECT_FLAGS_2; i++) { - if (!stricmp(Parse_object_flags_2[i], flag_name)) { - parse_obj_flag2 = (1 << i); - break; - } - } + // parse files already have a list of names in the same order as the flags, so we can do something slightly different here. + for (i = 0; i < (int)num_parse_object_flags; i++) { + if (!stricmp(Parse_object_flags[i].name, flag_name)) { + parse_obj_flag = Parse_object_flags[i].def; + break; + } + } for ( i = 0; i < MAX_AI_FLAG_NAMES; i++) { if (!stricmp(Ai_flag_names[i].flag_name, flag_name)) { @@ -13171,12 +13041,9 @@ int sexp_are_ship_flags_set(int node) { char *flag_name; ship *shipp; - int object_flag = 0; - int object_flag2 = 0; - int ship_flags = 0; - int ship_flags2 = 0; - int parse_obj_flag = 0; - int parse_obj_flag2 = 0; + Object::Object_Flags object_flag = Object::Object_Flags::NUM_VALUES; + Ship::Ship_Flags ship_flags = Ship::Ship_Flags::NUM_VALUES; + Mission::Parse_Object_Flags parse_obj_flag = Mission::Parse_Object_Flags::NUM_VALUES; int ai_flag = 0; int ai_flag2 = 0; @@ -13191,21 +13058,17 @@ int sexp_are_ship_flags_set(int node) while (node != -1) { flag_name = CTEXT(node); - sexp_check_flag_arrays(flag_name, object_flag, object_flag2, ship_flags, ship_flags2, parse_obj_flag, parse_obj_flag2, ai_flag, ai_flag2); + sexp_check_flag_arrays(flag_name, object_flag, ship_flags, parse_obj_flag, ai_flag, ai_flag2); // now check the flags - if (object_flag) { - if (!(Objects[shipp->objnum].flags & object_flag)) + if (object_flag != Object::Object_Flags::NUM_VALUES) { + if (!(Objects[shipp->objnum].flags[object_flag])) return 0; } // if we ever get object flags 2 - they go here. - if (ship_flags) { - if (!(shipp->flags & ship_flags)) - return 0; - } - if (ship_flags2) { - if (!(shipp->flags2 & ship_flags2)) + if (ship_flags != Ship::Ship_Flags::NUM_VALUES) { + if (!(shipp->flags[ship_flags])) return 0; } @@ -13227,12 +13090,9 @@ int sexp_are_ship_flags_set(int node) void sexp_alter_ship_flag(int node) { char *flag_name; - int object_flag = 0; - int object_flag2 = 0; - int ship_flags = 0; - int ship_flags2 = 0; - int parse_obj_flag = 0; - int parse_obj_flag2 = 0; + Object::Object_Flags object_flag = Object::Object_Flags::NUM_VALUES; + Ship::Ship_Flags ship_flags = Ship::Ship_Flags::NUM_VALUES; + Mission::Parse_Object_Flags parse_obj_flag = Mission::Parse_Object_Flags::NUM_VALUES; int ai_flag = 0; int ai_flag2 = 0; bool set_flag = false; @@ -13241,7 +13101,7 @@ void sexp_alter_ship_flag(int node) flag_name = CTEXT(node); - sexp_check_flag_arrays(flag_name, object_flag, object_flag2, ship_flags, ship_flags2, parse_obj_flag, parse_obj_flag2, ai_flag, ai_flag2); + sexp_check_flag_arrays(flag_name, object_flag, ship_flags, parse_obj_flag, ai_flag, ai_flag2); node = CDR(node); if (is_sexp_true(node)) { @@ -13256,20 +13116,10 @@ void sexp_alter_ship_flag(int node) // start the multiplayer packet multi_start_callback(); - multi_send_int(object_flag); - /* Uncommenting this will break compatibility with earlier builds but it is pointless to send it until object_flag2 - is actually used by the engine - */ - // multi_send_int(object_flag2); - multi_send_int(ship_flags); - multi_send_int(ship_flags2); - multi_send_int(parse_obj_flag); - multi_send_int(parse_obj_flag2); + multi_send_int((int)object_flag); + multi_send_int((int)ship_flags); + multi_send_int((int)parse_obj_flag); multi_send_int(ai_flag); - /* Uncommenting this will break compatibility with earlier builds but it is pointless to send it until ai_flag2 - is actually used by the engine - */ - // multi_send_int(ai_flag2); multi_send_bool(set_flag); multi_send_bool(future_ships); @@ -13280,7 +13130,7 @@ void sexp_alter_ship_flag(int node) // send a message to the clients saying there were no more arguments multi_send_bool(false); - alter_flag_for_all_ships(future_ships, object_flag, object_flag2, ship_flags, ship_flags2, parse_obj_flag, parse_obj_flag2, ai_flag, ai_flag2, set_flag); + alter_flag_for_all_ships(future_ships, (int)object_flag, (int)ship_flags, (int)parse_obj_flag, ai_flag, ai_flag2, set_flag); } @@ -13297,7 +13147,7 @@ void sexp_alter_ship_flag(int node) continue; } - sexp_alter_ship_flag_helper(oswpt, future_ships, object_flag, object_flag2, ship_flags, ship_flags2, parse_obj_flag, parse_obj_flag2, ai_flag, ai_flag2, set_flag); + sexp_alter_ship_flag_helper(oswpt, future_ships, (int)object_flag, (int)ship_flags, (int)parse_obj_flag, ai_flag, ai_flag2, set_flag); node = CDR(node); multi_send_int(oswpt.type); @@ -13331,11 +13181,8 @@ void multi_sexp_alter_ship_flag() { int i; int object_flag = 0; - int object_flag2 = 0; int ship_flag = 0; - int ship_flag2 = 0; int parse_obj_flag = 0; - int parse_obj_flag2 = 0; bool set_flag = false; bool future_ships = true; bool process_data = false; @@ -13346,11 +13193,8 @@ void multi_sexp_alter_ship_flag() ushort wing_sig; multi_get_int(object_flag); - // multi_get_int(object_flag2); multi_get_int(ship_flag); - multi_get_int(ship_flag2); multi_get_int(parse_obj_flag); - multi_get_int(parse_obj_flag2); multi_get_int(ai_flag); multi_get_bool(set_flag); multi_get_bool(future_ships); @@ -13363,7 +13207,7 @@ void multi_sexp_alter_ship_flag() // no more data means do this to every ship in the mission if (!process_data) { - alter_flag_for_all_ships(future_ships, object_flag, object_flag2, ship_flag, ship_flag2, parse_obj_flag, parse_obj_flag2, ai_flag, ai_flag2, set_flag); + alter_flag_for_all_ships(future_ships, object_flag, ship_flag, parse_obj_flag, ai_flag, ai_flag2, set_flag); } else { while (multi_get_int(type)) { @@ -13413,7 +13257,7 @@ void multi_sexp_alter_ship_flag() multi_get_int(oswpt.team); break; } - sexp_alter_ship_flag_helper(oswpt, future_ships, object_flag, object_flag2, ship_flag, ship_flag2, parse_obj_flag, parse_obj_flag2, ai_flag, ai_flag2, set_flag); + sexp_alter_ship_flag_helper(oswpt, future_ships, object_flag, ship_flag, parse_obj_flag, ai_flag, ai_flag2, set_flag); } } } @@ -13423,22 +13267,23 @@ void multi_sexp_alter_ship_flag() // function to deal with breaking/fixing the warp engines on ships/wings. // --repairable is true when we are breaking the warp drive (can be repaired) // --damage_it is true when we are sabotaging it, one way or the other; false when fixing it -void sexp_deal_with_warp( int n, bool repairable, bool damage_it ) +void sexp_deal_with_warp(int n, bool repairable, bool damage_it) { - int ship_flag, p_object_flag; + Ship::Ship_Flags ship_flag; + Mission::Parse_Object_Flags p_object_flag; - if (repairable) - { - ship_flag = SF_WARP_BROKEN; - p_object_flag = P_SF_WARP_BROKEN; - } - else - { - ship_flag = SF_WARP_NEVER; - p_object_flag = P_SF_WARP_NEVER; - } + if (repairable) + { + ship_flag = Ship::Ship_Flags::Warp_broken; + p_object_flag = Mission::Parse_Object_Flags::SF_Warp_broken; + } + else + { + ship_flag = Ship::Ship_Flags::Warp_never; + p_object_flag = Mission::Parse_Object_Flags::SF_Warp_never;; + } - sexp_deal_with_ship_flag(n, true, 0, 0, ship_flag, 0, p_object_flag, 0, damage_it); + sexp_deal_with_ship_flag(n, true, Object::Object_Flags::NUM_VALUES, ship_flag, p_object_flag, damage_it); } // Goober5000 @@ -13446,7 +13291,7 @@ void sexp_set_subspace_drive(int node) { bool set_flag = !is_sexp_true(node); - sexp_deal_with_ship_flag(CDR(node), true, 0, 0, 0, SF2_NO_SUBSPACE_DRIVE, 0, 0, set_flag); + sexp_deal_with_ship_flag(CDR(node), true, Object::Object_Flags::NUM_VALUES, Ship::Ship_Flags::No_subspace_drive, Mission::Parse_Object_Flags::NUM_VALUES, set_flag); } /** @@ -13488,16 +13333,8 @@ void sexp_toggle_builtin_messages (int node, bool enable_messages) // If no arguments were supplied then turn off all messages then bail if (node < 0) { - if (enable_messages) - { - The_mission.flags &= ~MISSION_FLAG_NO_BUILTIN_MSGS; - return; - } - else - { - The_mission.flags |= MISSION_FLAG_NO_BUILTIN_MSGS; - return; - } + The_mission.flags.set(Mission::Mission_Flags::No_builtin_msgs, !enable_messages); + return; } // iterate through all the nodes supplied @@ -13509,14 +13346,7 @@ void sexp_toggle_builtin_messages (int node, bool enable_messages) if ((*ship_name == '#') && !stricmp(&ship_name[1], The_mission.command_sender)) { // Either disable or enable messages from command - if (enable_messages) - { - The_mission.flags &= ~MISSION_FLAG_NO_BUILTIN_COMMAND; - } - else - { - The_mission.flags |= MISSION_FLAG_NO_BUILTIN_COMMAND; - } + The_mission.flags.set(Mission::Mission_Flags::No_builtin_command, !enable_messages); } else if (!stricmp(ship_name, "")) { @@ -13526,20 +13356,14 @@ void sexp_toggle_builtin_messages (int node, bool enable_messages) for ( shipnum = 0; shipnum < Wings[wingnum].current_count; shipnum++ ) { ship_index = Wings[wingnum].ship_index[shipnum]; Assert( ship_index != -1 ); - - if (enable_messages) { - Ships[ship_index].flags2 &= ~SF2_NO_BUILTIN_MESSAGES; - } - else { - Ships[ship_index].flags2 |= SF2_NO_BUILTIN_MESSAGES; - } + Ships[ship_index].flags.set(Ship::Ship_Flags::No_builtin_messages, enable_messages); } } } // If it isn't command then assume that we're dealing with a ship else { - sexp_deal_with_ship_flag(node, false, 0, 0, 0, SF2_NO_BUILTIN_MESSAGES, 0, P2_SF2_NO_BUILTIN_MESSAGES, !enable_messages); + sexp_deal_with_ship_flag(node, false, Object::Object_Flags::NUM_VALUES, Ship::Ship_Flags::No_builtin_messages, Mission::Parse_Object_Flags::SF_No_builtin_messages, !enable_messages); } node = CDR(node); @@ -14110,7 +13934,7 @@ int sexp_goal_incomplete(int n) */ void sexp_protect_ships(int n, bool flag) { - sexp_deal_with_ship_flag(n, true, OF_PROTECTED, 0, 0, 0, P_OF_PROTECTED, 0, flag); + sexp_deal_with_ship_flag(n, true, Object::Object_Flags::Protected, Ship::Ship_Flags::NUM_VALUES, Mission::Parse_Object_Flags::OF_Protected, 0, flag); } /** @@ -14121,7 +13945,7 @@ void sexp_protect_ships(int n, bool flag) */ void sexp_beam_protect_ships(int n, bool flag) { - sexp_deal_with_ship_flag(n, true, OF_BEAM_PROTECTED, 0, 0, 0, P_OF_BEAM_PROTECTED, 0, flag); + sexp_deal_with_ship_flag(n, true, Object::Object_Flags::Beam_protected, Ship::Ship_Flags::NUM_VALUES, Mission::Parse_Object_Flags::OF_Beam_protected, 0, flag); } /** @@ -14136,13 +13960,13 @@ void sexp_turret_protect_ships(int n, bool flag) n = CDR(n); if (!stricmp(turret_type, "beam")) - sexp_deal_with_ship_flag(n, true, OF_BEAM_PROTECTED, 0, 0, 0, P_OF_BEAM_PROTECTED, 0, flag); + sexp_deal_with_ship_flag(n, true, Object::Object_Flags::Beam_protected, Ship::Ship_Flags::NUM_VALUES, Mission::Parse_Object_Flags::OF_Beam_protected, 0, flag); else if (!stricmp(turret_type, "flak")) - sexp_deal_with_ship_flag(n, true, OF_FLAK_PROTECTED, 0, 0, 0, P_OF_FLAK_PROTECTED, 0, flag); + sexp_deal_with_ship_flag(n, true, Object::Object_Flags::Flak_protected, Ship::Ship_Flags::NUM_VALUES, Mission::Parse_Object_Flags::OF_Flak_protected, 0, flag); else if (!stricmp(turret_type, "laser")) - sexp_deal_with_ship_flag(n, true, OF_LASER_PROTECTED, 0, 0, 0, P_OF_LASER_PROTECTED, 0, flag); + sexp_deal_with_ship_flag(n, true, Object::Object_Flags::Laser_protected, Ship::Ship_Flags::NUM_VALUES, Mission::Parse_Object_Flags::OF_Laser_protected, 0, flag); else if (!stricmp(turret_type, "missile")) - sexp_deal_with_ship_flag(n, true, OF_MISSILE_PROTECTED, 0, 0, 0, P_OF_MISSILE_PROTECTED, 0, flag); + sexp_deal_with_ship_flag(n, true, Object::Object_Flags::Missile_protected, Ship::Ship_Flags::NUM_VALUES, Mission::Parse_Object_Flags::OF_Missile_protected, 0, flag); else Warning(LOCATION, "Invalid turret type '%s'!", turret_type); } @@ -14150,25 +13974,25 @@ void sexp_turret_protect_ships(int n, bool flag) // Goober5000 - sets the "don't collide invisible" flag on a list of ships void sexp_dont_collide_invisible(int n, bool dont_collide) { - sexp_deal_with_ship_flag(n, true, 0, 0, 0, SF2_DONT_COLLIDE_INVIS, 0, P_SF2_DONT_COLLIDE_INVIS, dont_collide); + sexp_deal_with_ship_flag(n, true, Object::Object_Flags::NUM_VALUES, Ship::Ship_Flags::Dont_collide_invis, Mission::Parse_Object_Flags::SF_Dont_collide_invis, dont_collide); } // Goober5000 - sets the "immobile" flag on a list of ships void sexp_set_immobile(int n, bool immobile) { - sexp_deal_with_ship_flag(n, true, OF_IMMOBILE, 0, 0, 0, 0, P2_OF_IMMOBILE, immobile); + sexp_deal_with_ship_flag(n, true, Object::Object_Flags::Immobile, Ship::Ship_Flags::NUM_VALUES, Mission::Parse_Object_Flags::OF_Immobile, immobile); } // Goober5000 - sets the "no-ets" flag on a list of ships void sexp_disable_ets(int n, bool disable) { - sexp_deal_with_ship_flag(n, true, 0, 0, 0, SF2_NO_ETS, 0, P2_SF2_NO_ETS, disable); + sexp_deal_with_ship_flag(n, true, Object::Object_Flags::NUM_VALUES, Ship::Ship_Flags::No_ets, Mission::Parse_Object_Flags::SF_No_ets, disable); } // Goober5000 - sets the vaporize flag on a list of ships void sexp_ships_vaporize(int n, bool vaporize) { - sexp_deal_with_ship_flag(n, true, 0, 0, SF_VAPORIZE, 0, P_SF_VAPORIZE, 0, vaporize); + sexp_deal_with_ship_flag(n, true, Object::Object_Flags::NUM_VALUES, Ship::Ship_Flags::Vaporize, Mission::Parse_Object_Flags::SF_Vaporize, vaporize); } /** @@ -14179,7 +14003,7 @@ void sexp_ships_vaporize(int n, bool vaporize) */ void sexp_ships_visible(int n, bool visible) { - sexp_deal_with_ship_flag(n, true, 0, 0, SF_HIDDEN_FROM_SENSORS, 0, P_SF_HIDDEN_FROM_SENSORS, 0, !visible, true); + sexp_deal_with_ship_flag(n, true, Object::Object_Flags::NUM_VALUES, Ship::Ship_Flags::Hidden_from_sensors, Mission::Parse_Object_Flags::SF_Hidden_from_sensors, !visible, true); // we also have to add any escort ships that were made visible for (; n >= 0; n = CDR(n)) @@ -14191,7 +14015,7 @@ void sexp_ships_visible(int n, bool visible) if (!visible && Player_ai->target_objnum == Ships[shipnum].objnum) { hud_cease_targeting(); } - else if (visible && (Ships[shipnum].flags & SF_ESCORT)) { + else if (visible && (Ships[shipnum].flags[Ship::Ship_Flags::Escort])) { hud_add_ship_to_escort(Ships[shipnum].objnum, 1); } } @@ -14200,7 +14024,7 @@ void sexp_ships_visible(int n, bool visible) // Goober5000 void sexp_ships_stealthy(int n, bool stealthy) { - sexp_deal_with_ship_flag(n, true, 0, 0, 0, SF2_STEALTH, 0, P_SF2_STEALTH, stealthy, true); + sexp_deal_with_ship_flag(n, true, Object::Object_Flags::NUM_VALUES, Ship::Ship_Flags::Stealth, Mission::Parse_Object_Flags::SF_Stealth, stealthy, true); // we also have to add any escort ships that were made visible if (!stealthy) @@ -14211,7 +14035,7 @@ void sexp_ships_stealthy(int n, bool stealthy) if (shipnum < 0) continue; - if (Ships[shipnum].flags & SF_ESCORT) + if (Ships[shipnum].flags[Ship::Ship_Flags::Escort]) hud_add_ship_to_escort(Ships[shipnum].objnum, 1); } } @@ -14220,7 +14044,7 @@ void sexp_ships_stealthy(int n, bool stealthy) // Goober5000 void sexp_friendly_stealth_invisible(int n, bool invisible) { - sexp_deal_with_ship_flag(n, true, 0, 0, 0, SF2_FRIENDLY_STEALTH_INVIS, 0, P_SF2_FRIENDLY_STEALTH_INVIS, invisible, true); + sexp_deal_with_ship_flag(n, true, Object::Object_Flags::NUM_VALUES, Ship::Ship_Flags::Friendly_stealth_invis, Mission::Parse_Object_Flags::SF_Friendly_stealth_invis, invisible, true); // we also have to add any escort ships that were made visible if (!invisible) @@ -14231,9 +14055,9 @@ void sexp_friendly_stealth_invisible(int n, bool invisible) if (shipnum < 0) continue; - if (Ships[shipnum].flags2 & SF2_STEALTH && Player_ship->team == Ships[shipnum].team) + if (Ships[shipnum].flags[Ship::Ship_Flags::Stealth] && Player_ship->team == Ships[shipnum].team) { - if (Ships[shipnum].flags & SF_ESCORT) + if (Ships[shipnum].flags[Ship::Ship_Flags::Escort]) hud_add_ship_to_escort(Ships[shipnum].objnum, 1); } } @@ -14427,12 +14251,12 @@ void sexp_ship_tag( int n, int tag ) // sexpression to toggle invulnerability flag of ships. void sexp_ships_invulnerable( int n, bool invulnerable ) { - sexp_deal_with_ship_flag(n, true, OF_INVULNERABLE, 0, 0, 0, P_OF_INVULNERABLE, 0, invulnerable); + sexp_deal_with_ship_flag(n, true, Object::Object_Flags::Invulnerable, Ship::Ship_Flags::NUM_VALUES, Mission::Parse_Object_Flags::OF_Invulnerable, invulnerable); } void sexp_ships_bomb_targetable(int n, bool targetable) { - sexp_deal_with_ship_flag(n, true, OF_TARGETABLE_AS_BOMB, 0, 0, 0, 0, P2_OF_TARGETABLE_AS_BOMB, targetable, true); + sexp_deal_with_ship_flag(n, true, Object::Object_Flags::Targetable_as_bomb, Ship::Ship_Flags::NUM_VALUES, Mission::Parse_Object_Flags::OF_Targetable_as_bomb, targetable, true); } // Goober5000 @@ -14548,10 +14372,7 @@ void sexp_ships_guardian( int n, int guardian ) p_object *p_objp = mission_parse_get_arrival_ship(ship_name); if (p_objp) { - if ( guardian ) - p_objp->flags |= P_SF_GUARDIAN; - else - p_objp->flags &= ~P_SF_GUARDIAN; + p_objp->flags.set(Mission::Parse_Object_Flags::SF_Guardian, guardian != 0); } } } @@ -14775,7 +14596,7 @@ void sexp_destroy_instantly(int n) void sexp_shields_off(int n, bool shields_off ) //-Sesquipedalian { - sexp_deal_with_ship_flag(n, true, OF_NO_SHIELDS, 0, 0, 0, P_OF_NO_SHIELDS, 0, shields_off, true); + sexp_deal_with_ship_flag(n, true, Object::Object_Flags::No_shields, Ship::Ship_Flags::NUM_VALUES, Mission::Parse_Object_Flags::OF_No_shields, shields_off, true); } // Goober5000 @@ -14802,14 +14623,13 @@ void sexp_parse_ship_kamikaze(p_object *parse_obj, int kdamage) { Assert(parse_obj); + parse_obj->flags.set(Mission::Parse_Object_Flags::AIF_Kamikaze, kdamage > 0); if (kdamage > 0) { - parse_obj->flags |= P_AIF_KAMIKAZE; parse_obj->kamikaze_damage = kdamage; } else { - parse_obj->flags &= ~P_AIF_KAMIKAZE; parse_obj->kamikaze_damage = 0; } } @@ -15261,7 +15081,7 @@ int sexp_primaries_depleted(int node) } // see if ship has ballistic primary weapons - if (!(Ship_info[shipp->ship_info_index].flags & SIF_BALLISTIC_PRIMARIES)) + if (!(Ship_info[shipp->ship_info_index].flags[Ship::Info_Flags::Ballistic_primaries])) return SEXP_FALSE; // get num primary banks @@ -15737,7 +15557,7 @@ int sexp_shield_quad_low(int node) } objp = &Objects[Ships[sindex].objnum]; sip = &Ship_info[Ships[sindex].ship_info_index]; - if(!(sip->flags & SIF_SMALL_SHIP)){ + if(!(sip->is_small_ship())){ return SEXP_FALSE; } max_quad = get_max_shield_quad(objp); @@ -16328,21 +16148,21 @@ void multi_sexp_set_countermeasures() void sexp_deal_with_afterburner_lock (int node, bool lock) { Assert (node != -1); - sexp_deal_with_ship_flag(node, true, 0, 0, 0, SF2_AFTERBURNER_LOCKED, 0, 0, (lock ? 1:0), true); + sexp_deal_with_ship_flag(node, true, Object::Object_Flags::NUM_VALUES, Ship::Ship_Flags::Afterburner_locked, Mission::Parse_Object_Flags::NUM_VALUES, (lock ? 1:0), true); } // Karajorma - locks or unlocks primary weapons on the requested ship void sexp_deal_with_primary_lock (int node, bool lock) { Assert (node != -1); - sexp_deal_with_ship_flag(node, true, 0, 0, 0, SF2_PRIMARIES_LOCKED, 0, P2_SF2_PRIMARIES_LOCKED, (lock ? 1:0), true); + sexp_deal_with_ship_flag(node, true, Object::Object_Flags::NUM_VALUES, Ship::Ship_Flags::Primaries_locked, Mission::Parse_Object_Flags::SF_Primaries_locked, (lock ? 1:0), true); } void sexp_deal_with_secondary_lock (int node, bool lock) { Assert (node != -1); - sexp_deal_with_ship_flag(node, true, 0, 0, 0, SF2_SECONDARIES_LOCKED, 0, P2_SF2_SECONDARIES_LOCKED, (lock ? 1:0), true); + sexp_deal_with_ship_flag(node, true, Object::Object_Flags::NUM_VALUES, Ship::Ship_Flags::Secondaries_locked, Mission::Parse_Object_Flags::SF_Secondaries_locked, (lock ? 1:0), true); } @@ -16467,7 +16287,7 @@ void sexp_change_ship_class(int n) else { // don't mess with a ship that's occupied - if (!(Ships[ship_num].flags & (SF_DYING | SF_ARRIVING | SF_DEPARTING))) + if (!(Ships[ship_num].is_arriving() || Ships[ship_num].is_dying_or_departing())) { change_ship_type(ship_num, class_num, 1); if (&Ships[ship_num] == Player_ship) { @@ -16693,11 +16513,7 @@ void sexp_activate_deactivate_glow_maps(int n, int activate) if (sindex >= 0) { shipp = &Ships[sindex]; - - if (activate) - shipp->flags2 &= ~SF2_GLOWMAPS_DISABLED; - else - shipp->flags2 |= SF2_GLOWMAPS_DISABLED; + shipp->flags.set(Ship::Ship_Flags::Glowmaps_disabled, activate == 0); } } } @@ -17114,11 +16930,8 @@ void sexp_set_thrusters(int node) continue; } - if (activate) - Ships[sindex].flags2 &= ~SF2_NO_THRUSTERS; - else - Ships[sindex].flags2 |= SF2_NO_THRUSTERS; - } + Ships[sindex].flags.set(Ship::Ship_Flags::No_thrusters, !activate); + } } void sexp_beam_free_all(int node) @@ -18740,7 +18553,7 @@ void sexp_set_support_ship(int n) Warning(LOCATION, "Support ship class '%s' not found.\n", CTEXT(n)); return; } - if ((temp_val >= 0) && !(Ship_info[temp_val].flags & SIF_SUPPORT)) + if ((temp_val >= 0) && !(Ship_info[temp_val].flags[Ship::Info_Flags::Support])) { Warning(LOCATION, "Ship %s is not a support ship!", Ship_info[temp_val].name); return; @@ -18842,11 +18655,7 @@ void sexp_set_arrival_info(int node) oswpt.shipp->arrival_path_mask = arrival_mask; oswpt.shipp->arrival_distance = arrival_distance; oswpt.shipp->arrival_delay = arrival_delay; - - if (show_warp) - oswpt.shipp->flags &= ~SF_NO_ARRIVAL_WARP; - else - oswpt.shipp->flags |= SF_NO_ARRIVAL_WARP; + oswpt.shipp->flags.set(Ship::Ship_Flags::No_arrival_warp, show_warp); } else if (oswpt.type == OSWPT_TYPE_WING || oswpt.type == OSWPT_TYPE_WING_NOT_PRESENT) { @@ -18869,10 +18678,7 @@ void sexp_set_arrival_info(int node) oswpt.p_objp->arrival_distance = arrival_distance; oswpt.p_objp->arrival_delay = arrival_delay; - if (show_warp) - oswpt.p_objp->flags &= ~P_SF_NO_ARRIVAL_WARP; - else - oswpt.p_objp->flags |= P_SF_NO_ARRIVAL_WARP; + oswpt.p_objp->flags.set(Mission::Parse_Object_Flags::SF_No_arrival_warp, show_warp); } } @@ -18950,11 +18756,7 @@ void sexp_set_departure_info(int node) oswpt.shipp->departure_anchor = departure_anchor; oswpt.shipp->departure_path_mask = departure_mask; oswpt.shipp->departure_delay = departure_delay; - - if (show_warp) - oswpt.shipp->flags &= ~SF_NO_DEPARTURE_WARP; - else - oswpt.shipp->flags |= SF_NO_DEPARTURE_WARP; + oswpt.shipp->flags.set(Ship::Ship_Flags::No_departure_warp, show_warp); } else if (oswpt.type == OSWPT_TYPE_WING || oswpt.type == OSWPT_TYPE_WING_NOT_PRESENT) { @@ -18974,11 +18776,7 @@ void sexp_set_departure_info(int node) oswpt.p_objp->departure_anchor = departure_anchor; oswpt.p_objp->departure_path_mask = departure_mask; oswpt.p_objp->departure_delay = departure_delay; - - if (show_warp) - oswpt.p_objp->flags &= ~P_SF_NO_DEPARTURE_WARP; - else - oswpt.p_objp->flags |= P_SF_NO_DEPARTURE_WARP; + oswpt.shipp->flags.set(Ship::Ship_Flags::No_departure_warp, show_warp); } } @@ -19021,7 +18819,7 @@ void sexp_damage_escort_list_all(int n) continue; // make sure it's on the escort list - if ( !(shipp->flags & SF_ESCORT) ) + if ( !(shipp->flags[Ship::Ship_Flags::Escort]) ) continue; // set index @@ -19146,7 +18944,7 @@ void set_nav_carry_status(int node) { if (Ships[i].objnum != -1 && !stricmp(Ships[i].ship_name, name)) { - Ships[i].flags2 |= SF2_NAVPOINT_CARRY; + Ships[i].flags.set(Ship::Ship_Flags::Navpoint_carry); break; } } @@ -19188,7 +18986,7 @@ void unset_nav_carry_status(int node) { if (Ships[i].objnum != -1 && !stricmp(Ships[i].ship_name, name)) { - Ships[i].flags2 &= ~SF2_NAVPOINT_CARRY; + Ships[i].flags.remove(Ship::Ship_Flags::Navpoint_carry); break; } } @@ -19215,8 +19013,8 @@ void set_nav_needslink(int node) { if (Ships[i].objnum != -1 && !stricmp(Ships[i].ship_name, name)) { - Ships[i].flags2 &= ~SF2_NAVPOINT_CARRY; - Ships[i].flags2 |= SF2_NAVPOINT_NEEDSLINK; + Ships[i].flags.remove(Ship::Ship_Flags::Navpoint_carry); + Ships[i].flags.set(Ship::Ship_Flags::Navpoint_needslink); break; } } @@ -19241,7 +19039,7 @@ void unset_nav_needslink(int node) { if (Ships[i].objnum != -1 && !stricmp(Ships[i].ship_name, name)) { - Ships[i].flags2 &= ~SF2_NAVPOINT_NEEDSLINK; + Ships[i].flags.remove(Ship::Ship_Flags::Navpoint_needslink); break; } } @@ -19415,28 +19213,14 @@ void multi_del_nav() //args: 1, boolean enable/disable void set_use_ap_cinematics(int node) { - if (is_sexp_true(node)) - { - The_mission.flags |= MISSION_FLAG_USE_AP_CINEMATICS; - } - else - { - The_mission.flags &= ~MISSION_FLAG_USE_AP_CINEMATICS; - } + The_mission.flags.set(Mission::Mission_Flags::Use_ap_cinematics, is_sexp_true(node) != 0); } //text: use-autopilot //args: 1, boolean enable/disable void set_use_ap(int node) { - if (is_sexp_true(node)) - { - The_mission.flags &= ~MISSION_FLAG_DEACTIVATE_AP; - } - else - { - The_mission.flags |= MISSION_FLAG_DEACTIVATE_AP; - } + The_mission.flags.set(Mission::Mission_Flags::Deactivate_ap, is_sexp_true(node) == 0); } //text: hide-nav @@ -19509,7 +19293,7 @@ int is_nav_linked(int node) { if (Ships[i].objnum != -1 && !stricmp(Ships[i].ship_name, ship_name)) { - return (Ships[i].flags2 & SF2_NAVPOINT_CARRY) != 0; + return (Ships[i].flags[Ship::Ship_Flags::Navpoint_carry]) != 0; } } return 0; @@ -19733,7 +19517,7 @@ void actually_remove_weapons(int weapon_info_index) } if (Weapons[i].objnum >= 0) { - Objects[Weapons[i].objnum].flags |= OF_SHOULD_BE_DEAD; + Objects[Weapons[i].objnum].flags.set(Object::Object_Flags::Should_be_dead); } } } @@ -19849,7 +19633,7 @@ int sexp_return_player_data(int node, int type) return 0; } - if (p_objp->flags & P_OF_PLAYER_START) { + if (p_objp->flags[Mission::Parse_Object_Flags::OF_Player_start]) { switch (type) { case OP_SHIP_DEATHS: // when an AI ship is finally killed its respawn count won't be updated so get the number of deaths @@ -20101,7 +19885,7 @@ int sexp_is_primary_selected(int node) } // is this the bank currently selected - if( (bank == shipp->weapons.current_primary_bank) || (shipp->flags & SF_PRIMARY_LINKED) ){ + if( (bank == shipp->weapons.current_primary_bank) || (shipp->flags[Ship::Ship_Flags::Primary_linked]) ){ return SEXP_TRUE; } @@ -20174,7 +19958,7 @@ int process_special_sexps(int index) return SEXP_FALSE; case 3: // Player ship suffering shield damage on front. - if (!(Ship_info[Player_ship->ship_info_index].flags2 & SIF2_MODEL_POINT_SHIELDS)) { + if (!(Ship_info[Player_ship->ship_info_index].flags[Ship::Info_Flags::Model_point_shields])) { apply_damage_to_shield(Player_obj, FRONT_QUAD, 10.0f); hud_shield_quadrant_hit(Player_obj, FRONT_QUAD); return SEXP_TRUE; @@ -20185,7 +19969,7 @@ int process_special_sexps(int index) break; case 4: // Player ship suffering much damage. - if (!(Ship_info[Player_ship->ship_info_index].flags2 & SIF2_MODEL_POINT_SHIELDS)) { + if (!(Ship_info[Player_ship->ship_info_index].flags[Ship::Info_Flags::Model_point_shields])) { nprintf(("AI", "Frame %i\n", Framecount)); apply_damage_to_shield(Player_obj, FRONT_QUAD, 10.0f); hud_shield_quadrant_hit(Player_obj, FRONT_QUAD); @@ -20200,7 +19984,7 @@ int process_special_sexps(int index) break; case 5: // Player's shield is quick repaired - if (!(Ship_info[Player_ship->ship_info_index].flags2 & SIF2_MODEL_POINT_SHIELDS)) { + if (!(Ship_info[Player_ship->ship_info_index].flags[Ship::Info_Flags::Model_point_shields])) { nprintf(("AI", "Frame %i, recharged to %7.3f\n", Framecount, Player_obj->shield_quadrant[FRONT_QUAD])); apply_damage_to_shield(Player_obj, FRONT_QUAD, -flFrametime*200.0f); @@ -20219,7 +20003,7 @@ int process_special_sexps(int index) break; case 6: // 3 of player's shield quadrants are reduced to 0. - if (!(Ship_info[Player_ship->ship_info_index].flags2 & SIF2_MODEL_POINT_SHIELDS)) { + if (!(Ship_info[Player_ship->ship_info_index].flags[Ship::Info_Flags::Model_point_shields])) { Player_obj->shield_quadrant[1] = 1.0f; Player_obj->shield_quadrant[2] = 1.0f; Player_obj->shield_quadrant[3] = 1.0f; @@ -20231,7 +20015,7 @@ int process_special_sexps(int index) return SEXP_TRUE; case 7: // Make sure front quadrant has been maximized, or close to it. - if (!(Ship_info[Player_ship->ship_info_index].flags2 & SIF2_MODEL_POINT_SHIELDS)) { + if (!(Ship_info[Player_ship->ship_info_index].flags[Ship::Info_Flags::Model_point_shields])) { if (shield_quad_near_max(FRONT_QUAD)) return SEXP_TRUE; else return SEXP_FALSE; } else { nprintf(("Warning", "Shield-related Special-check SEXPs do not work on ship %s because it uses model point shields.\n", Player_ship->ship_name)); @@ -20240,7 +20024,7 @@ int process_special_sexps(int index) break; case 8: // Make sure rear quadrant has been maximized, or close to it. - if (!(Ship_info[Player_ship->ship_info_index].flags2 & SIF2_MODEL_POINT_SHIELDS)) { + if (!(Ship_info[Player_ship->ship_info_index].flags[Ship::Info_Flags::Model_point_shields])) { if (shield_quad_near_max(REAR_QUAD)) return SEXP_TRUE; else return SEXP_FALSE; } else { nprintf(("Warning", "Shield-related Special-check SEXPs do not work on ship %s because it uses model point shields.\n", Player_ship->ship_name)); @@ -20249,7 +20033,7 @@ int process_special_sexps(int index) break; case 9: // Zero left and right quadrants in preparation for maximizing rear quadrant. - if (!(Ship_info[Player_ship->ship_info_index].flags2 & SIF2_MODEL_POINT_SHIELDS)) { + if (!(Ship_info[Player_ship->ship_info_index].flags[Ship::Info_Flags::Model_point_shields])) { Player_obj->shield_quadrant[LEFT_QUAD] = 0.0f; Player_obj->shield_quadrant[RIGHT_QUAD] = 0.0f; hud_shield_quadrant_hit(Player_obj, LEFT_QUAD); @@ -20282,7 +20066,7 @@ int process_special_sexps(int index) break; case 13: // Zero front shield quadrant. Added for Jim Boone on August 26, 1999 by MK. - if (!(Ship_info[Player_ship->ship_info_index].flags2 & SIF2_MODEL_POINT_SHIELDS)) { + if (!(Ship_info[Player_ship->ship_info_index].flags[Ship::Info_Flags::Model_point_shields])) { Player_obj->shield_quadrant[FRONT_QUAD] = 0.0f; hud_shield_quadrant_hit(Player_obj, FRONT_QUAD); return SEXP_TRUE; @@ -20656,14 +20440,11 @@ void sexp_scramble_messages(int node, bool scramble) if (node < 0) { // scramble messages on player ship... this isn't multi compatible, but neither was the old version of the sexp - if (scramble) - Player_ship->flags2 |= SF2_SCRAMBLE_MESSAGES; - else - Player_ship->flags2 &= ~SF2_SCRAMBLE_MESSAGES; + Player_ship->flags.set(Ship::Ship_Flags::Scramble_messages, scramble); return; } - sexp_deal_with_ship_flag(node, true, 0, 0, 0, SF2_SCRAMBLE_MESSAGES, 0, P2_SF2_SCRAMBLE_MESSAGES, scramble, false, true); + sexp_deal_with_ship_flag(node, true, Object::Object_Flags::NUM_VALUES, Ship::Ship_Flags::Scramble_messages, Mission::Parse_Object_Flags::SF_Scramble_messages, scramble, false, true); } void toggle_cutscene_bars(float delta_speed, int set) diff --git a/code/pilotfile/csg.cpp b/code/pilotfile/csg.cpp index 5dd43876a4..31cdf3c3a5 100644 --- a/code/pilotfile/csg.cpp +++ b/code/pilotfile/csg.cpp @@ -431,7 +431,7 @@ void pilotfile::csg_read_techroom() if (visible) { if (ship_list[idx].index >= 0) { - Ship_info[ship_list[idx].index].flags |= SIF_IN_TECH_DATABASE; + Ship_info[ship_list[idx].index].flags.set(Ship::Info_Flags::In_tech_database); } else { m_data_invalid = true; } @@ -480,16 +480,16 @@ void pilotfile::csg_write_techroom() startSection(Section::Techroom); // visible ships - for (auto it = Ship_info.cbegin(); it != Ship_info.cend(); ++it) { - // only visible if not in techroom by default - if ( (it->flags & SIF_IN_TECH_DATABASE) && !(it->flags2 & SIF2_DEFAULT_IN_TECH_DATABASE) ) { - visible = 1; - } else { - visible = 0; - } + for (auto it = Ship_info.cbegin(); it != Ship_info.cend(); ++it) { + if ((it->flags[Ship::Info_Flags::In_tech_database]) && !(it->flags[Ship::Info_Flags::Default_in_tech_database])) { + visible = 1; + } + else { + visible = 0; + } - cfwrite_ubyte(visible, cfp); - } + cfwrite_ubyte(visible, cfp); + } // visible weapons for (idx = 0; idx < Num_weapon_types; idx++) { diff --git a/code/playerman/playercontrol.cpp b/code/playerman/playercontrol.cpp index 009ac2bc58..a03a744034 100644 --- a/code/playerman/playercontrol.cpp +++ b/code/playerman/playercontrol.cpp @@ -729,7 +729,7 @@ void read_keyboard_controls( control_info * ci, float frame_time, physics_info * if (check_control(AFTERBURNER) && !Player_use_ai) { if (!afterburner_last) { Assert(Player_ship); - if ( !(Ship_info[Player_ship->ship_info_index].flags & SIF_AFTERBURNER) ) { + if ( !(Ship_info[Player_ship->ship_info_index].flags[Ship::Info_Flags::Afterburner]) ) { gamesnd_play_error_beep(); } else { ci->afterburner_start = 1; @@ -766,7 +766,7 @@ void read_keyboard_controls( control_info * ci, float frame_time, physics_info * } // if the player is warping out, cancel gliding - if (Player_ship->flags & SF_DEPART_WARP) { + if (Player_ship->flags[Ship::Ship_Flags::Depart_warp]) { toggle_glide = 0; press_glide = 0; } @@ -898,7 +898,7 @@ void read_player_controls(object *objp, float frametime) target_warpout_speed = ship_get_warpout_speed(objp); // check if warp ability has been disabled - if (!(Warpout_forced) && Ships[objp->instance].flags & ( SF_WARP_BROKEN|SF_WARP_NEVER ) ) { + if (!(Warpout_forced) && (Ships[objp->instance].flags[Ship::Ship_Flags::Warp_broken] || Ships[objp->instance].flags[Ship::Ship_Flags::Warp_never]) ) { HUD_sourced_printf(HUD_SOURCE_HIDDEN, XSTR( "Cannot warp out at this time.", 81)); snd_play(&Snds[SND_PLAYER_WARP_FAIL]); gameseq_post_event( GS_EVENT_PLAYER_WARPOUT_STOP ); @@ -952,7 +952,7 @@ void read_player_controls(object *objp, float frametime) if(Player_obj->type == OBJ_SHIP && !Player_use_ai){ // only read player control info if player ship is not dead // or if Player_use_ai is disabed - if ( !(Ships[Player_obj->instance].flags & SF_DYING) ) { + if ( !(Ships[Player_obj->instance].flags[Ship::Ship_Flags::Dying]) ) { vec3d wash_rot; if ((Ships[objp->instance].wash_intensity > 0) && !((Player->control_mode == PCM_WARPOUT_STAGE1) || (Player->control_mode == PCM_WARPOUT_STAGE2) || (Player->control_mode == PCM_WARPOUT_STAGE3)) ) { float intensity = 0.3f * MIN(Ships[objp->instance].wash_intensity, 1.0f); @@ -1147,12 +1147,12 @@ void player_save_target_and_weapon_link_prefs() // if we're in multiplayer mode don't do this because we will desync ourselves with the server if(!(Game_mode & GM_MULTIPLAYER)){ - if ( Player_ship->flags & SF_PRIMARY_LINKED ) { + if ( Player_ship->flags[Ship::Ship_Flags::Primary_linked] ) { Player->save_flags |= PLAYER_FLAGS_LINK_PRIMARY; } else { Player->flags &= ~PLAYER_FLAGS_LINK_PRIMARY; } - if ( Player_ship->flags & SF_SECONDARY_DUAL_FIRE ) { + if ( Player_ship->flags[Ship::Ship_Flags::Secondary_dual_fire] ) { Player->save_flags |= PLAYER_FLAGS_LINK_SECONDARY; } else { Player->flags &= ~PLAYER_FLAGS_LINK_SECONDARY; @@ -1174,14 +1174,14 @@ void player_restore_target_and_weapon_link_prefs() Player->flags |= Player->save_flags; } - if ( Player->flags & PLAYER_FLAGS_LINK_PRIMARY && !(player_sip->flags2 & SIF2_NO_PRIMARY_LINKING) ) { + if ( Player->flags & PLAYER_FLAGS_LINK_PRIMARY && !(player_sip->flags[Ship::Info_Flags::No_primary_linking]) ) { if ( Player_ship->weapons.num_primary_banks > 1 ) { - Player_ship->flags |= SF_PRIMARY_LINKED; + Player_ship->flags.set(Ship::Ship_Flags::Primary_linked); } } if ( Player->flags & PLAYER_FLAGS_LINK_SECONDARY && (pm->n_missiles > 0 && pm->missile_banks[0].num_slots > 1) ) { - Player_ship->flags |= SF_SECONDARY_DUAL_FIRE; + Player_ship->flags.set(Ship::Ship_Flags::Secondary_dual_fire); } } @@ -1419,8 +1419,8 @@ int player_inspect_cargo(float frametime, char *outstr) cargo_sip = &Ship_info[cargo_sp->ship_info_index]; // Goober5000 - possibly swap cargo scan behavior - scan_subsys = (cargo_sip->flags & SIF_HUGE_SHIP); - if (cargo_sp->flags2 & SF2_TOGGLE_SUBSYSTEM_SCANNING) + scan_subsys = cargo_sip->is_huge_ship(); + if (cargo_sp->flags[Ship::Ship_Flags::Toggle_subsystem_scanning]) scan_subsys = !scan_subsys; if (scan_subsys) return player_inspect_cap_subsys_cargo(frametime, outstr); @@ -1433,17 +1433,17 @@ int player_inspect_cargo(float frametime, char *outstr) // scannable cargo behaves differently. Scannable cargo is either "scanned" or "not scanned". This flag // can be set on any ship. Any ship with this set won't have "normal" cargo behavior - if ( !(cargo_sp->flags & SF_SCANNABLE) ) { - if ( !(cargo_sip->flags & (SIF_CARGO|SIF_TRANSPORT)) ) { + if ( !(cargo_sp->flags[Ship::Ship_Flags::Scannable]) ) { + if (!(cargo_sip->flags[Ship::Info_Flags::Cargo] || cargo_sip->flags[Ship::Info_Flags::Transport])) { return 0; } } // if cargo is already revealed - if ( cargo_sp->flags & SF_CARGO_REVEALED ) { - if ( !(cargo_sp->flags & SF_SCANNABLE) ) { + if ( cargo_sp->flags[Ship::Ship_Flags::Cargo_revealed] ) { + if ( !(cargo_sp->flags[Ship::Ship_Flags::Scannable]) ) { char *cargo_name = Cargo_names[cargo_sp->cargo1 & CARGO_INDEX_MASK]; - Assert( cargo_sip->flags & (SIF_CARGO|SIF_TRANSPORT) ); + Assert(cargo_sip->flags[Ship::Info_Flags::Cargo] || cargo_sip->flags[Ship::Info_Flags::Transport]); if ( cargo_name[0] == '#' ) { sprintf(outstr, XSTR("passengers: %s", 83), cargo_name+1 ); @@ -1468,7 +1468,7 @@ int player_inspect_cargo(float frametime, char *outstr) vm_vec_normalized_dir(&vec_to_cargo, &cargo_objp->pos, &Player_obj->pos); dot = vm_vec_dot(&vec_to_cargo, &Player_obj->orient.vec.fvec); if ( dot < CARGO_MIN_DOT_TO_REVEAL ) { - if ( !(cargo_sp->flags & SF_SCANNABLE) ) + if ( !(cargo_sp->flags[Ship::Ship_Flags::Scannable]) ) strcpy(outstr,XSTR( "cargo: ", 86)); else strcpy(outstr,XSTR( "not scanned", 87)); @@ -1482,7 +1482,7 @@ int player_inspect_cargo(float frametime, char *outstr) Player->cargo_inspect_time += fl2i(frametime*1000+0.5f); } - if ( !(cargo_sp->flags & SF_SCANNABLE) ) + if ( !(cargo_sp->flags[Ship::Ship_Flags::Scannable]) ) strcpy(outstr,XSTR( "cargo: inspecting", 88)); else strcpy(outstr,XSTR( "scanning", 89)); @@ -1493,7 +1493,7 @@ int player_inspect_cargo(float frametime, char *outstr) Player->cargo_inspect_time = 0; } } else { - if ( !(cargo_sp->flags & SF_SCANNABLE) ) + if ( !(cargo_sp->flags[Ship::Ship_Flags::Scannable]) ) strcpy(outstr,XSTR( "cargo: ", 86)); else strcpy(outstr,XSTR( "not scanned", 87)); @@ -1539,7 +1539,7 @@ int player_inspect_cap_subsys_cargo(float frametime, char *outstr) // if cargo is already revealed if (subsys->flags & SSF_CARGO_REVEALED) { - if ( !(cargo_sp->flags & SF_SCANNABLE) ) { + if ( !(cargo_sp->flags[Ship::Ship_Flags::Scannable]) ) { char *cargo_name = Cargo_names[subsys->subsys_cargo_name & CARGO_INDEX_MASK]; if ( cargo_name[0] == '#' ) { @@ -1568,7 +1568,7 @@ int player_inspect_cap_subsys_cargo(float frametime, char *outstr) subsys_rad = subsys->system_info->radius; // Goober5000 - if (cargo_sip->flags & SIF_HUGE_SHIP) { + if (cargo_sip->is_huge_ship()) { scan_dist = MAX(CAP_CARGO_REVEAL_MIN_DIST, (subsys_rad + CAPITAL_CARGO_RADIUS_DELTA)); } else { scan_dist = MAX(CARGO_REVEAL_MIN_DIST, (subsys_rad + CARGO_RADIUS_DELTA)); @@ -1583,7 +1583,7 @@ int player_inspect_cap_subsys_cargo(float frametime, char *outstr) subsys_in_view = hud_targetbox_subsystem_in_view(cargo_objp, &x, &y); if ( (dot < CARGO_MIN_DOT_TO_REVEAL) || (!subsys_in_view) ) { - if ( !(cargo_sp->flags & SF_SCANNABLE) ) + if ( !(cargo_sp->flags[Ship::Ship_Flags::Scannable]) ) strcpy(outstr,XSTR( "cargo: ", 86)); else strcpy(outstr,XSTR( "not scanned", 87)); @@ -1597,7 +1597,7 @@ int player_inspect_cap_subsys_cargo(float frametime, char *outstr) Player->cargo_inspect_time += fl2i(frametime*1000+0.5f); } - if ( !(cargo_sp->flags & SF_SCANNABLE) ) + if ( !(cargo_sp->flags[Ship::Ship_Flags::Scannable]) ) strcpy(outstr,XSTR( "cargo: inspecting", 88)); else strcpy(outstr,XSTR( "scanning", 89)); @@ -1608,7 +1608,7 @@ int player_inspect_cap_subsys_cargo(float frametime, char *outstr) Player->cargo_inspect_time = 0; } } else { - if ( !(cargo_sp->flags & SF_SCANNABLE) ) + if ( !(cargo_sp->flags[Ship::Ship_Flags::Scannable]) ) strcpy(outstr,XSTR( "cargo: ", 86)); else strcpy(outstr,XSTR( "not scanned", 87)); diff --git a/code/popup/popupdead.cpp b/code/popup/popupdead.cpp index acfbfa5555..f24f65bc55 100644 --- a/code/popup/popupdead.cpp +++ b/code/popup/popupdead.cpp @@ -169,7 +169,7 @@ void popupdead_start() Popupdead_button_text[2] = XSTR( "Don't Show Me This Again", 1475); Popupdead_num_choices = POPUPDEAD_NUM_CHOICES_SKIP; Popupdead_skip_active = 1; - } else if(The_mission.flags & MISSION_FLAG_RED_ALERT) { + } else if(The_mission.flags[Mission::Mission_Flags::Red_alert]) { // We can't staticly declare these because they are externalized Popupdead_button_text[0] = XSTR( "Quick Start Mission", 105); Popupdead_button_text[1] = XSTR( "Return To Flight Deck", 106); diff --git a/code/radar/radardradis.cpp b/code/radar/radardradis.cpp index 1fff3c7aa2..5883e6bac6 100644 --- a/code/radar/radardradis.cpp +++ b/code/radar/radardradis.cpp @@ -123,7 +123,7 @@ void HudGaugeRadarDradis::plotBlip(blip* b, vec3d *pos, float *alpha) float fade_multi = 1.5f; if (b->objp->type == OBJ_SHIP) { - if (Ships[b->objp->instance].flags2 & SF2_STEALTH) { + if (Ships[b->objp->instance].flags[Ship::Ship_Flags::Stealth]) { fade_multi *= 2.0f; } } diff --git a/code/radar/radarsetup.cpp b/code/radar/radarsetup.cpp index 8d4d2b8e22..60ce0e6a1e 100644 --- a/code/radar/radarsetup.cpp +++ b/code/radar/radarsetup.cpp @@ -94,7 +94,7 @@ void radar_stuff_blip_info(object *objp, int is_bright, color **blip_color, int case OBJ_SHIP: shipp = &Ships[objp->instance]; - if (shipp->flags & SF_ARRIVING_STAGE_1) + if (shipp->flags[Ship::Ship_Flags::Arriving_stage_1]) { *blip_color = &Radar_colors[RCOL_WARPING_SHIP][is_bright]; *blip_type = BLIP_TYPE_WARPING_SHIP; @@ -104,7 +104,7 @@ void radar_stuff_blip_info(object *objp, int is_bright, color **blip_color, int *blip_color = &Radar_colors[RCOL_TAGGED][is_bright]; *blip_type = BLIP_TYPE_TAGGED_SHIP; } - else if (Ship_info[shipp->ship_info_index].flags & (SIF_NAVBUOY|SIF_CARGO)) + else if (Ship_info[shipp->ship_info_index].flags[Ship::Info_Flags::Navbuoy] || Ship_info[shipp->ship_info_index].flags[Ship::Info_Flags::Cargo]) { *blip_color = &Radar_colors[RCOL_NAVBUOY_CARGO][is_bright]; *blip_type = BLIP_TYPE_NAVBUOY_CARGO; @@ -306,7 +306,7 @@ void radar_plot_object( object *objp ) if (objp->type == OBJ_SHIP) { // ships specifically hidden from sensors - if (Ships[objp->instance].flags & SF_HIDDEN_FROM_SENSORS) + if (Ships[objp->instance].flags[Ship::Ship_Flags::Hidden_from_sensors]) b->flags |= BLIP_DRAW_DISTORTED; // determine if its AWACS distorted @@ -326,9 +326,9 @@ void radar_plot_object( object *objp ) // don't distort the sensor blips if the player has primitive sensors and the nebula effect // is not active - if (Player_ship->flags2 & SF2_PRIMITIVE_SENSORS) + if (Player_ship->flags[Ship::Ship_Flags::Primitive_sensors]) { - if (!(The_mission.flags & MISSION_FLAG_FULLNEB)) + if (!(The_mission.flags[Mission::Mission_Flags::Fullneb])) b->flags &= ~BLIP_DRAW_DISTORTED; } @@ -499,7 +499,7 @@ RadarVisibility radar_is_visible( object *objp ) { Assert( objp != NULL ); - if (objp->flags & OF_SHOULD_BE_DEAD) + if (objp->flags[Object::Object_Flags::Should_be_dead]) { return NOT_VISIBLE; } @@ -534,11 +534,11 @@ RadarVisibility radar_is_visible( object *objp ) switch (objp->type) { case OBJ_SHIP: - if (Ships[objp->instance].flags2 & SF2_STEALTH) + if (Ships[objp->instance].flags[Ship::Ship_Flags::Stealth]) return NOT_VISIBLE; // Ships that are warp in in are not visible on the radar - if (Ships[objp->instance].flags & SF_ARRIVING_STAGE_1) + if (Ships[objp->instance].flags[Ship::Ship_Flags::Arriving_stage_1]) return NOT_VISIBLE; break; @@ -598,7 +598,7 @@ RadarVisibility radar_is_visible( object *objp ) if (objp->type == OBJ_SHIP) { // ships specifically hidden from sensors - if (Ships[objp->instance].flags & SF_HIDDEN_FROM_SENSORS) + if (Ships[objp->instance].flags[Ship::Ship_Flags::Hidden_from_sensors]) return DISTORTED; // determine if its AWACS distorted diff --git a/code/ship/afterburner.cpp b/code/ship/afterburner.cpp index d889a6c053..a5eee935df 100644 --- a/code/ship/afterburner.cpp +++ b/code/ship/afterburner.cpp @@ -84,11 +84,11 @@ void afterburners_start(object *objp) sip = &Ship_info[shipp->ship_info_index]; // bail if afterburners are locked - if (shipp->flags2 & SF2_AFTERBURNER_LOCKED) { + if (shipp->flags[Ship::Ship_Flags::Afterburner_locked]) { return; } - if ( (objp->flags & OF_PLAYER_SHIP) && (objp == Player_obj) ) { + if ( (objp->flags[Object::Object_Flags::Player_ship]) && (objp == Player_obj) ) { unsigned int now; now = timer_get_milliseconds(); @@ -110,7 +110,7 @@ void afterburners_start(object *objp) if (objp->phys_info.flags & PF_BOOSTER_ON) return; - if ( !(sip->flags & SIF_AFTERBURNER) ) { + if ( !(sip->flags[Ship::Info_Flags::Afterburner]) ) { return; } @@ -180,11 +180,11 @@ void afterburners_update(object *objp, float fl_frametime) Assert( shipp->ship_info_index >= 0 && shipp->ship_info_index < static_cast(Ship_info.size()) ); sip = &Ship_info[shipp->ship_info_index]; - if ( (objp->flags & OF_PLAYER_SHIP ) && (Game_mode & GM_DEAD) ) { + if ( (objp->flags[Object::Object_Flags::Player_ship] ) && (Game_mode & GM_DEAD) ) { return; } - if ( !(sip->flags & SIF_AFTERBURNER) ) { + if ( !(sip->flags[Ship::Info_Flags::Afterburner]) ) { return; // nothing to update, afterburners are not even on the ship } @@ -289,11 +289,11 @@ void afterburners_stop(object *objp, int key_released) Assert( shipp->ship_info_index >= 0 && shipp->ship_info_index < static_cast(Ship_info.size()) ); sip = &Ship_info[shipp->ship_info_index]; - if ( (objp->flags & OF_PLAYER_SHIP) && key_released ) { + if ( (objp->flags[Object::Object_Flags::Player_ship]) && key_released ) { objp->phys_info.flags &= ~PF_AFTERBURNER_WAIT; } - if ( !(sip->flags & SIF_AFTERBURNER) ) { + if ( !(sip->flags[Ship::Info_Flags::Afterburner]) ) { nprintf(("Warning","Ship type %s does not have afterburner capability\n", sip->name)); return; } diff --git a/code/ship/awacs.cpp b/code/ship/awacs.cpp index 4168404803..3faba0fed8 100644 --- a/code/ship/awacs.cpp +++ b/code/ship/awacs.cpp @@ -118,11 +118,11 @@ void awacs_update_all_levels() shipp = &Ships[Objects[moveup->objnum].instance]; // ignore dying, departing, or arriving ships - if ((shipp->flags & SF_DYING) || (shipp->flags & SF_DEPARTING) || (shipp->flags & SF_ARRIVING)) + if ((shipp->is_dying_or_departing() || shipp->is_arriving())) continue; // only look at ships that have awacs subsystems - if (!(Ship_info[shipp->ship_info_index].flags & SIF_HAS_AWACS)) + if (!(Ship_info[shipp->ship_info_index].flags[Ship::Info_Flags::Has_awacs])) continue; // traverse all subsystems @@ -178,7 +178,7 @@ float awacs_get_level(object *target, ship *viewer, int use_awacs) ship *shipp = NULL; ship_info *sip = NULL; - int viewer_has_primitive_sensors = (viewer->flags2 & SF2_PRIMITIVE_SENSORS); + int viewer_has_primitive_sensors = (viewer->flags[Ship::Ship_Flags::Primitive_sensors]); // calc distance from viewer to target vm_vec_sub(&dist_vec, &target->pos, &Objects[viewer->objnum].pos); @@ -207,13 +207,13 @@ float awacs_get_level(object *target, ship *viewer, int use_awacs) // Goober5000 shipp = &Ships[target->instance]; sip = &Ship_info[shipp->ship_info_index]; - stealth_ship = (shipp->flags2 & SF2_STEALTH); - friendly_stealth_invisible = (shipp->flags2 & SF2_FRIENDLY_STEALTH_INVIS); + stealth_ship = (shipp->flags[Ship::Ship_Flags::Stealth]); + friendly_stealth_invisible = (shipp->flags[Ship::Ship_Flags::Friendly_stealth_invis]); - check_huge_ship = (sip->flags & SIF_HUGE_SHIP); + check_huge_ship = (sip->is_huge_ship()); } - int nebula_enabled = (The_mission.flags & MISSION_FLAG_FULLNEB); + int nebula_enabled = (The_mission.flags[Mission::Mission_Flags::Fullneb]); // ships on the same team are always viewable if ((target->type == OBJ_SHIP) && (shipp->team == viewer->team)) @@ -370,15 +370,15 @@ void team_visibility_update() shipp = &Ships[ship_num]; // ignore dying, departing, or arriving ships - if ((shipp->flags & SF_DYING) || (shipp->flags & SF_DEPARTING) || (shipp->flags & SF_ARRIVING)) + if (shipp->is_dying_or_departing() || shipp->is_arriving()) continue; // check if ship is flagged as invisible - if (shipp->flags & SF_HIDDEN_FROM_SENSORS) + if (shipp->flags[Ship::Ship_Flags::Hidden_from_sensors]) continue; // check if ship is stealthed and friendly-invisible - if ((shipp->flags2 & SF2_STEALTH) && (shipp->flags2 & SF2_FRIENDLY_STEALTH_INVIS)) + if ((shipp->flags[Ship::Ship_Flags::Stealth]) && (shipp->flags[Ship::Ship_Flags::Friendly_stealth_invis])) continue; Ship_visibility_by_team[shipp->team][ship_num] = 1; @@ -419,7 +419,7 @@ void team_visibility_update() for (idx = 0; idx < cur_count; idx++) { // ignore nav buoys and cargo containers - if (Ship_info[Ships[cur_team_ships[idx]].ship_info_index].flags & (SIF_CARGO | SIF_NAVBUOY)) + if (Ship_info[Ships[cur_team_ships[idx]].ship_info_index].flags[Ship::Info_Flags::Cargo] || Ship_info[Ships[cur_team_ships[idx]].ship_info_index].flags[Ship::Info_Flags::Navbuoy]) { continue; } @@ -446,7 +446,7 @@ int ship_is_visible_by_team(object *target, ship *viewer) Assert(target->type == OBJ_SHIP); // not visible if viewer has primitive sensors - if (viewer->flags2 & SF2_PRIMITIVE_SENSORS) + if (viewer->flags[Ship::Ship_Flags::Primitive_sensors]) return 0; // not visible if out of range diff --git a/code/ship/shield.cpp b/code/ship/shield.cpp index 82d0715fbd..b25f9ef3d9 100644 --- a/code/ship/shield.cpp +++ b/code/ship/shield.cpp @@ -390,12 +390,12 @@ void render_shield(int shield_num) objp = &Objects[Shield_hits[shield_num].objnum]; - if (objp->flags & OF_NO_SHIELDS) { + if (objp->flags[Object::Object_Flags::No_shields]) { return; } // If this object didn't get rendered, don't render its shields. In fact, make the shield hit go away. - if (!(objp->flags & OF_WAS_RENDERED)) { + if (!(objp->flags[Object::Object_Flags::Was_rendered])) { Shield_hits[shield_num].type = SH_UNUSED; return; } @@ -412,7 +412,7 @@ void render_shield(int shield_num) // objp, shipp, and si are now setup correctly // If this ship is in its deathroll, make the shield hit effects go away faster. - if (shipp->flags & SF_DYING) { + if (shipp->flags[Ship::Ship_Flags::Dying]) { Shield_hits[shield_num].start_time -= fl2f(2*flFrametime); } @@ -446,7 +446,7 @@ void render_shield(int shield_num) bitmap_id = sa->first_frame + frame_num; float alpha = 0.9999f; - if(The_mission.flags & MISSION_FLAG_FULLNEB){ + if(The_mission.flags[Mission::Mission_Flags::Fullneb]){ alpha *= 0.85f; } @@ -724,7 +724,7 @@ void create_shield_explosion(int objnum, int model_num, matrix *orient, vec3d *c polymodel *pm; int i; - if (Objects[objnum].flags & OF_NO_SHIELDS) + if (Objects[objnum].flags[Object::Object_Flags::No_shields]) return; pm = model_get(model_num); @@ -872,7 +872,7 @@ void ship_draw_shield( object *objp) vec3d pnt; polymodel * pm; - if (objp->flags & OF_NO_SHIELDS) + if (objp->flags[Object::Object_Flags::No_shields]) return; Assert(objp->instance >= 0); @@ -976,7 +976,7 @@ int ship_is_shield_up( object *obj, int quadrant ) // Note: This is in the object's local reference frame. Do _not_ pass a vector in the world frame. int get_quadrant(vec3d *hit_pnt, object *shipobjp) { - if (shipobjp != NULL && Ship_info[Ships[shipobjp->instance].ship_info_index].flags2 & SIF2_MODEL_POINT_SHIELDS) { + if (shipobjp != NULL && Ship_info[Ships[shipobjp->instance].ship_info_index].flags[Ship::Info_Flags::Model_point_shields]) { int closest = -1; float closest_dist = FLT_MAX; diff --git a/code/ship/ship.cpp b/code/ship/ship.cpp index 6444bffbc9..9e9d9e3e8c 100755 --- a/code/ship/ship.cpp +++ b/code/ship/ship.cpp @@ -84,6 +84,8 @@ #include "weapon/swarm.h" #include "weapon/weapon.h" +using namespace Ship; + #ifdef MessageBox #undef MessageBox #endif @@ -264,61 +266,56 @@ flag_def_list Subsystem_flags[] = { const int Num_subsystem_flags = sizeof(Subsystem_flags)/sizeof(flag_def_list); -// NOTE: a var of: -// "0" means that it's a SIF_* flag -// "1" means that it's a SIF2_* flag -// "255" means that the option is obsolete and a warning should be generated -flag_def_list Ship_flags[] = { - { "no_collide", SIF_NO_COLLIDE, 0 }, - { "player_ship", SIF_PLAYER_SHIP, 0 }, - { "default_player_ship", SIF_DEFAULT_PLAYER_SHIP, 0 }, - { "repair_rearm", SIF_SUPPORT, 0 }, - { "cargo", SIF_CARGO, 0 }, - { "fighter", SIF_FIGHTER, 0 }, - { "bomber", SIF_BOMBER, 0 }, - { "transport", SIF_TRANSPORT, 0 }, - { "freighter", SIF_FREIGHTER, 0 }, - { "capital", SIF_CAPITAL, 0 }, - { "supercap", SIF_SUPERCAP, 0 }, - { "drydock", SIF_DRYDOCK, 0 }, - { "cruiser", SIF_CRUISER, 0 }, - { "navbuoy", SIF_NAVBUOY, 0 }, - { "sentrygun", SIF_SENTRYGUN, 0 }, - { "escapepod", SIF_ESCAPEPOD, 0 }, - { "stealth", SIF_STEALTH, 0 }, - { "no type", SIF_NO_SHIP_TYPE, 0 }, - { "ship copy", SIF_SHIP_COPY, 0 }, - { "in tech database", SIF_IN_TECH_DATABASE | SIF_IN_TECH_DATABASE_M, 0 }, - { "in tech database multi", SIF_IN_TECH_DATABASE_M, 0 }, - { "dont collide invisible", SIF_SHIP_CLASS_DONT_COLLIDE_INVIS, 0 }, - { "big damage", SIF_BIG_DAMAGE, 0 }, - { "corvette", SIF_CORVETTE, 0 }, - { "gas miner", SIF_GAS_MINER, 0 }, - { "awacs", SIF_AWACS, 0 }, - { "knossos", SIF_KNOSSOS_DEVICE, 0 }, - { "no_fred", SIF_NO_FRED, 0 }, - { "flash", SIF2_FLASH, 1 }, - { "surface shields", SIF2_SURFACE_SHIELDS, 1 }, - { "show ship", SIF2_SHOW_SHIP_MODEL, 1 }, - { "generate icon", SIF2_GENERATE_HUD_ICON, 1 }, - { "no weapon damage scaling", SIF2_DISABLE_WEAPON_DAMAGE_SCALING, 1 }, - { "gun convergence", SIF2_GUN_CONVERGENCE, 1 }, - { "no thruster geometry noise", SIF2_NO_THRUSTER_GEO_NOISE, 1 }, - { "intrinsic no shields", SIF2_INTRINSIC_NO_SHIELDS, 1 }, - { "dynamic primary linking", SIF2_DYN_PRIMARY_LINKING, 1 }, - { "no primary linking", SIF2_NO_PRIMARY_LINKING, 1 }, - { "no pain flash", SIF2_NO_PAIN_FLASH, 1 }, - { "no ets", SIF2_NO_ETS, 1 }, - { "no lighting", SIF2_NO_LIGHTING, 1 }, - { "auto spread shields", SIF2_AUTO_SPREAD_SHIELDS, 1 }, - { "model point shields", SIF2_MODEL_POINT_SHIELDS, 1 }, - { "repair disabled subsystems", SIF2_SUBSYS_REPAIR_WHEN_DISABLED, 1}, - - // to keep things clean, obsolete options go last - { "ballistic primaries", -1, 255 } +flag_def_list_new Ship_flags[] = { + { "no_collide", Info_Flags::No_collide, true, false }, + { "player_ship", Info_Flags::Player_ship, true, false }, + { "default_player_ship", Info_Flags::Default_player_ship, true, false }, + { "repair_rearm", Info_Flags::Support, true, false }, + { "cargo", Info_Flags::Cargo, true, false }, + { "fighter", Info_Flags::Fighter, true, false }, + { "bomber", Info_Flags::Bomber, true, false }, + { "transport", Info_Flags::Transport, true, false }, + { "freighter", Info_Flags::Freighter, true, false }, + { "capital", Info_Flags::Capital, true, false }, + { "supercap", Info_Flags::Supercap, true, false }, + { "drydock", Info_Flags::Drydock, true, false }, + { "cruiser", Info_Flags::Cruiser, true, false }, + { "navbuoy", Info_Flags::Navbuoy, true, false }, + { "sentrygun", Info_Flags::Sentrygun, true, false }, + { "escapepod", Info_Flags::Escapepod, true, false }, + { "stealth", Info_Flags::Stealth, true, false }, + { "no type", Info_Flags::No_ship_type, true, false }, + { "ship copy", Info_Flags::Ship_copy, true, false }, + { "in tech database", Info_Flags::In_tech_database, true, false }, + { "in tech database multi", Info_Flags::In_tech_database_m, true, false }, + { "dont collide invisible", Info_Flags::Ship_class_dont_collide_invis, true, false }, + { "big damage", Info_Flags::Big_damage, true, false }, + { "corvette", Info_Flags::Corvette, true, false }, + { "gas miner", Info_Flags::Gas_miner, true, false }, + { "awacs", Info_Flags::Awacs, true, false }, + { "knossos", Info_Flags::Knossos_device, true, false }, + { "no_fred", Info_Flags::No_fred, true, false }, + { "flash", Info_Flags::Flash, true, false }, + { "surface shields", Info_Flags::Surface_shields, true, false }, + { "show ship", Info_Flags::Show_ship_model, true, false }, + { "generate icon", Info_Flags::Generate_hud_icon, true, false }, + { "no weapon damage scaling", Info_Flags::Disable_weapon_damage_scaling, true, false }, + { "gun convergence", Info_Flags::Gun_convergence, true, false }, + { "no thruster geometry noise", Info_Flags::No_thruster_geo_noise, true, false }, + { "intrinsic no shields", Info_Flags::Intrinsic_no_shields, true, false }, + { "dynamic primary linking", Info_Flags::Dyn_primary_linking, true, false }, + { "no primary linking", Info_Flags::No_primary_linking, true, false }, + { "no pain flash", Info_Flags::No_pain_flash, true, false }, + { "no ets", Info_Flags::No_ets, true, false }, + { "no lighting", Info_Flags::No_lighting, true, false }, + { "auto spread shields", Info_Flags::Auto_spread_shields, true, false }, + { "model point shields", Info_Flags::Model_point_shields, true, false }, + { "repair disabled subsystems", Info_Flags::Subsys_repair_when_disabled, true, false}, + // to keep things clean, obsolete options go last + { "ballistic primaries", Info_Flags::Ballistic_primaries, false, false } }; -const int Num_ship_flags = sizeof(Ship_flags) / sizeof(flag_def_list); +const size_t Num_ship_flags = sizeof(Ship_flags) / sizeof(flag_def_list_new); /* ++Here be dragons.. err.. begins the section for the ai targeting revision @@ -335,20 +332,21 @@ flag_def_list ai_tgt_objects[] = { const int num_ai_tgt_objects = sizeof(ai_tgt_objects) / sizeof(flag_def_list); -flag_def_list ai_tgt_obj_flags[] = { - { "no shields", OF_NO_SHIELDS, 0 }, - { "targetable as bomb", OF_TARGETABLE_AS_BOMB, 0 } +flag_def_list_new ai_tgt_obj_flags[] = { + { "no shields", Object::Object_Flags::No_shields, true, false }, + { "targetable as bomb", Object::Object_Flags::Targetable_as_bomb, true, false } }; -const int num_ai_tgt_obj_flags = sizeof(ai_tgt_obj_flags) / sizeof(flag_def_list); +const int num_ai_tgt_obj_flags = sizeof(ai_tgt_obj_flags) / sizeof(flag_def_list_new); -flag_def_list ai_tgt_ship_flags[] = { - { "afterburners", SIF_AFTERBURNER, 0 }, - { "big damage", SIF_BIG_DAMAGE, 0 }, - { "has awacs", SIF_HAS_AWACS, 0 } + +flag_def_list_new ai_tgt_ship_flags[] = { + { "afterburners", Ship::Info_Flags::Afterburner, true, false }, + { "big damage", Ship::Info_Flags::Big_damage, true, false }, + { "has awacs", Ship::Info_Flags::Has_awacs, true, false } }; -const int num_ai_tgt_ship_flags = sizeof(ai_tgt_ship_flags) / sizeof(flag_def_list); +const int num_ai_tgt_ship_flags = sizeof(ai_tgt_ship_flags) / sizeof(flag_def_list_new); flag_def_list ai_tgt_weapon_flags[] = { { "bomb", WIF_BOMB, 0 }, @@ -369,25 +367,24 @@ flag_def_list ai_tgt_weapon_flags[] = { // Constant for flag, Name of flag, In flags or flags2 // When adding new flags remember to bump MAX_SHIP_FLAG_NAMES in ship.h ship_flag_name Ship_flag_names[] = { - {SF_VAPORIZE, "vaporize", 1, }, - {SF_WARP_BROKEN, "break-warp", 1, }, - {SF_WARP_NEVER, "never-warp", 1, }, - {SF_SCANNABLE, "scannable", 1, }, - {SF_CARGO_REVEALED, "cargo-known", 1, }, - {SF_HIDDEN_FROM_SENSORS, "hidden-from-sensors", 1, }, - {SF2_STEALTH, "stealth", 2, }, - {SF2_FRIENDLY_STEALTH_INVIS, "friendly-stealth-invisible", 2, }, - {SF2_HIDE_SHIP_NAME, "hide-ship-name", 2, }, - {SF2_PRIMITIVE_SENSORS, "primitive-sensors", 2, }, - {SF2_AFTERBURNER_LOCKED, "afterburners-locked", 2, }, - {SF2_PRIMARIES_LOCKED, "primaries-locked", 2, }, - {SF2_SECONDARIES_LOCKED, "secondaries-locked", 2, }, - {SF2_NO_SUBSPACE_DRIVE, "no-subspace-drive", 2, }, - {SF2_DONT_COLLIDE_INVIS, "don't-collide-invisible", 2, }, - {SF2_NO_ETS, "no-ets", 2, }, - {SF2_TOGGLE_SUBSYSTEM_SCANNING, "toggle-subsystem-scanning", 2, }, - {SF2_NO_SECONDARY_LOCKON, "no-secondary-lock-on", 2, }, - {SF2_NO_DISABLED_SELF_DESTRUCT, "no-disabled-self-destruct", 2, }, + { Ship_Flags::Vaporize, "vaporize" }, + { Ship_Flags::Warp_broken, "break-warp" }, + { Ship_Flags::Warp_never, "never-warp" }, + { Ship_Flags::Scannable, "scannable" }, + { Ship_Flags::Cargo_revealed, "cargo-known" }, + { Ship_Flags::Hidden_from_sensors, "hidden-from-sensors" }, + { Ship_Flags::Stealth, "stealth" }, + { Ship_Flags::Friendly_stealth_invis, "friendly-stealth-invisible" }, + { Ship_Flags::Hide_ship_name, "hide-ship-name" }, + { Ship_Flags::Afterburner_locked, "afterburners-locked" }, + { Ship_Flags::Primaries_locked, "primaries-locked" }, + { Ship_Flags::Secondaries_locked, "secondaries-locked" }, + { Ship_Flags::No_subspace_drive, "no-subspace-drive" }, + { Ship_Flags::Dont_collide_invis, "don't-collide-invisible" }, + { Ship_Flags::No_ets, "no-ets" }, + { Ship_Flags::Toggle_subsystem_scanning, "toggle-subsystem-scanning" }, + { Ship_Flags::No_secondary_lockon, "no-secondary-lock-on"}, + { Ship_Flags::No_disabled_self_destruct, "no-disabled-self-destruct"}, }; const int num_ai_tgt_weapon_flags = sizeof(ai_tgt_weapon_flags) / sizeof(flag_def_list); @@ -738,7 +735,6 @@ void ship_info::clone(const ship_info& other) warpout_player_speed = other.warpout_player_speed; flags = other.flags; - flags2 = other.flags2; ai_class = other.ai_class; max_speed = other.max_speed; min_speed = other.min_speed; @@ -1045,7 +1041,6 @@ void ship_info::move(ship_info&& other) warpout_player_speed = other.warpout_player_speed; flags = other.flags; - flags2 = other.flags2; ai_class = other.ai_class; max_speed = other.max_speed; min_speed = other.min_speed; @@ -1368,8 +1363,7 @@ ship_info::ship_info() warpout_player_speed = 0.0f; - flags = SIF_DEFAULT_VALUE; - flags2 = SIF2_DEFAULT_VALUE; + flags.reset(); ai_class = 0; max_speed = 0.0f; min_speed = 0.0f; @@ -3044,7 +3038,7 @@ int parse_ship_values(ship_info* sip, const bool is_template, const bool first_t if(optional_string("$Show Primary Models:")) { - sip->flags2 |= SIF2_DRAW_WEAPON_MODELS; + sip->flags.set(Ship::Info_Flags::Draw_weapon_models); stuff_bool_list(sip->draw_primary_models, sip->num_primary_banks); } @@ -3057,7 +3051,7 @@ int parse_ship_values(ship_info* sip, const bool is_template, const bool first_t if(optional_string("$Show Secondary Models:")) { - sip->flags2 |= SIF2_DRAW_WEAPON_MODELS; + sip->flags.set(Ship::Info_Flags::Draw_weapon_models); stuff_bool_list(sip->draw_secondary_models, sip->num_secondary_banks); } @@ -3250,8 +3244,11 @@ int parse_ship_values(ship_info* sip, const bool is_template, const bool first_t if (!optional_string("+noreplace")) { // clear flags since we might have a modular table // clear only those which are actually set in the flags - sip->flags = (sip->flags & SIF_MASK); - sip->flags2 = (sip->flags2 & SIF2_MASK); + bool has_afterburner = sip->flags[Ship::Info_Flags::Afterburner]; + bool draw_weapon_models = sip->flags[Ship::Info_Flags::Draw_weapon_models]; + sip->flags.reset(); + sip->flags.set(Ship::Info_Flags::Afterburner, has_afterburner); + sip->flags.set(Ship::Info_Flags::Draw_weapon_models, draw_weapon_models); } for (i = 0; i < num_strings; i++) @@ -3282,16 +3279,14 @@ int parse_ship_values(ship_info* sip, const bool is_template, const bool first_t sip->class_type = ship_type_index; // check various ship flags - for (int idx = 0; idx < Num_ship_flags; idx++) { + for (size_t idx = 0; idx < Num_ship_flags; idx++) { if ( !stricmp(Ship_flags[idx].name, ship_strings[i]) ) { flag_found = true; - if (Ship_flags[idx].var == 255) + if (!Ship_flags[idx].in_use) Warning(LOCATION, "Use of '%s' flag for %s '%s' - this flag is no longer needed.", Ship_flags[idx].name, info_type_name, sip->name); - else if (Ship_flags[idx].var == 0) - sip->flags |= Ship_flags[idx].def; - else if (Ship_flags[idx].var == 1) - sip->flags2 |= Ship_flags[idx].def; + else + sip->flags.set(Ship_flags[idx].def); } } @@ -3300,10 +3295,10 @@ int parse_ship_values(ship_info* sip, const bool is_template, const bool first_t } // set original status of tech database flags - Goober5000 - if (sip->flags & SIF_IN_TECH_DATABASE) - sip->flags2 |= SIF2_DEFAULT_IN_TECH_DATABASE; - if (sip->flags & SIF_IN_TECH_DATABASE_M) - sip->flags2 |= SIF2_DEFAULT_IN_TECH_DATABASE_M; + if (sip->flags[Info_Flags::In_tech_database]) + sip->flags.set(Info_Flags::Default_in_tech_database); + if (sip->flags[Info_Flags::In_tech_database_m]) + sip->flags.set(Info_Flags::Default_in_tech_database_m); } // Goober5000 - ensure number of banks checks out @@ -3327,7 +3322,7 @@ int parse_ship_values(ship_info* sip, const bool is_template, const bool first_t } } - sip->flags &= ~SIF_BALLISTIC_PRIMARIES; + sip->flags.remove(Ship::Info_Flags::Ballistic_primaries); //Set ship ballistic flag if necessary for (i = 0; i < MAX_SHIP_PRIMARY_BANKS; i++) @@ -3336,7 +3331,7 @@ int parse_ship_values(ship_info* sip, const bool is_template, const bool first_t { if(sip->allowed_bank_restricted_weapons[i][j] && (Weapon_info[j].wi_flags2 & WIF2_BALLISTIC)) { - sip->flags |= SIF_BALLISTIC_PRIMARIES; + sip->flags.set(Ship::Info_Flags::Ballistic_primaries); break; } } @@ -3353,7 +3348,7 @@ int parse_ship_values(ship_info* sip, const bool is_template, const bool first_t if ( has_afterburner == 1 ) { - sip->flags |= SIF_AFTERBURNER; + sip->flags.set(Ship::Info_Flags::Afterburner); if(optional_string("+Aburn Max Vel:")) { stuff_vec3d(&sip->afterburner_max_vel); @@ -3721,12 +3716,11 @@ int parse_ship_values(ship_info* sip, const bool is_template, const bool first_t // if the ship is a stealth ship if ( optional_string("$Stealth:") ) { - sip->flags |= SIF_STEALTH; - } - + sip->flags.set(Ship::Info_Flags::Stealth); + } else if ( optional_string("$Stealth") ) { Warning(LOCATION, "%s '%s' is missing the colon after \"$Stealth\". Note that you may also use the ship flag \"stealth\".", info_type_name, sip->name); - sip->flags |= SIF_STEALTH; + sip->flags.set(Ship::Info_Flags::Stealth); } if ( optional_string("$max decals:") ){ @@ -4199,7 +4193,7 @@ int parse_ship_values(ship_info* sip, const bool is_template, const bool first_t sfo_return = stuff_float_optional(&sp->awacs_intensity); if(sfo_return > 0) stuff_float_optional(&sp->awacs_radius); - sip->flags |= SIF_HAS_AWACS; + sip->flags.set(Ship::Info_Flags::Has_awacs); } if(optional_string("$Maximum Barrel Elevation:")){ @@ -4322,7 +4316,7 @@ int parse_ship_values(ship_info* sip, const bool is_template, const bool first_t //If we've set any subsystem as landable, set a ship-info flag as a shortcut for later if (sp->flags & MSS_FLAG_ALLOW_LANDING) - sip->flags2 |= SIF2_ALLOW_LANDINGS; + sip->flags.set(Ship::Info_Flags::Allow_landings); } if (turret_has_base_fov) @@ -4361,7 +4355,7 @@ int parse_ship_values(ship_info* sip, const bool is_template, const bool first_t if ((sp->flags2 & MSS_FLAG2_AUTOREPAIR_IF_DISABLED) && (sp->flags2 & MSS_FLAG2_NO_AUTOREPAIR_IF_DISABLED)) { Warning(LOCATION, "\"autorepair if disabled\" flag used with \"don't autorepair if disabled\" flag on a subsystem on %s '%s'.\nWhichever flag would be default behavior anyway for this ship has been removed.\n", info_type_name, sip->name); - if (sip->flags2 & SIF2_SUBSYS_REPAIR_WHEN_DISABLED){ + if (sip->flags[Ship::Info_Flags::Subsys_repair_when_disabled]){ sp->flags2 &= ~MSS_FLAG2_AUTOREPAIR_IF_DISABLED; } else { sp->flags2 &= ~MSS_FLAG2_NO_AUTOREPAIR_IF_DISABLED; @@ -4886,9 +4880,9 @@ void ship_set_default_player_ship() return; // find the first with the default flag - for(auto it = Ship_info.cbegin(); it != Ship_info.end(); ++it) + for (auto it = Ship_info.cbegin(); it != Ship_info.end(); ++it) { - if(it->flags & SIF_DEFAULT_PLAYER_SHIP) + if(it->flags[Ship::Info_Flags::Default_player_ship]) { strcpy_s(default_player_ship, it->name); return; @@ -4896,9 +4890,9 @@ void ship_set_default_player_ship() } // find the first player ship - for(auto it = Ship_info.cbegin(); it != Ship_info.cend(); ++it) + for (auto it = Ship_info.cbegin(); it != Ship_info.end(); ++it) { - if(it->flags & SIF_PLAYER_SHIP) + if(it->flags[Ship::Info_Flags::Player_ship]) { strcpy_s(default_player_ship, it->name); return; @@ -5006,7 +5000,7 @@ void ship_parse_post_cleanup() // be friendly; ensure ballistic flags check out if (pbank_capacity_specified) { - if ( !(sip->flags & SIF_BALLISTIC_PRIMARIES) ) { + if ( !(sip->flags[Ship::Info_Flags::Ballistic_primaries]) ) { Warning(LOCATION, "Pbank capacity specified for non-ballistic-primary-enabled ship %s.\nResetting capacities to 0.\nTo fix this, add a ballistic primary to the list of allowed primaries.\n", sip->name); for (j = 0; j < MAX_SHIP_PRIMARY_BANKS; j++) { @@ -5014,7 +5008,7 @@ void ship_parse_post_cleanup() } } } else { - if (sip->flags & SIF_BALLISTIC_PRIMARIES) { + if (sip->flags[Ship::Info_Flags::Ballistic_primaries]) { Warning(LOCATION, "Pbank capacity not specified for ballistic-primary-enabled ship %s.\nDefaulting to capacity of 1 per bank.\n", sip->name); for (j = 0; j < MAX_SHIP_PRIMARY_BANKS; j++) { @@ -5026,15 +5020,15 @@ void ship_parse_post_cleanup() // ultra stupid compatbility handling for the once broken "generate hud" flag. // it was previously testing the afterburner flag, so that's what we check for that - if ( (sip->shield_icon_index == 255) && (sip->flags & SIF_AFTERBURNER) - && !(sip->flags2 & SIF2_GENERATE_HUD_ICON) && (sip->flags & SIF_PLAYER_SHIP) ) + if ( (sip->shield_icon_index == 255) && (sip->flags[Ship::Info_Flags::Afterburner]) + && !(sip->flags[Ship::Info_Flags::Generate_hud_icon]) && (sip->flags[Ship::Info_Flags::Player_ship]) ) { Warning(LOCATION, "Compatibility warning:\nNo shield icon specified for '%s' but the \"generate icon\" flag is not specified.\nEnabling flag by default.\n", sip->name); - sip->flags2 |= SIF2_GENERATE_HUD_ICON; + sip->flags.set(Ship::Info_Flags::Generate_hud_icon); } // if we have a ship copy, then check to be sure that our base ship exists - if (sip->flags & SIF_SHIP_COPY) + if (sip->flags[Ship::Info_Flags::Ship_copy]) { strcpy_s(name_tmp, sip->name); @@ -5043,20 +5037,20 @@ void ship_parse_post_cleanup() if (ship_info_lookup(name_tmp) < 0) { Warning(LOCATION, "Ship %s is a copy, but base ship %s couldn't be found.", sip->name, name_tmp); - sip->flags &= ~SIF_SHIP_COPY; + sip->flags.remove(Ship::Info_Flags::Ship_copy); } } else { Warning(LOCATION, "Ship %s is defined as a copy (ship flag 'ship copy' is set), but is not named like one (no '#').\n", sip->name); - sip->flags &= ~SIF_SHIP_COPY; + sip->flags.remove(Ship::Info_Flags::Ship_copy); } } // very low rotational velocity values disable rotational collisions // warn early rather than ambush the modder @ runtime (unless the ship is also no-collide!) // the 2nd part of this check is duplicated from collideshipship.cpp:ship_ship_check_collision() - if (!(sip->flags & SIF_NO_COLLIDE) && (vm_vec_mag_squared( &sip->max_rotvel ) * .04) >= (PI*PI/4)) + if (!(sip->flags[Ship::Info_Flags::No_collide]) && (vm_vec_mag_squared( &sip->max_rotvel ) * .04) >= (PI*PI/4)) { Warning(LOCATION, "$Rotation time: too low; this will disable rotational collisions. All three variables should be >= 1.39.\nFix this in ship '%s'\n", sip->name); } @@ -5087,7 +5081,7 @@ void ship_parse_post_cleanup() if (n_tgt_groups > 0) { for(i = 0; i < n_tgt_groups; i++) { - if (!(Ai_tp_list[i].obj_flags || Ai_tp_list[i].sif_flags || Ai_tp_list[i].sif2_flags || Ai_tp_list[i].wif2_flags || Ai_tp_list[i].wif_flags)) { + if (!(Ai_tp_list[i].obj_flags.any_set() || Ai_tp_list[i].sif_flags.any_set() || Ai_tp_list[i].wif2_flags || Ai_tp_list[i].wif_flags)) { //had none of these, check next if (Ai_tp_list[i].obj_type == -1) { //didn't have this one @@ -5316,7 +5310,7 @@ void ship_add_exited_ship( ship *sp, int reason ) entry.team = sp->team; entry.flags = reason; // if ship is red alert, flag as such - if (sp->flags & SF_RED_ALERT_STORE_STATUS) { + if (sp->flags[Ship_Flags::Red_alert_store_status]) { entry.flags |= SEF_RED_ALERT_CARRY; } entry.time = Missiontime; @@ -5325,7 +5319,7 @@ void ship_add_exited_ship( ship *sp, int reason ) entry.cargo1 = sp->cargo1; entry.time_cargo_revealed = (fix)0; - if ( sp->flags & SF_CARGO_REVEALED ) + if ( sp->flags[Ship_Flags::Cargo_revealed] ) { entry.flags |= SEF_CARGO_KNOWN; entry.time_cargo_revealed = sp->time_cargo_revealed; @@ -5666,8 +5660,7 @@ void ship::clear() current_max_speed = 0.0f; next_manage_ets = timestamp(0); - flags = 0; - flags2 = 0; + flags.reset(); reinforcement_index = -1; afterburner_fuel = 0.0f; @@ -5920,7 +5913,7 @@ void ship_set(int ship_index, int objnum, int ship_type) shield_set_strength(objp, shipp->ship_max_shield_strength * shipp->max_shield_recharge); } - if (sip->flags2 & SIF2_MODEL_POINT_SHIELDS) { + if (sip->flags[Ship::Info_Flags::Model_point_shields]) { objp->n_quadrants = pm->shield_points.size(); shipp->shield_points = pm->shield_points; objp->shield_quadrant.resize(objp->n_quadrants); @@ -5943,21 +5936,24 @@ void ship_set(int ship_index, int objnum, int ship_type) shipp->current_max_speed = Ship_info[ship_type].max_speed; - shipp->flags |= SF_ENGINES_ON; + shipp->flags.set(Ship_Flags::Engines_on); // set certain flags that used to be in ship_info - Goober5000 - if (sip->flags & SIF_STEALTH) - shipp->flags2 |= SF2_STEALTH; - if (sip->flags & SIF_SHIP_CLASS_DONT_COLLIDE_INVIS) - shipp->flags2 |= SF2_DONT_COLLIDE_INVIS; - - if (sip->flags & SIF_NO_COLLIDE) - obj_set_flags(objp, objp->flags & ~OF_COLLIDES); + if (sip->flags[Ship::Info_Flags::Stealth]) + shipp->flags.set(Ship_Flags::Stealth); + if (sip->flags[Ship::Info_Flags::Ship_class_dont_collide_invis]) + shipp->flags.set(Ship_Flags::Dont_collide_invis); + + auto obj_flags = objp->flags; + if (sip->flags[Ship::Info_Flags::No_collide]) + obj_flags.remove(Object::Object_Flags::Collides); else - obj_set_flags(objp, objp->flags | OF_COLLIDES); + obj_flags.set(Object::Object_Flags::Collides); - if (sip->flags2 & SIF2_NO_ETS) - shipp->flags2 |= SF2_NO_ETS; + obj_set_flags(objp, obj_flags); + + if (sip->flags[Ship::Info_Flags::No_ets]) + shipp->flags.set(Ship_Flags::No_ets); shipp->afterburner_fuel = sip->afterburner_fuel_capacity; @@ -6118,9 +6114,9 @@ void ship_recalc_subsys_strength( ship *shipp ) // set any ship flags which should be set. unset the flags since we might be repairing a subsystem // through sexpressions. if ( (shipp->subsys_info[SUBSYSTEM_ENGINE].type_count > 0) && (shipp->subsys_info[SUBSYSTEM_ENGINE].aggregate_current_hits <= 0.0f) ) { - shipp->flags |= SF_DISABLED; - } else { - shipp->flags &= ~SF_DISABLED; + shipp->flags.set(Ship_Flags::Disabled); + } else { + shipp->flags.remove(Ship_Flags::Disabled); ship_reset_disabled_physics( &Objects[shipp->objnum], shipp->ship_info_index ); } } @@ -6138,7 +6134,7 @@ void ship_copy_subsystem_fixup(ship_info *sip) // no point copying the subsystem data if the ship in question has none... // mark that the ship (cargo container) has the path fixup done. if (sip->n_subsystems == 0) { - sip->flags |= SIF_PATH_FIXUP; + sip->flags.set(Ship::Info_Flags::Path_fixup); return; } @@ -6165,7 +6161,7 @@ void ship_copy_subsystem_fixup(ship_info *sip) // if none were found try finding a another ship to copy the data from continue; } - sip->flags |= SIF_PATH_FIXUP; + sip->flags.set(Ship::Info_Flags::Path_fixup); break; } @@ -6647,7 +6643,7 @@ void ship_find_warping_ship_helper(object *objp, dock_function_info *infop) return; // am I arriving or departing by warp? - if ( Ships[objp->instance].flags & (SF_ARRIVING|SF_DEPART_WARP) ) + if (Ships[objp->instance].is_arriving() || Ships[objp->instance].flags[Ship_Flags::Depart_warp]) { #ifndef NDEBUG // in debug builds, make sure only one of the docked objects has these flags set @@ -7180,7 +7176,7 @@ void ship_wing_cleanup( int shipnum, wing *wingp ) if ((Game_mode & GM_MULTIPLAYER) && (Net_player->flags & NETINFO_FLAG_INGAME_JOIN)) continue; - if ((Ships[Objects[so->objnum].instance].wingnum == WING_INDEX(wingp)) && !(Ships[Objects[so->objnum].instance].flags & (SF_DEPARTING|SF_DYING))) + if ((Ships[Objects[so->objnum].instance].wingnum == WING_INDEX(wingp)) && !(Ships[Objects[so->objnum].instance].is_dying_or_departing())) { // TODO: I think this Int3() is triggered when a wing whose ships are all docked to ships of another // wing departs. It can be reliably seen in TVWP chapter 1 mission 7, when Torino and Iota wing depart. @@ -7200,7 +7196,7 @@ void ship_wing_cleanup( int shipnum, wing *wingp ) void ship_actually_depart_helper(object *objp, dock_function_info *infop) { // do standard departure stuff first - objp->flags |= OF_SHOULD_BE_DEAD; + objp->flags.set(Object::Object_Flags::Should_be_dead); if (objp->type == OBJ_SHIP) ship_cleanup(objp->instance, infop->parameter_variables.bool_value ? SHIP_VANISHED : SHIP_DEPARTED); @@ -7242,7 +7238,7 @@ void ship_destroy_instantly(object *ship_objp, int shipnum) Script_system.RunCondition(CHA_DEATH, 0, NULL, ship_objp); Script_system.RemHookVar("Self"); - ship_objp->flags |= OF_SHOULD_BE_DEAD; + ship_objp->flags.set(Object::Object_Flags::Should_be_dead); ship_cleanup(shipnum,SHIP_DESTROYED); } @@ -7255,7 +7251,7 @@ void ship_cleanup(int shipnum, int cleanup_mode) Assert(shipnum >= 0 && shipnum < MAX_SHIPS); Assert(cleanup_mode == SHIP_DESTROYED || cleanup_mode == SHIP_DEPARTED || cleanup_mode == SHIP_VANISHED); Assert(Objects[Ships[shipnum].objnum].type == OBJ_SHIP); - Assert(Objects[Ships[shipnum].objnum].flags & OF_SHOULD_BE_DEAD); + Assert(Objects[Ships[shipnum].objnum].flags[Object::Object_Flags::Should_be_dead]); ship *shipp = &Ships[shipnum]; object *objp = &Objects[shipp->objnum]; @@ -7272,7 +7268,7 @@ void ship_cleanup(int shipnum, int cleanup_mode) // determine if we need to count this ship as a kill in counting number of kills per ship type // look at the ignore flag for the ship (if not in a wing), or the ignore flag for the wing // (if the ship is in a wing), and add to the kill count if the flags are not set - if ( !(shipp->flags & SF_IGNORE_COUNT) || ((shipp->wingnum != -1) && !(Wings[shipp->wingnum].flags & WF_IGNORE_COUNT)) ) + if ( !(shipp->flags[Ship_Flags::Ignore_count]) || ((shipp->wingnum != -1) && !(Wings[shipp->wingnum].flags & WF_IGNORE_COUNT)) ) ship_add_ship_type_kill_count( shipp->ship_info_index ); // let the event music system know an enemy was destroyed (important for deciding when to transition from battle to normal music) @@ -7466,7 +7462,7 @@ void ship_blow_up_area_apply_blast( object *exp_objp) // don't blast navbuoys if ( objp->type == OBJ_SHIP ) { - if ( ship_get_SIF(objp->instance) & SIF_NAVBUOY ) { + if ( ship_get_SIF(objp->instance)[Ship::Info_Flags::Navbuoy] ) { continue; } } @@ -7569,9 +7565,9 @@ void ship_dying_frame(object *objp, int ship_num) { ship *shipp = &Ships[ship_num]; - if ( shipp->flags & SF_DYING ) { + if ( shipp->flags[Ship_Flags::Dying] ) { ship_info *sip = &Ship_info[shipp->ship_info_index]; - int knossos_ship = (sip->flags & SIF_KNOSSOS_DEVICE); + bool knossos_ship = (sip->flags[Ship::Info_Flags::Knossos_device]); // bash hull value toward 0 (from self destruct) if (objp->hull_strength > 0) { @@ -7582,7 +7578,7 @@ void ship_dying_frame(object *objp, int ship_num) } // special case of VAPORIZE - if (shipp->flags & SF_VAPORIZE) { + if (shipp->flags[Ship_Flags::Vaporize]) { if (timestamp_elapsed(shipp->final_death_time)) { // play death sound snd_play_3d( &Snds[SND_VAPORIZED], &objp->pos, &View_position, objp->radius, NULL, 0, 1.0f, SND_PRIORITY_MUST_PLAY ); @@ -7603,7 +7599,7 @@ void ship_dying_frame(object *objp, int ship_num) } // mark object as dead - objp->flags |= OF_SHOULD_BE_DEAD; + objp->flags.set(Object::Object_Flags::Should_be_dead); // Don't blow up model. Only use debris shards. // call ship function to clean up after the ship is destroyed. @@ -7772,7 +7768,7 @@ void ship_dying_frame(object *objp, int ship_num) } else { - if ( sip->flags & (SIF_CAPITAL | SIF_KNOSSOS_DEVICE) ) { + if (sip->flags[Info_Flags::Capital] || sip->flags[Info_Flags::Knossos_device]) { sound_index=SND_CAPSHIP_EXPLODE; } else { if ( OBJ_INDEX(objp) & 1 ) { @@ -7865,7 +7861,7 @@ void ship_dying_frame(object *objp, int ship_num) shipp->end_death_time = shipp->really_final_death_time = timestamp( fl2i(explosion_life*1000.0f)/5 ); // Wait till 30% of vclip time before breaking the ship up. } - shipp->flags |= SF_EXPLODED; + shipp->flags.set(Ship_Flags::Exploded); if ( !(ship_get_exp_propagates(shipp)) ) { // apply area of effect blast damage from ship explosion @@ -7895,7 +7891,7 @@ void ship_dying_frame(object *objp, int ship_num) gameseq_post_event(GS_EVENT_DEATH_BLEW_UP); } - objp->flags |= OF_SHOULD_BE_DEAD; + objp->flags.set(Object::Object_Flags::Should_be_dead); ship_cleanup(ship_num, SHIP_DESTROYED); // call ship function to clean up after the ship is destroyed. } @@ -7909,7 +7905,7 @@ void ship_dying_frame(object *objp, int ship_num) gameseq_post_event(GS_EVENT_DEATH_BLEW_UP); } - objp->flags |= OF_SHOULD_BE_DEAD; + objp->flags.set(Object::Object_Flags::Should_be_dead); ship_cleanup(ship_num, SHIP_DESTROYED); // call ship function to clean up after the ship is destroyed. shipp->really_final_death_time = timestamp( -1 ); // Never time out again! @@ -7917,8 +7913,8 @@ void ship_dying_frame(object *objp, int ship_num) // If a ship is dying (and not a capital or big ship) then stutter the engine sound if ( timestamp_elapsed(shipp->next_engine_stutter) ) { - if ( !(sip->flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP)) ) { - shipp->flags ^= SF_ENGINES_ON; // toggle state of engines + if ( !(sip->is_big_or_huge()) ) { + shipp->flags.toggle(Ship_Flags::Engines_on); // toggle state of engines shipp->next_engine_stutter = timestamp_rand(50, 250); } } @@ -7930,7 +7926,7 @@ void ship_chase_shield_energy_targets(ship *shipp, object *obj, float frametime) float delta; ship_info *sip; - if (shipp->flags & SF_DYING) + if (shipp->flags[Ship_Flags::Dying]) return; sip = &Ship_info[shipp->ship_info_index]; @@ -8217,7 +8213,7 @@ void ship_auto_repair_frame(int shipnum, float frametime) // only allow for the auto-repair of subsystems on small ships //...NOT. Check if var has been changed from def -C - if ( !(sip->flags & SIF_SMALL_SHIP) && sip->subsys_repair_rate == -2.0f) + if ( !(sip->is_small_ship()) && sip->subsys_repair_rate == -2.0f) return; if(sip->subsys_repair_rate == -2.0f) @@ -8241,7 +8237,7 @@ void ship_auto_repair_frame(int shipnum, float frametime) continue; if ( ssp->current_hits <= 0 ) { - if (sip->flags2 & SIF2_SUBSYS_REPAIR_WHEN_DISABLED) { + if (sip->flags[Ship::Info_Flags::Subsys_repair_when_disabled]) { if (ssp->flags & SSF_NO_AUTOREPAIR_IF_DISABLED) { continue; } @@ -8267,8 +8263,8 @@ void ship_auto_repair_frame(int shipnum, float frametime) // check to see if this subsystem was totally non functional before -- if so, then // reset the flags - if ( (ssp->system_info->type == SUBSYSTEM_ENGINE) && (sp->flags & SF_DISABLED) ) { - sp->flags &= ~SF_DISABLED; + if ( (ssp->system_info->type == SUBSYSTEM_ENGINE) && (sp->flags[Ship_Flags::Disabled]) ) { + sp->flags.remove(Ship_Flags::Disabled); ship_reset_disabled_physics(objp, sp->ship_info_index); } } @@ -8431,7 +8427,7 @@ void ship_subsys_disrupted_check(ship *sp) if ( engines_disabled ) { if ( !(sp->subsys_disrupted_flags & (1<flags & SF_DISABLED) ) { + if ( !(sp->flags[Ship_Flags::Disabled]) ) { ship_reset_disabled_physics(&Objects[sp->objnum], sp->ship_info_index); } } @@ -8535,7 +8531,7 @@ void lethality_decay(ai_info *aip) aip->lethality = MAX(-10.0f, aip->lethality); #ifndef NDEBUG - if (Objects[Ships[aip->shipnum].objnum].flags & OF_PLAYER_SHIP) { + if (Objects[Ships[aip->shipnum].objnum].flags[Object::Object_Flags::Player_ship]) { if (Framecount % 10 == 0) { int num_turrets = 0; if ((aip->target_objnum != -1) && (Objects[aip->target_objnum].type == OBJ_SHIP)) { @@ -8638,7 +8634,7 @@ void ship_process_post(object * obj, float frametime) // AL 1-6-98: record the initial ammo counts for ships, which is used as the max limit for rearming // Goober5000 - added ballistics support - if ( !(shipp->flags & SF_AMMO_COUNT_RECORDED) ) + if ( !(shipp->flags[Ship_Flags::Ammo_count_recorded]) ) { int max_missiles; for ( int i=0; iflags & SIF_BALLISTIC_PRIMARIES ) + if ( sip->flags[Ship::Info_Flags::Ballistic_primaries] ) { for ( int i=0; iflags |= SF_AMMO_COUNT_RECORDED; + shipp->flags.set(Ship_Flags::Ammo_count_recorded); } if(!(Game_mode & GM_STANDALONE_SERVER)) { @@ -8728,11 +8724,11 @@ void ship_process_post(object * obj, float frametime) } } - if ( shipp->flags & SF_ARRIVING && Ai_info[shipp->ai_index].mode != AIM_BAY_EMERGE ) { + if ( shipp->is_arriving() && Ai_info[shipp->ai_index].mode != AIM_BAY_EMERGE ) { // JAS -- if the ship is warping in, just move it forward at a speed // fast enough to move 2x its radius in SHIP_WARP_TIME seconds. shipfx_warpin_frame( obj, frametime ); - } else if ( shipp->flags & SF_DEPART_WARP ) { + } else if ( shipp->flags[Ship_Flags::Depart_warp] ) { // JAS -- if the ship is warping out, just move it forward at a speed // fast enough to move 2x its radius in SHIP_WARP_TIME seconds. shipfx_warpout_frame( obj, frametime ); @@ -8741,9 +8737,9 @@ void ship_process_post(object * obj, float frametime) // update radar status of the ship ship_radar_process(obj, shipp, sip); - if ( (!(shipp->flags & SF_ARRIVING) || (Ai_info[shipp->ai_index].mode == AIM_BAY_EMERGE) - || ((sip->warpin_type == WT_IN_PLACE_ANIM) && (shipp->flags & SF_ARRIVING_STAGE_2)) ) - && !(shipp->flags & SF_DEPART_WARP)) + if ( (!(shipp->is_arriving()) || (Ai_info[shipp->ai_index].mode == AIM_BAY_EMERGE) + || ((sip->warpin_type == WT_IN_PLACE_ANIM) && (shipp->flags[Ship_Flags::Arriving_stage_2])) ) + && !(shipp->flags[Ship_Flags::Depart_warp])) { // Do AI. @@ -8768,7 +8764,7 @@ void ship_process_post(object * obj, float frametime) //rotate player subobjects since its processed by the ai functions // AL 2-19-98: Fire turret for player if it exists //WMC - changed this to call process_subobjects - if ( (obj->flags & OF_PLAYER_SHIP) && !Player_use_ai ) + if ( (obj->flags[Object::Object_Flags::Player_ship]) && !Player_use_ai ) { ai_info *aip = &Ai_info[Ships[obj->instance].ai_index]; if (aip->ai_flags & (AIF_AWAITING_REPAIR | AIF_BEING_REPAIRED)) @@ -8799,7 +8795,7 @@ void ship_process_post(object * obj, float frametime) } // Goober5000 - player may want to use AI - if ( (Ships[num].ai_index >= 0) && (!(obj->flags & OF_PLAYER_SHIP) || Player_use_ai) ){ + if ( (Ships[num].ai_index >= 0) && (!(obj->flags[Object::Object_Flags::Player_ship]) || Player_use_ai) ){ if (!physics_paused && !ai_paused){ ai_process( obj, Ships[num].ai_index, frametime ); } @@ -9062,7 +9058,7 @@ void ship_init_afterburners(ship *shipp) polymodel *pm = model_get(sip->model_num); Assert( pm != NULL ); - if ( !(sip->flags & SIF_AFTERBURNER) ) { + if ( !(sip->flags[Ship::Info_Flags::Afterburner]) ) { return; } @@ -9190,13 +9186,14 @@ int ship_create(matrix *orient, vec3d *pos, int ship_type, char *ship_name) for ( i=0; in_detail_levels; i++ ) pm->detail_depth[i] = (i < sip->num_detail_levels) ? i2fl(sip->detail_distance[i]) : 0.0f; + flagset default_ship_object_flags; + default_ship_object_flags.set(Object::Object_Flags::Renders); + default_ship_object_flags.set(Object::Object_Flags::Physics); // JAS: Nav buoys don't need to do collisions! // G5K: Corrected to apply specifically for ships with the no-collide flag. (In retail, navbuoys already have this flag, so this doesn't break anything.) - if ( sip->flags & SIF_NO_COLLIDE ) { - objnum = obj_create(OBJ_SHIP, -1, n, orient, pos, model_get_radius(sip->model_num), OF_RENDERS | OF_PHYSICS ); - } else { - objnum = obj_create(OBJ_SHIP, -1, n, orient, pos, model_get_radius(sip->model_num), OF_RENDERS | OF_COLLIDES | OF_PHYSICS ); - } + default_ship_object_flags.set(Object::Object_Flags::Collides, !sip->flags[Ship::Info_Flags::No_collide]); + + objnum = obj_create(OBJ_SHIP, -1, n, orient, pos, model_get_radius(sip->model_num), default_ship_object_flags); Assert( objnum >= 0 ); shipp->ai_index = ai_get_slot(n); @@ -9234,7 +9231,7 @@ int ship_create(matrix *orient, vec3d *pos, int ship_type, char *ship_name) // Bump the object radius to ensure that collision detection works right // even when spread shields extend outside the model's natural radius - if (sip->flags2 & SIF2_AUTO_SPREAD_SHIELDS) { + if (sip->flags[Ship::Info_Flags::Auto_spread_shields]) { Objects[objnum].radius += sip->auto_shield_spread; } @@ -9249,7 +9246,7 @@ int ship_create(matrix *orient, vec3d *pos, int ship_type, char *ship_name) // fix up references into paths for this ship's model to point to a ship_subsys entry instead // of a submodel index. The ship_subsys entry should be the same for *all* instances of the // same ship. - if (!(sip->flags & SIF_PATH_FIXUP)) + if (!(sip->flags[Ship::Info_Flags::Path_fixup])) { for ( i = 0; i < pm->n_paths; i++ ) { @@ -9278,7 +9275,7 @@ int ship_create(matrix *orient, vec3d *pos, int ship_type, char *ship_name) } } } - sip->flags |= SIF_PATH_FIXUP; + sip->flags.set(Ship::Info_Flags::Path_fixup); } // Add this ship to Ship_obj_list @@ -9369,7 +9366,7 @@ void ship_model_change(int n, int ship_type) for ( i=0; in_detail_levels; i++ ) pm->detail_depth[i] = (i < sip->num_detail_levels) ? i2fl(sip->detail_distance[i]) : 0.0f; - if (sip->flags2 & SIF2_MODEL_POINT_SHIELDS) { + if (sip->flags[Ship::Info_Flags::Model_point_shields]) { objp->n_quadrants = pm->shield_points.size(); sp->shield_points = pm->shield_points; } else { @@ -9692,18 +9689,21 @@ void change_ship_type(int n, int ship_type, int by_sexp) // Mantis 2763: moved down to have access to the right ship_max_shield_strength value // make sure that shields are disabled/enabled if they need to be - Chief1983 - if (!Fred_running) { - if ((p_objp->flags2 & P2_OF_FORCE_SHIELDS_ON) && (sp->ship_max_shield_strength > 0.0f)) { - objp->flags &= ~OF_NO_SHIELDS; - } else if ((p_objp->flags & P_OF_NO_SHIELDS) || (sp->ship_max_shield_strength == 0.0f)) { - objp->flags |= OF_NO_SHIELDS; - // Since there's not a mission flag set to be adjusting this, see if there was a change from a ship that normally has shields to one that doesn't, and vice versa - } else if (!(sip_orig->flags2 & SIF2_INTRINSIC_NO_SHIELDS) && (sip->flags2 & SIF2_INTRINSIC_NO_SHIELDS)) { - objp->flags |= OF_NO_SHIELDS; - } else if ((sip_orig->flags2 & SIF2_INTRINSIC_NO_SHIELDS) && !(sip->flags2 & SIF2_INTRINSIC_NO_SHIELDS) && (sp->ship_max_shield_strength > 0.0f)) { - objp->flags &= ~OF_NO_SHIELDS; - } - } + if (!Fred_running) { + if ((p_objp->flags[Mission::Parse_Object_Flags::OF_Force_shields_on]) && (sp->ship_max_shield_strength > 0.0f)) { + objp->flags.remove(Object::Object_Flags::No_shields); + } + else if ((p_objp->flags[Mission::Parse_Object_Flags::OF_No_shields]) || (sp->ship_max_shield_strength == 0.0f)) { + objp->flags.set(Object::Object_Flags::No_shields); + // Since there's not a mission flag set to be adjusting this, see if there was a change from a ship that normally has shields to one that doesn't, and vice versa + } + else if (!(sip_orig->flags[Info_Flags::Intrinsic_no_shields]) && (sip->flags[Info_Flags::Intrinsic_no_shields])) { + objp->flags.set(Object::Object_Flags::No_shields); + } + else if ((sip_orig->flags[Info_Flags::Intrinsic_no_shields]) && !(sip->flags[Info_Flags::Intrinsic_no_shields]) && (sp->ship_max_shield_strength > 0.0f)) { + objp->flags.remove(Object::Object_Flags::No_shields); + } + } // niffiwan: set new armor types sp->armor_type_idx = sip->armor_type_idx; @@ -9889,7 +9889,7 @@ void change_ship_type(int n, int ship_type, int by_sexp) generic_bitmap_load(&sip->afterburner_trail); sp->ab_count = 0; - if (sip->flags & SIF_AFTERBURNER) + if (sip->flags[Ship::Info_Flags::Afterburner]) { polymodel *pm = model_get(sip->model_num); @@ -9931,25 +9931,25 @@ void change_ship_type(int n, int ship_type, int by_sexp) // Goober5000 - check other class-specific flags too - if (sip->flags & SIF_STEALTH) // changing TO a stealthy ship class - sp->flags2 |= SF2_STEALTH; - else if (sip_orig->flags & SIF_STEALTH) // changing FROM a stealthy ship class - sp->flags2 &= ~SF2_STEALTH; + if (sip->flags[Ship::Info_Flags::Stealth]) // changing TO a stealthy ship class + sp->flags.set(Ship_Flags::Stealth); + else if (sip_orig->flags[Ship::Info_Flags::Stealth]) // changing FROM a stealthy ship class + sp->flags.remove(Ship_Flags::Stealth); - if (sip->flags & SIF_SHIP_CLASS_DONT_COLLIDE_INVIS) // changing TO a don't-collide-invisible ship class - sp->flags2 |= SF2_DONT_COLLIDE_INVIS; - else if (sip_orig->flags & SIF_SHIP_CLASS_DONT_COLLIDE_INVIS) // changing FROM a don't-collide-invisible ship class - sp->flags2 &= ~SF2_DONT_COLLIDE_INVIS; + if (sip->flags[Ship::Info_Flags::Ship_class_dont_collide_invis]) // changing TO a don't-collide-invisible ship class + sp->flags.set(Ship_Flags::Dont_collide_invis); + else if (sip_orig->flags[Ship::Info_Flags::Ship_class_dont_collide_invis]) // changing FROM a don't-collide-invisible ship class + sp->flags.remove(Ship_Flags::Dont_collide_invis); - if (sip->flags & SIF_NO_COLLIDE) // changing TO a no-collision ship class - obj_set_flags(objp, objp->flags & ~OF_COLLIDES); - else if (sip_orig->flags & SIF_NO_COLLIDE) // changing FROM a no-collision ship class - obj_set_flags(objp, objp->flags | OF_COLLIDES); + if (sip->flags[Ship::Info_Flags::No_collide]) // changing TO a no-collision ship class + obj_set_flags(objp, objp->flags - Object::Object_Flags::Collides); + else if (sip_orig->flags[Ship::Info_Flags::No_collide]) // changing FROM a no-collision ship class + obj_set_flags(objp, objp->flags + Object::Object_Flags::Collides); - if (sip->flags2 & SIF2_NO_ETS) - sp->flags2 |= SF2_NO_ETS; - else if (sip_orig->flags2 & SIF2_NO_ETS) - sp->flags2 &= ~SF2_NO_ETS; + if (sip->flags[Ship::Info_Flags::No_ets]) + sp->flags.set(Ship_Flags::No_ets); + else if (sip_orig->flags[Ship::Info_Flags::No_ets]) + sp->flags.remove(Ship_Flags::No_ets); // Chief1983: Make sure that when changing to a new ship with secondaries, you switch to bank 0. They still won't @@ -10150,7 +10150,7 @@ int ship_launch_countermeasure(object *objp, int rand_val) // if we have a player ship, then send the fired packet anyway so that the player // who fired will get his 'out of countermeasures' sound cmeasure_count = 0; - if (objp->flags & OF_PLAYER_SHIP){ + if (objp->flags[Object::Object_Flags::Player_ship]){ // the new way of doing things if (Game_mode & GM_MULTIPLAYER){ send_NEW_countermeasure_fired_packet(objp, cmeasure_count, -1); @@ -10376,7 +10376,7 @@ int ship_stop_fire_primary(object * obj) bank_to_stop = swp->current_primary_bank; - if ( shipp->flags & SF_PRIMARY_LINKED ) { + if ( shipp->flags[Ship_Flags::Primary_linked] ) { num_primary_banks = swp->num_primary_banks; } else { num_primary_banks = MIN(1, swp->num_primary_banks); @@ -10465,7 +10465,7 @@ int ship_fire_primary(object * obj, int stream_weapons, int force) } // If the primaries have been locked, bail - if (shipp->flags2 & SF2_PRIMARIES_LOCKED) + if (shipp->flags[Ship_Flags::Primaries_locked]) { return 0; } @@ -10476,7 +10476,7 @@ int ship_fire_primary(object * obj, int stream_weapons, int force) // both primary banks. int num_primary_banks; - if ( shipp->flags & SF_PRIMARY_LINKED ) { + if ( shipp->flags[Ship_Flags::Primary_linked] ) { num_primary_banks = swp->num_primary_banks; } else { num_primary_banks = MIN(1, swp->num_primary_banks); @@ -10488,7 +10488,7 @@ int ship_fire_primary(object * obj, int stream_weapons, int force) } // if we're firing stream weapons, but the trigger is not down, do nothing - if(stream_weapons && !(shipp->flags & SF_TRIGGER_DOWN)){ + if(stream_weapons && !(shipp->flags[Ship_Flags::Trigger_down])){ return 0; } @@ -10563,7 +10563,7 @@ int ship_fire_primary(object * obj, int stream_weapons, int force) continue; } // if this is a targeting laser, start it up ///- only targeting laser if it is tag-c, otherwise it's a fighter beam -Bobboau - if((winfo_p->wi_flags & WIF_BEAM) && (winfo_p->tag_level == 3) && (shipp->flags & SF_TRIGGER_DOWN) && (winfo_p->b_info.beam_type == BEAM_TYPE_C) ){ + if((winfo_p->wi_flags & WIF_BEAM) && (winfo_p->tag_level == 3) && (shipp->flags[Ship_Flags::Trigger_down]) && (winfo_p->b_info.beam_type == BEAM_TYPE_C) ){ ship_start_targeting_laser(shipp); continue; } @@ -10583,7 +10583,7 @@ int ship_fire_primary(object * obj, int stream_weapons, int force) } // if weapons are linked and this is a nolink weapon, skip it - if (shipp->flags & SF_PRIMARY_LINKED && winfo_p->wi_flags3 & WIF3_NOLINK) { + if (shipp->flags[Ship_Flags::Primary_linked] && winfo_p->wi_flags3 & WIF3_NOLINK) { continue; } @@ -10601,7 +10601,7 @@ int ship_fire_primary(object * obj, int stream_weapons, int force) next_fire_delay = winfo_p->fire_wait * 1000.0f; swp->burst_counter[bank_to_fire] = 0; } - if (!((obj->flags & OF_PLAYER_SHIP) || (fast_firing))) { + if (!((obj->flags[Object::Object_Flags::Player_ship]) || (fast_firing))) { if (shipp->team == Ships[Player_obj->instance].team){ next_fire_delay *= aip->ai_ship_fire_delay_scale_friendly; } else { @@ -10638,7 +10638,7 @@ int ship_fire_primary(object * obj, int stream_weapons, int force) // Note, unless we track whether the fire button has been held down, and not tapped, it's hard to // know how much time to subtract off. It could be this fire is "late" because the user didn't want to fire. if ((next_fire_delay > 0.0f)) { - if (obj->flags & OF_PLAYER_SHIP) { + if (obj->flags[Object::Object_Flags::Player_ship]) { int t = timestamp_until(swp->next_primary_fire_stamp[bank_to_fire]); if (t < 0) { float tx; @@ -10659,7 +10659,7 @@ int ship_fire_primary(object * obj, int stream_weapons, int force) swp->last_primary_fire_stamp[bank_to_fire] = timestamp(); } - if (sip->flags2 & SIF2_DYN_PRIMARY_LINKING ) { + if (sip->flags[Ship::Info_Flags::Dyn_primary_linking] ) { Assert(pm->gun_banks[bank_to_fire].num_slots != 0); swp->next_primary_fire_stamp[bank_to_fire] = timestamp((int)(next_fire_delay * ( swp->primary_bank_slot_count[ bank_to_fire ] ) / pm->gun_banks[bank_to_fire].num_slots ) ); swp->last_primary_fire_stamp[bank_to_fire] = timestamp(); @@ -10811,7 +10811,7 @@ int ship_fire_primary(object * obj, int stream_weapons, int force) // ok if this is a cycling weapon use shots as the number of points to fire from at a time // otherwise shots is the number of times all points will be fired (used mostly for the 'shotgun' effect) - if ( sip->flags2 & SIF2_DYN_PRIMARY_LINKING ) { + if ( sip->flags[Ship::Info_Flags::Dyn_primary_linking] ) { numtimes = 1; points = MIN( num_slots, swp->primary_bank_slot_count[ bank_to_fire ] ); } else if ( winfo_p->wi_flags2 & WIF2_CYCLE ) { @@ -10846,7 +10846,7 @@ int ship_fire_primary(object * obj, int stream_weapons, int force) { // Make sure this ship is set up for ballistics. // If you get this error, add the ballistic primaries tags to ships.tbl. - Assert ( sip->flags & SIF_BALLISTIC_PRIMARIES ); + Assert ( sip->flags[Ship::Info_Flags::Ballistic_primaries] ); // If ship is being repaired/rearmed, it cannot fire ballistics if ( aip->ai_flags & AIF_BEING_REPAIRED ) @@ -10924,7 +10924,7 @@ int ship_fire_primary(object * obj, int stream_weapons, int force) for ( j = 0; j < points; j++ ) { int pt; //point - if ( (winfo_p->wi_flags2 & WIF2_CYCLE) || (sip->flags2 & SIF2_DYN_PRIMARY_LINKING) ){ + if ( (winfo_p->wi_flags2 & WIF2_CYCLE) || (sip->flags[Ship::Info_Flags::Dyn_primary_linking]) ){ pt = (shipp->last_fired_point[bank_to_fire]+1)%num_slots; }else{ pt = j; @@ -10996,7 +10996,7 @@ int ship_fire_primary(object * obj, int stream_weapons, int force) // set orientation vm_vector_2_matrix(&firing_orient, &firing_vec, NULL, NULL); - } else if (sip->flags2 & SIF2_GUN_CONVERGENCE) { + } else if (sip->flags[Ship::Info_Flags::Gun_convergence]) { // model file defined convergence vec3d firing_vec; vm_vec_unrotate(&firing_vec, &pm->gun_banks[bank_to_fire].norm[pt], &obj->orient); @@ -11062,7 +11062,7 @@ int ship_fire_primary(object * obj, int stream_weapons, int force) } } // create the muzzle flash effect - if ( (obj != Player_obj) || (sip->flags2 & SIF2_SHOW_SHIP_MODEL) || (Viewer_mode) ) { + if ( (obj != Player_obj) || (sip->flags[Ship::Info_Flags::Show_ship_model]) || (Viewer_mode) ) { // show the flash only if in not cockpit view, or if "show ship" flag is set shipfx_flash_create( obj, sip->model_num, &pnt, &obj->orient.vec.fvec, 1, weapon_idx ); } @@ -11162,7 +11162,7 @@ int ship_fire_primary(object * obj, int stream_weapons, int force) } // STATS - if (obj->flags & OF_PLAYER_SHIP) { + if (obj->flags[Object::Object_Flags::Player_ship]) { // in multiplayer -- only the server needs to keep track of the stats. Call the cool // function to find the player given the object *. It had better return a valid player // or our internal structure as messed up. @@ -11214,7 +11214,7 @@ void ship_start_targeting_laser(ship *shipp) } // if primary banks are linked - if(shipp->flags & SF_PRIMARY_LINKED){ + if(shipp->flags[Ship_Flags::Primary_linked]){ if(bank0_laser){ shipp->targeting_laser_bank = 0; return; @@ -11265,7 +11265,7 @@ void ship_process_targeting_lasers() shipp = &Ships[Objects[so->objnum].instance]; // if our trigger is no longer down, switch it off - if(!(shipp->flags & SF_TRIGGER_DOWN)){ + if(!(shipp->flags[Ship_Flags::Trigger_down])){ ship_stop_targeting_laser(shipp); continue; } @@ -11481,7 +11481,7 @@ int ship_fire_secondary( object *obj, int allow_swarm ) } // If the secondaries have been locked, bail - if (shipp->flags2 & SF2_SECONDARIES_LOCKED) + if (shipp->flags[Ship_Flags::Secondaries_locked]) { return 0; } @@ -11700,7 +11700,7 @@ int ship_fire_secondary( object *obj, int allow_swarm ) int start_slot, end_slot; - if ( shipp->flags & SF_SECONDARY_DUAL_FIRE && num_slots > 1) { + if ( shipp->flags[Ship_Flags::Secondary_dual_fire] && num_slots > 1) { start_slot = swp->secondary_next_slot[bank]; // AL 11-19-97: Ensure enough ammo remains when firing linked secondary weapons if ( check_ammo && (swp->secondary_bank_ammo[bank] < 2) ) { @@ -11711,7 +11711,7 @@ int ship_fire_secondary( object *obj, int allow_swarm ) } else { // de-set the flag just in case dual-fire was set but couldn't be used // because there's less than two firepoints - shipp->flags &= ~SF_SECONDARY_DUAL_FIRE; + shipp->flags.remove(Ship_Flags::Secondary_dual_fire); start_slot = swp->secondary_next_slot[bank]; end_slot = start_slot; } @@ -11757,7 +11757,7 @@ int ship_fire_secondary( object *obj, int allow_swarm ) } matrix firing_orient; - if(!(sip->flags2 & SIF2_GUN_CONVERGENCE)) + if(!(sip->flags[Ship::Info_Flags::Gun_convergence])) { firing_orient = obj->orient; } @@ -11778,7 +11778,7 @@ int ship_fire_secondary( object *obj, int allow_swarm ) has_fired = true; // create the muzzle flash effect - if ( (obj != Player_obj) || (sip->flags2 & SIF2_SHOW_SHIP_MODEL) || (Viewer_mode) ) { + if ( (obj != Player_obj) || (sip->flags[Ship::Info_Flags::Show_ship_model]) || (Viewer_mode) ) { // show the flash only if in not cockpit view, or if "show ship" flag is set shipfx_flash_create(obj, sip->model_num, &pnt, &obj->orient.vec.fvec, 0, weapon_idx); } @@ -11808,7 +11808,7 @@ int ship_fire_secondary( object *obj, int allow_swarm ) swp = &Player_ship->weapons; if (bank >= 0) { wip = &Weapon_info[swp->secondary_bank_weapons[bank]]; - if (Player_ship->flags & SF_SECONDARY_DUAL_FIRE){ + if (Player_ship->flags[Ship_Flags::Secondary_dual_fire]){ joy_ff_play_secondary_shoot((int) (wip->cargo_size * 2.0f)); } else { joy_ff_play_secondary_shoot((int) wip->cargo_size); @@ -11834,7 +11834,7 @@ done_secondary: } // STATS - if (obj->flags & OF_PLAYER_SHIP) { + if (obj->flags[Object::Object_Flags::Player_ship]) { // in multiplayer -- only the server needs to keep track of the stats. Call the cool // function to find the player given the object *. It had better return a valid player // or our internal structure as messed up. @@ -11888,7 +11888,7 @@ done_secondary: //the next valid bank. the delay is there to prevent things like Trible/Quad Fire Trebuchets. // // niffiwan: only try to switch banks if object has multiple banks, and firing bank is the current bank - if ( (obj->flags & OF_PLAYER_SHIP) && (swp->secondary_bank_ammo[bank] <= 0) && (swp->num_secondary_banks >= 2) && (bank == swp->current_secondary_bank) ) { + if ( (obj->flags[Object::Object_Flags::Player_ship]) && (swp->secondary_bank_ammo[bank] <= 0) && (swp->num_secondary_banks >= 2) && (bank == swp->current_secondary_bank) ) { // niffiwan: call ship_select_next_secondary instead of ship_select_next_valid_secondary_bank // ensures all "extras" are dealt with, like animations, scripting hooks, etc if (ship_select_next_secondary(obj) ) { //DTP here we switch to the next valid bank, but we can't call weapon_info on next fire_wait @@ -11956,7 +11956,6 @@ int ship_select_next_primary(object *objp, int direction) ship_weapon *swp; int new_bank; int original_bank; - unsigned int original_link_flag; int i; Assert(objp != NULL); @@ -11970,7 +11969,7 @@ int ship_select_next_primary(object *objp, int direction) Assert(direction == CYCLE_PRIMARY_NEXT || direction == CYCLE_PRIMARY_PREV); original_bank = swp->current_primary_bank; - original_link_flag = shipp->flags & SF_PRIMARY_LINKED; + auto original_link_flag = shipp->flags[Ship_Flags::Primary_linked]; // redid case structure to possibly add more primaries in the future - Goober5000 if ( swp->num_primary_banks == 0 ) @@ -12001,15 +12000,15 @@ int ship_select_next_primary(object *objp, int direction) Assert((swp->current_primary_bank >= 0) && (swp->current_primary_bank < swp->num_primary_banks)); // first check if linked - if ( shipp->flags2 & SF2_SHIP_SELECTIVE_LINKING ) + if ( shipp->flags[Ship_Flags::Ship_selective_linking] ) { printf("npb:%i\n", swp->num_primary_banks ); } - if ( shipp->flags & SF_PRIMARY_LINKED ) + if ( shipp->flags[Ship_Flags::Primary_linked] ) { - shipp->flags &= ~SF_PRIMARY_LINKED; - if ( direction == CYCLE_PRIMARY_NEXT ) + shipp->flags.remove(Ship_Flags::Primary_linked); + if ( direction == CYCLE_PRIMARY_NEXT ) { swp->current_primary_bank = 0; } @@ -12027,13 +12026,13 @@ int ship_select_next_primary(object *objp, int direction) { swp->current_primary_bank++; } - else if( sip->flags2 & SIF2_NO_PRIMARY_LINKING ) + else if( sip->flags[Ship::Info_Flags::No_primary_linking] ) { swp->current_primary_bank = 0; } else { - shipp->flags |= SF_PRIMARY_LINKED; + shipp->flags.set(Ship_Flags::Primary_linked); } } else @@ -12042,29 +12041,29 @@ int ship_select_next_primary(object *objp, int direction) { swp->current_primary_bank--; } - else if( sip->flags2 & SIF2_NO_PRIMARY_LINKING ) + else if( sip->flags[Ship::Info_Flags::No_primary_linking] ) { swp->current_primary_bank = swp->num_primary_banks - 1; } else { - shipp->flags |= SF_PRIMARY_LINKED; + shipp->flags.set(Ship_Flags::Primary_linked); } } } } // test for ballistics - Goober5000 - if ( sip->flags & SIF_BALLISTIC_PRIMARIES ) + if ( sip->flags[Ship::Info_Flags::Ballistic_primaries] ) { // if we can't link, disengage primary linking and change to next available bank - if (shipp->flags & SF_PRIMARY_LINKED) + if (shipp->flags[Ship_Flags::Primary_linked]) { for (i = 0; i < swp->num_primary_banks; i++) { if (primary_out_of_ammo(swp, i)) { - shipp->flags &= ~SF_PRIMARY_LINKED; + shipp->flags.remove(Ship_Flags::Primary_linked); if (direction == CYCLE_PRIMARY_NEXT) { @@ -12119,7 +12118,7 @@ int ship_select_next_primary(object *objp, int direction) // if this ship is ballistics-equipped, and we cycled, then we had to verify some stuff, // so we should check if we actually changed banks - if ( (swp->current_primary_bank != original_bank) || ((shipp->flags & SF_PRIMARY_LINKED) != original_link_flag) ) + if ( (swp->current_primary_bank != original_bank) || ((shipp->flags[Ship_Flags::Primary_linked]) != original_link_flag) ) { if ( objp == Player_obj ) { @@ -13202,7 +13201,7 @@ float ship_calculate_rearm_duration( object *objp ) shield_rep_time = ((sp->ship_max_shield_strength * sp->max_shield_recharge) - shield_get_strength(objp)) / (sp->max_shield_recharge * sp->ship_max_shield_strength * sip->sup_shield_repair_rate); max_hull_repair = sp->ship_max_hull_strength * (The_mission.support_ships.max_hull_repair_val * 0.01f); - if ((The_mission.flags & MISSION_FLAG_SUPPORT_REPAIRS_HULL) && (max_hull_repair > objp->hull_strength) && (sip->sup_hull_repair_rate > 0.0f)) + if ((The_mission.flags[Mission::Mission_Flags::Support_repairs_hull]) && (max_hull_repair > objp->hull_strength) && (sip->sup_hull_repair_rate > 0.0f)) { hull_rep_time = (max_hull_repair - objp->hull_strength) / (sp->ship_max_hull_strength * sip->sup_hull_repair_rate); } @@ -13222,7 +13221,7 @@ float ship_calculate_rearm_duration( object *objp ) //now do the primary rearm time found_first_empty = false; - if (sip->flags & SIF_BALLISTIC_PRIMARIES) + if (sip->flags[Ship::Info_Flags::Ballistic_primaries]) { for (i = 0; i < swp->num_primary_banks; i++) { @@ -13321,18 +13320,18 @@ int ship_do_rearm_frame( object *objp, float frametime ) swp->num_primary_banks = sip->num_primary_banks; } // AL 12-30-97: Repair broken warp drive - if ( shipp->flags & SF_WARP_BROKEN ) { + if ( shipp->flags[Ship_Flags::Warp_broken] ) { // TODO: maybe do something here like informing player warp is fixed? // like this? -- Goober5000 HUD_sourced_printf(HUD_SOURCE_HIDDEN, XSTR( "Subspace drive repaired.", 1635)); - shipp->flags &= ~SF_WARP_BROKEN; + shipp->flags.remove(Ship_Flags::Warp_broken); } // AL 1-16-97: Replenish countermeasures shipp->cmeasure_count = sip->cmeasure_max; // Do shield repair here - if ( !(objp->flags & OF_NO_SHIELDS) ) + if ( !(objp->flags[Object::Object_Flags::No_shields]) ) { shield_str = shield_get_strength(objp); if ( shield_str < (shipp->ship_max_shield_strength * shipp->max_shield_recharge) ) { @@ -13364,7 +13363,7 @@ int ship_do_rearm_frame( object *objp, float frametime ) max_hull_repair = objp->hull_strength; } - if(The_mission.flags & MISSION_FLAG_SUPPORT_REPAIRS_HULL) + if(The_mission.flags[Mission::Mission_Flags::Support_repairs_hull]) { objp->hull_strength += repair_allocated; if ( objp->hull_strength > max_hull_repair ) { @@ -13423,8 +13422,8 @@ int ship_do_rearm_frame( object *objp, float frametime ) // check to see if this subsystem was totally non functional before -- if so, then // reset the flags - if ( (ssp->system_info->type == SUBSYSTEM_ENGINE) && (shipp->flags & SF_DISABLED) ) { - shipp->flags &= ~SF_DISABLED; + if ( (ssp->system_info->type == SUBSYSTEM_ENGINE) && (shipp->flags[Ship_Flags::Disabled]) ) { + shipp->flags.remove(Ship_Flags::Disabled); ship_reset_disabled_physics(objp, shipp->ship_info_index); } break; @@ -13488,7 +13487,7 @@ int ship_do_rearm_frame( object *objp, float frametime ) } // end for // rearm ballistic primaries - Goober5000 - if (sip->flags & SIF_BALLISTIC_PRIMARIES) + if (sip->flags[Ship::Info_Flags::Ballistic_primaries]) { if ( aip->rearm_first_ballistic_primary == TRUE) { @@ -13587,7 +13586,7 @@ int ship_do_rearm_frame( object *objp, float frametime ) } int shields_full = 0; - if ( (objp->flags & OF_NO_SHIELDS) ) { + if ( (objp->flags[Object::Object_Flags::No_shields]) ) { shields_full = 1; } else { if ( shield_get_strength(objp) >= shipp->ship_max_shield_strength ) @@ -13606,7 +13605,7 @@ int ship_do_rearm_frame( object *objp, float frametime ) } // return 1 if at end of subsystem list, hull damage at 0, and shields full and all secondary banks full. - if ( (subsys_all_ok && shields_full && (The_mission.flags & MISSION_FLAG_SUPPORT_REPAIRS_HULL) && hull_ok ) || (subsys_all_ok && shields_full && !(The_mission.flags & MISSION_FLAG_SUPPORT_REPAIRS_HULL) ) ) + if ( (subsys_all_ok && shields_full && (The_mission.flags[Mission::Mission_Flags::Support_repairs_hull]) && hull_ok ) || (subsys_all_ok && shields_full && !(The_mission.flags[Mission::Mission_Flags::Support_repairs_hull]) ) ) { if ( objp == Player_obj ) { player_stop_repair_sound(); @@ -13617,7 +13616,7 @@ int ship_do_rearm_frame( object *objp, float frametime ) // check both primary and secondary banks are full if ( (banks_full == swp->num_secondary_banks) && - ( !(sip->flags & SIF_BALLISTIC_PRIMARIES) || ((sip->flags & SIF_BALLISTIC_PRIMARIES) && (primary_banks_full == swp->num_primary_banks)) ) ) + ( !(sip->flags[Ship::Info_Flags::Ballistic_primaries]) || ((sip->flags[Ship::Info_Flags::Ballistic_primaries]) && (primary_banks_full == swp->num_primary_banks)) ) ) { if ( timestamp_elapsed(aip->rearm_release_delay) ) return 1; @@ -13657,7 +13656,7 @@ int ship_find_repair_ship( object *requester_obj, object **ship_we_found ) ship *requester_ship = &Ships[requester_obj->instance]; for ( objp = GET_FIRST(&obj_used_list); objp !=END_OF_LIST(&obj_used_list); objp = GET_NEXT(objp) ) { - if ((objp->type == OBJ_SHIP) && !(objp->flags & OF_SHOULD_BE_DEAD)) + if ((objp->type == OBJ_SHIP) && !(objp->flags[Object::Object_Flags::Should_be_dead])) { ship *shipp; ship_info *sip; @@ -13679,7 +13678,7 @@ int ship_find_repair_ship( object *requester_obj, object **ship_we_found ) sip = &Ship_info[shipp->ship_info_index]; - if ( !(sip->flags & SIF_SUPPORT) ) { + if ( !(sip->flags[Ship::Info_Flags::Support]) ) { continue; } @@ -13687,7 +13686,7 @@ int ship_find_repair_ship( object *requester_obj, object **ship_we_found ) num_support_ships++; // don't deal with dying or departing support ships - if ( shipp->flags & (SF_DYING | SF_DEPARTING) ) { + if ( shipp->is_dying_or_departing() ) { continue; } @@ -14044,7 +14043,7 @@ DCF(set_subsys, "Set the strength of a particular subsystem on player ship" ) if (subsystem == SUBSYSTEM_ENGINE) { // If subsystem is an engine, set/clear the disabled flag - (val_f < ENGINE_MIN_STR) ? (Player_ship->flags |= SF_DISABLED) : (Player_ship->flags &= (~SF_DISABLED)); + Player_ship->flags.set(Ship_Flags::Disabled, (val_f < ENGINE_MIN_STR)); } } } @@ -14194,15 +14193,15 @@ int ship_get_random_player_wing_ship( int flags, float max_dist, int persona_ind ship_index = Wings[wingnum].ship_index[j]; Assert( ship_index != -1 ); - if ( Ships[ship_index].flags & SF_DYING ) { + if ( Ships[ship_index].flags[Ship_Flags::Dying] ) { continue; } // see if ship meets our criterea - if ( (flags == SHIP_GET_NO_PLAYERS || flags == SHIP_GET_UNSILENCED) && (Objects[Ships[ship_index].objnum].flags & OF_PLAYER_SHIP) ){ + if ( (flags == SHIP_GET_NO_PLAYERS || flags == SHIP_GET_UNSILENCED) && (Objects[Ships[ship_index].objnum].flags[Object::Object_Flags::Player_ship]) ){ continue; } - if ( (flags == SHIP_GET_UNSILENCED) && (Ships[ship_index].flags2 & SF2_NO_BUILTIN_MESSAGES) ) + if ( (flags == SHIP_GET_UNSILENCED) && (Ships[ship_index].flags[Ship_Flags::No_builtin_messages]) ) { continue; } @@ -14264,15 +14263,15 @@ int ship_get_random_ship_in_wing(int wingnum, int flags, float max_dist, int get ship_index = Wings[wingnum].ship_index[i]; Assert( ship_index != -1 ); - if ( Ships[ship_index].flags & SF_DYING ) { + if ( Ships[ship_index].flags[Ship_Flags::Dying] ) { continue; } // see if ship meets our criterea - if ( (flags == SHIP_GET_NO_PLAYERS || flags == SHIP_GET_UNSILENCED) && (Objects[Ships[ship_index].objnum].flags & OF_PLAYER_SHIP) ) + if ( (flags == SHIP_GET_NO_PLAYERS || flags == SHIP_GET_UNSILENCED) && (Objects[Ships[ship_index].objnum].flags[Object::Object_Flags::Player_ship]) ) continue; - if ( (flags == SHIP_GET_UNSILENCED) && (Ships[ship_index].flags2 & SF2_NO_BUILTIN_MESSAGES) ) + if ( (flags == SHIP_GET_UNSILENCED) && (Ships[ship_index].flags[Ship_Flags::No_builtin_messages]) ) { continue; } @@ -14331,14 +14330,14 @@ int ship_get_random_team_ship(int team_mask, int flags, float max_dist ) // don't process player ships if flags are set if (!iff_matches_mask(Ships[objp->instance].team, team_mask)) continue; - else if ( Ship_info[Ships[objp->instance].ship_info_index].flags & SIF_NOT_FLYABLE ) + else if ( !Ship_info[Ships[objp->instance].ship_info_index].is_flyable() ) continue; - else if ( (flags == SHIP_GET_NO_PLAYERS) && (objp->flags & OF_PLAYER_SHIP) ) + else if ( (flags == SHIP_GET_NO_PLAYERS) && (objp->flags[Object::Object_Flags::Player_ship]) ) continue; - else if ( (flags == SHIP_GET_ONLY_PLAYERS) && !(objp->flags & OF_PLAYER_SHIP) ) + else if ( (flags == SHIP_GET_ONLY_PLAYERS) && !(objp->flags[Object::Object_Flags::Player_ship]) ) continue; - if ( Ships[objp->instance].flags & SF_DYING ) { + if ( Ships[objp->instance].flags[Ship_Flags::Dying] ) { continue; } @@ -14418,10 +14417,10 @@ int ship_primary_bank_has_ammo(int shipnum) int ship_engine_ok_to_warp(ship *sp) { // disabled ships can't warp - if (sp->flags & SF_DISABLED) + if (sp->flags[Ship_Flags::Disabled]) return 0; - if (sp->flags & SF_WARP_BROKEN || sp->flags & SF_WARP_NEVER) + if (sp->flags[Ship_Flags::Warp_broken] || sp->flags[Ship_Flags::Warp_never]) return 0; float engine_strength = ship_get_subsystem_strength(sp, SUBSYSTEM_ENGINE); @@ -14669,7 +14668,7 @@ float ship_quadrant_shield_strength(object *hit_objp, vec3d *hitpos) vec3d tmpv1, tmpv2; // If ship doesn't have shield mesh, then return - if ( hit_objp->flags & OF_NO_SHIELDS ) { + if ( hit_objp->flags[Object::Object_Flags::No_shields] ) { return 0.0f; } @@ -15034,10 +15033,10 @@ void ship_check_cargo_all() cargo_so = GET_FIRST(&Ship_obj_list); while(cargo_so != END_OF_LIST(&Ship_obj_list)){ cargo_sp = &Ships[Objects[cargo_so->objnum].instance]; - if ( (Ship_info[cargo_sp->ship_info_index].flags & SIF_CARGO) && (cargo_sp->team != Player_ship->team) ) { + if ( (Ship_info[cargo_sp->ship_info_index].flags[Ship::Info_Flags::Cargo]) && (cargo_sp->team != Player_ship->team) ) { // If the cargo is revealed, continue on to next hostile cargo - if ( cargo_sp->flags & SF_CARGO_REVEALED ) { + if ( cargo_sp->flags[Ship::Ship_Flags::Cargo_revealed] ) { goto next_cargo; } @@ -15117,7 +15116,7 @@ void ship_maybe_warn_player(ship *enemy_sp, float dist) } // only warn if a fighter or bomber is attacking the player - if ( !(Ship_info[enemy_sp->ship_info_index].flags & SIF_SMALL_SHIP) ) { + if ( !(Ship_info[enemy_sp->ship_info_index].is_small_ship()) ) { return; } @@ -15252,7 +15251,7 @@ void ship_maybe_praise_self(ship *deader_sp, ship *killer_sp) } // ensure the ship isn't silenced - if ( killer_sp->flags2 & SF2_NO_BUILTIN_MESSAGES ) { + if ( killer_sp->flags[Ship_Flags::No_builtin_messages] ) { return; } @@ -15320,7 +15319,7 @@ void ship_maybe_ask_for_help(ship *sp) objp = &Objects[sp->objnum]; // don't let the player ask for help! - if (objp->flags & OF_PLAYER_SHIP) + if (objp->flags[Object::Object_Flags::Player_ship]) return; // determine team filter if TvT @@ -15328,14 +15327,14 @@ void ship_maybe_ask_for_help(ship *sp) multi_team_filter = sp->team; // handle awacs ship as a special case - if (Ship_info[sp->ship_info_index].flags & SIF_HAS_AWACS) + if (Ship_info[sp->ship_info_index].flags[Ship::Info_Flags::Has_awacs]) { awacs_maybe_ask_for_help(sp, multi_team_filter); return; } // for now, only have wingman ships request help - if (!(sp->flags & SF_FROM_PLAYER_WING)) + if (!(sp->flags[Ship_Flags::From_player_wing])) return; // first check if hull is at a critical level @@ -15343,7 +15342,7 @@ void ship_maybe_ask_for_help(ship *sp) goto play_ask_help; // check if shields are near critical level - if (objp->flags & OF_NO_SHIELDS) + if (objp->flags[Object::Object_Flags::No_shields]) return; // no shields on ship, no don't check shield levels if (shield_get_strength(objp) > (ASK_HELP_SHIELD_PERCENT * sp->ship_max_shield_strength)) @@ -15351,10 +15350,10 @@ void ship_maybe_ask_for_help(ship *sp) play_ask_help: - if (!(Ship_info[sp->ship_info_index].flags & (SIF_FIGHTER|SIF_BOMBER))) //If we're still here, only continue if we're a fighter or bomber. + if (!(Ship_info[sp->ship_info_index].is_fighter_bomber())) //If we're still here, only continue if we're a fighter or bomber. return; - if (!(sp->flags2 & SF2_NO_BUILTIN_MESSAGES)) // Karajorma - Only unsilenced ships should ask for help + if (!(sp->flags[Ship_Flags::No_builtin_messages])) // Karajorma - Only unsilenced ships should ask for help { message_send_builtin_to_player(MESSAGE_HELP, sp, MESSAGE_PRIORITY_HIGH, MESSAGE_TIME_IMMEDIATE, 0, 0, -1, multi_team_filter); Player->allow_ask_help_timestamp = timestamp(Builtin_messages[MESSAGE_HELP].min_delay); @@ -15402,7 +15401,7 @@ void ship_scream(ship *sp) multi_team_filter = sp->team; // Bail if the ship is silenced - if (sp->flags2 & SF2_NO_BUILTIN_MESSAGES) + if (sp->flags[Ship_Flags::No_builtin_messages]) { return; } @@ -15411,7 +15410,7 @@ void ship_scream(ship *sp) Player->allow_scream_timestamp = timestamp(Builtin_messages[MESSAGE_WINGMAN_SCREAM].min_delay); Player->scream_count++; - sp->flags |= SF_SHIP_HAS_SCREAMED; + sp->flags.set(Ship_Flags::Ship_has_screamed); // prevent overlap with help messages if (timestamp_until(Player->allow_ask_help_timestamp) < 15000) @@ -15424,11 +15423,11 @@ void ship_scream(ship *sp) void ship_maybe_scream(ship *sp) { // bail if screaming is disabled - if (sp->flags2 & SF2_NO_DEATH_SCREAM) + if (sp->flags[Ship_Flags::No_death_scream]) return; // if screaming is enabled, skip all checks - if (!(sp->flags2 & SF2_ALWAYS_DEATH_SCREAM)) + if (!(sp->flags[Ship_Flags::Always_death_scream])) { // only scream x% of the time if ( (int)(frand()*100) > Builtin_messages[MESSAGE_WINGMAN_SCREAM].occurrence_chance ) { @@ -15443,7 +15442,7 @@ void ship_maybe_scream(ship *sp) if (!(The_mission.ai_profile->flags2 & AIPF2_PERFORM_FEWER_SCREAM_CHECKS)) { // bail if this ship isn't from the player wing - if (!(sp->flags & SF_FROM_PLAYER_WING)) + if (!(sp->flags[Ship_Flags::From_player_wing])) return; // first check if the player has reached the maximum number of screams for a mission @@ -15487,7 +15486,7 @@ void ship_maybe_tell_about_low_ammo(ship *sp) return; // Silent ships should remain just that - if (sp->flags2 & SF2_NO_BUILTIN_MESSAGES) { + if (sp->flags[Ship_Flags::No_builtin_messages]) { return; } @@ -15507,7 +15506,7 @@ void ship_maybe_tell_about_low_ammo(ship *sp) swp = &sp->weapons; // stole the code for this from ship_maybe_tell_about_rearm() - if (Ship_info[sp->ship_info_index].flags & SIF_BALLISTIC_PRIMARIES) + if (Ship_info[sp->ship_info_index].flags[Ship::Info_Flags::Ballistic_primaries]) { for (i = 0; i < swp->num_primary_banks; i++) { @@ -15556,7 +15555,7 @@ void ship_maybe_tell_about_rearm(ship *sp) return; // Silent ships should remain just that - if (sp->flags2 & SF2_NO_BUILTIN_MESSAGES) + if (sp->flags[Ship_Flags::No_builtin_messages]) return; // AL 1-4-98: If ship integrity is low, tell player you want to get repaired. Otherwise, tell @@ -15565,7 +15564,7 @@ void ship_maybe_tell_about_rearm(ship *sp) int message_type = -1; int heavily_damaged = (get_hull_pct(&Objects[sp->objnum]) < 0.4); - if (heavily_damaged || (sp->flags & SF_DISABLED)) + if (heavily_damaged || (sp->flags[Ship_Flags::Disabled])) { message_type = MESSAGE_REPAIR_REQUEST; } @@ -15588,7 +15587,7 @@ void ship_maybe_tell_about_rearm(ship *sp) } // also check ballistic primaries - Goober5000 - if (Ship_info[sp->ship_info_index].flags & SIF_BALLISTIC_PRIMARIES) + if (Ship_info[sp->ship_info_index].flags[Ship::Info_Flags::Ballistic_primaries]) { for (i = 0; i < swp->num_primary_banks; i++) { @@ -15635,7 +15634,7 @@ void ship_primary_changed(ship *sp) swp = &sp->weapons; - if (sp->flags & SF_PRIMARY_LINKED) { + if (sp->flags[Ship_Flags::Primary_linked]) { // if we are linked now find any body who is down and flip them up for (i = 0; i < MAX_SHIP_PRIMARY_BANKS; i++) { if (swp->primary_animation_position[i] == MA_POS_NOT_SET) { @@ -15678,7 +15677,7 @@ void ship_primary_changed(ship *sp) Assert(sp); if ( MULTIPLAYER_MASTER ) - send_ship_weapon_change( sp, MULTI_PRIMARY_CHANGED, swp->current_primary_bank, (sp->flags & SF_PRIMARY_LINKED)?1:0 ); + send_ship_weapon_change( sp, MULTI_PRIMARY_CHANGED, swp->current_primary_bank, (sp->flags[Ship::Ship_Flags::Primary_linked])?1:0 ); #endif } @@ -15724,16 +15723,16 @@ void ship_secondary_changed(ship *sp) Assert(sp); if ( MULTIPLAYER_MASTER ) - send_ship_weapon_change( sp, MULTI_SECONDARY_CHANGED, swp->current_secondary_bank, (sp->flags & SF_SECONDARY_DUAL_FIRE)?1:0 ); + send_ship_weapon_change( sp, MULTI_SECONDARY_CHANGED, swp->current_secondary_bank, (sp->flags[Ship::Ship_Flags::Secondary_dual_fire])?1:0 ); #endif } -int ship_get_SIF(ship *shipp) +flagset ship_get_SIF(ship *shipp) { return Ship_info[shipp->ship_info_index].flags; } -int ship_get_SIF(int sh) +flagset ship_get_SIF(int sh) { return Ship_info[Ships[sh].ship_info_index].flags; } @@ -15773,7 +15772,7 @@ ship_type_info *ship_get_type_info(object *objp) void ship_do_cargo_revealed( ship *shipp, int from_network ) { // don't do anything if we already know the cargo - if ( shipp->flags & SF_CARGO_REVEALED ){ + if ( shipp->flags[Ship_Flags::Cargo_revealed] ){ return; } @@ -15784,7 +15783,7 @@ void ship_do_cargo_revealed( ship *shipp, int from_network ) send_cargo_revealed_packet( shipp ); } - shipp->flags |= SF_CARGO_REVEALED; + shipp->flags.set(Ship_Flags::Cargo_revealed); shipp->time_cargo_revealed = Missiontime; // if the cargo is something other than "nothing", then make a log entry @@ -15825,7 +15824,7 @@ void ship_do_cap_subsys_cargo_revealed( ship *shipp, ship_subsys *subsys, int fr void ship_do_cargo_hidden( ship *shipp, int from_network ) { // don't do anything if the cargo is already hidden - if ( !(shipp->flags & SF_CARGO_REVEALED) ) + if ( !(shipp->flags[Ship_Flags::Cargo_revealed]) ) { return; } @@ -15837,7 +15836,7 @@ void ship_do_cargo_hidden( ship *shipp, int from_network ) send_cargo_hidden_packet( shipp ); } - shipp->flags &= ~SF_CARGO_REVEALED; + shipp->flags.remove(Ship_Flags::Cargo_revealed); // don't log that the cargo was hidden and don't reset the time cargo revealed } @@ -15898,7 +15897,7 @@ int get_max_ammo_count_for_primary_bank(int ship_class, int bank, int ammo_type) { float capacity, size; - if (!(Ship_info[ship_class].flags & SIF_BALLISTIC_PRIMARIES)) + if (!(Ship_info[ship_class].flags[Ship::Info_Flags::Ballistic_primaries])) { return 0; } @@ -15966,7 +15965,7 @@ void ship_page_in() // Mark any support ship types as used for (auto sip = Ship_info.begin(); sip != Ship_info.end(); ++sip) { - if (sip->flags & SIF_SUPPORT) { + if (sip->flags[Ship::Info_Flags::Support]) { nprintf(( "Paging", "Found support ship '%s'\n", sip->name )); i = std::distance(Ship_info.begin(), sip); ship_class_used[i]++; @@ -15991,7 +15990,7 @@ void ship_page_in() ship_class_used[Ships[i].ship_info_index]++; // check if we are going to use a Knossos device and make sure the special warp ani gets pre-loaded - if ( Ship_info[Ships[i].ship_info_index].flags & SIF_KNOSSOS_DEVICE ) + if ( Ship_info[Ships[i].ship_info_index].flags[Ship::Info_Flags::Knossos_device] ) Knossos_warp_ani_used = 1; // mark any weapons as being used, saves memory and time if we don't load them all @@ -16438,7 +16437,7 @@ int is_support_allowed(object *objp, bool do_simple_check) } // make sure it's not leaving or blowing up - if (Ships[temp].flags & (SF_DYING | SF_DEPARTING)) + if (Ships[temp].is_dying_or_departing()) { return 0; } @@ -16520,7 +16519,7 @@ int ship_get_random_targetable_ship() continue; // skip if we aren't supposed to target it - if ( Ships[Objects[so->objnum].instance].flags & TARGET_SHIP_IGNORE_FLAGS ) + if (should_be_ignored(&Ships[Objects[so->objnum].instance])) continue; if (idx >= MAX_SHIPS) { @@ -16928,7 +16927,7 @@ float ship_get_max_speed(ship *shipp) max_speed = MAX(max_speed, sip->max_vel.xyz.z); // afterburn if not locked - if (!(shipp->flags2 & SF2_AFTERBURNER_LOCKED)) { + if (!(shipp->flags[Ship_Flags::Afterburner_locked])) { max_speed = MAX(max_speed, sip->afterburner_max_vel.xyz.z); } @@ -17085,7 +17084,7 @@ bool ship_useful_for_departure(int shipnum, int path_mask) Assert( shipnum >= 0 && shipnum < MAX_SHIPS ); // not valid if dying or departing - if (Ships[shipnum].flags & (SF_DYING | SF_DEPARTING)) + if (Ships[shipnum].is_dying_or_departing()) return false; // no dockbay, can't depart to it @@ -17209,11 +17208,11 @@ void ship_do_submodel_rotation(ship *shipp, model_subsystem *psub, ship_subsys * ship_weapon *swp = &shipp->weapons; // rotate only if trigger is down - if ( !(shipp->flags & SF_TRIGGER_DOWN) ) + if ( !(shipp->flags[Ship_Flags::Trigger_down]) ) return; // check linked - if ( shipp->flags & SF_PRIMARY_LINKED ) + if ( shipp->flags[Ship_Flags::Primary_linked] ) { int i, ammo_tally = 0; @@ -17309,38 +17308,38 @@ int ship_class_get_priority(int ship_class) ship_info *sip = &Ship_info[ship_class]; // biggest to smallest - if (sip->flags & SIF_KNOSSOS_DEVICE) - return 1; - else if (sip->flags & SIF_SUPERCAP) - return 2; - else if (sip->flags & SIF_DRYDOCK) - return 3; - else if (sip->flags & SIF_CAPITAL) - return 4; - else if (sip->flags & SIF_CORVETTE) - return 5; - else if (sip->flags & SIF_CRUISER) - return 6; - else if (sip->flags & SIF_GAS_MINER) - return 7; - else if (sip->flags & SIF_AWACS) - return 8; - else if (sip->flags & SIF_FREIGHTER) - return 9; - else if (sip->flags & SIF_TRANSPORT) - return 10; - else if (sip->flags & SIF_BOMBER) - return 11; - else if (sip->flags & (SIF_FIGHTER | SIF_STEALTH)) - return 12; - else if (sip->flags & SIF_ESCAPEPOD) - return 13; - else if (sip->flags & SIF_SENTRYGUN) - return 14; - else if (sip->flags & SIF_CARGO) - return 15; - else if (sip->flags & SIF_NAVBUOY) - return 16; + if (sip->flags[Info_Flags::Knossos_device]) + return 1; + else if (sip->flags[Info_Flags::Supercap]) + return 2; + else if (sip->flags[Info_Flags::Drydock]) + return 3; + else if (sip->flags[Info_Flags::Capital]) + return 4; + else if (sip->flags[Info_Flags::Corvette]) + return 5; + else if (sip->flags[Info_Flags::Cruiser]) + return 6; + else if (sip->flags[Info_Flags::Gas_miner]) + return 7; + else if (sip->flags[Info_Flags::Awacs]) + return 8; + else if (sip->flags[Info_Flags::Freighter]) + return 9; + else if (sip->flags[Info_Flags::Transport]) + return 10; + else if (sip->flags[Info_Flags::Bomber]) + return 11; + else if (sip->flags[Info_Flags::Fighter] || sip->flags[Info_Flags::Stealth]) + return 12; + else if (sip->flags[Info_Flags::Escapepod]) + return 13; + else if (sip->flags[Info_Flags::Sentrygun]) + return 14; + else if (sip->flags[Info_Flags::Cargo]) + return 15; + else if (sip->flags[Info_Flags::Navbuoy]) + return 16; Warning(LOCATION, "Unknown priority for ship class '%s'!", sip->name); return 17 + ship_class; @@ -18109,26 +18108,22 @@ void parse_ai_target_priorities() } } - if (optional_string("+Ship Class Flags:") ) { - temp_strings.clear(); - num_strings = stuff_string_list(temp_strings); + if (optional_string("+Ship Class Flags:")) { + temp_strings.clear(); + num_strings = stuff_string_list(temp_strings); - for (i = 0; i < num_strings; i++) { - for (j = 0; j < num_ai_tgt_ship_flags; j++) { - if ( !stricmp(ai_tgt_ship_flags[j].name, temp_strings[i].c_str()) ) { - if (ai_tgt_ship_flags[j].var == 0) { - temp_priority.sif_flags |= ai_tgt_ship_flags[j].def; - } else { - temp_priority.sif2_flags |= ai_tgt_ship_flags[j].def; - } - break; - } - } - if (j == num_ai_tgt_ship_flags) { - Warning(LOCATION, "Unidentified ship class flag '%s' set for target priority group '%s'\n", temp_strings[i].c_str(), temp_priority.name); - } - } - } + for (i = 0; i < num_strings; i++) { + for (j = 0; j < num_ai_tgt_ship_flags; j++) { + if (!stricmp(ai_tgt_ship_flags[j].name, temp_strings[i].c_str())) { + temp_priority.sif_flags.set(ai_tgt_ship_flags[j].def); + break; + } + } + if (j == num_ai_tgt_ship_flags) { + Warning(LOCATION, "Unidentified ship class flag '%s' set for target priority group '%s'\n", temp_strings[i].c_str(), temp_priority.name); + } + } + } if (optional_string("+Weapon Class Flags:") ) { temp_strings.clear(); @@ -18165,12 +18160,11 @@ ai_target_priority init_ai_target_priorities() ai_target_priority temp_priority; //initialize the entries - temp_priority.obj_flags = 0; + temp_priority.obj_flags.reset(); temp_priority.obj_type = -1; temp_priority.ship_class.clear(); temp_priority.ship_type.clear(); - temp_priority.sif_flags = 0; - temp_priority.sif2_flags = 0; + temp_priority.sif_flags.reset(); temp_priority.weapon_class.clear(); temp_priority.wif2_flags = 0; temp_priority.wif_flags = 0; @@ -18323,7 +18317,7 @@ void ship_set_thruster_info(mst_info *mst, object *obj, ship *shipp, ship_info * mst->length.xyz.y = obj->phys_info.vert_thrust; // Maybe add noise to thruster geometry. - if (!(sip->flags2 & SIF2_NO_THRUSTER_GEO_NOISE)) { + if (!(sip->flags[Ship::Info_Flags::No_thruster_geo_noise])) { mst->length.xyz.z *= (1.0f + frand()/5.0f - 0.1f); mst->length.xyz.y *= (1.0f + frand()/5.0f - 0.1f); mst->length.xyz.x *= (1.0f + frand()/5.0f - 0.1f); @@ -18490,7 +18484,7 @@ void ship_render_weapon_models(model_render_params *ship_render_info, draw_list ship *shipp = &Ships[num]; ship_info *sip = &Ship_info[Ships[num].ship_info_index]; - if ( !(sip->flags2 & SIF2_DRAW_WEAPON_MODELS) || (shipp->flags2 & SF2_CLOAKED) ) { + if ( !(sip->flags[Ship::Info_Flags::Draw_weapon_models]) || (shipp->flags[Ship_Flags::Cloaked]) ) { return; } @@ -18625,11 +18619,11 @@ void ship_render_set_animated_effect(model_render_params *render_info, ship *shi render_info->set_animated_effect(sep->shader_effect, timer); if ( sep->disables_rendering && (timer_get_milliseconds() > shipp->shader_effect_start_time + shipp->shader_effect_duration) ) { - shipp->flags2 |= SF2_CLOAKED; + shipp->flags.set(Ship_Flags::Cloaked); shipp->shader_effect_active = false; } else { - shipp->flags2 &= ~SF2_CLOAKED; - if (timer_get_milliseconds() > shipp->shader_effect_start_time + shipp->shader_effect_duration) { + shipp->flags.remove(Ship_Flags::Cloaked); + if (timer_get_milliseconds() > shipp->shader_effect_start_time + shipp->shader_effect_duration) { shipp->shader_effect_active = false; } } @@ -18642,7 +18636,7 @@ void ship_render(object* obj, draw_list* scene) ship_info *sip = &Ship_info[Ships[num].ship_info_index]; ship *warp_shipp = NULL; bool is_first_stage_arrival = false; - bool show_thrusters = ((shipp->flags2 & SF2_NO_THRUSTERS) == 0) && !Rendering_to_shadow_map; + bool show_thrusters = (!shipp->flags[Ship_Flags::No_thrusters]) && !Rendering_to_shadow_map; dock_function_info dfi; MONITOR_INC( NumShipsRend, 1 ); @@ -18654,7 +18648,7 @@ void ship_render(object* obj, draw_list* scene) if ( dfi.maintained_variables.bool_value ) { warp_shipp = &Ships[dfi.maintained_variables.objp_value->instance]; - is_first_stage_arrival = ((warp_shipp->flags & SF_ARRIVING_STAGE_1) > 0); + is_first_stage_arrival = warp_shipp->flags[Ship_Flags::Arriving_stage_1]; // This is a hack to make ships using the hyperspace warpin type to // render even in stage 1, which is used for collision detection @@ -18670,9 +18664,9 @@ void ship_render(object* obj, draw_list* scene) //WMC - based on Bobb's secondary thruster stuff //which was in turn based on the beam code. //I'm gonna need some serious acid to neutralize this base. - if(shipp->flags & SF_ARRIVING) { + if(shipp->is_arriving()) { shipp->warpin_effect->warpShipRender(); - } else if(shipp->flags & SF_DEPART_WARP) { + } else if(shipp->flags[Ship_Flags::Depart_warp]) { shipp->warpout_effect->warpShipRender(); } @@ -18706,9 +18700,9 @@ void ship_render(object* obj, draw_list* scene) //WMC - based on Bobb's secondary thruster stuff //which was in turn based on the beam code. //I'm gonna need some serious acid to neutralize this base. - if(shipp->flags & SF_ARRIVING) { + if(shipp->is_arriving()) { shipp->warpin_effect->warpShipRender(); - } else if(shipp->flags & SF_DEPART_WARP) { + } else if(shipp->flags[Ship_Flags::Depart_warp]) { shipp->warpout_effect->warpShipRender(); } @@ -18719,7 +18713,7 @@ void ship_render(object* obj, draw_list* scene) model_render_params render_info; - if ( !(shipp->flags & SF_DISABLED) && !ship_subsys_disrupted(shipp, SUBSYSTEM_ENGINE) && show_thrusters) { + if ( !(shipp->flags[Ship_Flags::Disabled]) && !ship_subsys_disrupted(shipp, SUBSYSTEM_ENGINE) && show_thrusters) { mst_info mst; ship_set_thruster_info(&mst, obj, shipp, sip); @@ -18732,9 +18726,9 @@ void ship_render(object* obj, draw_list* scene) // Warp_shipp points to the ship that is going through a // warp... either this ship or the ship it is docked with. if ( warp_shipp != NULL ) { - if ( warp_shipp->flags & SF_ARRIVING ) { + if ( warp_shipp->is_arriving() ) { warp_shipp->warpin_effect->warpShipClip(&render_info); - } else if ( warp_shipp->flags & SF_DEPART_WARP ) { + } else if ( warp_shipp->flags[Ship_Flags::Depart_warp] ) { warp_shipp->warpout_effect->warpShipClip(&render_info); } } @@ -18755,7 +18749,7 @@ void ship_render(object* obj, draw_list* scene) } } - if ( sip->flags2 & SIF2_NO_LIGHTING ) { + if ( sip->flags[Ship::Info_Flags::No_lighting] ) { render_flags |= MR_NO_LIGHTING; } @@ -18763,7 +18757,7 @@ void ship_render(object* obj, draw_list* scene) render_flags = MR_NO_TEXTURING | MR_NO_LIGHTING; } - if (shipp->flags2 & SF2_GLOWMAPS_DISABLED) { + if (shipp->flags[Ship_Flags::Glowmaps_disabled]) { render_flags |= MR_NO_GLOWMAPS; } @@ -18776,8 +18770,8 @@ void ship_render(object* obj, draw_list* scene) render_info.set_replacement_textures(shipp->ship_replacement_textures); // small ships - if ( !( shipp->flags2 & SF2_CLOAKED ) ) { - if ( ( The_mission.flags & MISSION_FLAG_FULLNEB ) && ( sip->flags & SIF_SMALL_SHIP ) ) { + if ( !( shipp->flags[Ship_Flags::Cloaked] ) ) { + if ( ( The_mission.flags[Mission::Mission_Flags::Fullneb] ) && ( sip->is_small_ship() ) ) { // force detail levels float fog_val = neb2_get_fog_intensity(obj); if ( fog_val >= 0.6f ) { @@ -18797,9 +18791,26 @@ void ship_render(object* obj, draw_list* scene) //WMC - based on Bobb's secondary thruster stuff //which was in turn based on the beam code. //I'm gonna need some serious acid to neutralize this base. - if(shipp->flags & SF_ARRIVING) { + if(shipp->is_arriving()) { shipp->warpin_effect->warpShipRender(); - } else if(shipp->flags & SF_DEPART_WARP) { + } else if(shipp->flags[Ship_Flags::Depart_warp]) { shipp->warpout_effect->warpShipRender(); } } + +flagset Ignore_List; +void set_default_ignore_list() { + Ignore_List.reset(); + Ignore_List.set(Ship::Ship_Flags::Exploded); + Ignore_List.set(Ship::Ship_Flags::Depart_warp); + Ignore_List.set(Ship::Ship_Flags::Dying); + Ignore_List.set(Ship::Ship_Flags::Arriving_stage_1); + Ignore_List.set(Ship::Ship_Flags::Hidden_from_sensors); +} + +void toggle_ignore_list_flag(Ship::Ship_Flags flag) { + if (Ignore_List[flag]) + Ignore_List.remove(flag); + else + Ignore_List.set(flag); +} diff --git a/code/ship/ship.h b/code/ship/ship.h index 510f7b5fad..6c20b22bd1 100644 --- a/code/ship/ship.h +++ b/code/ship/ship.h @@ -30,6 +30,7 @@ #include "species_defs/species_defs.h" #include "weapon/shockwave.h" #include "weapon/trails.h" +#include "ship/ship_flags.h" #include @@ -421,98 +422,15 @@ typedef struct ship_subsys_info { // Karajorma - Used by the alter-ship-flag SEXP as an alternative to having lots of ship flag SEXPs typedef struct ship_flag_name { - int flag; // the actual ship flag constant as given by the define below + Ship::Ship_Flags flag; // the actual ship flag constant as given by the define below char flag_name[TOKEN_LENGTH]; // the name written to the mission file for its corresponding parse_object flag - int flag_list; // is this flag in the 1st or 2nd ship flags list? } ship_flag_name; #define MAX_SHIP_FLAG_NAMES 19 extern ship_flag_name Ship_flag_names[]; -// states for the flags variable within the ship structure -// low bits are for mission file savable flags.. -// FRED needs these to be the low-order bits with no holes, -// because it indexes into an array, Hoffoss says. -#define SF_IGNORE_COUNT (1 << 0) // ignore this ship when counting ship types for goals -#define SF_REINFORCEMENT (1 << 1) // this ship is a reinforcement ship -#define SF_ESCORT (1 << 2) // this ship is an escort ship -#define SF_NO_ARRIVAL_MUSIC (1 << 3) // don't play arrival music when ship arrives -#define SF_NO_ARRIVAL_WARP (1 << 4) // no arrival warp in effect -#define SF_NO_DEPARTURE_WARP (1 << 5) // no departure warp in effect -//#define SF_LOCKED (1 << 6) // can't manipulate ship in loadout screens - -// high bits are for internal flags not saved to mission files -// Go from bit 31 down to bit 6 -#define SF_KILL_BEFORE_MISSION (1 << 31) -#define SF_DYING (1 << 30) -#define SF_DISABLED (1 << 29) -#define SF_DEPART_WARP (1 << 28) // ship is departing via warp-out -#define SF_DEPART_DOCKBAY (1 << 27) // ship is departing via docking bay -#define SF_ARRIVING_STAGE_1 (1 << 26) // ship is arriving. In other words, doing warp in effect, stage 1 -#define SF_ARRIVING_STAGE_2 (1 << 25) // ship is arriving. In other words, doing warp in effect, stage 2 -#define SF_ARRIVING (SF_ARRIVING_STAGE_1|SF_ARRIVING_STAGE_2) -#define SF_ENGINES_ON (1 << 24) // engines sound should play if set -#define SF_DOCK_LEADER (1 << 23) // Goober5000 - this guy is in charge of everybody he's docked to -#define SF_CARGO_REVEALED (1 << 22) // ship's cargo is revealed to all friendly ships -#define SF_FROM_PLAYER_WING (1 << 21) // set for ships that are members of any player starting wing -#define SF_PRIMARY_LINKED (1 << 20) // ships primary weapons are linked together -#define SF_SECONDARY_DUAL_FIRE (1 << 19) // ship is firing two missiles from the current secondary bank -#define SF_WARP_BROKEN (1 << 18) // set when warp drive is not working, but is repairable -#define SF_WARP_NEVER (1 << 17) // set when ship can never warp -#define SF_TRIGGER_DOWN (1 << 16) // ship has its "trigger" held down -#define SF_AMMO_COUNT_RECORDED (1 << 15) // we've recorded the initial secondary weapon count (which is used to limit support ship rearming) -#define SF_HIDDEN_FROM_SENSORS (1 << 14) // ship doesn't show up on sensors, blinks in/out on radar -#define SF_SCANNABLE (1 << 13) // ship is "scannable". Play scan effect and report as "Scanned" or "not scanned". -#define SF_WARPED_SUPPORT (1 << 12) // set when this is a support ship which was warped in automatically -#define SF_EXPLODED (1 << 11) // ship has exploded (needed for kill messages) -#define SF_SHIP_HAS_SCREAMED (1 << 10) // ship has let out a death scream -#define SF_RED_ALERT_STORE_STATUS (1 << 9) // ship status should be stored/restored if red alert mission -#define SF_VAPORIZE (1<<8) // ship is vaporized by beam - alternative death sequence -#define SF_DEPARTURE_ORDERED (1<<7) // departure of this ship was ordered by player - Goober5000, similar to WF_DEPARTURE_ORDERED - -// MWA -- don't go below whatever bitfield is used for Fred above (currently 6)!!!! - -#define SF_DEPARTING (SF_DEPART_WARP | SF_DEPART_DOCKBAY) // ship is departing -#define SF_CANNOT_WARP (SF_WARP_BROKEN | SF_WARP_NEVER | SF_DISABLED) // ship cannot warp out - - #define DEFAULT_SHIP_PRIMITIVE_SENSOR_RANGE 10000 // Goober5000 - -// Bits for ship.flags2 -#define SF2_PRIMITIVE_SENSORS (1<<0) // Goober5000 - primitive sensor display -#define SF2_FRIENDLY_STEALTH_INVIS (1<<1) // Goober5000 - when stealth, don't appear on radar even if friendly -#define SF2_STEALTH (1<<2) // Goober5000 - is this particular ship stealth -#define SF2_DONT_COLLIDE_INVIS (1<<3) // Goober5000 - is this particular ship don't-collide-invisible -#define SF2_NO_SUBSPACE_DRIVE (1<<4) // Goober5000 - this ship has no subspace drive -#define SF2_NAVPOINT_CARRY (1<<5) // Kazan - This ship autopilots with the player -#define SF2_AFFECTED_BY_GRAVITY (1<<6) // Goober5000 - ship affected by gravity points -#define SF2_TOGGLE_SUBSYSTEM_SCANNING (1<<7) // Goober5000 - switch whether subsystems are scanned -#define SF2_NO_BUILTIN_MESSAGES (1<<8) // Karajorma - ship should not send built-in messages -#define SF2_PRIMARIES_LOCKED (1<<9) // Karajorma - This ship can't fire primary weapons -#define SF2_SECONDARIES_LOCKED (1<<10) // Karajorma - This ship can't fire secondary weapons -#define SF2_GLOWMAPS_DISABLED (1<<11) // taylor - to disable glow maps -#define SF2_NO_DEATH_SCREAM (1<<12) // Goober5000 - for WCS -#define SF2_ALWAYS_DEATH_SCREAM (1<<13) // Goober5000 - for WCS -#define SF2_NAVPOINT_NEEDSLINK (1<<14) // Kazan - This ship requires "linking" for autopilot (when player ship gets within specified distance SF2_NAVPOINT_NEEDSLINK is replaced by SF2_NAVPOINT_CARRY) -#define SF2_HIDE_SHIP_NAME (1<<15) // Karajorma - Hides the ships name (like the -wcsaga command line used to but for any selected ship) -#define SF2_AFTERBURNER_LOCKED (1<<16) // KeldorKatarn - This ship can't use its afterburners -#define SF2_SET_CLASS_DYNAMICALLY (1<<18) // Karajorma - This ship should have its class assigned rather than simply read from the mission file -#define SF2_LOCK_ALL_TURRETS_INITIALLY (1<<19) // Karajorma - Lock all turrets on this ship at mission start or on arrival -#define SF2_FORCE_SHIELDS_ON (1<<20) -#define SF2_NO_ETS (1<<21) // The E - This ship does not have an ETS -#define SF2_CLOAKED (1<<22) // The E - This ship will not be rendered -#define SF2_NO_THRUSTERS (1<<23) // The E - Thrusters on this ship are not rendered. -#define SF2_SHIP_LOCKED (1<<24) // Karajorma - Prevents the player from changing the ship class on loadout screen -#define SF2_WEAPONS_LOCKED (1<<25) // Karajorma - Prevents the player from changing the weapons on the ship on the loadout screen -#define SF2_SHIP_SELECTIVE_LINKING (1<<26) // RSAXVC - Allow pilot to pick firing configuration -#define SF2_SCRAMBLE_MESSAGES (1<<27) // Goober5000 - all messages sent from this ship appear scrambled -#define SF2_NO_SECONDARY_LOCKON (1<<28) // zookeeper - secondary lock-on disabled -#define SF2_NO_DISABLED_SELF_DESTRUCT (1<<29) // Goober5000 - ship will not self-destruct after 90 seconds if engines or weapons destroyed (c.f. ai_maybe_self_destruct) - -// If any of these bits in the ship->flags are set, ignore this ship when targeting -extern int TARGET_SHIP_IGNORE_FLAGS; - #define MAX_DAMAGE_SLOTS 32 #define MAX_SHIP_ARCS 2 // How many "arcs" can be active at once... Must be less than MAX_ARC_EFFECTS in model.h. #define NUM_SUB_EXPL_HANDLES 2 // How many different big ship sub explosion sounds can be played. @@ -641,8 +559,7 @@ public: float current_max_speed; // Max ship speed (based on energy diverted to engines) int next_manage_ets; // timestamp for when ai can next modify ets ( -1 means never ) - uint flags; // flag variable to contain ship state (see SF_ #defines) - uint flags2; // another flag variable (see SF2_ #defines) + flagset flags; // flag variable to contain ship state int reinforcement_index; // index into reinforcement struct or -1 float afterburner_fuel; // amount of afterburner fuel remaining (capacity is stored @@ -818,6 +735,12 @@ public: // reset to a completely blank ship void clear(); + + //Helper functions + inline bool is_arriving() { return flags[Ship::Ship_Flags::Arriving_stage_1] || flags[Ship::Ship_Flags::Arriving_stage_2]; } + inline bool is_departing() { return flags[Ship::Ship_Flags::Depart_warp] || flags[Ship::Ship_Flags::Depart_dockbay]; } + inline bool cannot_warp() { return flags[Ship::Ship_Flags::Warp_broken] || flags[Ship::Ship_Flags::Warp_never] || flags[Ship::Ship_Flags::Disabled]; } + inline bool is_dying_or_departing() { return is_departing() || flags[Ship::Ship_Flags::Dying]; } }; struct ai_target_priority { @@ -828,9 +751,8 @@ struct ai_target_priority { SCP_vector ship_class; SCP_vector weapon_class; - unsigned int obj_flags; - int sif_flags; - int sif2_flags; + flagset obj_flags; + flagset sif_flags; int wif_flags; int wif2_flags; }; @@ -871,90 +793,6 @@ extern void ship_add_exited_ship( ship *shipp, int reason ); extern int ship_find_exited_ship_by_name( char *name ); extern int ship_find_exited_ship_by_signature( int signature); -#define SIF_NO_COLLIDE (1 << 0) -#define SIF_PLAYER_SHIP (1 << 1) -#define SIF_DEFAULT_PLAYER_SHIP (1 << 2) -#define SIF_PATH_FIXUP (1 << 3) // when set, path verts have been set for this ship's model -#define SIF_SUPPORT (1 << 4) // this ship can perform repair/rearm functions -#define SIF_AFTERBURNER (1 << 5) // this ship has afterburners -#define SIF_BALLISTIC_PRIMARIES (1 << 6) // this ship can equip ballistic primaries - Goober5000 - -// If you add a new ship type, then please add the appropriate type in the ship_count -// structure later in this file!!! and let MWA know!! -#define SIF_CARGO (1 << 7) // is this ship a cargo type ship -- used for docking purposes -#define SIF_FIGHTER (1 << 8) // this ship is a fighter -#define SIF_BOMBER (1 << 9) // this ship is a bomber -#define SIF_CRUISER (1 << 10) // this ship is a cruiser -#define SIF_FREIGHTER (1 << 11) // this ship is a freighter -#define SIF_CAPITAL (1 << 12) // this ship is a capital/installation ship -#define SIF_TRANSPORT (1 << 13) // this ship is a transport -#define SIF_NAVBUOY (1 << 14) // AL 11-24-97: this is a navbuoy -#define SIF_SENTRYGUN (1 << 15) // AL 11-24-97: this is a navbuoy with turrets -#define SIF_ESCAPEPOD (1 << 16) // AL 12-09-97: escape pods that fire from big ships -#define SIF_NO_SHIP_TYPE (1 << 17) // made distinct to help trap errors - -#define SIF_SHIP_COPY (1 << 18) // this ship is a copy of another ship in the table -- meaningful for scoring and possible other things -#define SIF_IN_TECH_DATABASE (1 << 19) // is ship type to be listed in the tech database? -#define SIF_IN_TECH_DATABASE_M (1 << 20) // is ship type to be listed in the tech database for multiplayer? - -#define SIF_STEALTH (1 << 21) // the ship has stealth capabilities -#define SIF_SUPERCAP (1 << 22) // the ship is a supercap -#define SIF_DRYDOCK (1 << 23) // the ship is a drydock -#define SIF_SHIP_CLASS_DONT_COLLIDE_INVIS (1 << 24) // Don't collide with this ship's invisible polygons - -#define SIF_BIG_DAMAGE (1 << 25) // this ship is classified as a big damage ship -#define SIF_HAS_AWACS (1 << 26) // ship has an awacs subsystem - -#define SIF_CORVETTE (1 << 27) // corvette class (currently this only means anything for briefing icons) -#define SIF_GAS_MINER (1 << 28) // also just for briefing icons -#define SIF_AWACS (1 << 29) // ditto - -#define SIF_KNOSSOS_DEVICE (1 << 30) // this is the knossos device - -#define SIF_NO_FRED (1 << 31) // not available in fred - - -// flags2 list. -#define SIF2_DEFAULT_IN_TECH_DATABASE (1 << 0) // default in tech database - Goober5000 -#define SIF2_DEFAULT_IN_TECH_DATABASE_M (1 << 1) // ditto - Goober5000 -#define SIF2_FLASH (1 << 2) // makes a flash when it explodes -#define SIF2_SHOW_SHIP_MODEL (1 << 3) // Show ship model even in first person view -#define SIF2_SURFACE_SHIELDS (1 << 4) // _argv[-1], 16 Jan 2005: Enable surface shields for this ship. -#define SIF2_GENERATE_HUD_ICON (1 << 5) // Enable generation of a HUD shield icon -#define SIF2_DISABLE_WEAPON_DAMAGE_SCALING (1 << 6) // WMC - Disable weapon scaling based on flags -#define SIF2_GUN_CONVERGENCE (1 << 7) // WMC - Gun convergence based on model weapon norms. -#define SIF2_NO_THRUSTER_GEO_NOISE (1 << 8) // Echelon9 - No thruster geometry noise. -#define SIF2_INTRINSIC_NO_SHIELDS (1 << 9) // Chief - disables shields for this ship even without No Shields in mission. -#define SIF2_NO_PRIMARY_LINKING (1 << 10) // Chief - slated for 3.7 originally, but this looks pretty simple to implement. -#define SIF2_NO_PAIN_FLASH (1 << 11) // The E - disable red pain flash -#define SIF2_ALLOW_LANDINGS (1 << 12) // SUSHI: Automatically set if any subsystems allow landings (as a shortcut) -#define SIF2_NO_ETS (1 << 13) // The E - No ETS on this ship class -#define SIF2_NO_LIGHTING (1 << 14) // Valathil - No lighting for this ship -#define SIF2_DYN_PRIMARY_LINKING (1 << 15) // RSAXVC - Dynamically generate weapon linking options -#define SIF2_AUTO_SPREAD_SHIELDS (1 << 16) // zookeeper - auto spread shields -#define SIF2_DRAW_WEAPON_MODELS (1 << 17) // the ship draws weapon models of any sort (used to be a boolean) -#define SIF2_MODEL_POINT_SHIELDS (1 << 18) // zookeeper - uses model-defined shield points instead of quadrants -#define SIF2_SUBSYS_REPAIR_WHEN_DISABLED (1 << 19) // MageKing17 - Subsystems auto-repair themselves even when disabled. - -#define SIF_DEFAULT_VALUE 0 -#define SIF2_DEFAULT_VALUE 0 - -#define SIF_ALL_SHIP_TYPES (SIF_CARGO | SIF_FIGHTER | SIF_BOMBER | SIF_CRUISER | SIF_FREIGHTER | SIF_CAPITAL | SIF_TRANSPORT | SIF_SUPPORT | SIF_NO_SHIP_TYPE | SIF_NAVBUOY | SIF_SENTRYGUN | SIF_ESCAPEPOD | SIF_SUPERCAP | SIF_CORVETTE | SIF_GAS_MINER | SIF_AWACS | SIF_KNOSSOS_DEVICE) -#define SIF_SMALL_SHIP (SIF_FIGHTER | SIF_BOMBER | SIF_SUPPORT | SIF_ESCAPEPOD ) -#define SIF_BIG_SHIP (SIF_CRUISER | SIF_FREIGHTER | SIF_TRANSPORT | SIF_CORVETTE | SIF_GAS_MINER | SIF_AWACS) -#define SIF_HUGE_SHIP (SIF_CAPITAL | SIF_SUPERCAP | SIF_DRYDOCK | SIF_KNOSSOS_DEVICE) -#define SIF_NOT_FLYABLE (SIF_CARGO | SIF_NAVBUOY | SIF_SENTRYGUN) // AL 11-24-97: this useful to know for targeting reasons -#define SIF_HARMLESS (SIF_CARGO | SIF_NAVBUOY | SIF_ESCAPEPOD) // AL 12-3-97: ships that are not a threat -// for ships of this type, we make beam weapons miss a little bit otherwise they'd be way too powerful -#define SIF_BEAM_JITTER (SIF_CARGO | SIF_FIGHTER | SIF_BOMBER | SIF_FREIGHTER | SIF_TRANSPORT | SIF_SENTRYGUN | SIF_NAVBUOY | SIF_ESCAPEPOD) -// these ships avoid shockwaves -// (the weird thing is that freighters and transports used to be explicitly allowed in one part of the code but then explicitly disallowed in another) -#define SIF_AVOID_SHOCKWAVE SIF_SMALL_SHIP - -// masks for preventing only non flag entry SIF flags from being cleared -#define SIF_MASK SIF_AFTERBURNER -#define SIF2_MASK SIF2_DRAW_WEAPON_MODELS - #define REGULAR_WEAPON (1<<0) #define DOGFIGHT_WEAPON (1<<1) @@ -1225,8 +1063,7 @@ public: float warpout_player_speed; - int flags; // See SIF_xxxx - changed to uint by Goober5000, changed back by Zacam - int flags2; // See SIF2_xxxx - added by Goober5000, changed by Zacam + flagset flags; // See SIF_xxxx - changed to uint by Goober5000, changed back by Zacam, and changed to something entirely different by The E! int ai_class; // Index into Ai_classes[]. Defined in ai.tbl float max_speed, min_speed, max_accel; @@ -1465,6 +1302,17 @@ public: void free_strings(); + //Helper functions + + inline bool is_small_ship() const { return flags[Ship::Info_Flags::Fighter] || flags[Ship::Info_Flags::Bomber] || flags[Ship::Info_Flags::Support] || flags[Ship::Info_Flags::Escapepod]; } + inline bool is_big_ship() const { return flags[Ship::Info_Flags::Cruiser] || flags[Ship::Info_Flags::Freighter] || flags[Ship::Info_Flags::Transport] || flags[Ship::Info_Flags::Corvette] || flags[Ship::Info_Flags::Gas_miner] || flags[Ship::Info_Flags::Awacs]; } + inline bool is_huge_ship() const { return flags[Ship::Info_Flags::Capital] || flags[Ship::Info_Flags::Supercap] || flags[Ship::Info_Flags::Drydock] || flags[Ship::Info_Flags::Knossos_device]; } + inline bool is_flyable() const { return !(flags[Ship::Info_Flags::Cargo] || flags[Ship::Info_Flags::Navbuoy] || flags[Ship::Info_Flags::Escapepod]); } + inline bool is_harmless() const { return !is_flyable(); } + inline bool is_fighter_bomber() const { return flags[Ship::Info_Flags::Fighter] || flags[Ship::Info_Flags::Bomber]; } + inline bool is_big_or_huge() const { return is_big_ship() || is_huge_ship(); } + inline bool avoids_shockwaves() const { return is_small_ship(); } + private: void move(ship_info&& other); @@ -1829,8 +1677,8 @@ void ship_primary_changed(ship *sp); void ship_secondary_changed(ship *sp); // get the Ship_info flags for a given ship -int ship_get_SIF(ship *shipp); -int ship_get_SIF(int sh); +flagset ship_get_SIF(ship *shipp); +flagset ship_get_SIF(int sh); // get the ship type info (objecttypes.tbl) ship_type_info *ship_get_type_info(object *objp); @@ -2046,4 +1894,13 @@ int get_default_player_ship_index(); */ int get_nearest_bbox_point(object *ship_obj, vec3d *start, vec3d *box_pt); +extern flagset Ignore_List; +inline bool should_be_ignored(ship* shipp) { + return (shipp->flags & Ignore_List).any_set(); +} + +extern void set_default_ignore_list(); + +extern void toggle_ignore_list_flag(Ship::Ship_Flags flag); + #endif diff --git a/code/ship/ship_flags.h b/code/ship/ship_flags.h new file mode 100644 index 0000000000..2fc8b8e60d --- /dev/null +++ b/code/ship/ship_flags.h @@ -0,0 +1,288 @@ +#ifndef SHIP_FLAGS_H +#define SHIP_FLAGS_H + +#include "globalincs/flagset.h" + +namespace Ship { + + FLAG_LIST(Weapon_Flags){ + Beam_Free = 0, // if this is a beam weapon, its free to fire + Turret_Lock, // is this turret is free to fire or locked + Tagged_Only, // only fire if target is tagged + + NUM_VALUES + }; + + FLAG_LIST(Subsystem_Flags) { + Cargo_revealed = 0, + Untargetable, + No_SS_targeting, + Has_fired, // used by scripting to flag a turret as having been fired + FOV_Required, + FOV_edge_check, + No_replace, // prevents 'destroyed' submodel from being rendered if subsys is destroyed. + No_live_debris, // prevents subsystem from generating live debris + Vanished, // allows subsystem to be made to disappear without a trace (for swapping it for a true model for example. + Missiles_ignore_if_dead, // forces homing missiles to target hull if subsystem is dead before missile hits it. + Rotates, + Damage_as_hull, // Applies armor damage instead of subsystem damge. - FUBAR + No_aggregate, // exclude this subsystem from the aggregate subsystem-info tracking - Goober5000 + Play_sound_for_player, // If this subsystem is a turret on a player ship, play firing sounds - The E + No_disappear, // prevents submodel from disappearing when subsys destroyed + Autorepair_if_disabled, // Allows the subsystem to repair itself even when disabled - MageKing17 + No_autorepair_if_disabled, // Inversion of the above; allow a specific subsystem not to repair itself after being disabled if the ship has the "repair disabled subsystems" flag - MageKing17 + + NUM_VALUES + }; + + FLAG_LIST(System_Flags) { + Alive = 0, // subsystem has active alive sound + Dead, // subsystem has active dead sound + Rotate, // subsystem has active rotation sound + Turret_rotation, // rotation sound to be scaled like turrets do + + NUM_VALUES + }; + + FLAG_LIST(Ship_Flags) { + Ignore_count = 0, // ignore this ship when counting ship types for goals + Reinforcement, // this ship is a reinforcement ship + Escort, // this ship is an escort ship + No_arrival_music, // don't play arrival music when ship arrives + No_arrival_warp, // no arrival warp in effect + No_departure_warp, // no departure warp in effect + Kill_before_mission, + Dying, + Disabled, + Depart_warp, // ship is departing via warp-out + Depart_dockbay, // ship is departing via docking bay + Arriving_stage_1, // ship is arriving. In other words, doing warp in effect, stage 1 + Arriving_stage_2, // ship is arriving. In other words, doing warp in effect, stage 2 + Engines_on, // engines sound should play if set + Dock_leader, // Goober5000 - this guy is in charge of everybody he's docked to + Cargo_revealed, // ship's cargo is revealed to all friendly ships + From_player_wing, // set for ships that are members of any player starting wing + Primary_linked, // ships primary weapons are linked together + Secondary_dual_fire, // ship is firing two missiles from the current secondary bank + Warp_broken, // set when warp drive is not working, but is repairable + Warp_never, // set when ship can never warp + Trigger_down, // ship has its "trigger" held down + Ammo_count_recorded, // we've recorded the initial secondary weapon count (which is used to limit support ship rearming) + Hidden_from_sensors, // ship doesn't show up on sensors, blinks in/out on radar + Scannable, // ship is "scannable". Play scan effect and report as "Scanned" or "not scanned". + Warped_support, // set when this is a support ship which was warped in automatically + Exploded, // ship has exploded (needed for kill messages) + Ship_has_screamed, // ship has let out a death scream + Red_alert_store_status, // ship status should be stored/restored if red alert mission + Vaporize, // ship is vaporized by beam - alternative death sequence + Departure_ordered, // departure of this ship was ordered by player - Goober5000, similar to WF_DEPARTURE_ORDERED + Primitive_sensors, // Goober5000 - primitive sensor display + Friendly_stealth_invis, // Goober5000 - when stealth, don't appear on radar even if friendly + Stealth, // Goober5000 - is this particular ship stealth + Dont_collide_invis, // Goober5000 - is this particular ship don't-collide-invisible + No_subspace_drive, // Goober5000 - this ship has no subspace drive + Navpoint_carry, // Kazan - This ship autopilots with the player + Affected_by_gravity, // Goober5000 - ship affected by gravity points + Toggle_subsystem_scanning, // Goober5000 - switch whether subsystems are scanned + No_builtin_messages, // Karajorma - ship should not send built-in messages + Primaries_locked, // Karajorma - This ship can't fire primary weapons + Secondaries_locked, // Karajorma - This ship can't fire secondary weapons + Glowmaps_disabled, // taylor - to disable glow maps + No_death_scream, // Goober5000 - for WCS + Always_death_scream, // Goober5000 - for WCS + Navpoint_needslink, // Kazan - This ship requires "linking" for autopilot (when player ship gets within specified distance NAVPOINT_NEEDSLINK is replaced by NAVPOINT_CARRY) + Hide_ship_name, // Karajorma - Hides the ships name (like the -wcsaga command line used to but for any selected ship) + Afterburner_locked, // KeldorKatarn - This ship can't use its afterburners + Set_class_dynamically, // Karajorma - This ship should have its class assigned rather than simply read from the mission file + Lock_all_turrets_initially, // Karajorma - Lock all turrets on this ship at mission start or on arrival + Force_shields_on, + No_ets, // The E - This ship does not have an ETS + Cloaked, // The E - This ship will not be rendered + No_thrusters, // The E - Thrusters on this ship are not rendered. + Ship_locked, // Karajorma - Prevents the player from changing the ship class on loadout screen + Weapons_locked, // Karajorma - Prevents the player from changing the weapons on the ship on the loadout screen + Ship_selective_linking, // RSAXVC - Allow pilot to pick firing configuration + Scramble_messages, // Goober5000 - all messages sent from this ship appear scrambled + No_secondary_lockon, // zookeeper - secondary lock-on disabled + No_disabled_self_destruct, // Goober5000 - ship will not self-destruct after 90 seconds if engines or weapons destroyed (c.f. ai_maybe_self_destruct) + + NUM_VALUES + + }; + + FLAG_LIST(Exit_Flags) { + Destroyed = 0, + Departed, + Cargo_known, + Player_deleted, + Been_tagged, + Red_alert_carry, + + NUM_VALUES + }; + + FLAG_LIST(Info_Flags) { + No_collide = 0, + Player_ship, + Default_player_ship, + Path_fixup, // when set, path verts have been set for this ship's model + Support, // this ship can perform repair/rearm functions + Afterburner, // this ship has afterburners + Ballistic_primaries, // this ship can equip ballistic primaries - Goober5000 + Cargo, // is this ship a cargo type ship -- used for docking purposes + Fighter, // this ship is a fighter + Bomber, // this ship is a bomber + Cruiser, // this ship is a cruiser + Freighter, // this ship is a freighter + Capital, // this ship is a capital/installation ship + Transport, // this ship is a transport + Navbuoy, // AL 11-24-97: this is a navbuoy + Sentrygun, // AL 11-24-97: this is a navbuoy with turrets + Escapepod, // AL 12-09-97: escape pods that fire from big ships + No_ship_type, // made distinct to help trap errors + Ship_copy, // this ship is a copy of another ship in the table -- meaningful for scoring and possible other things + In_tech_database, // is ship type to be listed in the tech database? + In_tech_database_m, // is ship type to be listed in the tech database for multiplayer? + Stealth, // the ship has stealth capabilities + Supercap, // the ship is a supercap + Drydock, // the ship is a drydock + Ship_class_dont_collide_invis, // Don't collide with this ship's invisible polygons + Big_damage, // this ship is classified as a big damage ship + Has_awacs, // ship has an awacs subsystem + Corvette, // corvette class (currently this only means anything for briefing icons) + Gas_miner, // also just for briefing icons + Awacs, // ditto + Knossos_device, // this is the knossos device + No_fred, // not available in fred + Default_in_tech_database, // default in tech database - Goober5000 + Default_in_tech_database_m, // ditto - Goober5000 + Flash, // makes a flash when it explodes + Show_ship_model, // Show ship model even in first person view + Surface_shields, // _argv[-1], 16 Jan 2005: Enable surface shields for this ship. + Generate_hud_icon, // Enable generation of a HUD shield icon + Disable_weapon_damage_scaling, // WMC - Disable weapon scaling based on flags + Gun_convergence, // WMC - Gun convergence based on model weapon norms. + No_thruster_geo_noise, // Echelon9 - No thruster geometry noise. + Intrinsic_no_shields, // Chief - disables shields for this ship even without No Shields in mission. + No_primary_linking, // Chief - slated for 3.7 originally, but this looks pretty simple to implement. + No_pain_flash, // The E - disable red pain flash + Allow_landings, // SUSHI: Automatically set if any subsystems allow landings (as a shortcut) + No_ets, // The E - No ETS on this ship class + No_lighting, // Valathil - No lighting for this ship + Dyn_primary_linking, // RSAXVC - Dynamically generate weapon linking options + Auto_spread_shields, // zookeeper - auto spread shields + Draw_weapon_models, // the ship draws weapon models of any sort (used to be a boolean) + Model_point_shields, // zookeeper - uses model-defined shield points instead of quadrants + Subsys_repair_when_disabled, // MageKing17 - Subsystems auto-repair themselves even when disabled. + + NUM_VALUES + }; + + FLAG_LIST(Aiming_Flags) { + Autoaim = 0, // has autoaim + Auto_convergence, // has automatic convergence + Std_convergence, // has standard - ie. non-automatic - convergence + Autoaim_convergence, // has autoaim with convergence + Convergence_offset, // marks that convergence has offset value + + NUM_VALUES + }; + + FLAG_LIST(Type_Info_Msg) { + Counts_for_alone, + Praise_destruction, + + NUM_VALUES + }; + + FLAG_LIST(Type_Info_Hud) { + Hotkey_on_list, + Target_as_threat, + Show_attack_direction, + No_class_display, + + NUM_VALUES + }; + + FLAG_LIST(Type_Info_Ship) { + Scannable, + Warp_pushes, + Warp_pushable, + Turret_tgt_ship_tgt, + + NUM_VALUES + }; + + FLAG_LIST(Type_Info_Weapon) { + Beams_easily_hit, + No_huge_impact_eff, + + NUM_VALUES + }; + + FLAG_LIST(Type_Info_AI) { + Accept_player_orders, + Auto_attacks, + Attempt_broadside, + Guards_attack, + Turrets_attack, + Can_form_wing, + Protected_on_cripple, + + NUM_VALUES + }; + + FLAG_LIST(Thruster_Flags) { + Bank_right, + Bank_left, + Pitch_up, + Pitch_down, + Roll_right, + Roll_left, + Slide_right, + Slide_left, + Slide_up, + Slide_down, + Forward, + Reverse, + + NUM_VALUES + }; + + FLAG_LIST(Wing_Flags) { + Gone, // all ships were either destroyed or departed + Departing, // wing's departure cue turned true + Ignore_count, // ignore all ships in this wing for goal counting purposes. + Reinforcement, // is this wing a reinforcement wing + Reset_reinforcement, // needed when we need to reset the wing's reinforcement flag (after calling it in) + No_arrival_music, // don't play arrival music when wing arrives + Expanded, // wing expanded in hotkey select screen + No_arrival_message, // don't play any arrival message + No_arrival_warp, // don't play warp effect for any arriving ships in this wing. + No_departure_warp, // don't play warp effect for any departing ships in this wing. + No_dynamic, // members of this wing relentlessly pursue their ai goals + Departure_ordered, // departure of this wing was ordered by player + Never_existed, // this wing never existed because something prevented it from being created (like its mother ship being destroyed) + Nav_carry, // Kazan - Wing has nav-carry-status + + NUM_VALUES + }; + + FLAG_LIST(Subsys_Sound_Flags) { + Alive, + Dead, + Rotate, + Turret_Rotation, + + NUM_VALUES + }; + + FLAG_LIST(Awacs_Warning_Flags) { + None = 0, + Warn_25, + Warn_75, + + NUM_VALUES + }; +} +#endif \ No newline at end of file diff --git a/code/ship/shipcontrails.cpp b/code/ship/shipcontrails.cpp index a0090bae1f..89282533f9 100644 --- a/code/ship/shipcontrails.cpp +++ b/code/ship/shipcontrails.cpp @@ -435,10 +435,10 @@ bool ct_display_contrails() bool display; // normally display trails in a full nebula environment - display = (The_mission.flags & MISSION_FLAG_FULLNEB) ? true : false; + display = (The_mission.flags[Mission::Mission_Flags::Fullneb]) ? true : false; // toggle according to flag - if (The_mission.flags & MISSION_FLAG_TOGGLE_SHIP_TRAILS) + if (The_mission.flags[Mission::Mission_Flags::Toggle_ship_trails]) display = !display; return display; diff --git a/code/ship/shipfx.cpp b/code/ship/shipfx.cpp index 2b6b1e6098..4d0423b3ce 100644 --- a/code/ship/shipfx.cpp +++ b/code/ship/shipfx.cpp @@ -160,7 +160,7 @@ void shipfx_subsystem_maybe_create_live_debris(object *ship_objp, ship *ship_p, vm_vec_sub(&delta_x, &end_world_pos, &world_axis_pt); vm_vec_cross(&radial_vel, &rotvel, &delta_x); - if (Ship_info[ship_p->ship_info_index].flags & SIF_KNOSSOS_DEVICE) { + if (Ship_info[ship_p->ship_info_index].flags[Ship::Info_Flags::Knossos_device]) { // set velocity to cross center of knossos device vec3d rand_vec, vec_to_center; @@ -194,7 +194,7 @@ void shipfx_subsystem_maybe_create_live_debris(object *ship_objp, ship *ship_p, scale = exp_mag; } - if (Ship_info[ship_p->ship_info_index].flags & SIF_KNOSSOS_DEVICE) { + if (Ship_info[ship_p->ship_info_index].flags[Ship::Info_Flags::Knossos_device]) { scale = 1.0f; } @@ -202,7 +202,7 @@ void shipfx_subsystem_maybe_create_live_debris(object *ship_objp, ship *ship_p, } // scale up speed of debris if ship_obj > 125, but not for knossos - if (ship_objp->radius > 250 && !(Ship_info[ship_p->ship_info_index].flags & SIF_KNOSSOS_DEVICE)) { + if (ship_objp->radius > 250 && !(Ship_info[ship_p->ship_info_index].flags[Ship::Info_Flags::Knossos_device])) { vm_vec_scale(&live_debris_obj->phys_info.vel, ship_objp->radius/250.0f); } } @@ -525,8 +525,8 @@ float shipfx_calculate_warp_dist(object *objp) // fx don't work for some reason. void shipfx_actually_warpin(ship *shipp, object *objp) { - shipp->flags &= (~SF_ARRIVING_STAGE_1); - shipp->flags &= (~SF_ARRIVING_STAGE_2); + shipp->flags.remove(Ship::Ship_Flags::Arriving_stage_1); + shipp->flags.remove(Ship::Ship_Flags::Arriving_stage_2); // let physics in on it too. objp->phys_info.flags &= (~PF_WARP_IN); @@ -548,7 +548,7 @@ int shipfx_special_warp_objnum_valid(int objnum) return 0; // must be a knossos - if (!(Ship_info[Ships[special_objp->instance].ship_info_index].flags & SIF_KNOSSOS_DEVICE)) + if (!(Ship_info[Ships[special_objp->instance].ship_info_index].flags[Ship::Info_Flags::Knossos_device])) return 0; return 1; @@ -566,7 +566,7 @@ void shipfx_warpin_start( object *objp ) { ship *shipp = &Ships[objp->instance]; - if (shipp->flags & SF_ARRIVING) + if (shipp->is_arriving()) { mprintf(( "Ship '%s' is already arriving!\n", shipp->ship_name )); Int3(); @@ -575,7 +575,7 @@ void shipfx_warpin_start( object *objp ) // docked ships who are not dock leaders don't use the warp effect code // (the dock leader takes care of the whole group) - if (object_is_docked(objp) && !(shipp->flags & SF_DOCK_LEADER)) + if (object_is_docked(objp) && !(shipp->flags[Ship::Ship_Flags::Dock_leader])) { return; } @@ -590,7 +590,7 @@ void shipfx_warpin_start( object *objp ) } // if there is no arrival warp, then skip the whole thing - if (shipp->flags & SF_NO_ARRIVAL_WARP) + if (shipp->flags[Ship::Ship_Flags::No_arrival_warp]) { shipfx_actually_warpin(shipp,objp); return; @@ -608,7 +608,7 @@ void shipfx_warpin_frame( object *objp, float frametime ) shipp = &Ships[objp->instance]; - if ( shipp->flags & SF_DYING ) return; + if ( shipp->flags[Ship::Ship_Flags::Dying] ) return; shipp->warpin_effect->warpFrame(frametime); } @@ -645,7 +645,7 @@ int compute_special_warpout_stuff(object *objp, float *speed, float *warp_time, if ((ref_objnum >= 0) && (ref_objnum < MAX_OBJECTS)) { sp_objp = &Objects[ref_objnum]; if (sp_objp->type == OBJ_SHIP) { - if (Ship_info[Ships[sp_objp->instance].ship_info_index].flags & SIF_KNOSSOS_DEVICE) { + if (Ship_info[Ships[sp_objp->instance].ship_info_index].flags[Ship::Info_Flags::Knossos_device]) { valid_reference_ship = TRUE; } } @@ -683,7 +683,7 @@ int compute_special_warpout_stuff(object *objp, float *speed, float *warp_time, // validate angle float max_warpout_angle = 0.707f; // 45 degree half-angle cone for small ships - if (Ship_info[Ships[objp->instance].ship_info_index].flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP)) { + if (Ship_info[Ships[objp->instance].ship_info_index].is_big_or_huge()) { max_warpout_angle = 0.866f; // 30 degree half-angle cone for BIG or HUGE } @@ -748,7 +748,7 @@ void compute_warpout_stuff(object *objp, float *speed, float *warp_time, vec3d * // If this is a huge ship, set the distance to the length of the ship - if (sip->flags & SIF_HUGE_SHIP) + if (sip->is_huge_ship()) { ship_move_dist = 0.5f * ship_class_get_length(sip); } @@ -778,7 +778,7 @@ void compute_warpout_stuff(object *objp, float *speed, float *warp_time, vec3d * warp_dist = ship_move_dist; // allow for off center - if (sip->flags & SIF_HUGE_SHIP) { + if (sip->is_huge_ship()) { polymodel *pm = model_get(sip->model_num); warp_dist -= pm->mins.xyz.z; } @@ -796,7 +796,7 @@ void shipfx_warpout_start( object *objp ) ship *shipp; shipp = &Ships[objp->instance]; - if ( shipp->flags & SF_DEPART_WARP ) { + if ( shipp->flags[Ship::Ship_Flags::Depart_warp] ) { mprintf(( "Ship is already departing!\n" )); return; } @@ -810,30 +810,30 @@ void shipfx_warpout_start( object *objp ) } // if we're dying return - if ( shipp->flags & SF_DYING ) { + if ( shipp->flags[Ship::Ship_Flags::Dying] ) { return; } //return if disabled - if ( shipp->flags & SF_DISABLED ){ + if ( shipp->flags[Ship::Ship_Flags::Disabled] ){ return; } // if we're HUGE, keep alive - set guardian - if (Ship_info[shipp->ship_info_index].flags & SIF_HUGE_SHIP) { + if (Ship_info[shipp->ship_info_index].is_huge_ship()) { shipp->ship_guardian_threshold = SHIP_GUARDIAN_THRESHOLD_DEFAULT; } // don't send ship depart packets for player ships - if ( (MULTIPLAYER_MASTER) && !(objp->flags & OF_PLAYER_SHIP) ){ + if ( (MULTIPLAYER_MASTER) && !(objp->flags[Object::Object_Flags::Player_ship]) ){ send_ship_depart_packet( objp ); } // don't do departure wormhole if ship flag is set which indicates no effect - if ( shipp->flags & SF_NO_DEPARTURE_WARP ) { + if ( shipp->flags[Ship::Ship_Flags::No_departure_warp] ) { // DKA 5/25/99 If he's going to warpout, set it. // Next line fixes assert in wing cleanup code when no warp effect. - shipp->flags |= SF_DEPART_WARP; + shipp->flags.set(Ship::Ship_Flags::Depart_warp); shipfx_actually_warpout(objp->instance); return; @@ -850,12 +850,13 @@ void shipfx_warpout_frame( object *objp, float frametime ) ship *shipp; shipp = &Ships[objp->instance]; - if ( shipp->flags & SF_DYING ) return; + if ( shipp->flags[Ship::Ship_Flags::Dying] ) return; //disabled ships should stay on the battlefield if they were disabled during warpout //phreak 5/22/03 - if (shipp->flags & SF_DISABLED){ - shipp->flags &= ~(SF_DEPARTING); + if (shipp->flags[Ship::Ship_Flags::Disabled]){ + shipp->flags.remove(Ship::Ship_Flags::Depart_dockbay); + shipp->flags.remove(Ship::Ship_Flags::Depart_warp); return; } @@ -1104,7 +1105,7 @@ bool shipfx_eye_in_shadow( vec3d *eye_pos, object * src_obj, int sun_n ) } } - if ( sip->flags2 & SIF2_SHOW_SHIP_MODEL ) { + if ( sip->flags[Ship::Info_Flags::Show_ship_model] ) { vm_vec_scale_add( &rp1, &rp0, &light_dir, Viewer_obj->radius*10.0f ); mc.model_instance_num = -1; @@ -1488,7 +1489,7 @@ void shipfx_emit_spark( int n, int sn ) // // phreak: Mantis 1676 - Re-enable warpout clipping. - if ((shipp->flags & (SF_ARRIVING|SF_DEPART_WARP)) && (shipp->warpout_effect)) + if ((shipp->is_arriving() || shipp->flags[Ship::Ship_Flags::Depart_warp]) && (shipp->warpout_effect)) { vec3d warp_pnt, tmp; matrix warp_orient; @@ -1500,10 +1501,10 @@ void shipfx_emit_spark( int n, int sn ) if ( vm_vec_dot( &tmp, &warp_orient.vec.fvec ) < 0.0f ) { - if (shipp->flags & SF_ARRIVING)// if in front of warp plane, don't create. + if (shipp->is_arriving())// if in front of warp plane, don't create. create_spark = 0; } else { - if (shipp->flags & SF_DEPART_WARP) + if (shipp->flags[Ship::Ship_Flags::Depart_warp]) create_spark = 0; } } @@ -1515,7 +1516,7 @@ void shipfx_emit_spark( int n, int sn ) pe.pos = outpnt; // Where the particles emit from - if ( shipp->flags & (SF_ARRIVING|SF_DEPART_WARP) ) { + if (shipp->is_arriving() || shipp->flags[Ship::Ship_Flags::Depart_warp]) { // No velocity if going through warp. pe.vel = vmd_zero_vector; } else { @@ -1558,7 +1559,7 @@ void shipfx_emit_spark( int n, int sn ) // first time through - set up end time and make heavier initially if ( sn > -1 ) { // Sparks for first time at this spot - if (sip->flags & SIF_FIGHTER) { + if (sip->flags[Ship::Info_Flags::Fighter]) { if (hull_percent > 0.6f) { // sparks only once when hull > 60% float spark_duration = (float)pow(2.0f, -5.0f*(hull_percent-1.3f)) * (1.0f + 0.6f*(frand()-0.5f)); // +- 30% @@ -2244,7 +2245,7 @@ int shipfx_large_blowup_do_frame(ship *shipp, float frametime) if ( timestamp_elapsed(the_split_ship->explosion_flash_timestamp) ) { if ( !the_split_ship->explosion_flash_started ) { object* objp = &Objects[shipp->objnum]; - if (objp->flags & OF_WAS_RENDERED) { + if (objp->flags[Object::Object_Flags::Was_rendered]) { float excess_dist = vm_vec_dist(&Player_obj->pos, &objp->pos) - 2.0f*objp->radius - Player_obj->radius; float intensity = 1.0f - 0.1f*excess_dist / objp->radius; @@ -2252,7 +2253,7 @@ int shipfx_large_blowup_do_frame(ship *shipp, float frametime) intensity = 1.0f; } - if (intensity > 0.1f && Ship_info[shipp->ship_info_index].flags2 & SIF2_FLASH) { + if (intensity > 0.1f && Ship_info[shipp->ship_info_index].flags[Ship::Info_Flags::Flash]) { big_explosion_flash(intensity); } } @@ -2562,24 +2563,24 @@ void shipfx_do_lightning_frame( ship *shipp ) objp = &Objects[shipp->objnum]; // if this is not a nebula mission, don't do anything - if(!(The_mission.flags & MISSION_FLAG_FULLNEB)){ + if(!(The_mission.flags[Mission::Mission_Flags::Fullneb])){ shipp->lightning_stamp = -1; return; } // if this not a cruiser or big ship - if(!((sip->flags & SIF_CRUISER) || (sip->flags & SIF_BIG_SHIP) || (sip->flags & SIF_HUGE_SHIP))){ + if(!((sip->flags[Ship::Info_Flags::Cruiser]) || (sip->is_big_ship()) || (sip->is_huge_ship()))){ shipp->lightning_stamp = -1; return; } // determine stamp and count values - if(sip->flags & SIF_CRUISER){ + if(sip->flags[Ship::Info_Flags::Cruiser]){ stamp = (int)((float)(Nebl_cruiser_min + ((Nebl_cruiser_max - Nebl_cruiser_min) * Nebl_intensity)) * frand_range(0.8f, 1.1f)); count = l_cruiser_count; } else { - if(sip->flags & SIF_HUGE_SHIP){ + if(sip->is_huge_ship()){ stamp = (int)((float)(Nebl_supercap_min + ((Nebl_supercap_max - Nebl_supercap_min) * Nebl_intensity)) * frand_range(0.8f, 1.1f)); count = l_huge_count; } else { @@ -2729,7 +2730,7 @@ void shipfx_do_shockwave_stuff(ship *shipp, shockwave_create_info *sci) vm_vec_add(&shockwave_pos, &tail, &temp); // if knossos device, make shockwave in center - if (Ship_info[shipp->ship_info_index].flags & SIF_KNOSSOS_DEVICE) { + if (Ship_info[shipp->ship_info_index].flags[Ship::Info_Flags::Knossos_device]) { shockwave_pos = Objects[shipp->objnum].pos; } @@ -2780,7 +2781,7 @@ void engine_wash_ship_process(ship *shipp) float max_wash_dist, half_angle, radius_mult; // if this is not a fighter or bomber, we don't care - if ((objp->type != OBJ_SHIP) || !(Ship_info[shipp->ship_info_index].flags & (SIF_FIGHTER|SIF_BOMBER)) ) { + if ((objp->type != OBJ_SHIP) || !(Ship_info[shipp->ship_info_index].is_fighter_bomber()) ) { return; } @@ -2822,9 +2823,9 @@ void engine_wash_ship_process(ship *shipp) ship_info *wash_sip = &Ship_info[wash_shipp->ship_info_index]; // don't do small ships - if ( (wash_sip->flags & SIF_SMALL_SHIP) ) { - continue; - } + if (wash_sip->is_small_ship()) { + continue; + } pm = model_get(wash_sip->model_num); float ship_intensity = 0; @@ -2853,7 +2854,7 @@ void engine_wash_ship_process(ship *shipp) // check if thruster bank has engine wash if (bank->wash_info_pointer == NULL) { // if huge, give default engine wash - if ((wash_sip->flags & SIF_HUGE_SHIP) && !Engine_wash_info.empty()) { + if ((wash_sip->is_huge_ship()) && !Engine_wash_info.empty()) { bank->wash_info_pointer = &Engine_wash_info[0]; nprintf(("wash", "Adding default engine wash to ship %s", wash_sip->name)); } else { @@ -3397,9 +3398,9 @@ int WarpEffect::warpEnd() if(!this->isValid()) return 0; - shipp->flags &= (~SF_ARRIVING_STAGE_1); - shipp->flags &= (~SF_ARRIVING_STAGE_2); - shipp->flags &= (~SF_DEPART_WARP); + shipp->flags.remove(Ship::Ship_Flags::Arriving_stage_1); + shipp->flags.remove(Ship::Ship_Flags::Arriving_stage_2); + shipp->flags.remove(Ship::Ship_Flags::Depart_warp); // let physics in on it too. objp->phys_info.flags &= (~PF_WARP_IN); @@ -3527,11 +3528,11 @@ int WE_Default::warpStart() stage_duration[2] = fl2i(shipfx_calculate_warp_time(objp, WD_WARP_IN)*1000.0f); stage_time_end = timestamp(stage_duration[1]); total_time_end = stage_duration[1] + stage_duration[2]; - shipp->flags |= SF_ARRIVING_STAGE_1; + shipp->flags.set(Ship::Ship_Flags::Arriving_stage_1); } else if(direction == WD_WARP_OUT) { - shipp->flags |= SF_DEPART_WARP; + shipp->flags.set(Ship::Ship_Flags::Depart_warp); // Make the warp effect stage 1 last SHIP_WARP_TIME1 seconds. if ( objp == Player_obj ) { @@ -3567,14 +3568,14 @@ int WE_Default::warpFrame(float frametime) { if(direction == WD_WARP_IN) { - if ((shipp->flags & SF_ARRIVING_STAGE_1) && timestamp_elapsed(stage_time_end)) + if ((shipp->flags[Ship::Ship_Flags::Arriving_stage_1]) && timestamp_elapsed(stage_time_end)) { // let physics know the ship is going to warp in. objp->phys_info.flags |= PF_WARP_IN; // done doing stage 1 of warp, so go on to stage 2 - shipp->flags &= (~SF_ARRIVING_STAGE_1); - shipp->flags |= SF_ARRIVING_STAGE_2; + shipp->flags.remove(Ship::Ship_Flags::Arriving_stage_1); + shipp->flags.set(Ship::Ship_Flags::Arriving_stage_2); float warp_time = shipfx_calculate_warp_time(objp, WD_WARP_IN); float speed = shipfx_calculate_warp_dist(objp) / warp_time; // How long it takes to move through warp effect @@ -3592,13 +3593,13 @@ int WE_Default::warpFrame(float frametime) stage_time_end = timestamp(fl2i(warp_time*1000.0f)); } - else if ( (shipp->flags & SF_ARRIVING_STAGE_2) && timestamp_elapsed(stage_time_end) ) + else if ( (shipp->flags[Ship::Ship_Flags::Arriving_stage_2]) && timestamp_elapsed(stage_time_end) ) { // done doing stage 2 of warp, so turn off arriving flag this->warpEnd(); // notify physics to slow down - if (sip->flags & SIF_SUPERCAP) { + if (sip->flags[Ship::Info_Flags::Supercap]) { // let physics know this is a special warp in objp->phys_info.flags |= PF_SPECIAL_WARP_IN; } @@ -3646,9 +3647,9 @@ int WE_Default::warpFrame(float frametime) } } - // MWA 10/21/97 -- added shipp->flags & SF_NO_DEPARTURE_WARP part of next if statement. For ships + // MWA 10/21/97 -- added shipp->flags[Ship::Ship_Flags::No_departure_warp] part of next if statement. For ships // that don't get a wormhole effect, I wanted to drop into this code immediately. - if ( (warp_pos > objp->radius) || (shipp->flags & SF_NO_DEPARTURE_WARP) || timed_out ) { + if ( (warp_pos > objp->radius) || (shipp->flags[Ship::Ship_Flags::No_departure_warp]) || timed_out ) { this->warpEnd(); } } @@ -3848,23 +3849,21 @@ int WE_BSG::warpStart() vm_vec_sub(&autocenter, &dock_center, &objp->pos); } - if(direction == WD_WARP_IN) - shipp->flags |= SF_ARRIVING_STAGE_1; + if (direction == WD_WARP_IN) + shipp->flags.set(Ship::Ship_Flags::Arriving_stage_1); else - shipp->flags |= SF_DEPART_WARP; + shipp->flags.set(Ship::Ship_Flags::Depart_warp); //*****Sound int gs_start_index = -1; int gs_end_index = -1; if(direction == WD_WARP_IN) { - shipp->flags |= SF_ARRIVING_STAGE_1; gs_start_index = sip->warpin_snd_start; gs_end_index = sip->warpin_snd_end; } else if(direction == WD_WARP_OUT) { - shipp->flags |= SF_DEPART_WARP; gs_start_index = sip->warpout_snd_start; gs_end_index = sip->warpout_snd_end; } @@ -3917,8 +3916,8 @@ int WE_BSG::warpFrame(float frametime) case 1: if(direction == WD_WARP_IN) { - shipp->flags &= (~SF_ARRIVING_STAGE_1); - shipp->flags |= SF_ARRIVING_STAGE_2; + shipp->flags.remove(Ship::Ship_Flags::Arriving_stage_1); + shipp->flags.set(Ship::Ship_Flags::Arriving_stage_2); } break; default: @@ -4180,12 +4179,12 @@ int WE_Homeworld::warpStart() int gs_index = -1; if(direction == WD_WARP_IN) { - shipp->flags |= SF_ARRIVING_STAGE_1; + shipp->flags.set(Ship::Ship_Flags::Arriving_stage_1); gs_index = sip->warpin_snd_start; } else if(direction == WD_WARP_OUT) { - shipp->flags |= SF_DEPART_WARP; + shipp->flags.set(Ship::Ship_Flags::Depart_warp); gs_index = sip->warpout_snd_start; } else @@ -4225,8 +4224,8 @@ int WE_Homeworld::warpFrame(float frametime) if(direction == WD_WARP_IN) { objp->phys_info.flags |= PF_WARP_IN; - shipp->flags &= (~SF_ARRIVING_STAGE_1); - shipp->flags |= SF_ARRIVING_STAGE_2; + shipp->flags.remove(Ship::Ship_Flags::Arriving_stage_1); + shipp->flags.set(Ship::Ship_Flags::Arriving_stage_2); } break; @@ -4369,14 +4368,14 @@ int WE_Hyperspace::warpStart() if(direction == WD_WARP_IN) { - shipp->flags |= SF_ARRIVING_STAGE_1; + shipp->flags.set(Ship::Ship_Flags::Arriving_stage_1); objp->phys_info.flags |= PF_WARP_IN; objp->phys_info.vel.xyz.z = (scale_factor / sip->warpin_time)*1000.0f; - objp->flags &= ~OF_PHYSICS; + objp->flags.remove(Object::Object_Flags::Physics); } else if(direction == WD_WARP_OUT) { - shipp->flags |= SF_DEPART_WARP; + shipp->flags.set(Ship::Ship_Flags::Depart_warp); } else { @@ -4405,9 +4404,9 @@ int WE_Hyperspace::warpFrame(float frametime) vm_vec_scale( &vel, initial_velocity ); objp->phys_info.vel = vel; objp->phys_info.desired_vel = vel; - shipp->flags |= SF_ARRIVING_STAGE_2; + shipp->flags.set(Ship::Ship_Flags::Arriving_stage_2); } - objp->flags |= OF_PHYSICS; + objp->flags.set(Object::Object_Flags::Physics); this->warpEnd(); } else diff --git a/code/ship/shiphit.cpp b/code/ship/shiphit.cpp index 51660d775e..04ecc09bbe 100755 --- a/code/ship/shiphit.cpp +++ b/code/ship/shiphit.cpp @@ -252,7 +252,7 @@ void do_subobj_destroyed_stuff( ship *ship_p, ship_subsys *subsys, vec3d* hitpos if ( psub->type == SUBSYSTEM_TURRET ) { if ( ship_p->subsys_info[type].aggregate_current_hits <= 0.0f ) { // Don't create "disarmed" event for small ships. - if (!(Ship_info[ship_p->ship_info_index].flags & SIF_SMALL_SHIP)) { + if (!(Ship_info[ship_p->ship_info_index].is_small_ship())) { mission_log_add_entry(LOG_SHIP_DISARMED, ship_p->ship_name, NULL ); // ship_p->flags |= SF_DISARMED; } @@ -263,7 +263,7 @@ void do_subobj_destroyed_stuff( ship *ship_p, ship_subsys *subsys, vec3d* hitpos if ( ship_p->subsys_info[type].aggregate_current_hits <= 0.0f ) { mission_log_add_entry(LOG_SHIP_DISABLED, ship_p->ship_name, NULL ); - ship_p->flags |= SF_DISABLED; // add the disabled flag + ship_p->flags.set(Ship::Ship_Flags::Disabled); // add the disabled flag } } @@ -279,9 +279,9 @@ void do_subobj_destroyed_stuff( ship *ship_p, ship_subsys *subsys, vec3d* hitpos if (notify && !no_explosion) { // play sound effect when subsys gets blown up int sound_index=-1; - if ( Ship_info[ship_p->ship_info_index].flags & SIF_HUGE_SHIP ) { + if ( Ship_info[ship_p->ship_info_index].is_huge_ship() ) { sound_index=SND_CAPSHIP_SUBSYS_EXPLODE; - } else if ( Ship_info[ship_p->ship_info_index].flags & SIF_BIG_SHIP ) { + } else if ( Ship_info[ship_p->ship_info_index].is_big_ship() ) { sound_index=SND_SUBSYS_EXPLODE; } if ( sound_index >= 0 ) { @@ -478,7 +478,7 @@ float do_subobj_hit_stuff(object *ship_objp, object *other_obj, vec3d *hitpos, i { // MK, 9/2/99. Shockwaves do zero subsystem damage on small ships. // Goober5000 - added back in via flag - if ((Ship_info[ship_p->ship_info_index].flags & (SIF_SMALL_SHIP)) && !(The_mission.ai_profile->flags & AIPF_SHOCKWAVES_DAMAGE_SMALL_SHIP_SUBSYSTEMS)) + if ((Ship_info[ship_p->ship_info_index].is_small_ship()) && !(The_mission.ai_profile->flags & AIPF_SHOCKWAVES_DAMAGE_SMALL_SHIP_SUBSYSTEMS)) return damage; else { damage_left = shockwave_get_damage(other_obj->instance) / 4.0f; @@ -688,7 +688,7 @@ float do_subobj_hit_stuff(object *ship_objp, object *other_obj, vec3d *hitpos, i if ( (damage_to_apply > 0.1f) && !(MULTIPLAYER_CLIENT) ) { // Decrease damage to subsystems to player ships. - if (ship_objp->flags & OF_PLAYER_SHIP){ + if (ship_objp->flags[Object::Object_Flags::Player_ship]){ ss_dif_scale = The_mission.ai_profile->subsys_damage_scale[Game_skill_level]; } @@ -796,7 +796,7 @@ void shiphit_record_player_killer(object *killer_objp, player *p) } // in multiplayer, record callsign of killer if killed by another player - if ( (Game_mode & GM_MULTIPLAYER) && ( Objects[killer_objp->parent].flags & OF_PLAYER_SHIP) ) { + if ( (Game_mode & GM_MULTIPLAYER) && ( Objects[killer_objp->parent].flags[Object::Object_Flags::Player_ship]) ) { int pnum; pnum = multi_find_player_by_object( &Objects[killer_objp->parent] ); @@ -820,7 +820,7 @@ void shiphit_record_player_killer(object *killer_objp, player *p) p->flags |= PLAYER_FLAGS_KILLED_SELF_SHOCKWAVE; } - if ( (Game_mode & GM_MULTIPLAYER) && ( Objects[killer_objp->parent].flags & OF_PLAYER_SHIP) ) { + if ( (Game_mode & GM_MULTIPLAYER) && ( Objects[killer_objp->parent].flags[Object::Object_Flags::Player_ship]) ) { int pnum; pnum = multi_find_player_by_object( &Objects[killer_objp->parent] ); @@ -840,7 +840,7 @@ void shiphit_record_player_killer(object *killer_objp, player *p) p->killer_weapon_index=-1; p->killer_species = Ship_info[Ships[killer_objp->instance].ship_info_index].species; - if ( Ships[killer_objp->instance].flags & SF_EXPLODED ) { + if ( Ships[killer_objp->instance].flags[Ship::Ship_Flags::Exploded] ) { p->flags |= PLAYER_FLAGS_KILLED_BY_EXPLOSION; } @@ -849,7 +849,7 @@ void shiphit_record_player_killer(object *killer_objp, player *p) } // in multiplayer, record callsign of killer if killed by another player - if ( (Game_mode & GM_MULTIPLAYER) && (killer_objp->flags & OF_PLAYER_SHIP) ) { + if ( (Game_mode & GM_MULTIPLAYER) && (killer_objp->flags[Object::Object_Flags::Player_ship]) ) { int pnum; pnum = multi_find_player_by_object( killer_objp ); @@ -914,7 +914,7 @@ void show_dead_message(object *ship_objp, object *other_obj) player *player_p; // not doing anything when a non player dies. - if ( !(ship_objp->flags & OF_PLAYER_SHIP) ){ + if ( !(ship_objp->flags[Object::Object_Flags::Player_ship]) ){ return; } @@ -1064,7 +1064,7 @@ int get_max_sparks(object* ship_objp) ship *ship_p = &Ships[ship_objp->instance]; ship_info* si = &Ship_info[ship_p->ship_info_index]; - if (si->flags & SIF_FIGHTER) { + if (si->flags[Ship::Info_Flags::Fighter]) { float hull_percent = ship_objp->hull_strength / ship_p->ship_max_hull_strength; if (hull_percent > 0.8f) { @@ -1203,7 +1203,7 @@ void ship_hit_create_sparks(object *ship_objp, vec3d *hitpos, int submodel_num) max_sparks = get_max_sparks(ship_objp); if (n >= max_sparks) { - if (sip->flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP)) { + if (sip->is_big_or_huge()) { // large ship, choose intelligently n = choose_next_spark(ship_objp, hitpos); } else { @@ -1386,8 +1386,8 @@ void ship_generic_kill_stuff( object *objp, float percent_killed ) ship_stop_fire_primary(objp); //mostly for stopping fighter beam looping sounds -Bobboau - sp->flags |= SF_DYING; - objp->phys_info.flags |= (PF_DEAD_DAMP | PF_REDUCED_DAMP); + sp->flags.set(Ship::Ship_Flags::Dying); + objp->phys_info.flags |= (PF_DEAD_DAMP | PF_REDUCED_DAMP); delta_time = (int) (sip->death_roll_base_time); // For smaller ships, subtract off time proportional to excess damage delivered. @@ -1395,7 +1395,7 @@ void ship_generic_kill_stuff( object *objp, float percent_killed ) delta_time -= (int) (1.01f - 4*percent_killed); // Cut down cargo death rolls. Looks a little silly. -- MK, 3/30/98. - if (sip->flags & SIF_CARGO) { + if (sip->flags[Ship::Info_Flags::Cargo]) { delta_time /= 4; } @@ -1403,7 +1403,7 @@ void ship_generic_kill_stuff( object *objp, float percent_killed ) if (delta_time < 2) delta_time = 2; - if (objp->flags & OF_PLAYER_SHIP) { + if (objp->flags[Object::Object_Flags::Player_ship]) { // Note: Kamikaze ships have no minimum death time. if (!(Ai_info[Ships[objp->instance].ai_index].ai_flags & AIF_KAMIKAZE) && (delta_time < MIN_PLAYER_DEATHROLL_TIME)) delta_time = MIN_PLAYER_DEATHROLL_TIME; @@ -1423,7 +1423,7 @@ void ship_generic_kill_stuff( object *objp, float percent_killed ) delta_time = 2; // Knossos gets 7-10 sec to die, time for "little" explosions - if (Ship_info[sp->ship_info_index].flags & SIF_KNOSSOS_DEVICE) { + if (Ship_info[sp->ship_info_index].flags[Ship::Info_Flags::Knossos_device]) { delta_time = 7000 + (int)(frand() * 3000.0f); Ship_info[sp->ship_info_index].explosion_propagates = 0; } @@ -1446,7 +1446,7 @@ void ship_generic_kill_stuff( object *objp, float percent_killed ) if (sip->vaporize_chance > 0.0f) vapChance = sip->vaporize_chance; - if (sp->flags & SF_VAPORIZE || frand() < vapChance) { + if (sp->flags[Ship::Ship_Flags::Vaporize] || frand() < vapChance) { // Assert(Ship_info[sp->ship_info_index].flags & SIF_SMALL_SHIP); // LIVE FOR 100 MS @@ -1570,7 +1570,7 @@ void ship_hit_kill(object *ship_objp, object *other_obj, float percent_killed, i } // maybe vaporize him - if(sp->flags & SF_VAPORIZE){ + if(sp->flags[Ship::Ship_Flags::Vaporize]){ ship_vaporize(sp); } @@ -1679,7 +1679,7 @@ void ship_hit_kill(object *ship_objp, object *other_obj, float percent_killed, i } // if a non-player is dying, play a scream - if ( !(ship_objp->flags & OF_PLAYER_SHIP) ) { + if ( !(ship_objp->flags[Object::Object_Flags::Player_ship]) ) { ship_maybe_scream(sp); } @@ -1757,7 +1757,7 @@ void ship_apply_whack(vec3d *force, vec3d *hit_pos, object *objp) // correct torque. // Addendum: this block is now not executed for docked fighters or bombers because the whack // looks like the fighter is doing evasive maneuvers - if ((objp->type != OBJ_SHIP) || !(Ship_info[Ships[objp->instance].ship_info_index].flags & (SIF_FIGHTER | SIF_BOMBER))) + if ((objp->type != OBJ_SHIP) || !(Ship_info[Ships[objp->instance].ship_info_index].is_fighter_bomber())) { vec3d world_hit_pos, world_center_pos; @@ -1799,7 +1799,7 @@ void shiphit_hit_after_death(object *ship_objp, float damage) } // Don't adjust vaporized ship - if (shipp->flags & SF_VAPORIZE) { + if (shipp->flags[Ship::Ship_Flags::Vaporize]) { return; } @@ -1815,14 +1815,14 @@ void shiphit_hit_after_death(object *ship_objp, float damage) time_remaining = timestamp_until(shipp->final_death_time); //nprintf(("AI", "Gametime = %7.3f, Time until %s dies = %7.3f, delta = %7.3f\n", f2fl(Missiontime), Ships[ship_objp->instance].ship_name, (float)time_remaining/1000.0f, delta_time)); - if (ship_objp->flags & OF_PLAYER_SHIP) + if (ship_objp->flags[Object::Object_Flags::Player_ship]) if (time_remaining < MIN_PLAYER_DEATHROLL_TIME) return; // nprintf(("AI", "Subtracting off %7.3f seconds from deathroll, reducing to %7.3f\n", (float) delta_time/1000.0f, (float) (time_remaining - delta_time)/1000.0f)); delta_time = time_remaining - delta_time; - if (ship_objp->flags & OF_PLAYER_SHIP) + if (ship_objp->flags[Object::Object_Flags::Player_ship]) if (delta_time < MIN_PLAYER_DEATHROLL_TIME) delta_time = MIN_PLAYER_DEATHROLL_TIME; @@ -1858,7 +1858,7 @@ int maybe_shockwave_damage_adjust(object *ship_objp, object *other_obj, float *d return 0; } - if (!(Ship_info[Ships[ship_objp->instance].ship_info_index].flags & SIF_HUGE_SHIP)) { + if (!(Ship_info[Ships[ship_objp->instance].ship_info_index].is_huge_ship())) { return 0; } @@ -1982,7 +1982,7 @@ static void ship_do_damage(object *ship_objp, object *other_obj, vec3d *hitpos, } else { // Do a little "skill" balancing for the player in single player and coop multiplayer - if (ship_objp->flags & OF_PLAYER_SHIP) { + if (ship_objp->flags[Object::Object_Flags::Player_ship]) { // Nuke - store it in a couple factor and we will apply it where needed difficulty_scale_factor *= The_mission.ai_profile->player_damage_scale[Game_skill_level]; } @@ -1993,7 +1993,7 @@ static void ship_do_damage(object *ship_objp, object *other_obj, vec3d *hitpos, // apply pain to me // Goober5000: make sure other_obj doesn't cause a read violation! - if (other_obj && !(Ship_info[Ships[Player_obj->instance].ship_info_index].flags2 & SIF2_NO_PAIN_FLASH)) + if (other_obj && !(Ship_info[Ships[Player_obj->instance].ship_info_index].flags[Ship::Info_Flags::No_pain_flash])) { // For the record, ship_hit_pain seems to simply be the red flash that appears // on the screen when you're hit. @@ -2020,19 +2020,19 @@ static void ship_do_damage(object *ship_objp, object *other_obj, vec3d *hitpos, // If the ship is invulnerable, do nothing - if (ship_objp->flags & OF_INVULNERABLE) { + if (ship_objp->flags[Object::Object_Flags::Invulnerable]) { return; } // if ship is already dying, shorten deathroll. - if (shipp->flags & SF_DYING) { + if (shipp->flags[Ship::Ship_Flags::Dying]) { shiphit_hit_after_death(ship_objp, (damage * difficulty_scale_factor)); return; } // If we hit the shield, reduce it's strength and found // out how much damage is left over. - if ( quadrant >= 0 && !(ship_objp->flags & OF_NO_SHIELDS) ) { + if ( quadrant >= 0 && !(ship_objp->flags[Object::Object_Flags::No_shields]) ) { // mprintf(("applying damage ge to shield\n")); float shield_factor = -1.0f; int weapon_info_index; @@ -2231,8 +2231,8 @@ static void ship_do_damage(object *ship_objp, object *other_obj, vec3d *hitpos, if (bobjn >= 0) { if ( !(The_mission.ai_profile->flags & AIPF_INCLUDE_BEAMS_IN_STAT_CALCS) && - !(Ship_info[Ships[Objects[bobjn].instance].ship_info_index].flags & (SIF_FIGHTER | SIF_BOMBER)) && - !(Objects[bobjn].flags & OF_PLAYER_SHIP) ) { + !(Ship_info[Ships[Objects[bobjn].instance].ship_info_index].is_fighter_bomber()) && + !(Objects[bobjn].flags[Object::Object_Flags::Player_ship]) ) { bobjn = -1; } } @@ -2258,16 +2258,16 @@ static void ship_do_damage(object *ship_objp, object *other_obj, vec3d *hitpos, // Only vaporize once // multiplayer clients should skip this if(!MULTIPLAYER_CLIENT) { - if ( !(shipp->flags & SF_VAPORIZE) ) { + if ( !(shipp->flags[Ship::Ship_Flags::Vaporize]) ) { // Only small ships can be vaporized - if (sip->flags & (SIF_SMALL_SHIP)) { + if (sip->is_small_ship()) { if (other_obj) { // Goober5000 check for NULL if (other_obj->type == OBJ_BEAM) { int beam_weapon_info_index = beam_get_weapon_info_index(other_obj); if ( (beam_weapon_info_index > -1) && (Weapon_info[beam_weapon_info_index].wi_flags & (WIF_HUGE)) ) { // Flag as vaporized - shipp->flags |= SF_VAPORIZE; + shipp->flags.set(Ship::Ship_Flags::Vaporize); } } } @@ -2285,7 +2285,7 @@ static void ship_do_damage(object *ship_objp, object *other_obj, vec3d *hitpos, percent_killed = 1.0f; } - if ( !(shipp->flags & SF_DYING) && !MULTIPLAYER_CLIENT) { // if not killed, then kill + if ( !(shipp->flags[Ship::Ship_Flags::Dying]) && !MULTIPLAYER_CLIENT) { // if not killed, then kill ship_hit_kill(ship_objp, other_obj, percent_killed, 0); } } @@ -2371,7 +2371,7 @@ void ship_apply_local_damage(object *ship_objp, object *other_obj, vec3d *hitpos // don't do damage. // Ie, player can always do damage. AI can only damage team if that ship is targeted. if (wp->target_num != OBJ_INDEX(ship_objp)) { - if ((ship_p->team == wp->team) && !(Objects[other_obj->parent].flags & OF_PLAYER_SHIP) ) { + if ((ship_p->team == wp->team) && !(Objects[other_obj->parent].flags[Object::Object_Flags::Player_ship]) ) { return; } } @@ -2555,7 +2555,7 @@ void ship_hit_pain(float damage, int quadrant) ship *shipp = &Ships[Player_obj->instance]; ship_info *sip = &Ship_info[shipp->ship_info_index]; - if (!(Player_obj->flags & OF_INVULNERABLE)) + if (!(Player_obj->flags[Object::Object_Flags::Invulnerable])) { if (Shield_pain_flash_factor != 0.0f && quadrant >= 0) { diff --git a/code/source_groups.cmake b/code/source_groups.cmake index e1c8bbd06c..922a182bcd 100644 --- a/code/source_groups.cmake +++ b/code/source_groups.cmake @@ -252,6 +252,7 @@ set (file_root_globalincs globalincs/version.h globalincs/vmallocator.h globalincs/scp_defines.h + globalincs/flagset.h ) IF (WIN32) @@ -561,6 +562,7 @@ set (file_root_mission mission/missionparse.h mission/missiontraining.cpp mission/missiontraining.h + mission/mission_flags.h ) # MissionUI files @@ -607,6 +609,7 @@ set (file_root_model model/modelrender.h model/modelrender.cpp model/modelsinc.h + model/model_flags.h ) # Nebula files @@ -719,6 +722,7 @@ set (file_root_object object/parseobjectdock.h object/waypoint.cpp object/waypoint.h + object/object_flags.h ) # Observer files @@ -880,6 +884,7 @@ set (file_root_ship ship/shiphit.cpp ship/shiphit.h ship/subsysdamage.h + ship/ship_flags.h ) # Sound files @@ -988,6 +993,7 @@ set (file_root_weapon weapon/trails.h weapon/weapon.h weapon/weapons.cpp + weapon/weapon_flags.h ) # Windows stubs files diff --git a/code/starfield/nebula.cpp b/code/starfield/nebula.cpp index d947a8ced0..c9ec401421 100644 --- a/code/starfield/nebula.cpp +++ b/code/starfield/nebula.cpp @@ -208,7 +208,7 @@ void nebula_render() gr_zbuffer_set(saved_gr_zbuffering); // always switch off fogging for good measure - if((The_mission.flags & MISSION_FLAG_FULLNEB) && (Neb2_render_mode == NEB2_RENDER_NONE)){ + if((The_mission.flags[Mission::Mission_Flags::Fullneb]) && (Neb2_render_mode == NEB2_RENDER_NONE)){ gr_fog_set(GR_FOGMODE_NONE, 0, 0, 0); } } diff --git a/code/starfield/starfield.cpp b/code/starfield/starfield.cpp index fc60fc0e13..6965af368e 100644 --- a/code/starfield/starfield.cpp +++ b/code/starfield/starfield.cpp @@ -790,7 +790,7 @@ void stars_post_level_init() stars_set_background_model(The_mission.skybox_model, NULL, The_mission.skybox_flags); stars_set_background_orientation(&The_mission.skybox_orientation); - stars_load_debris( ((The_mission.flags & MISSION_FLAG_FULLNEB) || Nebula_sexp_used) ); + stars_load_debris( ((The_mission.flags[Mission::Mission_Flags::Fullneb]) || Nebula_sexp_used) ); // following code randomly distributes star points within a sphere volume, which // avoids there being denser areas along the edges and in corners that we had in the @@ -1229,7 +1229,7 @@ void stars_draw_bitmaps(int show_bitmaps) return; // if we're in the nebula, don't render any backgrounds - if (The_mission.flags & MISSION_FLAG_FULLNEB) + if (The_mission.flags[Mission::Mission_Flags::Fullneb]) return; // detail settings @@ -1584,7 +1584,7 @@ void stars_draw_debris() gr_set_color( 0, 0, 0 ); // turn off fogging - if (The_mission.flags & MISSION_FLAG_FULLNEB) { + if (The_mission.flags[Mission::Mission_Flags::Fullneb]) { gr_fog_set(GR_FOGMODE_NONE, 0, 0, 0); } @@ -1604,7 +1604,7 @@ void stars_draw_debris() d->vclip = i % MAX_DEBRIS_VCLIPS; //rand() // if we're in full neb mode - if((The_mission.flags & MISSION_FLAG_FULLNEB) && (Neb2_render_mode != NEB2_RENDER_NONE)) { + if((The_mission.flags[Mission::Mission_Flags::Fullneb]) && (Neb2_render_mode != NEB2_RENDER_NONE)) { d->size = i2fl(myrand() % 4)*BASE_SIZE_NEB; } else { d->size = i2fl(myrand() % 4)*BASE_SIZE; @@ -1623,7 +1623,7 @@ void stars_draw_debris() int frame = Missiontime / (DEBRIS_ROT_MIN + (i % DEBRIS_ROT_RANGE) * DEBRIS_ROT_RANGE_SCALER); frame %= Debris_vclips[d->vclip].nframes; - if ( (The_mission.flags & MISSION_FLAG_FULLNEB) && (Neb2_render_mode != NEB2_RENDER_NONE) ) { + if ( (The_mission.flags[Mission::Mission_Flags::Fullneb]) && (Neb2_render_mode != NEB2_RENDER_NONE) ) { gr_set_bitmap( Debris_vclips[d->vclip].bm + frame, GR_ALPHABLEND_FILTER, GR_BITBLT_MODE_NORMAL, 0.3f); } else { gr_set_bitmap( Debris_vclips[d->vclip].bm + frame, GR_ALPHABLEND_FILTER, GR_BITBLT_MODE_NORMAL, 1.0f); @@ -1679,7 +1679,7 @@ void stars_draw(int show_stars, int show_suns, int show_nebulas, int show_subspa stars_draw_background(); } - if ( !env && show_stars && (Nmodel_num < 0) && (Game_detail_flags & DETAIL_FLAG_STARS) && !(The_mission.flags & MISSION_FLAG_FULLNEB) && (supernova_active() < 3) ) { + if ( !env && show_stars && (Nmodel_num < 0) && (Game_detail_flags & DETAIL_FLAG_STARS) && !(The_mission.flags[Mission::Mission_Flags::Fullneb]) && (supernova_active() < 3) ) { stars_draw_stars(); } @@ -2347,9 +2347,10 @@ const char *stars_get_name_from_instance(int index, bool is_a_sun) // WMC/Goober5000 void stars_set_nebula(bool activate) { - if (activate) + The_mission.flags.set(Mission::Mission_Flags::Fullneb, activate); + + if (activate) { - The_mission.flags |= MISSION_FLAG_FULLNEB; Toggle_text_alpha = TOGGLE_TEXT_NEBULA_ALPHA; HUD_contrast = 1; if(Fred_running) { @@ -2364,7 +2365,6 @@ void stars_set_nebula(bool activate) } else { - The_mission.flags &= ~MISSION_FLAG_FULLNEB; Toggle_text_alpha = TOGGLE_TEXT_NORMAL_ALPHA; Neb2_render_mode = NEB2_RENDER_NONE; Debris_vclips = Debris_vclips_normal; diff --git a/code/stats/scoring.cpp b/code/stats/scoring.cpp index df7047a5b4..c99705273b 100644 --- a/code/stats/scoring.cpp +++ b/code/stats/scoring.cpp @@ -300,13 +300,13 @@ void scoring_eval_badges(scoring_struct *sc) // to determine badges, we count kills based on fighter/bomber types. We must count kills in // all time stats + current mission stats. And, only for enemy fighters/bombers total_kills = 0; - for (auto it = Ship_info.cbegin(); it != Ship_info.cend(); ++it ) { - if ( (it->flags & SIF_FIGHTER) || (it->flags & SIF_BOMBER) ) { - auto i = std::distance(Ship_info.cbegin(), it); - total_kills += sc->m_okKills[i]; - total_kills += sc->kills[i]; - } - } + for (auto it = Ship_info.cbegin(); it != Ship_info.cend(); ++it) { + if (it->is_fighter_bomber()) { + auto i = std::distance(Ship_info.cbegin(), it); + total_kills += sc->m_okKills[i]; + total_kills += sc->kills[i]; + } + } // total_kills should now reflect the number of kills on hostile fighters/bombers. Check this number // against badge kill numbers, and award the appropriate badges as neccessary. @@ -467,7 +467,7 @@ void scoring_level_close(int accepted) // If this mission doesn't allow promotion or badges // then be sure that these don't get done. Don't allow promotions or badges when // playing normally and not in a campaign. - if ( (The_mission.flags & MISSION_FLAG_NO_PROMOTION) || ((Game_mode & GM_NORMAL) && !(Game_mode & GM_CAMPAIGN_MODE)) ) { + if ( (The_mission.flags[Mission::Mission_Flags::No_promotion]) || ((Game_mode & GM_NORMAL) && !(Game_mode & GM_CAMPAIGN_MODE)) ) { if ( Player->stats.m_promotion_earned != -1) { Player->stats.rank--; Player->stats.m_promotion_earned = -1; @@ -708,7 +708,7 @@ int scoring_eval_kill(object *ship_objp) // get the ship info index of the ship type of this kill. we need to take ship // copies into account here. si_index = dead_ship->ship_info_index; - if (Ship_info[si_index].flags & SIF_SHIP_COPY) + if (Ship_info[si_index].flags[Ship::Info_Flags::Ship_copy]) { char temp[NAME_LENGTH]; strcpy_s(temp, Ship_info[si_index].name); @@ -720,7 +720,7 @@ int scoring_eval_kill(object *ship_objp) // if he killed a guy on his own team increment his bonehead kills if((Ships[Objects[plr->objnum].instance].team == dead_ship->team) && !MULTI_DOGFIGHT ){ - if (!(The_mission.flags & MISSION_FLAG_NO_TRAITOR)) { + if (!(The_mission.flags[Mission::Mission_Flags::No_traitor])) { plr->stats.m_bonehead_kills++; kill_score = -(int)(dead_ship->score * scoring_get_scale_factor()); plr->stats.m_score += kill_score; @@ -768,7 +768,7 @@ int scoring_eval_kill(object *ship_objp) // award teammates % of score value for big ship kills // not in dogfight tho // and not if there is no assist threshold (as otherwise assists could get higher scores than kills) - if (!(Netgame.type_flags & NG_TYPE_DOGFIGHT) && (Ship_info[dead_ship->ship_info_index].flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP))) { + if (!(Netgame.type_flags & NG_TYPE_DOGFIGHT) && (Ship_info[dead_ship->ship_info_index].is_big_or_huge())) { for (idx=0; idxp_info.team) && (&Net_players[idx] != net_plr)) { assist_score = (int)(dead_ship->score * The_mission.ai_profile->assist_award_percentage_scale[Game_skill_level]); @@ -916,7 +916,7 @@ int scoring_eval_kill_on_weapon(object *weapon_obj, object *other_obj) { // if he killed a bomb on his own team increment his bonehead kills if((Ships[Objects[plr->objnum].instance].team == dead_wp->team) && !MULTI_DOGFIGHT ){ - if (!(The_mission.flags & MISSION_FLAG_NO_TRAITOR)) { + if (!(The_mission.flags[Mission::Mission_Flags::No_traitor])) { plr->stats.m_bonehead_kills++; kill_score = -(int)(dead_wip->score * scoring_get_scale_factor()); plr->stats.m_score += kill_score; diff --git a/code/weapon/beam.cpp b/code/weapon/beam.cpp old mode 100755 new mode 100644 index adfb10c3fc..1ff26568ec --- a/code/weapon/beam.cpp +++ b/code/weapon/beam.cpp @@ -426,8 +426,10 @@ int beam_fire(beam_fire_info *fire_info) beam_get_binfo(new_item, fire_info->accuracy, wip->b_info.beam_shots); // to fill in b_info - the set of directional aim vectors } + flagset default_flags; + default_flags.set(Object::Object_Flags::Collides); // create the associated object - objnum = obj_create(OBJ_BEAM, ((fire_info->shooter != NULL) ? OBJ_INDEX(fire_info->shooter) : -1), BEAM_INDEX(new_item), &vmd_identity_matrix, &vmd_zero_vector, 1.0f, OF_COLLIDES); + objnum = obj_create(OBJ_BEAM, ((fire_info->shooter != NULL) ? OBJ_INDEX(fire_info->shooter) : -1), BEAM_INDEX(new_item), &vmd_identity_matrix, &vmd_zero_vector, 1.0f, default_flags); if(objnum < 0){ beam_delete(new_item); nprintf(("General", "obj_create() failed for beam weapon! bah!\n")); @@ -553,7 +555,9 @@ int beam_fire_targeting(fighter_beam_fire_info *fire_info) // type c is a very special weapon type - binfo has no meaning // create the associated object - objnum = obj_create(OBJ_BEAM, OBJ_INDEX(fire_info->shooter), BEAM_INDEX(new_item), &vmd_identity_matrix, &vmd_zero_vector, 1.0f, OF_COLLIDES); + flagset default_flags; + default_flags.set(Object::Object_Flags::Collides); + objnum = obj_create(OBJ_BEAM, OBJ_INDEX(fire_info->shooter), BEAM_INDEX(new_item), &vmd_identity_matrix, &vmd_zero_vector, 1.0f, default_flags); if(objnum < 0){ beam_delete(new_item); @@ -2176,7 +2180,7 @@ void beam_aim(beam *b) } // if we're shooting at a big ship - shoot directly at the model - if((b->target != nullptr) && (b->target->type == OBJ_SHIP) && (Ship_info[Ships[b->target->instance].ship_info_index].flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP))){ + if((b->target != nullptr) && (b->target->type == OBJ_SHIP) && (Ship_info[Ships[b->target->instance].ship_info_index].is_big_or_huge())){ if ((b->subsys != nullptr) && (b->subsys->system_info->flags2 & MSS_FLAG2_SHARE_FIRE_DIRECTION)) { vec3d pnt; vm_vec_unrotate(&pnt, &b->binfo.dir_a, &b->target->orient); @@ -2483,16 +2487,16 @@ int beam_collide_ship(obj_pair *pair) // check shields for impact // (tooled ships are probably not going to be maintaining a shield over their exit hole, // therefore we need only check the entrance, just as with conventional weapons) - if (!(ship_objp->flags & OF_NO_SHIELDS)) + if (!(ship_objp->flags[Object::Object_Flags::No_shields])) { // pick out the shield quadrant if (shield_collision) quadrant_num = get_quadrant(&mc_shield.hit_point, ship_objp); - else if (hull_enter_collision && (sip->flags2 & SIF2_SURFACE_SHIELDS)) + else if (hull_enter_collision && (sip->flags[Ship::Info_Flags::Surface_shields])) quadrant_num = get_quadrant(&mc_hull_enter.hit_point, ship_objp); // make sure that the shield is active in that quadrant - if ((quadrant_num >= 0) && ((shipp->flags & SF_DYING) || !ship_is_shield_up(ship_objp, quadrant_num))) + if ((quadrant_num >= 0) && ((shipp->flags[Ship::Ship_Flags::Dying]) || !ship_is_shield_up(ship_objp, quadrant_num))) quadrant_num = -1; // see if we hit the shield @@ -3300,7 +3304,7 @@ void beam_get_cull_vals(object *objp, beam *b, float *cull_dot, float *cull_dist case OBJ_SHIP: // for large ships, cull at some multiple of the radius - if(Ship_info[Ships[objp->instance].ship_info_index].flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP)){ + if(Ship_info[Ships[objp->instance].ship_info_index].is_big_or_huge()){ *cull_dot = 1.0f - ((1.0f - beam_get_cone_dot(b)) * 1.25f); *cull_dist = (objp->radius * 1.3f) * (objp->radius * 1.3f); diff --git a/code/weapon/emp.cpp b/code/weapon/emp.cpp index ee646025f4..c033b851d2 100644 --- a/code/weapon/emp.cpp +++ b/code/weapon/emp.cpp @@ -166,7 +166,7 @@ void emp_apply(vec3d *pos, float inner_radius, float outer_radius, float emp_int } // if the ship is a cruiser or cap ship, only apply the EMP effect to turrets - if(Ship_info[Ships[target->instance].ship_info_index].flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP)) { + if(Ship_info[Ships[target->instance].ship_info_index].is_big_or_huge()) { float capship_emp_time = use_emp_time_for_capship_turrets ? emp_time : MAX_TURRET_DISRUPT_TIME; moveup = &Ships[target->instance].subsys_list; @@ -336,7 +336,7 @@ void emp_process_ship(ship *shipp) } // if this is a player ship, don't do anything wacky - if(objp->flags & OF_PLAYER_SHIP){ + if(objp->flags[Object::Object_Flags::Player_ship]){ return; } @@ -349,7 +349,7 @@ void emp_process_ship(ship *shipp) aip->nearest_locked_object = -1; // nothing near me, so I won't launch countermeasures // if he's not a fighter or bomber, bail now - if(!(Ship_info[shipp->ship_info_index].flags & (SIF_FIGHTER | SIF_BOMBER))){ + if(!(Ship_info[shipp->ship_info_index].is_fighter_bomber())){ return; } @@ -363,7 +363,7 @@ void emp_process_ship(ship *shipp) int ship_lookup = ship_get_random_team_ship(iff_get_attackee_mask(shipp->team)); // if we got a valid ship object to target - if((ship_lookup >= 0) && (Ships[ship_lookup].objnum >= 0) && !(Objects[Ships[ship_lookup].objnum].flags & OF_PROTECTED)){ + if((ship_lookup >= 0) && (Ships[ship_lookup].objnum >= 0) && !(Objects[Ships[ship_lookup].objnum].flags[Object::Object_Flags::Protected])){ // attack the object ai_attack_object(objp, &Objects[Ships[ship_lookup].objnum], NULL); } diff --git a/code/weapon/shockwave.cpp b/code/weapon/shockwave.cpp index d70de97dc3..88e3903f21 100644 --- a/code/weapon/shockwave.cpp +++ b/code/weapon/shockwave.cpp @@ -136,8 +136,8 @@ int shockwave_create(int parent_objnum, vec3d *pos, shockwave_create_info *sci, orient = vmd_identity_matrix; vm_angles_2_matrix(&orient, &sw->rot_angles); - - objnum = obj_create( OBJ_SHOCKWAVE, real_parent, i, &orient, &sw->pos, sw->outer_radius, OF_RENDERS ); + flagset tmp_flags; + objnum = obj_create( OBJ_SHOCKWAVE, real_parent, i, &orient, &sw->pos, sw->outer_radius, tmp_flags + Object::Object_Flags::Renders); if ( objnum == -1 ){ Int3(); @@ -176,7 +176,7 @@ void shockwave_delete_all() while ( sw != &Shockwave_list ) { next = sw->next; Assert(sw->objnum != -1); - Objects[sw->objnum].flags |= OF_SHOULD_BE_DEAD; + Objects[sw->objnum].flags.set(Object::Object_Flags::Should_be_dead); sw = next; } } @@ -255,7 +255,7 @@ void shockwave_move(object *shockwave_objp, float frametime) sw->radius += (frametime * sw->speed); if ( sw->radius > sw->outer_radius ) { sw->radius = sw->outer_radius; - shockwave_objp->flags |= OF_SHOULD_BE_DEAD; + shockwave_objp->flags.set(Object::Object_Flags::Should_be_dead); return; } @@ -279,7 +279,7 @@ void shockwave_move(object *shockwave_objp, float frametime) if ( objp->type == OBJ_SHIP ) { // don't blast navbuoys - if ( ship_get_SIF(objp->instance) & SIF_NAVBUOY ) { + if ( ship_get_SIF(objp->instance)[Ship::Info_Flags::Navbuoy] ) { continue; } } @@ -311,7 +311,7 @@ void shockwave_move(object *shockwave_objp, float frametime) case OBJ_SHIP: sw->obj_sig_hitlist[sw->num_objs_hit++] = objp->signature; // If we're doing an AoE Electronics shockwave, do the electronics stuff. -MageKing17 - if ( (sw->weapon_info_index >= 0) && (Weapon_info[sw->weapon_info_index].wi_flags3 & WIF3_AOE_ELECTRONICS) && !(objp->flags & OF_INVULNERABLE) ) { + if ( (sw->weapon_info_index >= 0) && (Weapon_info[sw->weapon_info_index].wi_flags3 & WIF3_AOE_ELECTRONICS) && !(objp->flags[Object::Object_Flags::Invulnerable]) ) { weapon_do_electronics_effect(objp, &sw->pos, sw->weapon_info_index); } ship_apply_global_damage(objp, shockwave_objp, &sw->pos, damage ); diff --git a/code/weapon/weapon_flags.h b/code/weapon/weapon_flags.h new file mode 100644 index 0000000000..c782220002 --- /dev/null +++ b/code/weapon/weapon_flags.h @@ -0,0 +1,111 @@ +#ifndef WEAPON_FLAGS_H +#define WEAPON_FLAGS_H + +#include "globalincs/flagset.h" + +namespace Weapon { + + FLAG_LIST(Info_Flags) { + Homing_heat, // if set, this weapon homes via seeking heat + Homing_aspect, // if set, this weapon homes via chasing aspect + Electronics, // Takes out electronics systems. + Spawn, // Spawns projectiles on detonation. + Remote, // Can be remotely detonated by parent. + Puncture, // Punctures armor, damaging subsystems. + Supercap, // This is a weapon which does supercap class damage (meaning, it applies real damage to supercap ships) + Cmeasure, // Weapon acts as a countermeasure + Homing_javelin, // WC Saga Javelin HS style heatseeker, locks only on target's engines + Turns, // Set this if the weapon ever changes heading. If you don't set this and the weapon turns, collision detection won't work, I promise! + Swarm, // Missile "swarms".. ie changes heading and twists on way to target + Trail, // Has a trail + Big_only, // Only big ships (cruiser, capital, etc.) can arm this weapon + Child, // No ship can have this weapon. It gets created by weapon detonations. + Bomb, // Bomb-type missile, can be targeted + Huge, // Huge damage (generally 500+), probably only fired at huge ships. + No_dumbfire, // Missile cannot be fired dumbfire (ie requires aspect lock) + Thruster, // Has thruster cone and/or glow + In_tech_database, + Player_allowed, // allowed to be on starting wing ships/in weaponry pool + Bomber_plus, // Fire this missile only at a bomber or big ship. But not a fighter. + Corkscrew, // corkscrew style missile + Particle_spew, // spews particles as it travels + Emp, // weapon explodes with a serious EMP effect + Energy_suck, // energy suck primary (impact effect) + Flak, // use for big-ship turrets - flak gun + Beam, // if this is a beam weapon : NOTE - VERY SPECIAL CASE + Tag, // this weapon has a tag effect when it hits + Shudder, // causes the weapon to shudder. shudder is proportional to the mass and damage of the weapon + Mflash, // has muzzle flash + Lockarm, // if the missile was fired without a lock, it does significanlty less damage on impact + Stream, // handled by "trigger down/trigger up" instead of "fire - wait - fire - wait" + Ballistic, // ballistic primaries - Goober5000 + Pierce_shields, // shield pierceing -Bobboau + Default_in_tech_database, // default in tech database - Goober5000 + Local_ssm, // localized ssm. ship that fires ssm is in mission. ssms also warp back in during mission + Tagged_only, // can only fire if target is tagged + Cycle, // will only fire from (shots (defalts to 1)) points at a time + Small_only, // can only be used against small ships like fighters or bombers + Same_turret_cooldown, // the weapon has the same cooldown time on turrets + Mr_no_lighting, // don't render with lighting, regardless of user options + Transparent, // render as transparent + Training, // Weapon does shield/hull damage, but doesn't hurt subsystems, whack you, or put marks on your ship. + Smart_spawn, // Spawn weapon that is fired via turrets like normal weapons + Inherit_parent_target, // child weapons home in on the target their parent is homing on. + No_emp_kill, // though weapon has hitpoints it can not be disabled by EMP + Variable_lead_homing, // allows user defined scaler to be added to lead (to enable, lead, pure or lag pursuit for missiles) + Untargeted_heat_seeker, // forces heat seeker to lose target immeadiately (and acquire a random new one) + Hard_target_bomb, // removes the radius doubling effect bombs have for collisions + Non_subsys_homing, // spreads fired missiles around the target ships hull + No_life_lost_if_missed, // prevents game from shortening the lifeleft of the missed but still homing missiles + Custom_seeker_str, // sets the game to use custom seeker strengths instead of default values + Can_be_targeted, // allows non-bomb weapons to be targeted + Shown_on_radar, // allows non-bombs be visible on radar + Show_friendly, // allows friendly weapon radar dots be drawn + Capital_plus, // AI will not use this weapon on fighters or bombers + External_weapon_fp, // will try to use external models FPs if possible + External_weapon_lnch, // render external secondary as a launcher + Takes_blast_damage, // This weapon can take blast damage + Takes_shockwave_damage, // This weapon can take shockwave damage + Dont_show_on_radar, // Force a weapon to not show on radar + Render_flak, // Even though this is a flak weapon, render the shell + Ciws, // This weapons' burst and shockwave damage can damage bombs (Basically, a reverse for TAKES_BLAST/SHOCKWAVE_DAMAGE + Antisubsysbeam, // This beam can target subsystems as per normal + Nolink, // This weapon can not be linked with others + Use_emp_time_for_capship_turrets, // override MAX_TURRET_DISRUPT_TIME in emp.cpp - Goober5000 + No_linked_penalty, // This weapon does not count into linked firing penalty + No_homing_speed_ramp, // Disables the 1s long speed ramping when firing locked-on secondaries + Cmeasure_aspect_home_on, // This countermeasure flag makes aspect seekers home on the countermeasure instead of going into dumbfire mode + Turret_Interceptable, // These two flags mark a weapon as being interceptable by the AI + Fighter_Interceptable, // (like WIF_BOMB), without forcing it to be tagetable -MageKing17 + Aoe_Electronics, // Apply electronics effect across the weapon's entire area of effect instead of just on the impacted ship -MageKing17 + Apply_Recoil, // Apply Recoil + Dont_spawn_if_shot, // Prevent shot down parent weapons from spawning children (DahBlount) + Die_on_lost_lock, // WIF_LOCKED_HOMING missiles will die if they lose their lock + + NUM_VALUES + }; + + FLAG_LIST(Weapon_Flags) { + Lock_warning_played, // set when a lock warning sound is played for the player (needed since we don't want to play multiple lock sounds) + Already_applied_stats, // for use in ship_apply_local and ship_apply_global damage functions so that we don't record multiple hits (stats) for one impact + Played_flyby_sound, // flyby sound has been played for this weapon + Consider_for_flyby_sound, // consider for flyby + Dead_in_water, // a missiles engines have died + Locked_when_fired, // fired with a lock + Destroyed_by_weapon, // destroyed by damage from other weapon + Spawned, //Spawned from a spawning type weapon + Homing_update_needed, // this is a newly spawned homing weapon which needs to update client machines + No_homing, // this weapon should ignore any homing behavior it'd usually have + + NUM_VALUES + }; + + FLAG_LIST(Burst_Flags) { + Fast_firing, + Random_length, + + NUM_VALUES + }; +} + +#endif \ No newline at end of file diff --git a/code/weapon/weapons.cpp b/code/weapon/weapons.cpp index e709aea317..f292a275d2 100644 --- a/code/weapon/weapons.cpp +++ b/code/weapon/weapons.cpp @@ -3753,7 +3753,7 @@ void find_homing_object(object *weapon_objp, int num) { //WMC - Spawn weapons shouldn't go for protected ships // ditto for untargeted heat seekers - niffiwan - if ( (objp->flags & OF_PROTECTED) && + if ( (objp->flags[Object::Object_Flags::Protected]) && ((wp->weapon_flags & WF_SPAWNED) || (wip->wi_flags2 & WIF2_UNTARGETED_HEAT_SEEKER)) ) continue; @@ -3772,19 +3772,19 @@ void find_homing_object(object *weapon_objp, int num) //if the homing weapon is a huge weapon and the ship that is being //looked at is not huge, then don't home if ((wip->wi_flags & WIF_HUGE) && - (sip->flags & (SIF_SMALL_SHIP | SIF_NOT_FLYABLE | SIF_HARMLESS))) + (sip->is_small_ship() || !sip->is_flyable() || sip->is_harmless())) { continue; } // AL 2-17-98: If ship is immune to sensors, can't home on it (Sandeep says so)! - if ( sp->flags & SF_HIDDEN_FROM_SENSORS ) { + if ( sp->flags[Ship::Ship_Flags::Hidden_from_sensors] ) { continue; } // Goober5000: if missiles can't home on sensor-ghosted ships, // they definitely shouldn't home on stealth ships - if ( sp->flags2 & SF2_STEALTH && (The_mission.ai_profile->flags & AIPF_FIX_HEAT_SEEKER_STEALTH_BUG) ) { + if ( sp->flags[Ship::Ship_Flags::Stealth] && (The_mission.ai_profile->flags & AIPF_FIX_HEAT_SEEKER_STEALTH_BUG) ) { continue; } @@ -4297,7 +4297,7 @@ void weapon_home(object *obj, int num, float frame_time) if ( pick_homing_point && !(wip->wi_flags2 & WIF2_NON_SUBSYS_HOMING) ) { // If *any* player is parent of homing missile, then use position where lock indicator is - if ( Objects[obj->parent].flags & OF_PLAYER_SHIP ) { + if ( Objects[obj->parent].flags[Object::Object_Flags::Player_ship] ) { player *pp; // determine the player @@ -4679,7 +4679,7 @@ void weapon_process_post(object * obj, float frame_time) Homing_misses++; } } else { - obj->flags |= OF_SHOULD_BE_DEAD; + obj->flags.set(Object::Object_Flags::Should_be_dead); } return; @@ -4848,7 +4848,9 @@ void weapon_process_post(object * obj, float frame_time) //its just entered subspace subspace. don't collide or render if ((wp->lssm_stage==2) && (fireball_lifeleft_percent(&Objects[wp->lssm_warp_idx]) <= wp->lssm_warp_pct)) { - uint flags=obj->flags & ~(OF_RENDERS | OF_COLLIDES); + auto flags = obj->flags; + flags.remove(Object::Object_Flags::Renders); + flags.remove(Object::Object_Flags::Collides); obj_set_flags(obj, flags); @@ -4910,7 +4912,9 @@ void weapon_process_post(object * obj, float frame_time) wp->lssm_stage=5; - uint flags=obj->flags | OF_RENDERS | OF_COLLIDES; + auto flags = obj->flags; + flags.set(Object::Object_Flags::Renders); + flags.set(Object::Object_Flags::Collides); obj_set_flags(obj,flags); } @@ -4977,7 +4981,7 @@ void weapon_set_tracking_info(int weapon_objnum, int parent_objnum, int target_o parent_objp = NULL; } - if (parent_objp != NULL && (Ships[parent_objp->instance].flags2 & SF2_NO_SECONDARY_LOCKON)) { + if (parent_objp != NULL && (Ships[parent_objp->instance].flags[Ship::Ship_Flags::No_secondary_lockon])) { wp->weapon_flags |= WF_NO_HOMING; wp->homing_object = &obj_used_list; wp->homing_subsys = NULL; @@ -5156,7 +5160,7 @@ int weapon_create( vec3d * pos, matrix * porient, int weapon_type, int parent_ob if (Num_weapons >= MAX_WEAPONS-5) { //No, do remove for AI ships -- MK, 3/12/98 // don't need to try and delete weapons for ai ships - //if ( !(Objects[parent_objnum].flags & OF_PLAYER_SHIP) ) + //if ( !(Objects[parent_objnum].flags[Object::Object_Flags::Player_ship]) ) // return -1; num_deleted = collide_remove_weapons(); @@ -5223,7 +5227,12 @@ int weapon_create( vec3d * pos, matrix * porient, int weapon_type, int parent_ob } Weapons_created++; - objnum = obj_create( OBJ_WEAPON, parent_objnum, n, orient, pos, 2.0f, OF_RENDERS | OF_COLLIDES | OF_PHYSICS ); + flagset default_flags; + default_flags.set(Object::Object_Flags::Renders); + default_flags.set(Object::Object_Flags::Collides); + default_flags.set(Object::Object_Flags::Physics); + + objnum = obj_create( OBJ_WEAPON, parent_objnum, n, orient, pos, 2.0f, default_flags); Assert(objnum >= 0); objp = &Objects[objnum]; @@ -5326,7 +5335,7 @@ int weapon_create( vec3d * pos, matrix * porient, int weapon_type, int parent_ob wp->lifeleft = wip->lifetime; } else { wp->lifeleft = (rand_val) * (wip->life_max - wip->life_min) / wip->life_min; - if((wip->wi_flags & WIF_CMEASURE) && (parent_objp != NULL) && (parent_objp->flags & OF_PLAYER_SHIP)) { + if((wip->wi_flags & WIF_CMEASURE) && (parent_objp != NULL) && (parent_objp->flags[Object::Object_Flags::Player_ship])) { wp->lifeleft *= The_mission.ai_profile->cmeasure_life_scale[Game_skill_level]; } wp->lifeleft = wip->life_min + wp->lifeleft * (wip->life_max - wip->life_min); @@ -5338,7 +5347,7 @@ int weapon_create( vec3d * pos, matrix * porient, int weapon_type, int parent_ob } // Make remote detonate missiles look like they're getting detonated by firer simply by giving them variable lifetimes. - if (parent_objp != NULL && !(parent_objp->flags & OF_PLAYER_SHIP) && (wip->wi_flags & WIF_REMOTE)) { + if (parent_objp != NULL && !(parent_objp->flags[Object::Object_Flags::Player_ship]) && (wip->wi_flags & WIF_REMOTE)) { wp->lifeleft = wp->lifeleft/2.0f + rand_val * wp->lifeleft/2.0f; } @@ -5444,8 +5453,8 @@ int weapon_create( vec3d * pos, matrix * porient, int weapon_type, int parent_ob // if this is a flak weapon shell, make it so // NOTE : this function will change some fundamental things about the weapon object - if ( (wip->wi_flags & WIF_FLAK) && !(wip->wi_flags2 & WIF2_RENDER_FLAK) ) { - obj_set_flags(&Objects[wp->objnum], Objects[wp->objnum].flags & ~(OF_RENDERS)); + if ( (wip->wi_flags & WIF_FLAK) && !(wip->wi_flags2 & WIF2_RENDER_FLAK) ) { + obj_set_flags(&Objects[wp->objnum], Objects[wp->objnum].flags - Object::Object_Flags::Renders); } wp->missile_list_index = -1; @@ -5998,7 +6007,7 @@ void weapon_do_area_effect(object *wobjp, shockwave_create_info *sci, vec3d *pos if ( objp->type == OBJ_SHIP ) { // don't blast navbuoys - if ( ship_get_SIF(objp->instance) & SIF_NAVBUOY ) { + if ( ship_get_SIF(objp->instance)[Ship::Info_Flags::Navbuoy] ) { continue; } } @@ -6016,7 +6025,7 @@ void weapon_do_area_effect(object *wobjp, shockwave_create_info *sci, vec3d *pos case OBJ_SHIP: // If we're doing an AoE Electronics blast, do the electronics stuff (unless it also has the regular "electronics" // flag and this is the ship the missile directly impacted; then leave it for the regular code below) -MageKing17 - if ( (wip->wi_flags3 & WIF3_AOE_ELECTRONICS) && !((objp->flags & OF_INVULNERABLE) || ((objp == other_obj) && (wip->wi_flags & WIF_ELECTRONICS))) ) { + if ( (wip->wi_flags3 & WIF3_AOE_ELECTRONICS) && !((objp->flags[Object::Object_Flags::Invulnerable]) || ((objp == other_obj) && (wip->wi_flags & WIF_ELECTRONICS))) ) { weapon_do_electronics_effect(objp, pos, Weapons[wobjp->instance].weapon_info_index); } ship_apply_global_damage(objp, wobjp, pos, damage); @@ -6268,7 +6277,7 @@ void weapon_hit( object * weapon_obj, object * other_obj, vec3d * hitpos, int qu } } - weapon_obj->flags |= OF_SHOULD_BE_DEAD; + weapon_obj->flags.set(Object::Object_Flags::Should_be_dead); //Set shockwaves flag int sw_flag = SW_WEAPON; @@ -7013,7 +7022,7 @@ float weapon_get_damage_scale(weapon_info *wip, object *wep, object *target) // was the weapon fired by the player from_player = 0; - if((wep->parent >= 0) && (wep->parent < MAX_OBJECTS) && (Objects[wep->parent].flags & OF_PLAYER_SHIP)){ + if((wep->parent >= 0) && (wep->parent < MAX_OBJECTS) && (Objects[wep->parent].flags[Object::Object_Flags::Player_ship])){ from_player = 1; } @@ -7025,7 +7034,7 @@ float weapon_get_damage_scale(weapon_info *wip, object *wep, object *target) // if the hit object was a ship and we're doing damage scaling if ( (target->type == OBJ_SHIP) && !(The_mission.ai_profile->flags & AIPF_DISABLE_WEAPON_DAMAGE_SCALING) && - !(Ship_info[Ships[target->instance].ship_info_index].flags2 & SIF2_DISABLE_WEAPON_DAMAGE_SCALING) + !(Ship_info[Ships[target->instance].ship_info_index].flags[Ship::Info_Flags::Disable_weapon_damage_scaling]) ) { ship_info *sip; @@ -7040,7 +7049,7 @@ float weapon_get_damage_scale(weapon_info *wip, object *wep, object *target) hull_pct = get_hull_pct(target); // if it has hit a supercap ship and is not a supercap class weapon - if((sip->flags & SIF_SUPERCAP) && !(wip->wi_flags & WIF_SUPERCAP)){ + if((sip->flags[Ship::Info_Flags::Supercap]) && !(wip->wi_flags & WIF_SUPERCAP)){ // if the supercap is around 3/4 damage, apply nothing if(hull_pct <= 0.75f){ return 0.0f; @@ -7050,7 +7059,7 @@ float weapon_get_damage_scale(weapon_info *wip, object *wep, object *target) } // determine if this is a big damage ship - is_big_damage_ship = (sip->flags & SIF_BIG_DAMAGE); + is_big_damage_ship = (sip->flags[Ship::Info_Flags::Big_damage]); // if this is a large ship, and is being hit by flak if(is_big_damage_ship && (wip->wi_flags & WIF_FLAK)){ diff --git a/fred2/AltShipClassDlg.cpp b/fred2/AltShipClassDlg.cpp index b99ccac87c..f9ba3022c1 100644 --- a/fred2/AltShipClassDlg.cpp +++ b/fred2/AltShipClassDlg.cpp @@ -199,7 +199,7 @@ BOOL AltShipClassDlg::OnInitDialog() objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { if ((objp->type == OBJ_START) || (objp->type == OBJ_SHIP)) { - if (objp->flags & OF_MARKED) { + if (objp->flags[Object::Object_Flags::Marked]) { m_selected_ships[num_selected_ships++] = objp->instance; } } @@ -207,7 +207,7 @@ BOOL AltShipClassDlg::OnInitDialog() } Assert (num_selected_ships > 0); - Assert (Objects[cur_object_index].flags & OF_MARKED); + Assert (Objects[cur_object_index].flags[Object::Object_Flags::Marked]); if (num_selected_ships > 1) { @@ -238,15 +238,15 @@ BOOL AltShipClassDlg::OnInitDialog() m_set_from_ship_class.AddString("Set From Variable"); } count = 0; - for (auto it = Ship_info.cbegin(); it != Ship_info.cend(); ++it) - { - if (player_ships_only && !(it->flags & SIF_PLAYER_SHIP)) { - continue; - } + for (auto it = Ship_info.cbegin(); it != Ship_info.cend(); ++it) + { + if (player_ships_only && !(it->flags[Ship::Info_Flags::Player_ship])) { + continue; + } - ship_class_indices[count++] = std::distance(Ship_info.cbegin(), it); - m_set_from_ship_class.AddString(it->name); - } + ship_class_indices[count++] = std::distance(Ship_info.cbegin(), it); + m_set_from_ship_class.AddString(it->name); + } m_set_from_ship_class.SetCurSel(num_string_variables?1:0); // Set to the first ship class // Set up the actual list of alt classes diff --git a/fred2/bgbitmapdlg.cpp b/fred2/bgbitmapdlg.cpp index f95d8b567c..35bfa95f93 100644 --- a/fred2/bgbitmapdlg.cpp +++ b/fred2/bgbitmapdlg.cpp @@ -276,7 +276,7 @@ void bg_bitmap_dlg::create() // determine if a full Neb2 is active - load in the full nebula filenames or the partial neb // filenames - m_fullneb = (The_mission.flags & MISSION_FLAG_FULLNEB) ? 1 : 0; + m_fullneb = (The_mission.flags[Mission::Mission_Flags::Fullneb]) ? 1 : 0; if(m_fullneb){ ((CButton*)GetDlgItem(IDC_FULLNEB))->SetCheck(1); } else { @@ -293,7 +293,7 @@ void bg_bitmap_dlg::create() m_heading = Nebula_heading; } - m_toggle_trails = (The_mission.flags & MISSION_FLAG_TOGGLE_SHIP_TRAILS) ? 1 : 0; + m_toggle_trails = (The_mission.flags[Mission::Mission_Flags::Toggle_ship_trails]) ? 1 : 0; ((CButton*)GetDlgItem(IDC_NEB_TOGGLE_TRAILS))->SetCheck(m_toggle_trails); // setup background numbering @@ -315,7 +315,7 @@ void bg_bitmap_dlg::create() bitmap_data_init(); // determine if subspace is active - m_subspace = (The_mission.flags & MISSION_FLAG_SUBSPACE) ? 1 : 0; + m_subspace = (The_mission.flags[Mission::Mission_Flags::Subspace]) ? 1 : 0; m_amb_red.SetRange(1,255); m_amb_green.SetRange(1,255); @@ -358,7 +358,7 @@ void bg_bitmap_dlg::OnClose() Mission_palette = m_nebula_color; if(m_fullneb){ - The_mission.flags |= MISSION_FLAG_FULLNEB; + The_mission.flags.set(Mission::Mission_Flags::Fullneb); Neb2_awacs = (float)atoi((LPCSTR)m_neb_intensity); // override dumb values with reasonable ones @@ -399,18 +399,14 @@ void bg_bitmap_dlg::OnClose() // init the nebula neb2_level_init(); } else { - The_mission.flags &= ~MISSION_FLAG_FULLNEB; + The_mission.flags.remove(Mission::Mission_Flags::Fullneb); Nebula_index = m_nebula_index - 1; Neb2_awacs = -1.0f; strcpy_s(Neb2_texture_name, ""); } // check for no ship trails -C - if( m_toggle_trails ) { - The_mission.flags |= MISSION_FLAG_TOGGLE_SHIP_TRAILS; - } else { - The_mission.flags &= ~MISSION_FLAG_TOGGLE_SHIP_TRAILS; - } + The_mission.flags.set(Mission::Mission_Flags::Toggle_ship_trails, m_toggle_trails != 0); // get selected storm ((CComboBox*)GetDlgItem(IDC_NEB2_LIGHTNING))->GetLBText(((CComboBox*)GetDlgItem(IDC_NEB2_LIGHTNING))->GetCurSel(), Mission_parse_storm_name); @@ -424,11 +420,7 @@ void bg_bitmap_dlg::OnClose() nebula_close(); } - if (m_subspace){ - The_mission.flags |= MISSION_FLAG_SUBSPACE; - } else { - The_mission.flags &= ~MISSION_FLAG_SUBSPACE; - } + The_mission.flags.set(Mission::Mission_Flags::Subspace, m_subspace != 0); string_copy(The_mission.skybox_model, m_skybox_model, NAME_LENGTH, 1); string_copy(The_mission.envmap_name, m_envmap, NAME_LENGTH, 1); diff --git a/fred2/briefingeditordlg.cpp b/fred2/briefingeditordlg.cpp index 145a69fcdc..c37383a734 100644 --- a/fred2/briefingeditordlg.cpp +++ b/fred2/briefingeditordlg.cpp @@ -611,7 +611,7 @@ void briefing_editor_dlg::update_data(int update) valid = invalid = 0; objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { - if (objp->flags & OF_MARKED) { + if (objp->flags[Object::Object_Flags::Marked]) { if ((objp->type == OBJ_SHIP) || (objp->type == OBJ_START) || (objp->type == OBJ_WAYPOINT) || (objp->type == OBJ_JUMP_NODE)) valid = 1; else @@ -636,7 +636,7 @@ void briefing_editor_dlg::update_data(int update) valid = invalid = 0; objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { - if (objp->flags & OF_MARKED) { + if (objp->flags[Object::Object_Flags::Marked]) { if (objp->type == OBJ_POINT) { valid++; icon_marked[objp->instance] = 1; @@ -706,9 +706,10 @@ void briefing_editor_dlg::update_data(int update) } if (m_cur_stage >= 0) { + flagset default_flags; for (i=0; inum_icons; i++) { // create an object for each icon for display/manipulation purposes - icon_obj[i] = obj_create(OBJ_POINT, -1, i, NULL, &ptr->icons[i].pos, 0.0f, OF_RENDERS); + icon_obj[i] = obj_create(OBJ_POINT, -1, i, NULL, &ptr->icons[i].pos, 0.0f, default_flags + Object::Object_Flags::Renders); } obj_merge_created_list(); @@ -831,7 +832,7 @@ void briefing_editor_dlg::draw_icon(object *objp) if (m_cur_stage < 0) return; - brief_render_icon(m_cur_stage, objp->instance, 1.0f/30.0f, objp->flags & OF_MARKED, + brief_render_icon(m_cur_stage, objp->instance, 1.0f/30.0f, objp->flags[Object::Object_Flags::Marked], (float) True_rw / BRIEF_GRID_W, (float) True_rh / BRIEF_GRID_H); } @@ -955,7 +956,7 @@ void briefing_editor_dlg::OnMakeIcon() vm_vec_make(&max, -9e19f, -9e19f, -9e19f); ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - if (ptr->flags & OF_MARKED) { + if (ptr->flags[Object::Object_Flags::Marked]) { if (ptr->pos.xyz.x < min.xyz.x) min.xyz.x = ptr->pos.xyz.x; if (ptr->pos.xyz.x > max.xyz.x) @@ -994,17 +995,17 @@ void briefing_editor_dlg::OnMakeIcon() team = Ships[ship].team; z = ship_query_general_type(ship); - if (Ship_info[Ships[ship].ship_info_index].flags & SIF_CARGO) + if (Ship_info[Ships[ship].ship_info_index].flags[Ship::Info_Flags::Cargo]) cargo_count++; - if (Ship_info[Ships[ship].ship_info_index].flags & SIF_FREIGHTER) + if (Ship_info[Ships[ship].ship_info_index].flags[Ship::Info_Flags::Freighter]) { // direct docked with any marked cargo? for (dock_instance *dock_ptr = ptr->dock_list; dock_ptr != NULL; dock_ptr = dock_ptr->next) { - if (dock_ptr->docked_objp->flags & OF_MARKED) + if (dock_ptr->docked_objp->flags[Object::Object_Flags::Marked]) { - if (Ship_info[Ships[dock_ptr->docked_objp->instance].ship_info_index].flags & SIF_CARGO) + if (Ship_info[Ships[dock_ptr->docked_objp->instance].ship_info_index].flags[Ship::Info_Flags::Cargo]) freighter_count++; } } @@ -1048,107 +1049,73 @@ void briefing_editor_dlg::OnMakeIcon() iconp->id = Cur_brief_id++; if (ship >= 0) { iconp->ship_class = Ships[ship].ship_info_index; - switch (Ship_info[Ships[ship].ship_info_index].flags & SIF_ALL_SHIP_TYPES) { - case SIF_KNOSSOS_DEVICE: - iconp->type = ICON_KNOSSOS_DEVICE; - break; + ship_info* sip = &Ship_info[Ships[ship].ship_info_index]; - case SIF_CORVETTE: - iconp->type = ICON_CORVETTE; - break; - - case SIF_GAS_MINER: - iconp->type = ICON_GAS_MINER; - break; - - case SIF_SUPERCAP: - iconp->type = ICON_SUPERCAP; - break; - - case SIF_SENTRYGUN: - iconp->type = ICON_SENTRYGUN; - break; - - case SIF_AWACS: - iconp->type = ICON_AWACS; - break; - - case SIF_CARGO: - if (cargo) - iconp->type = (count == 1) ? ICON_FREIGHTER_WITH_CARGO : ICON_FREIGHTER_WING_WITH_CARGO; - else - iconp->type = count ? ICON_CARGO_WING : ICON_CARGO; - - break; - - case SIF_SUPPORT: - iconp->type = ICON_SUPPORT_SHIP; - break; - - case SIF_FIGHTER: - iconp->type = count ? ICON_FIGHTER_WING : ICON_FIGHTER; - break; - - case SIF_BOMBER: - iconp->type = count ? ICON_BOMBER_WING : ICON_BOMBER; - break; - - case SIF_FREIGHTER: - if (cargo) - iconp->type = (count == 1) ? ICON_FREIGHTER_WITH_CARGO : ICON_FREIGHTER_WING_WITH_CARGO; - else - iconp->type = count ? ICON_FREIGHTER_WING_NO_CARGO : ICON_FREIGHTER_NO_CARGO; - - break; - - case SIF_CRUISER: - iconp->type = count ? ICON_CRUISER_WING : ICON_CRUISER; - break; - - case SIF_TRANSPORT: - iconp->type = count ? ICON_TRANSPORT_WING : ICON_TRANSPORT; - break; - - case SIF_CAPITAL: - case SIF_DRYDOCK: - iconp->type = ICON_CAPITAL; - break; - - case SIF_NAVBUOY: - iconp->type = ICON_WAYPOINT; - break; - - default: - iconp->type = ICON_ASTEROID_FIELD; - break; - } + if (sip->flags[Ship::Info_Flags::Knossos_device]) + iconp->type = ICON_KNOSSOS_DEVICE; + else if (sip->flags[Ship::Info_Flags::Corvette]) + iconp->type = ICON_CORVETTE; + else if (sip->flags[Ship::Info_Flags::Gas_miner]) + iconp->type = ICON_GAS_MINER; + else if (sip->flags[Ship::Info_Flags::Supercap]) + iconp->type = ICON_SUPERCAP; + else if (sip->flags[Ship::Info_Flags::Sentrygun]) + iconp->type = ICON_SENTRYGUN; + else if (sip->flags[Ship::Info_Flags::Awacs]) + iconp->type = ICON_AWACS; + else if (sip->flags[Ship::Info_Flags::Cargo]) + if (cargo) + iconp->type = (count == 1) ? ICON_FREIGHTER_WITH_CARGO : ICON_FREIGHTER_WING_WITH_CARGO; + else + iconp->type = count ? ICON_CARGO_WING : ICON_CARGO; + else if (sip->flags[Ship::Info_Flags::Support]) + iconp->type = ICON_SUPPORT_SHIP; + else if (sip->flags[Ship::Info_Flags::Fighter]) + iconp->type = count ? ICON_FIGHTER_WING : ICON_FIGHTER; + else if (sip->flags[Ship::Info_Flags::Bomber]) + iconp->type = count ? ICON_BOMBER_WING : ICON_BOMBER; + else if (sip->flags[Ship::Info_Flags::Freighter]) + if (cargo) + iconp->type = (count == 1) ? ICON_FREIGHTER_WITH_CARGO : ICON_FREIGHTER_WING_WITH_CARGO; + else + iconp->type = count ? ICON_FREIGHTER_WING_NO_CARGO : ICON_FREIGHTER_NO_CARGO; + else if (sip->flags[Ship::Info_Flags::Cruiser]) + iconp->type = count ? ICON_CRUISER_WING : ICON_CRUISER; + else if (sip->flags[Ship::Info_Flags::Transport]) + iconp->type = count ? ICON_TRANSPORT_WING : ICON_TRANSPORT; + else if (sip->flags[Ship::Info_Flags::Capital] || sip->flags[Ship::Info_Flags::Drydock]) + iconp->type = ICON_CAPITAL; + else if (sip->flags[Ship::Info_Flags::Navbuoy]) + iconp->type = ICON_WAYPOINT; + else + iconp->type = ICON_ASTEROID_FIELD; } // jumpnodes else if(jnp != Jump_nodes.end()){ // find the first navbuoy iconp->ship_class = -1; - for (auto it = Ship_info.cbegin(); it != Ship_info.cend(); ++it) - { - if (it->flags & SIF_NAVBUOY) - { - iconp->ship_class = std::distance(Ship_info.cbegin(), it); - break; - } - } + for (auto it = Ship_info.cbegin(); it != Ship_info.cend(); ++it) + { + if (it->flags[Ship::Info_Flags::Navbuoy]) + { + iconp->ship_class = std::distance(Ship_info.cbegin(), it); + break; + } + } iconp->type = ICON_JUMP_NODE; } // everything else else { // find the first navbuoy iconp->ship_class = -1; - for (auto it = Ship_info.cbegin(); it != Ship_info.cend(); ++it) - { - if (it->flags & SIF_NAVBUOY) - { - iconp->ship_class = std::distance(Ship_info.cbegin(), it); - break; - } - } + for (auto it = Ship_info.cbegin(); it != Ship_info.cend(); ++it) + { + if (it->flags[Ship::Info_Flags::Navbuoy]) + { + iconp->ship_class = std::distance(Ship_info.cbegin(), it); + break; + } + } iconp->type = ICON_WAYPOINT; } @@ -1156,7 +1123,9 @@ void briefing_editor_dlg::OnMakeIcon() propagate_icon(m_cur_icon); } - icon_obj[m_cur_icon] = obj_create(OBJ_POINT, -1, m_cur_icon, NULL, &pos, 0.0f, OF_RENDERS); + flagset default_flags; + default_flags.set(Object::Object_Flags::Renders); + icon_obj[m_cur_icon] = obj_create(OBJ_POINT, -1, m_cur_icon, NULL, &pos, 0.0f, default_flags); Assert(icon_obj[m_cur_icon] >= 0); obj_merge_created_list(); unmark_all(); @@ -1263,7 +1232,7 @@ void briefing_editor_dlg::OnPropagateIcons() ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - if ((ptr->type == OBJ_POINT) && (ptr->flags & OF_MARKED)) { + if ((ptr->type == OBJ_POINT) && (ptr->flags[Object::Object_Flags::Marked])) { propagate_icon(ptr->instance); } diff --git a/fred2/dumpstats.cpp b/fred2/dumpstats.cpp index 4d3a8d72ab..5adbb457fd 100644 --- a/fred2/dumpstats.cpp +++ b/fred2/dumpstats.cpp @@ -167,15 +167,15 @@ void DumpStats::get_mission_stats(CString &buffer) buffer += temp; } - if (The_mission.flags & MISSION_FLAG_RED_ALERT) { + if (The_mission.flags[Mission::Mission_Flags::Red_alert]) { buffer += "\tRed Alert\r\n"; } - if (The_mission.flags & MISSION_FLAG_SCRAMBLE) { + if (The_mission.flags[Mission::Mission_Flags::Scramble]) { buffer += "\tScramble\r\n"; } - if (The_mission.flags & MISSION_FLAG_NO_PROMOTION) { + if (The_mission.flags[Mission::Mission_Flags::No_promotion]) { buffer += "\tNo Promotions\r\n"; } @@ -258,7 +258,7 @@ void DumpStats::get_background_stats(CString &buffer) } // Nebula mission - int nebula_mission = (The_mission.flags & MISSION_FLAG_FULLNEB); + int nebula_mission = (The_mission.flags[Mission::Mission_Flags::Fullneb]); temp = "Nebula mission:"; if (nebula_mission) { temp += " Yes\r\n"; @@ -295,7 +295,7 @@ void DumpStats::get_background_stats(CString &buffer) // Subspace mission temp = "Subspace mission:"; - if (The_mission.flags & MISSION_FLAG_SUBSPACE) { + if (The_mission.flags[Mission::Mission_Flags::Subspace]) { temp += " Yes\r\n"; } else { temp += " No\r\n"; @@ -318,12 +318,10 @@ void DumpStats::get_object_stats(CString &buffer) // inc big ship or small ship count if ( (objp->type == OBJ_SHIP) || (objp->type == OBJ_START) ) { - if ( Ship_info[Ships[objp->instance].ship_info_index].flags & SIF_SMALL_SHIP ) { + if ( Ship_info[Ships[objp->instance].ship_info_index].is_small_ship() ) { num_small_ships++; - } else if ( Ship_info[Ships[objp->instance].ship_info_index].flags & SIF_BIG_SHIP ) { + } else if ( Ship_info[Ships[objp->instance].ship_info_index].is_big_or_huge() ) { num_big_ships++; - } else if ( Ship_info[Ships[objp->instance].ship_info_index].flags & SIF_HUGE_SHIP ) { - num_huge_ships++; } } @@ -432,7 +430,7 @@ void DumpStats::get_object_stats(CString &buffer) buffer += "\r\nESCORT\r\n"; for ( objp = GET_FIRST(&obj_used_list); objp != END_OF_LIST(&obj_used_list); objp = GET_NEXT(objp) ) { if ( (objp->type == OBJ_SHIP) || (objp->type == OBJ_START) ) { - if (Ships[objp->instance].flags & SF_ESCORT) { + if (Ships[objp->instance].flags[Ship::Ship_Flags::Escort]) { temp.Format("\tShip name: %s, priority: %d\r\n", Ships[objp->instance].ship_name, Ships[objp->instance].escort_priority); buffer += temp; } @@ -589,7 +587,7 @@ void DumpStats::get_species_ship_breakdown(CString &buffer) if (Wings[i].wave_count > 0) { int wing_leader_shipnum = Wings[i].ship_index[Wings[i].special_ship]; if (Ship_info[Ships[wing_leader_shipnum].ship_info_index].species == species) { - if (Ship_info[Ships[wing_leader_shipnum].ship_info_index].flags & SIF_FIGHTER) { + if (Ship_info[Ships[wing_leader_shipnum].ship_info_index].flags[Ship::Info_Flags::Fighter]) { temp.Format("\t\tWing: %s, count: %d, waves: %d, type: %s\r\n", Wings[i].name, Wings[i].wave_count, Wings[i].num_waves, Ship_info[Ships[wing_leader_shipnum].ship_info_index].name); buffer += temp; } @@ -603,7 +601,7 @@ void DumpStats::get_species_ship_breakdown(CString &buffer) if (Wings[i].wave_count > 0) { int wing_leader_shipnum = Wings[i].ship_index[Wings[i].special_ship]; if (Ship_info[Ships[wing_leader_shipnum].ship_info_index].species == species) { - if (Ship_info[Ships[wing_leader_shipnum].ship_info_index].flags & SIF_BOMBER) { + if (Ship_info[Ships[wing_leader_shipnum].ship_info_index].flags[Ship::Info_Flags::Bomber]) { temp.Format("\t\tWing: %s, count: %d, waves: %d, type: %s\r\n", Wings[i].name, Wings[i].wave_count, Wings[i].num_waves, Ship_info[Ships[wing_leader_shipnum].ship_info_index].name); buffer += temp; } @@ -620,7 +618,7 @@ void DumpStats::get_species_ship_breakdown(CString &buffer) if (Ship_info[shipp->ship_info_index].species == species) { //if (shipp->wingnum == -1) //if (shipp->cargo1 > 0) - if (Ship_info[shipp->ship_info_index].flags & (SIF_FREIGHTER | SIF_TRANSPORT | SIF_CARGO)) { + if (Ship_info[shipp->ship_info_index].flags[Ship::Info_Flags::Freighter] || Ship_info[shipp->ship_info_index].flags[Ship::Info_Flags::Transport] || Ship_info[shipp->ship_info_index].flags[Ship::Info_Flags::Cargo]) { temp.Format("\t\tName: %s Type: %s, Cargo: %s\r\n", shipp->ship_name, Ship_info[shipp->ship_info_index].name, Cargo_names[shipp->cargo1]); buffer += temp; } @@ -636,7 +634,7 @@ void DumpStats::get_species_ship_breakdown(CString &buffer) if (Ship_info[shipp->ship_info_index].species == species) { //if (shipp->wingnum == -1) //if (shipp->cargo1 > 0) - if (Ship_info[shipp->ship_info_index].flags & (SIF_NAVBUOY | SIF_ESCAPEPOD | SIF_SENTRYGUN)) { + if (Ship_info[shipp->ship_info_index].flags[Ship::Info_Flags::Navbuoy] || Ship_info[shipp->ship_info_index].flags[Ship::Info_Flags::Escapepod] || Ship_info[shipp->ship_info_index].flags[Ship::Info_Flags::Sentrygun]) { temp.Format("\t\tName: %s, Type: %s Cargo: %s\r\n", shipp->ship_name, Ship_info[shipp->ship_info_index].name, Cargo_names[shipp->cargo1]); buffer += temp; } @@ -654,7 +652,7 @@ void DumpStats::get_species_ship_breakdown(CString &buffer) if (Ship_info[shipp->ship_info_index].species == species) { //if (shipp->wingnum == -1) //if (shipp->cargo1 > 0) - if (Ship_info[shipp->ship_info_index].flags & (SIF_CRUISER)) { + if (Ship_info[shipp->ship_info_index].flags[Ship::Info_Flags::Cruiser]) { temp.Format("\t\tName: %s, Type: %s, Cargo: %s\r\n", shipp->ship_name, Ship_info[shipp->ship_info_index].name, Cargo_names[shipp->cargo1]); buffer += temp; } @@ -671,7 +669,7 @@ void DumpStats::get_species_ship_breakdown(CString &buffer) if (Ship_info[shipp->ship_info_index].species == species) { //if (shipp->wingnum == -1) //if (shipp->cargo1 > 0) - if (Ship_info[shipp->ship_info_index].flags & (SIF_DRYDOCK|SIF_CAPITAL|SIF_SUPERCAP)) { + if (Ship_info[shipp->ship_info_index].flags[Ship::Info_Flags::Drydock] || Ship_info[shipp->ship_info_index].flags[Ship::Info_Flags::Capital] || Ship_info[shipp->ship_info_index].flags[Ship::Info_Flags::Supercap]) { temp.Format("\t\tName: %s, Type: %s, Cargo: %s\r\n", shipp->ship_name, Ship_info[shipp->ship_info_index].name, Cargo_names[shipp->cargo1]); buffer += temp; } @@ -770,7 +768,7 @@ void DumpStats::get_default_ship_loadouts(CString &buffer) if (Wings[i].wave_count > 0) { int wing_leader_shipnum = Wings[i].ship_index[Wings[i].special_ship]; if (Ship_info[Ships[wing_leader_shipnum].ship_info_index].species == species) { - if (Ship_info[Ships[wing_leader_shipnum].ship_info_index].flags & SIF_FIGHTER) { + if (Ship_info[Ships[wing_leader_shipnum].ship_info_index].flags[Ship::Info_Flags::Fighter]) { temp.Format("\t\tWing: %s\r\n", Wings[i].name); buffer += temp; dump_loadout(&Ships[wing_leader_shipnum], loadout); @@ -786,7 +784,7 @@ void DumpStats::get_default_ship_loadouts(CString &buffer) if (Wings[i].wave_count > 0) { int wing_leader_shipnum = Wings[i].ship_index[Wings[i].special_ship]; if (Ship_info[Ships[wing_leader_shipnum].ship_info_index].species == species) { - if (Ship_info[Ships[wing_leader_shipnum].ship_info_index].flags & SIF_BOMBER) { + if (Ship_info[Ships[wing_leader_shipnum].ship_info_index].flags[Ship::Info_Flags::Bomber]) { temp.Format("\t\tWing: %s\r\n", Wings[i].name); buffer += temp; dump_loadout(&Ships[wing_leader_shipnum], loadout); @@ -805,7 +803,7 @@ void DumpStats::get_default_ship_loadouts(CString &buffer) if (Ship_info[shipp->ship_info_index].species == species) { //if (shipp->wingnum == -1) //if (shipp->cargo1 > 0) - if (Ship_info[shipp->ship_info_index].flags & (SIF_FREIGHTER | SIF_TRANSPORT)) { + if (Ship_info[shipp->ship_info_index].flags[Ship::Info_Flags::Freighter] || Ship_info[shipp->ship_info_index].flags[Ship::Info_Flags::Transport]) { temp.Format("\t\tName: %s\r\n", shipp->ship_name); buffer += temp; dump_loadout(shipp, loadout); @@ -823,7 +821,7 @@ void DumpStats::get_default_ship_loadouts(CString &buffer) if (Ship_info[shipp->ship_info_index].species == species) { //if (shipp->wingnum == -1) //if (shipp->cargo1 > 0) - if (Ship_info[shipp->ship_info_index].flags & (SIF_ESCAPEPOD | SIF_SENTRYGUN)) { + if (Ship_info[shipp->ship_info_index].flags[Ship::Info_Flags::Escapepod] || Ship_info[shipp->ship_info_index].flags[Ship::Info_Flags::Sentrygun]) { temp.Format("\t\tName: %s\r\n", shipp->ship_name); buffer += temp; dump_loadout(shipp, loadout); @@ -843,7 +841,7 @@ void DumpStats::get_default_ship_loadouts(CString &buffer) if (Ship_info[shipp->ship_info_index].species == species) { //if (shipp->wingnum == -1) //if (shipp->cargo1 > 0) - if (Ship_info[shipp->ship_info_index].flags & (SIF_CRUISER)) { + if (Ship_info[shipp->ship_info_index].flags[Ship::Info_Flags::Cruiser]) { temp.Format("\t\tName: %s\r\n", shipp->ship_name); buffer += temp; dump_loadout(shipp, loadout); @@ -862,7 +860,7 @@ void DumpStats::get_default_ship_loadouts(CString &buffer) if (Ship_info[shipp->ship_info_index].species == species) { //if (shipp->wingnum == -1) //if (shipp->cargo1 > 0) - if (Ship_info[shipp->ship_info_index].flags & (SIF_CAPITAL|SIF_SUPERCAP)) { + if (Ship_info[shipp->ship_info_index].flags[Ship::Info_Flags::Capital] || Ship_info[shipp->ship_info_index].flags[Ship::Info_Flags::Supercap]) { temp.Format("\t\tName: %s\r\n", shipp->ship_name); buffer += temp; dump_loadout(shipp, loadout); diff --git a/fred2/freddoc.cpp b/fred2/freddoc.cpp index 9a441c5d84..bb323122e7 100644 --- a/fred2/freddoc.cpp +++ b/fred2/freddoc.cpp @@ -260,7 +260,7 @@ int CFREDDoc::load_mission(char *pathname, int flags) { obj_merge_created_list(); objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { - if (objp->flags & OF_PLAYER_SHIP) { + if (objp->flags[Object::Object_Flags::Player_ship]) { Assert(objp->type == OBJ_SHIP); objp->type = OBJ_START; // Player_starts++; @@ -333,7 +333,7 @@ int CFREDDoc::load_mission(char *pathname, int flags) { // RT, don't need this anymore #if 0 - if (The_mission.flags & MISSION_FLAG_SUBSPACE) { + if (The_mission.flags[Mission::Mission_Flags::Subspace]) { strcpy_s(name, NOX("gamepalette-subspace")); } else { strcpy_s(name, "gamepalette1-01"); diff --git a/fred2/fredrender.cpp b/fred2/fredrender.cpp index 3a2841dcd4..2273142c84 100644 --- a/fred2/fredrender.cpp +++ b/fred2/fredrender.cpp @@ -441,12 +441,12 @@ void display_distances() { objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { - if (objp->flags & OF_MARKED) + if (objp->flags[Object::Object_Flags::Marked]) { o2 = GET_NEXT(objp); while (o2 != END_OF_LIST(&obj_used_list)) { - if (o2->flags & OF_MARKED) + if (o2->flags[Object::Object_Flags::Marked]) { rpd_line(&objp->pos, &o2->pos); vm_vec_avg(&pos, &objp->pos, &o2->pos); @@ -482,7 +482,7 @@ void display_ship_info() { render = 1; if (OBJ_INDEX(objp) == cur_object_index) Fred_outline = FRED_COLOUR_WHITE; - else if (objp->flags & OF_MARKED) // is it a marked object? + else if (objp->flags[Object::Object_Flags::Marked]) // is it a marked object? Fred_outline = FRED_COLOUR_YELLOW; else Fred_outline = 0; @@ -501,7 +501,7 @@ void display_ship_info() { render = 0; } - if (objp->flags & OF_HIDDEN) + if (objp->flags[Object::Object_Flags::Hidden]) render = 0; g3_rotate_vertex(&v, &objp->pos); @@ -945,7 +945,7 @@ void game_do_frame() { objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { Assert(objp->type != OBJ_NONE); - if ((objp->flags & OF_MARKED) && (cur_object_index != OBJ_INDEX(objp))) { + if ((objp->flags[Object::Object_Flags::Marked]) && (cur_object_index != OBJ_INDEX(objp))) { if (Group_rotate) { matrix rot_trans; vec3d tmpv1, tmpv2; @@ -990,7 +990,7 @@ void game_do_frame() { objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { - if (objp->flags & OF_MARKED) + if (objp->flags[Object::Object_Flags::Marked]) object_moved(objp); objp = GET_NEXT(objp); @@ -1162,7 +1162,7 @@ void level_controlled() { case 1: // Control the current object's location and orientation objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { - if (objp->flags & OF_MARKED) + if (objp->flags[Object::Object_Flags::Marked]) level_object(&objp->orient); objp = GET_NEXT(objp); @@ -1170,7 +1170,7 @@ void level_controlled() { objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { - if (objp->flags & OF_MARKED) { + if (objp->flags[Object::Object_Flags::Marked]) { object_moved(objp); count++; } @@ -1256,7 +1256,7 @@ int object_check_collision(object *objp, vec3d *p0, vec3d *p1, vec3d *hitpos) { return 0; } - if (objp->flags & OF_HIDDEN) + if (objp->flags[Object::Object_Flags::Hidden]) return 0; if ((Show_ship_models || Show_outlines) && (objp->type == OBJ_SHIP)) { @@ -1737,7 +1737,7 @@ void render_one_model_htl(object *objp) { return; } - if (objp->flags & OF_HIDDEN) + if (objp->flags[Object::Object_Flags::Hidden]) return; rendering_order[render_count] = OBJ_INDEX(objp); @@ -1745,7 +1745,7 @@ void render_one_model_htl(object *objp) { if ((OBJ_INDEX(objp) == cur_object_index) && !Bg_bitmap_dialog) Fred_outline = FRED_COLOUR_WHITE; - else if ((objp->flags & OF_MARKED) && !Bg_bitmap_dialog) // is it a marked object? + else if ((objp->flags[Object::Object_Flags::Marked]) && !Bg_bitmap_dialog) // is it a marked object? Fred_outline = FRED_COLOUR_YELLOW; else if ((objp->type == OBJ_SHIP) && Show_outlines) { @@ -1888,7 +1888,7 @@ void render_one_model_nohtl(object *objp) { return; } - if (objp->flags & OF_HIDDEN) + if (objp->flags[Object::Object_Flags::Hidden]) return; rendering_order[render_count] = OBJ_INDEX(objp); @@ -1896,7 +1896,7 @@ void render_one_model_nohtl(object *objp) { if ((OBJ_INDEX(objp) == cur_object_index) && !Bg_bitmap_dialog) Fred_outline = FRED_COLOUR_WHITE; - else if ((objp->flags & OF_MARKED) && !Bg_bitmap_dialog) // is it a marked object? + else if ((objp->flags[Object::Object_Flags::Marked]) && !Bg_bitmap_dialog) // is it a marked object? Fred_outline = FRED_COLOUR_YELLOW; else if ((objp->type == OBJ_SHIP) && Show_outlines) { @@ -2009,7 +2009,7 @@ void render_waypoints(void) { if (!(g3_project_vertex(&v) & PF_OVERFLOW)) { if (cur_waypoint_list == &(*ii) && cur_waypoint == &(*jj)) gr_set_color(255, 255, 255); - else if (Objects[jj->get_objnum()].flags & OF_MARKED) + else if (Objects[jj->get_objnum()].flags[Object::Object_Flags::Marked]) gr_set_color(160, 255, 0); else gr_set_color(160, 96, 0); @@ -2046,7 +2046,7 @@ int select_object(int cx, int cy) { if (Briefing_dialog) { best = Briefing_dialog->check_mouse_hit(cx, cy); if (best >= 0) { - if (Selection_lock && !(Objects[best].flags & OF_MARKED)) { + if (Selection_lock && !(Objects[best].flags[Object::Object_Flags::Marked])) { return -1; } return best; @@ -2084,7 +2084,7 @@ int select_object(int cx, int cy) { } if (best >= 0) { - if (Selection_lock && !(Objects[best].flags & OF_MARKED)) { + if (Selection_lock && !(Objects[best].flags[Object::Object_Flags::Marked])) { return -1; } return best; @@ -2106,7 +2106,7 @@ int select_object(int cx, int cy) { ptr = GET_NEXT(ptr); } - if (Selection_lock && !(Objects[best].flags & OF_MARKED)) { + if (Selection_lock && !(Objects[best].flags[Object::Object_Flags::Marked])) { return -1; } @@ -2136,7 +2136,7 @@ void verticalize_controlled() { case 1: // Control the current object's location and orientation objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { - if (objp->flags & OF_MARKED) + if (objp->flags[Object::Object_Flags::Marked]) verticalize_object(&objp->orient); objp = GET_NEXT(objp); @@ -2144,7 +2144,7 @@ void verticalize_controlled() { objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { - if (objp->flags & OF_MARKED) { + if (objp->flags[Object::Object_Flags::Marked]) { object_moved(objp); count++; } diff --git a/fred2/fredview.cpp b/fred2/fredview.cpp index 1a867fcf4b..285d7c558c 100644 --- a/fred2/fredview.cpp +++ b/fred2/fredview.cpp @@ -741,7 +741,7 @@ int drag_objects() objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { Assert(objp->type != OBJ_NONE); - if (objp->flags & OF_MARKED) { + if (objp->flags[Object::Object_Flags::Marked]) { if ((objp->type == OBJ_SHIP) || (objp->type == OBJ_START)) { z = Ships[objp->instance].wingnum; if (!flag) @@ -771,7 +771,7 @@ int drag_objects() objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { ptr = GET_NEXT(objp); - if (objp->flags & OF_TEMP_MARKED) + if (objp->flags [Object::Object_Flags::Temp_marked]) delete_object(objp); objp = ptr; @@ -785,8 +785,8 @@ int drag_objects() objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { - if (objp->flags & OF_TEMP_MARKED) { - objp->flags &= ~OF_TEMP_MARKED; + if (objp->flags [Object::Object_Flags::Temp_marked]) { + objp->flags.remove(Object::Object_Flags::Temp_marked); mark_object(OBJ_INDEX(objp)); } @@ -860,7 +860,7 @@ int drag_objects() objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { Assert(objp->type != OBJ_NONE); - if (objp->flags & OF_MARKED) { + if (objp->flags[Object::Object_Flags::Marked]) { vm_vec_add(&objp->pos, &objp->pos, &movement_vector); if (objp->type == OBJ_WAYPOINT) { waypoint *wpt = find_waypoint_with_instance(objp->instance); @@ -874,7 +874,7 @@ int drag_objects() objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { - if (objp->flags & OF_MARKED) + if (objp->flags[Object::Object_Flags::Marked]) object_moved(objp); objp = GET_NEXT(objp); @@ -900,7 +900,7 @@ void drag_rotate_save_backup() objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { Assert(objp->type != OBJ_NONE); - if (objp->flags & OF_MARKED) { + if (objp->flags[Object::Object_Flags::Marked]) { rotation_backup[OBJ_INDEX(objp)].pos = objp->pos; rotation_backup[OBJ_INDEX(objp)].orient = objp->orient; } @@ -971,7 +971,7 @@ int drag_rotate_objects() objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { Assert(objp->type != OBJ_NONE); - if ((objp->flags & OF_MARKED) && (cur_object_index != OBJ_INDEX(objp) )) { + if ((objp->flags[Object::Object_Flags::Marked]) && (cur_object_index != OBJ_INDEX(objp) )) { if (Group_rotate) { matrix rot_trans; vec3d tmpv1, tmpv2; @@ -1013,7 +1013,7 @@ int drag_rotate_objects() objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { - if (objp->flags & OF_MARKED) + if (objp->flags[Object::Object_Flags::Marked]) object_moved(objp); objp = GET_NEXT(objp); @@ -1051,7 +1051,7 @@ void cancel_drag() objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { Assert(objp->type != OBJ_NONE); - if (objp->flags & OF_MARKED) + if (objp->flags[Object::Object_Flags::Marked]) vm_vec_add(&objp->pos, &objp->pos, &movement_vector); objp = GET_NEXT(objp); @@ -1064,7 +1064,7 @@ void cancel_drag() objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { Assert(objp->type != OBJ_NONE); - if (objp->flags & OF_MARKED) { + if (objp->flags[Object::Object_Flags::Marked]) { int obj_index = OBJ_INDEX(objp); if(!IS_VEC_NULL(&rotation_backup[obj_index].orient.vec.rvec) && @@ -1137,12 +1137,12 @@ void CFREDView::OnLButtonDown(UINT nFlags, CPoint point) Cur_bitmap = on_object; Bg_bitmap_dialog -> update_data(); - } else if ((nFlags & MK_SHIFT) || (on_object == -1) || !(Objects[on_object].flags & OF_MARKED)) { + } else if ((nFlags & MK_SHIFT) || (on_object == -1) || !(Objects[on_object].flags[Object::Object_Flags::Marked])) { if (!(nFlags & MK_SHIFT)) unmark_all(); if (on_object != -1) { - if (Objects[on_object].flags & OF_MARKED) + if (Objects[on_object].flags[Object::Object_Flags::Marked]) unmark_object(on_object); else mark_object(on_object); @@ -1272,7 +1272,7 @@ void CFREDView::OnLButtonUp(UINT nFlags, CPoint point) if (MessageBox(msg, "Query", MB_YESNO) == IDYES) { objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { - if (objp->flags & OF_MARKED) { + if (objp->flags[Object::Object_Flags::Marked]) { if (Wings[Duped_wing].wave_count >= MAX_SHIPS_PER_WING) { MessageBox("Max ships per wing limit reached"); break; @@ -1472,7 +1472,7 @@ void select_objects() ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { valid = 1; - if (ptr->flags & OF_HIDDEN) + if (ptr->flags[Object::Object_Flags::Hidden]) valid = 0; Assert(ptr->type != OBJ_NONE); @@ -1504,7 +1504,7 @@ void select_objects() y = (int) v.screen.xyw.y; if (x >= marking_box.x1 && x <= marking_box.x2 && y >= marking_box.y1 && y <= marking_box.y2) { - if (ptr->flags & OF_MARKED) + if (ptr->flags[Object::Object_Flags::Marked]) unmark_object(OBJ_INDEX(ptr)); else mark_object(OBJ_INDEX(ptr)); @@ -1520,7 +1520,7 @@ void select_objects() if (icon_mode) { ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - if ((ptr->flags & OF_MARKED) && (ptr->type != OBJ_POINT)) + if ((ptr->flags[Object::Object_Flags::Marked]) && (ptr->type != OBJ_POINT)) unmark_object(OBJ_INDEX(ptr)); ptr = GET_NEXT(ptr); @@ -2273,7 +2273,7 @@ void view_universe(int just_marked) ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - if (!just_marked || (ptr->flags & OF_MARKED)) { + if (!just_marked || (ptr->flags[Object::Object_Flags::Marked])) { center = ptr->pos; if (center.xyz.x < p1.xyz.x) p1.xyz.x = center.xyz.x; @@ -2295,7 +2295,7 @@ void view_universe(int just_marked) vm_vec_avg(¢er, &p1, &p2); ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - if (!just_marked || (ptr->flags & OF_MARKED)) { + if (!just_marked || (ptr->flags[Object::Object_Flags::Marked])) { dist = vm_vec_dist_squared(¢er, &ptr->pos); if (dist > largest) largest = dist; @@ -2314,7 +2314,7 @@ void view_universe(int just_marked) ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - if (!just_marked || (ptr->flags & OF_MARKED)) { + if (!just_marked || (ptr->flags[Object::Object_Flags::Marked])) { g3_rotate_vertex(&v, &ptr->pos); Assert(!(v.codes & CC_BEHIND)); if (g3_project_vertex(&v) & PF_OVERFLOW) @@ -2386,8 +2386,8 @@ void CFREDView::OnFormWing() object *ptr = GET_FIRST(&obj_used_list); bool found = false; while (ptr != END_OF_LIST(&obj_used_list)) { - if (( (ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START) ) && (ptr->flags & OF_MARKED)) { - if(Ships[ptr->instance].flags & SF_REINFORCEMENT) { + if (( (ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START) ) && (ptr->flags[Object::Object_Flags::Marked])) { + if(Ships[ptr->instance].flags[Ship::Ship_Flags::Reinforcement]) { found = true; break; } @@ -2401,7 +2401,7 @@ void CFREDView::OnFormWing() if(ok == IDOK) { ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - if (( (ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START) ) && (ptr->flags & OF_MARKED)) { + if (( (ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START) ) && (ptr->flags[Object::Object_Flags::Marked])) { set_reinforcement(Ships[ptr->instance].ship_name, 0); } @@ -2424,7 +2424,7 @@ void CFREDView::OnUpdateFormWing(CCmdUI* pCmdUI) if (query_valid_object()) { ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - if (ptr->flags & OF_MARKED) { + if (ptr->flags[Object::Object_Flags::Marked]) { if (ptr->type == OBJ_SHIP) { int ship_type = ship_query_general_type(ptr->instance); @@ -2467,7 +2467,7 @@ int query_single_wing_marked() // if (Ships[Objects[obj].instance].wingnum != cur_wing) // return 0; Assert(Ships[Objects[obj].instance].wingnum == cur_wing); - if (!(Objects[obj].flags & OF_MARKED)) // ensure all ships in wing.are marked + if (!(Objects[obj].flags[Object::Object_Flags::Marked])) // ensure all ships in wing.are marked return 0; } @@ -2648,7 +2648,7 @@ int CFREDView::global_error_check() if (ptr->type == OBJ_START) { t++; - if (!(Ship_info[z].flags & SIF_PLAYER_SHIP)) { + if (!(Ship_info[z].flags[Ship::Info_Flags::Player_ship])) { ptr->type = OBJ_SHIP; Player_starts--; t--; @@ -2729,13 +2729,13 @@ int CFREDView::global_error_check() } } - if ( (Ships[i].flags & SF_KILL_BEFORE_MISSION) && (Ships[i].hotkey >= 0) ){ + if ( (Ships[i].flags[Ship::Ship_Flags::Kill_before_mission]) && (Ships[i].hotkey >= 0) ){ if (error("Ship flagged as \"destroy before mission start\" has a hotkey assignment")){ return 1; } } - if ( (Ships[i].flags & SF_KILL_BEFORE_MISSION) && (ptr->type == OBJ_START) ){ + if ( (Ships[i].flags[Ship::Ship_Flags::Kill_before_mission]) && (ptr->type == OBJ_START) ){ if (error("Player start flagged as \"destroy before mission start\"")){ return 1; } @@ -4140,8 +4140,8 @@ void CFREDView::OnHideObjects() ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - if (ptr->flags & OF_MARKED) { - ptr->flags |= OF_HIDDEN; + if (ptr->flags[Object::Object_Flags::Marked]) { + ptr->flags.set(Object::Object_Flags::Hidden); unmark_object(OBJ_INDEX(ptr)); } @@ -4155,7 +4155,7 @@ void CFREDView::OnShowHiddenObjects() ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - ptr->flags &= ~OF_HIDDEN; + ptr->flags.remove(Object::Object_Flags::Hidden); ptr = GET_NEXT(ptr); } @@ -4293,7 +4293,7 @@ void CFREDView::OnSetGroup(UINT nID) objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { - if (objp->flags & OF_MARKED) { + if (objp->flags[Object::Object_Flags::Marked]) { if (objp->type == OBJ_SHIP) { Ships[objp->instance].group |= n; @@ -4427,7 +4427,7 @@ void CFREDView::OnNextObj() ptr = GET_FIRST(&obj_used_list); if (Marked > 1) { // cycle through marked list - while (!(ptr->flags & OF_MARKED)) + while (!(ptr->flags[Object::Object_Flags::Marked])) { ptr = GET_NEXT(ptr); if (ptr == END_OF_LIST(&obj_used_list)) @@ -4491,7 +4491,7 @@ void CFREDView::OnPrevObj() i = n - 1; if (Marked > 1) { // cycle through marked list - while (!(Objects[i].flags & OF_MARKED)) + while (!(Objects[i].flags[Object::Object_Flags::Marked])) { i--; if (i < 0) diff --git a/fred2/ignoreordersdlg.cpp b/fred2/ignoreordersdlg.cpp index c3285cae06..37bf9108d5 100644 --- a/fred2/ignoreordersdlg.cpp +++ b/fred2/ignoreordersdlg.cpp @@ -89,7 +89,7 @@ BOOL ignore_orders_dlg::OnInitDialog() // the first marked ship since they'd better all be the same anyway!!! default_orders = 0; for ( objp = GET_FIRST(&obj_used_list); objp != END_OF_LIST(&obj_used_list); objp = GET_NEXT(objp) ) { - if (((objp->type == OBJ_SHIP) || (objp->type == OBJ_START)) && (objp->flags & OF_MARKED)) { + if (((objp->type == OBJ_SHIP) || (objp->type == OBJ_START)) && (objp->flags[Object::Object_Flags::Marked])) { int these_orders; these_orders = ship_get_default_orders_accepted( &Ship_info[Ships[objp->instance].ship_info_index] ); @@ -158,7 +158,7 @@ BOOL ignore_orders_dlg::OnInitDialog() first_time = 1; for ( objp = GET_FIRST(&obj_used_list); objp != END_OF_LIST(&obj_used_list); objp = GET_NEXT(objp) ) { - if (((objp->type == OBJ_START) || (objp->type == OBJ_SHIP)) && (objp->flags & OF_MARKED)) { + if (((objp->type == OBJ_START) || (objp->type == OBJ_SHIP)) && (objp->flags[Object::Object_Flags::Marked])) { // get the orders for this ship. If a state is not set orders_accepted = Ships[objp->instance].orders_accepted; @@ -212,7 +212,7 @@ void ignore_orders_dlg::OnOK() Ships[m_ship].orders_accepted = orders_accepted; } else { for ( objp = GET_FIRST(&obj_used_list); objp != END_OF_LIST(&obj_used_list); objp = GET_NEXT(objp) ) { - if (((objp->type == OBJ_SHIP) || (objp->type == OBJ_START)) && (objp->flags & OF_MARKED)) { + if (((objp->type == OBJ_SHIP) || (objp->type == OBJ_START)) && (objp->flags[Object::Object_Flags::Marked])) { Ships[objp->instance].orders_accepted = 0; for ( i = 0; i < m_num_checks_active; i++ ) { int box_value; diff --git a/fred2/initialships.cpp b/fred2/initialships.cpp index 9446cfc982..b36f11a3aa 100644 --- a/fred2/initialships.cpp +++ b/fred2/initialships.cpp @@ -55,29 +55,30 @@ END_MESSAGE_MAP() BOOL InitialShips::OnInitDialog() { - int i; - + int i; CDialog::OnInitDialog(); m_list_count = 0; // change the window text, get the index into the array, and check the box for either the ships // or weapons if ( m_initial_items == INITIAL_SHIPS ) { - for ( auto it = Ship_info.cbegin(); it != Ship_info.cend(); ++it ) { - if ( it->flags & SIF_PLAYER_SHIP ) { - i = std::distance(Ship_info.cbegin(), it); - m_initial_list.AddString( it->name ); - if ( Campaign.ships_allowed[i] ) { - m_initial_list.SetCheck(m_list_count, 1); - } else if ( (strlen(Campaign.filename) == 0) && strstr(it->name, "Myrmidon") ) { //-V805 - m_initial_list.SetCheck(m_list_count, 1); - } else { - m_initial_list.SetCheck(m_list_count, 0); - } - m_initial_list.SetItemData(m_list_count, i); - m_list_count++; - } - } + for (auto it = Ship_info.cbegin(); it != Ship_info.cend(); ++it) { + if (it->flags[Ship::Info_Flags::Player_ship]) { + i = std::distance(Ship_info.cbegin(), it); + m_initial_list.AddString(it->name); + if (Campaign.ships_allowed[i]) { + m_initial_list.SetCheck(m_list_count, 1); + } + else if ((strlen(Campaign.filename) == 0) && strstr(it->name, "Myrmidon")) { //-V805 + m_initial_list.SetCheck(m_list_count, 1); + } + else { + m_initial_list.SetCheck(m_list_count, 0); + } + m_initial_list.SetItemData(m_list_count, i); + m_list_count++; + } + } // set the titale of the window SetWindowText("Initial Ships Allowed"); @@ -87,17 +88,17 @@ BOOL InitialShips::OnInitDialog() int allowed_weapons[MAX_WEAPON_TYPES]; memset( allowed_weapons, 0, sizeof(allowed_weapons) ); - for (auto it = Ship_info.cbegin(); it != Ship_info.cend(); ++it) { - if ( it->flags & SIF_PLAYER_SHIP ) { - for ( i = 0; i < MAX_WEAPON_TYPES; i++ ) { - if ( it->allowed_weapons[i] ) - allowed_weapons[i] = 1; - } - } - } + for (auto it = Ship_info.cbegin(); it != Ship_info.cend(); ++it) { + if (it->flags[Ship::Info_Flags::Player_ship]) { + for (i = 0; i < MAX_WEAPON_TYPES; i++) { + if (it->allowed_weapons[i]) + allowed_weapons[i] = 1; + } + } + } // now add the weapons to the list - for (i = 0; i < MAX_WEAPON_TYPES; i++ ) { + for (int i = 0; i < MAX_WEAPON_TYPES; i++ ) { if ( allowed_weapons[i] ) { m_initial_list.AddString( Weapon_info[i].name ); int add_weapon = 0; diff --git a/fred2/initialstatus.cpp b/fred2/initialstatus.cpp index d5cdc4c44b..838018cb7e 100644 --- a/fred2/initialstatus.cpp +++ b/fred2/initialstatus.cpp @@ -180,28 +180,28 @@ BOOL initial_status::OnInitDialog() m_velocity = (int) Objects[cur_object_index].phys_info.speed; m_shields = (int) Objects[cur_object_index].shield_quadrant[0]; m_hull = (int) Objects[cur_object_index].hull_strength; - if (Objects[cur_object_index].flags & OF_NO_SHIELDS) + if (Objects[cur_object_index].flags[Object::Object_Flags::No_shields]) m_has_shields = 0; else m_has_shields = 1; - if (Ships[m_ship].flags2 & SF2_FORCE_SHIELDS_ON) + if (Ships[m_ship].flags[Ship::Ship_Flags::Force_shields_on]) m_force_shields = 1; else m_force_shields = 0; - if (Ships[m_ship].flags2 & SF2_SHIP_LOCKED) + if (Ships[m_ship].flags[Ship::Ship_Flags::Ship_locked]) m_ship_locked = 1; else m_ship_locked = 0; - if (Ships[m_ship].flags2 & SF2_WEAPONS_LOCKED) + if (Ships[m_ship].flags[Ship::Ship_Flags::Weapons_locked]) m_weapons_locked = 1; else m_weapons_locked = 0; // Lock primaries - if (Ships[m_ship].flags2 & SF2_PRIMARIES_LOCKED) { + if (Ships[m_ship].flags[Ship::Ship_Flags::Primaries_locked]) { m_primaries_locked = 1; } else { @@ -209,7 +209,7 @@ BOOL initial_status::OnInitDialog() } //Lock secondaries - if (Ships[m_ship].flags2 & SF2_SECONDARIES_LOCKED) { + if (Ships[m_ship].flags[Ship::Ship_Flags::Secondaries_locked]) { m_secondaries_locked = 1; } else { @@ -217,14 +217,14 @@ BOOL initial_status::OnInitDialog() } //Lock turrets - if (Ships[m_ship].flags2 & SF2_LOCK_ALL_TURRETS_INITIALLY) { + if (Ships[m_ship].flags[Ship::Ship_Flags::Lock_all_turrets_initially]) { m_turrets_locked = 1; } else { m_turrets_locked = 0; } - if (Ships[m_ship].flags2 & SF2_AFTERBURNER_LOCKED) { + if (Ships[m_ship].flags[Ship::Ship_Flags::Afterburner_locked]) { m_afterburner_locked = 1; } else { @@ -236,14 +236,14 @@ BOOL initial_status::OnInitDialog() if (m_multi_edit) { objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { - if (((objp->type == OBJ_SHIP) || (objp->type == OBJ_START)) && (objp->flags & OF_MARKED)) { + if (((objp->type == OBJ_SHIP) || (objp->type == OBJ_START)) && (objp->flags[Object::Object_Flags::Marked])) { if (objp->phys_info.speed != m_velocity) vflag = 1; if ((int) objp->shield_quadrant[0] != m_shields) sflag = 1; if ((int) objp->hull_strength != m_hull) hflag = 1; - if (objp->flags & OF_NO_SHIELDS) { + if (objp->flags[Object::Object_Flags::No_shields]) { if (m_has_shields) m_has_shields = 2; @@ -254,7 +254,7 @@ BOOL initial_status::OnInitDialog() Assert((objp->type == OBJ_SHIP) || (objp->type == OBJ_START)); - if (Ships[get_ship_from_obj(objp)].flags2 & SF2_FORCE_SHIELDS_ON) { + if (Ships[get_ship_from_obj(objp)].flags[Ship::Ship_Flags::Force_shields_on]) { if (!m_force_shields) m_force_shields = 2; @@ -263,7 +263,7 @@ BOOL initial_status::OnInitDialog() m_force_shields = 2; } - if (Ships[get_ship_from_obj(objp)].flags2 & SF2_SHIP_LOCKED) { + if (Ships[get_ship_from_obj(objp)].flags[Ship::Ship_Flags::Ship_locked]) { if (!m_ship_locked) m_ship_locked = 2; @@ -272,7 +272,7 @@ BOOL initial_status::OnInitDialog() m_ship_locked = 2; } - if (Ships[get_ship_from_obj(objp)].flags2 & SF2_WEAPONS_LOCKED) { + if (Ships[get_ship_from_obj(objp)].flags[Ship::Ship_Flags::Weapons_locked]) { if (!m_weapons_locked) m_weapons_locked = 2; @@ -281,7 +281,7 @@ BOOL initial_status::OnInitDialog() m_weapons_locked = 2; } - if (Ships[get_ship_from_obj(objp)].flags2 & SF2_PRIMARIES_LOCKED){ + if (Ships[get_ship_from_obj(objp)].flags[Ship::Ship_Flags::Primaries_locked]){ if (!m_primaries_locked) m_primaries_locked = 2; } @@ -290,7 +290,7 @@ BOOL initial_status::OnInitDialog() m_primaries_locked = 2; } - if (Ships[get_ship_from_obj(objp)].flags2 & SF2_SECONDARIES_LOCKED){ + if (Ships[get_ship_from_obj(objp)].flags[Ship::Ship_Flags::Secondaries_locked]){ if (!m_secondaries_locked) m_secondaries_locked = 2; } @@ -299,7 +299,7 @@ BOOL initial_status::OnInitDialog() m_secondaries_locked = 2; } - if (Ships[get_ship_from_obj(objp)].flags2 & SF2_LOCK_ALL_TURRETS_INITIALLY){ + if (Ships[get_ship_from_obj(objp)].flags[Ship::Ship_Flags::Lock_all_turrets_initially]){ if (!m_turrets_locked) m_turrets_locked = 2; } @@ -308,7 +308,7 @@ BOOL initial_status::OnInitDialog() m_turrets_locked = 2; } - if (Ships[get_ship_from_obj(objp)].flags2 & SF2_AFTERBURNER_LOCKED){ + if (Ships[get_ship_from_obj(objp)].flags[Ship::Ship_Flags::Afterburner_locked]){ if (!m_afterburner_locked) m_afterburner_locked = 2; } @@ -428,7 +428,7 @@ void initial_status::OnOK() if (m_multi_edit) { objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { - if (((objp->type == OBJ_SHIP) || (objp->type == OBJ_START)) && (objp->flags & OF_MARKED)) { + if (((objp->type == OBJ_SHIP) || (objp->type == OBJ_START)) && (objp->flags[Object::Object_Flags::Marked])) { if (vflag) MODIFY(objp->phys_info.speed, (float) m_velocity); @@ -438,55 +438,17 @@ void initial_status::OnOK() if (hflag) MODIFY(objp->hull_strength, (float) m_hull); - if (m_has_shields == 1) - objp->flags &= ~OF_NO_SHIELDS; - else if (!m_has_shields) - objp->flags |= OF_NO_SHIELDS; - - if (m_force_shields == 1) { - Ships[get_ship_from_obj(objp)].flags2 |= SF2_FORCE_SHIELDS_ON; - } - else if (!m_force_shields) { - Ships[get_ship_from_obj(objp)].flags2 &= ~SF2_FORCE_SHIELDS_ON; - } - - if (m_ship_locked == 1) - Ships[get_ship_from_obj(objp)].flags2 |= SF2_SHIP_LOCKED; - else if (!m_ship_locked) - Ships[get_ship_from_obj(objp)].flags2 &= ~SF2_SHIP_LOCKED; - - if (m_weapons_locked == 1) - Ships[get_ship_from_obj(objp)].flags2 |= SF2_WEAPONS_LOCKED; - else if (!m_weapons_locked) - Ships[get_ship_from_obj(objp)].flags2 &= ~SF2_WEAPONS_LOCKED; + objp->flags.set(Object::Object_Flags::No_shields, m_has_shields == 0); - if (m_primaries_locked == 1) { - Ships[get_ship_from_obj(objp)].flags2 |= SF2_PRIMARIES_LOCKED; - } - else if (!m_primaries_locked) { - Ships[get_ship_from_obj(objp)].flags2 &= ~SF2_PRIMARIES_LOCKED; - } - - if (m_secondaries_locked == 1) { - Ships[get_ship_from_obj(objp)].flags2 |= SF2_SECONDARIES_LOCKED; - } - else if (!m_secondaries_locked) { - Ships[get_ship_from_obj(objp)].flags2 &= ~SF2_SECONDARIES_LOCKED; - } - - if (m_turrets_locked == 1) { - Ships[get_ship_from_obj(objp)].flags2 |= SF2_LOCK_ALL_TURRETS_INITIALLY; - } - else if (!m_turrets_locked) { - Ships[get_ship_from_obj(objp)].flags2 &= ~SF2_LOCK_ALL_TURRETS_INITIALLY; - } + auto shipp = &Ships[get_ship_from_obj(objp)]; - if (m_afterburner_locked == 1) { - Ships[get_ship_from_obj(objp)].flags2 |= SF2_AFTERBURNER_LOCKED; - } - else if (!m_afterburner_locked) { - Ships[get_ship_from_obj(objp)].flags2 &= ~SF2_AFTERBURNER_LOCKED; - } + shipp->flags.set(Ship::Ship_Flags::Force_shields_on, m_force_shields == 1); + shipp->flags.set(Ship::Ship_Flags::Ship_locked, m_ship_locked == 1); + shipp->flags.set(Ship::Ship_Flags::Weapons_locked, m_weapons_locked == 1); + shipp->flags.set(Ship::Ship_Flags::Primaries_locked, m_primaries_locked == 1); + shipp->flags.set(Ship::Ship_Flags::Secondaries_locked, m_secondaries_locked == 1); + shipp->flags.set(Ship::Ship_Flags::Lock_all_turrets_initially, m_turrets_locked == 1); + shipp->flags.set(Ship::Ship_Flags::Afterburner_locked, m_afterburner_locked == 1); } objp = GET_NEXT(objp); @@ -496,45 +458,16 @@ void initial_status::OnOK() MODIFY(Objects[cur_object_index].phys_info.speed, (float) m_velocity); MODIFY(Objects[cur_object_index].shield_quadrant[0], (float) m_shields); MODIFY(Objects[cur_object_index].hull_strength, (float) m_hull); - if (m_has_shields) - Objects[cur_object_index].flags &= ~OF_NO_SHIELDS; - else - Objects[cur_object_index].flags |= OF_NO_SHIELDS; - if (m_force_shields == 1) - Ships[m_ship].flags2 |= SF2_FORCE_SHIELDS_ON; - else if (!m_force_shields) - Ships[m_ship].flags2 &= ~SF2_FORCE_SHIELDS_ON; + Objects[cur_object_index].flags.set(Object::Object_Flags::No_shields, m_has_shields != 0); - if (m_ship_locked == 1) - Ships[m_ship].flags2 |= SF2_SHIP_LOCKED; - else if (!m_ship_locked) - Ships[m_ship].flags2 &= ~SF2_SHIP_LOCKED; - - if (m_weapons_locked == 1) - Ships[m_ship].flags2 |= SF2_WEAPONS_LOCKED; - else if (!m_weapons_locked) - Ships[m_ship].flags2 &= ~SF2_WEAPONS_LOCKED; - - if (m_primaries_locked == 1) - Ships[m_ship].flags2 |= SF2_PRIMARIES_LOCKED; - else if (!m_primaries_locked) - Ships[m_ship].flags2 &= ~SF2_PRIMARIES_LOCKED; - - if (m_secondaries_locked == 1) - Ships[m_ship].flags2 |= SF2_SECONDARIES_LOCKED; - else if (!m_secondaries_locked) - Ships[m_ship].flags2 &= ~SF2_SECONDARIES_LOCKED; - - if (m_turrets_locked == 1) - Ships[m_ship].flags2 |= SF2_LOCK_ALL_TURRETS_INITIALLY; - else if (!m_turrets_locked) - Ships[m_ship].flags2 &= ~SF2_LOCK_ALL_TURRETS_INITIALLY; - - if (m_afterburner_locked == 1) - Ships[m_ship].flags2 |= SF2_AFTERBURNER_LOCKED; - else if (!m_afterburner_locked) - Ships[m_ship].flags2 &= ~SF2_AFTERBURNER_LOCKED; + Ships[m_ship].flags.set(Ship::Ship_Flags::Force_shields_on, m_force_shields == 1); + Ships[m_ship].flags.set(Ship::Ship_Flags::Ship_locked, m_ship_locked == 1); + Ships[m_ship].flags.set(Ship::Ship_Flags::Weapons_locked, m_weapons_locked == 1); + Ships[m_ship].flags.set(Ship::Ship_Flags::Primaries_locked, m_primaries_locked == 1); + Ships[m_ship].flags.set(Ship::Ship_Flags::Secondaries_locked, m_secondaries_locked == 1); + Ships[m_ship].flags.set(Ship::Ship_Flags::Lock_all_turrets_initially, m_turrets_locked == 1); + Ships[m_ship].flags.set(Ship::Ship_Flags::Afterburner_locked, m_afterburner_locked == 1); } if (m_team_color_setting.IsWindowEnabled() && m_team_color_setting.GetCurSel() > 0) @@ -629,8 +562,8 @@ void initial_status::change_subsys() ship_subsys *ptr; // Goober5000 - ship_has_scannable_subsystems = (Ship_info[Ships[m_ship].ship_info_index].flags & SIF_HUGE_SHIP); - if (Ships[m_ship].flags2 & SF2_TOGGLE_SUBSYSTEM_SCANNING) + ship_has_scannable_subsystems = Ship_info[Ships[m_ship].ship_info_index].is_huge_ship(); + if (Ships[m_ship].flags[Ship::Ship_Flags::Toggle_subsystem_scanning]) ship_has_scannable_subsystems = !ship_has_scannable_subsystems; if (cur_subsys != LB_ERR) { @@ -995,8 +928,8 @@ void initial_status::dock(object *objp, int dockpoint, object *other_objp, int o dock_evaluate_all_docked_objects(objp, &dfi, initial_status_mark_dock_leader_helper); // if no leader, mark me - if (dfi.maintained_variables.int_value == 0) - Ships[objp->instance].flags |= SF_DOCK_LEADER; + if (dfi.maintained_variables.int_value == 0) + Ships[objp->instance].flags.set(Ship::Ship_Flags::Dock_leader); } void initial_status::undock(object *objp1, object *objp2) @@ -1032,12 +965,12 @@ void initial_status::undock(object *objp1, object *objp2) } // if this ship is no longer docked, ensure its dock leader flag is clear - if (!object_is_docked(&Objects[Ships[ship_num].objnum])) - Ships[ship_num].flags &= ~SF_DOCK_LEADER; + if (!object_is_docked(&Objects[Ships[ship_num].objnum])) + Ships[ship_num].flags.remove(Ship::Ship_Flags::Dock_leader); // same for the other ship - if (!object_is_docked(&Objects[Ships[other_ship_num].objnum])) - Ships[other_ship_num].flags &= ~SF_DOCK_LEADER; + if (!object_is_docked(&Objects[Ships[other_ship_num].objnum])) + Ships[other_ship_num].flags.remove(Ship::Ship_Flags::Dock_leader); Ship_editor_dialog.initialize_data(1); } @@ -1136,12 +1069,12 @@ void initial_status_mark_dock_leader_helper(object *objp, dock_function_info *in } // otherwise, unmark the existing leader and set his arrival cue to false - leader_shipp->flags &= ~SF_DOCK_LEADER; + leader_shipp->flags.remove(Ship::Ship_Flags::Dock_leader); reset_arrival_to_false(SHIP_INDEX(leader_shipp), true); } // mark and save me as the leader - shipp->flags |= SF_DOCK_LEADER; + shipp->flags.set(Ship::Ship_Flags::Dock_leader); infop->maintained_variables.objp_value = objp; } } @@ -1149,7 +1082,7 @@ void initial_status_mark_dock_leader_helper(object *objp, dock_function_info *in // self-explanatory, really void initial_status_unmark_dock_handled_flag(object *objp, dock_function_info *infop) { - objp->flags &= ~OF_DOCKED_ALREADY_HANDLED; + objp->flags.remove(Object::Object_Flags::Docked_already_handled); } void initial_status::OnPrimariesLocked() diff --git a/fred2/mainfrm.cpp b/fred2/mainfrm.cpp index 4f633b1640..5cfe2508ba 100644 --- a/fred2/mainfrm.cpp +++ b/fred2/mainfrm.cpp @@ -115,15 +115,15 @@ void CMainFrame::init_tools() { return; } - for (auto it = Ship_info.cbegin(); it != Ship_info.cend(); ++it) { - // don't add the pirate ship - if (it->flags & SIF_NO_FRED) { - m_new_ship_type_combo_box.AddString(""); - continue; - } + for (auto it = Ship_info.cbegin(); it != Ship_info.cend(); ++it) { + // don't add the pirate ship + if (it->flags[Ship::Info_Flags::No_fred]) { + m_new_ship_type_combo_box.AddString(""); + continue; + } - m_new_ship_type_combo_box.AddString(it->name); - } + m_new_ship_type_combo_box.AddString(it->name); + } // m_new_ship_type_combo_box.AddString("Player Start"); m_new_ship_type_combo_box.AddString("Jump Node"); diff --git a/fred2/management.cpp b/fred2/management.cpp index 989c1462eb..cfd873092c 100644 --- a/fred2/management.cpp +++ b/fred2/management.cpp @@ -514,14 +514,14 @@ int create_ship(matrix *orient, vec3d *pos, int ship_type) // default stuff according to species and IFF shipp->team = Species_info[Ship_info[shipp->ship_info_index].species].default_iff; - resolve_parse_flags(&Objects[obj], Iff_info[shipp->team].default_parse_flags, Iff_info[shipp->team].default_parse_flags2); + resolve_parse_flags(&Objects[obj], Iff_info[shipp->team].default_parse_flags); // default shield setting shipp->special_shield = -1; z1 = Shield_sys_teams[shipp->team]; z2 = Shield_sys_types[ship_type]; - if (((z1 == 1) && z2) || (z2 == 1)) - Objects[obj].flags |= OF_NO_SHIELDS; + if (((z1 == 1) && z2) || (z2 == 1)) + Objects[obj].flags.set(Object::Object_Flags::No_shields); // set orders according to whether the ship is on the player ship's team { @@ -543,7 +543,7 @@ int create_ship(matrix *orient, vec3d *pos, int ship_type) { // if this ship is not a small ship, then make the orders be the default orders without // the depart item - if (!(sip->flags & SIF_SMALL_SHIP)) + if (!(sip->is_small_ship())) { shipp->orders_accepted = ship_get_default_orders_accepted( sip ); shipp->orders_accepted &= ~DEPART_ITEM; @@ -671,7 +671,7 @@ int dup_object(object *objp) Objects[obj].pos = objp->pos; Objects[obj].orient = objp->orient; - Objects[obj].flags |= OF_TEMP_MARKED; + Objects[obj].flags.set(Object::Object_Flags::Temp_marked); return obj; } @@ -705,7 +705,7 @@ int create_object(vec3d *pos, int waypoint_instance) CJumpNode jnp(pos); obj = jnp.GetSCPObjectNumber(); Jump_nodes.push_back(std::move(jnp)); - } else if(Ship_info[cur_model_index].flags & SIF_NO_FRED){ + } else if(Ship_info[cur_model_index].flags[Ship::Info_Flags::No_fred]){ obj = -1; } else { // creating a ship obj = create_ship(NULL, pos, cur_model_index); @@ -870,7 +870,7 @@ void clear_mission() for (i=0; i(Ship_info.size()); j++ ) { - if (Ship_info[j].flags & SIF_DEFAULT_PLAYER_SHIP) { + if (Ship_info[j].flags[Ship::Info_Flags::Default_player_ship]) { Team_data[i].ship_list[count] = j; strcpy_s(Team_data[i].ship_list_variables[count], ""); Team_data[i].ship_count[count] = 5; @@ -950,7 +950,7 @@ void clear_mission() strcpy_s(The_mission.command_sender, DEFAULT_COMMAND); // Goober5000: reset ALL mission flags, not just nebula! - The_mission.flags = 0; + The_mission.flags.reset(); The_mission.support_ships.max_support_ships = -1; // negative means infinite The_mission.support_ships.max_hull_repair_val = 0.0f; The_mission.support_ships.max_subsys_repair_val = 100.0f; @@ -1374,7 +1374,7 @@ void delete_marked() ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { next = GET_NEXT(ptr); - if (ptr->flags & OF_MARKED) + if (ptr->flags[Object::Object_Flags::Marked]) if (delete_object(ptr) == 2) // user went to a reference, so don't get in the way. break; @@ -1474,8 +1474,8 @@ int query_object_in_wing(int obj) void mark_object(int obj) { Assert(query_valid_object(obj)); - if (!(Objects[obj].flags & OF_MARKED)) { - Objects[obj].flags |= OF_MARKED; // set as marked + if (!(Objects[obj].flags[Object::Object_Flags::Marked])) { + Objects[obj].flags.set(Object::Object_Flags::Marked); // set as marked Marked++; Update_window = 1; if (cur_object_index == -1){ @@ -1489,8 +1489,8 @@ void mark_object(int obj) void unmark_object(int obj) { Assert(query_valid_object(obj)); - if (Objects[obj].flags & OF_MARKED) { - Objects[obj].flags &= ~OF_MARKED; + if (Objects[obj].flags[Object::Object_Flags::Marked]) { + Objects[obj].flags.remove(Object::Object_Flags::Marked); Marked--; Update_window = 1; if (obj == cur_object_index) { // need to find a new index @@ -1498,7 +1498,7 @@ void unmark_object(int obj) ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - if (ptr->flags & OF_MARKED) { + if (ptr->flags[Object::Object_Flags::Marked]) { set_cur_object_index(OBJ_INDEX(ptr)); // found one return; } @@ -1520,7 +1520,7 @@ void unmark_all() if (Marked) { for (i=0; itype == OBJ_SHIP) || ((ptr->type == OBJ_START) && (filter & SHIP_FILTER_PLAYERS))) { z = 1; if (filter & SHIP_FILTER_FLYABLE) { - if (Ship_info[Ships[get_ship_from_obj(ptr)].ship_info_index].flags & SIF_NOT_FLYABLE){ + if (!Ship_info[Ships[get_ship_from_obj(ptr)].ship_info_index].is_flyable()){ z = 0; } } @@ -1705,7 +1705,7 @@ int set_reinforcement(char *name, int state) // clear the ship/wing flag for this reinforcement index = ship_name_lookup(name); if ( index != -1 ){ - Ships[index].flags &= ~SF_REINFORCEMENT; + Ships[index].flags.remove(Ship::Ship_Flags::Reinforcement); } else { index = wing_name_lookup(name); if ( index != -1 ){ @@ -1732,7 +1732,7 @@ int set_reinforcement(char *name, int state) // set the reinforcement flag on the ship or wing index = ship_name_lookup(name); if ( index != -1 ){ - Ships[index].flags |= SF_REINFORCEMENT; + Ships[index].flags.set(Ship::Ship_Flags::Reinforcement); } else { index = wing_name_lookup(name); if ( index != -1 ){ @@ -1752,7 +1752,7 @@ int set_reinforcement(char *name, int state) // set the reinforcement flag on the ship or wing index = ship_name_lookup(name); if ( index != -1 ){ - Ships[index].flags |= SF_REINFORCEMENT; + Ships[index].flags.set(Ship::Ship_Flags::Reinforcement); } else { index = wing_name_lookup(name); if ( index != -1 ){ @@ -1855,8 +1855,8 @@ void correct_marking() ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - if (ptr->flags & OF_MARKED) { - if (ptr->flags & OF_HIDDEN) + if (ptr->flags[Object::Object_Flags::Marked]) { + if (ptr->flags[Object::Object_Flags::Hidden]) unmark_object(OBJ_INDEX(ptr)); else switch (ptr->type) { @@ -2318,8 +2318,8 @@ void object_moved(object *objp) if ((objp->type == OBJ_SHIP) || (objp->type == OBJ_START)) // do we have a ship? { // reset the already-handled flag (inefficient, but it's FRED, so who cares) - for (int i = 0; i < MAX_OBJECTS; i++) - Objects[i].flags &= ~OF_DOCKED_ALREADY_HANDLED; + for (int i = 0; i < MAX_OBJECTS; i++) + Objects[i].flags.remove(Object::Object_Flags::Docked_already_handled); // move all docked objects docked to me dock_move_docked_objects(objp); @@ -2337,7 +2337,7 @@ int query_whole_wing_marked(int wing) ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - if (ptr->flags & OF_MARKED) + if (ptr->flags[Object::Object_Flags::Marked]) if ((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) if (Ships[get_ship_from_obj(ptr)].wingnum == wing) count++; @@ -2448,14 +2448,14 @@ void management_add_ships_to_combo( CComboBox *box, int flags ) // either add all ships to the list, or only add ships with docking bays. if ( flags & SHIPS_2_COMBO_ALL_SHIPS ) { for ( objp = GET_FIRST(&obj_used_list); objp != END_OF_LIST(&obj_used_list); objp = GET_NEXT(objp) ) { - if ( ((objp->type == OBJ_SHIP) || (objp->type == OBJ_START)) && !(objp->flags & OF_MARKED) ) { + if ( ((objp->type == OBJ_SHIP) || (objp->type == OBJ_START)) && !(objp->flags[Object::Object_Flags::Marked]) ) { id = box->AddString(Ships[get_ship_from_obj(objp)].ship_name); box->SetItemData(id, get_ship_from_obj(objp)); } } } else if ( flags & SHIPS_2_COMBO_DOCKING_BAY_ONLY ) { for ( objp = GET_FIRST(&obj_used_list); objp != END_OF_LIST(&obj_used_list); objp = GET_NEXT(objp) ) { - if ( ((objp->type == OBJ_SHIP) || (objp->type == OBJ_START)) && !(objp->flags & OF_MARKED) ) { + if ( ((objp->type == OBJ_SHIP) || (objp->type == OBJ_START)) && !(objp->flags[Object::Object_Flags::Marked]) ) { polymodel *pm; // determine if this ship has a docking bay diff --git a/fred2/missionnotesdlg.cpp b/fred2/missionnotesdlg.cpp index 6f77ea8662..dc98895ed0 100644 --- a/fred2/missionnotesdlg.cpp +++ b/fred2/missionnotesdlg.cpp @@ -185,7 +185,8 @@ int CMissionNotesDlg::query_modified() void CMissionNotesDlg::OnOK() { - int new_m_type, flags, is_multi = 0, is_training = 0, is_single = 0; + int new_m_type, is_multi = 0, is_training = 0, is_single = 0; + flagset flags; UpdateData(); is_single = (((CButton *) GetDlgItem(IDC_SINGLE))->GetCheck() == 1); @@ -231,62 +232,28 @@ void CMissionNotesDlg::OnOK() flags = The_mission.flags; // set flags for red alert - if ( m_red_alert ) { - The_mission.flags |= MISSION_FLAG_RED_ALERT; - } else { - The_mission.flags &= ~MISSION_FLAG_RED_ALERT; - } + The_mission.flags.set(Mission::Mission_Flags::Red_alert, m_red_alert != 0); // set flags for scramble - if ( m_scramble ) { - The_mission.flags |= MISSION_FLAG_SCRAMBLE; - } else { - The_mission.flags &= ~MISSION_FLAG_SCRAMBLE; - } + The_mission.flags.set(Mission::Mission_Flags::Scramble, m_scramble != 0); // set flags for dock trees - if ( m_daisy_chained_docking ) { - The_mission.flags |= MISSION_FLAG_ALLOW_DOCK_TREES; - } else { - The_mission.flags &= ~MISSION_FLAG_ALLOW_DOCK_TREES; - } + The_mission.flags.set(Mission::Mission_Flags::Allow_dock_trees, m_daisy_chained_docking != 0); // set the flags for no promotion - if ( m_no_promotion ) { - The_mission.flags |= MISSION_FLAG_NO_PROMOTION; - } else { - The_mission.flags &= ~MISSION_FLAG_NO_PROMOTION; - } + The_mission.flags.set(Mission::Mission_Flags::No_promotion, m_no_promotion != 0); // set flags for no builtin messages - if ( m_no_builtin_msgs ) { - The_mission.flags |= MISSION_FLAG_NO_BUILTIN_MSGS; - } else { - The_mission.flags &= ~MISSION_FLAG_NO_BUILTIN_MSGS; - } + The_mission.flags.set(Mission::Mission_Flags::No_builtin_msgs, m_no_builtin_msgs != 0); // set flags for no builtin command messages - if ( m_no_builtin_command_msgs ) - { - The_mission.flags |= MISSION_FLAG_NO_BUILTIN_COMMAND; - } else - { - The_mission.flags &= ~MISSION_FLAG_NO_BUILTIN_COMMAND; - } + The_mission.flags.set(Mission::Mission_Flags::No_builtin_command, m_no_builtin_command_msgs != 0); // set no traitor flags - if ( m_no_traitor ) { - The_mission.flags |= MISSION_FLAG_NO_TRAITOR; - } else { - The_mission.flags &= ~MISSION_FLAG_NO_TRAITOR; - } + The_mission.flags.set(Mission::Mission_Flags::No_traitor, m_no_traitor != 0); //set ship trail flags - if ( m_toggle_trails ) { - The_mission.flags |= MISSION_FLAG_TOGGLE_SHIP_TRAILS; - } else { - The_mission.flags &= ~MISSION_FLAG_TOGGLE_SHIP_TRAILS; - } + The_mission.flags.set(Mission::Mission_Flags::Toggle_ship_trails, m_toggle_trails != 0); // set ship trail threshold if ( m_contrail_threshold_flag ) { @@ -296,73 +263,34 @@ void CMissionNotesDlg::OnOK() } //set support ship repairing flags - if ( m_support_repairs_hull ) { - The_mission.flags |= MISSION_FLAG_SUPPORT_REPAIRS_HULL; - } else { - The_mission.flags &= ~MISSION_FLAG_SUPPORT_REPAIRS_HULL; - } + The_mission.flags.set(Mission::Mission_Flags::Support_repairs_hull, m_support_repairs_hull != 0); // set default beam free - if ( m_beam_free_all_by_default ) { - The_mission.flags |= MISSION_FLAG_BEAM_FREE_ALL_BY_DEFAULT; - } else { - The_mission.flags &= ~MISSION_FLAG_BEAM_FREE_ALL_BY_DEFAULT; - } + The_mission.flags.set(Mission::Mission_Flags::Beam_free_all_by_default, m_beam_free_all_by_default != 0); // set player AI by default - if ( m_player_start_using_ai ) { - The_mission.flags |= MISSION_FLAG_PLAYER_START_AI; - } else { - The_mission.flags &= ~MISSION_FLAG_PLAYER_START_AI; - } + The_mission.flags.set(Mission::Mission_Flags::Player_start_ai, m_player_start_using_ai != 0); // set briefing - if ( m_no_briefing ) { - The_mission.flags |= MISSION_FLAG_NO_BRIEFING; - } else { - The_mission.flags &= ~MISSION_FLAG_NO_BRIEFING; - } + The_mission.flags.set(Mission::Mission_Flags::No_briefing, m_no_briefing != 0); // set debriefing - if ( m_no_debriefing ) { - The_mission.flags |= MISSION_FLAG_TOGGLE_DEBRIEFING; - } else { - The_mission.flags &= ~MISSION_FLAG_TOGGLE_DEBRIEFING; - } + The_mission.flags.set(Mission::Mission_Flags::Toggle_debriefing, m_no_debriefing != 0); // set autopilot cinematics - if ( m_autpilot_cinematics ) { - The_mission.flags |= MISSION_FLAG_USE_AP_CINEMATICS; - } else { - The_mission.flags &= ~MISSION_FLAG_USE_AP_CINEMATICS; - } + The_mission.flags.set(Mission::Mission_Flags::Use_ap_cinematics, m_autpilot_cinematics != 0); // 2D mission - if ( m_2d_mission ) { - The_mission.flags |= MISSION_FLAG_2D_MISSION; - } else { - The_mission.flags &= ~MISSION_FLAG_2D_MISSION; - } + The_mission.flags.set(Mission::Mission_Flags::Mission_2d, m_2d_mission != 0); // set autopilot disabled - if ( m_no_autpilot ) { - The_mission.flags |= MISSION_FLAG_DEACTIVATE_AP; - } else { - The_mission.flags &= ~MISSION_FLAG_DEACTIVATE_AP; - } + The_mission.flags.set(Mission::Mission_Flags::Deactivate_ap, m_no_autpilot != 0); // always show mission goals - if ( m_always_show_goals ) { - The_mission.flags |= MISSION_FLAG_ALWAYS_SHOW_GOALS; - } else { - The_mission.flags &= ~MISSION_FLAG_ALWAYS_SHOW_GOALS; - } + The_mission.flags.set(Mission::Mission_Flags::Always_show_goals, m_always_show_goals != 0); - if ( m_end_to_mainhall ) { - The_mission.flags |= MISSION_FLAG_END_TO_MAINHALL; - } else { - The_mission.flags &= ~MISSION_FLAG_END_TO_MAINHALL; - } + // End to mainhall + The_mission.flags.set(Mission::Mission_Flags::End_to_mainhall, m_end_to_mainhall != 0); if ( flags != The_mission.flags ){ set_modified(); @@ -436,25 +364,25 @@ BOOL CMissionNotesDlg::OnInitDialog() convert_multiline_string(m_mission_notes, The_mission.notes); convert_multiline_string(m_mission_desc_orig, The_mission.mission_desc); convert_multiline_string(m_mission_desc, The_mission.mission_desc); - m_red_alert = (The_mission.flags & MISSION_FLAG_RED_ALERT) ? 1 : 0; - m_scramble = (The_mission.flags & MISSION_FLAG_SCRAMBLE) ? 1 : 0; + m_red_alert = (The_mission.flags[Mission::Mission_Flags::Red_alert]) ? 1 : 0; + m_scramble = (The_mission.flags[Mission::Mission_Flags::Scramble]) ? 1 : 0; m_full_war = Mission_all_attack; - m_daisy_chained_docking = (The_mission.flags & MISSION_FLAG_ALLOW_DOCK_TREES) ? 1 : 0; + m_daisy_chained_docking = (The_mission.flags[Mission::Mission_Flags::Allow_dock_trees]) ? 1 : 0; m_disallow_support = (The_mission.support_ships.max_support_ships == 0) ? 1 : 0; - m_no_promotion = (The_mission.flags & MISSION_FLAG_NO_PROMOTION) ? 1 : 0; - m_no_builtin_msgs = (The_mission.flags & MISSION_FLAG_NO_BUILTIN_MSGS) ? 1 : 0; - m_no_builtin_command_msgs = (The_mission.flags & MISSION_FLAG_NO_BUILTIN_COMMAND) ? 1 : 0; - m_no_traitor = (The_mission.flags & MISSION_FLAG_NO_TRAITOR) ? 1 : 0; - m_toggle_trails = (The_mission.flags & MISSION_FLAG_TOGGLE_SHIP_TRAILS) ? 1 : 0; - m_support_repairs_hull = (The_mission.flags &MISSION_FLAG_SUPPORT_REPAIRS_HULL) ? 1 : 0; - m_beam_free_all_by_default = (The_mission.flags & MISSION_FLAG_BEAM_FREE_ALL_BY_DEFAULT) ? 1 : 0; - m_player_start_using_ai = (The_mission.flags & MISSION_FLAG_PLAYER_START_AI) ? 1 : 0; - m_no_briefing = (The_mission.flags & MISSION_FLAG_NO_BRIEFING) ? 1 : 0; - m_no_debriefing = (The_mission.flags & MISSION_FLAG_TOGGLE_DEBRIEFING) ? 1 : 0; - m_autpilot_cinematics = (The_mission.flags & MISSION_FLAG_USE_AP_CINEMATICS) ? 1 : 0; - m_2d_mission = (The_mission.flags & MISSION_FLAG_2D_MISSION) ? 1 : 0; - m_no_autpilot = (The_mission.flags & MISSION_FLAG_DEACTIVATE_AP) ? 1 : 0; - m_always_show_goals = (The_mission.flags & MISSION_FLAG_ALWAYS_SHOW_GOALS) ? 1 : 0; + m_no_promotion = (The_mission.flags[Mission::Mission_Flags::No_promotion]) ? 1 : 0; + m_no_builtin_msgs = (The_mission.flags[Mission::Mission_Flags::No_builtin_msgs]) ? 1 : 0; + m_no_builtin_command_msgs = (The_mission.flags[Mission::Mission_Flags::No_builtin_command]) ? 1 : 0; + m_no_traitor = (The_mission.flags[Mission::Mission_Flags::No_traitor]) ? 1 : 0; + m_toggle_trails = (The_mission.flags[Mission::Mission_Flags::Toggle_ship_trails]) ? 1 : 0; + m_support_repairs_hull = (The_mission.flags[Mission::Mission_Flags::Support_repairs_hull]) ? 1 : 0; + m_beam_free_all_by_default = (The_mission.flags[Mission::Mission_Flags::Beam_free_all_by_default]) ? 1 : 0; + m_player_start_using_ai = (The_mission.flags[Mission::Mission_Flags::Player_start_ai]) ? 1 : 0; + m_no_briefing = (The_mission.flags[Mission::Mission_Flags::No_briefing]) ? 1 : 0; + m_no_debriefing = (The_mission.flags[Mission::Mission_Flags::Toggle_debriefing]) ? 1 : 0; + m_autpilot_cinematics = (The_mission.flags[Mission::Mission_Flags::Use_ap_cinematics]) ? 1 : 0; + m_2d_mission = (The_mission.flags[Mission::Mission_Flags::Mission_2d]) ? 1 : 0; + m_no_autpilot = (The_mission.flags[Mission::Mission_Flags::Deactivate_ap]) ? 1 : 0; + m_always_show_goals = (The_mission.flags[Mission::Mission_Flags::Always_show_goals]) ? 1 : 0; m_loading_640=_T(The_mission.loading_screen[GR_640]); m_loading_1024=_T(The_mission.loading_screen[GR_1024]); @@ -493,7 +421,7 @@ BOOL CMissionNotesDlg::OnInitDialog() box->AddString(DEFAULT_COMMAND); for (i=0; i= 0) - if (Ship_info[Ships[i].ship_info_index].flags & SIF_HUGE_SHIP) + if (Ship_info[Ships[i].ship_info_index].is_huge_ship()) box->AddString(Ships[i].ship_name); } diff --git a/fred2/missionsave.cpp b/fred2/missionsave.cpp index 9c2bfbfc07..4d61b17d21 100644 --- a/fred2/missionsave.cpp +++ b/fred2/missionsave.cpp @@ -759,7 +759,7 @@ int CFred_mission_save::save_bitmaps() { fout(" %d", The_mission.ambient_light_level); // neb2 stuff - if (The_mission.flags & MISSION_FLAG_FULLNEB) { + if (The_mission.flags[Mission::Mission_Flags::Fullneb]) { required_string_fred("+Neb2:"); parse_comments(); fout(" %s\n", Neb2_texture_name); @@ -2200,7 +2200,7 @@ int CFred_mission_save::save_mission_info() { fout(" %d", The_mission.flags); // maybe write out Nebula intensity - if (The_mission.flags & MISSION_FLAG_FULLNEB) { + if (The_mission.flags[Mission::Mission_Flags::Fullneb]) { Assert(Neb2_awacs > 0.0f); fout("\n+NebAwacs: %f\n", Neb2_awacs); @@ -2256,7 +2256,7 @@ int CFred_mission_save::save_mission_info() { else fout("\n+Red Alert:"); - fout(" %d", (The_mission.flags & MISSION_FLAG_RED_ALERT) ? 1 : 0); + fout(" %d", (The_mission.flags[Mission::Mission_Flags::Fullneb]) ? 1 : 0); } if (Format_fs2_open == FSO_FORMAT_RETAIL) //-V581 @@ -2266,7 +2266,7 @@ int CFred_mission_save::save_mission_info() { else fout("\n+Scramble:"); - fout(" %d", (The_mission.flags & MISSION_FLAG_SCRAMBLE) ? 1 : 0); + fout(" %d", (The_mission.flags[Mission::Mission_Flags::Scramble]) ? 1 : 0); } if (optional_string_fred("+Disallow Support:")) { @@ -2881,60 +2881,60 @@ int CFred_mission_save::save_objects() { } else fout("\n+Flags: ("); - if (shipp->flags & SF_CARGO_REVEALED) + if (shipp->flags[Ship::Ship_Flags::Cargo_revealed]) fout(" \"cargo-known\""); - if (shipp->flags & SF_IGNORE_COUNT) + if (shipp->flags[Ship::Ship_Flags::Ignore_count]) fout(" \"ignore-count\""); - if (objp->flags & OF_PROTECTED) + if (objp->flags[Object::Object_Flags::Protected]) fout(" \"protect-ship\""); - if (shipp->flags & SF_REINFORCEMENT) + if (shipp->flags[Ship::Ship_Flags::Reinforcement]) fout(" \"reinforcement\""); - if (objp->flags & OF_NO_SHIELDS) + if (objp->flags[Object::Object_Flags::No_shields]) fout(" \"no-shields\""); - if (shipp->flags & SF_ESCORT) + if (shipp->flags[Ship::Ship_Flags::Escort]) fout(" \"escort\""); if (objp->type == OBJ_START) fout(" \"player-start\""); - if (shipp->flags & SF_NO_ARRIVAL_MUSIC) + if (shipp->flags[Ship::Ship_Flags::No_arrival_music]) fout(" \"no-arrival-music\""); - if (shipp->flags & SF_NO_ARRIVAL_WARP) + if (shipp->flags[Ship::Ship_Flags::No_arrival_warp]) fout(" \"no-arrival-warp\""); - if (shipp->flags & SF_NO_DEPARTURE_WARP) + if (shipp->flags[Ship::Ship_Flags::No_departure_warp]) fout(" \"no-departure-warp\""); - if (Objects[shipp->objnum].flags & OF_INVULNERABLE) + if (Objects[shipp->objnum].flags[Object::Object_Flags::Invulnerable]) fout(" \"invulnerable\""); - if (shipp->flags & SF_HIDDEN_FROM_SENSORS) + if (shipp->flags[Ship::Ship_Flags::Hidden_from_sensors]) fout(" \"hidden-from-sensors\""); - if (shipp->flags & SF_SCANNABLE) + if (shipp->flags[Ship::Ship_Flags::Scannable]) fout(" \"scannable\""); if (Ai_info[shipp->ai_index].ai_flags & AIF_KAMIKAZE) fout(" \"kamikaze\""); if (Ai_info[shipp->ai_index].ai_flags & AIF_NO_DYNAMIC) fout(" \"no-dynamic\""); - if (shipp->flags & SF_RED_ALERT_STORE_STATUS) + if (shipp->flags[Ship::Ship_Flags::Red_alert_store_status]) fout(" \"red-alert-carry\""); - if (objp->flags & OF_BEAM_PROTECTED) + if (objp->flags[Object::Object_Flags::Beam_protected]) fout(" \"beam-protect-ship\""); - if (objp->flags & OF_FLAK_PROTECTED) + if (objp->flags[Object::Object_Flags::Flak_protected]) fout(" \"flak-protect-ship\""); - if (objp->flags & OF_LASER_PROTECTED) + if (objp->flags[Object::Object_Flags::Laser_protected]) fout(" \"laser-protect-ship\""); - if (objp->flags & OF_MISSILE_PROTECTED) + if (objp->flags[Object::Object_Flags::Missile_protected]) fout(" \"missile-protect-ship\""); if (shipp->ship_guardian_threshold != 0) fout(" \"guardian\""); - if (objp->flags & OF_SPECIAL_WARPIN) + if (objp->flags[Object::Object_Flags::Special_warpin]) fout(" \"special-warp\""); - if (shipp->flags & SF_VAPORIZE) + if (shipp->flags[Ship::Ship_Flags::Vaporize]) fout(" \"vaporize\""); - if (shipp->flags2 & SF2_STEALTH) + if (shipp->flags[Ship::Ship_Flags::Stealth]) fout(" \"stealth\""); - if (shipp->flags2 & SF2_FRIENDLY_STEALTH_INVIS) + if (shipp->flags[Ship::Ship_Flags::Friendly_stealth_invis]) fout(" \"friendly-stealth-invisible\""); - if (shipp->flags2 & SF2_DONT_COLLIDE_INVIS) + if (shipp->flags[Ship::Ship_Flags::Dont_collide_invis]) fout(" \"don't-collide-invisible\""); //for compatibility reasons ship locked or weapons locked are saved as both locked in retail mode - if ((Format_fs2_open == FSO_FORMAT_RETAIL) && ((shipp->flags2 & SF2_SHIP_LOCKED) || (shipp->flags2 & SF2_WEAPONS_LOCKED))) + if ((Format_fs2_open == FSO_FORMAT_RETAIL) && ((shipp->flags[Ship::Ship_Flags::Ship_locked]) || (shipp->flags[Ship::Ship_Flags::Weapons_locked]))) fout(" \"locked\""); fout(" )"); @@ -2946,55 +2946,55 @@ int CFred_mission_save::save_objects() { } else fout("\n+Flags2: ("); - if (shipp->flags2 & SF2_PRIMITIVE_SENSORS) + if (shipp->flags[Ship::Ship_Flags::Primitive_sensors]) fout(" \"primitive-sensors\""); - if (shipp->flags2 & SF2_NO_SUBSPACE_DRIVE) + if (shipp->flags[Ship::Ship_Flags::No_subspace_drive]) fout(" \"no-subspace-drive\""); - if (shipp->flags2 & SF2_NAVPOINT_CARRY) + if (shipp->flags[Ship::Ship_Flags::Navpoint_carry]) fout(" \"nav-carry-status\""); - if (shipp->flags2 & SF2_AFFECTED_BY_GRAVITY) + if (shipp->flags[Ship::Ship_Flags::Affected_by_gravity]) fout(" \"affected-by-gravity\""); - if (shipp->flags2 & SF2_TOGGLE_SUBSYSTEM_SCANNING) + if (shipp->flags[Ship::Ship_Flags::Toggle_subsystem_scanning]) fout(" \"toggle-subsystem-scanning\""); - if (objp->flags & OF_TARGETABLE_AS_BOMB) + if (objp->flags[Object::Object_Flags::Targetable_as_bomb]) fout(" \"targetable-as-bomb\""); - if (shipp->flags2 & SF2_NO_BUILTIN_MESSAGES) + if (shipp->flags[Ship::Ship_Flags::No_builtin_messages]) fout(" \"no-builtin-messages\""); - if (shipp->flags2 & SF2_PRIMARIES_LOCKED) + if (shipp->flags[Ship::Ship_Flags::Primaries_locked]) fout(" \"primaries-locked\""); - if (shipp->flags2 & SF2_SECONDARIES_LOCKED) + if (shipp->flags[Ship::Ship_Flags::Secondaries_locked]) fout(" \"secondaries-locked\""); - if (shipp->flags2 & SF2_NO_DEATH_SCREAM) + if (shipp->flags[Ship::Ship_Flags::No_death_scream]) fout(" \"no-death-scream\""); - if (shipp->flags2 & SF2_ALWAYS_DEATH_SCREAM) + if (shipp->flags[Ship::Ship_Flags::Always_death_scream]) fout(" \"always-death-scream\""); - if (shipp->flags2 & SF2_NAVPOINT_NEEDSLINK) + if (shipp->flags[Ship::Ship_Flags::Navpoint_needslink]) fout(" \"nav-needslink\""); - if (shipp->flags2 & SF2_HIDE_SHIP_NAME) + if (shipp->flags[Ship::Ship_Flags::Hide_ship_name]) fout(" \"hide-ship-name\""); - if (shipp->flags2 & SF2_SET_CLASS_DYNAMICALLY) + if (shipp->flags[Ship::Ship_Flags::Set_class_dynamically]) fout(" \"set-class-dynamically\""); - if (shipp->flags2 & SF2_LOCK_ALL_TURRETS_INITIALLY) + if (shipp->flags[Ship::Ship_Flags::Lock_all_turrets_initially]) fout(" \"lock-all-turrets\""); - if (shipp->flags2 & SF2_AFTERBURNER_LOCKED) + if (shipp->flags[Ship::Ship_Flags::Afterburner_locked]) fout(" \"afterburners-locked\""); - if (shipp->flags2 & SF2_FORCE_SHIELDS_ON) + if (shipp->flags[Ship::Ship_Flags::Force_shields_on]) fout(" \"force-shields-on\""); - if (objp->flags & OF_IMMOBILE) + if (objp->flags[Object::Object_Flags::Immobile]) fout(" \"immobile\""); - if (shipp->flags2 & SF2_NO_ETS) + if (shipp->flags[Ship::Ship_Flags::No_ets]) fout(" \"no-ets\""); - if (shipp->flags2 & SF2_CLOAKED) + if (shipp->flags[Ship::Ship_Flags::Cloaked]) fout(" \"cloaked\""); - if (shipp->flags2 & SF2_SHIP_LOCKED) + if (shipp->flags[Ship::Ship_Flags::Ship_locked]) fout(" \"ship-locked\""); - if (shipp->flags2 & SF2_WEAPONS_LOCKED) + if (shipp->flags[Ship::Ship_Flags::Weapons_locked]) fout(" \"weapons-locked\""); - if (shipp->flags2 & SF2_SCRAMBLE_MESSAGES) + if (shipp->flags[Ship::Ship_Flags::Scramble_messages]) fout(" \"scramble-messages\""); - if (!(objp->flags & OF_COLLIDES)) + if (!(objp->flags[Object::Object_Flags::Collides])) fout(" \"no-collide\""); - if (shipp->flags2 & SF2_NO_DISABLED_SELF_DESTRUCT) + if (shipp->flags[Ship::Ship_Flags::No_disabled_self_destruct]) fout(" \"no-disabled-self-destruct\""); fout(" )"); } @@ -3002,7 +3002,7 @@ int CFred_mission_save::save_objects() { fout("\n+Respawn priority: %d", shipp->respawn_priority); // HA! Newline added by Goober5000 - if (shipp->flags & SF_ESCORT) { + if (shipp->flags[Ship::Ship_Flags::Escort]) { if (optional_string_fred("+Escort priority:", "$Name:")) { parse_comments(); } else { @@ -3174,7 +3174,7 @@ int CFred_mission_save::save_objects() { // save one-on-one groups as if they were retail if (dock_check_docked_one_on_one(&Objects[shipp->objnum])) { // retail format only saved information for non-leaders - if (!(shipp->flags & SF_DOCK_LEADER)) { + if (!(shipp->flags[Ship::Ship_Flags::Dock_leader])) { save_single_dock_instance(&Ships[i], Objects[shipp->objnum].dock_list); } } @@ -3189,7 +3189,7 @@ int CFred_mission_save::save_objects() { // check the ship flag about killing off the ship before a missino starts. Write out the appropriate // variable if necessary - if (shipp->flags & SF_KILL_BEFORE_MISSION) { + if (shipp->flags[Ship::Ship_Flags::Kill_before_mission]) { if (optional_string_fred("+Destroy At:", "$Name:")) parse_comments(); else @@ -3534,7 +3534,7 @@ int CFred_mission_save::save_reinforcements() { type = TYPE_ATTACK_PROTECT; for (j = 0; j < MAX_SHIPS; j++) if ((Ships[j].objnum != -1) && !stricmp(Ships[j].ship_name, Reinforcements[i].name)) { - if (Ship_info[Ships[j].ship_info_index].flags & SIF_SUPPORT) + if (Ship_info[Ships[j].ship_info_index].flags[Ship::Info_Flags::Support]) type = TYPE_REPAIR_REARM; break; } diff --git a/fred2/orienteditor.cpp b/fred2/orienteditor.cpp index 14cdb0b9f4..a4cd2d9761 100644 --- a/fred2/orienteditor.cpp +++ b/fred2/orienteditor.cpp @@ -184,7 +184,7 @@ void orient_editor::OnOK() ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - if (ptr->flags & OF_MARKED) { + if (ptr->flags[Object::Object_Flags::Marked]) { vm_vec_add2(&ptr->pos, &delta); update_object(ptr); } @@ -194,7 +194,7 @@ void orient_editor::OnOK() ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - if (ptr->flags & OF_MARKED) + if (ptr->flags[Object::Object_Flags::Marked]) object_moved(ptr); ptr = GET_NEXT(ptr); diff --git a/fred2/playerstarteditor.cpp b/fred2/playerstarteditor.cpp index 0bd2331c77..407f37dc20 100644 --- a/fred2/playerstarteditor.cpp +++ b/fred2/playerstarteditor.cpp @@ -283,22 +283,23 @@ void player_start_editor::reset_controls() // create a checklistbox for each "player" ship type m_ship_list.ResetContent(); ct = 0; - for (auto it = Ship_info.cbegin(); it != Ship_info.cend(); ++it) { - if (it->flags & SIF_PLAYER_SHIP) { - i = std::distance(Ship_info.cbegin(), it); - m_ship_list.AddString(it->name); - - // if the ship currently has pool entries or was set by a variable, check it - if((static_ship_pool[selected_team][i] > 0) || (static_ship_variable_pool[selected_team][i] != -1)) { - m_ship_list.SetCheck(ct, TRUE); - } else { - m_ship_list.SetCheck(ct, FALSE); - } + for (auto it = Ship_info.cbegin(); it != Ship_info.cend(); ++it) { + if (it->flags[Ship::Info_Flags::Player_ship]) { + i = std::distance(Ship_info.cbegin(), it); + m_ship_list.AddString(it->name); - // next - ct++; - } - } + // if the ship currently has pool entries or was set by a variable, check it + if ((static_ship_pool[selected_team][i] > 0) || (static_ship_variable_pool[selected_team][i] != -1)) { + m_ship_list.SetCheck(ct, TRUE); + } + else { + m_ship_list.SetCheck(ct, FALSE); + } + + // next + ct++; + } + } // create a checklistbox for each weapon ship type m_weapon_list.ResetContent(); diff --git a/fred2/setglobalshipflags.cpp b/fred2/setglobalshipflags.cpp index fcae3e8ad3..e800436f32 100644 --- a/fred2/setglobalshipflags.cpp +++ b/fred2/setglobalshipflags.cpp @@ -52,7 +52,7 @@ void SetGlobalShipFlags::OnNoShields() { if (Ships[i].objnum >= 0) { - Objects[Ships[i].objnum].flags |= OF_NO_SHIELDS; + Objects[Ships[i].objnum].flags.set(Object::Object_Flags::No_shields); } } } @@ -66,10 +66,7 @@ void SetGlobalShipFlags::OnNoSubspaceDrive() if (Ships[i].objnum >= 0) { // only for fighters and bombers - if (Ship_info[Ships[i].ship_info_index].flags & (SIF_FIGHTER | SIF_BOMBER)) - Ships[i].flags2 |= SF2_NO_SUBSPACE_DRIVE; - else - Ships[i].flags2 &= ~SF2_NO_SUBSPACE_DRIVE; + Ships[i].flags.set(Ship::Ship_Flags::No_subspace_drive, Ship_info[Ships[i].ship_info_index].is_fighter_bomber()); } } } @@ -83,10 +80,7 @@ void SetGlobalShipFlags::OnPrimitiveSensors() if (Ships[i].objnum >= 0) { // only for fighters and bombers - if (Ship_info[Ships[i].ship_info_index].flags & (SIF_FIGHTER | SIF_BOMBER)) - Ships[i].flags2 |= SF2_PRIMITIVE_SENSORS; - else - Ships[i].flags2 &= ~SF2_PRIMITIVE_SENSORS; + Ships[i].flags.set(Ship::Ship_Flags::Primitive_sensors, Ship_info[Ships[i].ship_info_index].is_fighter_bomber()); } } } @@ -100,10 +94,7 @@ void SetGlobalShipFlags::OnAffectedByGravity() if (Ships[i].objnum >= 0) { // only for fighters and bombers - if (Ship_info[Ships[i].ship_info_index].flags & (SIF_FIGHTER | SIF_BOMBER)) - Ships[i].flags2 |= SF2_AFFECTED_BY_GRAVITY; - else - Ships[i].flags2 &= ~SF2_AFFECTED_BY_GRAVITY; + Ships[i].flags.set(Ship::Ship_Flags::Affected_by_gravity, Ship_info[Ships[i].ship_info_index].is_fighter_bomber()); } } } diff --git a/fred2/sexp_tree.cpp b/fred2/sexp_tree.cpp index 1703289eb3..5285d1b5ba 100755 --- a/fred2/sexp_tree.cpp +++ b/fred2/sexp_tree.cpp @@ -4732,16 +4732,16 @@ sexp_list_item *sexp_tree::get_listing_opf_ship(int parent_node) } else if (op == OP_CAP_SUBSYS_CARGO_KNOWN_DELAY) { - if ( ((Ship_info[Ships[ptr->instance].ship_info_index].flags & SIF_HUGE_SHIP) && // big ship - !(Ships[ptr->instance].flags2 & SF2_TOGGLE_SUBSYSTEM_SCANNING) )|| // which is not flagged OR - ((!(Ship_info[Ships[ptr->instance].ship_info_index].flags & SIF_HUGE_SHIP)) && // small ship - (Ships[ptr->instance].flags2 & SF2_TOGGLE_SUBSYSTEM_SCANNING) ) ) { // which is flagged + if ( ((Ship_info[Ships[ptr->instance].ship_info_index].is_huge_ship()) && // big ship + !(Ships[ptr->instance].flags[Ship::Ship_Flags::Toggle_subsystem_scanning]) )|| // which is not flagged OR + ((!(Ship_info[Ships[ptr->instance].ship_info_index].is_huge_ship())) && // small ship + (Ships[ptr->instance].flags[Ship::Ship_Flags::Toggle_subsystem_scanning]) ) ) { // which is flagged head.add_data(Ships[ptr->instance].ship_name); } } else { - if ( !require_cap_ship || (Ship_info[Ships[ptr->instance].ship_info_index].flags & SIF_HUGE_SHIP) ) { + if ( !require_cap_ship || Ship_info[Ships[ptr->instance].ship_info_index].is_huge_ship() ) { head.add_data(Ships[ptr->instance].ship_name); } } @@ -5044,9 +5044,9 @@ sexp_list_item *sexp_tree::get_listing_opf_support_ship_class() head.add_data(""); - for (auto it = Ship_info.cbegin(); it != Ship_info.cend(); ++it) + for (auto it = Ship_info.cbegin(); it != Ship_info.cend(); ++it) { - if (it->flags & SIF_SUPPORT) + if (it->flags[Ship::Info_Flags::Support]) { head.add_data(it->name); } @@ -5328,7 +5328,7 @@ sexp_list_item *sexp_tree::get_listing_opf_who_from() ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { if ((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) - if (!(Ship_info[Ships[get_ship_from_obj(ptr)].ship_info_index].flags & SIF_NOT_FLYABLE)) + if (Ship_info[Ships[get_ship_from_obj(ptr)].ship_info_index].is_flyable()) head.add_data(Ships[ptr->instance].ship_name); ptr = GET_NEXT(ptr); diff --git a/fred2/shieldsysdlg.cpp b/fred2/shieldsysdlg.cpp index 5fd6d9f71f..827ea1479a 100644 --- a/fred2/shieldsysdlg.cpp +++ b/fred2/shieldsysdlg.cpp @@ -70,7 +70,7 @@ BOOL shield_sys_dlg::OnInitDialog() for (i=0; i= 0) { - z = (Objects[Ships[i].objnum].flags & OF_NO_SHIELDS) ? 1 : 0; + z = (Objects[Ships[i].objnum].flags[Object::Object_Flags::No_shields]) ? 1 : 0; if (!teams[Ships[i].team]) Shield_sys_teams[Ships[i].team] = z; else if (Shield_sys_teams[Ships[i].team] != z) @@ -116,9 +116,9 @@ void shield_sys_dlg::OnOK() z = 1; if (!z) - Objects[Ships[i].objnum].flags &= ~OF_NO_SHIELDS; + Objects[Ships[i].objnum].flags.remove(Object::Object_Flags::No_shields); else if (z == 1) - Objects[Ships[i].objnum].flags |= OF_NO_SHIELDS; + Objects[Ships[i].objnum].flags.set(Object::Object_Flags::No_shields); } CDialog::OnOK(); diff --git a/fred2/ship_select.cpp b/fred2/ship_select.cpp index 956df60c4f..1fb6e2d11c 100644 --- a/fred2/ship_select.cpp +++ b/fred2/ship_select.cpp @@ -135,7 +135,7 @@ void ship_select::OnSelchangeWingDisplayFilter() BOOL ship_select::OnInitDialog() { - int i, flags; + int i; object *ptr; CDialog::OnInitDialog(); @@ -143,13 +143,7 @@ BOOL ship_select::OnInitDialog() ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - flags = ptr->flags & ~OF_TEMP_MARKED; - if (flags & OF_MARKED) - flags |= OF_TEMP_MARKED; - else - flags &= ~OF_TEMP_MARKED; - - ptr->flags = flags; + ptr->flags.set(Object::Object_Flags::Temp_marked, ptr->flags[Object::Object_Flags::Marked]); ptr = GET_NEXT(ptr); } @@ -217,7 +211,7 @@ void ship_select::create_list() { m_ship_list.AddString(Ships[ptr->instance].ship_name); obj_index[list_size++] = ptr; - if (ptr->flags & OF_TEMP_MARKED) + if (ptr->flags[Object::Object_Flags::Temp_marked]) m_ship_list.SetSel(list_size - 1); } @@ -235,7 +229,7 @@ void ship_select::create_list() { m_ship_list.AddString(Ships[ptr->instance].ship_name); obj_index[list_size++] = ptr; - if (ptr->flags & OF_TEMP_MARKED) + if (ptr->flags[Object::Object_Flags::Temp_marked]) m_ship_list.SetSel(list_size - 1); } } @@ -257,7 +251,7 @@ void ship_select::create_list() sprintf(text, "%s:%d", wp_list->get_name(), waypoint_num + 1); m_ship_list.AddString(text); obj_index[list_size++] = ptr; - if (ptr->flags & OF_TEMP_MARKED) + if (ptr->flags[Object::Object_Flags::Temp_marked]) m_ship_list.SetSel(list_size - 1); } @@ -276,7 +270,7 @@ void ship_select::OnOK() ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - if (ptr->flags & OF_TEMP_MARKED) + if (ptr->flags[Object::Object_Flags::Temp_marked]) mark_object(OBJ_INDEX(ptr)); ptr = GET_NEXT(ptr); @@ -308,17 +302,14 @@ void ship_select::update_status(bool first_time) ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - ptr->flags &= ~OF_TEMP_MARKED; + ptr->flags.remove(Object::Object_Flags::Temp_marked); ptr = GET_NEXT(ptr); } for (i=0; iflags &= ~OF_TEMP_MARKED; - else - obj_index[i]->flags |= OF_TEMP_MARKED; + obj_index[i]->flags.set(Object::Object_Flags::Temp_marked, z >= 1); } if(!first_time) OnSelchangeShipList(); @@ -361,7 +352,7 @@ void ship_select::OnClear() ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - ptr->flags &= ~OF_TEMP_MARKED; + ptr->flags.remove(Object::Object_Flags::Temp_marked); ptr = GET_NEXT(ptr); } @@ -380,7 +371,7 @@ void ship_select::OnAll() for (i=0; iflags |= OF_TEMP_MARKED; + obj_index[i]->flags.set(Object::Object_Flags::Temp_marked); m_ship_list.SetSel(i); } @@ -399,11 +390,11 @@ void ship_select::OnInvert() z = m_ship_list.GetSel(i); if (z > 0) { - obj_index[i]->flags &= ~OF_TEMP_MARKED; + obj_index[i]->flags.remove(Object::Object_Flags::Temp_marked); m_ship_list.SetSel(i, FALSE); } else { - obj_index[i]->flags |= OF_TEMP_MARKED; + obj_index[i]->flags.set(Object::Object_Flags::Temp_marked); m_ship_list.SetSel(i); } } diff --git a/fred2/shipeditordlg.cpp b/fred2/shipeditordlg.cpp index 05ea03cb14..f224b2bcaa 100644 --- a/fred2/shipeditordlg.cpp +++ b/fred2/shipeditordlg.cpp @@ -417,7 +417,7 @@ void CShipEditorDlg::initialize_data(int full_update) enable = p_enable = 1; objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { - if ((objp->type == OBJ_SHIP) && (Ships[objp->instance].flags & SF_ESCORT)){ + if ((objp->type == OBJ_SHIP) && (Ships[objp->instance].flags[Ship::Ship_Flags::Escort])){ escort_count++; // get a total count of escort ships } @@ -425,7 +425,7 @@ void CShipEditorDlg::initialize_data(int full_update) pship_count++; // count all player starts in mission } - if (objp->flags & OF_MARKED) { + if (objp->flags[Object::Object_Flags::Marked]) { type = objp->type; if ((type == OBJ_START) && !mission_type){ // in multiplayer missions, starts act like ships type = OBJ_SHIP; @@ -444,7 +444,7 @@ void CShipEditorDlg::initialize_data(int full_update) } if (i >= 0){ - if (Ship_info[Ships[i].ship_info_index].flags & SIF_PLAYER_SHIP){ + if (Ship_info[Ships[i].ship_info_index].flags[Ship::Info_Flags::Player_ship]){ pvalid_count++; } } @@ -492,7 +492,7 @@ void CShipEditorDlg::initialize_data(int full_update) objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { if ((objp->type == OBJ_START) || (objp->type == OBJ_SHIP)) { - if (objp->flags & OF_MARKED) { + if (objp->flags[Object::Object_Flags::Marked]) { // do processing for both ships and players i = get_ship_from_obj(objp); if (base_player >= 0) { @@ -518,7 +518,7 @@ void CShipEditorDlg::initialize_data(int full_update) ship_orders = -1; } - if (Ships[i].flags & SF_ESCORT){ + if (Ships[i].flags[Ship::Ship_Flags::Escort]){ escort_count--; // remove marked escorts from count } @@ -600,8 +600,8 @@ void CShipEditorDlg::initialize_data(int full_update) } // set routine local varaiables for ship/object flags - no_arrival_warp = (Ships[i].flags & SF_NO_ARRIVAL_WARP) ? 1 : 0; - no_departure_warp = (Ships[i].flags & SF_NO_DEPARTURE_WARP) ? 1 : 0; + no_arrival_warp = (Ships[i].flags[Ship::Ship_Flags::No_arrival_warp]) ? 1 : 0; + no_departure_warp = (Ships[i].flags[Ship::Ship_Flags::No_departure_warp]) ? 1 : 0; base_ship = -1; if (!multi_edit) @@ -631,8 +631,8 @@ void CShipEditorDlg::initialize_data(int full_update) GetDlgItem(IDC_WING) -> SetWindowText(""); } - no_arrival_warp = tristate_set(Ships[i].flags & SF_NO_ARRIVAL_WARP, no_arrival_warp); - no_departure_warp = tristate_set(Ships[i].flags & SF_NO_DEPARTURE_WARP, no_departure_warp); + no_arrival_warp = tristate_set(Ships[i].flags[Ship::Ship_Flags::No_arrival_warp], no_arrival_warp); + no_departure_warp = tristate_set(Ships[i].flags[Ship::Ship_Flags::No_departure_warp], no_departure_warp); } } } @@ -693,7 +693,7 @@ void CShipEditorDlg::initialize_data(int full_update) m_player_ship.SetCheck(TRUE); objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { - if ((objp->type == OBJ_START) && (objp->flags & OF_MARKED)) { + if ((objp->type == OBJ_START) && (objp->flags[Object::Object_Flags::Marked])) { i = objp->instance; if (base_player >= 0) { m_ship_class = Ships[i].ship_info_index; @@ -914,7 +914,7 @@ void CShipEditorDlg::initialize_data(int full_update) GetDlgItem(IDC_AI_CLASS)->EnableWindow(enable); GetDlgItem(IDC_SHIP_CARGO1)->EnableWindow(enable); GetDlgItem(IDC_HOTKEY)->EnableWindow(enable); - if ((m_ship_class >= 0) && !(Ship_info[m_ship_class].flags & SIF_CARGO) && !(Ship_info[m_ship_class].flags & SIF_NO_SHIP_TYPE)) + if ((m_ship_class >= 0) && !(Ship_info[m_ship_class].flags[Ship::Info_Flags::Cargo]) && !(Ship_info[m_ship_class].flags[Ship::Info_Flags::No_ship_type])) GetDlgItem(IDC_GOALS)->EnableWindow(enable); else if (multi_edit) GetDlgItem(IDC_GOALS)->EnableWindow(enable); @@ -1029,7 +1029,7 @@ int CShipEditorDlg::update_data(int redraw) if (multi_edit) { // editing multiple ships (ships and/or players) ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - if (((ptr->type == OBJ_START) || (ptr->type == OBJ_SHIP)) && (ptr->flags & OF_MARKED)) + if (((ptr->type == OBJ_START) || (ptr->type == OBJ_SHIP)) && (ptr->flags[Object::Object_Flags::Marked])) update_ship(get_ship_from_obj(ptr)); ptr = GET_NEXT(ptr); @@ -1365,33 +1365,33 @@ int CShipEditorDlg::update_ship(int ship) switch( m_no_arrival_warp.GetCheck() ) { case 0: - if (Ships[ship].flags & SF_NO_ARRIVAL_WARP) + if (Ships[ship].flags[Ship::Ship_Flags::No_arrival_warp]) set_modified(); - Ships[ship].flags &= ~SF_NO_ARRIVAL_WARP; + Ships[ship].flags.remove(Ship::Ship_Flags::No_arrival_warp); break; case 1: - if (!(Ships[ship].flags & SF_NO_ARRIVAL_WARP)) + if (!(Ships[ship].flags[Ship::Ship_Flags::No_arrival_warp])) set_modified(); - Ships[ship].flags |= SF_NO_ARRIVAL_WARP; + Ships[ship].flags.set(Ship::Ship_Flags::No_arrival_warp); break; } switch( m_no_departure_warp.GetCheck() ) { case 0: - if (Ships[ship].flags & SF_NO_DEPARTURE_WARP) + if (Ships[ship].flags[Ship::Ship_Flags::No_departure_warp]) set_modified(); - Ships[ship].flags &= ~SF_NO_DEPARTURE_WARP; + Ships[ship].flags.remove(Ship::Ship_Flags::No_departure_warp); break; case 1: - if (!(Ships[ship].flags & SF_NO_DEPARTURE_WARP)) + if (!(Ships[ship].flags[Ship::Ship_Flags::No_departure_warp])) set_modified(); - Ships[ship].flags |= SF_NO_DEPARTURE_WARP; + Ships[ship].flags.set(Ship::Ship_Flags::No_departure_warp); break; } @@ -1559,7 +1559,7 @@ void CShipEditorDlg::OnSelchangeShipClass() UpdateData(TRUE); ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - if (((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) && (ptr->flags & OF_MARKED)) + if (((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) && (ptr->flags[Object::Object_Flags::Marked])) if (Ships[ptr->instance].ship_info_index != m_ship_class) { change_ship_type(ptr->instance, m_ship_class); set_modified(); @@ -1592,7 +1592,7 @@ void CShipEditorDlg::OnWeapons() if (multi_edit) { objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { - if (objp->flags & OF_MARKED) + if (objp->flags[Object::Object_Flags::Marked]) if ((objp->type == OBJ_SHIP) || (objp->type == OBJ_START)) { i = objp->instance; if (ship) { @@ -1638,7 +1638,7 @@ void CShipEditorDlg::OnShipReset() objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { - if (((objp->type == OBJ_SHIP) || ((objp->type == OBJ_START) && !mission_type)) && (objp->flags & OF_MARKED)) { + if (((objp->type == OBJ_SHIP) || ((objp->type == OBJ_START) && !mission_type)) && (objp->flags[Object::Object_Flags::Marked])) { ship = objp->instance; // reset ship goals @@ -2283,17 +2283,17 @@ void CShipEditorDlg::OnSetAsPlayerShip() { if ((objp->type == OBJ_SHIP) || (objp->type == OBJ_START)) { - if (objp->flags & OF_MARKED) // there should only be one selected ship + if (objp->flags[Object::Object_Flags::Marked]) // there should only be one selected ship { // set as player ship objp->type = OBJ_START; - objp->flags |= OF_PLAYER_SHIP; + objp->flags.set(Object::Object_Flags::Player_ship); } else { // set as regular ship objp->type = OBJ_SHIP; - objp->flags &= ~OF_PLAYER_SHIP; + objp->flags.remove(Object::Object_Flags::Player_ship); } } objp = GET_NEXT(objp); diff --git a/fred2/shipflagsdlg.cpp b/fred2/shipflagsdlg.cpp index c37284593e..f585d46a07 100644 --- a/fred2/shipflagsdlg.cpp +++ b/fred2/shipflagsdlg.cpp @@ -175,55 +175,55 @@ BOOL ship_flags_dlg::OnInitDialog() objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { if ((objp->type == OBJ_START) || (objp->type == OBJ_SHIP)) { - if (objp->flags & OF_MARKED) { + if (objp->flags[Object::Object_Flags::Marked]) { shipp = &Ships[objp->instance]; if (first) { first = 0; - scannable = (shipp->flags & SF_SCANNABLE) ? 1 : 0; - red_alert_carry = (shipp->flags & SF_RED_ALERT_STORE_STATUS) ? 1 : 0; - special_warpin = (objp->flags & OF_SPECIAL_WARPIN) ? 1 : 0; - protect_ship = (objp->flags & OF_PROTECTED) ? 1 : 0; - beam_protect_ship = (objp->flags & OF_BEAM_PROTECTED) ? 1 : 0; - flak_protect_ship = (objp->flags & OF_FLAK_PROTECTED) ? 1 : 0; - laser_protect_ship = (objp->flags & OF_LASER_PROTECTED) ? 1 : 0; - missile_protect_ship = (objp->flags & OF_MISSILE_PROTECTED) ? 1 : 0; - invulnerable = (objp->flags & OF_INVULNERABLE) ? 1 : 0; - targetable_as_bomb = (objp->flags & OF_TARGETABLE_AS_BOMB) ? 1 : 0; - immobile = (objp->flags & OF_IMMOBILE) ? 1 : 0; - hidden_from_sensors = (shipp->flags & SF_HIDDEN_FROM_SENSORS) ? 1 : 0; - primitive_sensors = (shipp->flags2 & SF2_PRIMITIVE_SENSORS) ? 1 : 0; - no_subspace_drive = (shipp->flags2 & SF2_NO_SUBSPACE_DRIVE) ? 1 : 0; - affected_by_gravity = (shipp->flags2 & SF2_AFFECTED_BY_GRAVITY) ? 1 : 0; - toggle_subsystem_scanning = (shipp->flags2 & SF2_TOGGLE_SUBSYSTEM_SCANNING) ? 1 : 0; - ignore_count = (shipp->flags & SF_IGNORE_COUNT) ? 1 : 0; - no_arrival_music = (shipp->flags & SF_NO_ARRIVAL_MUSIC) ? 1 : 0; - cargo_known = (shipp->flags & SF_CARGO_REVEALED) ? 1 : 0; + scannable = (shipp->flags[Ship::Ship_Flags::Scannable]) ? 1 : 0; + red_alert_carry = (shipp->flags[Ship::Ship_Flags::Red_alert_store_status]) ? 1 : 0; + special_warpin = (objp->flags[Object::Object_Flags::Special_warpin]) ? 1 : 0; + protect_ship = (objp->flags[Object::Object_Flags::Protected]) ? 1 : 0; + beam_protect_ship = (objp->flags[Object::Object_Flags::Beam_protected]) ? 1 : 0; + flak_protect_ship = (objp->flags[Object::Object_Flags::Flak_protected]) ? 1 : 0; + laser_protect_ship = (objp->flags[Object::Object_Flags::Laser_protected]) ? 1 : 0; + missile_protect_ship = (objp->flags[Object::Object_Flags::Missile_protected]) ? 1 : 0; + invulnerable = (objp->flags[Object::Object_Flags::Invulnerable]) ? 1 : 0; + targetable_as_bomb = (objp->flags[Object::Object_Flags::Targetable_as_bomb]) ? 1 : 0; + immobile = (objp->flags[Object::Object_Flags::Immobile]) ? 1 : 0; + hidden_from_sensors = (shipp->flags[Ship::Ship_Flags::Hidden_from_sensors]) ? 1 : 0; + primitive_sensors = (shipp->flags[Ship::Ship_Flags::Primitive_sensors]) ? 1 : 0; + no_subspace_drive = (shipp->flags[Ship::Ship_Flags::No_subspace_drive]) ? 1 : 0; + affected_by_gravity = (shipp->flags[Ship::Ship_Flags::Affected_by_gravity]) ? 1 : 0; + toggle_subsystem_scanning = (shipp->flags[Ship::Ship_Flags::Toggle_subsystem_scanning]) ? 1 : 0; + ignore_count = (shipp->flags[Ship::Ship_Flags::Ignore_count]) ? 1 : 0; + no_arrival_music = (shipp->flags[Ship::Ship_Flags::No_arrival_music]) ? 1 : 0; + cargo_known = (shipp->flags[Ship::Ship_Flags::Cargo_revealed]) ? 1 : 0; no_dynamic = (Ai_info[shipp->ai_index].ai_flags & AIF_NO_DYNAMIC) ? 1 : 0; - disable_messages = (shipp->flags2 & SF2_NO_BUILTIN_MESSAGES) ? 1 : 0; - set_class_dynamically = (shipp->flags2 & SF2_SET_CLASS_DYNAMICALLY) ? 1 : 0; - no_death_scream = (shipp->flags2 & SF2_NO_DEATH_SCREAM) ? 1 : 0; - always_death_scream = (shipp->flags2 & SF2_ALWAYS_DEATH_SCREAM) ? 1 : 0; + disable_messages = (shipp->flags[Ship::Ship_Flags::No_builtin_messages]) ? 1 : 0; + set_class_dynamically = (shipp->flags[Ship::Ship_Flags::Set_class_dynamically]) ? 1 : 0; + no_death_scream = (shipp->flags[Ship::Ship_Flags::No_death_scream]) ? 1 : 0; + always_death_scream = (shipp->flags[Ship::Ship_Flags::Always_death_scream]) ? 1 : 0; guardian = (shipp->ship_guardian_threshold) ? 1 : 0; - vaporize = (shipp->flags & SF_VAPORIZE) ? 1 : 0; - stealth = (shipp->flags2 & SF2_STEALTH) ? 1 : 0; - friendly_stealth_invisible = (shipp->flags2 & SF2_FRIENDLY_STEALTH_INVIS) ? 1 : 0; - nav_carry = (shipp->flags2 & SF2_NAVPOINT_CARRY) ? 1 : 0; - nav_needslink = (shipp->flags2 & SF2_NAVPOINT_NEEDSLINK) ? 1 : 0; - hide_ship_name = (shipp->flags2 & SF2_HIDE_SHIP_NAME) ? 1 : 0; - no_ets = (shipp->flags2 & SF2_NO_ETS) ? 1 : 0; - cloaked = (shipp->flags2 & SF2_CLOAKED) ? 1 : 0; - scramble_messages = (shipp->flags2 & SF2_SCRAMBLE_MESSAGES) ? 1 : 0; - no_collide = (objp->flags & OF_COLLIDES) ? 0 : 1; - no_disabled_self_destruct = (shipp->flags2 & SF2_NO_DISABLED_SELF_DESTRUCT) ? 1 : 0; + vaporize = (shipp->flags[Ship::Ship_Flags::Vaporize]) ? 1 : 0; + stealth = (shipp->flags[Ship::Ship_Flags::Stealth]) ? 1 : 0; + friendly_stealth_invisible = (shipp->flags[Ship::Ship_Flags::Friendly_stealth_invis]) ? 1 : 0; + nav_carry = (shipp->flags[Ship::Ship_Flags::Navpoint_carry]) ? 1 : 0; + nav_needslink = (shipp->flags[Ship::Ship_Flags::Navpoint_needslink]) ? 1 : 0; + hide_ship_name = (shipp->flags[Ship::Ship_Flags::Hide_ship_name]) ? 1 : 0; + no_ets = (shipp->flags[Ship::Ship_Flags::No_ets]) ? 1 : 0; + cloaked = (shipp->flags[Ship::Ship_Flags::Cloaked]) ? 1 : 0; + scramble_messages = (shipp->flags[Ship::Ship_Flags::Scramble_messages]) ? 1 : 0; + no_collide = (objp->flags[Object::Object_Flags::Collides]) ? 0 : 1; + no_disabled_self_destruct = (shipp->flags[Ship::Ship_Flags::No_disabled_self_destruct]) ? 1 : 0; - destroy_before_mission = (shipp->flags & SF_KILL_BEFORE_MISSION) ? 1 : 0; + destroy_before_mission = (shipp->flags[Ship::Ship_Flags::Kill_before_mission]) ? 1 : 0; m_destroy_value.init(shipp->final_death_time); kamikaze = (Ai_info[shipp->ai_index].ai_flags & AIF_KAMIKAZE) ? 1 : 0; m_kdamage.init( Ai_info[shipp->ai_index].kamikaze_damage ); - escort = (shipp->flags & SF_ESCORT) ? 1 : 0; + escort = (shipp->flags[Ship::Ship_Flags::Escort]) ? 1 : 0; m_escort_value.init(shipp->escort_priority); if(The_mission.game_type & MISSION_TYPE_MULTI) { @@ -242,53 +242,53 @@ BOOL ship_flags_dlg::OnInitDialog() ship_in_wing = (shipp->wingnum != -1);; } else { - scannable = tristate_set( shipp->flags & SF_SCANNABLE, scannable ); - red_alert_carry = tristate_set( shipp->flags & SF_RED_ALERT_STORE_STATUS, red_alert_carry ); - special_warpin = tristate_set( objp->flags & OF_SPECIAL_WARPIN, special_warpin ); - protect_ship = tristate_set(objp->flags & OF_PROTECTED, protect_ship); - beam_protect_ship = tristate_set(objp->flags & OF_BEAM_PROTECTED, beam_protect_ship); - flak_protect_ship = tristate_set(objp->flags & OF_FLAK_PROTECTED, flak_protect_ship); - laser_protect_ship = tristate_set(objp->flags & OF_LASER_PROTECTED, laser_protect_ship); - missile_protect_ship = tristate_set(objp->flags & OF_MISSILE_PROTECTED, missile_protect_ship); - invulnerable = tristate_set(objp->flags & OF_INVULNERABLE, invulnerable); - targetable_as_bomb = tristate_set(objp->flags & OF_TARGETABLE_AS_BOMB, targetable_as_bomb); - immobile = tristate_set(objp->flags & OF_IMMOBILE, immobile); - hidden_from_sensors = tristate_set(shipp->flags & SF_HIDDEN_FROM_SENSORS, hidden_from_sensors); - primitive_sensors = tristate_set(shipp->flags2 & SF2_PRIMITIVE_SENSORS, primitive_sensors); - no_subspace_drive = tristate_set(shipp->flags2 & SF2_NO_SUBSPACE_DRIVE, no_subspace_drive); - affected_by_gravity = tristate_set(shipp->flags2 & SF2_AFFECTED_BY_GRAVITY, affected_by_gravity); - toggle_subsystem_scanning = tristate_set(shipp->flags2 & SF2_TOGGLE_SUBSYSTEM_SCANNING, toggle_subsystem_scanning); - ignore_count = tristate_set(shipp->flags & SF_IGNORE_COUNT, ignore_count); - no_arrival_music = tristate_set(shipp->flags & SF_NO_ARRIVAL_MUSIC, no_arrival_music); - cargo_known = tristate_set(shipp->flags & SF_CARGO_REVEALED, cargo_known); + scannable = tristate_set( shipp->flags[Ship::Ship_Flags::Scannable], scannable ); + red_alert_carry = tristate_set( shipp->flags[Ship::Ship_Flags::Red_alert_store_status], red_alert_carry ); + special_warpin = tristate_set( objp->flags[Object::Object_Flags::Special_warpin], special_warpin ); + protect_ship = tristate_set(objp->flags[Object::Object_Flags::Protected], protect_ship); + beam_protect_ship = tristate_set(objp->flags[Object::Object_Flags::Beam_protected], beam_protect_ship); + flak_protect_ship = tristate_set(objp->flags[Object::Object_Flags::Flak_protected], flak_protect_ship); + laser_protect_ship = tristate_set(objp->flags[Object::Object_Flags::Laser_protected], laser_protect_ship); + missile_protect_ship = tristate_set(objp->flags[Object::Object_Flags::Missile_protected], missile_protect_ship); + invulnerable = tristate_set(objp->flags[Object::Object_Flags::Invulnerable], invulnerable); + targetable_as_bomb = tristate_set(objp->flags[Object::Object_Flags::Targetable_as_bomb], targetable_as_bomb); + immobile = tristate_set(objp->flags[Object::Object_Flags::Immobile], immobile); + hidden_from_sensors = tristate_set(shipp->flags[Ship::Ship_Flags::Hidden_from_sensors], hidden_from_sensors); + primitive_sensors = tristate_set(shipp->flags[Ship::Ship_Flags::Primitive_sensors], primitive_sensors); + no_subspace_drive = tristate_set(shipp->flags[Ship::Ship_Flags::No_subspace_drive], no_subspace_drive); + affected_by_gravity = tristate_set(shipp->flags[Ship::Ship_Flags::Affected_by_gravity], affected_by_gravity); + toggle_subsystem_scanning = tristate_set(shipp->flags[Ship::Ship_Flags::Toggle_subsystem_scanning], toggle_subsystem_scanning); + ignore_count = tristate_set(shipp->flags[Ship::Ship_Flags::Ignore_count], ignore_count); + no_arrival_music = tristate_set(shipp->flags[Ship::Ship_Flags::No_arrival_music], no_arrival_music); + cargo_known = tristate_set(shipp->flags[Ship::Ship_Flags::Cargo_revealed], cargo_known); no_dynamic = tristate_set( Ai_info[shipp->ai_index].ai_flags & AIF_NO_DYNAMIC, no_dynamic ); - disable_messages = tristate_set(shipp->flags2 & SF2_NO_BUILTIN_MESSAGES, disable_messages); - set_class_dynamically = tristate_set(shipp->flags2 & SF2_SET_CLASS_DYNAMICALLY, set_class_dynamically); - no_death_scream = tristate_set(shipp->flags2 & SF2_NO_DEATH_SCREAM, no_death_scream); - always_death_scream = tristate_set(shipp->flags2 & SF2_ALWAYS_DEATH_SCREAM, always_death_scream); + disable_messages = tristate_set(shipp->flags[Ship::Ship_Flags::No_builtin_messages], disable_messages); + set_class_dynamically = tristate_set(shipp->flags[Ship::Ship_Flags::Set_class_dynamically], set_class_dynamically); + no_death_scream = tristate_set(shipp->flags[Ship::Ship_Flags::No_death_scream], no_death_scream); + always_death_scream = tristate_set(shipp->flags[Ship::Ship_Flags::Always_death_scream], always_death_scream); guardian = tristate_set(shipp->ship_guardian_threshold, guardian); - vaporize = tristate_set(shipp->flags & SF_VAPORIZE, vaporize); - stealth = tristate_set(shipp->flags2 & SF2_STEALTH, stealth); - friendly_stealth_invisible = tristate_set(shipp->flags2 & SF2_FRIENDLY_STEALTH_INVIS, friendly_stealth_invisible); - nav_carry = tristate_set(shipp->flags2 & SF2_NAVPOINT_CARRY, nav_carry); - nav_needslink = tristate_set(shipp->flags2 & SF2_NAVPOINT_NEEDSLINK, nav_needslink); - hide_ship_name = tristate_set(shipp->flags2 & SF2_HIDE_SHIP_NAME, hide_ship_name); - no_ets = tristate_set(shipp->flags2 & SF2_NO_ETS, no_ets); - cloaked = tristate_set(shipp->flags2 & SF2_CLOAKED, cloaked); - scramble_messages = tristate_set(shipp->flags2 & SF2_SCRAMBLE_MESSAGES, scramble_messages); - no_collide = tristate_set(!(objp->flags & OF_COLLIDES), no_collide); - no_disabled_self_destruct = tristate_set(shipp->flags2 & SF2_NO_DISABLED_SELF_DESTRUCT, no_disabled_self_destruct); + vaporize = tristate_set(shipp->flags[Ship::Ship_Flags::Vaporize], vaporize); + stealth = tristate_set(shipp->flags[Ship::Ship_Flags::Stealth], stealth); + friendly_stealth_invisible = tristate_set(shipp->flags[Ship::Ship_Flags::Friendly_stealth_invis], friendly_stealth_invisible); + nav_carry = tristate_set(shipp->flags[Ship::Ship_Flags::Navpoint_carry], nav_carry); + nav_needslink = tristate_set(shipp->flags[Ship::Ship_Flags::Navpoint_needslink], nav_needslink); + hide_ship_name = tristate_set(shipp->flags[Ship::Ship_Flags::Hide_ship_name], hide_ship_name); + no_ets = tristate_set(shipp->flags[Ship::Ship_Flags::No_ets], no_ets); + cloaked = tristate_set(shipp->flags[Ship::Ship_Flags::Cloaked], cloaked); + scramble_messages = tristate_set(shipp->flags[Ship::Ship_Flags::Scramble_messages], scramble_messages); + no_collide = tristate_set(!(objp->flags[Object::Object_Flags::Collides]), no_collide); + no_disabled_self_destruct = tristate_set(shipp->flags[Ship::Ship_Flags::No_disabled_self_destruct], no_disabled_self_destruct); // check the final death time and set the internal variable according to whether or not // the final_death_time is set. Also, the value in the edit box must be set if all the // values are the same, and cleared if the values are not the same. - destroy_before_mission = tristate_set(shipp->flags & SF_KILL_BEFORE_MISSION, destroy_before_mission); + destroy_before_mission = tristate_set(shipp->flags[Ship::Ship_Flags::Kill_before_mission], destroy_before_mission); m_destroy_value.set(shipp->final_death_time); kamikaze = tristate_set( Ai_info[shipp->ai_index].ai_flags & AIF_KAMIKAZE, kamikaze ); m_kdamage.set( Ai_info[shipp->ai_index].kamikaze_damage ); - escort = tristate_set(shipp->flags & SF_ESCORT, escort); + escort = tristate_set(shipp->flags[Ship::Ship_Flags::Escort], escort); m_escort_value.init(shipp->escort_priority); if(The_mission.game_type & MISSION_TYPE_MULTI) { @@ -418,7 +418,7 @@ void ship_flags_dlg::OnOK() objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { if ((objp->type == OBJ_START) || (objp->type == OBJ_SHIP)) { - if (objp->flags & OF_MARKED) + if (objp->flags[Object::Object_Flags::Marked]) update_ship(objp->instance); } @@ -451,341 +451,341 @@ void ship_flags_dlg::update_ship(int shipnum) switch (m_cargo_known.GetCheck()) { case 1: - if ( !(shipp->flags & SF_CARGO_REVEALED) ) + if ( !(shipp->flags[Ship::Ship_Flags::Cargo_revealed]) ) set_modified(); - shipp->flags |= SF_CARGO_REVEALED; + shipp->flags.set(Ship::Ship_Flags::Cargo_revealed); break; case 0: - if ( shipp->flags & SF_CARGO_REVEALED ) + if ( shipp->flags[Ship::Ship_Flags::Cargo_revealed] ) set_modified(); - shipp->flags &= ~SF_CARGO_REVEALED; + 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 & OF_PROTECTED) ) + if (!(objp->flags[Object::Object_Flags::Protected]) ) set_modified(); - objp->flags |= OF_PROTECTED; + objp->flags.set(Object::Object_Flags::Protected); break; case 0: - if ( objp->flags & OF_PROTECTED ) + if ( objp->flags[Object::Object_Flags::Protected] ) set_modified(); - objp->flags &= ~OF_PROTECTED; + objp->flags.remove(Object::Object_Flags::Protected); break; } switch (m_beam_protect_ship.GetCheck()) { case 1: - if (!(objp->flags & OF_BEAM_PROTECTED) ) + if (!(objp->flags[Object::Object_Flags::Beam_protected]) ) set_modified(); - objp->flags |= OF_BEAM_PROTECTED; + objp->flags.set(Object::Object_Flags::Beam_protected); break; case 0: - if ( objp->flags & OF_BEAM_PROTECTED ) + if ( objp->flags[Object::Object_Flags::Beam_protected] ) set_modified(); - objp->flags &= ~OF_BEAM_PROTECTED; + objp->flags.remove(Object::Object_Flags::Beam_protected); break; } switch (m_flak_protect_ship.GetCheck()) { case 1: - if (!(objp->flags & OF_FLAK_PROTECTED) ) + if (!(objp->flags[Object::Object_Flags::Flak_protected]) ) set_modified(); - objp->flags |= OF_FLAK_PROTECTED; + objp->flags.set(Object::Object_Flags::Flak_protected); break; case 0: - if ( objp->flags & OF_FLAK_PROTECTED ) + if ( objp->flags[Object::Object_Flags::Flak_protected] ) set_modified(); - objp->flags &= ~OF_FLAK_PROTECTED; + objp->flags.remove(Object::Object_Flags::Flak_protected); break; } switch (m_laser_protect_ship.GetCheck()) { case 1: - if (!(objp->flags & OF_LASER_PROTECTED) ) + if (!(objp->flags[Object::Object_Flags::Laser_protected]) ) set_modified(); - objp->flags |= OF_LASER_PROTECTED; + objp->flags.set(Object::Object_Flags::Laser_protected); break; case 0: - if ( objp->flags & OF_LASER_PROTECTED ) + if ( objp->flags[Object::Object_Flags::Laser_protected] ) set_modified(); - objp->flags &= ~OF_LASER_PROTECTED; + objp->flags.remove(Object::Object_Flags::Laser_protected); break; } switch (m_missile_protect_ship.GetCheck()) { case 1: - if (!(objp->flags & OF_MISSILE_PROTECTED) ) + if (!(objp->flags[Object::Object_Flags::Missile_protected]) ) set_modified(); - objp->flags |= OF_MISSILE_PROTECTED; + objp->flags.set(Object::Object_Flags::Missile_protected); break; case 0: - if ( objp->flags & OF_MISSILE_PROTECTED ) + if ( objp->flags[Object::Object_Flags::Missile_protected] ) set_modified(); - objp->flags &= ~OF_MISSILE_PROTECTED; + objp->flags.remove(Object::Object_Flags::Missile_protected); break; } switch (m_invulnerable.GetCheck()) { case 1: - if ( !(objp->flags & OF_INVULNERABLE) ) + if ( !(objp->flags[Object::Object_Flags::Invulnerable]) ) set_modified(); - objp->flags |= OF_INVULNERABLE; + objp->flags.set(Object::Object_Flags::Invulnerable); break; case 0: - if ( objp->flags & OF_INVULNERABLE ) + if ( objp->flags[Object::Object_Flags::Invulnerable] ) set_modified(); - objp->flags &= ~OF_INVULNERABLE; + objp->flags.remove(Object::Object_Flags::Invulnerable); break; } switch (m_targetable_as_bomb.GetCheck()) { case 1: - if ( !(objp->flags & OF_TARGETABLE_AS_BOMB) ) + if ( !(objp->flags[Object::Object_Flags::Targetable_as_bomb]) ) set_modified(); - objp->flags |= OF_TARGETABLE_AS_BOMB; + objp->flags.set(Object::Object_Flags::Targetable_as_bomb); break; case 0: - if ( objp->flags & OF_TARGETABLE_AS_BOMB ) + if ( objp->flags[Object::Object_Flags::Targetable_as_bomb] ) set_modified(); - objp->flags &= ~OF_TARGETABLE_AS_BOMB; + objp->flags.remove(Object::Object_Flags::Targetable_as_bomb); break; } switch (m_immobile.GetCheck()) { case 1: - if ( !(objp->flags & OF_IMMOBILE) ) + if ( !(objp->flags[Object::Object_Flags::Immobile]) ) set_modified(); - objp->flags |= OF_IMMOBILE; + objp->flags.set(Object::Object_Flags::Immobile); break; case 0: - if ( objp->flags & OF_IMMOBILE ) + if ( objp->flags[Object::Object_Flags::Immobile] ) set_modified(); - objp->flags &= ~OF_IMMOBILE; + objp->flags.remove(Object::Object_Flags::Immobile); break; } switch (m_hidden.GetCheck()) { case 1: - if ( !(shipp->flags & SF_HIDDEN_FROM_SENSORS) ) + if ( !(shipp->flags[Ship::Ship_Flags::Hidden_from_sensors]) ) set_modified(); - shipp->flags |= SF_HIDDEN_FROM_SENSORS; + shipp->flags.set(Ship::Ship_Flags::Hidden_from_sensors); break; case 0: - if ( shipp->flags & SF_HIDDEN_FROM_SENSORS ) + if ( shipp->flags[Ship::Ship_Flags::Hidden_from_sensors] ) set_modified(); - shipp->flags &= ~SF_HIDDEN_FROM_SENSORS; + shipp->flags.remove(Ship::Ship_Flags::Hidden_from_sensors); break; } switch (m_primitive_sensors.GetCheck()) { case 1: - if ( !(shipp->flags2 & SF2_PRIMITIVE_SENSORS) ) + if ( !(shipp->flags[Ship::Ship_Flags::Primitive_sensors]) ) set_modified(); - shipp->flags2 |= SF2_PRIMITIVE_SENSORS; + shipp->flags.set(Ship::Ship_Flags::Primitive_sensors); break; case 0: - if ( shipp->flags2 & SF2_PRIMITIVE_SENSORS ) + if ( shipp->flags[Ship::Ship_Flags::Primitive_sensors] ) set_modified(); - shipp->flags2 &= ~SF2_PRIMITIVE_SENSORS; + shipp->flags.remove(Ship::Ship_Flags::Primitive_sensors); break; } switch (m_no_subspace_drive.GetCheck()) { case 1: - if ( !(shipp->flags2 & SF2_NO_SUBSPACE_DRIVE) ) + if ( !(shipp->flags[Ship::Ship_Flags::No_subspace_drive]) ) set_modified(); - shipp->flags2 |= SF2_NO_SUBSPACE_DRIVE; + shipp->flags.set(Ship::Ship_Flags::No_subspace_drive); break; case 0: - if ( shipp->flags2 & SF2_NO_SUBSPACE_DRIVE ) + if ( shipp->flags[Ship::Ship_Flags::No_subspace_drive] ) set_modified(); - shipp->flags2 &= ~SF2_NO_SUBSPACE_DRIVE; + shipp->flags.remove(Ship::Ship_Flags::No_subspace_drive); break; } switch (m_affected_by_gravity.GetCheck()) { case 1: - if ( !(shipp->flags2 & SF2_AFFECTED_BY_GRAVITY) ) + if ( !(shipp->flags[Ship::Ship_Flags::Affected_by_gravity]) ) set_modified(); - shipp->flags2 |= SF2_AFFECTED_BY_GRAVITY; + shipp->flags.set(Ship::Ship_Flags::Affected_by_gravity); break; case 0: - if ( shipp->flags2 & SF2_AFFECTED_BY_GRAVITY ) + if ( shipp->flags[Ship::Ship_Flags::Affected_by_gravity] ) set_modified(); - shipp->flags2 &= ~SF2_AFFECTED_BY_GRAVITY; + shipp->flags.remove(Ship::Ship_Flags::Affected_by_gravity); break; } switch (m_toggle_subsystem_scanning.GetCheck()) { case 1: - if ( !(shipp->flags2 & SF2_TOGGLE_SUBSYSTEM_SCANNING) ) + if ( !(shipp->flags[Ship::Ship_Flags::Toggle_subsystem_scanning]) ) set_modified(); - shipp->flags2 |= SF2_TOGGLE_SUBSYSTEM_SCANNING; + shipp->flags.set(Ship::Ship_Flags::Toggle_subsystem_scanning); break; case 0: - if ( shipp->flags2 & SF2_TOGGLE_SUBSYSTEM_SCANNING ) + if ( shipp->flags[Ship::Ship_Flags::Toggle_subsystem_scanning] ) set_modified(); - shipp->flags2 &= ~SF2_TOGGLE_SUBSYSTEM_SCANNING; + shipp->flags.remove(Ship::Ship_Flags::Toggle_subsystem_scanning); break; } switch (m_ignore_count.GetCheck()) { case 1: - if ( !(shipp->flags & SF_IGNORE_COUNT) ) + if ( !(shipp->flags[Ship::Ship_Flags::Ignore_count]) ) set_modified(); - shipp->flags |= SF_IGNORE_COUNT; + shipp->flags.set(Ship::Ship_Flags::Ignore_count); break; case 0: - if (shipp->flags & SF_IGNORE_COUNT) + if (shipp->flags[Ship::Ship_Flags::Ignore_count]) set_modified(); - shipp->flags &= ~SF_IGNORE_COUNT; + shipp->flags.remove(Ship::Ship_Flags::Ignore_count); break; } switch (m_escort.GetCheck()) { case 1: - if (!(shipp->flags & SF_ESCORT)) + if (!(shipp->flags[Ship::Ship_Flags::Escort])) set_modified(); - shipp->flags |= SF_ESCORT; + shipp->flags.set(Ship::Ship_Flags::Escort); m_escort_value.save(&shipp->escort_priority); break; case 0: - if (shipp->flags & SF_ESCORT) + if (shipp->flags[Ship::Ship_Flags::Escort]) set_modified(); - shipp->flags &= ~SF_ESCORT; + 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 & SF_KILL_BEFORE_MISSION ) + if ( shipp->flags[Ship::Ship_Flags::Kill_before_mission] ) set_modified(); - shipp->flags &= ~SF_KILL_BEFORE_MISSION; + shipp->flags.remove(Ship::Ship_Flags::Kill_before_mission); break; case 1: // this means checkbox is checked - if ( !(shipp->flags & SF_KILL_BEFORE_MISSION) ) + if ( !(shipp->flags[Ship::Ship_Flags::Kill_before_mission]) ) set_modified(); - shipp->flags |= SF_KILL_BEFORE_MISSION; + 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 & SF_NO_ARRIVAL_MUSIC) + if (shipp->flags[Ship::Ship_Flags::No_arrival_music]) set_modified(); - shipp->flags &= ~SF_NO_ARRIVAL_MUSIC; + shipp->flags.remove(Ship::Ship_Flags::No_arrival_music); break; case 1: - if (!(shipp->flags & SF_NO_ARRIVAL_MUSIC)) + if (!(shipp->flags[Ship::Ship_Flags::No_arrival_music])) set_modified(); - shipp->flags |= SF_NO_ARRIVAL_MUSIC; + shipp->flags.set(Ship::Ship_Flags::No_arrival_music); break; } switch (m_scannable.GetCheck()) { case 1: - if ( !(shipp->flags & SF_SCANNABLE) ) + if ( !(shipp->flags[Ship::Ship_Flags::Scannable]) ) set_modified(); - shipp->flags |= SF_SCANNABLE; + shipp->flags.set(Ship::Ship_Flags::Scannable); break; case 0: - if ( shipp->flags & SF_SCANNABLE ) + if ( shipp->flags[Ship::Ship_Flags::Scannable] ) set_modified(); - shipp->flags &= ~SF_SCANNABLE; + shipp->flags.remove(Ship::Ship_Flags::Scannable); break; } switch (m_red_alert_carry.GetCheck()) { case 1: - if ( !(shipp->flags & SF_RED_ALERT_STORE_STATUS) ) + if ( !(shipp->flags[Ship::Ship_Flags::Red_alert_store_status]) ) set_modified(); - shipp->flags |= SF_RED_ALERT_STORE_STATUS; + shipp->flags.set(Ship::Ship_Flags::Red_alert_store_status); break; case 0: - if ( shipp->flags & SF_RED_ALERT_STORE_STATUS ) + if ( shipp->flags[Ship::Ship_Flags::Red_alert_store_status] ) set_modified(); - shipp->flags &= ~SF_RED_ALERT_STORE_STATUS; + shipp->flags.remove(Ship::Ship_Flags::Red_alert_store_status); break; } switch (m_special_warpin.GetCheck()) { case 1: - if ( !(objp->flags & OF_SPECIAL_WARPIN) ) + if ( !(objp->flags[Object::Object_Flags::Special_warpin]) ) set_modified(); - objp->flags |= OF_SPECIAL_WARPIN; + objp->flags.set(Object::Object_Flags::Special_warpin); break; case 0: - if ( (objp->flags & OF_SPECIAL_WARPIN) ) + if ( (objp->flags[Object::Object_Flags::Special_warpin]) ) set_modified(); - objp->flags &= (~OF_SPECIAL_WARPIN); + objp->flags.remove(Object::Object_Flags::Special_warpin); break; } @@ -827,262 +827,261 @@ void ship_flags_dlg::update_ship(int shipnum) break; } - switch (m_disable_messages.GetCheck()) { - case 1: - if ( !(shipp->flags2 & SF2_NO_BUILTIN_MESSAGES) ) - set_modified(); + switch (m_disable_messages.GetCheck()) { + case 1: + if (!(shipp->flags[Ship::Ship_Flags::No_builtin_messages])) + set_modified(); - shipp->flags2 |= SF2_NO_BUILTIN_MESSAGES; - break; + shipp->flags.set(Ship::Ship_Flags::No_builtin_messages); + break; - case 0: - if ( shipp->flags2 & SF2_NO_BUILTIN_MESSAGES ) - set_modified(); + case 0: + if (shipp->flags[Ship::Ship_Flags::No_builtin_messages]) + set_modified(); - shipp->flags2 &= ~SF2_NO_BUILTIN_MESSAGES; - break; - } + shipp->flags.set(Ship::Ship_Flags::No_builtin_messages, false); + break; + } - switch (m_set_class_dynamically.GetCheck()) { - case 1: - if ( !(shipp->flags2 & SF2_SET_CLASS_DYNAMICALLY) ) - set_modified(); + switch (m_set_class_dynamically.GetCheck()) { + case 1: + if (!(shipp->flags[Ship::Ship_Flags::Set_class_dynamically])) + set_modified(); - shipp->flags2 |= SF2_SET_CLASS_DYNAMICALLY; - break; + shipp->flags.set(Ship::Ship_Flags::Set_class_dynamically); + break; - case 0: - if ( shipp->flags2 & SF2_SET_CLASS_DYNAMICALLY ) - set_modified(); + case 0: + if (shipp->flags[Ship::Ship_Flags::Set_class_dynamically]) + set_modified(); - shipp->flags2 &= ~SF2_SET_CLASS_DYNAMICALLY; - break; - } + shipp->flags.remove(Ship::Ship_Flags::Set_class_dynamically); + break; + } - switch (m_no_death_scream.GetCheck()) { - case 1: - if ( !(shipp->flags2 & SF2_NO_DEATH_SCREAM) ) - set_modified(); + switch (m_no_death_scream.GetCheck()) { + case 1: + if (!(shipp->flags[Ship::Ship_Flags::No_death_scream])) + set_modified(); - shipp->flags2 |= SF2_NO_DEATH_SCREAM; - break; + shipp->flags.set(Ship::Ship_Flags::No_death_scream); + break; - case 0: - if ( shipp->flags2 & SF2_NO_DEATH_SCREAM ) - set_modified(); + case 0: + if (shipp->flags[Ship::Ship_Flags::No_death_scream]) + set_modified(); - shipp->flags2 &= ~SF2_NO_DEATH_SCREAM; - break; - } + shipp->flags.remove(Ship::Ship_Flags::No_death_scream); + break; + } - switch (m_always_death_scream.GetCheck()) { - case 1: - if ( !(shipp->flags2 & SF2_ALWAYS_DEATH_SCREAM) ) - set_modified(); + switch (m_always_death_scream.GetCheck()) { + case 1: + if (!(shipp->flags[Ship::Ship_Flags::Always_death_scream])) + set_modified(); - shipp->flags2 |= SF2_ALWAYS_DEATH_SCREAM; - break; + shipp->flags.set(Ship::Ship_Flags::Always_death_scream); + break; - case 0: - if ( shipp->flags2 & SF2_ALWAYS_DEATH_SCREAM ) - set_modified(); + case 0: + if (shipp->flags[Ship::Ship_Flags::Always_death_scream]) + set_modified(); - shipp->flags2 &= ~SF2_ALWAYS_DEATH_SCREAM; - break; - } + shipp->flags.remove(Ship::Ship_Flags::Always_death_scream); + break; + } - switch (m_nav_carry.GetCheck()) { - case 1: - if ( !(shipp->flags2 & SF2_NAVPOINT_CARRY) ) - set_modified(); + switch (m_nav_carry.GetCheck()) { + case 1: + if (!(shipp->flags[Ship::Ship_Flags::Navpoint_carry])) + set_modified(); - shipp->flags2 |= SF2_NAVPOINT_CARRY; - break; + shipp->flags.set(Ship::Ship_Flags::Navpoint_carry); + break; - case 0: - if ( shipp->flags2 & SF2_NAVPOINT_CARRY ) - set_modified(); + case 0: + if (shipp->flags[Ship::Ship_Flags::Navpoint_carry]) + set_modified(); - shipp->flags2 &= ~SF2_NAVPOINT_CARRY; - break; - } + shipp->flags.remove(Ship::Ship_Flags::Navpoint_carry); + break; + } - switch (m_nav_needslink.GetCheck()) { - case 1: - if ( !(shipp->flags2 & SF2_NAVPOINT_NEEDSLINK) ) - set_modified(); + switch (m_nav_needslink.GetCheck()) { + case 1: + if (!(shipp->flags[Ship::Ship_Flags::Navpoint_needslink])) + set_modified(); - shipp->flags2 |= SF2_NAVPOINT_NEEDSLINK; - break; + shipp->flags.set(Ship::Ship_Flags::Navpoint_needslink); + break; - case 0: - if ( shipp->flags2 & SF2_NAVPOINT_NEEDSLINK ) - set_modified(); + case 0: + if (shipp->flags[Ship::Ship_Flags::Navpoint_needslink]) + set_modified(); - shipp->flags2 &= ~SF2_NAVPOINT_NEEDSLINK; - break; - } + shipp->flags.remove(Ship::Ship_Flags::Navpoint_needslink); + break; + } - switch (m_hide_ship_name.GetCheck()) { - case 1: - if ( !(shipp->flags2 & SF2_HIDE_SHIP_NAME) ) - set_modified(); + switch (m_hide_ship_name.GetCheck()) { + case 1: + if (!(shipp->flags[Ship::Ship_Flags::Hide_ship_name])) + set_modified(); - shipp->flags2 |= SF2_HIDE_SHIP_NAME; - break; + shipp->flags.set(Ship::Ship_Flags::Hide_ship_name); + break; - case 0: - if ( shipp->flags2 & SF2_HIDE_SHIP_NAME ) - set_modified(); + case 0: + if (shipp->flags[Ship::Ship_Flags::Hide_ship_name]) + set_modified(); - shipp->flags2 &= ~SF2_HIDE_SHIP_NAME; - break; - } + shipp->flags.remove(Ship::Ship_Flags::Hide_ship_name); + break; + } - switch (m_disable_ets.GetCheck()) { - case 1: - if ( !(shipp->flags2 & SF2_NO_ETS) ) - set_modified(); + switch (m_disable_ets.GetCheck()) { + case 1: + if (!(shipp->flags[Ship::Ship_Flags::No_ets])) + set_modified(); - shipp->flags2 |= SF2_NO_ETS; - break; + shipp->flags.set(Ship::Ship_Flags::No_ets); + break; - case 0: - if ( shipp->flags2 & SF2_NO_ETS ) - set_modified(); + case 0: + if (shipp->flags[Ship::Ship_Flags::No_ets]) + set_modified(); - shipp->flags2 &= ~SF2_NO_ETS; - break; - } + shipp->flags.remove(Ship::Ship_Flags::No_ets); + break; + } - switch (m_cloaked.GetCheck()) { - case 1: - if ( !(shipp->flags2 & SF2_CLOAKED) ) - set_modified(); + switch (m_cloaked.GetCheck()) { + case 1: + if (!(shipp->flags[Ship::Ship_Flags::Cloaked])) + set_modified(); - shipp->flags2 |= SF2_CLOAKED; - break; + shipp->flags.set(Ship::Ship_Flags::Cloaked); + break; - case 0: - if ( shipp->flags2 & SF2_CLOAKED ) - set_modified(); + case 0: + if (shipp->flags[Ship::Ship_Flags::Cloaked]) + set_modified(); - shipp->flags2 &= ~SF2_CLOAKED; - break; - } + shipp->flags.remove(Ship::Ship_Flags::Cloaked); + break; + } - switch (m_guardian.GetCheck()) { - case 1: - if ( !(shipp->ship_guardian_threshold) ) - set_modified(); + switch (m_guardian.GetCheck()) { + case 1: + if (!(shipp->ship_guardian_threshold)) + set_modified(); - shipp->ship_guardian_threshold = SHIP_GUARDIAN_THRESHOLD_DEFAULT; - break; + shipp->ship_guardian_threshold = SHIP_GUARDIAN_THRESHOLD_DEFAULT; + break; - case 0: - if ( shipp->ship_guardian_threshold ) - set_modified(); + case 0: + if (shipp->ship_guardian_threshold) + set_modified(); - shipp->ship_guardian_threshold = 0; - break; - } + shipp->ship_guardian_threshold = 0; + break; + } - switch (m_vaporize.GetCheck()) { - case 1: - if ( !(shipp->flags & SF_VAPORIZE) ) - set_modified(); + switch (m_vaporize.GetCheck()) { + case 1: + if (!(shipp->flags[Ship::Ship_Flags::Vaporize])) + set_modified(); - shipp->flags |= SF_VAPORIZE; - break; + shipp->flags.set(Ship::Ship_Flags::Vaporize); + break; - case 0: - if ( shipp->flags & SF_VAPORIZE ) - set_modified(); + case 0: + if (shipp->flags[Ship::Ship_Flags::Vaporize]) + set_modified(); - shipp->flags &= ~SF_VAPORIZE; - break; - } + shipp->flags.remove(Ship::Ship_Flags::Vaporize); + break; + } - switch (m_stealth.GetCheck()) { - case 1: - if ( !(shipp->flags2 & SF2_STEALTH) ) - set_modified(); + switch (m_stealth.GetCheck()) { + case 1: + if (!(shipp->flags[Ship::Ship_Flags::Stealth])) + set_modified(); - shipp->flags2 |= SF2_STEALTH; - break; + shipp->flags.set(Ship::Ship_Flags::Stealth); + break; - case 0: - if ( shipp->flags2 & SF2_STEALTH ) - set_modified(); + case 0: + if (shipp->flags[Ship::Ship_Flags::Stealth]) + set_modified(); - shipp->flags2 &= ~SF2_STEALTH; - break; - } + shipp->flags.remove(Ship::Ship_Flags::Stealth); + break; + } - switch (m_friendly_stealth_invisible.GetCheck()) { - case 1: - if ( !(shipp->flags2 & SF2_FRIENDLY_STEALTH_INVIS) ) - set_modified(); + switch (m_friendly_stealth_invisible.GetCheck()) { + case 1: + if (!(shipp->flags[Ship::Ship_Flags::Friendly_stealth_invis])) + set_modified(); - shipp->flags2 |= SF2_FRIENDLY_STEALTH_INVIS; - break; + shipp->flags.set(Ship::Ship_Flags::Friendly_stealth_invis); + break; - case 0: - if ( shipp->flags2 & SF2_FRIENDLY_STEALTH_INVIS ) - set_modified(); + case 0: + if (shipp->flags[Ship::Ship_Flags::Friendly_stealth_invis]) + set_modified(); - shipp->flags2 &= ~SF2_FRIENDLY_STEALTH_INVIS; - break; - } + shipp->flags.remove(Ship::Ship_Flags::Friendly_stealth_invis); + break; + } - switch (m_scramble_messages.GetCheck()) { - case 1: - if ( !(shipp->flags2 & SF2_SCRAMBLE_MESSAGES) ) - set_modified(); + switch (m_scramble_messages.GetCheck()) { + case 1: + if (!(shipp->flags[Ship::Ship_Flags::Scramble_messages])) + set_modified(); - shipp->flags2 |= SF2_SCRAMBLE_MESSAGES; - break; + shipp->flags.set(Ship::Ship_Flags::Scramble_messages); + break; - case 0: - if ( shipp->flags2 & SF2_SCRAMBLE_MESSAGES ) - set_modified(); + case 0: + if (shipp->flags[Ship::Ship_Flags::Scramble_messages]) + set_modified(); - shipp->flags2 &= ~SF2_SCRAMBLE_MESSAGES; - break; - } + shipp->flags.remove(Ship::Ship_Flags::Scramble_messages); + break; + } - switch (m_no_collide.GetCheck()) { - case 1: - if (objp->flags & OF_COLLIDES) - set_modified(); + switch (m_no_collide.GetCheck()) { + case 1: + if (objp->flags[Object::Object_Flags::Collides]) + set_modified(); - objp->flags &= ~OF_COLLIDES; - break; + objp->flags.remove(Object::Object_Flags::Collides); + break; - case 0: - if (!(objp->flags & OF_COLLIDES)) - set_modified(); + case 0: + if (!(objp->flags[Object::Object_Flags::Collides])) + set_modified(); - objp->flags |= OF_COLLIDES; - break; - } + objp->flags.set(Object::Object_Flags::Collides); + break; + } - switch (m_no_disabled_self_destruct.GetCheck()) { - case 1: - if (!(shipp->flags2 & SF2_NO_DISABLED_SELF_DESTRUCT)) - set_modified(); + switch (m_no_disabled_self_destruct.GetCheck()) { + case 1: + if (!(shipp->flags[Ship::Ship_Flags::No_disabled_self_destruct])) + set_modified(); - shipp->flags2 |= SF2_NO_DISABLED_SELF_DESTRUCT; - break; + shipp->flags.set(Ship::Ship_Flags::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; - } + 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) { diff --git a/fred2/shipgoalsdlg.cpp b/fred2/shipgoalsdlg.cpp index 6dd658331d..05a346b3d3 100644 --- a/fred2/shipgoalsdlg.cpp +++ b/fred2/shipgoalsdlg.cpp @@ -249,7 +249,7 @@ BOOL ShipGoalsDlg::OnInitDialog() } else { // editing orders for all marked ships ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - if (((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) && (ptr->flags & OF_MARKED)){ + if (((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) && (ptr->flags[Object::Object_Flags::Marked])){ for (i=0; iinstance, Ai_goal_list[i].def)){ valid[i] = 0; @@ -347,7 +347,7 @@ void ShipGoalsDlg::initialize_multi() ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - if (((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) && (ptr->flags & OF_MARKED)) { + if (((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) && (ptr->flags[Object::Object_Flags::Marked])) { initialize(Ai_info[Ships[ptr->instance].ai_index].goals, ptr->instance); if (!flag) { flag = 1; @@ -652,7 +652,7 @@ void ShipGoalsDlg::set_item(int item, int init) Assert(inst >= 0 && inst < MAX_SHIPS); // remove all marked ships from list - if (!goalp && (ptr->flags & OF_MARKED)) + if (!goalp && (ptr->flags[Object::Object_Flags::Marked])) inst = -1; // when docking, remove invalid dock targets @@ -825,7 +825,7 @@ void ShipGoalsDlg::update() ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - if (((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) && (ptr->flags & OF_MARKED)) { + if (((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) && (ptr->flags[Object::Object_Flags::Marked])) { goalp = Ai_info[Ships[ptr->instance].ai_index].goals; for (i=0; itype == OBJ_SHIP) || (ptr->type == OBJ_START)) && (ptr->flags & OF_MARKED)) { + if (((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) && (ptr->flags[Object::Object_Flags::Marked])) { self_ship = ptr->instance; goalp = Ai_info[Ships[self_ship].ai_index].goals; verify_orders(self_ship); diff --git a/fred2/shipspecialdamage.cpp b/fred2/shipspecialdamage.cpp index 9d9a93d9f9..8f26fc40a2 100644 --- a/fred2/shipspecialdamage.cpp +++ b/fred2/shipspecialdamage.cpp @@ -111,7 +111,7 @@ BOOL ShipSpecialDamage::OnInitDialog() objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { if ((objp->type == OBJ_START) || (objp->type == OBJ_SHIP)) { - if (objp->flags & OF_MARKED) { + if (objp->flags[Object::Object_Flags::Marked]) { m_selected_ships[num_selected_ships] = objp->instance; num_selected_ships++; } @@ -119,7 +119,7 @@ BOOL ShipSpecialDamage::OnInitDialog() objp = GET_NEXT(objp); } - Assert (Objects[cur_object_index].flags & OF_MARKED); + Assert (Objects[cur_object_index].flags[Object::Object_Flags::Marked]); m_ship_num = Objects[cur_object_index].instance; if (!(Ships[m_ship_num].use_special_explosion)) { diff --git a/fred2/shipspecialhitpoints.cpp b/fred2/shipspecialhitpoints.cpp index d009ee1247..373e511a81 100644 --- a/fred2/shipspecialhitpoints.cpp +++ b/fred2/shipspecialhitpoints.cpp @@ -77,7 +77,7 @@ BOOL ShipSpecialHitpoints::OnInitDialog() objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { if ((objp->type == OBJ_START) || (objp->type == OBJ_SHIP)) { - if (objp->flags & OF_MARKED) { + if (objp->flags[Object::Object_Flags::Marked]) { m_selected_ships[num_selected_ships] = objp->instance; num_selected_ships++; } @@ -86,7 +86,7 @@ BOOL ShipSpecialHitpoints::OnInitDialog() } Assert(num_selected_ships); - Assert (Objects[cur_object_index].flags & OF_MARKED); + Assert (Objects[cur_object_index].flags[Object::Object_Flags::Marked]); m_ship_num = Objects[cur_object_index].instance; // get the details from the first ship diff --git a/fred2/voiceactingmanager.cpp b/fred2/voiceactingmanager.cpp index 64a8e70de3..77661fdd68 100644 --- a/fred2/voiceactingmanager.cpp +++ b/fred2/voiceactingmanager.cpp @@ -566,7 +566,7 @@ void VoiceActingManager::get_valid_sender(char *sender, size_t sender_size, MMes hud_stuff_ship_callsign(sender, shipp); } // account for hidden ship names - else if ( ((Iff_info[shipp->team].flags & IFFF_WING_NAME_HIDDEN) && (shipp->wingnum != -1)) || (shipp->flags2 & SF2_HIDE_SHIP_NAME) ) + else if ( ((Iff_info[shipp->team].flags & IFFF_WING_NAME_HIDDEN) && (shipp->wingnum != -1)) || (shipp->flags[Ship::Ship_Flags::Hide_ship_name]) ) { hud_stuff_ship_class(sender, shipp); } diff --git a/fred2/weaponeditordlg.cpp b/fred2/weaponeditordlg.cpp index 43302577cd..370eb838ba 100644 --- a/fred2/weaponeditordlg.cpp +++ b/fred2/weaponeditordlg.cpp @@ -203,9 +203,9 @@ BOOL WeaponEditorDlg::OnInitDialog() list->SetItemDataPtr(z, &pilot); ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - if (((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) && (ptr->flags & OF_MARKED)) { + if (((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) && (ptr->flags[Object::Object_Flags::Marked])) { inst = ptr->instance; - if (!(ship_get_SIF(inst) & (SIF_BIG_SHIP | SIF_HUGE_SHIP))) + if (!(Ship_info[Ships[inst].ship_info_index].is_big_or_huge())) big = 0; if (!flag) { @@ -235,7 +235,7 @@ BOOL WeaponEditorDlg::OnInitDialog() } } else { - if (!(ship_get_SIF(m_ship) & (SIF_BIG_SHIP | SIF_HUGE_SHIP))) + if (!(Ship_info[Ships[m_ship].ship_info_index].is_big_or_huge())) big = 0; m_ship_class = Ships[m_ship].ship_info_index; @@ -558,7 +558,7 @@ void WeaponEditorDlg::update_pilot() if (m_multi_edit) { ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - if (((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) && (ptr->flags & OF_MARKED)) { + if (((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) && (ptr->flags[Object::Object_Flags::Marked])) { weapon = &Ships[ptr->instance].weapons; if (pilot.ai_class >= 0) diff --git a/fred2/wing.cpp b/fred2/wing.cpp index 6fdf516b8e..e369c5d48d 100644 --- a/fred2/wing.cpp +++ b/fred2/wing.cpp @@ -123,7 +123,7 @@ int create_wing() { leader = cur_object_index; ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - if (((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) && (ptr->flags & OF_MARKED)) { + if (( (ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START) ) && (ptr->flags[Object::Object_Flags::Marked])) { count++; i = -1; switch (ptr->type) { @@ -225,10 +225,10 @@ int create_wing() { set_cur_indices(-1); ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - if (ptr->flags & OF_MARKED) { - // if ((ptr->type == OBJ_START) && (ptr->instance)) { - // starts++; - // unmark_object(OBJ_INDEX(ptr)); + if (ptr->flags[Object::Object_Flags::Marked]) { +// if ((ptr->type == OBJ_START) && (ptr->instance)) { +// starts++; +// unmark_object(OBJ_INDEX(ptr)); // } else if (ptr->type == OBJ_WAYPOINT) { if (ptr->type == OBJ_WAYPOINT) { @@ -256,12 +256,12 @@ int create_wing() { } count = 0; - if (Objects[Ships[Player_start_shipnum].objnum].flags & OF_MARKED) + if (Objects[Ships[Player_start_shipnum].objnum].flags[Object::Object_Flags::Marked]) count = 1; ptr = GET_FIRST(&obj_used_list); while (ptr != END_OF_LIST(&obj_used_list)) { - if (ptr->flags & OF_MARKED) { + if (ptr->flags[Object::Object_Flags::Marked]) { if ((ptr->type == OBJ_START) && (ptr->instance == Player_start_shipnum)) i = 0; // player 1 start always goes to front of the wing else diff --git a/fred2/wing_editor.cpp b/fred2/wing_editor.cpp index bce7a320ff..0980353f1d 100644 --- a/fred2/wing_editor.cpp +++ b/fred2/wing_editor.cpp @@ -1,1356 +1,1353 @@ -/* - * Copyright (C) Volition, Inc. 1999. All rights reserved. - * - * All source code herein is the property of Volition, Inc. You may not sell - * or otherwise commercially exploit the source or things you created based on the - * source. - * -*/ - - - -#include "stdafx.h" -#include "MainFrm.h" -#include "FRED.h" -#include "FREDDoc.h" -#include "Management.h" -#include "wing.h" -#include "globalincs/linklist.h" -#include "ai/aigoals.h" -#include "FREDView.h" -#include "starfield/starfield.h" -#include "jumpnode/jumpnode.h" -#include "cfile/cfile.h" -#include "restrictpaths.h" -#include "iff_defs/iff_defs.h" - -#define ID_WING_MENU 9000 - -#ifdef _DEBUG -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// wing_editor dialog - -wing_editor::wing_editor(CWnd* pParent /*=NULL*/) - : CDialog(wing_editor::IDD, pParent) -{ - //{{AFX_DATA_INIT(wing_editor) - m_wing_name = _T(""); - m_wing_squad_filename = _T(""); - m_special_ship = -1; - m_waves = 0; - m_threshold = 0; - m_arrival_location = -1; - m_departure_location = -1; - m_arrival_delay = 0; - m_departure_delay = 0; - m_reinforcement = FALSE; - m_hotkey = -1; - m_ignore_count = FALSE; - m_arrival_delay_max = 0; - m_arrival_delay_min = 0; - m_arrival_dist = 0; - m_arrival_target = -1; - m_no_arrival_music = FALSE; - m_departure_target = -1; - m_no_arrival_message = FALSE; - m_no_arrival_warp = FALSE; - m_no_departure_warp = FALSE; - m_no_dynamic = FALSE; - //}}AFX_DATA_INIT - modified = 0; - select_sexp_node = -1; - bypass_errors = 0; -} - -void wing_editor::DoDataExchange(CDataExchange* pDX) -{ - CString str; - - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(wing_editor) - DDX_Control(pDX, IDC_DEPARTURE_DELAY_SPIN, m_departure_delay_spin); - DDX_Control(pDX, IDC_ARRIVAL_DELAY_SPIN, m_arrival_delay_spin); - DDX_Control(pDX, IDC_DEPARTURE_TREE, m_departure_tree); - DDX_Control(pDX, IDC_ARRIVAL_TREE, m_arrival_tree); - DDX_Control(pDX, IDC_SPIN_WAVE_THRESHOLD, m_threshold_spin); - DDX_Control(pDX, IDC_SPIN_WAVES, m_waves_spin); - DDX_Text(pDX, IDC_WING_NAME, m_wing_name); - DDX_Text(pDX, IDC_WING_SQUAD_LOGO, m_wing_squad_filename); - DDX_CBIndex(pDX, IDC_WING_SPECIAL_SHIP, m_special_ship); - DDX_CBIndex(pDX, IDC_ARRIVAL_LOCATION, m_arrival_location); - DDX_CBIndex(pDX, IDC_DEPARTURE_LOCATION, m_departure_location); - DDX_Check(pDX, IDC_REINFORCEMENT, m_reinforcement); - DDX_CBIndex(pDX, IDC_HOTKEY, m_hotkey); - DDX_Check(pDX, IDC_IGNORE_COUNT, m_ignore_count); - DDX_Text(pDX, IDC_ARRIVAL_DISTANCE, m_arrival_dist); - DDX_CBIndex(pDX, IDC_ARRIVAL_TARGET, m_arrival_target); - DDX_Check(pDX, IDC_NO_ARRIVAL_MUSIC, m_no_arrival_music); - DDX_CBIndex(pDX, IDC_DEPARTURE_TARGET, m_departure_target); - DDX_Check(pDX, IDC_NO_ARRIVAL_MESSAGE, m_no_arrival_message); - DDX_Check(pDX, IDC_NO_ARRIVAL_WARP, m_no_arrival_warp); - DDX_Check(pDX, IDC_NO_DEPARTURE_WARP, m_no_departure_warp); - DDX_Check(pDX, IDC_NO_DYNAMIC, m_no_dynamic); - //}}AFX_DATA_MAP - - if (pDX->m_bSaveAndValidate) { // get dialog control values - GetDlgItem(IDC_ARRIVAL_DELAY)->GetWindowText(str); - m_arrival_delay = atoi(str); - if (m_arrival_delay < 0) - m_arrival_delay = 0; - - GetDlgItem(IDC_DEPARTURE_DELAY)->GetWindowText(str); - m_departure_delay = atoi(str); - if (m_departure_delay < 0) - m_departure_delay = 0; - - GetDlgItem(IDC_WING_WAVES)->GetWindowText(str); - m_waves = atoi(str); - if (m_waves < 0) - m_waves = 0; - - GetDlgItem(IDC_WING_WAVE_THRESHOLD)->GetWindowText(str); - m_threshold = atoi(str); - if (m_threshold < 0) - m_threshold = 0; - - GetDlgItem(IDC_ARRIVAL_DELAY_MIN)->GetWindowText(str); - m_arrival_delay_min = atoi(str); - if (m_arrival_delay_min < 0) - m_arrival_delay_min = 0; - - GetDlgItem(IDC_ARRIVAL_DELAY_MAX)->GetWindowText(str); - m_arrival_delay_max = atoi(str); - if (m_arrival_delay_max < 0) - m_arrival_delay_max = 0; - - } else { - DDX_Text(pDX, IDC_ARRIVAL_DELAY, m_arrival_delay); - DDX_Text(pDX, IDC_DEPARTURE_DELAY, m_departure_delay); - DDX_Text(pDX, IDC_WING_WAVES, m_waves); - DDX_Text(pDX, IDC_WING_WAVE_THRESHOLD, m_threshold); - DDX_Text(pDX, IDC_ARRIVAL_DELAY_MIN, m_arrival_delay_min); - DDX_Text(pDX, IDC_ARRIVAL_DELAY_MAX, m_arrival_delay_max); - } -} - -BEGIN_MESSAGE_MAP(wing_editor, CDialog) - //{{AFX_MSG_MAP(wing_editor) - ON_WM_INITMENU() - ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_WAVES, OnDeltaposSpinWaves) - ON_NOTIFY(NM_RCLICK, IDC_ARRIVAL_TREE, OnRclickArrivalTree) - ON_NOTIFY(NM_RCLICK, IDC_DEPARTURE_TREE, OnRclickDepartureTree) - ON_NOTIFY(TVN_BEGINLABELEDIT, IDC_ARRIVAL_TREE, OnBeginlabeleditArrivalTree) - ON_NOTIFY(TVN_BEGINLABELEDIT, IDC_DEPARTURE_TREE, OnBeginlabeleditDepartureTree) - ON_NOTIFY(TVN_ENDLABELEDIT, IDC_ARRIVAL_TREE, OnEndlabeleditArrivalTree) - ON_NOTIFY(TVN_ENDLABELEDIT, IDC_DEPARTURE_TREE, OnEndlabeleditDepartureTree) - ON_BN_CLICKED(IDC_DELETE_WING, OnDeleteWing) - ON_BN_CLICKED(IDC_DISBAND_WING, OnDisbandWing) - ON_WM_CLOSE() - ON_BN_CLICKED(IDC_GOALS2, OnGoals2) - ON_BN_CLICKED(IDC_REINFORCEMENT, OnReinforcement) - ON_BN_CLICKED(IDC_NEXT, OnNext) - ON_NOTIFY(TVN_SELCHANGED, IDC_ARRIVAL_TREE, OnSelchangedArrivalTree) - ON_NOTIFY(TVN_SELCHANGED, IDC_DEPARTURE_TREE, OnSelchangedDepartureTree) - ON_BN_CLICKED(IDC_HIDE_CUES, OnHideCues) - ON_BN_CLICKED(IDC_PREV, OnPrev) - ON_CBN_SELCHANGE(IDC_ARRIVAL_LOCATION, OnSelchangeArrivalLocation) - ON_CBN_SELCHANGE(IDC_DEPARTURE_LOCATION, OnSelchangeDepartureLocation) - ON_CBN_SELCHANGE(IDC_HOTKEY, OnSelchangeHotkey) - ON_BN_CLICKED(IDC_WING_SQUAD_LOGO_BUTTON, OnSquadLogo) - ON_BN_CLICKED(IDC_RESTRICT_ARRIVAL, OnRestrictArrival) - ON_BN_CLICKED(IDC_RESTRICT_DEPARTURE, OnRestrictDeparture) - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// wing_editor message handlers - -BOOL wing_editor::Create() -{ - BOOL r; - int i; - CComboBox *box; - - r = CDialog::Create(IDD, Fred_main_wnd); - box = (CComboBox *) GetDlgItem(IDC_ARRIVAL_LOCATION); - box->ResetContent(); - for (i=0; iAddString(Arrival_location_names[i]); - - box = (CComboBox *) GetDlgItem(IDC_DEPARTURE_LOCATION); - box->ResetContent(); - for (i=0; iAddString(Departure_location_names[i]); - - m_hotkey = 0; - m_waves_spin.SetRange(1, 99); - m_arrival_tree.link_modified(&modified); // provide way to indicate trees are modified in dialog - m_arrival_tree.setup((CEdit *) GetDlgItem(IDC_HELP_BOX)); - m_departure_tree.link_modified(&modified); - m_departure_tree.setup(); - m_arrival_delay_spin.SetRange(0, 999); - m_departure_delay_spin.SetRange(0, 999); - - initialize_data(1); - return r; -} - -void wing_editor::OnInitMenu(CMenu* pMenu) -{ - CMenu *m; - - m = pMenu->GetSubMenu(0); - clear_menu(m); - generate_wing_popup_menu(m, ID_WING_MENU, MF_ENABLED); - if (cur_wing != -1) - m->CheckMenuItem(ID_WING_MENU + cur_wing, MF_BYCOMMAND | MF_CHECKED); - - CDialog::OnInitMenu(pMenu); -} - -void wing_editor::OnOK() -{ - HWND h; - CWnd *w; - - w = GetFocus(); - if (w) { - h = w->m_hWnd; - GetDlgItem(IDC_ARRIVAL_TREE)->SetFocus(); - ::SetFocus(h); - } -} - -void wing_editor::OnClose() -{ - if (verify() && (!bypass_errors)) { - SetWindowPos(&wndTop, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE); - bypass_errors = 0; - return; - } - - if (update_data()) { - SetWindowPos(&wndTop, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE); - bypass_errors = 0; - return; - } - - SetWindowPos(Fred_main_wnd, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_HIDEWINDOW); - Fred_main_wnd->SetWindowPos(&wndTop, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); -} - -// initialize everything that update_data_safe() saves. -void wing_editor::initialize_data_safe(int full_update) -{ - int i, enable = TRUE, player_wing = 0, player_enabled = 1; - CComboBox *arrival_box, *departure_box; - - nprintf(("Fred routing", "Wing dialog load safe\n")); - if (!GetSafeHwnd()) - return; - - arrival_box = (CComboBox *) GetDlgItem(IDC_ARRIVAL_TARGET); - departure_box = (CComboBox *)GetDlgItem(IDC_DEPARTURE_TARGET); - - m_ignore_count = 0; - if (cur_wing < 0) { - m_wing_squad_filename = _T(""); - m_special_ship = -1; - m_arrival_location = -1; - m_departure_location = -1; - m_arrival_delay = 0; - m_arrival_delay_min = 0; - m_arrival_delay_max = 0; - m_arrival_dist = 0; - m_arrival_target = -1; - m_departure_target = -1; - m_departure_delay = 0; - m_arrival_tree.clear_tree(); - m_departure_tree.clear_tree(); - m_arrival_tree.DeleteAllItems(); - m_departure_tree.DeleteAllItems(); - m_reinforcement = FALSE; - m_hotkey = 0; - m_ignore_count = 0; - m_no_arrival_music = 0; - m_no_arrival_message = 0; - m_no_arrival_warp = 0; - m_no_departure_warp = 0; - m_no_dynamic = 0; - player_enabled = enable = FALSE; - - } else { - CComboBox *ptr; - - if (The_mission.game_type & MISSION_TYPE_MULTI) - { - if (The_mission.game_type & MISSION_TYPE_MULTI_TEAMS) - { - for (i=0; i= 0) && (Player_start_shipnum < MAX_SHIPS) && (Ships[Player_start_shipnum].objnum >= 0)) - if (Ships[Player_start_shipnum].wingnum == cur_wing) - player_wing = 1; - - m_wing_squad_filename = _T(Wings[cur_wing].wing_squad_filename); - m_special_ship = Wings[cur_wing].special_ship; - m_waves = Wings[cur_wing].num_waves; - m_threshold = Wings[cur_wing].threshold; - m_arrival_location = Wings[cur_wing].arrival_location; - m_departure_location = Wings[cur_wing].departure_location; - m_arrival_delay = Wings[cur_wing].arrival_delay; - m_arrival_delay_min = Wings[cur_wing].wave_delay_min; - m_arrival_delay_max = Wings[cur_wing].wave_delay_max; - m_arrival_dist = Wings[cur_wing].arrival_distance; - m_arrival_target = Wings[cur_wing].arrival_anchor; - m_departure_target = Wings[cur_wing].departure_anchor; - m_no_dynamic = (Wings[cur_wing].flags & WF_NO_DYNAMIC)?1:0; - - // Add the ships/special items to the combo box here before data is updated - if ( m_arrival_location == ARRIVE_FROM_DOCK_BAY ) { - management_add_ships_to_combo( arrival_box, SHIPS_2_COMBO_DOCKING_BAY_ONLY ); - } else { - management_add_ships_to_combo( arrival_box, SHIPS_2_COMBO_SPECIAL | SHIPS_2_COMBO_ALL_SHIPS ); - } - - // Goober5000 - gah, this is ridiculous! Prior to this point in the function (and only in this function), - // m_arrival_target seems to refer to the arrival anchor. The rest of the time, it refers to the index - // of the drop-down list. - if (m_arrival_target >= 0) - { - if (m_arrival_target & SPECIAL_ARRIVAL_ANCHOR_FLAG) - { - // figure out what the box represents this as - char tmp[NAME_LENGTH + 15]; - stuff_special_arrival_anchor_name(tmp, m_arrival_target, 0); - - // find it in the box - m_arrival_target = arrival_box->FindStringExact(-1, tmp); - } - else - { - // find it in the box - m_arrival_target = arrival_box->FindStringExact(-1, Ships[m_arrival_target].ship_name); - } - } - - // add the ships to the departure target combo box - if ( m_departure_location == DEPART_AT_DOCK_BAY ) { - management_add_ships_to_combo( departure_box, SHIPS_2_COMBO_DOCKING_BAY_ONLY ); - } else { - departure_box->ResetContent(); - } - - if ( m_departure_target >= 0 ) - m_departure_target = departure_box->FindStringExact(-1, Ships[m_departure_target].ship_name); - - m_departure_delay = Wings[cur_wing].departure_delay; - if (player_wing) - m_arrival_tree.load_tree(Locked_sexp_true); - else - m_arrival_tree.load_tree(Wings[cur_wing].arrival_cue); - - m_departure_tree.load_tree(Wings[cur_wing].departure_cue, "false"); - m_hotkey = Wings[cur_wing].hotkey+1; - if (Wings[cur_wing].flags & WF_IGNORE_COUNT) - m_ignore_count = 1; - else - m_ignore_count = 0; - - if (Wings[cur_wing].flags & WF_NO_ARRIVAL_MUSIC) - m_no_arrival_music = 1; - else - m_no_arrival_music = 0; - - if ( Wings[cur_wing].flags & WF_NO_ARRIVAL_MESSAGE ) - m_no_arrival_message = 1; - else - m_no_arrival_message = 0; - - if ( Wings[cur_wing].flags & WF_NO_ARRIVAL_WARP ) - m_no_arrival_warp = 1; - else - m_no_arrival_warp = 0; - - if ( Wings[cur_wing].flags & WF_NO_DEPARTURE_WARP ) - m_no_departure_warp = 1; - else - m_no_departure_warp = 0; - - ptr = (CComboBox *) GetDlgItem(IDC_WING_SPECIAL_SHIP); - ptr->ResetContent(); - for (i=0; iAddString(Ships[Wings[cur_wing].ship_index[i]].ship_name); - - m_threshold_spin.SetRange(0, static_cast(calc_max_wave_treshold())); - for (i=0; iEnableWindow(enable); - GetDlgItem(IDC_WING_SQUAD_LOGO_BUTTON)->EnableWindow(enable); - GetDlgItem(IDC_WING_SPECIAL_SHIP)->EnableWindow(enable); - GetDlgItem(IDC_WING_WAVES)->EnableWindow(player_enabled); - GetDlgItem(IDC_WING_WAVE_THRESHOLD)->EnableWindow(player_enabled); - GetDlgItem(IDC_DISBAND_WING)->EnableWindow(enable); - GetDlgItem(IDC_SPIN_WAVES)->EnableWindow(player_enabled); - GetDlgItem(IDC_SPIN_WAVE_THRESHOLD)->EnableWindow(player_enabled); - GetDlgItem(IDC_ARRIVAL_LOCATION)->EnableWindow(enable); - - GetDlgItem(IDC_ARRIVAL_DELAY)->EnableWindow(player_enabled); - GetDlgItem(IDC_ARRIVAL_DELAY_MIN)->EnableWindow(player_enabled); - GetDlgItem(IDC_ARRIVAL_DELAY_MAX)->EnableWindow(player_enabled); - GetDlgItem(IDC_ARRIVAL_DELAY_SPIN)->EnableWindow(player_enabled); - if (m_arrival_location) { - GetDlgItem(IDC_ARRIVAL_DISTANCE)->EnableWindow(enable); - GetDlgItem(IDC_ARRIVAL_TARGET)->EnableWindow(enable); - } else { - GetDlgItem(IDC_ARRIVAL_DISTANCE)->EnableWindow(FALSE); - GetDlgItem(IDC_ARRIVAL_TARGET)->EnableWindow(FALSE); - } - if (m_arrival_location == ARRIVE_FROM_DOCK_BAY) { - GetDlgItem(IDC_RESTRICT_ARRIVAL)->EnableWindow(enable); - } else { - GetDlgItem(IDC_RESTRICT_ARRIVAL)->EnableWindow(FALSE); - } - GetDlgItem(IDC_NO_DYNAMIC)->EnableWindow(enable); - - if (m_departure_location) { - GetDlgItem(IDC_DEPARTURE_TARGET)->EnableWindow(enable); - } else { - GetDlgItem(IDC_DEPARTURE_TARGET)->EnableWindow(FALSE); - } - if (m_departure_location == DEPART_AT_DOCK_BAY) { - GetDlgItem(IDC_RESTRICT_DEPARTURE)->EnableWindow(enable); - } else { - GetDlgItem(IDC_RESTRICT_DEPARTURE)->EnableWindow(FALSE); - } - - if (player_wing) - GetDlgItem(IDC_ARRIVAL_TREE)->EnableWindow(0); - else - GetDlgItem(IDC_ARRIVAL_TREE)->EnableWindow(enable); - - GetDlgItem(IDC_DEPARTURE_LOCATION)->EnableWindow(enable); - GetDlgItem(IDC_DEPARTURE_DELAY)->EnableWindow(enable); - GetDlgItem(IDC_DEPARTURE_DELAY_SPIN)->EnableWindow(enable); - GetDlgItem(IDC_DEPARTURE_TREE)->EnableWindow(enable); - GetDlgItem(IDC_GOALS2)->EnableWindow(enable); - GetDlgItem(IDC_DELETE_WING)->EnableWindow(enable); - GetDlgItem(IDC_REINFORCEMENT)->EnableWindow(enable); - GetDlgItem(IDC_HOTKEY)->EnableWindow(enable); - GetDlgItem(IDC_IGNORE_COUNT)->EnableWindow(enable); - GetDlgItem(IDC_NO_ARRIVAL_MUSIC)->EnableWindow(enable); - GetDlgItem(IDC_NO_ARRIVAL_MESSAGE)->EnableWindow(enable); - GetDlgItem(IDC_NO_ARRIVAL_WARP)->EnableWindow(enable); - GetDlgItem(IDC_NO_DEPARTURE_WARP)->EnableWindow(enable); - - if (cur_wing >= 0) { - enable = TRUE; - - // check to see if the wing has a ship which is not a fighter/bomber type. If so, then disable - // the wing_waves and wing_threshold stuff - for (i = 0; i < Wings[cur_wing].wave_count; i++ ) { - int sflag; - - sflag = Ship_info[Ships[Wings[cur_wing].ship_index[i]].ship_info_index].flags; - if ( !(sflag & SIF_FIGHTER) && !(sflag & SIF_BOMBER) ) - enable = FALSE; - } - - } else - enable = FALSE; -} - -void wing_editor::initialize_data(int full_update) -{ - int i; - CWnd *w = NULL; - - nprintf(("Fred routing", "Wing dialog load\n")); - if (!GetSafeHwnd()) - return; - - m_arrival_tree.select_sexp_node = m_departure_tree.select_sexp_node = select_sexp_node; - select_sexp_node = -1; - if (cur_wing == -1) - m_wing_name = _T(""); - else - m_wing_name = _T(Wings[cur_wing].name); - - initialize_data_safe(full_update); - modified = 0; - if (w) - w -> SetFocus(); - - i = m_arrival_tree.select_sexp_node; - if (i != -1) { - w = GetDlgItem(IDC_ARRIVAL_TREE); - m_arrival_tree.hilite_item(i); - - } else { - i = m_departure_tree.select_sexp_node; - if (i != -1) { - w = GetDlgItem(IDC_DEPARTURE_TREE); - m_departure_tree.hilite_item(i); - } - } -} - -// 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); - - m_wing_name.TrimLeft(); - m_wing_name.TrimRight(); - - if (cur_wing >= 0) { - for (i=0; itype == OBJ_SHIP) || (ptr->type == OBJ_START)) { - 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_REINFORCEMENTS) && (m_reinforcement == 1)) - { - if (bypass_errors) - return 1; - - bypass_errors = 1; - - char error_message[256]; - sprintf(error_message, "Too many reinforcements; could not add wing '%s' to reinforcement list!", str); - MessageBox(error_message, "Error", MB_ICONEXCLAMATION | MB_OK); - - //clear the flag - m_reinforcement = 0; - UpdateData(FALSE); - - return -1; - - } - //Otherwise, just update as normal. - else 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; -} - -// update parts of wing that can't fail. This is useful if for when you need to change -// something in a wing that this updates elsewhere in Fred. Normally when auto-update -// kicks in, the changes you make will be wiped out by the auto=update, so instead you -// would call this function to update the wing, make your changes, and then call the -// initialize_data_safe() function to show your changes in the dialog -void wing_editor::update_data_safe() -{ - char buf[512]; - int i, d, hotkey = -1; - - nprintf(("Fred routing", "Wing dialog save safe\n")); - if (!GetSafeHwnd()) - return; - - UpdateData(TRUE); - UpdateData(TRUE); - - if (cur_wing < 0) - return; - - if (m_threshold > calc_max_wave_treshold()) { - m_threshold = calc_max_wave_treshold(); - if (!bypass_errors) { - sprintf(buf, "Wave threshold is set too high. Value has been lowered to %d", (int) m_threshold); - MessageBox(buf); - } - } - - if (m_waves < 1) { - m_waves = 1; - if (!bypass_errors) { - sprintf(buf, "Number of waves illegal. Can not have %d waves. Number of waves has as been set to 1.", (int) m_waves); - MessageBox(buf); - } - } - - MODIFY(Wings[cur_wing].special_ship, m_special_ship); - MODIFY(Wings[cur_wing].num_waves, m_waves); - MODIFY(Wings[cur_wing].threshold, m_threshold); - MODIFY(Wings[cur_wing].arrival_location, m_arrival_location); - MODIFY(Wings[cur_wing].departure_location, m_departure_location); - MODIFY(Wings[cur_wing].arrival_delay, m_arrival_delay); - if (m_arrival_delay_min > m_arrival_delay_max) { - if (!bypass_errors) { - sprintf(buf, "Arrival delay minimum greater than maximum. Value lowered to %d", m_arrival_delay_max); - MessageBox(buf); - } - - m_arrival_delay_min = m_arrival_delay_max; - } - - MODIFY(Wings[cur_wing].wave_delay_min, m_arrival_delay_min); - MODIFY(Wings[cur_wing].wave_delay_max, m_arrival_delay_max); - MODIFY(Wings[cur_wing].arrival_distance, m_arrival_dist); - if (m_arrival_target >= 0) { - i = ((CComboBox *) GetDlgItem(IDC_ARRIVAL_TARGET))->GetItemData(m_arrival_target); - MODIFY(Wings[cur_wing].arrival_anchor, i); - - // when arriving near or in front of a ship, be sure that we are far enough away from it!!! - if (((m_arrival_location != ARRIVE_AT_LOCATION) && (m_arrival_location != ARRIVE_FROM_DOCK_BAY)) && (i >= 0) && !(i & SPECIAL_ARRIVAL_ANCHOR_FLAG)) { - d = int(std::min(500.0f, 2.0f * Objects[Ships[i].objnum].radius)); - if ((Wings[cur_wing].arrival_distance < d) && (Wings[cur_wing].arrival_distance > -d)) { - if (!bypass_errors) { - sprintf(buf, "Ship must arrive at least %d meters away from target.\n" - "Value has been reset to this. Use with caution!\r\n" - "Recommended distance is %d meters.\r\n", d, (int)(2.0f * Objects[Ships[i].objnum].radius) ); - - MessageBox(buf); - } - - if (Wings[cur_wing].arrival_distance < 0) - Wings[cur_wing].arrival_distance = -d; - else - Wings[cur_wing].arrival_distance = d; - - m_arrival_dist = Wings[cur_wing].arrival_distance; - } - } - } - if (m_departure_target >= 0) { - i = ((CComboBox *) GetDlgItem(IDC_DEPARTURE_TARGET))->GetItemData(m_departure_target); - MODIFY(Wings[cur_wing].departure_anchor, i); - } - - MODIFY(Wings[cur_wing].departure_delay, m_departure_delay); - hotkey = m_hotkey - 1; - MODIFY(Wings[cur_wing].hotkey, hotkey); - if ( m_ignore_count ) { - if ( !(Wings[cur_wing].flags & WF_IGNORE_COUNT) ) - set_modified(); - Wings[cur_wing].flags |= WF_IGNORE_COUNT; - - } else { - if ( Wings[cur_wing].flags & WF_IGNORE_COUNT ) - set_modified(); - Wings[cur_wing].flags &= ~WF_IGNORE_COUNT; - } - - if ( m_no_arrival_music ) { - if ( !(Wings[cur_wing].flags & WF_NO_ARRIVAL_MUSIC) ) - set_modified(); - Wings[cur_wing].flags |= WF_NO_ARRIVAL_MUSIC; - - } else { - if ( Wings[cur_wing].flags & WF_NO_ARRIVAL_MUSIC ) - set_modified(); - Wings[cur_wing].flags &= ~WF_NO_ARRIVAL_MUSIC; - } - - // check the no message flag - if ( m_no_arrival_message ) { - if ( !(Wings[cur_wing].flags & WF_NO_ARRIVAL_MESSAGE) ) - set_modified(); - Wings[cur_wing].flags |= WF_NO_ARRIVAL_MESSAGE; - - } else { - if ( Wings[cur_wing].flags & WF_NO_ARRIVAL_MESSAGE ) - set_modified(); - Wings[cur_wing].flags &= ~WF_NO_ARRIVAL_MESSAGE; - } - - // set the no warp effect for wings flag - if ( m_no_arrival_warp ) { - if ( !(Wings[cur_wing].flags & WF_NO_ARRIVAL_WARP) ) - set_modified(); - Wings[cur_wing].flags |= WF_NO_ARRIVAL_WARP; - } else { - if ( Wings[cur_wing].flags & WF_NO_ARRIVAL_WARP ) - set_modified(); - Wings[cur_wing].flags &= ~WF_NO_ARRIVAL_WARP; - } - // set the no warp effect for wings flag - if ( m_no_departure_warp ) { - if ( !(Wings[cur_wing].flags & WF_NO_DEPARTURE_WARP) ) - set_modified(); - Wings[cur_wing].flags |= WF_NO_DEPARTURE_WARP; - } else { - if ( Wings[cur_wing].flags & WF_NO_DEPARTURE_WARP ) - set_modified(); - Wings[cur_wing].flags &= ~WF_NO_DEPARTURE_WARP; - } - - if ( m_no_dynamic ) { - if ( !(Wings[cur_wing].flags & WF_NO_DYNAMIC) ) - set_modified(); - Wings[cur_wing].flags |= WF_NO_DYNAMIC; - } else { - if ( Wings[cur_wing].flags & WF_NO_DYNAMIC ) - set_modified(); - Wings[cur_wing].flags &= ~WF_NO_DYNAMIC; - } - - if (Wings[cur_wing].arrival_cue >= 0) - free_sexp2(Wings[cur_wing].arrival_cue); - Wings[cur_wing].arrival_cue = m_arrival_tree.save_tree(); - - if (Wings[cur_wing].departure_cue >= 0) - free_sexp2(Wings[cur_wing].departure_cue); - Wings[cur_wing].departure_cue = m_departure_tree.save_tree(); - - // copy squad stuff - if(stricmp(m_wing_squad_filename, Wings[cur_wing].wing_squad_filename)) - { - string_copy(Wings[cur_wing].wing_squad_filename, m_wing_squad_filename, MAX_FILENAME_LEN); - set_modified(); - } - - if (modified) - set_modified(); -} - -BOOL wing_editor::OnCommand(WPARAM wParam, LPARAM lParam) -{ - int id, wing; - - id = LOWORD(wParam); - if (id >= ID_WING_MENU && id < ID_WING_MENU + MAX_WINGS) { - if (!update_data()) { - wing = id - ID_WING_MENU; - mark_wing(wing); - return 1; - } - } - - return CDialog::OnCommand(wParam, lParam); -} - -void wing_editor::OnDeltaposSpinWaves(NMHDR* pNMHDR, LRESULT* pResult) -{ - int new_pos; - NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR; - - new_pos = pNMUpDown->iPos + pNMUpDown->iDelta; - if (new_pos > 0 && new_pos < 100) { - *pResult = 0; - modified = 1; - - } else - *pResult = 1; -} - -void wing_editor::OnRclickArrivalTree(NMHDR* pNMHDR, LRESULT* pResult) -{ - m_arrival_tree.right_clicked(); - *pResult = 0; -} - -void wing_editor::OnRclickDepartureTree(NMHDR* pNMHDR, LRESULT* pResult) -{ - m_departure_tree.right_clicked(); - *pResult = 0; -} - -void wing_editor::OnBeginlabeleditArrivalTree(NMHDR* pNMHDR, LRESULT* pResult) -{ - TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR; - - if (m_arrival_tree.edit_label(pTVDispInfo->item.hItem) == 1) { - *pResult = 0; - modified = 1; - - } else - *pResult = 1; -} - -void wing_editor::OnBeginlabeleditDepartureTree(NMHDR* pNMHDR, LRESULT* pResult) -{ - TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR; - - if (m_departure_tree.edit_label(pTVDispInfo->item.hItem) == 1) { - *pResult = 0; - modified = 1; - - } else - *pResult = 1; -} - -void wing_editor::OnEndlabeleditArrivalTree(NMHDR* pNMHDR, LRESULT* pResult) -{ - TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR; - - *pResult = m_arrival_tree.end_label_edit(pTVDispInfo->item); -} - -void wing_editor::OnEndlabeleditDepartureTree(NMHDR* pNMHDR, LRESULT* pResult) -{ - TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR; - - *pResult = m_departure_tree.end_label_edit(pTVDispInfo->item); -} - -int wing_editor::verify() -{ - nprintf(("Fred routing", "Wing dialog verify\n")); - if (!GetSafeHwnd() || !modified) - return 0; - - if (bypass_errors) - return 1; - - return 0; -} - -// delete wing and all ships that are part of the wing -void wing_editor::OnDeleteWing() -{ - modified = 0; // no need to run update checks, since wing will be gone shortly anyway. - delete_wing(cur_wing); -} - -// delete wing, but leave ships intact and wingless -void wing_editor::OnDisbandWing() -{ - modified = 0; // no need to run update checks, since wing will be gone shortly anyway. - remove_wing(cur_wing); -} - -void wing_editor::OnGoals2() -{ - ShipGoalsDlg dlg_goals; - - Assert(cur_wing != -1); - dlg_goals.self_wing = cur_wing; - dlg_goals.DoModal(); - if (query_initial_orders_conflict(cur_wing)) - MessageBox("One or more ships of this wing also has initial orders", - "Possible conflict"); -} - -void wing_editor::OnReinforcement() -{ - UpdateData(TRUE); - UpdateData(TRUE); - //if (m_reinforcement) - // m_arrival_tree.clear_tree("false"); -} - -void wing_editor::OnPrev() -{ - int wing, count = 0; - - if (!update_data() && Num_wings) { - wing = cur_wing - 1; - if (wing < 0) - wing = MAX_WINGS - 1; - - while (!Wings[wing].wave_count) { - wing--; - if (count++ > MAX_WINGS) - return; - - if (wing < 0) - wing = MAX_WINGS - 1; - } - - mark_wing(wing); - Wing_editor_dialog.initialize_data(1); - Update_wing = 0; - } - - return; -} - -void wing_editor::OnNext() -{ - int wing, count = 0; - - if (!update_data() && Num_wings) { - wing = cur_wing + 1; - if (wing >= MAX_WINGS) - wing = 0; - - while (!Wings[wing].wave_count) { - wing++; - if (count++ > MAX_WINGS) - return; - - if (wing >= MAX_WINGS) - wing = 0; - } - - mark_wing(wing); - Wing_editor_dialog.initialize_data(1); - Update_wing = 0; - } - - return; -} - -void wing_editor::OnSelchangedArrivalTree(NMHDR* pNMHDR, LRESULT* pResult) -{ - HTREEITEM h; - - NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; - h = pNMTreeView->itemNew.hItem; - if (h) - m_arrival_tree.update_help(h); - - *pResult = 0; -} - -void wing_editor::OnSelchangedDepartureTree(NMHDR* pNMHDR, LRESULT* pResult) -{ - HTREEITEM h; - - NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; - h = pNMTreeView->itemNew.hItem; - if (h) - m_departure_tree.update_help(h); - - *pResult = 0; -} - -void wing_editor::calc_cue_height() -{ - CRect cue; - - GetDlgItem(IDC_CUE_FRAME)->GetWindowRect(cue); - cue_height = cue.bottom - cue.top + 10; - if (Show_sexp_help) - cue_height += SEXP_HELP_BOX_SIZE; - - if (Hide_wing_cues) { - ((CButton *) GetDlgItem(IDC_HIDE_CUES)) -> SetCheck(1); - OnHideCues(); - } -} - -void wing_editor::show_hide_sexp_help() -{ - CRect rect; - - if (Show_sexp_help) - cue_height += SEXP_HELP_BOX_SIZE; - else - cue_height -= SEXP_HELP_BOX_SIZE; - - if (((CButton *) GetDlgItem(IDC_HIDE_CUES)) -> GetCheck()) - return; - - GetWindowRect(rect); - if (Show_sexp_help) - rect.bottom += SEXP_HELP_BOX_SIZE; - else - rect.bottom -= SEXP_HELP_BOX_SIZE; - - MoveWindow(rect); -} - -void wing_editor::OnHideCues() -{ - CRect rect; - - GetWindowRect(rect); - if (((CButton *) GetDlgItem(IDC_HIDE_CUES)) -> GetCheck()) { - rect.bottom -= cue_height; - Hide_wing_cues = 1; - - } else { - rect.bottom += cue_height; - Hide_wing_cues = 0; - } - - MoveWindow(rect); -} - -void wing_editor::OnSelchangeArrivalLocation() -{ - CComboBox *box; - - box = (CComboBox *)GetDlgItem(IDC_ARRIVAL_TARGET); - UpdateData(); - if (m_arrival_location) { - GetDlgItem(IDC_ARRIVAL_DISTANCE)->EnableWindow(TRUE); - GetDlgItem(IDC_ARRIVAL_TARGET)->EnableWindow(TRUE); - if (m_arrival_target < 0) { - m_arrival_target = 0; - } - - // determine which items we should put into the arrival target combo box - if ( m_arrival_location == ARRIVE_FROM_DOCK_BAY ) { - management_add_ships_to_combo( box, SHIPS_2_COMBO_DOCKING_BAY_ONLY ); - } else { - management_add_ships_to_combo( box, SHIPS_2_COMBO_SPECIAL | SHIPS_2_COMBO_ALL_SHIPS ); - } - } else { - m_arrival_target = -1; - GetDlgItem(IDC_ARRIVAL_DISTANCE)->EnableWindow(FALSE); - GetDlgItem(IDC_ARRIVAL_TARGET)->EnableWindow(FALSE); - } - - if (m_arrival_location == ARRIVE_FROM_DOCK_BAY) { - GetDlgItem(IDC_RESTRICT_ARRIVAL)->EnableWindow(TRUE); - } else { - GetDlgItem(IDC_RESTRICT_ARRIVAL)->EnableWindow(FALSE); - } - - UpdateData(FALSE); -} - -void wing_editor::OnSelchangeDepartureLocation() -{ - CComboBox *box; - - box = (CComboBox *)GetDlgItem(IDC_DEPARTURE_TARGET); - UpdateData(); - if (m_departure_location) { - GetDlgItem(IDC_DEPARTURE_TARGET)->EnableWindow(TRUE); - if (m_departure_target < 0) { - m_departure_target = 0; - } - // we need to build up the list box content based on the departure type. When - // from a docking bay, only show ships in the list which have them. Show all ships otherwise - if ( m_departure_location == DEPART_AT_DOCK_BAY ) { - management_add_ships_to_combo( box, SHIPS_2_COMBO_DOCKING_BAY_ONLY ); - } else { - // I think that this section is currently illegal - Int3(); - } - } else { - m_departure_target = -1; - GetDlgItem(IDC_DEPARTURE_TARGET)->EnableWindow(FALSE); - } - - if (m_departure_location == DEPART_AT_DOCK_BAY) { - GetDlgItem(IDC_RESTRICT_DEPARTURE)->EnableWindow(TRUE); - } else { - GetDlgItem(IDC_RESTRICT_DEPARTURE)->EnableWindow(FALSE); - } - - UpdateData(FALSE); -} - -// see if hotkey should possibly be reserved for player starting wing -void wing_editor::OnSelchangeHotkey() -{ - char buf[256]; - int set_num, i; - - UpdateData(TRUE); - set_num = m_hotkey - 1; // hotkey sets are 1 index based - - // first, determine if we are currently working with a starting wing - for ( i = 0; i < MAX_STARTING_WINGS; i++ ) { - if ( !stricmp( Wings[cur_wing].name, Starting_wing_names[i]) ) - break; - } - if ( i == MAX_STARTING_WINGS ) - return; - - // we have a player starting wing. See if we assigned a non-standard hotkey - if ( (set_num >= MAX_STARTING_WINGS) || (set_num != i) ) { - sprintf(buf, "Assigning nonstandard hotkey to wing %s (default is F%d)", Wings[cur_wing].name, 5+i); - MessageBox(buf, NULL, MB_OK | MB_ICONEXCLAMATION ); - } -} - -void wing_editor::OnSquadLogo() -{ - int z; - char *Logo_ext = "Image Files (*.dds, *.pcx)|*.dds;*.pcx|" - "DDS Files (*.dds)|*.dds|" - "PCX Files (*.pcx)|*.pcx|" - "All Files (*.*)|*.*|" - "|"; - - //phreak 05/05/2003 - //this needs to be here or else the data in the wing editor dialog will revert - //to what it was before it was opened. - UpdateData(TRUE); - - // get list of squad images - z = cfile_push_chdir(CF_TYPE_SQUAD_IMAGES); - CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR, Logo_ext); - - // if we have a result - if (dlg.DoModal() == IDOK) { - m_wing_squad_filename = dlg.GetFileName(); - } else { - m_wing_squad_filename = _T(""); - } - UpdateData(FALSE); - - // restore directory - if (!z){ - cfile_pop_dir(); - } -} - -// Goober5000 -void wing_editor::OnRestrictArrival() -{ - int arrive_from_ship; - CComboBox *box; - restrict_paths dlg; - - // grab stuff from GUI - UpdateData(TRUE); - - if (m_arrival_location != ARRIVE_FROM_DOCK_BAY) - { - Int3(); - return; - } - - box = (CComboBox *) GetDlgItem(IDC_ARRIVAL_TARGET); - if (box->GetCount() == 0) - return; - - arrive_from_ship = box->GetItemData(m_arrival_target); - - if (!ship_has_dock_bay(arrive_from_ship)) - { - Int3(); - return; - } - - dlg.m_arrival = true; - dlg.m_ship_class = Ships[arrive_from_ship].ship_info_index; - dlg.m_path_mask = &Wings[cur_wing].arrival_path_mask; - - dlg.DoModal(); -} - -// Goober5000 -void wing_editor::OnRestrictDeparture() -{ - int depart_to_ship; - CComboBox *box; - restrict_paths dlg; - - // grab stuff from GUI - UpdateData(TRUE); - - if (m_departure_location != DEPART_AT_DOCK_BAY) - { - Int3(); - return; - } - - box = (CComboBox *) GetDlgItem(IDC_DEPARTURE_TARGET); - if (box->GetCount() == 0) - return; - - depart_to_ship = box->GetItemData(m_departure_target); - - if (!ship_has_dock_bay(depart_to_ship)) - { - Int3(); - return; - } - - dlg.m_arrival = false; - dlg.m_ship_class = Ships[depart_to_ship].ship_info_index; - dlg.m_path_mask = &Wings[cur_wing].departure_path_mask; - - dlg.DoModal(); +/* + * Copyright (C) Volition, Inc. 1999. All rights reserved. + * + * All source code herein is the property of Volition, Inc. You may not sell + * or otherwise commercially exploit the source or things you created based on the + * source. + * +*/ + + + +#include "stdafx.h" +#include "MainFrm.h" +#include "FRED.h" +#include "FREDDoc.h" +#include "Management.h" +#include "wing.h" +#include "globalincs/linklist.h" +#include "ai/aigoals.h" +#include "FREDView.h" +#include "starfield/starfield.h" +#include "jumpnode/jumpnode.h" +#include "cfile/cfile.h" +#include "restrictpaths.h" +#include "iff_defs/iff_defs.h" + +#define ID_WING_MENU 9000 + +#ifdef _DEBUG +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// wing_editor dialog + +wing_editor::wing_editor(CWnd* pParent /*=NULL*/) + : CDialog(wing_editor::IDD, pParent) +{ + //{{AFX_DATA_INIT(wing_editor) + m_wing_name = _T(""); + m_wing_squad_filename = _T(""); + m_special_ship = -1; + m_waves = 0; + m_threshold = 0; + m_arrival_location = -1; + m_departure_location = -1; + m_arrival_delay = 0; + m_departure_delay = 0; + m_reinforcement = FALSE; + m_hotkey = -1; + m_ignore_count = FALSE; + m_arrival_delay_max = 0; + m_arrival_delay_min = 0; + m_arrival_dist = 0; + m_arrival_target = -1; + m_no_arrival_music = FALSE; + m_departure_target = -1; + m_no_arrival_message = FALSE; + m_no_arrival_warp = FALSE; + m_no_departure_warp = FALSE; + m_no_dynamic = FALSE; + //}}AFX_DATA_INIT + modified = 0; + select_sexp_node = -1; + bypass_errors = 0; +} + +void wing_editor::DoDataExchange(CDataExchange* pDX) +{ + CString str; + + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(wing_editor) + DDX_Control(pDX, IDC_DEPARTURE_DELAY_SPIN, m_departure_delay_spin); + DDX_Control(pDX, IDC_ARRIVAL_DELAY_SPIN, m_arrival_delay_spin); + DDX_Control(pDX, IDC_DEPARTURE_TREE, m_departure_tree); + DDX_Control(pDX, IDC_ARRIVAL_TREE, m_arrival_tree); + DDX_Control(pDX, IDC_SPIN_WAVE_THRESHOLD, m_threshold_spin); + DDX_Control(pDX, IDC_SPIN_WAVES, m_waves_spin); + DDX_Text(pDX, IDC_WING_NAME, m_wing_name); + DDX_Text(pDX, IDC_WING_SQUAD_LOGO, m_wing_squad_filename); + DDX_CBIndex(pDX, IDC_WING_SPECIAL_SHIP, m_special_ship); + DDX_CBIndex(pDX, IDC_ARRIVAL_LOCATION, m_arrival_location); + DDX_CBIndex(pDX, IDC_DEPARTURE_LOCATION, m_departure_location); + DDX_Check(pDX, IDC_REINFORCEMENT, m_reinforcement); + DDX_CBIndex(pDX, IDC_HOTKEY, m_hotkey); + DDX_Check(pDX, IDC_IGNORE_COUNT, m_ignore_count); + DDX_Text(pDX, IDC_ARRIVAL_DISTANCE, m_arrival_dist); + DDX_CBIndex(pDX, IDC_ARRIVAL_TARGET, m_arrival_target); + DDX_Check(pDX, IDC_NO_ARRIVAL_MUSIC, m_no_arrival_music); + DDX_CBIndex(pDX, IDC_DEPARTURE_TARGET, m_departure_target); + DDX_Check(pDX, IDC_NO_ARRIVAL_MESSAGE, m_no_arrival_message); + DDX_Check(pDX, IDC_NO_ARRIVAL_WARP, m_no_arrival_warp); + DDX_Check(pDX, IDC_NO_DEPARTURE_WARP, m_no_departure_warp); + DDX_Check(pDX, IDC_NO_DYNAMIC, m_no_dynamic); + //}}AFX_DATA_MAP + + if (pDX->m_bSaveAndValidate) { // get dialog control values + GetDlgItem(IDC_ARRIVAL_DELAY)->GetWindowText(str); + m_arrival_delay = atoi(str); + if (m_arrival_delay < 0) + m_arrival_delay = 0; + + GetDlgItem(IDC_DEPARTURE_DELAY)->GetWindowText(str); + m_departure_delay = atoi(str); + if (m_departure_delay < 0) + m_departure_delay = 0; + + GetDlgItem(IDC_WING_WAVES)->GetWindowText(str); + m_waves = atoi(str); + if (m_waves < 0) + m_waves = 0; + + GetDlgItem(IDC_WING_WAVE_THRESHOLD)->GetWindowText(str); + m_threshold = atoi(str); + if (m_threshold < 0) + m_threshold = 0; + + GetDlgItem(IDC_ARRIVAL_DELAY_MIN)->GetWindowText(str); + m_arrival_delay_min = atoi(str); + if (m_arrival_delay_min < 0) + m_arrival_delay_min = 0; + + GetDlgItem(IDC_ARRIVAL_DELAY_MAX)->GetWindowText(str); + m_arrival_delay_max = atoi(str); + if (m_arrival_delay_max < 0) + m_arrival_delay_max = 0; + + } else { + DDX_Text(pDX, IDC_ARRIVAL_DELAY, m_arrival_delay); + DDX_Text(pDX, IDC_DEPARTURE_DELAY, m_departure_delay); + DDX_Text(pDX, IDC_WING_WAVES, m_waves); + DDX_Text(pDX, IDC_WING_WAVE_THRESHOLD, m_threshold); + DDX_Text(pDX, IDC_ARRIVAL_DELAY_MIN, m_arrival_delay_min); + DDX_Text(pDX, IDC_ARRIVAL_DELAY_MAX, m_arrival_delay_max); + } +} + +BEGIN_MESSAGE_MAP(wing_editor, CDialog) + //{{AFX_MSG_MAP(wing_editor) + ON_WM_INITMENU() + ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_WAVES, OnDeltaposSpinWaves) + ON_NOTIFY(NM_RCLICK, IDC_ARRIVAL_TREE, OnRclickArrivalTree) + ON_NOTIFY(NM_RCLICK, IDC_DEPARTURE_TREE, OnRclickDepartureTree) + ON_NOTIFY(TVN_BEGINLABELEDIT, IDC_ARRIVAL_TREE, OnBeginlabeleditArrivalTree) + ON_NOTIFY(TVN_BEGINLABELEDIT, IDC_DEPARTURE_TREE, OnBeginlabeleditDepartureTree) + ON_NOTIFY(TVN_ENDLABELEDIT, IDC_ARRIVAL_TREE, OnEndlabeleditArrivalTree) + ON_NOTIFY(TVN_ENDLABELEDIT, IDC_DEPARTURE_TREE, OnEndlabeleditDepartureTree) + ON_BN_CLICKED(IDC_DELETE_WING, OnDeleteWing) + ON_BN_CLICKED(IDC_DISBAND_WING, OnDisbandWing) + ON_WM_CLOSE() + ON_BN_CLICKED(IDC_GOALS2, OnGoals2) + ON_BN_CLICKED(IDC_REINFORCEMENT, OnReinforcement) + ON_BN_CLICKED(IDC_NEXT, OnNext) + ON_NOTIFY(TVN_SELCHANGED, IDC_ARRIVAL_TREE, OnSelchangedArrivalTree) + ON_NOTIFY(TVN_SELCHANGED, IDC_DEPARTURE_TREE, OnSelchangedDepartureTree) + ON_BN_CLICKED(IDC_HIDE_CUES, OnHideCues) + ON_BN_CLICKED(IDC_PREV, OnPrev) + ON_CBN_SELCHANGE(IDC_ARRIVAL_LOCATION, OnSelchangeArrivalLocation) + ON_CBN_SELCHANGE(IDC_DEPARTURE_LOCATION, OnSelchangeDepartureLocation) + ON_CBN_SELCHANGE(IDC_HOTKEY, OnSelchangeHotkey) + ON_BN_CLICKED(IDC_WING_SQUAD_LOGO_BUTTON, OnSquadLogo) + ON_BN_CLICKED(IDC_RESTRICT_ARRIVAL, OnRestrictArrival) + ON_BN_CLICKED(IDC_RESTRICT_DEPARTURE, OnRestrictDeparture) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// wing_editor message handlers + +BOOL wing_editor::Create() +{ + BOOL r; + int i; + CComboBox *box; + + r = CDialog::Create(IDD, Fred_main_wnd); + box = (CComboBox *) GetDlgItem(IDC_ARRIVAL_LOCATION); + box->ResetContent(); + for (i=0; iAddString(Arrival_location_names[i]); + + box = (CComboBox *) GetDlgItem(IDC_DEPARTURE_LOCATION); + box->ResetContent(); + for (i=0; iAddString(Departure_location_names[i]); + + m_hotkey = 0; + m_waves_spin.SetRange(1, 99); + m_arrival_tree.link_modified(&modified); // provide way to indicate trees are modified in dialog + m_arrival_tree.setup((CEdit *) GetDlgItem(IDC_HELP_BOX)); + m_departure_tree.link_modified(&modified); + m_departure_tree.setup(); + m_arrival_delay_spin.SetRange(0, 999); + m_departure_delay_spin.SetRange(0, 999); + + initialize_data(1); + return r; +} + +void wing_editor::OnInitMenu(CMenu* pMenu) +{ + CMenu *m; + + m = pMenu->GetSubMenu(0); + clear_menu(m); + generate_wing_popup_menu(m, ID_WING_MENU, MF_ENABLED); + if (cur_wing != -1) + m->CheckMenuItem(ID_WING_MENU + cur_wing, MF_BYCOMMAND | MF_CHECKED); + + CDialog::OnInitMenu(pMenu); +} + +void wing_editor::OnOK() +{ + HWND h; + CWnd *w; + + w = GetFocus(); + if (w) { + h = w->m_hWnd; + GetDlgItem(IDC_ARRIVAL_TREE)->SetFocus(); + ::SetFocus(h); + } +} + +void wing_editor::OnClose() +{ + if (verify() && (!bypass_errors)) { + SetWindowPos(&wndTop, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE); + bypass_errors = 0; + return; + } + + if (update_data()) { + SetWindowPos(&wndTop, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE); + bypass_errors = 0; + return; + } + + SetWindowPos(Fred_main_wnd, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_HIDEWINDOW); + Fred_main_wnd->SetWindowPos(&wndTop, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); +} + +// initialize everything that update_data_safe() saves. +void wing_editor::initialize_data_safe(int full_update) +{ + int i, enable = TRUE, player_wing = 0, player_enabled = 1; + CComboBox *arrival_box, *departure_box; + + nprintf(("Fred routing", "Wing dialog load safe\n")); + if (!GetSafeHwnd()) + return; + + arrival_box = (CComboBox *) GetDlgItem(IDC_ARRIVAL_TARGET); + departure_box = (CComboBox *)GetDlgItem(IDC_DEPARTURE_TARGET); + + m_ignore_count = 0; + if (cur_wing < 0) { + m_wing_squad_filename = _T(""); + m_special_ship = -1; + m_arrival_location = -1; + m_departure_location = -1; + m_arrival_delay = 0; + m_arrival_delay_min = 0; + m_arrival_delay_max = 0; + m_arrival_dist = 0; + m_arrival_target = -1; + m_departure_target = -1; + m_departure_delay = 0; + m_arrival_tree.clear_tree(); + m_departure_tree.clear_tree(); + m_arrival_tree.DeleteAllItems(); + m_departure_tree.DeleteAllItems(); + m_reinforcement = FALSE; + m_hotkey = 0; + m_ignore_count = 0; + m_no_arrival_music = 0; + m_no_arrival_message = 0; + m_no_arrival_warp = 0; + m_no_departure_warp = 0; + m_no_dynamic = 0; + player_enabled = enable = FALSE; + + } else { + CComboBox *ptr; + + if (The_mission.game_type & MISSION_TYPE_MULTI) + { + if (The_mission.game_type & MISSION_TYPE_MULTI_TEAMS) + { + for (i=0; i= 0) && (Player_start_shipnum < MAX_SHIPS) && (Ships[Player_start_shipnum].objnum >= 0)) + if (Ships[Player_start_shipnum].wingnum == cur_wing) + player_wing = 1; + + m_wing_squad_filename = _T(Wings[cur_wing].wing_squad_filename); + m_special_ship = Wings[cur_wing].special_ship; + m_waves = Wings[cur_wing].num_waves; + m_threshold = Wings[cur_wing].threshold; + m_arrival_location = Wings[cur_wing].arrival_location; + m_departure_location = Wings[cur_wing].departure_location; + m_arrival_delay = Wings[cur_wing].arrival_delay; + m_arrival_delay_min = Wings[cur_wing].wave_delay_min; + m_arrival_delay_max = Wings[cur_wing].wave_delay_max; + m_arrival_dist = Wings[cur_wing].arrival_distance; + m_arrival_target = Wings[cur_wing].arrival_anchor; + m_departure_target = Wings[cur_wing].departure_anchor; + m_no_dynamic = (Wings[cur_wing].flags & WF_NO_DYNAMIC)?1:0; + + // Add the ships/special items to the combo box here before data is updated + if ( m_arrival_location == ARRIVE_FROM_DOCK_BAY ) { + management_add_ships_to_combo( arrival_box, SHIPS_2_COMBO_DOCKING_BAY_ONLY ); + } else { + management_add_ships_to_combo( arrival_box, SHIPS_2_COMBO_SPECIAL | SHIPS_2_COMBO_ALL_SHIPS ); + } + + // Goober5000 - gah, this is ridiculous! Prior to this point in the function (and only in this function), + // m_arrival_target seems to refer to the arrival anchor. The rest of the time, it refers to the index + // of the drop-down list. + if (m_arrival_target >= 0) + { + if (m_arrival_target & SPECIAL_ARRIVAL_ANCHOR_FLAG) + { + // figure out what the box represents this as + char tmp[NAME_LENGTH + 15]; + stuff_special_arrival_anchor_name(tmp, m_arrival_target, 0); + + // find it in the box + m_arrival_target = arrival_box->FindStringExact(-1, tmp); + } + else + { + // find it in the box + m_arrival_target = arrival_box->FindStringExact(-1, Ships[m_arrival_target].ship_name); + } + } + + // add the ships to the departure target combo box + if ( m_departure_location == DEPART_AT_DOCK_BAY ) { + management_add_ships_to_combo( departure_box, SHIPS_2_COMBO_DOCKING_BAY_ONLY ); + } else { + departure_box->ResetContent(); + } + + if ( m_departure_target >= 0 ) + m_departure_target = departure_box->FindStringExact(-1, Ships[m_departure_target].ship_name); + + m_departure_delay = Wings[cur_wing].departure_delay; + if (player_wing) + m_arrival_tree.load_tree(Locked_sexp_true); + else + m_arrival_tree.load_tree(Wings[cur_wing].arrival_cue); + + m_departure_tree.load_tree(Wings[cur_wing].departure_cue, "false"); + m_hotkey = Wings[cur_wing].hotkey+1; + if (Wings[cur_wing].flags & WF_IGNORE_COUNT) + m_ignore_count = 1; + else + m_ignore_count = 0; + + if (Wings[cur_wing].flags & WF_NO_ARRIVAL_MUSIC) + m_no_arrival_music = 1; + else + m_no_arrival_music = 0; + + if ( Wings[cur_wing].flags & WF_NO_ARRIVAL_MESSAGE ) + m_no_arrival_message = 1; + else + m_no_arrival_message = 0; + + if ( Wings[cur_wing].flags & WF_NO_ARRIVAL_WARP ) + m_no_arrival_warp = 1; + else + m_no_arrival_warp = 0; + + if ( Wings[cur_wing].flags & WF_NO_DEPARTURE_WARP ) + m_no_departure_warp = 1; + else + m_no_departure_warp = 0; + + ptr = (CComboBox *) GetDlgItem(IDC_WING_SPECIAL_SHIP); + ptr->ResetContent(); + for (i=0; iAddString(Ships[Wings[cur_wing].ship_index[i]].ship_name); + + m_threshold_spin.SetRange(0, static_cast(calc_max_wave_treshold())); + for (i=0; iEnableWindow(enable); + GetDlgItem(IDC_WING_SQUAD_LOGO_BUTTON)->EnableWindow(enable); + GetDlgItem(IDC_WING_SPECIAL_SHIP)->EnableWindow(enable); + GetDlgItem(IDC_WING_WAVES)->EnableWindow(player_enabled); + GetDlgItem(IDC_WING_WAVE_THRESHOLD)->EnableWindow(player_enabled); + GetDlgItem(IDC_DISBAND_WING)->EnableWindow(enable); + GetDlgItem(IDC_SPIN_WAVES)->EnableWindow(player_enabled); + GetDlgItem(IDC_SPIN_WAVE_THRESHOLD)->EnableWindow(player_enabled); + GetDlgItem(IDC_ARRIVAL_LOCATION)->EnableWindow(enable); + + GetDlgItem(IDC_ARRIVAL_DELAY)->EnableWindow(player_enabled); + GetDlgItem(IDC_ARRIVAL_DELAY_MIN)->EnableWindow(player_enabled); + GetDlgItem(IDC_ARRIVAL_DELAY_MAX)->EnableWindow(player_enabled); + GetDlgItem(IDC_ARRIVAL_DELAY_SPIN)->EnableWindow(player_enabled); + if (m_arrival_location) { + GetDlgItem(IDC_ARRIVAL_DISTANCE)->EnableWindow(enable); + GetDlgItem(IDC_ARRIVAL_TARGET)->EnableWindow(enable); + } else { + GetDlgItem(IDC_ARRIVAL_DISTANCE)->EnableWindow(FALSE); + GetDlgItem(IDC_ARRIVAL_TARGET)->EnableWindow(FALSE); + } + if (m_arrival_location == ARRIVE_FROM_DOCK_BAY) { + GetDlgItem(IDC_RESTRICT_ARRIVAL)->EnableWindow(enable); + } else { + GetDlgItem(IDC_RESTRICT_ARRIVAL)->EnableWindow(FALSE); + } + GetDlgItem(IDC_NO_DYNAMIC)->EnableWindow(enable); + + if (m_departure_location) { + GetDlgItem(IDC_DEPARTURE_TARGET)->EnableWindow(enable); + } else { + GetDlgItem(IDC_DEPARTURE_TARGET)->EnableWindow(FALSE); + } + if (m_departure_location == DEPART_AT_DOCK_BAY) { + GetDlgItem(IDC_RESTRICT_DEPARTURE)->EnableWindow(enable); + } else { + GetDlgItem(IDC_RESTRICT_DEPARTURE)->EnableWindow(FALSE); + } + + if (player_wing) + GetDlgItem(IDC_ARRIVAL_TREE)->EnableWindow(0); + else + GetDlgItem(IDC_ARRIVAL_TREE)->EnableWindow(enable); + + GetDlgItem(IDC_DEPARTURE_LOCATION)->EnableWindow(enable); + GetDlgItem(IDC_DEPARTURE_DELAY)->EnableWindow(enable); + GetDlgItem(IDC_DEPARTURE_DELAY_SPIN)->EnableWindow(enable); + GetDlgItem(IDC_DEPARTURE_TREE)->EnableWindow(enable); + GetDlgItem(IDC_GOALS2)->EnableWindow(enable); + GetDlgItem(IDC_DELETE_WING)->EnableWindow(enable); + GetDlgItem(IDC_REINFORCEMENT)->EnableWindow(enable); + GetDlgItem(IDC_HOTKEY)->EnableWindow(enable); + GetDlgItem(IDC_IGNORE_COUNT)->EnableWindow(enable); + GetDlgItem(IDC_NO_ARRIVAL_MUSIC)->EnableWindow(enable); + GetDlgItem(IDC_NO_ARRIVAL_MESSAGE)->EnableWindow(enable); + GetDlgItem(IDC_NO_ARRIVAL_WARP)->EnableWindow(enable); + GetDlgItem(IDC_NO_DEPARTURE_WARP)->EnableWindow(enable); + + if (cur_wing >= 0) { + enable = TRUE; + + // check to see if the wing has a ship which is not a fighter/bomber type. If so, then disable + // the wing_waves and wing_threshold stuff + for (i = 0; i < Wings[cur_wing].wave_count; i++ ) { + if ( !(Ship_info[Ships[Wings[cur_wing].ship_index[i]].ship_info_index].is_fighter_bomber() )) + enable = FALSE; + } + + } else + enable = FALSE; +} + +void wing_editor::initialize_data(int full_update) +{ + int i; + CWnd *w = NULL; + + nprintf(("Fred routing", "Wing dialog load\n")); + if (!GetSafeHwnd()) + return; + + m_arrival_tree.select_sexp_node = m_departure_tree.select_sexp_node = select_sexp_node; + select_sexp_node = -1; + if (cur_wing == -1) + m_wing_name = _T(""); + else + m_wing_name = _T(Wings[cur_wing].name); + + initialize_data_safe(full_update); + modified = 0; + if (w) + w -> SetFocus(); + + i = m_arrival_tree.select_sexp_node; + if (i != -1) { + w = GetDlgItem(IDC_ARRIVAL_TREE); + m_arrival_tree.hilite_item(i); + + } else { + i = m_departure_tree.select_sexp_node; + if (i != -1) { + w = GetDlgItem(IDC_DEPARTURE_TREE); + m_departure_tree.hilite_item(i); + } + } +} + +// 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); + + m_wing_name.TrimLeft(); + m_wing_name.TrimRight(); + + if (cur_wing >= 0) { + for (i=0; itype == OBJ_SHIP) || (ptr->type == OBJ_START)) { + 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_REINFORCEMENTS) && (m_reinforcement == 1)) + { + if (bypass_errors) + return 1; + + bypass_errors = 1; + + char error_message[256]; + sprintf(error_message, "Too many reinforcements; could not add wing '%s' to reinforcement list!", str); + MessageBox(error_message, "Error", MB_ICONEXCLAMATION | MB_OK); + + //clear the flag + m_reinforcement = 0; + UpdateData(FALSE); + + return -1; + + } + //Otherwise, just update as normal. + else 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; +} + +// update parts of wing that can't fail. This is useful if for when you need to change +// something in a wing that this updates elsewhere in Fred. Normally when auto-update +// kicks in, the changes you make will be wiped out by the auto=update, so instead you +// would call this function to update the wing, make your changes, and then call the +// initialize_data_safe() function to show your changes in the dialog +void wing_editor::update_data_safe() +{ + char buf[512]; + int i, d, hotkey = -1; + + nprintf(("Fred routing", "Wing dialog save safe\n")); + if (!GetSafeHwnd()) + return; + + UpdateData(TRUE); + UpdateData(TRUE); + + if (cur_wing < 0) + return; + + if (m_threshold > calc_max_wave_treshold()) { + m_threshold = calc_max_wave_treshold(); + if (!bypass_errors) { + sprintf(buf, "Wave threshold is set too high. Value has been lowered to %d", (int) m_threshold); + MessageBox(buf); + } + } + + if (m_waves < 1) { + m_waves = 1; + if (!bypass_errors) { + sprintf(buf, "Number of waves illegal. Can not have %d waves. Number of waves has as been set to 1.", (int) m_waves); + MessageBox(buf); + } + } + + MODIFY(Wings[cur_wing].special_ship, m_special_ship); + MODIFY(Wings[cur_wing].num_waves, m_waves); + MODIFY(Wings[cur_wing].threshold, m_threshold); + MODIFY(Wings[cur_wing].arrival_location, m_arrival_location); + MODIFY(Wings[cur_wing].departure_location, m_departure_location); + MODIFY(Wings[cur_wing].arrival_delay, m_arrival_delay); + if (m_arrival_delay_min > m_arrival_delay_max) { + if (!bypass_errors) { + sprintf(buf, "Arrival delay minimum greater than maximum. Value lowered to %d", m_arrival_delay_max); + MessageBox(buf); + } + + m_arrival_delay_min = m_arrival_delay_max; + } + + MODIFY(Wings[cur_wing].wave_delay_min, m_arrival_delay_min); + MODIFY(Wings[cur_wing].wave_delay_max, m_arrival_delay_max); + MODIFY(Wings[cur_wing].arrival_distance, m_arrival_dist); + if (m_arrival_target >= 0) { + i = ((CComboBox *) GetDlgItem(IDC_ARRIVAL_TARGET))->GetItemData(m_arrival_target); + MODIFY(Wings[cur_wing].arrival_anchor, i); + + // when arriving near or in front of a ship, be sure that we are far enough away from it!!! + if (((m_arrival_location != ARRIVE_AT_LOCATION) && (m_arrival_location != ARRIVE_FROM_DOCK_BAY)) && (i >= 0) && !(i & SPECIAL_ARRIVAL_ANCHOR_FLAG)) { + d = int(std::min(500.0f, 2.0f * Objects[Ships[i].objnum].radius)); + if ((Wings[cur_wing].arrival_distance < d) && (Wings[cur_wing].arrival_distance > -d)) { + if (!bypass_errors) { + sprintf(buf, "Ship must arrive at least %d meters away from target.\n" + "Value has been reset to this. Use with caution!\r\n" + "Recommended distance is %d meters.\r\n", d, (int)(2.0f * Objects[Ships[i].objnum].radius) ); + + MessageBox(buf); + } + + if (Wings[cur_wing].arrival_distance < 0) + Wings[cur_wing].arrival_distance = -d; + else + Wings[cur_wing].arrival_distance = d; + + m_arrival_dist = Wings[cur_wing].arrival_distance; + } + } + } + if (m_departure_target >= 0) { + i = ((CComboBox *) GetDlgItem(IDC_DEPARTURE_TARGET))->GetItemData(m_departure_target); + MODIFY(Wings[cur_wing].departure_anchor, i); + } + + MODIFY(Wings[cur_wing].departure_delay, m_departure_delay); + hotkey = m_hotkey - 1; + MODIFY(Wings[cur_wing].hotkey, hotkey); + if ( m_ignore_count ) { + if ( !(Wings[cur_wing].flags & WF_IGNORE_COUNT) ) + set_modified(); + Wings[cur_wing].flags |= WF_IGNORE_COUNT; + + } else { + if ( Wings[cur_wing].flags & WF_IGNORE_COUNT ) + set_modified(); + Wings[cur_wing].flags &= ~WF_IGNORE_COUNT; + } + + if ( m_no_arrival_music ) { + if ( !(Wings[cur_wing].flags & WF_NO_ARRIVAL_MUSIC) ) + set_modified(); + Wings[cur_wing].flags |= WF_NO_ARRIVAL_MUSIC; + + } else { + if ( Wings[cur_wing].flags & WF_NO_ARRIVAL_MUSIC ) + set_modified(); + Wings[cur_wing].flags &= ~WF_NO_ARRIVAL_MUSIC; + } + + // check the no message flag + if ( m_no_arrival_message ) { + if ( !(Wings[cur_wing].flags & WF_NO_ARRIVAL_MESSAGE) ) + set_modified(); + Wings[cur_wing].flags |= WF_NO_ARRIVAL_MESSAGE; + + } else { + if ( Wings[cur_wing].flags & WF_NO_ARRIVAL_MESSAGE ) + set_modified(); + Wings[cur_wing].flags &= ~WF_NO_ARRIVAL_MESSAGE; + } + + // set the no warp effect for wings flag + if ( m_no_arrival_warp ) { + if ( !(Wings[cur_wing].flags & WF_NO_ARRIVAL_WARP) ) + set_modified(); + Wings[cur_wing].flags |= WF_NO_ARRIVAL_WARP; + } else { + if ( Wings[cur_wing].flags & WF_NO_ARRIVAL_WARP ) + set_modified(); + Wings[cur_wing].flags &= ~WF_NO_ARRIVAL_WARP; + } + // set the no warp effect for wings flag + if ( m_no_departure_warp ) { + if ( !(Wings[cur_wing].flags & WF_NO_DEPARTURE_WARP) ) + set_modified(); + Wings[cur_wing].flags |= WF_NO_DEPARTURE_WARP; + } else { + if ( Wings[cur_wing].flags & WF_NO_DEPARTURE_WARP ) + set_modified(); + Wings[cur_wing].flags &= ~WF_NO_DEPARTURE_WARP; + } + + if ( m_no_dynamic ) { + if ( !(Wings[cur_wing].flags & WF_NO_DYNAMIC) ) + set_modified(); + Wings[cur_wing].flags |= WF_NO_DYNAMIC; + } else { + if ( Wings[cur_wing].flags & WF_NO_DYNAMIC ) + set_modified(); + Wings[cur_wing].flags &= ~WF_NO_DYNAMIC; + } + + if (Wings[cur_wing].arrival_cue >= 0) + free_sexp2(Wings[cur_wing].arrival_cue); + Wings[cur_wing].arrival_cue = m_arrival_tree.save_tree(); + + if (Wings[cur_wing].departure_cue >= 0) + free_sexp2(Wings[cur_wing].departure_cue); + Wings[cur_wing].departure_cue = m_departure_tree.save_tree(); + + // copy squad stuff + if(stricmp(m_wing_squad_filename, Wings[cur_wing].wing_squad_filename)) + { + string_copy(Wings[cur_wing].wing_squad_filename, m_wing_squad_filename, MAX_FILENAME_LEN); + set_modified(); + } + + if (modified) + set_modified(); +} + +BOOL wing_editor::OnCommand(WPARAM wParam, LPARAM lParam) +{ + int id, wing; + + id = LOWORD(wParam); + if (id >= ID_WING_MENU && id < ID_WING_MENU + MAX_WINGS) { + if (!update_data()) { + wing = id - ID_WING_MENU; + mark_wing(wing); + return 1; + } + } + + return CDialog::OnCommand(wParam, lParam); +} + +void wing_editor::OnDeltaposSpinWaves(NMHDR* pNMHDR, LRESULT* pResult) +{ + int new_pos; + NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR; + + new_pos = pNMUpDown->iPos + pNMUpDown->iDelta; + if (new_pos > 0 && new_pos < 100) { + *pResult = 0; + modified = 1; + + } else + *pResult = 1; +} + +void wing_editor::OnRclickArrivalTree(NMHDR* pNMHDR, LRESULT* pResult) +{ + m_arrival_tree.right_clicked(); + *pResult = 0; +} + +void wing_editor::OnRclickDepartureTree(NMHDR* pNMHDR, LRESULT* pResult) +{ + m_departure_tree.right_clicked(); + *pResult = 0; +} + +void wing_editor::OnBeginlabeleditArrivalTree(NMHDR* pNMHDR, LRESULT* pResult) +{ + TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR; + + if (m_arrival_tree.edit_label(pTVDispInfo->item.hItem) == 1) { + *pResult = 0; + modified = 1; + + } else + *pResult = 1; +} + +void wing_editor::OnBeginlabeleditDepartureTree(NMHDR* pNMHDR, LRESULT* pResult) +{ + TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR; + + if (m_departure_tree.edit_label(pTVDispInfo->item.hItem) == 1) { + *pResult = 0; + modified = 1; + + } else + *pResult = 1; +} + +void wing_editor::OnEndlabeleditArrivalTree(NMHDR* pNMHDR, LRESULT* pResult) +{ + TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR; + + *pResult = m_arrival_tree.end_label_edit(pTVDispInfo->item); +} + +void wing_editor::OnEndlabeleditDepartureTree(NMHDR* pNMHDR, LRESULT* pResult) +{ + TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR; + + *pResult = m_departure_tree.end_label_edit(pTVDispInfo->item); +} + +int wing_editor::verify() +{ + nprintf(("Fred routing", "Wing dialog verify\n")); + if (!GetSafeHwnd() || !modified) + return 0; + + if (bypass_errors) + return 1; + + return 0; +} + +// delete wing and all ships that are part of the wing +void wing_editor::OnDeleteWing() +{ + modified = 0; // no need to run update checks, since wing will be gone shortly anyway. + delete_wing(cur_wing); +} + +// delete wing, but leave ships intact and wingless +void wing_editor::OnDisbandWing() +{ + modified = 0; // no need to run update checks, since wing will be gone shortly anyway. + remove_wing(cur_wing); +} + +void wing_editor::OnGoals2() +{ + ShipGoalsDlg dlg_goals; + + Assert(cur_wing != -1); + dlg_goals.self_wing = cur_wing; + dlg_goals.DoModal(); + if (query_initial_orders_conflict(cur_wing)) + MessageBox("One or more ships of this wing also has initial orders", + "Possible conflict"); +} + +void wing_editor::OnReinforcement() +{ + UpdateData(TRUE); + UpdateData(TRUE); + //if (m_reinforcement) + // m_arrival_tree.clear_tree("false"); +} + +void wing_editor::OnPrev() +{ + int wing, count = 0; + + if (!update_data() && Num_wings) { + wing = cur_wing - 1; + if (wing < 0) + wing = MAX_WINGS - 1; + + while (!Wings[wing].wave_count) { + wing--; + if (count++ > MAX_WINGS) + return; + + if (wing < 0) + wing = MAX_WINGS - 1; + } + + mark_wing(wing); + Wing_editor_dialog.initialize_data(1); + Update_wing = 0; + } + + return; +} + +void wing_editor::OnNext() +{ + int wing, count = 0; + + if (!update_data() && Num_wings) { + wing = cur_wing + 1; + if (wing >= MAX_WINGS) + wing = 0; + + while (!Wings[wing].wave_count) { + wing++; + if (count++ > MAX_WINGS) + return; + + if (wing >= MAX_WINGS) + wing = 0; + } + + mark_wing(wing); + Wing_editor_dialog.initialize_data(1); + Update_wing = 0; + } + + return; +} + +void wing_editor::OnSelchangedArrivalTree(NMHDR* pNMHDR, LRESULT* pResult) +{ + HTREEITEM h; + + NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; + h = pNMTreeView->itemNew.hItem; + if (h) + m_arrival_tree.update_help(h); + + *pResult = 0; +} + +void wing_editor::OnSelchangedDepartureTree(NMHDR* pNMHDR, LRESULT* pResult) +{ + HTREEITEM h; + + NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; + h = pNMTreeView->itemNew.hItem; + if (h) + m_departure_tree.update_help(h); + + *pResult = 0; +} + +void wing_editor::calc_cue_height() +{ + CRect cue; + + GetDlgItem(IDC_CUE_FRAME)->GetWindowRect(cue); + cue_height = cue.bottom - cue.top + 10; + if (Show_sexp_help) + cue_height += SEXP_HELP_BOX_SIZE; + + if (Hide_wing_cues) { + ((CButton *) GetDlgItem(IDC_HIDE_CUES)) -> SetCheck(1); + OnHideCues(); + } +} + +void wing_editor::show_hide_sexp_help() +{ + CRect rect; + + if (Show_sexp_help) + cue_height += SEXP_HELP_BOX_SIZE; + else + cue_height -= SEXP_HELP_BOX_SIZE; + + if (((CButton *) GetDlgItem(IDC_HIDE_CUES)) -> GetCheck()) + return; + + GetWindowRect(rect); + if (Show_sexp_help) + rect.bottom += SEXP_HELP_BOX_SIZE; + else + rect.bottom -= SEXP_HELP_BOX_SIZE; + + MoveWindow(rect); +} + +void wing_editor::OnHideCues() +{ + CRect rect; + + GetWindowRect(rect); + if (((CButton *) GetDlgItem(IDC_HIDE_CUES)) -> GetCheck()) { + rect.bottom -= cue_height; + Hide_wing_cues = 1; + + } else { + rect.bottom += cue_height; + Hide_wing_cues = 0; + } + + MoveWindow(rect); +} + +void wing_editor::OnSelchangeArrivalLocation() +{ + CComboBox *box; + + box = (CComboBox *)GetDlgItem(IDC_ARRIVAL_TARGET); + UpdateData(); + if (m_arrival_location) { + GetDlgItem(IDC_ARRIVAL_DISTANCE)->EnableWindow(TRUE); + GetDlgItem(IDC_ARRIVAL_TARGET)->EnableWindow(TRUE); + if (m_arrival_target < 0) { + m_arrival_target = 0; + } + + // determine which items we should put into the arrival target combo box + if ( m_arrival_location == ARRIVE_FROM_DOCK_BAY ) { + management_add_ships_to_combo( box, SHIPS_2_COMBO_DOCKING_BAY_ONLY ); + } else { + management_add_ships_to_combo( box, SHIPS_2_COMBO_SPECIAL | SHIPS_2_COMBO_ALL_SHIPS ); + } + } else { + m_arrival_target = -1; + GetDlgItem(IDC_ARRIVAL_DISTANCE)->EnableWindow(FALSE); + GetDlgItem(IDC_ARRIVAL_TARGET)->EnableWindow(FALSE); + } + + if (m_arrival_location == ARRIVE_FROM_DOCK_BAY) { + GetDlgItem(IDC_RESTRICT_ARRIVAL)->EnableWindow(TRUE); + } else { + GetDlgItem(IDC_RESTRICT_ARRIVAL)->EnableWindow(FALSE); + } + + UpdateData(FALSE); +} + +void wing_editor::OnSelchangeDepartureLocation() +{ + CComboBox *box; + + box = (CComboBox *)GetDlgItem(IDC_DEPARTURE_TARGET); + UpdateData(); + if (m_departure_location) { + GetDlgItem(IDC_DEPARTURE_TARGET)->EnableWindow(TRUE); + if (m_departure_target < 0) { + m_departure_target = 0; + } + // we need to build up the list box content based on the departure type. When + // from a docking bay, only show ships in the list which have them. Show all ships otherwise + if ( m_departure_location == DEPART_AT_DOCK_BAY ) { + management_add_ships_to_combo( box, SHIPS_2_COMBO_DOCKING_BAY_ONLY ); + } else { + // I think that this section is currently illegal + Int3(); + } + } else { + m_departure_target = -1; + GetDlgItem(IDC_DEPARTURE_TARGET)->EnableWindow(FALSE); + } + + if (m_departure_location == DEPART_AT_DOCK_BAY) { + GetDlgItem(IDC_RESTRICT_DEPARTURE)->EnableWindow(TRUE); + } else { + GetDlgItem(IDC_RESTRICT_DEPARTURE)->EnableWindow(FALSE); + } + + UpdateData(FALSE); +} + +// see if hotkey should possibly be reserved for player starting wing +void wing_editor::OnSelchangeHotkey() +{ + char buf[256]; + int set_num, i; + + UpdateData(TRUE); + set_num = m_hotkey - 1; // hotkey sets are 1 index based + + // first, determine if we are currently working with a starting wing + for ( i = 0; i < MAX_STARTING_WINGS; i++ ) { + if ( !stricmp( Wings[cur_wing].name, Starting_wing_names[i]) ) + break; + } + if ( i == MAX_STARTING_WINGS ) + return; + + // we have a player starting wing. See if we assigned a non-standard hotkey + if ( (set_num >= MAX_STARTING_WINGS) || (set_num != i) ) { + sprintf(buf, "Assigning nonstandard hotkey to wing %s (default is F%d)", Wings[cur_wing].name, 5+i); + MessageBox(buf, NULL, MB_OK | MB_ICONEXCLAMATION ); + } +} + +void wing_editor::OnSquadLogo() +{ + int z; + char *Logo_ext = "Image Files (*.dds, *.pcx)|*.dds;*.pcx|" + "DDS Files (*.dds)|*.dds|" + "PCX Files (*.pcx)|*.pcx|" + "All Files (*.*)|*.*|" + "|"; + + //phreak 05/05/2003 + //this needs to be here or else the data in the wing editor dialog will revert + //to what it was before it was opened. + UpdateData(TRUE); + + // get list of squad images + z = cfile_push_chdir(CF_TYPE_SQUAD_IMAGES); + CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR, Logo_ext); + + // if we have a result + if (dlg.DoModal() == IDOK) { + m_wing_squad_filename = dlg.GetFileName(); + } else { + m_wing_squad_filename = _T(""); + } + UpdateData(FALSE); + + // restore directory + if (!z){ + cfile_pop_dir(); + } +} + +// Goober5000 +void wing_editor::OnRestrictArrival() +{ + int arrive_from_ship; + CComboBox *box; + restrict_paths dlg; + + // grab stuff from GUI + UpdateData(TRUE); + + if (m_arrival_location != ARRIVE_FROM_DOCK_BAY) + { + Int3(); + return; + } + + box = (CComboBox *) GetDlgItem(IDC_ARRIVAL_TARGET); + if (box->GetCount() == 0) + return; + + arrive_from_ship = box->GetItemData(m_arrival_target); + + if (!ship_has_dock_bay(arrive_from_ship)) + { + Int3(); + return; + } + + dlg.m_arrival = true; + dlg.m_ship_class = Ships[arrive_from_ship].ship_info_index; + dlg.m_path_mask = &Wings[cur_wing].arrival_path_mask; + + dlg.DoModal(); +} + +// Goober5000 +void wing_editor::OnRestrictDeparture() +{ + int depart_to_ship; + CComboBox *box; + restrict_paths dlg; + + // grab stuff from GUI + UpdateData(TRUE); + + if (m_departure_location != DEPART_AT_DOCK_BAY) + { + Int3(); + return; + } + + box = (CComboBox *) GetDlgItem(IDC_DEPARTURE_TARGET); + if (box->GetCount() == 0) + return; + + depart_to_ship = box->GetItemData(m_departure_target); + + if (!ship_has_dock_bay(depart_to_ship)) + { + Int3(); + return; + } + + dlg.m_arrival = false; + dlg.m_ship_class = Ships[depart_to_ship].ship_info_index; + dlg.m_path_mask = &Wings[cur_wing].departure_path_mask; + + dlg.DoModal(); } int wing_editor::calc_max_wave_treshold() @@ -1358,4 +1355,4 @@ int wing_editor::calc_max_wave_treshold() const int treshold1 = Wings[cur_wing].wave_count - 1; // At least 1 ship must have died before allowing respawn const int treshold2 = MAX_SHIPS_PER_WING - Wings[cur_wing].wave_count; // Maximum MAX_SHIPS_PER_WING ships can be alive at any given time return std::min(treshold1, treshold2); -} +} diff --git a/freespace2/freespace.cpp b/freespace2/freespace.cpp index 367e7b5170..6c7fbcb7bf 100644 --- a/freespace2/freespace.cpp +++ b/freespace2/freespace.cpp @@ -572,7 +572,7 @@ void game_framerate_check_init() Gf_critical_time = 0.0f; // nebula missions - if(The_mission.flags & MISSION_FLAG_FULLNEB){ + if(The_mission.flags[Mission::Mission_Flags::Fullneb]){ Gf_critical = 15.0f; } else { Gf_critical = 25.0f; @@ -2817,7 +2817,7 @@ void game_tst_mark(object *objp, ship *shipp) } tst_pos = objp->pos; - if(sip->flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP)){ + if(sip->is_big_or_huge()){ tst_big = 1; } tst = 3; @@ -2837,14 +2837,14 @@ void player_repair_frame(float frametime) if(MULTI_CONNECTED(Net_players[idx]) && (Net_player != NULL) && (Net_player->player_id != Net_players[idx].player_id) && (Net_players[idx].m_player != NULL) && (Net_players[idx].m_player->objnum >= 0) && (Net_players[idx].m_player->objnum < MAX_OBJECTS)){ // don't rearm/repair if the player is dead or dying/departing - if ( !NETPLAYER_IS_DEAD(np) && !(Ships[Objects[np->m_player->objnum].instance].flags & (SF_DYING|SF_DEPARTING)) ) { + if ( !NETPLAYER_IS_DEAD(np) && !(Ships[Objects[np->m_player->objnum].instance].is_dying_or_departing()) ) { ai_do_repair_frame(&Objects[Net_players[idx].m_player->objnum],&Ai_info[Ships[Objects[Net_players[idx].m_player->objnum].instance].ai_index],frametime); } } } } - if ( (Player_obj != NULL) && (Player_obj->type == OBJ_SHIP) && !(Game_mode & GM_STANDALONE_SERVER) && (Player_ship != NULL) && !(Player_ship->flags & SF_DYING) ) { + if ( (Player_obj != NULL) && (Player_obj->type == OBJ_SHIP) && !(Game_mode & GM_STANDALONE_SERVER) && (Player_ship != NULL) && !(Player_ship->flags[Ship::Ship_Flags::Dying]) ) { ai_do_repair_frame(Player_obj, &Ai_info[Ships[Player_obj->instance].ai_index], frametime); } } @@ -2997,7 +2997,7 @@ void say_view_target() char view_target_name[128] = ""; switch(Objects[Player_ai->target_objnum].type) { case OBJ_SHIP: - if (Ships[Objects[Player_ai->target_objnum].instance].flags2 & SF2_HIDE_SHIP_NAME) { + if (Ships[Objects[Player_ai->target_objnum].instance].flags[Ship::Ship_Flags::Hide_ship_name]) { strcpy_s(view_target_name, "targeted ship"); } else { strcpy_s(view_target_name, Ships[Objects[Player_ai->target_objnum].instance].ship_name); @@ -3307,7 +3307,7 @@ void game_environment_map_gen() gr_screen.envmap_render_target = -1; } - if ( Dynamic_environment || (The_mission.flags & MISSION_FLAG_SUBSPACE) ) { + if ( Dynamic_environment || (The_mission.flags[Mission::Mission_Flags::Subspace]) ) { Dynamic_environment = true; gen_flags &= ~BMP_FLAG_RENDER_TARGET_STATIC; gen_flags |= BMP_FLAG_RENDER_TARGET_DYNAMIC; @@ -3364,7 +3364,7 @@ camid game_render_frame_setup() //First, make sure we take into account 2D Missions. //These replace the normal player in-cockpit view with a topdown view. - if(The_mission.flags & MISSION_FLAG_2D_MISSION) + if(The_mission.flags[Mission::Mission_Flags::Mission_2d]) { if(!Viewer_mode) { @@ -3772,7 +3772,7 @@ void game_render_frame( camid cid ) //This is so we can change the minimum clipping distance without messing everything up. if ( Viewer_obj && (Viewer_obj->type == OBJ_SHIP) - && (Ship_info[Ships[Viewer_obj->instance].ship_info_index].flags2 & SIF2_SHOW_SHIP_MODEL) + && (Ship_info[Ships[Viewer_obj->instance].ship_info_index].flags[Ship::Info_Flags::Show_ship_model]) && (!Viewer_mode || (Viewer_mode & VM_PADLOCK_ANY) || (Viewer_mode & VM_OTHER_SHIP) || (Viewer_mode & VM_TRACK)) ) { gr_post_process_save_zbuffer(); @@ -3913,7 +3913,7 @@ void game_simulation_frame() sip = &Ship_info[shipp->ship_info_index]; // only blow up small ships - if((sip->flags & SIF_SMALL_SHIP) && (multi_find_player_by_object(&Objects[moveup->objnum]) < 0) && (shipp->team == Iff_traitor) ){ + if((sip->is_small_ship()) && (multi_find_player_by_object(&Objects[moveup->objnum]) < 0) && (shipp->team == Iff_traitor) ){ // function to simply explode a ship where it is currently at ship_self_destruct( &Objects[moveup->objnum] ); } @@ -4088,7 +4088,7 @@ void game_maybe_do_dead_popup(float frametime) // this should only happen during a red alert mission case 3: - if (The_mission.flags & MISSION_FLAG_RED_ALERT) + if (The_mission.flags[Mission::Mission_Flags::Red_alert]) { // choose the previous mission mission_campaign_previous_mission(); @@ -4776,7 +4776,7 @@ void game_do_frame() game_set_frametime(GS_STATE_GAME_PLAY); game_update_missiontime(); -// if (Player_ship->flags & SF_DYING) +// if (Player_ship->flags[Ship::Ship_Flags::Dying]) // flFrametime /= 15.0; if (Game_mode & GM_STANDALONE_SERVER) { @@ -6178,7 +6178,7 @@ void mouse_force_pos(int x, int y); } Game_subspace_effect = 0; - if (The_mission.flags & MISSION_FLAG_SUBSPACE) { + if (The_mission.flags[Mission::Mission_Flags::Subspace]) { Game_subspace_effect = 1; if( !(Game_mode & GM_STANDALONE_SERVER) ){ game_start_subspace_ambient_sound();