public static void MoveBoxes(bool upwards) { List <double> marioPositions = upwards ? marioPositions1 : marioPositions2; int yDiff = upwards ? 78 : -100; List <double> qSteps = new List <double>(); for (int i = 0; i < marioPositions.Count - 1; i++) { double x1 = marioPositions[i]; double x2 = marioPositions[i + 1]; double diff = x2 - x1; qSteps.Add(x1 + diff * 1 / 4.0); qSteps.Add(x1 + diff * 2 / 4.0); qSteps.Add(x1 + diff * 3 / 4.0); qSteps.Add(x1 + diff * 4 / 4.0); } List <int> qStepsTruncated = qSteps.ConvertAll(qStep => (int)Math.Truncate(qStep)); List <ObjectDataModel> objects = Config.ObjectSlotsManager.SelectedObjects; if (objects.Count == 0) { return; } objects.Sort((obj1, obj2) => { string label1 = Config.ObjectSlotsManager.GetSlotLabelFromObject(obj1); string label2 = Config.ObjectSlotsManager.GetSlotLabelFromObject(obj2); int pos1 = ParsingUtilities.ParseInt(label1); int pos2 = ParsingUtilities.ParseInt(label2); return(pos1 - pos2); }); int initialX = (int)objects[0].X; int initialY = (int)objects[0].Y; int initialZ = (int)objects[0].Z; int xOffset = initialX - qStepsTruncated[0]; for (int i = 0; i < objects.Count; i++) { objects[i].X = qStepsTruncated[i] + xOffset; objects[i].Y = initialY + i * yDiff; objects[i].Z = initialZ; } }