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
{
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;
}
InitGameEngine();
InitGameControlValues();
- // initialize tape actions from game when recording tape
if (tape.recording)
{
+ // initialize tape actions from game when recording tape
tape.use_key_actions = game.use_key_actions;
tape.use_mouse_actions = game.use_mouse_actions;
+
+ // initialize visible playfield size when recording tape (for team mode)
+ tape.scr_fieldx = SCR_FIELDX;
+ tape.scr_fieldy = SCR_FIELDY;
}
// don't play tapes over network
game.restart_level = FALSE;
game.restart_game_message = NULL;
+
game.request_active = FALSE;
+ game.request_active_or_moving = FALSE;
if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
InitGameActions_MM();
static boolean AllPlayersInSight(struct PlayerInfo *player, int x, int y)
{
int min_x = x, min_y = y, max_x = x, max_y = y;
+ int scr_fieldx = getScreenFieldSizeX();
+ int scr_fieldy = getScreenFieldSizeY();
int i;
for (i = 0; i < MAX_PLAYERS; i++)
max_y = MAX(max_y, jy);
}
- return (max_x - min_x < SCR_FIELDX && max_y - min_y < SCR_FIELDY);
+ return (max_x - min_x < scr_fieldx && max_y - min_y < scr_fieldy);
}
static boolean AllPlayersInVisibleScreen(void)