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"
29 /*---------------------------------------------------------------------------*/
31 static int view_rotate;
33 /*---------------------------------------------------------------------------*/
35 static int abort_play(void)
37 if (curr_lg()->mode == MODE_SINGLE)
40 return goto_state(&st_over);
43 static int play_ready_enter(void)
47 if ((id = gui_label(0, _("Ready?"), GUI_LRG, GUI_ALL, 0, 0)))
53 audio_play(AUD_READY, 1.0f);
59 static void play_ready_timer(int id, float dt)
61 float t = time_state();
63 game_set_fly(1.0f - 0.5f * t);
65 if (dt > 0.0f && t > 1.0f)
66 goto_state(&st_play_set);
73 static int play_ready_click(int b, int d)
75 return (b < 0 && d == 1) ? goto_state(&st_play_loop) : 1;
78 static int play_ready_buttn(int b, int d)
82 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_A, b))
83 return goto_state(&st_play_loop);
84 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_EXIT, b))
90 /*---------------------------------------------------------------------------*/
92 static int play_set_enter(void)
96 if ((id = gui_label(0, _("Set?"), GUI_LRG, GUI_ALL, 0, 0)))
102 audio_play(AUD_SET, 1.f);
107 static void play_set_timer(int id, float dt)
109 float t = time_state();
111 game_set_fly(0.5f - 0.5f * t);
113 if (dt > 0.0f && t > 1.0f)
114 goto_state(&st_play_loop);
120 static int play_set_click(int b, int d)
125 return goto_state(&st_play_loop);
130 static int play_set_buttn(int b, int d)
134 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_A, b))
135 return goto_state(&st_play_loop);
136 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_EXIT, b))
142 /*---------------------------------------------------------------------------*/
144 static int play_loop_enter(void)
148 if ((id = gui_label(0, _("GO!"), GUI_LRG, GUI_ALL, gui_blu, gui_grn)))
150 gui_layout(id, 0, 0);
154 audio_play(AUD_GO, 1.f);
164 static void play_loop_paint(int id, float st)
169 if (time_state() < 1.f)
173 static void play_loop_timer(int id, float dt)
175 float k = (((SDL_GetModState() & KMOD_LSHIFT) ||
176 (SDL_GetModState() & KMOD_RSHIFT)) ?
177 (float) config_get_d(CONFIG_ROTATE_FAST) / 100.f:
178 (float) config_get_d(CONFIG_ROTATE_SLOW) / 100.f);
182 float g[3] = { 0.0f, -9.8f, 0.0f };
186 at = (7 * at + dt) / 8;
190 game_set_rot(view_rotate * k);
192 state = game_step(g, at, 1);
195 level_stop(state, curr_clock(), curr_coins());
198 case GAME_TIME: goto_state(&st_time_out); break;
199 case GAME_FALL: goto_state(&st_fall_out); break;
200 case GAME_GOAL: goto_state(&st_goal); break;
209 static void play_loop_point(int id, int x, int y, int dx, int dy)
211 game_set_pos(dx, dy);
214 static void play_loop_stick(int id, int a, int k)
216 if (config_tst_d(CONFIG_JOYSTICK_AXIS_X, a))
218 if (config_tst_d(CONFIG_JOYSTICK_AXIS_Y, a))
222 static int play_loop_click(int b, int d)
224 view_rotate = d ? b : 0;
228 static int play_loop_keybd(int c, int d)
232 if (config_tst_d(CONFIG_KEY_CAMERA_R, c))
234 if (config_tst_d(CONFIG_KEY_CAMERA_L, c))
237 if (config_tst_d(CONFIG_KEY_CAMERA_1, c))
239 config_set_d(CONFIG_CAMERA, 0);
242 if (config_tst_d(CONFIG_KEY_CAMERA_2, c))
244 config_set_d(CONFIG_CAMERA, 1);
247 if (config_tst_d(CONFIG_KEY_CAMERA_3, c))
249 config_set_d(CONFIG_CAMERA, 2);
255 if (config_tst_d(CONFIG_KEY_CAMERA_R, c))
257 if (config_tst_d(CONFIG_KEY_CAMERA_L, c))
261 if (d && c == SDLK_F12)
262 return goto_state(&st_look);
265 if (d && c == SDLK_c && config_get_d(CONFIG_CHEAT))
267 level_stop(GAME_GOAL, curr_clock(), curr_coins());
268 return goto_state(&st_goal);
273 static int play_loop_buttn(int b, int d)
277 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_EXIT, b))
279 level_stop(GAME_NONE, curr_clock(), curr_coins());
283 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_R, b))
285 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_L, b))
288 if (config_tst_d(CONFIG_JOYSTICK_CAMERA_1, b))
290 config_set_d(CONFIG_CAMERA, 0);
293 if (config_tst_d(CONFIG_JOYSTICK_CAMERA_2, b))
295 config_set_d(CONFIG_CAMERA, 1);
298 if (config_tst_d(CONFIG_JOYSTICK_CAMERA_3, b))
300 config_set_d(CONFIG_CAMERA, 2);
306 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_R, b))
308 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_L, b))
314 /*---------------------------------------------------------------------------*/
319 static int look_enter(void)
326 static void look_leave(int id)
330 static void look_paint(int id, float st)
335 static void look_point(int id, int x, int y, int dx, int dy)
337 phi += 90.0f * dy / config_get_d(CONFIG_HEIGHT);
338 theta += 180.0f * dx / config_get_d(CONFIG_WIDTH);
340 if (phi > +90.0f) phi = +90.0f;
341 if (phi < -90.0f) phi = -90.0f;
343 if (theta > +180.0f) theta -= 360.0f;
344 if (theta < -180.0f) theta += 360.0f;
346 game_look(phi, theta);
349 static int look_keybd(int c, int d)
351 if (d && c == SDLK_F12)
352 return goto_state(&st_play_loop);
357 static int look_buttn(int b, int d)
359 if (d && config_tst_d(CONFIG_JOYSTICK_BUTTON_EXIT, b))
360 return goto_state(&st_play_loop);
365 /*---------------------------------------------------------------------------*/
367 struct state st_play_ready = {
380 struct state st_play_set = {
393 struct state st_play_loop = {
406 struct state st_look = {