// display the medals screen for this player void multi_pinfo_do_medals() { #ifdef FS2DEMO game_feature_not_in_demo_popup(); #elif defined(SAGA_NO_MULTIPLAYER_YET) game_feature_not_supported_by_saga_yet(); #else int ret_code; // initialize the medals screen medal_main_init(Multi_pinfo_popup_player->m_player, MM_POPUP); // run the medals screen until it says that it should be closed do { // set frametime and run common functions game_set_frametime(-1); game_do_state_common(gameseq_get_state()); // run the medals screen ret_code = medal_main_do(); } while (ret_code && !Multi_pinfo_popup_done); // close the medals screen down medal_main_close(); // restore the proper palette multi_pinfo_set_palette(); #endif }
// run the popup in a tight loop (no states) void multi_pinfo_popup_do() { int k; // if there was an error in initialization, return immediately if (Multi_pinfo_popup_error) { return; } // tight loop while (!Multi_pinfo_popup_done) { multi_pinfo_maybe_reload_pic(&Mp_pilot); multi_pinfo_maybe_reload_pic(&Mp_squad); // process the window k = Multi_pinfo_window.process(); switch (k) { case KEY_ESC : Multi_pinfo_popup_done = 1; break; } // check button presses multi_pinfo_popup_check_buttons(); // set frametime and run background stuff game_set_frametime(-1); game_do_state_common(gameseq_get_state()); // draw the background bitmap and the ui window over it Assert(Multi_pinfo_screen_save != -1); gr_reset_clip(); gr_restore_screen(Multi_pinfo_screen_save); // grey the screen gr_set_shader(&Grey_shader); gr_shade(0, 0, gr_screen.clip_width, gr_screen.clip_height, false); // draw the background bitmap gr_set_bitmap(Multi_pinfo_bitmap); gr_bitmap(0, 0); // blit the selected pilot image multi_pinfo_blit_pilot_image(); // blit the squadron logo multi_pinfo_blit_squadron_logo(); // blit the player statistics multi_pinfo_blit_player_stats(); // draw the ui window and flip Multi_pinfo_window.draw(); gr_flip(); } }
// process all endgame related events void multi_endgame_process() { if ( Multi_endgame_processing ) return; Multi_endgame_processing = 1; // check to see if we need to be warping out (strange transition possibilities) multi_endgame_check_for_warpout(); // if we're the server of the game if(Net_player->flags & NETINFO_FLAG_AM_MASTER){ // if we're not waiting for clients to leave, do nothing if(!Multi_endgame_server_waiting){ Multi_endgame_processing = 0; return; } // if a popup is already active, do nothing if(popup_active()){ Multi_endgame_processing = 0; return; } // otherwise popup until things are hunky-dory if(!multi_endgame_server_ok_to_leave()){ if(Game_mode & GM_STANDALONE_SERVER){ while(!multi_endgame_server_ok_to_leave()){ // run networking, etc. game_set_frametime(-1); game_do_state_common(gameseq_get_state()); } } else { popup_till_condition( multi_endgame_server_ok_to_leave , XSTR("&Cancel",645), XSTR("Waiting for clients to disconnect",646)); } } // mark myself as not waiting and get out multi_endgame_cleanup(); } else { // if we're not waiting to leave the game, do nothing if(!Multi_endgame_client_waiting){ Multi_endgame_processing = 0; return; } // otherwise, check to see if there is a popup active if(popup_active()){ Multi_endgame_processing = 0; return; } // if not, then we are good to leave multi_endgame_cleanup(); } Multi_endgame_processing = 0; }
int popup_do_with_condition(popup_info *pi, int flags, int(*condition)()) { int screen_id, choice = -1, done = 0; int test; screen_id = gr_save_screen(); if ( popup_init(pi, flags) == -1 ) return -1; int old_max_w_unscaled = gr_screen.max_w_unscaled; int old_max_h_unscaled = gr_screen.max_h_unscaled; int old_max_w_unscaled_zoomed = gr_screen.max_w_unscaled_zoomed; int old_max_h_unscaled_zoomed = gr_screen.max_h_unscaled_zoomed; gr_reset_screen_scale(); while(!done) { int k; os_poll(); game_set_frametime(-1); game_do_state_common(gameseq_get_state()); // do stuff common to all states gr_restore_screen(screen_id); // draw one frame first Popup_window.draw(); popup_force_draw_buttons(pi); popup_draw_msg_text(pi, flags); popup_draw_button_text(pi, flags); gr_flip(); // test the condition function or process for the window if ((test = condition()) > 0) { done = 1; choice = test; } else { k = Popup_window.process(); // poll for input, handle mouse choice = popup_process_keys(pi, k, flags); if ( choice != POPUP_NOCHANGE ) { done=1; } if ( !done ) { choice = popup_check_buttons(pi); if ( choice != POPUP_NOCHANGE ) { done=1; } } } } gr_set_screen_scale(old_max_w_unscaled, old_max_h_unscaled, old_max_w_unscaled_zoomed, old_max_h_unscaled_zoomed); popup_close(pi,screen_id); return choice; }
// display the medals screen for this player void multi_pinfo_do_medals() { int ret_code; // initialize the medals screen medal_main_init(Multi_pinfo_popup_player->m_player,MM_POPUP); // run the medals screen until it says that it should be closed do { // set frametime and run common functions game_set_frametime(-1); game_do_state_common(gameseq_get_state()); // run the medals screen ret_code = medal_main_do(); } while(ret_code && !Multi_pinfo_popup_done); // close the medals screen down medal_main_close(); }
// exit: -1 => error // 0..nchoices-1 => choice int popup_do(popup_info *pi, int flags) { int screen_id, choice = -1, done = 0; if ( popup_init(pi, flags) == -1 ){ return -1; } screen_id = gr_save_screen(); int old_max_w_unscaled = gr_screen.max_w_unscaled; int old_max_h_unscaled = gr_screen.max_h_unscaled; int old_max_w_unscaled_zoomed = gr_screen.max_w_unscaled_zoomed; int old_max_h_unscaled_zoomed = gr_screen.max_h_unscaled_zoomed; gr_reset_screen_scale(); while(!done) { int k; os_poll(); // if we were killed by a call to popup_kill_any_active(), kill the popup if(Popup_should_die){ choice = -1; break; } // if we're flagged as should be running the state underneath, then do so if(flags & PF_RUN_STATE){ game_do_state(gameseq_get_state()); } // otherwise just run the common functions (for networking,etc) else { game_set_frametime(-1); game_do_state_common(gameseq_get_state(),flags & PF_NO_NETWORKING); // do stuff common to all states } k = Popup_window.process(); // poll for input, handle mouse choice = popup_process_keys(pi, k, flags); if ( choice != POPUP_NOCHANGE ) { done=1; } if ( !done ) { choice = popup_check_buttons(pi); if ( choice != POPUP_NOCHANGE ) { done=1; } } // don't draw anything if(!(flags & PF_RUN_STATE)){ gr_restore_screen(screen_id); } // if this is an input popup, store the input text if(flags & PF_INPUT){ Popup_input.get_text(pi->input_text); } Popup_window.draw(); popup_force_draw_buttons(pi); popup_draw_msg_text(pi, flags); popup_draw_button_text(pi, flags); gr_flip(); } gr_set_screen_scale(old_max_w_unscaled, old_max_h_unscaled, old_max_w_unscaled_zoomed, old_max_h_unscaled_zoomed); popup_close(pi,screen_id); return choice; }