X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=20f5102594962e230d669b28ed2e551e99f9153b;hb=fa4f857a268adfe4aa1e29f2449fff8b1c2fbf0e;hp=4878aa8368e42bfdf1ddf59b7e901bd877a381dd;hpb=e654b56b53a09f9ab45331ef38883f6668f6bd49;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index 4878aa83..20f51025 100644 --- a/src/files.c +++ b/src/files.c @@ -3160,7 +3160,7 @@ static int LoadLevel_MicroChunk(File *file, struct LevelFileConfigInfo *conf, value = getMappedElement(value); if (data_type == TYPE_BOOLEAN) - *(boolean *)(conf[i].value) = value; + *(boolean *)(conf[i].value) = (value ? TRUE : FALSE); else *(int *) (conf[i].value) = value; @@ -8447,11 +8447,34 @@ void DumpTape(struct TapeInfo *tape) } PrintLine("-", 79); + Print("Tape of Level %03d (file version %08d, game version %08d)\n", tape->level_nr, tape->file_version, tape->game_version); Print(" (effective engine version %08d)\n", tape->engine_version); Print("Level series identifier: '%s'\n", tape->level_identifier); + + Print("Special tape properties: "); + if (tape->property_bits == TAPE_PROPERTY_NONE) + Print("[none]"); + if (tape->property_bits & TAPE_PROPERTY_EM_RANDOM_BUG) + Print("[em_random_bug]"); + if (tape->property_bits & TAPE_PROPERTY_GAME_SPEED) + Print("[game_speed]"); + if (tape->property_bits & TAPE_PROPERTY_PAUSE_MODE) + Print("[pause]"); + if (tape->property_bits & TAPE_PROPERTY_SINGLE_STEP) + Print("[single_step]"); + if (tape->property_bits & TAPE_PROPERTY_SNAPSHOT) + Print("[snapshot]"); + if (tape->property_bits & TAPE_PROPERTY_REPLAYED) + Print("[replayed]"); + if (tape->property_bits & TAPE_PROPERTY_TAS_KEYS) + Print("[tas_keys]"); + if (tape->property_bits & TAPE_PROPERTY_SMALL_GRAPHICS) + Print("[small_graphics]"); + + Print("\n"); PrintLine("-", 79); tape_frame_counter = 0; @@ -8537,6 +8560,7 @@ static void setScoreInfoToDefaultsExt(struct ScoreInfo *scores) scores->last_added_local = -1; scores->updated = FALSE; + scores->uploaded = FALSE; scores->force_last_added = FALSE; } @@ -9002,8 +9026,8 @@ void SaveScore(int nr) SaveScoreToFilename(filename); } -static void ExecuteAsThread(SDL_ThreadFunction function, char *name, void *data, - char *error) +void ExecuteAsThread(SDL_ThreadFunction function, char *name, void *data, + char *error) { SDL_Thread *thread = SDL_CreateThread(function, name, data); @@ -9016,6 +9040,26 @@ static void ExecuteAsThread(SDL_ThreadFunction function, char *name, void *data, Delay(1); } +char *getPasswordJSON(char *password) +{ + static char password_json[MAX_FILENAME_LEN] = ""; + static boolean initialized = FALSE; + + if (!initialized) + { + if (password != NULL && + !strEqual(password, "") && + !strEqual(password, UNDEFINED_PASSWORD)) + snprintf(password_json, MAX_FILENAME_LEN, + " \"password\": \"%s\",\n", + setup.api_server_password); + + initialized = TRUE; + } + + return password_json; +} + static void DownloadServerScoreToCacheExt(struct HttpRequest *request, struct HttpResponse *response, int level_nr, @@ -9028,9 +9072,13 @@ static void DownloadServerScoreToCacheExt(struct HttpRequest *request, snprintf(request->body, MAX_HTTP_BODY_SIZE, "{\n" + "%s" + " \"game_version\": \"%s\",\n" " \"levelset_identifier\": \"%s\",\n" " \"level_nr\": \"%d\"\n" "}\n", + getPasswordJSON(setup.api_server_password), + getProgramRealVersionString(), levelset.identifier, level_nr); ConvertHttpRequestBodyToServerEncoding(request); @@ -9109,21 +9157,23 @@ static int DownloadServerScoreToCacheThread(void *data_raw) DownloadServerScoreToCache(data->level_nr, data->score_cache_filename); + checked_free(data->score_cache_filename); + checked_free(data); + return 0; } static void DownloadServerScoreToCacheAsThread(int nr) { - static struct DownloadServerScoreToCacheThreadData data; + struct DownloadServerScoreToCacheThreadData *data = + checked_malloc(sizeof(struct DownloadServerScoreToCacheThreadData)); char *score_cache_filename = getScoreCacheFilename(nr); - checked_free(data.score_cache_filename); - - data.level_nr = nr; - data.score_cache_filename = getStringCopy(score_cache_filename); + data->level_nr = nr; + data->score_cache_filename = getStringCopy(score_cache_filename); ExecuteAsThread(DownloadServerScoreToCacheThread, - "DownloadServerScoreToCache", &data, + "DownloadServerScoreToCache", data, "download scores from server"); } @@ -9287,15 +9337,26 @@ static void UploadScoreToServerExt(struct HttpRequest *request, return; } + char *player_name_raw = score_entry->name; + char *player_uuid_raw = setup.player_uuid; + + if (options.player_name != NULL) + { + player_name_raw = options.player_name; + player_uuid_raw = ""; + } + char *levelset_identifier = getEscapedJSON(leveldir_current->identifier); char *levelset_name = getEscapedJSON(leveldir_current->name); char *levelset_author = getEscapedJSON(leveldir_current->author); char *level_name = getEscapedJSON(level.name); char *level_author = getEscapedJSON(level.author); - char *player_name = getEscapedJSON(score_entry->name); + char *player_name = getEscapedJSON(player_name_raw); + char *player_uuid = getEscapedJSON(player_uuid_raw); snprintf(request->body, MAX_HTTP_BODY_SIZE, "{\n" + "%s" " \"game_version\": \"%s\",\n" " \"levelset_identifier\": \"%s\",\n" " \"levelset_name\": \"%s\",\n" @@ -9307,11 +9368,13 @@ static void UploadScoreToServerExt(struct HttpRequest *request, " \"level_author\": \"%s\",\n" " \"rate_time_over_score\": \"%d\",\n" " \"player_name\": \"%s\",\n" + " \"player_uuid\": \"%s\",\n" " \"score\": \"%d\",\n" " \"time\": \"%d\",\n" " \"tape_basename\": \"%s\",\n" " \"tape\": \"%s\"\n" "}\n", + getPasswordJSON(setup.api_server_password), getProgramRealVersionString(), levelset_identifier, levelset_name, @@ -9323,6 +9386,7 @@ static void UploadScoreToServerExt(struct HttpRequest *request, level_author, level.rate_time_over_score, player_name, + player_uuid, score_entry->score, score_entry->time, score_entry->tape_basename, @@ -9336,6 +9400,7 @@ static void UploadScoreToServerExt(struct HttpRequest *request, checked_free(level_name); checked_free(level_author); checked_free(player_name); + checked_free(player_uuid); ConvertHttpRequestBodyToServerEncoding(request); @@ -9354,6 +9419,8 @@ static void UploadScoreToServerExt(struct HttpRequest *request, return; } + + server_scores.uploaded = TRUE; } static void UploadScoreToServer(int level_nr, char *score_tape_filename, @@ -9384,23 +9451,27 @@ static int UploadScoreToServerThread(void *data_raw) data->score_tape_filename, &data->score_entry); + checked_free(data->score_tape_filename); + checked_free(data); + return 0; } -static void UploadScoreToServerAsThread(int nr) +static void UploadScoreToServerAsThread(int nr, char *score_tape_filename) { - static struct UploadScoreToServerThreadData data; + struct UploadScoreToServerThreadData *data = + checked_malloc(sizeof(struct UploadScoreToServerThreadData)); struct ScoreEntry *score_entry = &scores.entry[scores.last_added]; - char *score_tape_filename = getScoreTapeFilename(score_entry->tape_basename, nr); - checked_free(data.score_tape_filename); + if (score_tape_filename == NULL) + score_tape_filename = getScoreTapeFilename(score_entry->tape_basename, nr); - data.level_nr = nr; - data.score_entry = *score_entry; - data.score_tape_filename = getStringCopy(score_tape_filename); + data->level_nr = nr; + data->score_entry = *score_entry; + data->score_tape_filename = getStringCopy(score_tape_filename); ExecuteAsThread(UploadScoreToServerThread, - "UploadScoreToServer", &data, + "UploadScoreToServer", data, "upload score to server"); } @@ -9409,7 +9480,15 @@ void SaveServerScore(int nr) if (!runtime.api_server) return; - UploadScoreToServerAsThread(nr); + UploadScoreToServerAsThread(nr, NULL); +} + +void SaveServerScoreFromFile(int nr, char *score_tape_filename) +{ + if (!runtime.api_server) + return; + + UploadScoreToServerAsThread(nr, score_tape_filename); } void LoadLocalAndServerScore(int nr, boolean download_score) @@ -9445,6 +9524,10 @@ static struct TokenInfo global_setup_tokens[] = TYPE_STRING, &setup.player_name, "player_name" }, + { + TYPE_STRING, + &setup.player_uuid, "player_uuid" + }, { TYPE_SWITCH, &setup.multiple_users, "multiple_users" @@ -9615,7 +9698,11 @@ static struct TokenInfo global_setup_tokens[] = }, { TYPE_SWITCH, - &setup.show_snapshot_buttons, "show_snapshot_buttons" + &setup.show_load_save_buttons, "show_load_save_buttons" + }, + { + TYPE_SWITCH, + &setup.show_undo_redo_buttons, "show_undo_redo_buttons" }, { TYPE_SWITCH, @@ -9677,6 +9764,14 @@ static struct TokenInfo global_setup_tokens[] = TYPE_STRING, &setup.api_server_hostname, "api_server_hostname" }, + { + TYPE_STRING, + &setup.api_server_password, "api_server_password" + }, + { + TYPE_SWITCH, + &setup.ask_for_uploading_tapes, "ask_for_uploading_tapes" + }, { TYPE_STRING, &setup.touch.control_type, "touch.control_type" @@ -10248,6 +10343,7 @@ static void setSetupInfoToDefaults(struct SetupInfo *si) int i; si->player_name = getStringCopy(getDefaultUserName(user.nr)); + si->player_uuid = NULL; // (will be set later) si->multiple_users = TRUE; @@ -10292,7 +10388,8 @@ static void setSetupInfoToDefaults(struct SetupInfo *si) si->game_frame_delay = GAME_FRAME_DELAY; si->sp_show_border_elements = FALSE; si->small_game_graphics = FALSE; - si->show_snapshot_buttons = FALSE; + si->show_load_save_buttons = FALSE; + si->show_undo_redo_buttons = FALSE; si->only_show_local_scores = FALSE; si->graphics_set = getStringCopy(GFX_CLASSIC_SUBDIR); @@ -10313,6 +10410,8 @@ static void setSetupInfoToDefaults(struct SetupInfo *si) si->api_server = TRUE; si->api_server_hostname = getStringCopy(API_SERVER_HOSTNAME); + si->api_server_password = getStringCopy(UNDEFINED_PASSWORD); + si->ask_for_uploading_tapes = TRUE; si->touch.control_type = getStringCopy(TOUCH_CONTROL_DEFAULT); si->touch.move_distance = TOUCH_MOVE_DISTANCE_DEFAULT; // percent @@ -10792,6 +10891,14 @@ static void LoadSetup_SpecialPostProcessing(void) // make sure that scroll delay value stays inside valid range setup.scroll_delay_value = MIN(MAX(MIN_SCROLL_DELAY, setup.scroll_delay_value), MAX_SCROLL_DELAY); + + if (setup.player_uuid == NULL) + { + // player UUID does not yet exist in setup file + setup.player_uuid = getStringCopy(getUUID()); + + SaveSetup(); + } } void LoadSetup(void) @@ -13114,6 +13221,11 @@ void ConvertLevels(void) Print("converting level ... "); +#if 0 + // special case: conversion of some EMC levels as requested by ACME + level.game_engine_type = GAME_ENGINE_TYPE_RND; +#endif + level_filename = getDefaultLevelFilename(level_nr); new_level = !fileExists(level_filename);