X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=edf7f6ab5066ef7af0900bcdcac720f386b7e4af;hb=0dcc9cbb74fb123dcb9ef18b1e00aca24604007b;hp=ecd5f2649d337721f118c9009c18b731d6fbae0a;hpb=715b3eb99865234a42dbec1fce419f750c640327;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index ecd5f264..edf7f6ab 100644 --- a/src/game.c +++ b/src/game.c @@ -2251,6 +2251,7 @@ static void UpdateGameControlValues(void) level.game_engine_type == GAME_ENGINE_TYPE_MM ? MM_HEALTH(game_mm.laser_overload_value) : game.health); + int sync_random_frame = INIT_GFX_RANDOM(); // random, but synchronized UpdatePlayfieldElementCount(); @@ -2325,24 +2326,44 @@ static void UpdateGameControlValues(void) stored_player[player_nr].num_white_keys; } - // try to display as many collected keys as possible in the default game panel - for (i = STD_NUM_KEYS; i < MAX_NUM_KEYS + 1; i++) // EMC keys + white key + // re-arrange keys on game panel, if needed or if defined by style settings + for (i = 0; i < MAX_NUM_KEYS + 1; i++) // all normal keys + white key { int nr = GAME_PANEL_KEY_1 + i; - int emc_key = get_key_element_from_nr(i); - int element = (i < MAX_NUM_KEYS ? emc_key : EL_DC_KEY_WHITE); struct GamePanelControlInfo *gpc = &game_panel_controls[nr]; struct TextPosInfo *pos = gpc->pos; - // check if panel position is undefined for a certain EMC key or white key - if (gpc->value != EL_EMPTY && pos->x == -1 && pos->y == -1) + // skip check if key is not in the player's inventory + if (gpc->value == EL_EMPTY) + continue; + + // check if keys should be arranged on panel from left to right + if (pos->style == STYLE_LEFTMOST_POSITION) + { + // check previous key positions (left from current key) + for (k = 0; k < i; k++) + { + int nr_new = GAME_PANEL_KEY_1 + k; + + if (game_panel_controls[nr_new].value == EL_EMPTY) + { + game_panel_controls[nr_new].value = gpc->value; + gpc->value = EL_EMPTY; + + break; + } + } + } + + // check if "undefined" keys can be placed at some other position + if (pos->x == -1 && pos->y == -1) { int nr_new = GAME_PANEL_KEY_1 + i % STD_NUM_KEYS; // 1st try: display key at the same position as normal or EM keys if (game_panel_controls[nr_new].value == EL_EMPTY) { - game_panel_controls[nr_new].value = element; + game_panel_controls[nr_new].value = gpc->value; } else { @@ -2353,7 +2374,7 @@ static void UpdateGameControlValues(void) if (game_panel_controls[nr_new].value == EL_EMPTY) { - game_panel_controls[nr_new].value = element; + game_panel_controls[nr_new].value = gpc->value; break; } @@ -2515,11 +2536,13 @@ static void UpdateGameControlValues(void) int last_anim_random_frame = gfx.anim_random_frame; int element = gpc->value; int graphic = el2panelimg(element); + int init_gfx_random = (graphic_info[graphic].anim_global_sync ? + sync_random_frame : INIT_GFX_RANDOM()); if (gpc->value != gpc->last_value) { gpc->gfx_frame = 0; - gpc->gfx_random = INIT_GFX_RANDOM(); + gpc->gfx_random = init_gfx_random; } else { @@ -2527,7 +2550,7 @@ static void UpdateGameControlValues(void) if (ANIM_MODE(graphic) == ANIM_RANDOM && IS_NEXT_FRAME(gpc->gfx_frame, graphic)) - gpc->gfx_random = INIT_GFX_RANDOM(); + gpc->gfx_random = init_gfx_random; } if (ANIM_MODE(graphic) == ANIM_RANDOM) @@ -2548,11 +2571,13 @@ static void UpdateGameControlValues(void) { int last_anim_random_frame = gfx.anim_random_frame; int graphic = gpc->graphic; + int init_gfx_random = (graphic_info[graphic].anim_global_sync ? + sync_random_frame : INIT_GFX_RANDOM()); if (gpc->value != gpc->last_value) { gpc->gfx_frame = 0; - gpc->gfx_random = INIT_GFX_RANDOM(); + gpc->gfx_random = init_gfx_random; } else { @@ -2560,7 +2585,7 @@ static void UpdateGameControlValues(void) if (ANIM_MODE(graphic) == ANIM_RANDOM && IS_NEXT_FRAME(gpc->gfx_frame, graphic)) - gpc->gfx_random = INIT_GFX_RANDOM(); + gpc->gfx_random = init_gfx_random; } if (ANIM_MODE(graphic) == ANIM_RANDOM)