/* multiwait.c - this manages only the network screen where everyone have to select it's players and where even the basic chat is inside */ #include "bomberclone.h" #include "network.h" #include "packets.h" #include "gamesrv.h" #include "gfx.h" #include "chat.h" extern int UpdateRects_nr; static int mw_player = 0, mw_chat = 0, mw_frame = 0, mw_frameto = 0; static SDL_Surface *mw_plgfx[MAX_PLAYERS]; /* this will load some graphics and so other stuff */ void mw_init () { int i; SDL_Surface *tmp; draw_logo (); menu_displaytext ("Please Wait", "Loading GFX Data", 64, 128, 64); gfx_load_players (32, 32); network_loop (); for (i = 0; i < MAX_PLAYERS; i++) { network_loop (); tmp = makegray_image (gfx.players[i].ani.image); network_loop (); mw_plgfx[i] = SDL_DisplayFormat (tmp); network_loop (); SDL_FreeSurface (tmp); network_loop (); } bman.updatestatusbar = 1; }; /* free all grafics */ void mw_shutdown () { int i; chat_show (-1, -1, -1, -1); chat_cleanup(); gfx_free_players (); for (i = 0; i < MAX_PLAYERS; i++) SDL_FreeSurface (mw_plgfx[i]); }; void mw_wait_for_connect () { menu_displaytext ("Please Wait", "Wait For connection", 64, 128, 64); }; void mw_draw_status () { int pnr, x, x1, y, px; char text[255]; SDL_Rect src, dest; /* Draw Player List */ /* 1. the head */ px = gfx.res.x / 320; x = (gfx.res.x - px * 320) / 2; gfx_blitupdaterectclear (); for (pnr = 0; pnr < px; pnr++) { font_setcolor (128, 128, 128, 0); font_draw (pnr * 320 + x - 2, 22, " Wins Points", 0); font_setcolor (192, 192, 255, 0); font_draw (pnr * 320 + x, 24, " Wins Points", 0); } /* 2. the names with points */ for (x1 = pnr = 0, y = 48; pnr < MAX_PLAYERS; pnr++) { redraw_logo (x1 * 320, y - 4, 320, 32); if (players[pnr].gfx_nr != -1 && PS_IS_used (players[pnr].state)) { src.x = 3 * players[pnr].gfx->smal_size.x; src.y = 0; src.w = dest.w = players[pnr].gfx->smal_size.x; src.h = dest.h = players[pnr].gfx->smal_size.y; dest.x = x1 * 320; dest.y = y - 4; gfx_blit (players[pnr].gfx->smal_image, &src, gfx.screen, &dest, 0xFFFF); } sprintf (text, " %10s %2d %2d", players[pnr].name, players[pnr].wins, players[pnr].points); if (PS_IS_used (players[pnr].state)) { if (bman.lastwinner == pnr) font_setcolor (255, 255, 192, 0); else font_setcolor (192, 192, 192, 0); font_draw (x + x1 * 320, y, text, 0); } x1++; if (x1 >= px) { y += 32; x1 = 0; } if (pnr == MAX_PLAYERS - 1 && x1 != 0) y += 32; } /* add to update rect list */ dest.x = dest.y = 0; dest.h = y; dest.w = gfx.res.y; gfx_blitupdaterectadd (&dest); mw_player = y; }; void mw_draw_gfxselect (int selgfx) { int i, select, xstep; SDL_Rect src, dest; xstep = gfx.res.x / MAX_PLAYERS; if (players[bman.p_nr].gfx_nr == -1) { /* draw selection */ for (i = 0; i < MAX_PLAYERS; i++) { dest.w = src.w = gfx.players[i].ani.w; dest.h = src.h = gfx.players[i].ani.h; dest.x = i * xstep + (xstep >> 1) - (gfx.players[i].ani.w >> 1); dest.y = mw_player + 8; redraw_logo (dest.x, dest.y, dest.w, dest.h); src.x = 3 * gfx.players[i].ani.w; if (i == selgfx) src.y = mw_frame * gfx.players[i].ani.h; else src.y = 0; MW_IS_GFX_SELECT (i, select); if (select >= MAX_PLAYERS || select < 0) { /* this player have not been selected */ if (selgfx == i) { mw_frameto--; if (mw_frameto <= 0 || mw_frameto > ANI_PLAYERTIMEOUT) { mw_frameto = ANI_PLAYERTIMEOUT; mw_frame++; } if (mw_frame >= gfx.players[i].ani.frames || mw_frame < 0) { mw_frameto = ANI_PLAYERTIMEOUT; mw_frame = 0; } gfx_blit (gfx.players[i].ani.image, &src, gfx.screen, &dest, 0xFFFF); } else gfx_blit (mw_plgfx[i], &src, gfx.screen, &dest, 0xFFFF); } } } else { /* draw selected players */ for (i = 0; i < MAX_PLAYERS; i++) { dest.w = src.w = gfx.players[i].ani.w; dest.h = src.h = gfx.players[i].ani.h; dest.x = i * xstep + (xstep >> 1) - (gfx.players[i].ani.w >> 1); dest.y = mw_player + 8; redraw_logo (dest.x, dest.y, dest.w, dest.h); src.x = 3 * gfx.players[i].ani.w; if (i == selgfx) src.y = mw_frame * gfx.players[i].ani.h; else src.y = 0; MW_IS_GFX_SELECT (i, select); if (select < MAX_PLAYERS && select >= 0) { /* this player have been selected */ if (players[bman.p_nr].gfx_nr == i) gfx_blit (gfx.players[i].ani.image, &src, gfx.screen, &dest, 0xFFFF); else gfx_blit (mw_plgfx[i], &src, gfx.screen, &dest, 0xFFFF); } } } dest.x = 0; dest.y = mw_player; dest.w = gfx.res.x; dest.h = 32 + gfx.players[0].ani.h; gfx_blitupdaterectadd (&dest); mw_chat = mw_player + gfx.players[0].ani.h; } void mw_draw_chat () { if (chat.visible == 0) { chat_show (16, mw_chat + 16, gfx.res.x - 16, gfx.res.y - 32); chat_addstatusline ("Press [STRG] or [CTRL] - to select a player"); if (GT_MP_PTPM) { chat_addstatusline ("F4 - to start the game"); chat_addstatusline ("F5 - to change map settings"); } else { chat_addstatusline ("F5 - to see the map settings"); } } }; /* the loop itself */ void wait_for_players () { SDL_Event event; Uint8 *keys; int done = 0, ready = 0, keypressed = 0, i, selgfx = 0; mw_init (); draw_logo (); while (!done && bman.state == GS_wait) { i = bman.p_nr; if (network_loop () < 0) { done = 1; bman.p_nr = -1; } if (i != bman.p_nr) /* clean the screen after we got our playernumber */ draw_logo (); /* check if all players are ready, and more as one player is connected */ if (GT_MP_PTPM) for (ready = 0, i = 0; i < MAX_PLAYERS; i++) if (PS_IS_playing (players[i].state)) ready++; if (ready > 1) ready = 1; else ready = 0; /* draw the screeninformations */ if (bman.p_nr == -1) { /* we have no connect yet */ mw_wait_for_connect (); SDL_Flip (gfx.screen); } else { /* we have a connect so draw status */ if (bman.updatestatusbar) { mw_draw_status (); bman.updatestatusbar = 0; } mw_draw_gfxselect (selgfx); mw_draw_chat (); } gfx_blitdraw (); /* do the keyboard handling */ if (SDL_PollEvent (&event) != 0) switch (event.type) { case (SDL_QUIT): bman.state = GS_quit; bman.p_nr = -1; done = 1; } keys = SDL_GetKeyState (NULL); if (keys[SDLK_ESCAPE] && event.type == SDL_KEYDOWN) { /* we want to quit */ done = 1; bman.p_nr = -1; keypressed = 1; bman.state = GS_startup; } if (keys[SDLK_F8] && event.type == SDL_KEYDOWN) { /* Switch Fullscreen */ SDL_WM_ToggleFullScreen(gfx.screen); gfx.fullscreen = !gfx.fullscreen; bman.updatestatusbar = 1; // force an update } if (bman.p_nr != -1) { if (keys[SDLK_LEFT] && (!keypressed) && players[bman.p_nr].gfx_nr == -1) { i = 0; while (selgfx < 0 || selgfx >= MAX_PLAYERS || i != -1) { selgfx--; if (selgfx < 0) selgfx = MAX_PLAYERS - 1; MW_IS_GFX_SELECT (selgfx, i); } } if (keys[SDLK_RIGHT] && (!keypressed) && players[bman.p_nr].gfx_nr == -1) { i = 0; while (selgfx < 0 || selgfx >= MAX_PLAYERS || i != -1) { selgfx++; if (selgfx >= MAX_PLAYERS) selgfx = 0; MW_IS_GFX_SELECT (selgfx, i); } } /* just make sure this player is not selected twice */ if (players[bman.p_nr].gfx_nr == -1) { MW_IS_GFX_SELECT (selgfx, i); while (selgfx < 0 || selgfx >= MAX_PLAYERS || i != -1) { selgfx++; if (selgfx >= MAX_PLAYERS) selgfx = 0; MW_IS_GFX_SELECT (selgfx, i); } } if ((keys[SDLK_LCTRL] || keys[SDLK_RCTRL]) && (!keypressed)) { if (players[bman.p_nr].gfx_nr == -1) /* select player */ players[bman.p_nr].gfx_nr = selgfx; else /* deselect player */ players[bman.p_nr].gfx_nr = -1; net_change_playerid (bman.p_nr, 1); bman.updatestatusbar = 1; } if ((GT_MP_PTPM) && ready && keys[SDLK_F4] && (!keypressed)) { done = 1; bman.updatestatusbar = 1; } if (keys[SDLK_F5] && (!keypressed)) { /* Map modification or setting display */ if (GT_MP_PTPM) { mapmenu (); net_send_mapinfo (); } else mapinfo (); draw_logo (); mw_draw_status (); mw_draw_gfxselect (selgfx); chat.changed = 1; chat.lineschanged = 1; chat_drawbox (); mw_draw_chat (); } chat_loop (&event); } if (event.type == SDL_KEYUP) keypressed = 0; else if (event.type == SDL_KEYDOWN) keypressed = 1; s_delay (25); } mw_shutdown (); };