X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=0d4eb7fe9ced85533ce8bbaa2b2129d74c6b6bcd;hb=0feae4f4d0bc1f62266a0508306a87c78c6e41f9;hp=2daffc83846a1a7c3e3fb7dea3c7eb6ec105bd6b;hpb=a88bb81d863f922e518970df22fcff1bb3c15c4c;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index 2daffc83..0d4eb7fe 100644 --- a/src/files.c +++ b/src/files.c @@ -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; } @@ -9016,9 +9040,30 @@ static void ExecuteAsThread(SDL_ThreadFunction function, char *name, void *data, Delay(1); } +static 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 nr) + int level_nr, + char *score_cache_filename) { request->hostname = setup.api_server_hostname; request->port = API_SERVER_PORT; @@ -9027,10 +9072,12 @@ static void DownloadServerScoreToCacheExt(struct HttpRequest *request, snprintf(request->body, MAX_HTTP_BODY_SIZE, "{\n" + "%s" " \"levelset_identifier\": \"%s\",\n" " \"level_nr\": \"%d\"\n" "}\n", - levelset.identifier, nr); + getPasswordJSON(setup.api_server_password), + levelset.identifier, level_nr); ConvertHttpRequestBodyToServerEncoding(request); @@ -9059,7 +9106,7 @@ static void DownloadServerScoreToCacheExt(struct HttpRequest *request, ConvertHttpResponseBodyToClientEncoding(response); - char *filename = getScoreCacheFilename(nr); + char *filename = score_cache_filename; FILE *file; int i; @@ -9083,12 +9130,13 @@ static void DownloadServerScoreToCacheExt(struct HttpRequest *request, server_scores.updated = TRUE; } -static void DownloadServerScoreToCache(int nr) +static void DownloadServerScoreToCache(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, nr); + DownloadServerScoreToCacheExt(request, response, + level_nr, score_cache_filename); checked_free(request); checked_free(response); @@ -9097,25 +9145,33 @@ static void DownloadServerScoreToCache(int nr) struct DownloadServerScoreToCacheThreadData { int level_nr; + char *score_cache_filename; }; static int DownloadServerScoreToCacheThread(void *data_raw) { struct DownloadServerScoreToCacheThreadData *data = data_raw; - DownloadServerScoreToCache(data->level_nr); + 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); - data.level_nr = nr; + data->level_nr = nr; + data->score_cache_filename = getStringCopy(score_cache_filename); ExecuteAsThread(DownloadServerScoreToCacheThread, - "DownloadServerScoreToCache", &data, + "DownloadServerScoreToCache", data, "download scores from server"); } @@ -9261,17 +9317,16 @@ static char *get_file_base64(char *filename) static void UploadScoreToServerExt(struct HttpRequest *request, struct HttpResponse *response, - int nr) + int level_nr, + char *score_tape_filename, + struct ScoreEntry *score_entry) { - struct ScoreEntry *score_entry = &scores.entry[scores.last_added]; - request->hostname = setup.api_server_hostname; request->port = API_SERVER_PORT; request->method = API_SERVER_METHOD; request->uri = API_SERVER_URI_ADD; - char *tape_filename = getScoreTapeFilename(score_entry->tape_basename, nr); - char *tape_base64 = get_file_base64(tape_filename); + char *tape_base64 = get_file_base64(score_tape_filename); if (tape_base64 == NULL) { @@ -9289,6 +9344,7 @@ static void UploadScoreToServerExt(struct HttpRequest *request, snprintf(request->body, MAX_HTTP_BODY_SIZE, "{\n" + "%s" " \"game_version\": \"%s\",\n" " \"levelset_identifier\": \"%s\",\n" " \"levelset_name\": \"%s\",\n" @@ -9305,6 +9361,7 @@ static void UploadScoreToServerExt(struct HttpRequest *request, " \"tape_basename\": \"%s\",\n" " \"tape\": \"%s\"\n" "}\n", + getPasswordJSON(setup.api_server_password), getProgramRealVersionString(), levelset_identifier, levelset_name, @@ -9347,14 +9404,18 @@ static void UploadScoreToServerExt(struct HttpRequest *request, return; } + + server_scores.uploaded = TRUE; } -static void UploadScoreToServer(int nr) +static void UploadScoreToServer(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, nr); + UploadScoreToServerExt(request, response, + level_nr, score_tape_filename, score_entry); checked_free(request); checked_free(response); @@ -9363,25 +9424,39 @@ static void UploadScoreToServer(int nr) struct UploadScoreToServerThreadData { int level_nr; + char *score_tape_filename; + struct ScoreEntry score_entry; }; static int UploadScoreToServerThread(void *data_raw) { struct UploadScoreToServerThreadData *data = data_raw; - UploadScoreToServer(data->level_nr); + UploadScoreToServer(data->level_nr, + 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]; + + if (score_tape_filename == NULL) + score_tape_filename = getScoreTapeFilename(score_entry->tape_basename, nr); - data.level_nr = nr; + 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"); } @@ -9390,7 +9465,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) @@ -9658,6 +9741,10 @@ 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_STRING, &setup.touch.control_type, "touch.control_type" @@ -10294,6 +10381,7 @@ 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->touch.control_type = getStringCopy(TOUCH_CONTROL_DEFAULT); si->touch.move_distance = TOUCH_MOVE_DISTANCE_DEFAULT; // percent