X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=93ab6bc8e1b564612179ae24109ec3be17b2684c;hb=ea6e4698905d7440a265e323d03cf13fc323c44b;hp=473a73926cbcaa9f24502582db6844c9746b786a;hpb=983b7bc7f3493b1522d08d8e7bdecb3bd8e462eb;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index 473a7392..93ab6bc8 100644 --- a/src/files.c +++ b/src/files.c @@ -88,11 +88,12 @@ void setElementChangePages(struct ElementInfo *ei, int change_pages) void setElementChangeInfoToDefaults(struct ElementChangeInfo *change) { - int x, y; + int i, x, y; change->can_change = FALSE; - change->events = CE_BITMASK_DEFAULT; + for (i = 0; i < NUM_CHANGE_EVENTS; i++) + change->has_event[i] = FALSE; change->trigger_player = CH_PLAYER_ANY; change->trigger_side = CH_SIDE_ANY; @@ -171,8 +172,11 @@ static void setLevelInfoToDefaults(struct LevelInfo *level) level->block_last_field = FALSE; /* EM does not block by default */ level->sp_block_last_field = TRUE; /* SP blocks the last field */ + +#if 0 /* !!! THIS IS NOT A LEVEL SETTING => LOGIC MOVED TO "game.c" !!! */ level->block_delay = 8; /* when blocking, block 8 frames */ level->sp_block_delay = 9; /* SP indeed blocks 9 frames, not 8 */ +#endif level->can_move_into_acid_bits = ~0; /* everything can move into acid */ level->dont_collide_with_bits = ~0; /* always deadly when colliding */ @@ -1087,6 +1091,7 @@ static int LoadLevel_CUS3(FILE *file, int chunk_size, struct LevelInfo *level) for (i = 0; i < num_changed_custom_elements; i++) { int element = getFile16BitBE(file); + unsigned long event_bits; if (!IS_CUSTOM_ELEMENT(element)) { @@ -1125,7 +1130,10 @@ static int LoadLevel_CUS3(FILE *file, int chunk_size, struct LevelInfo *level) element_info[element].content[x][y] = getMappedElement(getFile16BitBE(file)); - element_info[element].change->events = getFile32BitBE(file); + event_bits = getFile32BitBE(file); + for (j = 0; j < NUM_CHANGE_EVENTS; j++) + if (event_bits & (1 << j)) + element_info[element].change->has_event[j] = TRUE; element_info[element].change->target_element = getMappedElement(getFile16BitBE(file)); @@ -1167,7 +1175,7 @@ static int LoadLevel_CUS4(FILE *file, int chunk_size, struct LevelInfo *level) struct ElementInfo *ei; int chunk_size_expected; int element; - int i, x, y; + int i, j, x, y; element = getFile16BitBE(file); @@ -1249,11 +1257,15 @@ static int LoadLevel_CUS4(FILE *file, int chunk_size, struct LevelInfo *level) for (i = 0; i < ei->num_change_pages; i++) { struct ElementChangeInfo *change = &ei->change_page[i]; + unsigned long event_bits; /* always start with reliable default values */ setElementChangeInfoToDefaults(change); - change->events = getFile32BitBE(file); + event_bits = getFile32BitBE(file); + for (j = 0; j < NUM_CHANGE_EVENTS; j++) + if (event_bits & (1 << j)) + change->has_event[j] = TRUE; change->target_element = getMappedElement(getFile16BitBE(file)); @@ -2589,10 +2601,13 @@ static void LoadLevel_InitVersion(struct LevelInfo *level, char *filename) level->use_spring_bug = TRUE; /* only few elements were able to actively move into acid before 3.1.0 */ + /* trigger settings did not exist before 3.1.0; set to default "any" */ if (level->game_version < VERSION_IDENT(3,1,0,0)) { int i, j; + /* correct "can move into acid" settings (all zero in old levels) */ + level->can_move_into_acid_bits = 0; /* nothing can move into acid */ level->dont_collide_with_bits = 0; /* nothing is deadly when colliding */ @@ -2604,6 +2619,8 @@ static void LoadLevel_InitVersion(struct LevelInfo *level, char *filename) for (i = 0; i < NUM_CUSTOM_ELEMENTS; i++) SET_PROPERTY(EL_CUSTOM_START + i, EP_CAN_MOVE_INTO_ACID, TRUE); + /* correct trigger settings (stored as zero == "none" in old levels) */ + for (i = 0; i < NUM_CUSTOM_ELEMENTS; i++) { int element = EL_CUSTOM_START + i; @@ -2619,6 +2636,7 @@ static void LoadLevel_InitVersion(struct LevelInfo *level, char *filename) } } +#if 0 /* !!! MOVED TO "game.c", BECAUSE CAN CHANGE INSIDE LEVEL EDITOR !!! */ #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)) @@ -2635,6 +2653,8 @@ static void LoadLevel_InitVersion(struct LevelInfo *level, char *filename) level->sp_block_last_field = TRUE; } #endif +#endif + } else /* always use the latest game engine version */ { @@ -2701,7 +2721,7 @@ static void LoadLevel_InitElements(struct LevelInfo *level, char *filename) } /* order of checking and copying events to be mapped is important */ - for (j = CE_OTHER_GETS_COLLECTED; j >= CE_HITTING_SOMETHING; j--) + for (j = CE_PLAYER_COLLECTS_X; j >= CE_HITTING_SOMETHING; j--) { if (HAS_CHANGE_EVENT(element, j - 1)) { @@ -3258,7 +3278,7 @@ static void SaveLevel_CUS3(FILE *file, struct LevelInfo *level, static void SaveLevel_CUS4(FILE *file, struct LevelInfo *level, int element) { struct ElementInfo *ei = &element_info[element]; - int i, x, y; + int i, j, x, y; putFile16BitBE(file, element); @@ -3320,8 +3340,13 @@ static void SaveLevel_CUS4(FILE *file, struct LevelInfo *level, int element) for (i = 0; i < ei->num_change_pages; i++) { struct ElementChangeInfo *change = &ei->change_page[i]; + unsigned long event_bits = 0; + + for (j = 0; j < NUM_CHANGE_EVENTS; j++) + if (change->has_event[j]) + event_bits |= (1 << j); - putFile32BitBE(file, change->events); + putFile32BitBE(file, event_bits); putFile16BitBE(file, change->target_element); @@ -3670,7 +3695,7 @@ static int LoadTape_BODY(FILE *file, int chunk_size, struct TapeInfo *tape) for (i = 0; i < tape->length; i++) { - if (i >= MAX_TAPELEN) + if (i >= MAX_TAPE_LEN) break; for (j = 0; j < MAX_PLAYERS; j++) @@ -3959,7 +3984,7 @@ void SaveTape(int nr) InitTapeDirectory(leveldir_current->subdir); /* if a tape still exists, ask to overwrite it */ - if (access(filename, F_OK) == 0) + if (fileExists(filename)) { new_tape = FALSE; if (!Request("Replace old tape ?", REQ_ASK)) @@ -4038,7 +4063,7 @@ void DumpTape(struct TapeInfo *tape) for (i = 0; i < tape->length; i++) { - if (i >= MAX_TAPELEN) + if (i >= MAX_TAPE_LEN) break; printf("%03d: ", i);