X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Ffiles.c;h=93d38e7c44e2d238e1cc7bb9b64168c489e30b2b;hb=f1aebde75ba585d30f7fd9172cad2fb65c14f645;hp=f3bf9f757856260f3a77f672ced1f06a1dd3b9c0;hpb=9bbc42c66f07e770752e643c0ee4cacec95780d3;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index f3bf9f75..93d38e7c 100644 --- a/src/files.c +++ b/src/files.c @@ -327,6 +327,11 @@ static struct LevelFileConfigInfo chunk_config_ELEM[] = TYPE_BOOLEAN, CONF_VALUE_8_BIT(16), &li.finish_dig_collect, TRUE }, + { + EL_PLAYER_1, -1, + TYPE_BOOLEAN, CONF_VALUE_8_BIT(17), + &li.keep_walkable_ce, FALSE + }, // (these values are different for each player) { @@ -3637,7 +3642,7 @@ static void CopyNativeLevel_RND_to_EM(struct LevelInfo *level) // initialize player positions and delete players from the playfield for (y = 0; y < cav->height; y++) for (x = 0; x < cav->width; x++) { - if (ELEM_IS_PLAYER(level->field[x][y])) + if (IS_PLAYER_ELEMENT(level->field[x][y])) { int player_nr = GET_PLAYER_NR(level->field[x][y]); @@ -5890,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) @@ -6123,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; } } @@ -6463,6 +6480,34 @@ static void LoadLevel_InitVersion(struct LevelInfo *level) // CE actions were triggered by unfinished digging/collecting up to 4.2.2.0 if (level->game_version <= VERSION_IDENT(4,2,2,0)) level->finish_dig_collect = FALSE; + + // CE changing to player was kept under the player if walkable up to 4.2.3.1 + if (level->game_version <= VERSION_IDENT(4,2,3,1)) + 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) @@ -6691,6 +6736,7 @@ static void LoadLevelTemplate_LoadAndInit(void) LoadLevel_InitVersion(&level_template); LoadLevel_InitElements(&level_template); + LoadLevel_InitSettings(&level_template); ActivateLevelTemplate(); } @@ -6731,6 +6777,7 @@ static void LoadLevel_LoadAndInit(struct NetworkLevelInfo *network_level) LoadLevel_InitVersion(&level); LoadLevel_InitElements(&level); LoadLevel_InitPlayfield(&level); + LoadLevel_InitSettings(&level); LoadLevel_InitNativeEngines(&level); } @@ -8792,7 +8839,6 @@ void LoadScore(int nr) void SaveScore_OLD(int nr) { int i; - int permissions = (program.global_scores ? PERMS_PUBLIC : PERMS_PRIVATE); char *filename = getScoreFilename(nr); FILE *file; @@ -8813,7 +8859,7 @@ void SaveScore_OLD(int nr) fclose(file); - SetFilePermissions(filename, permissions); + SetFilePermissions(filename, PERMS_PRIVATE); } #endif @@ -8882,7 +8928,6 @@ static void SaveScore_TAPE(FILE *file, struct ScoreInfo *scores) static void SaveScoreToFilename(char *filename) { FILE *file; - int permissions = (program.global_scores ? PERMS_PUBLIC : PERMS_PRIVATE); int info_chunk_size; int name_chunk_size; int scor_chunk_size; @@ -8925,7 +8970,7 @@ static void SaveScoreToFilename(char *filename) fclose(file); - SetFilePermissions(filename, permissions); + SetFilePermissions(filename, PERMS_PRIVATE); } void SaveScore(int nr) @@ -8987,10 +9032,11 @@ static void DownloadServerScoreToCacheExt(struct HttpRequest *request, snprintf(request->body, MAX_HTTP_BODY_SIZE, "{\n" " \"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); + levelset.identifier, nr); + + ConvertHttpRequestBodyToServerEncoding(request); if (!DoHttpRequest(request, response)) { @@ -9158,7 +9204,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; } @@ -9170,7 +9216,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); @@ -9183,7 +9229,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); @@ -9227,6 +9273,13 @@ 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" " \"game_version\": \"%s\",\n" @@ -9236,6 +9289,9 @@ 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" @@ -9243,13 +9299,16 @@ static void UploadScoreToServerExt(struct HttpRequest *request, " \"tape\": \"%s\"\n" "}\n", 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, @@ -9257,6 +9316,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)) @@ -13088,8 +13154,8 @@ void CreateLevelSketchImages(void) sprintf(basename1, "%04d.bmp", i); sprintf(basename2, "%04ds.bmp", i); - filename1 = getPath2(global.create_images_dir, basename1); - filename2 = getPath2(global.create_images_dir, basename2); + filename1 = getPath2(global.create_sketch_images_dir, basename1); + filename2 = getPath2(global.create_sketch_images_dir, basename2); DrawSizedElement(0, 0, element, TILESIZE); BlitBitmap(drawto, bitmap1, SX, SY, TILEX, TILEY, 0, 0); @@ -13133,6 +13199,104 @@ void CreateLevelSketchImages(void) } +// ---------------------------------------------------------------------------- +// create and save images for element collecting animations (raw BMP format) +// ---------------------------------------------------------------------------- + +static boolean createCollectImage(int element) +{ + return (IS_COLLECTIBLE(element) && !IS_SP_ELEMENT(element)); +} + +void CreateCollectElementImages(void) +{ + int i, j; + int num_steps = 8; + int anim_frames = num_steps - 1; + int tile_size = TILESIZE; + int anim_width = tile_size * anim_frames; + int anim_height = tile_size; + int num_collect_images = 0; + int pos_collect_images = 0; + + for (i = 0; i < MAX_NUM_ELEMENTS; i++) + if (createCollectImage(i)) + num_collect_images++; + + Info("Creating %d element collecting animation images ...", + num_collect_images); + + int dst_width = anim_width * 2; + int dst_height = anim_height * num_collect_images / 2; + Bitmap *dst_bitmap = CreateBitmap(dst_width, dst_height, DEFAULT_DEPTH); + char *basename = "RocksCollect.bmp"; + char *filename = getPath2(global.create_collect_images_dir, basename); + + for (i = 0; i < MAX_NUM_ELEMENTS; i++) + { + if (!createCollectImage(i)) + continue; + + int dst_x = (pos_collect_images / (num_collect_images / 2)) * anim_width; + int dst_y = (pos_collect_images % (num_collect_images / 2)) * anim_height; + int graphic = el2img(i); + char *token_name = element_info[i].token_name; + Bitmap *tmp_bitmap = CreateBitmap(tile_size, tile_size, DEFAULT_DEPTH); + Bitmap *src_bitmap; + int src_x, src_y; + + Info("- creating collecting image for '%s' ...", token_name); + + getGraphicSource(graphic, 0, &src_bitmap, &src_x, &src_y); + + BlitBitmap(src_bitmap, tmp_bitmap, src_x, src_y, + tile_size, tile_size, 0, 0); + + tmp_bitmap->surface_masked = tmp_bitmap->surface; + + for (j = 0; j < anim_frames; j++) + { + int frame_size_final = tile_size * (anim_frames - j) / num_steps; + int frame_size = frame_size_final * num_steps; + int offset = (tile_size - frame_size_final) / 2; + Bitmap *frame_bitmap = ZoomBitmap(tmp_bitmap, frame_size, frame_size); + + while (frame_size > frame_size_final) + { + frame_size /= 2; + + Bitmap *half_bitmap = ZoomBitmap(frame_bitmap, frame_size, frame_size); + + FreeBitmap(frame_bitmap); + + frame_bitmap = half_bitmap; + } + + BlitBitmap(frame_bitmap, dst_bitmap, 0, 0, + frame_size_final, frame_size_final, + dst_x + j * tile_size + offset, dst_y + offset); + + FreeBitmap(frame_bitmap); + } + + tmp_bitmap->surface_masked = NULL; + + FreeBitmap(tmp_bitmap); + + pos_collect_images++; + } + + if (SDL_SaveBMP(dst_bitmap->surface, filename) != 0) + Fail("cannot save element collecting image file '%s'", filename); + + FreeBitmap(dst_bitmap); + + Info("Done."); + + CloseAllAndExit(0); +} + + // ---------------------------------------------------------------------------- // create and save images for custom and group elements (raw BMP format) // ----------------------------------------------------------------------------