X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=e9d2cb5968a1677854bb94e2bc38ab6a6de243b6;hb=08cbfb7b24ed1170a91e5e9d6d683d6162f120f9;hp=3d4670f0b0f76bedc515645cd3e1a7e234839bb7;hpb=3e7289558277c65b6ddcbef0f663d100e7d237fc;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index 3d4670f0..e9d2cb59 100644 --- a/src/files.c +++ b/src/files.c @@ -159,14 +159,17 @@ static void setLevelInfoToDefaults(struct LevelInfo *level) level->double_speed = FALSE; level->initial_gravity = FALSE; level->em_slippery_gems = FALSE; - level->block_last_field = FALSE; - level->sp_block_last_field = TRUE; level->instant_relocation = FALSE; level->can_pass_to_walkable = FALSE; level->grow_into_diggable = TRUE; + level->block_last_field = FALSE; /* EM does not block by default */ + level->sp_block_last_field = TRUE; /* SP blocks the last field */ + level->block_delay = 8; /* when blocking, block 8 frames */ + level->sp_block_delay = 9; /* SP indeed blocks 9 frames, not 8 */ + level->can_move_into_acid_bits = ~0; /* everything can move into acid */ - level->dont_collide_with_bits = ~0; /* always deadly when colliding */ + level->dont_collide_with_bits = ~0; /* always deadly when colliding */ level->use_spring_bug = FALSE; level->use_step_counter = FALSE; @@ -310,6 +313,8 @@ static void setLevelInfoToDefaults(struct LevelInfo *level) level->no_valid_file = FALSE; + level->changed = FALSE; + if (leveldir_current == NULL) /* only when dumping level */ return; @@ -2197,9 +2202,11 @@ static void LoadLevel_InitVersion(struct LevelInfo *level, char *filename) if (level->game_version == VERSION_IDENT(2,0,1,0)) level->em_slippery_gems = TRUE; + /* springs could be pushed over pits before (pre-release version) 2.2.0 */ if (level->game_version < VERSION_IDENT(2,2,0,0)) level->use_spring_bug = TRUE; + /* only few elements were able to actively move into acid before 3.1.0 */ if (level->game_version < VERSION_IDENT(3,1,0,0)) { int i, j; @@ -2229,8 +2236,25 @@ static void LoadLevel_InitVersion(struct LevelInfo *level, char *filename) } } } + +#if 1 /* USE_NEW_BLOCK_STYLE */ + /* blocking the last field when moving was corrected in version 3.1.1 */ + if (level->game_version < VERSION_IDENT(3,1,1,0)) + { +#if 0 + printf("::: %d\n", level->block_last_field); +#endif + + /* even "not blocking" was blocking the last field for one frame */ + level->block_delay = (level->block_last_field ? 7 : 1); + level->sp_block_delay = (level->sp_block_last_field ? 7 : 1); + + level->block_last_field = TRUE; + level->sp_block_last_field = TRUE; + } +#endif } - else + else /* always use the latest game engine version */ { #if 0 printf("\n::: ALWAYS USE LATEST ENGINE FOR THIS LEVEL: [%d] '%s'\n", @@ -2352,6 +2376,7 @@ static void LoadLevel_InitElements(struct LevelInfo *level, char *filename) } /* initialize "can_explode" field for old levels which did not store this */ + /* !!! CHECK THIS -- "<= 3,1,0,0" IS PROBABLY WRONG !!! */ if (level->game_version <= VERSION_IDENT(3,1,0,0)) { for (i = 0; i < NUM_CUSTOM_ELEMENTS; i++) @@ -2367,6 +2392,22 @@ static void LoadLevel_InitElements(struct LevelInfo *level, char *filename) } } + /* correct previously hard-coded move delay values for maze runner style */ + if (level->game_version < VERSION_IDENT(3,1,1,0)) + { + for (i = 0; i < NUM_CUSTOM_ELEMENTS; i++) + { + int element = EL_CUSTOM_START + i; + + if (element_info[element].move_pattern & MV_MAZE_RUNNER_STYLE) + { + /* previously hard-coded and therefore ignored */ + element_info[element].move_delay_fixed = 9; + element_info[element].move_delay_random = 0; + } + } + } + #if 0 /* set default push delay values (corrected since version 3.0.7-1) */ if (level->game_version < VERSION_IDENT(3,0,7,1)) @@ -2470,8 +2511,13 @@ void LoadLevelTemplate(int nr) LoadLevelFromFilename_RND(&level_template, filename); #endif +#if 1 + LoadLevel_InitVersion(&level_template, filename); + LoadLevel_InitElements(&level_template, filename); +#else LoadLevel_InitVersion(&level, filename); LoadLevel_InitElements(&level, filename); +#endif ActivateLevelTemplate(); } @@ -3579,6 +3625,8 @@ void DumpTape(struct TapeInfo *tape) printf_line("-", 79); printf("Tape of Level %03d (file version %08d, game version %08d)\n", tape->level_nr, tape->file_version, tape->game_version); + printf(" (effective engine version %08d)\n", + tape->engine_version); printf("Level series identifier: '%s'\n", tape->level_identifier); printf_line("-", 79);