X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=74c934d291b4284f04e963b5b53d3f911edb69a8;hb=f6ffcacabb98192917943ce637b64a9f1e267305;hp=7968b389573e613f29b98c94da0921db3427d02c;hpb=837dfa6e81b54c0eeb00eeb7cf472f68d5947bab;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 7968b389..74c934d2 100644 --- a/src/game.c +++ b/src/game.c @@ -427,7 +427,7 @@ static unsigned long trigger_events[MAX_NUM_ELEMENTS]; void GetPlayerConfig() { if (!audio.sound_available) - setup.sound = FALSE; + setup.sound_simple = FALSE; if (!audio.loops_available) setup.sound_loops = FALSE; @@ -438,7 +438,7 @@ void GetPlayerConfig() if (!video.fullscreen_available) setup.fullscreen = FALSE; - setup.sound_simple = setup.sound; + setup.sound = (setup.sound_simple || setup.sound_loops || setup.sound_music); SetAudioMode(setup.sound); InitJoysticks(); @@ -1222,47 +1222,60 @@ void InitGame() { int start_x = 0, start_y = 0; int found_rating = 0; + int found_element = EL_UNDEFINED; - for(y=0; y < lev_fieldy; y++) + for(y=0; y < lev_fieldy; y++) for(x=0; x < lev_fieldx; x++) { - for(x=0; x < lev_fieldx; x++) + int element = Feld[x][y]; + int content; + int xx, yy; + boolean is_player; + + if (!IS_CUSTOM_ELEMENT(element)) + continue; + + if (CAN_CHANGE(element)) { - int element = Feld[x][y]; + content = element_info[element].change.target_element; + is_player = ELEM_IS_PLAYER(content); - if (IS_CUSTOM_ELEMENT(element)) + if (is_player && (found_rating < 3 || element < found_element)) { - int xx, yy; + start_x = x; + start_y = y; - for(yy=0; yy < 3; yy++) - { - for(xx=0; xx < 3; xx++) - { - int content; - boolean is_player; + found_rating = 3; + found_element = element; + } + } + + for(yy=0; yy < 3; yy++) for(xx=0; xx < 3; xx++) + { + content = element_info[element].content[xx][yy]; + is_player = ELEM_IS_PLAYER(content); - content = element_info[element].content[xx][yy]; - is_player = (ELEM_IS_PLAYER(content) || content == EL_SP_MURPHY); + if (is_player && (found_rating < 2 || element < found_element)) + { + start_x = x + xx - 1; + start_y = y + yy - 1; - if (is_player && found_rating < 2) - { - start_x = x + xx - 1; - start_y = y + yy - 1; + found_rating = 2; + found_element = element; + } - found_rating = 2; - } + if (!CAN_CHANGE(element)) + continue; - content = element_info[element].change.content[xx][yy]; - is_player = (ELEM_IS_PLAYER(content) || content == EL_SP_MURPHY); + content = element_info[element].change.content[xx][yy]; + is_player = ELEM_IS_PLAYER(content); - if (is_player && found_rating < 1) - { - start_x = x + xx - 1; - start_y = y + yy - 1; + if (is_player && (found_rating < 1 || element < found_element)) + { + start_x = x + xx - 1; + start_y = y + yy - 1; - found_rating = 1; - } - } - } + found_rating = 1; + found_element = element; } } } @@ -5297,13 +5310,14 @@ static void ChangeActiveTrap(int x, int y) static void ChangeElementNowExt(int x, int y, int target_element) { -#if 0 /* !!! let the player exacpe from a suddenly unaccessible element */ - if (IS_PLAYER(x, y) && !IS_ACCESSIBLE(target_element)) + /* check if element under player changes from accessible to unaccessible + (needed for special case of dropping element which then changes) */ + if (IS_PLAYER(x, y) && + IS_ACCESSIBLE(Feld[x][y]) && !IS_ACCESSIBLE(target_element)) { Bang(x, y); return; } -#endif RemoveField(x, y); Feld[x][y] = target_element; @@ -6328,6 +6342,10 @@ boolean MoveFigureOneStep(struct PlayerInfo *player, if (can_move != MF_MOVING) return can_move; + /* check if DigField() has caused relocation of the player */ + if (player->jx != jx || player->jy != jy) + return MF_NO_ACTION; + StorePlayer[jx][jy] = 0; player->last_jx = jx; player->last_jy = jy; @@ -6573,6 +6591,7 @@ void ScrollFigure(struct PlayerInfo *player, int mode) if (Feld[jx][jy] == EL_EXIT_OPEN || Feld[jx][jy] == EL_SP_EXIT_OPEN) { + DrawPlayer(player); /* needed here only to cleanup last field */ RemoveHero(player); if (local_player->friends_still_needed == 0 ||