X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=1c4faf2da5e2a7411b103313492ee9af3ba76406;hb=df4d152e1d4bd75c59ba9ce469a7b308ec718905;hp=71c966a22ef80129f01bf5e365bcfb9ea20ff594;hpb=e2b0f3655004bb2b7574f250cc1a0db64ffaba7c;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index 71c966a2..1c4faf2d 100644 --- a/src/files.c +++ b/src/files.c @@ -7763,6 +7763,7 @@ static void setTapeInfoToDefaults(void) tape.scr_fieldx = SCR_FIELDX_DEFAULT; tape.scr_fieldy = SCR_FIELDY_DEFAULT; + tape.no_info_chunk = TRUE; tape.no_valid_file = FALSE; } @@ -7867,6 +7868,8 @@ static int LoadTape_INFO(File *file, int chunk_size, struct TapeInfo *tape) int level_identifier_size; int i; + tape->no_info_chunk = FALSE; + level_identifier_size = getFile16BitBE(file); level_identifier = checked_malloc(level_identifier_size); @@ -9026,9 +9029,13 @@ 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) { +#if defined(PLATFORM_EMSCRIPTEN) + // threads currently not fully supported by Emscripten/SDL and some browsers + function(data); +#else SDL_Thread *thread = SDL_CreateThread(function, name, data); if (thread != NULL) @@ -9038,9 +9045,10 @@ static void ExecuteAsThread(SDL_ThreadFunction function, char *name, void *data, // nasty kludge to lower probability of intermingled thread error messages Delay(1); +#endif } -static char *getPasswordJSON(char *password) +char *getPasswordJSON(char *password) { static char password_json[MAX_FILENAME_LEN] = ""; static boolean initialized = FALSE; @@ -9060,10 +9068,10 @@ static char *getPasswordJSON(char *password) return password_json; } -static void DownloadServerScoreToCacheExt(struct HttpRequest *request, - struct HttpResponse *response, - int level_nr, - char *score_cache_filename) +static void ApiGetScoreExt(struct HttpRequest *request, + struct HttpResponse *response, + int level_nr, + char *score_cache_filename) { request->hostname = setup.api_server_hostname; request->port = API_SERVER_PORT; @@ -9073,10 +9081,14 @@ static void DownloadServerScoreToCacheExt(struct HttpRequest *request, snprintf(request->body, MAX_HTTP_BODY_SIZE, "{\n" "%s" + " \"game_version\": \"%s\",\n" + " \"game_platform\": \"%s\",\n" " \"levelset_identifier\": \"%s\",\n" " \"level_nr\": \"%d\"\n" "}\n", getPasswordJSON(setup.api_server_password), + getProgramRealVersionString(), + getProgramPlatformString(), levelset.identifier, level_nr); ConvertHttpRequestBodyToServerEncoding(request); @@ -9130,30 +9142,30 @@ static void DownloadServerScoreToCacheExt(struct HttpRequest *request, server_scores.updated = TRUE; } -static void DownloadServerScoreToCache(int level_nr, char *score_cache_filename) +static void ApiGetScore(int level_nr, char *score_cache_filename) { struct HttpRequest *request = checked_calloc(sizeof(struct HttpRequest)); struct HttpResponse *response = checked_calloc(sizeof(struct HttpResponse)); - DownloadServerScoreToCacheExt(request, response, - level_nr, score_cache_filename); + ApiGetScoreExt(request, response, + level_nr, score_cache_filename); checked_free(request); checked_free(response); } -struct DownloadServerScoreToCacheThreadData +struct ApiGetScoreThreadData { int level_nr; char *score_cache_filename; }; -static int DownloadServerScoreToCacheThread(void *data_raw) +static int ApiGetScoreThread(void *data_raw) { - struct DownloadServerScoreToCacheThreadData *data = data_raw; + struct ApiGetScoreThreadData *data = data_raw; - DownloadServerScoreToCache(data->level_nr, - data->score_cache_filename); + ApiGetScore(data->level_nr, + data->score_cache_filename); checked_free(data->score_cache_filename); checked_free(data); @@ -9161,17 +9173,17 @@ static int DownloadServerScoreToCacheThread(void *data_raw) return 0; } -static void DownloadServerScoreToCacheAsThread(int nr) +static void ApiGetScoreAsThread(int nr) { - struct DownloadServerScoreToCacheThreadData *data = - checked_malloc(sizeof(struct DownloadServerScoreToCacheThreadData)); + struct ApiGetScoreThreadData *data = + checked_malloc(sizeof(struct ApiGetScoreThreadData)); char *score_cache_filename = getScoreCacheFilename(nr); data->level_nr = nr; data->score_cache_filename = getStringCopy(score_cache_filename); - ExecuteAsThread(DownloadServerScoreToCacheThread, - "DownloadServerScoreToCache", data, + ExecuteAsThread(ApiGetScoreThread, + "ApiGetScore", data, "download scores from server"); } @@ -9243,7 +9255,7 @@ static void LoadServerScoreFromCache(int nr) void LoadServerScore(int nr, boolean download_score) { - if (!setup.api_server) + if (!setup.use_api_server) return; // always start with reliable default values @@ -9253,11 +9265,11 @@ void LoadServerScore(int nr, boolean download_score) // (this should prevent reading it while the thread is writing to it) LoadServerScoreFromCache(nr); - if (download_score && runtime.api_server) + if (download_score && runtime.use_api_server) { // 2nd step: download server scores from score server to cache file // (as thread, as it might time out if the server is not reachable) - DownloadServerScoreToCacheAsThread(nr); + ApiGetScoreAsThread(nr); } } @@ -9315,11 +9327,11 @@ static char *get_file_base64(char *filename) return buffer_encoded; } -static void UploadScoreToServerExt(struct HttpRequest *request, - struct HttpResponse *response, - int level_nr, - char *score_tape_filename, - struct ScoreEntry *score_entry) +static void ApiAddScoreExt(struct HttpRequest *request, + struct HttpResponse *response, + int level_nr, + char *score_tape_filename, + struct ScoreEntry *score_entry) { request->hostname = setup.api_server_hostname; request->port = API_SERVER_PORT; @@ -9335,19 +9347,29 @@ 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 && global.autoplay_leveldir != 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_uuid = getEscapedJSON(setup.player_uuid); - char *system_uuid = getEscapedJSON(setup.system_uuid); + 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" + " \"game_platform\": \"%s\",\n" + " \"batch_time\": \"%d\",\n" " \"levelset_identifier\": \"%s\",\n" " \"levelset_name\": \"%s\",\n" " \"levelset_author\": \"%s\",\n" @@ -9359,7 +9381,6 @@ static void UploadScoreToServerExt(struct HttpRequest *request, " \"rate_time_over_score\": \"%d\",\n" " \"player_name\": \"%s\",\n" " \"player_uuid\": \"%s\",\n" - " \"system_uuid\": \"%s\",\n" " \"score\": \"%d\",\n" " \"time\": \"%d\",\n" " \"tape_basename\": \"%s\",\n" @@ -9367,6 +9388,8 @@ static void UploadScoreToServerExt(struct HttpRequest *request, "}\n", getPasswordJSON(setup.api_server_password), getProgramRealVersionString(), + getProgramPlatformString(), + (int)global.autoplay_time, levelset_identifier, levelset_name, levelset_author, @@ -9378,7 +9401,6 @@ static void UploadScoreToServerExt(struct HttpRequest *request, level.rate_time_over_score, player_name, player_uuid, - system_uuid, score_entry->score, score_entry->time, score_entry->tape_basename, @@ -9393,7 +9415,6 @@ static void UploadScoreToServerExt(struct HttpRequest *request, checked_free(level_author); checked_free(player_name); checked_free(player_uuid); - checked_free(system_uuid); ConvertHttpRequestBodyToServerEncoding(request); @@ -9416,33 +9437,33 @@ static void UploadScoreToServerExt(struct HttpRequest *request, server_scores.uploaded = TRUE; } -static void UploadScoreToServer(int level_nr, char *score_tape_filename, - struct ScoreEntry *score_entry) +static void ApiAddScore(int level_nr, char *score_tape_filename, + struct ScoreEntry *score_entry) { struct HttpRequest *request = checked_calloc(sizeof(struct HttpRequest)); struct HttpResponse *response = checked_calloc(sizeof(struct HttpResponse)); - UploadScoreToServerExt(request, response, - level_nr, score_tape_filename, score_entry); + ApiAddScoreExt(request, response, + level_nr, score_tape_filename, score_entry); checked_free(request); checked_free(response); } -struct UploadScoreToServerThreadData +struct ApiAddScoreThreadData { int level_nr; char *score_tape_filename; struct ScoreEntry score_entry; }; -static int UploadScoreToServerThread(void *data_raw) +static int ApiAddScoreThread(void *data_raw) { - struct UploadScoreToServerThreadData *data = data_raw; + struct ApiAddScoreThreadData *data = data_raw; - UploadScoreToServer(data->level_nr, - data->score_tape_filename, - &data->score_entry); + ApiAddScore(data->level_nr, + data->score_tape_filename, + &data->score_entry); checked_free(data->score_tape_filename); checked_free(data); @@ -9450,10 +9471,10 @@ static int UploadScoreToServerThread(void *data_raw) return 0; } -static void UploadScoreToServerAsThread(int nr, char *score_tape_filename) +static void ApiAddScoreAsThread(int nr, char *score_tape_filename) { - struct UploadScoreToServerThreadData *data = - checked_malloc(sizeof(struct UploadScoreToServerThreadData)); + struct ApiAddScoreThreadData *data = + checked_malloc(sizeof(struct ApiAddScoreThreadData)); struct ScoreEntry *score_entry = &scores.entry[scores.last_added]; if (score_tape_filename == NULL) @@ -9463,25 +9484,25 @@ static void UploadScoreToServerAsThread(int nr, char *score_tape_filename) data->score_entry = *score_entry; data->score_tape_filename = getStringCopy(score_tape_filename); - ExecuteAsThread(UploadScoreToServerThread, - "UploadScoreToServer", data, + ExecuteAsThread(ApiAddScoreThread, + "ApiAddScore", data, "upload score to server"); } void SaveServerScore(int nr) { - if (!runtime.api_server) + if (!runtime.use_api_server) return; - UploadScoreToServerAsThread(nr, NULL); + ApiAddScoreAsThread(nr, NULL); } void SaveServerScoreFromFile(int nr, char *score_tape_filename) { - if (!runtime.api_server) + if (!runtime.use_api_server) return; - UploadScoreToServerAsThread(nr, score_tape_filename); + ApiAddScoreAsThread(nr, score_tape_filename); } void LoadLocalAndServerScore(int nr, boolean download_score) @@ -9493,7 +9514,7 @@ void LoadLocalAndServerScore(int nr, boolean download_score) // restore last added local score entry (before merging server scores) scores.last_added = scores.last_added_local = last_added_local; - if (setup.api_server && !setup.only_show_local_scores) + if (setup.use_api_server && !setup.only_show_local_scores) { // load server scores from cache file and trigger update from server LoadServerScore(nr, download_score); @@ -9521,10 +9542,6 @@ static struct TokenInfo global_setup_tokens[] = TYPE_STRING, &setup.player_uuid, "player_uuid" }, - { - TYPE_STRING, - &setup.system_uuid, "system_uuid" - }, { TYPE_SWITCH, &setup.multiple_users, "multiple_users" @@ -9755,15 +9772,23 @@ static struct TokenInfo global_setup_tokens[] = }, { TYPE_SWITCH, - &setup.api_server, "api_server" + &setup.use_api_server, TEST_PREFIX "use_api_server" }, { TYPE_STRING, - &setup.api_server_hostname, "api_server_hostname" + &setup.api_server_hostname, TEST_PREFIX "api_server_hostname" }, { TYPE_STRING, - &setup.api_server_password, "api_server_password" + &setup.api_server_password, TEST_PREFIX "api_server_password" + }, + { + TYPE_SWITCH, + &setup.ask_for_uploading_tapes, TEST_PREFIX "ask_for_uploading_tapes" + }, + { + TYPE_SWITCH, + &setup.provide_uploading_tapes, TEST_PREFIX "provide_uploading_tapes" }, { TYPE_STRING, @@ -10336,9 +10361,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->system_uuid = NULL; // (will be set later) si->multiple_users = TRUE; @@ -10403,9 +10426,11 @@ static void setSetupInfoToDefaults(struct SetupInfo *si) si->network_player_nr = 0; // first player si->network_server_hostname = getStringCopy(STR_NETWORK_AUTO_DETECT); - si->api_server = TRUE; + si->use_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->provide_uploading_tapes = TRUE; si->touch.control_type = getStringCopy(TOUCH_CONTROL_DEFAULT); si->touch.move_distance = TOUCH_MOVE_DISTANCE_DEFAULT; // percent @@ -10886,19 +10911,13 @@ static void LoadSetup_SpecialPostProcessing(void) setup.scroll_delay_value = MIN(MAX(MIN_SCROLL_DELAY, setup.scroll_delay_value), MAX_SCROLL_DELAY); - if (setup.player_uuid == NULL || - setup.system_uuid == NULL) + if (setup.player_uuid == NULL) { - if (setup.player_uuid == NULL) - setup.player_uuid = getStringCopy(GetPlayerUUID()); - - if (setup.system_uuid == NULL) - setup.system_uuid = getStringCopy(GetSystemUUID()); + // player UUID does not yet exist in setup file + setup.player_uuid = getStringCopy(getUUID()); SaveSetup(); } - - SetSystemUUID(setup.system_uuid); } void LoadSetup(void) @@ -11031,13 +11050,12 @@ void SaveSetup(void) for (i = 0; i < ARRAY_SIZE(global_setup_tokens); i++) { // just to make things nicer :) - if (global_setup_tokens[i].value == &setup.player_uuid || - global_setup_tokens[i].value == &setup.multiple_users || + if (global_setup_tokens[i].value == &setup.multiple_users || global_setup_tokens[i].value == &setup.sound || global_setup_tokens[i].value == &setup.graphics_set || global_setup_tokens[i].value == &setup.volume_simple || global_setup_tokens[i].value == &setup.network_mode || - global_setup_tokens[i].value == &setup.api_server || + global_setup_tokens[i].value == &setup.use_api_server || global_setup_tokens[i].value == &setup.touch.control_type || global_setup_tokens[i].value == &setup.touch.grid_xsize[0] || global_setup_tokens[i].value == &setup.touch.grid_xsize[1])