void Tools::InsertActionIntoBuildOrder(BuildOrder & result, const BuildOrder & buildOrder, const GameState & initialState, const ActionType & action) { int bestInsertIndex = -1; BuildOrder runningBuildOrder; GameState runningState(initialState); FrameCountType minCompletionTime = buildOrder.getCompletionTime(initialState); BuildOrder testBuildOrder = buildOrder; for (size_t insertIndex(0); insertIndex < buildOrder.size(); ++insertIndex) { // if we can test the action here, do it if (runningState.isLegal(action)) { // figure out the build time of build order with action inserted here GameState tempState(runningState); tempState.doAction(action); for (size_t a(insertIndex); a < buildOrder.size(); ++a) { tempState.doAction(buildOrder[a]); } FrameCountType completionTime = tempState.getLastActionFinishTime(); if (completionTime < minCompletionTime) { minCompletionTime = completionTime; bestInsertIndex = insertIndex; } } BOSS_ASSERT(runningState.isLegal(buildOrder[insertIndex]), "We have made the next action illegal somehow"); runningBuildOrder.add(buildOrder[insertIndex]); runningState.doAction(buildOrder[insertIndex]); } result.clear(); for (size_t a(0); a<buildOrder.size(); ++a) { if (bestInsertIndex == a) { result.add(action); } result.add(buildOrder[a]); } }