void waypoint_remove(waypoint *wpt) { int objnum = wpt->get_objnum(); waypoint_list *wp_list = wpt->get_parent_list(); int this_list = calc_waypoint_list_index(Objects[objnum].instance); int this_index = calc_waypoint_index(Objects[objnum].instance); // special case... this is the only waypoint on its list if (wp_list->get_waypoints().size() == 1) { wp_list->get_waypoints().clear(); // special special case... this is the only waypoint list! if (Waypoint_lists.size() == 1) { Waypoint_lists.clear(); } // shift the other waypoint lists down else { // remove this particular waypoint list SCP_list<waypoint_list>::iterator ii; int i; for (i = 0, ii = Waypoint_lists.begin(); ii != Waypoint_lists.end(); ++i, ++ii) { if (i == this_list) { Waypoint_lists.erase(ii); break; } } Assert(ii != Waypoint_lists.end()); // iterate through all waypoints that are in lists later than this one, // and edit their instances so that they point to a list one place lower for (object *objp = GET_FIRST(&obj_used_list); objp != END_OF_LIST(&obj_used_list); objp = GET_NEXT(objp)) { if ((objp->type == OBJ_WAYPOINT) && (calc_waypoint_list_index(objp->instance) > this_list)) objp->instance -= 0x10000; } } } // shift the other waypoints down else { // remove this particular waypoint SCP_vector<waypoint>::iterator ii; int i; for (i = 0, ii = wp_list->get_waypoints().begin(); ii != wp_list->get_waypoints().end(); ++i, ++ii) { if (i == this_index) { wp_list->get_waypoints().erase(ii); break; } } Assert(ii != wp_list->get_waypoints().end()); // iterate through all waypoints that are later than this one, // and edit their instances so that they point to a waypoint one place lower for (object *objp = GET_FIRST(&obj_used_list); objp != END_OF_LIST(&obj_used_list); objp = GET_NEXT(objp)) { if ((objp->type == OBJ_WAYPOINT) && (calc_waypoint_list_index(objp->instance) == this_list) && (calc_waypoint_index(objp->instance) > this_index)) objp->instance--; } } // FRED has its own object removal logic if (!Fred_running) obj_delete(objnum); }
//********************FUNCTIONS******************** void waypoint_parse_init() { Waypoint_lists.clear(); }
void waypoint_level_close() { Waypoint_lists.clear(); }
/** * Level cleanup */ void jumpnode_level_close() { Jump_nodes.clear(); }