X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=daa0b30eb457c97ec29bd0aa69755f40964e19fd;hb=e4f31a4e6f4b611a1dddb16afb66e3af177dd937;hp=2b4c7c0d02b75cf1a5453c9d2c83c24057d7fa79;hpb=6e392e90d99cc0b6d8af3a15fc334bf34f889994;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 2b4c7c0d..daa0b30e 100644 --- a/src/game.c +++ b/src/game.c @@ -49,6 +49,9 @@ #define USE_QUICKSAND_IMPACT_BUGFIX (USE_NEW_STUFF * 0) +#define USE_CODE_THAT_BREAKS_SNAKE_BITE (USE_NEW_STUFF * 1) + + /* for DigField() */ #define DF_NO_PUSH 0 #define DF_DIG 1 @@ -164,13 +167,21 @@ ((e) >= NUM_FILE_ELEMENTS ? EL_UNKNOWN : (e)) #endif -#define GET_TARGET_ELEMENT(e, ch, cv, cs) \ +#define RESOLVED_REFERENCE_ELEMENT(be, e) \ + ((be) + (e) - EL_SELF < EL_CUSTOM_START ? EL_CUSTOM_START : \ + (be) + (e) - EL_SELF > EL_CUSTOM_END ? EL_CUSTOM_END : \ + (be) + (e) - EL_SELF) + +#define GET_TARGET_ELEMENT(be, e, ch, cv, cs) \ ((e) == EL_TRIGGER_PLAYER ? (ch)->actual_trigger_player : \ (e) == EL_TRIGGER_ELEMENT ? (ch)->actual_trigger_element : \ (e) == EL_TRIGGER_CE_VALUE ? (ch)->actual_trigger_ce_value : \ (e) == EL_TRIGGER_CE_SCORE ? (ch)->actual_trigger_ce_score : \ (e) == EL_CURRENT_CE_VALUE ? (cv) : \ - (e) == EL_CURRENT_CE_SCORE ? (cs) : (e)) + (e) == EL_CURRENT_CE_SCORE ? (cs) : \ + (e) >= EL_LAST_CE_8 && (e) <= EL_NEXT_CE_8 ? \ + RESOLVED_REFERENCE_ELEMENT(be, e) : \ + (e)) #define CAN_GROW_INTO(e) \ ((e) == EL_SAND || (IS_DIGGABLE(e) && level.grow_into_diggable)) @@ -1198,6 +1209,7 @@ static void InitField(int x, int y, boolean init_game) InitField(x, y, init_game); #endif } + break; } @@ -1452,6 +1464,18 @@ static void resolve_group_element(int group_element, int recursion_depth) } #endif +#if 0 +static void replace_reference_element(int base_element, int *element) +{ + if (*element >= EL_LAST_CE_8 && *element <= EL_NEXT_CE_8) + { + *element = base_element + *element - EL_SELF; + *element = (*element < EL_CUSTOM_START ? EL_CUSTOM_START : + *element > EL_CUSTOM_END ? EL_CUSTOM_END : *element); + } +} +#endif + /* ============================================================================= InitGameEngine() @@ -1754,6 +1778,11 @@ static void InitGameEngine() for (l = 0; l < group->num_elements_resolved; l++) trigger_events[group->element_resolved[l]][k] = TRUE; } +#if 1 + else if (trigger_element == EL_ANY_ELEMENT) + for (l = 0; l < MAX_NUM_ELEMENTS; l++) + trigger_events[l][k] = TRUE; +#endif else trigger_events[trigger_element][k] = TRUE; } @@ -1891,6 +1920,29 @@ static void InitGameEngine() EL_EMPTY); } } + +#if 0 + /* ---------- initialize reference elements ------------------------------- */ + for (i = 0; i < NUM_CUSTOM_ELEMENTS; i++) + { + int element = EL_CUSTOM_START + i; + struct ElementInfo *ei = &element_info[element]; + + for (y = 0; y < 3; y++) for (x = 0; x < 3; x++) + replace_reference_element(element, &ei->content.e[x][y]); + + for (j = 0; j < ei->num_change_pages; j++) + { + struct ElementChangeInfo *change = &ei->change_page[j]; + + replace_reference_element(element, &change->target_element); + replace_reference_element(element, &change->trigger_element); + + for (y = 0; y < 3; y++) for (x = 0; x < 3; x++) + replace_reference_element(element, &change->target_content.e[x][y]); + } + } +#endif } int get_num_special_action(int element, int action_first, int action_last) @@ -8484,7 +8536,12 @@ static void CreateFieldExt(int x, int y, int element, boolean is_change) #endif boolean new_element_is_player = ELEM_IS_PLAYER(new_element); boolean add_player_onto_element = (new_element_is_player && +#if USE_CODE_THAT_BREAKS_SNAKE_BITE + /* this breaks SnakeBite when a snake is + halfway through a door that closes */ + /* NOW FIXED AT LEVEL INIT IN files.c */ new_element != EL_SOKOBAN_FIELD_PLAYER && +#endif IS_WALKABLE(old_element)); #if 0 @@ -8711,7 +8768,7 @@ static boolean ChangeElement(int x, int y, int element, int page) ChangeEvent[ex][ey] = ChangeEvent[x][y]; content_element = change->target_content.e[xx][yy]; - target_element = GET_TARGET_ELEMENT(content_element, change, + target_element = GET_TARGET_ELEMENT(element, content_element, change, ce_value, ce_score); CreateElementFromChange(ex, ey, target_element); @@ -8733,7 +8790,7 @@ static boolean ChangeElement(int x, int y, int element, int page) } else { - target_element = GET_TARGET_ELEMENT(change->target_element, change, + target_element = GET_TARGET_ELEMENT(element, change->target_element, change, ce_value, ce_score); if (element == EL_DIAGONAL_GROWING || @@ -10401,7 +10458,7 @@ static void CheckGravityMovement(struct PlayerInfo *player) { int move_dir_horizontal = player->effective_action & MV_HORIZONTAL; int move_dir_vertical = player->effective_action & MV_VERTICAL; - boolean player_is_snapping = player->effective_action & JOY_BUTTON_1; + boolean player_is_snapping = (player->effective_action & JOY_BUTTON_1); int jx = player->jx, jy = player->jy; boolean player_is_moving_to_valid_field = (!player_is_snapping &&