X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=bffb16052eab5ce67593c85d8296d430d0bd57ed;hb=d9479668b752772803e523561bc544a6c7efe725;hp=4c5a366138a27fb6df88a3ce6a2688ce4e82c93b;hpb=746d91a67b5059c607e8e6bd0453e6e0738ffe45;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index 4c5a3661..bffb1605 100644 --- a/src/files.c +++ b/src/files.c @@ -2814,8 +2814,9 @@ static int LoadLevel_CUS3(File *file, int chunk_size, struct LevelInfo *level) for (x = 0; x < 3; x++) ei->content.e[x][y] = getMappedElement(getFile16BitBE(file)); + // bits 0 - 31 of "has_event[]" event_bits = getFile32BitBE(file); - for (j = 0; j < NUM_CHANGE_EVENTS; j++) + for (j = 0; j < MIN(NUM_CHANGE_EVENTS, 32); j++) if (event_bits & (1 << j)) ei->change->has_event[j] = TRUE; @@ -9445,10 +9446,25 @@ static char *get_file_base64(char *filename) return buffer_encoded; } +static void PrepareScoreTapesForUpload(char *leveldir_subdir) +{ + MarkTapeDirectoryUploadsAsIncomplete(leveldir_subdir); + + // if score tape not uploaded, ask for uploading missing tapes later + if (!setup.has_remaining_tapes) + setup.ask_for_remaining_tapes = TRUE; + + setup.provide_uploading_tapes = TRUE; + setup.has_remaining_tapes = TRUE; + + SaveSetup_ServerSetup(); +} + struct ApiAddScoreThreadData { int level_nr; boolean tape_saved; + char *leveldir_subdir; char *score_tape_filename; struct ScoreEntry score_entry; }; @@ -9465,8 +9481,9 @@ static void *CreateThreadData_ApiAddScore(int nr, boolean tape_saved, data->level_nr = nr; data->tape_saved = tape_saved; - data->score_entry = *score_entry; + data->leveldir_subdir = getStringCopy(leveldir_current->subdir); data->score_tape_filename = getStringCopy(score_tape_filename); + data->score_entry = *score_entry; return data; } @@ -9475,6 +9492,7 @@ static void FreeThreadData_ApiAddScore(void *data_raw) { struct ApiAddScoreThreadData *data = data_raw; + checked_free(data->leveldir_subdir); checked_free(data->score_tape_filename); checked_free(data); } @@ -9586,6 +9604,13 @@ static void HandleResponse_ApiAddScore(struct HttpResponse *response, server_scores.uploaded = TRUE; } +static void HandleFailure_ApiAddScore(void *data_raw) +{ + struct ApiAddScoreThreadData *data = data_raw; + + PrepareScoreTapesForUpload(data->leveldir_subdir); +} + #if defined(PLATFORM_EMSCRIPTEN) static void Emscripten_ApiAddScore_Loaded(unsigned handle, void *data_raw, void *buffer, unsigned int size) @@ -9601,6 +9626,8 @@ static void Emscripten_ApiAddScore_Loaded(unsigned handle, void *data_raw, else { Error("server response too large to handle (%d bytes)", size); + + HandleFailure_ApiAddScore(data_raw); } FreeThreadData_ApiAddScore(data_raw); @@ -9611,6 +9638,8 @@ static void Emscripten_ApiAddScore_Failed(unsigned handle, void *data_raw, { Error("server failed to handle request: %d %s", code, status); + HandleFailure_ApiAddScore(data_raw); + FreeThreadData_ApiAddScore(data_raw); } @@ -9653,6 +9682,8 @@ static void ApiAddScore_HttpRequestExt(struct HttpRequest *request, { Error("HTTP request failed: %s", GetHttpError()); + HandleFailure_ApiAddScore(data_raw); + return; } @@ -9662,6 +9693,8 @@ static void ApiAddScore_HttpRequestExt(struct HttpRequest *request, response->status_code, response->status_text); + HandleFailure_ApiAddScore(data_raw); + return; } @@ -9713,7 +9746,11 @@ static void ApiAddScoreAsThread(int nr, boolean tape_saved, void SaveServerScore(int nr, boolean tape_saved) { if (!runtime.use_api_server) + { + PrepareScoreTapesForUpload(leveldir_current->subdir); + return; + } ApiAddScoreAsThread(nr, tape_saved, NULL); } @@ -10049,6 +10086,10 @@ static struct TokenInfo server_setup_tokens[] = TYPE_STRING, &setup.player_uuid, "player_uuid" }, + { + TYPE_INTEGER, + &setup.player_version, "player_version" + }, { TYPE_SWITCH, &setup.use_api_server, TEST_PREFIX "use_api_server" @@ -10065,10 +10106,22 @@ static struct TokenInfo server_setup_tokens[] = TYPE_SWITCH, &setup.ask_for_uploading_tapes, TEST_PREFIX "ask_for_uploading_tapes" }, + { + TYPE_SWITCH, + &setup.ask_for_remaining_tapes, TEST_PREFIX "ask_for_remaining_tapes" + }, { TYPE_SWITCH, &setup.provide_uploading_tapes, TEST_PREFIX "provide_uploading_tapes" }, + { + TYPE_SWITCH, + &setup.ask_for_using_api_server,TEST_PREFIX "ask_for_using_api_server" + }, + { + TYPE_SWITCH, + &setup.has_remaining_tapes, TEST_PREFIX "has_remaining_tapes" + }, }; static struct TokenInfo editor_setup_tokens[] = @@ -10161,6 +10214,10 @@ static struct TokenInfo editor_cascade_setup_tokens[] = TYPE_SWITCH, &setup.editor_cascade.el_ge, "editor.cascade.el_ge" }, + { + TYPE_SWITCH, + &setup.editor_cascade.el_es, "editor.cascade.el_es" + }, { TYPE_SWITCH, &setup.editor_cascade.el_ref, "editor.cascade.el_ref" @@ -10865,12 +10922,16 @@ static void setSetupInfoToDefaults_AutoSetup(struct SetupInfo *si) static void setSetupInfoToDefaults_ServerSetup(struct SetupInfo *si) { si->player_uuid = NULL; // (will be set later) + si->player_version = 1; // (will be set later) 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->ask_for_remaining_tapes = FALSE; si->provide_uploading_tapes = TRUE; + si->ask_for_using_api_server = TRUE; + si->has_remaining_tapes = FALSE; } static void setSetupInfoToDefaults_EditorCascade(struct SetupInfo *si) @@ -10891,6 +10952,7 @@ static void setSetupInfoToDefaults_EditorCascade(struct SetupInfo *si) si->editor_cascade.el_steel_chars = FALSE; si->editor_cascade.el_ce = FALSE; si->editor_cascade.el_ge = FALSE; + si->editor_cascade.el_es = FALSE; si->editor_cascade.el_ref = FALSE; si->editor_cascade.el_user = FALSE; si->editor_cascade.el_dynamic = FALSE; @@ -11224,6 +11286,7 @@ void LoadSetup_ServerSetup(void) { // player UUID does not yet exist in setup file setup.player_uuid = getStringCopy(getUUID()); + setup.player_version = 2; SaveSetup_ServerSetup(); } @@ -11921,6 +11984,7 @@ int get_parameter_value(char *value_raw, char *suffix, int type) string_has_parameter(value, "pingpong") ? ANIM_PINGPONG : string_has_parameter(value, "pingpong2") ? ANIM_PINGPONG2 : string_has_parameter(value, "random") ? ANIM_RANDOM : + string_has_parameter(value, "random_static") ? ANIM_RANDOM_STATIC : string_has_parameter(value, "ce_value") ? ANIM_CE_VALUE : string_has_parameter(value, "ce_score") ? ANIM_CE_SCORE : string_has_parameter(value, "ce_delay") ? ANIM_CE_DELAY : @@ -11928,6 +11992,7 @@ int get_parameter_value(char *value_raw, char *suffix, int type) string_has_parameter(value, "vertical") ? ANIM_VERTICAL : string_has_parameter(value, "centered") ? ANIM_CENTERED : string_has_parameter(value, "all") ? ANIM_ALL : + string_has_parameter(value, "tiled") ? ANIM_TILED : ANIM_DEFAULT); if (string_has_parameter(value, "once"))