2 * Copyright (C) 2003 Robert Kooima
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.
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.
22 #include "st_shared.h"
25 #include "st_play_end.h"
28 /*---------------------------------------------------------------------------*/
30 static int view_rotate;
32 /*---------------------------------------------------------------------------*/
34 static int abort_play(void)
36 if (curr_lg()->mode == MODE_SINGLE)
39 return goto_state(&st_over);
42 static int play_ready_enter(void)
46 if ((id = gui_label(0, _("Ready?"), GUI_LRG, GUI_ALL, 0, 0)))
52 audio_play(AUD_READY, 1.0f);
58 static void play_ready_timer(int id, float dt)
60 float t = time_state();
62 game_set_fly(1.0f - 0.5f * t);
64 if (dt > 0.0f && t > 1.0f)
65 goto_state(&st_play_set);
72 static int play_ready_click(int b, int d)
74 return (b < 0 && d == 1) ? goto_state(&st_play_loop) : 1;
77 static int play_ready_buttn(int b, int d)
81 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_A, b))
82 return goto_state(&st_play_loop);
83 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_EXIT, b))
89 /*---------------------------------------------------------------------------*/
91 static int play_set_enter(void)
95 if ((id = gui_label(0, _("Set?"), GUI_LRG, GUI_ALL, 0, 0)))
101 audio_play(AUD_SET, 1.f);
106 static void play_set_timer(int id, float dt)
108 float t = time_state();
110 game_set_fly(0.5f - 0.5f * t);
112 if (dt > 0.0f && t > 1.0f)
113 goto_state(&st_play_loop);
119 static int play_set_click(int b, int d)
124 return goto_state(&st_play_loop);
129 static int play_set_buttn(int b, int d)
133 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_A, b))
134 return goto_state(&st_play_loop);
135 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_EXIT, b))
141 /*---------------------------------------------------------------------------*/
143 static int nohud = 0;
145 static int play_loop_enter(void)
149 if ((id = gui_label(0, _("GO!"), GUI_LRG, GUI_ALL, gui_blu, gui_grn)))
151 gui_layout(id, 0, 0);
155 audio_play(AUD_GO, 1.f);
160 hud_view_pulse(config_get_d(CONFIG_CAMERA));
169 static void play_loop_paint(int id, float st)
175 if (time_state() < 1.f)
179 static void play_loop_timer(int id, float dt)
181 float k = (((SDL_GetModState() & KMOD_LSHIFT) ||
182 (SDL_GetModState() & KMOD_RSHIFT)) ?
183 (float) config_get_d(CONFIG_ROTATE_FAST) / 100.f:
184 (float) config_get_d(CONFIG_ROTATE_SLOW) / 100.f);
188 float g[3] = { 0.0f, -9.8f, 0.0f };
190 int state, state_value;
192 at = (7 * at + dt) / 8;
196 game_set_rot(view_rotate * k);
198 state = game_step(g, at, &state_value);
206 level_stop(state, state_value, curr_clock(), curr_coins());
207 goto_state(&st_play_end);
211 static void play_loop_point(int id, int x, int y, int dx, int dy)
213 game_set_pos(dx, dy);
216 static void play_loop_stick(int id, int a, int k)
218 if (config_tst_d(CONFIG_JOYSTICK_AXIS_X, a))
220 if (config_tst_d(CONFIG_JOYSTICK_AXIS_Y, a))
224 static int play_loop_click(int b, int d)
226 view_rotate = d ? b : 0;
230 static int play_loop_keybd(int c, int d)
234 if (config_tst_d(CONFIG_KEY_CAMERA_R, c))
236 if (config_tst_d(CONFIG_KEY_CAMERA_L, c))
239 if (config_tst_d(CONFIG_KEY_CAMERA_1, c))
241 config_set_d(CONFIG_CAMERA, 0);
244 if (config_tst_d(CONFIG_KEY_CAMERA_2, c))
246 config_set_d(CONFIG_CAMERA, 1);
249 if (config_tst_d(CONFIG_KEY_CAMERA_3, c))
251 config_set_d(CONFIG_CAMERA, 2);
254 if (c == SDLK_r && curr_lg()->mode != MODE_CHALLENGE)
256 level_stop(GAME_NONE, 0, curr_clock(), curr_coins());
258 goto_state(&st_play_set);
263 if (config_tst_d(CONFIG_KEY_CAMERA_R, c))
265 if (config_tst_d(CONFIG_KEY_CAMERA_L, c))
269 if (d && c == SDLK_F12)
270 return goto_state(&st_look);
272 if (d && c == SDLK_F6)
276 if (d && c == SDLK_c && config_get_d(CONFIG_CHEAT))
278 level_stop(GAME_GOAL, 0, curr_clock(), curr_coins());
279 return goto_state(&st_play_end);
284 static int play_loop_buttn(int b, int d)
288 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_EXIT, b))
290 level_stop(GAME_NONE, 0, curr_clock(), curr_coins());
294 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_R, b))
296 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_L, b))
299 if (config_tst_d(CONFIG_JOYSTICK_CAMERA_1, b))
301 config_set_d(CONFIG_CAMERA, 0);
304 if (config_tst_d(CONFIG_JOYSTICK_CAMERA_2, b))
306 config_set_d(CONFIG_CAMERA, 1);
309 if (config_tst_d(CONFIG_JOYSTICK_CAMERA_3, b))
311 config_set_d(CONFIG_CAMERA, 2);
317 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_R, b))
319 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_L, b))
325 /*---------------------------------------------------------------------------*/
330 static int look_enter(void)
337 static void look_leave(int id)
341 static void look_paint(int id, float st)
346 static void look_point(int id, int x, int y, int dx, int dy)
348 phi += 90.0f * dy / config_get_d(CONFIG_HEIGHT);
349 theta += 180.0f * dx / config_get_d(CONFIG_WIDTH);
351 if (phi > +90.0f) phi = +90.0f;
352 if (phi < -90.0f) phi = -90.0f;
354 if (theta > +180.0f) theta -= 360.0f;
355 if (theta < -180.0f) theta += 360.0f;
357 game_look(phi, theta);
360 static int look_keybd(int c, int d)
362 if (d && c == SDLK_F12)
363 return goto_state(&st_play_loop);
368 static int look_buttn(int b, int d)
370 if (d && config_tst_d(CONFIG_JOYSTICK_BUTTON_EXIT, b))
371 return goto_state(&st_play_loop);
376 /*---------------------------------------------------------------------------*/
378 struct state st_play_ready = {
391 struct state st_play_set = {
404 struct state st_play_loop = {
417 struct state st_look = {