X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=6b6078ba20128a87bdcb62905afa7df173464813;hb=8d55afd03c67ddfe49d92701b06b288de6db939d;hp=8b50f8e2fca4f9270568c072478e509dd682895c;hpb=5967c94482902b251e034b55e4f85343d94c9610;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index 8b50f8e2..6b6078ba 100644 --- a/src/files.c +++ b/src/files.c @@ -5895,6 +5895,21 @@ int getMappedElement_SB(int element_ascii, boolean use_ces) return EL_UNDEFINED; } +static void SetLevelSettings_SB(struct LevelInfo *level) +{ + // time settings + level->time = 0; + level->use_step_counter = TRUE; + + // score settings + level->score[SC_TIME_BONUS] = 0; + level->time_score_base = 1; + level->rate_time_over_score = TRUE; + + // game settings + level->auto_exit_sokoban = TRUE; +} + static void LoadLevelFromFileInfo_SB(struct LevelInfo *level, struct LevelFileInfo *level_file_info, boolean level_info_only) @@ -6128,14 +6143,11 @@ static void LoadLevelFromFileInfo_SB(struct LevelInfo *level, } // set special level settings for Sokoban levels - - level->time = 0; - level->use_step_counter = TRUE; + SetLevelSettings_SB(level); if (load_xsb_to_ces) { // special global settings can now be set in level template - level->use_custom_template = TRUE; } } @@ -6474,8 +6486,28 @@ static void LoadLevel_InitVersion(struct LevelInfo *level) level->keep_walkable_ce = TRUE; } +static void LoadLevel_InitSettings_SB(struct LevelInfo *level) +{ + boolean is_sokoban_level = TRUE; // unless non-Sokoban elements found + int x, y; + + // check if this level is (not) a Sokoban level + for (y = 0; y < level->fieldy; y++) + for (x = 0; x < level->fieldx; x++) + if (!IS_SB_ELEMENT(Tile[x][y])) + is_sokoban_level = FALSE; + + if (is_sokoban_level) + { + // set special level settings for Sokoban levels + SetLevelSettings_SB(level); + } +} + static void LoadLevel_InitSettings(struct LevelInfo *level) { + // adjust level settings for (non-native) Sokoban-style levels + LoadLevel_InitSettings_SB(level); } static void LoadLevel_InitStandardElements(struct LevelInfo *level) @@ -8505,6 +8537,7 @@ static void setScoreInfoToDefaultsExt(struct ScoreInfo *scores) scores->last_added_local = -1; scores->updated = FALSE; + scores->uploaded = FALSE; scores->force_last_added = FALSE; } @@ -8970,14 +9003,10 @@ void SaveScore(int nr) SaveScoreToFilename(filename); } -static void ExecuteAsThread(SDL_ThreadFunction function, char *name, int data, +static void ExecuteAsThread(SDL_ThreadFunction function, char *name, void *data, char *error) { - static int data_static; - - data_static = data; - - SDL_Thread *thread = SDL_CreateThread(function, name, &data_static); + SDL_Thread *thread = SDL_CreateThread(function, name, data); if (thread != NULL) SDL_DetachThread(thread); @@ -8988,9 +9017,30 @@ static void ExecuteAsThread(SDL_ThreadFunction function, char *name, int 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; @@ -8999,11 +9049,14 @@ static void DownloadServerScoreToCacheExt(struct HttpRequest *request, snprintf(request->body, MAX_HTTP_BODY_SIZE, "{\n" + "%s" " \"levelset_identifier\": \"%s\",\n" - " \"level_nr\": \"%d\",\n" - " \"rate_time_over_score\": \"%d\"\n" + " \"level_nr\": \"%d\"\n" "}\n", - levelset.identifier, nr, level.rate_time_over_score); + getPasswordJSON(setup.api_server_password), + levelset.identifier, level_nr); + + ConvertHttpRequestBodyToServerEncoding(request); if (!DoHttpRequest(request, response)) { @@ -9030,7 +9083,7 @@ static void DownloadServerScoreToCacheExt(struct HttpRequest *request, ConvertHttpResponseBodyToClientEncoding(response); - char *filename = getScoreCacheFilename(nr); + char *filename = score_cache_filename; FILE *file; int i; @@ -9054,28 +9107,48 @@ 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); } -static int DownloadServerScoreToCacheThread(void *data) +struct DownloadServerScoreToCacheThreadData { - DownloadServerScoreToCache(*(int *)data); + int level_nr; + char *score_cache_filename; +}; + +static int DownloadServerScoreToCacheThread(void *data_raw) +{ + struct DownloadServerScoreToCacheThreadData *data = 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) { + struct DownloadServerScoreToCacheThreadData *data = + checked_malloc(sizeof(struct DownloadServerScoreToCacheThreadData)); + char *score_cache_filename = getScoreCacheFilename(nr); + + data->level_nr = nr; + data->score_cache_filename = getStringCopy(score_cache_filename); + ExecuteAsThread(DownloadServerScoreToCacheThread, - "DownloadServerScoreToCache", nr, + "DownloadServerScoreToCache", data, "download scores from server"); } @@ -9171,7 +9244,7 @@ static char *get_file_base64(char *filename) if (stat(filename, &file_status) != 0) { - Error("cannot stat file '%s'\n", filename); + Error("cannot stat file '%s'", filename); return NULL; } @@ -9183,7 +9256,7 @@ static char *get_file_base64(char *filename) if (!(file = fopen(filename, MODE_READ))) { - Error("cannot open file '%s'\n", filename); + Error("cannot open file '%s'", filename); checked_free(buffer); @@ -9196,7 +9269,7 @@ static char *get_file_base64(char *filename) if (c == EOF) { - Error("cannot read from input file '%s'\n", filename); + Error("cannot read from input file '%s'", filename); fclose(file); checked_free(buffer); @@ -9221,17 +9294,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) { @@ -9240,8 +9312,16 @@ static void UploadScoreToServerExt(struct HttpRequest *request, return; } + 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); + snprintf(request->body, MAX_HTTP_BODY_SIZE, "{\n" + "%s" " \"game_version\": \"%s\",\n" " \"levelset_identifier\": \"%s\",\n" " \"levelset_name\": \"%s\",\n" @@ -9249,20 +9329,27 @@ static void UploadScoreToServerExt(struct HttpRequest *request, " \"levelset_num_levels\": \"%d\",\n" " \"levelset_first_level\": \"%d\",\n" " \"level_nr\": \"%d\",\n" + " \"level_name\": \"%s\",\n" + " \"level_author\": \"%s\",\n" + " \"rate_time_over_score\": \"%d\",\n" " \"player_name\": \"%s\",\n" " \"score\": \"%d\",\n" " \"time\": \"%d\",\n" " \"tape_basename\": \"%s\",\n" " \"tape\": \"%s\"\n" "}\n", + getPasswordJSON(setup.api_server_password), getProgramRealVersionString(), - leveldir_current->identifier, - leveldir_current->name, - leveldir_current->author, + levelset_identifier, + levelset_name, + levelset_author, leveldir_current->levels, leveldir_current->first_level, level_nr, - score_entry->name, + level_name, + level_author, + level.rate_time_over_score, + player_name, score_entry->score, score_entry->time, score_entry->tape_basename, @@ -9270,6 +9357,13 @@ static void UploadScoreToServerExt(struct HttpRequest *request, checked_free(tape_base64); + checked_free(levelset_identifier); + checked_free(levelset_name); + checked_free(levelset_author); + checked_free(level_name); + checked_free(level_author); + checked_free(player_name); + ConvertHttpRequestBodyToServerEncoding(request); if (!DoHttpRequest(request, response)) @@ -9287,30 +9381,57 @@ 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); } -static int UploadScoreToServerThread(void *data) +struct UploadScoreToServerThreadData +{ + int level_nr; + char *score_tape_filename; + struct ScoreEntry score_entry; +}; + +static int UploadScoreToServerThread(void *data_raw) { - UploadScoreToServer(*(int *)data); + struct UploadScoreToServerThreadData *data = data_raw; + + 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) { + 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); + + data->level_nr = nr; + data->score_entry = *score_entry; + data->score_tape_filename = getStringCopy(score_tape_filename); + ExecuteAsThread(UploadScoreToServerThread, - "UploadScoreToServer", nr, + "UploadScoreToServer", data, "upload score to server"); } @@ -9587,6 +9708,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" @@ -10223,6 +10348,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