// Takes a ship out of a wing, deleting wing if that was the only ship in it. void remove_ship_from_wing(int ship, int min) { char buf[256]; int i, wing, end, obj; wing = Ships[ship].wingnum; if (wing != -1) { if (Wings[wing].wave_count == min) { Wings[wing].wave_count = 0; Wings[wing].wing_squad_filename[0] = '\0'; Wings[wing].wing_insignia_texture = -1; delete_wing(wing); } else { i = Wings[wing].wave_count; end = i - 1; while (i--) if (wing_objects[wing][i] == Ships[ship].objnum) break; Assert(i != -1); // Error, object should be in wing. if (Wings[wing].special_ship == i) Wings[wing].special_ship = 0; // if not last element, move last element to position to fill gap if (i != end) { obj = wing_objects[wing][i] = wing_objects[wing][end]; Wings[wing].ship_index[i] = Wings[wing].ship_index[end]; if (Objects[obj].type == OBJ_SHIP) { wing_bash_ship_name(buf, Wings[wing].name, i + 1); rename_ship(Wings[wing].ship_index[i], buf); } } Wings[wing].wave_count--; if (Wings[wing].wave_count && (Wings[wing].threshold >= Wings[wing].wave_count)) Wings[wing].threshold = Wings[wing].wave_count - 1; } Ships[ship].wingnum = -1; } set_modified(); // reset ship name to non-wing default ship name sprintf(buf, "%s %d", Ship_info[Ships[ship].ship_info_index].name, ship); rename_ship(ship, buf); }
// 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); }