X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=ec52e93e56816447bdf7d8d31c162c231f47f448;hb=80a611519cc20b404bce7fc5dc6d321b082f99d2;hp=f06ddb8efbb5333c0359667199131c4c6c443c29;hpb=559802186429a6376b8c0c94615492c9f822617c;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index f06ddb8e..ec52e93e 100644 --- a/src/tools.c +++ b/src/tools.c @@ -3514,6 +3514,99 @@ void DrawPreviewLevelAnimation() DrawPreviewLevelExt(FALSE); } +static void DrawNetworkPlayer(int x, int y, int player_nr, int tile_size, + int border_size, int font_nr) +{ + int graphic = el2img(EL_PLAYER_1 + player_nr); + int font_height = getFontHeight(font_nr); + int player_height = MAX(tile_size, font_height); + int xoffset_text = tile_size + border_size; + int yoffset_text = (player_height - font_height) / 2; + int yoffset_graphic = (player_height - tile_size) / 2; + char *player_name = getNetworkPlayerName(player_nr + 1); + + DrawSizedGraphicThruMaskExt(drawto, x, y + yoffset_graphic, graphic, 0, + tile_size); + DrawText(x + xoffset_text, y + yoffset_text, player_name, font_nr); +} + +void DrawNetworkPlayersExt(boolean force) +{ + if (game_status != GAME_MODE_MAIN) + return; + + if (!network.connected && !force) + return; + + int num_players = 0; + int i; + + for (i = 0; i < MAX_PLAYERS; i++) + if (stored_player[i].connected_network) + num_players++; + + struct TextPosInfo *pos = &menu.main.network_players; + int tile_size = pos->tile_size; + int border_size = 2; + int xoffset_text = tile_size + border_size; + int font_nr = pos->font; + int font_width = getFontWidth(font_nr); + int font_height = getFontHeight(font_nr); + int player_height = MAX(tile_size, font_height); + int player_yoffset = player_height + border_size; + int max_players_width = xoffset_text + MAX_PLAYER_NAME_LEN * font_width; + int max_players_height = MAX_PLAYERS * player_yoffset - border_size; + int all_players_height = num_players * player_yoffset - border_size; + int max_xpos = SX + ALIGNED_XPOS(pos->x, max_players_width, pos->align); + int max_ypos = SY + ALIGNED_YPOS(pos->y, max_players_height, pos->valign); + int ypos = SY + ALIGNED_YPOS(pos->y, all_players_height, pos->valign); + + ClearRectangleOnBackground(drawto, max_xpos, max_ypos, + max_players_width, max_players_height); + + /* first draw local network player ... */ + for (i = 0; i < MAX_PLAYERS; i++) + { + if (stored_player[i].connected_network && + stored_player[i].connected_locally) + { + char *player_name = getNetworkPlayerName(i + 1); + int player_width = xoffset_text + getTextWidth(player_name, font_nr); + int xpos = SX + ALIGNED_XPOS(pos->x, player_width, pos->align); + + DrawNetworkPlayer(xpos, ypos, i, tile_size, border_size, font_nr); + + ypos += player_yoffset; + } + } + + /* ... then draw all other network players */ + for (i = 0; i < MAX_PLAYERS; i++) + { + if (stored_player[i].connected_network && + !stored_player[i].connected_locally) + { + char *player_name = getNetworkPlayerName(i + 1); + int player_width = xoffset_text + getTextWidth(player_name, font_nr); + int xpos = SX + ALIGNED_XPOS(pos->x, player_width, pos->align); + + DrawNetworkPlayer(xpos, ypos, i, tile_size, border_size, font_nr); + + ypos += player_yoffset; + } + } +} + +void DrawNetworkPlayers() +{ + DrawNetworkPlayersExt(FALSE); +} + +void ClearNetworkPlayers() +{ + DrawNetworkPlayersExt(TRUE); +} + inline static void DrawGraphicAnimationExt(DrawBuffer *dst_bitmap, int x, int y, int graphic, int sync_frame, int mask_mode) @@ -4392,13 +4485,11 @@ static boolean RequestDoor(char *text, unsigned int req_state) SetMouseCursor(CURSOR_DEFAULT); -#if defined(NETWORK_AVALIABLE) /* pause network game while waiting for request to answer */ - if (options.network && + if (network.enabled && game_status == GAME_MODE_PLAYING && req_state & REQUEST_WAIT_FOR_INPUT) SendToServer_PausePlaying(); -#endif old_door_state = GetDoorState(); @@ -4534,13 +4625,11 @@ static boolean RequestDoor(char *text, unsigned int req_state) SetDrawBackgroundMask(REDRAW_FIELD); } -#if defined(NETWORK_AVALIABLE) /* continue network game after request */ - if (options.network && + if (network.enabled && game_status == GAME_MODE_PLAYING && req_state & REQUEST_WAIT_FOR_INPUT) SendToServer_ContinuePlaying(); -#endif /* restore deactivated drawing when quick-loading level tape recording */ if (tape.playing && tape.deactivate_display) @@ -4562,13 +4651,11 @@ static boolean RequestEnvelope(char *text, unsigned int req_state) SetMouseCursor(CURSOR_DEFAULT); -#if defined(NETWORK_AVALIABLE) /* pause network game while waiting for request to answer */ - if (options.network && + if (network.enabled && game_status == GAME_MODE_PLAYING && req_state & REQUEST_WAIT_FOR_INPUT) SendToServer_PausePlaying(); -#endif /* simulate releasing mouse button over last gadget, if still pressed */ if (button_status) @@ -4621,13 +4708,11 @@ static boolean RequestEnvelope(char *text, unsigned int req_state) SetDrawBackgroundMask(REDRAW_FIELD); } -#if defined(NETWORK_AVALIABLE) /* continue network game after request */ - if (options.network && + if (network.enabled && game_status == GAME_MODE_PLAYING && req_state & REQUEST_WAIT_FOR_INPUT) SendToServer_ContinuePlaying(); -#endif /* restore deactivated drawing when quick-loading level tape recording */ if (tape.playing && tape.deactivate_display)