/* this will load some graphics and so other stuff */ static void mw_init () { team_update (); gfx_blitdraw (); draw_logo (); gfx_blitdraw (); bman.updatestatusbar = 1; d_playerdetail ("mw_init:\n"); SDL_Flip (gfx.screen); chat_show (10, gfx.res.y / 2, gfx.res.x - 20, gfx.res.y / 2 - 10); chat_setactive (1, 1); };
/* * in game menu_loop, will called every game loop. * As long as this menu is displayed the gamekeys will not work. * * the drawings will be done from the main loop. So we won't * have to draw anything on our own. * * Pressing ESC will bring you back to the game. */ void game_menu_loop (SDL_Event * event, int eventstate) { int done; if (menu == NULL) return; menu_draw (menu); done = menu_event_loop (menu, event, eventstate); /* * check if one of the buttons was pressed */ if (done != 0) { if (menu->focus->id == 2 && (GT_MP_PTPM || GT_SP)) { /* End Round */ bman.timeout = -GAME_OVERTIMEOUT; } else if (menu->focus->id == 3) { /* End Game */ /* send network update */ if (GT_MP) net_game_send_delplayer (bman.p_nr); bman.state = GS_quit; } else { /* Quit Menu */ menu_delete (menu); menu = NULL; gfx_blitdraw (); draw_field (); } } };
/* free all graphics */ static void mw_shutdown () { chat_show (-1, -1, -1, -1); gfx_blitdraw (); draw_logo (); SDL_Flip (gfx.screen); };
/* the loop itself */ void wait_for_players () { SDL_Event event; mw_init (); do { if (s_fetchevent (&event) != 0) switch (event.type) { case (SDL_QUIT): bman.state = GS_quit; break; } /* * check some little things and do the network stuff */ network_loop (); /* * the drawing stuff */ if (mw_check_screenredraw()) { d_printf ("Draw Status\n"); gfx_blitdraw (); draw_logo (); if (bman.gametype==GT_team) mw_draw_all_teams(); else mw_draw_all_player (); } gfx_blitdraw (); /* * input handling */ keyb_loop (&event); mw_keys_loop (); chat_loop (&event); chat.active = 1; s_calctimesync (); } while (bman.state == GS_wait && bman.sock != -1); mw_shutdown (); };
void game_showresult () { char text[255]; SDL_Event event; Uint8 *keys; int done = 0, keypressed = 0, x, y; gfx_blitdraw (); draw_logo (); strcpy (text, "Game Result"); x = (gfx.res.x - (font[2].size.x * strlen (text)) - 64) / 2; y = 0; font_drawbold (x, y, text, 2, 6, 2); font_draw (x, y, text, 2, 5); y += font[2].size.x; strcpy (text, "[CTRL],[RETURN] or [STRG] for another game"); x = (gfx.res.x - (font[1].size.x * strlen (text)) - 64) / 2; font_drawbold (x, gfx.res.y - (2 * font[0].size.y) - 2, text, 0, COLOR_brown, 1); font_draw (x, gfx.res.y - (2 * font[0].size.y) - 2, text, 0, COLOR_yellow); strcpy (text, "or [ESC] to leave the game."); x = (gfx.res.x - (font[1].size.x * strlen (text)) - 64) / 2; font_drawbold (x, gfx.res.y - font[0].size.y - 2, text, 0, COLOR_brown, 1); font_draw (x, gfx.res.y - font[0].size.y - 2, text, 0, COLOR_yellow); if (bman.gametype == GT_team) game_showresultteam (10, 50, gfx.res.x - 20, gfx.res.y - 100); else game_showresultnormal (10, 50, gfx.res.x - 20, gfx.res.y - 100); gfx_blitdraw (); SDL_Flip (gfx.screen); while (!done && bman.state != GS_quit) { /* do the keyboard handling */ if (s_fetchevent (&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_RETURN] || keys[SDLK_LCTRL] || keys[SDLK_RCTRL]) && (!keypressed) && (event.type = SDL_KEYDOWN)) { done = 1; keypressed = 1; } 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 (event.type == SDL_KEYUP) keypressed = 0; else if (event.type == SDL_KEYDOWN) keypressed = 1; s_delay (25); } if (bman.state != GS_quit && bman.state != GS_startup) bman.state = GS_running; };
void game_loop () { SDL_Event event; int done = 0, eventstate; if (GT_MP) net_game_fillsockaddr (); if ( SDL_InitSubSystem ( SDL_INIT_JOYSTICK ) < 0 ) { fprintf ( stderr, "Unable to initialize Joystick: %s\n", SDL_GetError() ); } printf ( "%i joysticks found\n", SDL_NumJoysticks () ); menu = NULL; bman.updatestatusbar = 1; // force an update timestamp = SDL_GetTicks (); // needed for time sync. d_gamedetail ("GAME START"); gfx_blitupdaterectclear (); draw_logo (); draw_field (); SDL_Flip (gfx.screen); draw_players (); if (bman.p_nr >= 0 && bman.p_nr < MAX_PLAYERS) { players[bman.p_nr].ready = 1; if (GT_MP_PTPS) send_playerdata (&players[bman.p_servnr].net.addr, bman.p_nr, &players[bman.p_nr]); } if (bman.p2_nr >= 0 && bman.p2_nr < MAX_PLAYERS) { players[bman.p2_nr].ready = 1; if (GT_MP_PTPS) send_playerdata (&players[bman.p_servnr].net.addr, bman.p2_nr, &players[bman.p2_nr]); } fire_init(); while (!done && (bman.state == GS_running || bman.state == GS_ready)) { SDL_JoystickUpdate (); if ((eventstate = SDL_PollEvent (&event)) != 0) switch (event.type) { case (SDL_QUIT): done = 1; bman.state = GS_quit; } /* * input handling */ keyb_loop (&event); game_keys_loop (); if (GT_MP) chat_loop (&event); if ((!IS_LPLAYER2) && (!chat.active)) chat_setactive (1, 1); restore_players_screen (); player_check (bman.p_nr); if (IS_LPLAYER2) player_check (bman.p2_nr); dead_playerani (); special_loop (); player_move (bman.p_nr); if (IS_LPLAYER2) player_move (bman.p2_nr); if (GT_MP) { player_calcpos (); network_loop (); } if (bman.state == GS_running) single_loop (); bomb_loop (); /* wind_loop (); SOON */ fire_loop (); field_loop (); flitems_loop (); draw_players (); game_draw_info (); // will set the var bman.player_nr /* check if there is only one player left and the game is in multiplayer mode and if there the last dieing animation is done */ if (game_check_endgame () && bman.timeout >= 0.0f) bman.timeout = 0.0f; if ((GT_SP || GT_MP_PTPM) && bman.timeout < -GAME_OVERTIMEOUT) { d_printf ("GAME: Game Over\n"); done = 1; } stonelist_draw (); /* if there is any menu displayed do so */ if (menu != NULL) game_menu_loop (&event, eventstate); gfx_blitdraw (); s_calctimesync (); bman.timeout -= timediff; } if (menu != NULL) { menu_delete (menu); menu = NULL; } gfx_blitdraw (); chat_show (-1, -1, -1, -1); draw_logo (); gfx_blitupdaterectclear (); SDL_Flip (gfx.screen); d_gamedetail ("GAME END"); d_printf ("done = %d\n", done); };
/* this is needed to draw the whole uppdate of everything */ void draw_netupdatestate (char st) { char text[255]; unsigned char b; int y = 0, b1, z, zx = 200, i, j, s = map.size.y + MAX_PLAYERS + GAME_MAX_TUNNELS; SDL_Rect src, dest; z = gfx.res.x - zx - 30 - 8; for (i = 0; i < MAX_PLAYERS; i++) if (PS_IS_used (players[i].state)) { y += 50; if (st) { redraw_logo (0, y, gfx.res.x, y + 50); if (players[i].gfx_nr != -1) { dest.w = src.w = players[i].gfx->small_image->w; dest.h = src.h = players[i].gfx->small_image->h; src.x = players[i].gfx->small_image->w * down; src.y = 0; dest.x = 50; dest.y = y; SDL_BlitSurface (players[i].gfx->small_image, &src, gfx.screen, &dest); gfx_blitupdaterectadd (&dest); } dest.x = zx; dest.y = y; dest.w = menulistimages[1][0]->w; dest.h = menulistimages[1][0]->h; gfx_blit (menulistimages[1][0], NULL, gfx.screen, &dest, 10000); dest.x = z + zx + 4; gfx_blit (menulistimages[1][2], NULL, gfx.screen, &dest, 10000); // draw the bottom left and right of the list dest.y = y + 29; gfx_blit (menulistimages[1][8], NULL, gfx.screen, &dest, 10000); dest.x = zx; gfx_blit (menulistimages[1][6], NULL, gfx.screen, &dest, 10000); //top & bottom for (j = 4; j < z + 4; j += 4) { dest.x = j + zx; dest.y = y; gfx_blit (menulistimages[1][1], NULL, gfx.screen, &dest, 10000); dest.y = y + 29; gfx_blit (menulistimages[1][7], NULL, gfx.screen, &dest, 10000); } //left &right for (j = 4; j < 29; j += 4) { dest.x = zx; dest.y = y + j; gfx_blit (menulistimages[1][3], NULL, gfx.screen, &dest, 10000); dest.x = z + zx + 4; gfx_blit (menulistimages[1][5], NULL, gfx.screen, &dest, 10000); } sprintf (text, "%s", players[i].name); font_draw (80, y, text, 0, 4); } // calc percentage, this a range from 0 to 255) switch (players[i].net.net_istep) { case 3: sprintf (text, "Getting Tunnel Data %d.", players[i].net.net_status); b = (players[i].net.net_status + 1) * 255 / s; break; case 2: sprintf (text, "Getting Field Data %d of %d.", players[i].net.net_status, map.size.y); b = (players[i].net.net_status + 1 + GAME_MAX_TUNNELS) * 255 / s; break; case 1: sprintf (text, "Getting Player Data %d of %d.", players[i].net.net_status, MAX_PLAYERS); b = (players[i].net.net_status + 1 + GAME_MAX_TUNNELS + map.size.y) * 255 / s; break; default: sprintf (text, "Ready"); b = 255; break; } //draw bar if (b > 0) { b1 = b * z / 255; dest.x = zx + 4; dest.y = y + 4; dest.w = menubuttonimages[2][0]->w; dest.h = menubuttonimages[2][0]->h; gfx_blit (menubuttonimages[2][0], NULL, gfx.screen, &dest, 10000); dest.x = zx + 4 + b1 - menubuttonimages[1][2]->w; if (dest.x < zx + 4) dest.x = zx + 4; dest.w = menubuttonimages[2][2]->w; dest.h = menubuttonimages[2][2]->h; gfx_blit (menubuttonimages[2][2], NULL, gfx.screen, &dest, 10000); if (b1 > menubuttonimages[2][0]->w + menubuttonimages[2][2]->w) { dest.w = menubuttonimages[2][1]->w; dest.h = menubuttonimages[2][1]->h; for (j = menubuttonimages[2][0]->w; j < b1 - menubuttonimages[2][2]->w; j += menubuttonimages[2][1]->w) { dest.x = j + zx + 4; gfx_blit (menubuttonimages[2][1], NULL, gfx.screen, &dest, 10000); } } } // draw old status in case of debug if (!players[i].net.net_istep) font_draw (80, y + 20, text, 0, 4); else if (debug) { redraw_logo (80, y + 35, gfx.res.x - 80, 15); font_draw (80, y + 35, text, 0, 4); } } gfx_blitdraw (); return; }
/* singleplayer menü with some options you can make */ void single_menu () { int i, p, eventstate = 0, done = 0, second_player = 0; _charlist nrplayerlist[MAX_PLAYERS + 1]; _charlist *selnrplayer = &nrplayerlist[bman.ai_players]; _menu *menu; _menuitem *aiplayer = NULL; SDL_Event event; /* fill in the nrplayerlist */ for (p = 0, i = 0; p < MAX_PLAYERS + 1; i++) { sprintf (nrplayerlist[i].text, "%d", p); if (p < MAX_PLAYERS - 1) nrplayerlist[i].next = &nrplayerlist[i + 1]; else nrplayerlist[i].next = NULL; p++; } game_resetdata (); menu = menu_new ("Single Game", 380,240); menu_create_text (menu, "numpl", 20, 50, 12, 2, COLOR_yellow, "Number of\nAI Players"); aiplayer = menu_create_list (menu, "AI Players", 40, 90, 50, 100, nrplayerlist, &selnrplayer, 3); menu_create_button (menu,"Change Playernames" ,160, 50, 210, 4); menu_create_bool (menu, "Use Second Player", 160, 90, 210, &second_player, 5); menu_create_button (menu, "Game Options", 180, 130, 150, 6); menu_create_button (menu, "Map Options", 180, 170, 150, 7); menu_create_button (menu, "Main Menu", 30, 220, 150, 1); menu_create_button (menu, "Start", 220, 220, 150, 2); menu_focus_id (menu, 2); menu->looprunning = 1; menu_draw (menu); do { gfx_blitdraw (); eventstate = s_fetchevent (&event); done = menu_event_loop (menu, &event, eventstate); if (done > 0 && menu->focus->id == 6) { done = 0; mapgamesetting (); } if (done > 0 && menu->focus->id == 7) { done = 0; mapmenu (); } if (done > 0 && menu->focus->id == 4) { done = 0; playernamemenu (); } if (done > 0 && menu->focus->id == 3) done = 0; s_calctimesync (); } while (!done); bman.ai_players = selnrplayer - &nrplayerlist[0]; if (menu->focus->id == 2) single_playergame (second_player, bman.ai_players); menu_delete (menu); };
/* single player game win/point screen * 1. setup all player data * 2. setup second local player and ai players * 3. setup all other game related data */ void single_playergame (int second_player, int ai_players) { int p, done = 0; bman.p_nr = -1; bman.p2_nr = -1; /* delete player and teams from the game */ for (p = 0; p < MAX_PLAYERS; p++) { players[p].points = 0; players[p].wins = 0; players[p].state = 0; players[p].team_nr = -1; players[p].gfx_nr = -1; players[p].gfx = NULL; memset (&players[p].net, 0x0, sizeof (_net_player)); } for (p = 0; p < MAX_TEAMS; p++) { teams[p].wins = 0; teams[p].points = 0; for (done = 0; done < MAX_PLAYERS; done++) teams[p].players[done] = NULL; } done = 0; for (bman.p_nr = -1, p = 0; (bman.p_nr == -1 && p < MAX_PLAYERS); p++) if (!(PS_IS_used (players[p].state))) bman.p_nr = p; players[bman.p_nr].team_nr = 0; if (bman.p_nr >= MAX_PLAYERS) { printf ("ERROR in function (single_game_new): couldn't find any free player\n"); exit (1); } strncpy (players[bman.p_nr].name, bman.playername, LEN_PLAYERNAME); do { done = playermenu_selgfx (bman.p_nr); } while (players[bman.p_nr].gfx_nr == -1 && done != -1); players[bman.p_nr].state = PSF_used + PSF_alife + PSF_playing; strncpy (players[bman.p_nr].name, bman.playername, LEN_PLAYERNAME); if (done != -1 && second_player) { player2_join (); do { done = playermenu_selgfx (bman.p2_nr); } while (players[bman.p2_nr].gfx_nr == -1 && done != -1); players[bman.p2_nr].team_nr = 0; } if (done == -1) return; single_create_ai (ai_players); if (bman.gametype == GT_team) { playermenu (); team_update (); ai_team_choosegfx (); } bman.state = GS_ready; while (!done && bman.state != GS_quit && bman.state != GS_startup) { single_game_new (); game_start (); bman.state = GS_running; game_loop (); game_end (); } gfx_blitdraw (); draw_logo (); gfx_blitdraw (); };