Merged branch 'no-SDL_mixer'.
[neverball] / ball / st_pause.c
1 /*
2  * Copyright (C) 2003 Robert Kooima
3  *
4  * NEVERBALL is  free software; you can redistribute  it and/or modify
5  * it under the  terms of the GNU General  Public License as published
6  * by the Free  Software Foundation; either version 2  of the License,
7  * or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT  ANY  WARRANTY;  without   even  the  implied  warranty  of
11  * MERCHANTABILITY or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU
12  * General Public License for more details.
13  */
14
15 #include <SDL_mixer.h>
16
17 #include "gui.h"
18 #include "config.h"
19 #include "game.h"
20 #include "levels.h"
21 #include "level.h"
22 #include "audio.h"
23 #include "hud.h"
24
25 #include "st_play.h"
26 #include "st_over.h"
27 #include "st_shared.h"
28 #include "st_pause.h"
29
30 #define PAUSE_CONTINUE 1
31 #define PAUSE_RESTART  2
32 #define PAUSE_EXIT     3
33
34 /*---------------------------------------------------------------------------*/
35
36 static struct state *st_continue;
37 static int paused;
38
39 int goto_pause(void)
40 {
41     st_continue = curr_state();
42     paused = 1;
43     return goto_state(&st_pause);
44 }
45
46 int is_paused(void)
47 {
48     return paused;
49 }
50
51 void clear_pause(void)
52 {
53     paused = 0;
54 }
55
56 /*---------------------------------------------------------------------------*/
57
58 static int pause_action(int i)
59 {
60     audio_play(AUD_MENU, 1.0f);
61
62     switch(i)
63     {
64     case PAUSE_CONTINUE:
65         SDL_PauseAudio(0);
66         config_set_grab(0);
67         return goto_state(st_continue);
68
69     case PAUSE_RESTART:
70         level_same();
71         clear_pause();
72         SDL_PauseAudio(0);
73         config_set_grab(1);
74         return goto_state(&st_play_ready);
75
76     case PAUSE_EXIT:
77         level_stat(GAME_NONE, curr_clock(), curr_coins());
78         level_stop();
79         clear_pause();
80         SDL_PauseAudio(0);
81         audio_music_stop();
82         return goto_state(&st_over);
83     }
84
85     return 1;
86 }
87
88 /*---------------------------------------------------------------------------*/
89
90 static int pause_enter(void)
91 {
92     int id, jd, title_id;
93
94     config_clr_grab();
95     SDL_PauseAudio(1);
96
97     /* Build the pause GUI. */
98
99     if ((id = gui_vstack(0)))
100     {
101         title_id = gui_label(id, _("Paused"), GUI_LRG, GUI_ALL, 0, 0);
102
103         gui_space(id);
104
105         if ((jd = gui_harray(id)))
106         {
107             gui_state(jd, _("Quit"), GUI_SML, PAUSE_EXIT, 0);
108
109             if (curr_lg()->mode != MODE_CHALLENGE)
110                 gui_state(jd, _("Restart"), GUI_SML, PAUSE_RESTART, 0);
111             else
112             {
113                 int ld = gui_state(jd, _("Restart"), GUI_SML, 0, 0);
114                 gui_set_color(ld, gui_gry, gui_gry);
115             }
116
117             gui_start(jd, _("Continue"), GUI_SML, PAUSE_CONTINUE, 1);
118         }
119
120         gui_pulse(title_id, 1.2f);
121         gui_layout(id, 0, 0);
122     }
123
124     hud_update(0);
125
126     return id;
127 }
128
129 static void pause_paint(int id, float st)
130 {
131     shared_paint(id, st);
132     hud_paint();
133 }
134
135 static void pause_timer(int id, float dt)
136 {
137     gui_timer(id, dt);
138     hud_timer (dt);
139 }
140
141 static int pause_keybd(int c, int d)
142 {
143     if (d)
144     {
145         if (config_tst_d(CONFIG_KEY_PAUSE, c))
146             return pause_action(PAUSE_CONTINUE);
147
148         if (config_tst_d(CONFIG_KEY_RESTART, c)
149             && curr_lg()->mode != MODE_CHALLENGE)
150             return pause_action(PAUSE_RESTART);
151     }
152     return 1;
153 }
154
155 static int pause_buttn(int b, int d)
156 {
157     if (d)
158     {
159         if (config_tst_d(CONFIG_JOYSTICK_BUTTON_A, b))
160             return pause_action(gui_token(gui_click()));
161
162         if (config_tst_d(CONFIG_JOYSTICK_BUTTON_EXIT, b))
163         {
164             if (SDL_GetModState() & KMOD_SHIFT)
165                 return pause_action(PAUSE_EXIT);
166             else
167                 return pause_action(PAUSE_CONTINUE);
168         }
169     }
170     return 1;
171 }
172
173 /*---------------------------------------------------------------------------*/
174
175 struct state st_pause = {
176     pause_enter,
177     shared_leave,
178     pause_paint,
179     pause_timer,
180     shared_point,
181     shared_stick,
182     shared_click,
183     pause_keybd,
184     pause_buttn,
185     1, 0
186 };