2 * $Logfile: /Freespace2/code/MissionUI/MissionPause.cpp $
9 * Revision 1.1 2002/05/03 03:28:10 root
13 * 7 7/29/99 10:48p Dave
14 * Multiplayer pause screen.
16 * 6 6/29/99 7:39p Dave
17 * Lots of small bug fixes.
19 * 5 6/09/99 2:17p Dave
20 * Fixed up pleasewait bitmap rendering.
26 #include "missionpause.h"
28 #include "multi_pause.h"
34 #include "gamesequence.h"
35 #include "freespace.h"
39 #include "alphacolors.h"
42 // ----------------------------------------------------------------------------------------------------------------
47 char *Pause_bmp_name[GR_NUM_RESOLUTIONS] = {
52 // pause bitmap display stuff
53 int Please_wait_coords[GR_NUM_RESOLUTIONS][4] = {
62 char *Pause_multi_fname[GR_NUM_RESOLUTIONS] = {
66 char *Pause_multi_mask[GR_NUM_RESOLUTIONS] = {
71 // pause window objects
73 UI_CHECKBOX Pause_single_step;
74 UI_CHECKBOX Pause_physics;
76 UI_CHECKBOX Pause_ai_render;
77 UI_CHECKBOX Pause_firing;
78 UI_CHECKBOX Pause_external_view_mode_check;
79 UI_BUTTON Pause_continue;
81 // if we're already paused
84 // background screen (for the chatbox)
85 int Pause_background_bitmap = -1;
87 // saved background screen
88 int Pause_saved_screen = -1;
90 // if we're in external vie wmode
91 int Pause_external_view_mode = 0;
94 extern int Player_attacking_enabled;
95 extern int Ai_render_debug_flag;
96 extern int Ai_firing_enabled;
97 extern int physics_paused;
99 extern int last_single_step;
100 extern int game_single_step;
102 // ----------------------------------------------------------------------------------------------------------------
106 // initialize the pause screen
107 void pause_init(int multi)
109 // if we're already paused. do nothing
114 // pause all beam weapon sounds
117 if(!(Game_mode & GM_STANDALONE_SERVER)){
118 Pause_saved_screen = gr_save_screen();
120 // pause all game music
121 audiostream_pause_all();
123 //JAS: REMOVED CALL TO SET INTERFACE PALETTE TO GET RID OF SCREEN CLEAR WHEN PAUSING
124 //common_set_interface_palette(); // set the interface palette
125 Pause_win.create(0, 0, gr_screen.max_w, gr_screen.max_h, 0);
128 Pause_win.set_mask_bmap(Pause_multi_mask[gr_screen.res]);
129 Pause_background_bitmap = bm_load(Pause_multi_fname[gr_screen.res]);
131 multi_pause_init(&Pause_win);
133 Pause_background_bitmap = bm_load(Pause_bmp_name[gr_screen.res]);
136 multi_pause_init(NULL);
142 // pause do frame - will handle running multiplayer operations if necessary
143 void pause_do(int multi)
146 char *pause_str = XSTR("Paused", 767);
149 if(Game_mode & GM_STANDALONE_SERVER){
152 // RENDER A GAME FRAME HERE AS THE BACKGROUND
153 gr_restore_screen(Pause_saved_screen);
154 if (Pause_background_bitmap >= 0) {
155 gr_set_bitmap(Pause_background_bitmap);
160 gr_bitmap(Please_wait_coords[gr_screen.res][0], Please_wait_coords[gr_screen.res][1]);
162 // draw "Paused" on it
163 gr_set_color_fast(&Color_normal);
165 gr_get_string_size(&str_w, &str_h, pause_str);
166 gr_string((gr_screen.max_w - str_w) / 2, (gr_screen.max_h - str_h) / 2, pause_str);
171 // the multi paused screen will do its own window processing
175 // otherwise process the ui window here
177 k = Pause_win.process() & ~KEY_DEBUGGED;
181 gameseq_post_event(GS_EVENT_PREVIOUS_STATE);
186 // draw the background window
189 // a very unique case where we shouldn't be doing the page flip because we're inside of popup code
193 // this should only be happening in a very unique multiplayer case
194 Assert(Game_mode & GM_MULTIPLAYER);
199 // close the pause screen
200 void pause_close(int multi)
202 // if we're not paused - do nothing
207 // unpause all beam weapon sounds
208 beam_unpause_sounds();
211 if(Game_mode & GM_STANDALONE_SERVER){
214 gr_free_screen(Pause_saved_screen);
216 if (Pause_background_bitmap){
217 bm_unload(Pause_background_bitmap);
226 // unpause all the music
227 audiostream_unpause_all();
234 void pause_debug_init()
236 Pause_win.create( 100,100,400,300, WIN_DIALOG );
238 Pause_physics.create( &Pause_win, NOX("Physics Pause <P>"), 200, 150, physics_paused );
239 Pause_ai.create( &Pause_win, NOX("AI Pause <A>"), 200, 175, ai_paused );
241 Pause_ai_render.create( &Pause_win, NOX("AI Render Stuff <R>"), 200, 200, Ai_render_debug_flag);
243 Pause_firing.create( &Pause_win, NOX("AI firing <F>"), 200, 225, Ai_firing_enabled);
244 Pause_external_view_mode_check.create( &Pause_win, NOX("External View <E>"), 200, 250, Pause_external_view_mode);
245 Pause_single_step.create( &Pause_win, NOX("Single Step <S>"), 200, 290, game_single_step );
246 Pause_continue.create( &Pause_win, NOX("Leave Pause"), 200, 350, 200, 40 );
248 Pause_single_step.set_hotkey( KEY_S );
249 Pause_physics.set_hotkey( KEY_P );
250 Pause_ai.set_hotkey( KEY_A );
251 Pause_ai_render.set_hotkey( KEY_R );
252 Pause_firing.set_hotkey( KEY_F );
253 Pause_external_view_mode_check.set_hotkey( KEY_E );
254 Pause_continue.set_hotkey( KEY_ESC );
256 Pause_continue.set_focus();
259 // debug pause do frame
260 void pause_debug_do()
264 key = Pause_win.process();
265 if ( Pause_single_step.changed()) {
266 game_single_step = Pause_single_step.checked();
269 if ( Pause_physics.changed()) {
270 physics_paused = Pause_physics.checked();
273 if ( Pause_ai.changed()) {
274 ai_paused = Pause_ai.checked();
276 obj_init_all_ships_physics();
280 if ( Pause_ai_render.changed()) {
281 Ai_render_debug_flag = Pause_ai_render.checked();
284 if ( Pause_firing.changed()) {
285 Ai_firing_enabled = Pause_firing.checked();
288 if ( Pause_external_view_mode_check.changed()) {
289 Pause_external_view_mode = Pause_external_view_mode_check.checked();
290 if (Pause_external_view_mode){
291 HUD_sourced_printf(HUD_SOURCE_HIDDEN, XSTR( "External view of player ship.", 182));
293 HUD_sourced_printf(HUD_SOURCE_HIDDEN, XSTR( "View from inside player ship.", 183));
297 if ( Pause_continue.pressed() || (key == KEY_PAUSE) ) { // Changed, MK, 11/9/97, only Pause break pause.
298 gameseq_post_event(GS_EVENT_PREVIOUS_STATE);
308 void pause_debug_close()
310 last_single_step = 0; // Make so single step waits a frame before stepping