tape.scr_fieldx = SCR_FIELDX_DEFAULT;
tape.scr_fieldy = SCR_FIELDY_DEFAULT;
+ tape.no_info_chunk = TRUE;
tape.no_valid_file = FALSE;
}
int level_identifier_size;
int i;
+ tape->no_info_chunk = FALSE;
+
level_identifier_size = getFile16BitBE(file);
level_identifier = checked_malloc(level_identifier_size);
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)
// 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;
return password_json;
}
-static void DownloadServerScoreToCacheExt(struct HttpRequest *request,
- struct HttpResponse *response,
- int level_nr,
- char *score_cache_filename)
+struct ApiGetScoreThreadData
+{
+ 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;
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);
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
+static int ApiGetScoreThread(void *data_raw)
{
- int level_nr;
- char *score_cache_filename;
-};
-
-static int DownloadServerScoreToCacheThread(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);
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");
}
void LoadServerScore(int nr, boolean download_score)
{
- if (!setup.api_server)
+ if (!setup.use_api_server)
return;
// always start with reliable default values
// (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);
}
}
return buffer_encoded;
}
-static void UploadScoreToServerExt(struct HttpRequest *request,
- struct HttpResponse *response,
- int level_nr,
- char *score_tape_filename,
- struct ScoreEntry *score_entry)
+struct ApiAddScoreThreadData
+{
+ 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;
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 *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"
"}\n",
getPasswordJSON(setup.api_server_password),
getProgramRealVersionString(),
+ getProgramPlatformString(),
+ (int)global.autoplay_time,
levelset_identifier,
levelset_name,
levelset_author,
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
-{
- 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);
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)
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)
// 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);
},
{
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,
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
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])