1 // $Id$
2
3 // Fish Supper
4 // Copyright 2006, 2007, 2009, 2010 Matthew Clarke <mafferyew@googlemail.com>
5 //
6 // This file is part of Fish Supper.
7 //
8 // Fish Supper is free software: you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation, either version 3 of the License, or
11 // (at your option) any later version.
12 //
13 // Fish Supper is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 // GNU General Public License for more details.
17 //
18 // You should have received a copy of the GNU General Public License
19 // along with Fish Supper. If not, see <http://www.gnu.org/licenses/>.
20
21
22
23
24 #include "Game_manager.h"
25 #include <iostream>
26 #include <cstdlib>
27
28
29
30
31 // *******************
32 // *** CONSTRUCTOR ***
33 // *******************
Game_manager()34 FS::Game_manager::Game_manager() : p_model(&timer),
35 my_settings_screen(&my_settings)
36 {
37 current_state = INTRO;
38 p_model.init_sprite_manager( &snd_engine );
39 snd_engine.turn_on( my_settings.is_sound() );
40
41 } // FS::Game_manager::Game_manager
42
43 // ******************
44 // *** DESTRUCTOR ***
45 // ******************
~Game_manager()46 FS::Game_manager::~Game_manager()
47 {
48 // ...
49
50 } // FS::Game_manager::~Game_manager
51
52
53
54
55 // ************************
56 // *** MEMBER FUNCTIONS ***
57 // ************************
58
59 // **************************************************
60
start_loop()61 void FS::Game_manager::start_loop()
62 {
63 SDL_Event event;
64 loop_running = true;
65 // Stores return val from GetReadyDisplay::redraw_level_select.
66 int start_level = 0;
67 bool done; // used for HI_SCORES case...
68
69 // Before we enter the loop, display the title screen
70 my_title_screen.draw();
71
72 while (loop_running)
73 {
74 while ( SDL_PollEvent(&event) )
75 {
76 if ( current_state == ENTERING_NAME )
77 {
78 if ( event.type == SDL_KEYDOWN )
79 {
80 input_ptr->add_keydown_event(event);
81 } // if
82 }
83 else
84 {
85 switch (event.type)
86 {
87 case SDL_KEYDOWN:
88 case SDL_KEYUP:
89 case SDL_JOYAXISMOTION:
90 case SDL_JOYBUTTONDOWN:
91 input_ptr->add_event( event, my_settings.is_joystick_selected() );
92 break;
93 case SDL_QUIT:
94 loop_running = false;
95 break;
96 } // switch
97 } // if ... else
98 } // while
99
100 switch (current_state)
101 {
102 case INTRO:
103 handle_selection( my_title_screen.update() );
104 break;
105
106 case SELECTING_START_LEVEL:
107 start_level = my_gr_screen.update_level_select();
108 if ( start_level )
109 {
110 current_state = GET_READY;
111 p_model.new_game(start_level);
112 my_gr_screen.init_countdown( timer.get_time(), start_level );
113 } // if
114 break;
115
116 case GET_READY:
117 if ( my_gr_screen.update_countdown(timer.get_time(), p_model.get_level()) )
118 {
119 current_state = PLAY;
120 p_model.new_level(timer.get_time());
121 } // if
122 break;
123
124 case PLAY:
125 switch ( p_model.update(timer.get_time()) )
126 {
127 case PR_OK:
128 break;
129 case PR_LEVEL_COMPLETED:
130 if (current_mode == MODE_TUTORIAL)
131 {
132 current_state = INTRO;
133 my_title_screen.draw();
134 }
135 else
136 {
137 current_state = GET_READY;
138 my_gr_screen.init_countdown( timer.get_time(), p_model.get_level() );
139 } // if ... else
140 break;
141 case PR_GAME_OVER:
142 my_settings.set_furthest_level(p_model.get_level());
143 if ( my_hs_screen.check_candidate(p_model.get_score()) )
144 {
145 current_state = ENTERING_NAME;
146 my_hs_screen.init_input(p_model.get_score());
147 }
148 else
149 {
150 current_state = INTRO;
151 my_title_screen.draw();
152 } // if ... else
153 break;
154 } // switch
155 break;
156
157 case SETTINGS:
158 if ( my_settings_screen.update() )
159 {
160 snd_engine.turn_on( my_settings.is_sound() );
161 current_state = INTRO;
162 my_title_screen.draw();
163 } // if
164 break;
165
166 case HI_SCORES:
167 User_input::Keyboard_Event ke;
168 done = false;
169
170 // Make sure all events are gobbled up.
171 while ( input_ptr->next_event(ke) )
172 {
173 if ( ke == User_input::ESCAPE_PRESSED
174 || ke == User_input::JUMP_KEY_PRESSED )
175 {
176 done = true;
177 } // if
178 } // while
179
180 if (done)
181 {
182 current_state = INTRO;
183 my_title_screen.draw();
184 } // if
185
186 break;
187
188 case ENTERING_NAME:
189 if ( my_hs_screen.input() )
190 {
191 current_state = HI_SCORES;
192 my_hs_screen.show_high_scores();
193 } // if
194 break;
195
196 } // switch
197
198 SDL_Delay(10); // 100 fps
199
200 } // while
201
202 my_settings.write_config_file();
203 my_hs_screen.write_high_scores();
204
205 } // FS::Game_manager::start_loop
206
207 // **************************************************
208
handle_selection(Title_screen::Selection sel)209 void FS::Game_manager::handle_selection(Title_screen::Selection sel)
210 {
211 switch (sel)
212 {
213 case Title_screen::none:
214 break;
215 case Title_screen::play:
216 current_mode = MODE_GAME;
217 if (my_settings.get_furthest_level() > 1)
218 {
219 current_state = SELECTING_START_LEVEL;
220 my_gr_screen.init_level_select( my_settings.get_furthest_level() );
221 }
222 else
223 {
224 current_state = GET_READY;
225 p_model.new_game();
226 my_gr_screen.init_countdown( timer.get_time(), p_model.get_level() );
227 } // if ... else
228 break;
229 case Title_screen::tutorial:
230 current_mode = MODE_TUTORIAL;
231 current_state = PLAY; // FIXME: or GET_READY?
232 p_model.new_game(1); // FIXME: in future, select a tutorial level
233 p_model.new_level(timer.get_time());
234 break;
235 case Title_screen::settings:
236 current_state = SETTINGS;
237 my_settings_screen.reset();
238 my_settings_screen.draw();
239 break;
240 case Title_screen::hi_scores:
241 current_state = HI_SCORES;
242 my_hs_screen.show_high_scores();
243 break;
244 case Title_screen::quit:
245 loop_running = false;
246 break;
247 } // switch
248
249 } // FS::Game_manager::handle_selection
250
251 // **************************************************
252 // **************************************************
253 // **************************************************
254 // **************************************************
255 // **************************************************
256