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