void dock_move_docked_objects(object *objp) { Assert(objp != NULL); if ((objp->type != OBJ_SHIP) && (objp->type != OBJ_START)) return; if (!object_is_docked(objp)) return; // has this object (by extension, this group of docked objects) been handled already? if (objp->flags[Object::Object_Flags::Docked_already_handled]) return; Assert((objp->instance >= 0) && (objp->instance < MAX_SHIPS)); dock_function_info dfi; object *fastest_objp; // in FRED, objp is the object everyone moves with if (Fred_running) { fastest_objp = objp; } else { // find the object with the highest max speed dock_evaluate_all_docked_objects(objp, &dfi, dock_find_max_speed_helper); fastest_objp = dfi.maintained_variables.objp_value; // if we have no max speed, just use the first one if (fastest_objp == NULL) fastest_objp = objp; } // start a tree with that object as the parent... do NOT use the überfunction for this, // because we must use a tree for the parent ancestry to work correctly // we don't need a bit array because OF_DOCKED_ALREADY_HANDLED takes care of it // and must persist for the entire game frame // start evaluating the tree, starting with the fastest object having no parent dock_move_docked_children_tree(fastest_objp, NULL); }
void dock_move_docked_children_tree(object *objp, object *parent_objp) { // has this object been handled already? if (objp->flags & OF_DOCKED_ALREADY_HANDLED) return; // mark as handled objp->flags |= OF_DOCKED_ALREADY_HANDLED; // if parent_objp exists if (parent_objp != NULL) { // move this object to align with it obj_move_one_docked_object(objp, parent_objp); } // iterate through all docked objects for (dock_instance *ptr = objp->dock_list; ptr != NULL; ptr = ptr->next) { // start another tree with the docked object as the root and this object as the parent dock_move_docked_children_tree(ptr->docked_objp, objp); } }
void dock_move_docked_children_tree(object *objp, object *parent_objp) { // has this object been handled already? if (objp->flags[Object::Object_Flags::Docked_already_handled]) return; // mark as handled objp->flags.set(Object::Object_Flags::Docked_already_handled); // if parent_objp exists if (parent_objp != NULL) { // move this object to align with it obj_move_one_docked_object(objp, parent_objp); } // iterate through all docked objects for (dock_instance *ptr = objp->dock_list; ptr != NULL; ptr = ptr->next) { // start another tree with the docked object as the root and this object as the parent dock_move_docked_children_tree(ptr->docked_objp, objp); } }