diff --git a/src/main.c b/src/main.c index 31d99e4..545318a 100644 --- a/src/main.c +++ b/src/main.c @@ -62,6 +62,7 @@ int usage() { printf("Use --deploy or -d to deploy the mods for the game\n"); printf("Use --unbind to rollback a deployment\n"); printf("Use --fomod to create a new mod using the result from the FOMod\n"); + printf("Use --swap MODID B> to swap two mod in the loading order\n"); return EXIT_FAILURE; } @@ -489,6 +490,22 @@ int fomod(int argc, char ** argv) { return returnValue; } +int swapMod(int argc, char ** argv) { + if(argc != 5) return usage(); + char * appIdStr = argv[2]; + int appid = validateAppId(appIdStr); + if(appid < 0) { + printf("Invalid appid"); + return EXIT_FAILURE; + } + + + //no mod will go over the MAX_INT value + int modIdA = (int)strtoul(argv[3], NULL, 10); + int modIdB = (int)strtoul(argv[4], NULL, 10); + return swapPlace(appid, modIdA, modIdB); +} + int main(int argc, char ** argv) { if(argc < 2 ) return usage(); @@ -589,6 +606,12 @@ int main(int argc, char ** argv) { else returnValue = removeMod(argc, argv); + } else if(strcmp(argv[1], "--swap") == 0 || strcmp(argv[1], "-s") == 0) { + if(isRoot()) + returnValue = noRoot(); + else + returnValue = swapMod(argc, argv); + } else { usage(); returnValue = EXIT_FAILURE; diff --git a/src/order.c b/src/order.c index 0354585..35bd256 100644 --- a/src/order.c +++ b/src/order.c @@ -1,4 +1,5 @@ #include +#include #include "order.h" //no function are declared in main it's just macros @@ -92,9 +93,51 @@ GList * listMods(int appid) { } -void swapPlace(int appid, int modId, int modId2) { - GList * list = listMods(appid); +int swapPlace(int appid, int modIdA, int modIdB) { + char appidStr[10]; + sprintf(appidStr, "%d", appid); + char * home = getHome(); + char * modFolder = g_build_filename(home, MANAGER_FILES, MOD_FOLDER_NAME, appidStr, NULL); + free(home); + + GList * list = listMods(appid); + GList * listA = list; + GList * listB = list; + + for(int i = 0; i < modIdA; i++) { + listA = g_list_next(listA); + } + + for(int i = 0; i < modIdB; i++) { + listB = g_list_next(listB); + } + + if(listA == NULL || listB == NULL) { + printf("Invalid modId\n"); + return EXIT_FAILURE; + } + + char * modAFolder = g_build_filename(modFolder, listA->data, ORDER_FILE, NULL); + char * modBFolder = g_build_filename(modFolder, listB->data, ORDER_FILE, NULL); + + FILE * fileA = fopen(modAFolder, "w"); + FILE * fileB = fopen(modBFolder, "w"); + + g_free(modAFolder); + g_free(modBFolder); + + if(fileA == NULL || fileB == NULL) { + fprintf(stderr, "Error could not open order file\n"); + return EXIT_FAILURE; + } + + fprintf(fileA, "%d", modIdB); + fprintf(fileB, "%d", modIdA); + + fclose(fileA); + fclose(fileB); g_list_free(list); + return EXIT_SUCCESS; } diff --git a/src/order.h b/src/order.h index 020b04d..33da0fe 100644 --- a/src/order.h +++ b/src/order.h @@ -24,6 +24,6 @@ GList * listMods(int appid); * @param modId * @param modId2 */ -void swapPlace(int appid, int modId, int modId2); +int swapPlace(int appid, int modId, int modId2); #endif