From b3b87fc62dc181a1dd80fc596d98f8a8c9e6120c Mon Sep 17 00:00:00 2001 From: kreatordxx <> Date: Sat, 9 Jan 2010 09:19:26 +0000 Subject: [PATCH] Make pause box a window --- CHANGELOG.txt | 4 ++ arch/include/window.h | 4 ++ main/game.c | 2 +- main/gamecntl.c | 112 ++++++++++++++++++++++++------------------ main/gamerend.c | 8 +-- 5 files changed, 77 insertions(+), 53 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 56d4a8d89..64bfda1e9 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,5 +1,9 @@ D1X-Rebirth Changelog +20100109 +-------- +arch/include/window.h, main/game.c, main/gamecntl.c, main/gamerend.c: Make pause box a window + 20100108 -------- arch/sdl/event.h, main/menu.c, main/newmenu.c, main/newmenu.h: Add EVENT_NEWMENU_SELECTED, allowing a newmenu/listbox selection to be handled in the callback. Demonstrate with "Select Song" menu diff --git a/arch/include/window.h b/arch/include/window.h index 2000e9b72..6ebf26349 100644 --- a/arch/include/window.h +++ b/arch/include/window.h @@ -8,6 +8,9 @@ * -kreator 2009-05-06 */ +#ifndef DESCENT_WINDOW_H +#define DESCENT_WINDOW_H + #include "event.h" #include "gr.h" @@ -23,3 +26,4 @@ extern void window_set_visible(window *wind, int visible); extern int window_is_visible(window *wind); extern grs_canvas *window_get_canvas(window *wind); extern int window_send_event(window *wind, d_event *event); +#endif \ No newline at end of file diff --git a/main/game.c b/main/game.c index 1f94bb834..865a9e274 100644 --- a/main/game.c +++ b/main/game.c @@ -1016,7 +1016,7 @@ int game_handler(window *wind, d_event *event, void *data) ReadControls(); // will have its own event(s) eventually if (window_get_front() != wind) - return 1; // in automap + return 1; GameProcessFrame(); diff --git a/main/gamecntl.c b/main/gamecntl.c index 902057916..86b88c983 100644 --- a/main/gamecntl.c +++ b/main/gamecntl.c @@ -26,6 +26,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #include #include "pstypes.h" +#include "window.h" #include "console.h" #include "inferno.h" #include "game.h" @@ -222,14 +223,67 @@ void format_time(char *str, int secs_int) extern int netplayerinfo_on; -//Process selected keys until game unpaused. returns key that left pause (p or esc) -int do_game_pause() +//Process selected keys until game unpaused +int pause_handler(window *wind, d_event *event, char *msg) { int key; - char msg[1000]; - char total_time[9],level_time[9]; - int Game_paused; + + if (event->type == EVENT_DRAW) + { + show_boxed_message(msg, 1); + return 1; + } + else if (event->type == EVENT_CLOSE) + { + game_flush_inputs(); + reset_cockpit(); + start_time(); + if (EXT_MUSIC_ON) + ext_music_resume(); + digi_resume_all(); + d_free(msg); + + return 1; + } + + timer_delay2(50); + key = key_inkey(); + + switch (key) { + case 0: + break; + case KEY_ESC: + //Function_mode = FMODE_MENU; // Don't like this, just press escape twice (kreatordxx) + window_close(wind); + break; + case KEY_F1: + show_help(); + break; + case KEY_PAUSE: + window_close(wind); + break; + case KEY_ALTED+KEY_ENTER: + case KEY_ALTED+KEY_PADENTER: + gr_toggle_fullscreen(); + break; + default: + return 0; + break; + } + + return 1; +} + +int do_game_pause() +{ + char *msg; + char total_time[9],level_time[9]; + + MALLOC(msg, char, 1024); + if (!msg) + return 0; + #ifdef NETWORK if (Game_mode & GM_MULTI) { @@ -249,50 +303,12 @@ int do_game_pause() sprintf(msg,"PAUSE\n\nSkill level: %s\nHostages on board: %d\nTime on level: %s\nTotal time in game: %s",(*(&TXT_DIFFICULTY_1 + (Difficulty_level))),Players[Player_num].hostages_on_board,level_time,total_time); else sprintf(msg,"PAUSE\n\nSkill level: %s\nHostages on board: %d\n",(*(&TXT_DIFFICULTY_1 + (Difficulty_level))),Players[Player_num].hostages_on_board); - Game_paused=1; set_screen_mode(SCREEN_MENU); - show_boxed_message(msg, 1); - while (Game_paused) - { - timer_delay2(50); -#ifdef OGL - show_boxed_message(msg, 1); -#endif - - key = key_inkey(); - - switch (key) { - case 0: - break; - case KEY_ESC: - Function_mode = FMODE_MENU; - Game_paused=0; - break; - case KEY_F1: - show_help(); - show_boxed_message(TXT_PAUSE, 1); - break; - case KEY_PAUSE: - Game_paused=0; - break; - case KEY_ALTED+KEY_ENTER: - case KEY_ALTED+KEY_PADENTER: - gr_toggle_fullscreen(); - break; - default: - break; - } - } + if (!window_create(&grd_curscreen->sc_canvas, 0, 0, SWIDTH, SHEIGHT, (int (*)(window *, d_event *, void *))pause_handler, msg)) + d_free(msg); - game_flush_inputs(); - reset_cockpit(); - start_time(); - if (EXT_MUSIC_ON) - ext_music_resume(); - digi_resume_all(); - - return key; + return 0 /*key*/; // Keycode returning ripped out (kreatordxx) } void HandleEndlevelKey(int key) @@ -308,10 +324,10 @@ void HandleEndlevelKey(int key) #if defined(__APPLE__) || defined(macintosh) if ( key == (KEY_COMMAND+KEY_P) ) - key = do_game_pause(); + /*key =*/ do_game_pause(); #endif if (key == KEY_PAUSE) - key = do_game_pause(); //so esc from pause will end level + /*key =*/ do_game_pause(); //so esc from pause will end level. Removed: Don't like this, just press escape twice (kreatordxx) if (key == KEY_ESC) { stop_endlevel_sequence(); diff --git a/main/gamerend.c b/main/gamerend.c index 7d72483dc..a51444f78 100644 --- a/main/gamerend.c +++ b/main/gamerend.c @@ -500,9 +500,6 @@ void show_boxed_message(char *msg, int RenderFlag) int w,h,aw; int x,y; - if (Function_mode==FMODE_GAME && RenderFlag) - game_do_render_frame(0); - gr_set_current_canvas(NULL); gr_set_curfont( MEDIUM1_FONT ); gr_set_fontcolor(BM_XRGB(31, 31, 31), -1); @@ -514,6 +511,9 @@ void show_boxed_message(char *msg, int RenderFlag) nm_draw_background(x-BORDERX,y-BORDERY,x+w+BORDERX,y+h+BORDERY); gr_printf( 0x8000, y, msg ); - gr_flip(); + + // If we haven't drawn behind it, need to flip + if (!RenderFlag) + gr_flip(); }