-/*
+/*
* Copyright (C) 2003 Robert Kooima
*
* NEVERBALL is free software; you can redistribute it and/or modify
#include "hud.h"
#include "game.h"
#include "demo.h"
-#include "level.h"
+#include "levels.h"
#include "audio.h"
#include "config.h"
+#include "st_shared.h"
#include "st_play.h"
-#include "st_fail.h"
#include "st_goal.h"
+#include "st_fall_out.h"
+#include "st_time_out.h"
#include "st_over.h"
+#include "st_pause.h"
/*---------------------------------------------------------------------------*/
static int view_rotate;
+static int pause_or_exit(void)
+{
+ if (SDL_GetModState() & KMOD_SHIFT)
+ {
+ level_stat(GAME_NONE, curr_clock(), curr_coins());
+ level_stop();
+ config_clr_grab();
+
+ return goto_state(&st_over);
+ }
+ return goto_pause();
+}
+
/*---------------------------------------------------------------------------*/
static int play_ready_enter(void)
}
audio_play(AUD_READY, 1.0f);
- config_set_grab();
+ config_set_grab(1);
return id;
}
-static void play_ready_leave(int id)
-{
- gui_delete(id);
-}
-
-static void play_ready_paint(int id, float st)
-{
- game_draw(0, st);
- gui_paint(id);
-}
-
static void play_ready_timer(int id, float dt)
{
float t = time_state();
game_step_fade(dt);
gui_timer(id, dt);
- audio_timer(dt);
}
static int play_ready_click(int b, int d)
static int play_ready_keybd(int c, int d)
{
- return (d && c == SDLK_ESCAPE) ? goto_state(&st_over) : 1;
+ if (d)
+ if (config_tst_d(CONFIG_KEY_PAUSE, c))
+ goto_pause();
+ return 1;
}
static int play_ready_buttn(int b, int d)
if (config_tst_d(CONFIG_JOYSTICK_BUTTON_A, b))
return goto_state(&st_play_loop);
if (config_tst_d(CONFIG_JOYSTICK_BUTTON_EXIT, b))
- return goto_state(&st_over);
+ return pause_or_exit();
}
return 1;
}
audio_play(AUD_SET, 1.f);
- return id;
-}
+ clear_pause();
-static void play_set_leave(int id)
-{
- gui_delete(id);
-}
-
-static void play_set_paint(int id, float st)
-{
- game_draw(0, st);
- gui_paint(id);
+ return id;
}
static void play_set_timer(int id, float dt)
static int play_set_keybd(int c, int d)
{
- return (d && c == SDLK_ESCAPE) ? goto_state(&st_over) : 1;
+ if (d)
+ if (config_tst_d(CONFIG_KEY_PAUSE, c))
+ goto_pause();
+ return 1;
}
static int play_set_buttn(int b, int d)
if (config_tst_d(CONFIG_JOYSTICK_BUTTON_A, b))
return goto_state(&st_play_loop);
if (config_tst_d(CONFIG_JOYSTICK_BUTTON_EXIT, b))
- return goto_state(&st_over);
+ return pause_or_exit();
}
return 1;
}
/*---------------------------------------------------------------------------*/
+static int nohud = 0;
+
static int play_loop_enter(void)
{
int id;
+ if (is_paused())
+ {
+ clear_pause();
+ view_rotate = 0;
+ return 0;
+ }
+
if ((id = gui_label(0, _("GO!"), GUI_LRG, GUI_ALL, gui_blu, gui_grn)))
{
gui_layout(id, 0, 0);
game_set_fly(0.f);
view_rotate = 0;
- return id;
-}
+ hud_view_pulse(config_get_d(CONFIG_CAMERA));
-static void play_loop_leave(int id)
-{
- gui_delete(id);
+ nohud = 0;
+
+ hud_update(0);
+
+ return id;
}
static void play_loop_paint(int id, float st)
{
game_draw(0, st);
- hud_paint();
+
+ if (!nohud)
+ hud_paint();
if (time_state() < 1.f)
gui_paint(id);
static void play_loop_timer(int id, float dt)
{
- float k = (((SDL_GetModState() & KMOD_LSHIFT) ||
- (SDL_GetModState() & KMOD_RSHIFT)) ?
+ float k = ((SDL_GetModState() & KMOD_SHIFT) ?
(float) config_get_d(CONFIG_ROTATE_FAST) / 100.f:
(float) config_get_d(CONFIG_ROTATE_SLOW) / 100.f);
switch (game_step(g, at, 1))
{
- case GAME_TIME: level_stop(GAME_TIME); goto_state(&st_time_out); break;
- case GAME_FALL: level_stop(GAME_FALL); goto_state(&st_fall_out); break;
- case GAME_GOAL: level_stop(GAME_GOAL); goto_state(&st_goal); break;
+ case GAME_GOAL:
+ level_stat(GAME_GOAL, curr_clock(), curr_coins());
+ gui_stuck();
+ goto_state(&st_goal);
+ break;
+
+ case GAME_FALL:
+ level_stat(GAME_FALL, curr_clock(), curr_coins());
+ gui_stuck();
+ goto_state(&st_fall_out);
+ break;
+
+ case GAME_TIME:
+ level_stat(GAME_TIME, curr_clock(), curr_coins());
+ gui_stuck();
+ goto_state(&st_time_out);
+ break;
+
+ default:
+ break;
}
game_step_fade(dt);
demo_play_step(at);
- audio_timer(dt);
}
static void play_loop_point(int id, int x, int y, int dx, int dy)
config_set_d(CONFIG_CAMERA, 2);
hud_view_pulse(2);
}
+ if (config_tst_d(CONFIG_KEY_RESTART, c) &&
+ curr_lg()->mode != MODE_CHALLENGE)
+ {
+ level_same();
+ goto_state(&st_play_ready);
+ }
+ if (config_tst_d(CONFIG_KEY_PAUSE, c))
+ goto_pause();
}
else
{
view_rotate = 0;
}
- if (d && c == SDLK_ESCAPE)
- {
- level_stop(GAME_NONE);
- goto_state(&st_over);
- }
- if (d && c == SDLK_F12)
- goto_state(&st_look);
-
- /* Cheat */
- if (d && c == SDLK_c)
+ if (d && c == SDLK_F12 && config_cheat())
+ return goto_state(&st_look);
+
+ if (d && c == SDLK_F6)
+ nohud = !nohud;
+
+ if (d && c == SDLK_c && config_cheat())
{
- level_stop(GAME_GOAL);
- goto_state(&st_goal);
+ level_stat(GAME_GOAL, curr_clock(), curr_coins());
+ return goto_state(&st_goal);
}
return 1;
}
if (d == 1)
{
if (config_tst_d(CONFIG_JOYSTICK_BUTTON_EXIT, b))
- return goto_state(&st_over);
+ pause_or_exit();
if (config_tst_d(CONFIG_JOYSTICK_BUTTON_R, b))
view_rotate = +1;
static int look_keybd(int c, int d)
{
- if (d && c == SDLK_ESCAPE) goto_state(&st_play_loop);
- if (d && c == SDLK_F12) goto_state(&st_play_loop);
+ if (d && c == SDLK_F12)
+ return goto_state(&st_play_loop);
+
+ return 1;
+}
+
+static int look_buttn(int b, int d)
+{
+ if (d && config_tst_d(CONFIG_JOYSTICK_BUTTON_EXIT, b))
+ return goto_state(&st_play_loop);
return 1;
}
struct state st_play_ready = {
play_ready_enter,
- play_ready_leave,
- play_ready_paint,
+ shared_leave,
+ shared_paint,
play_ready_timer,
NULL,
NULL,
struct state st_play_set = {
play_set_enter,
- play_set_leave,
- play_set_paint,
+ shared_leave,
+ shared_paint,
play_set_timer,
NULL,
NULL,
struct state st_play_loop = {
play_loop_enter,
- play_loop_leave,
+ shared_leave,
play_loop_paint,
play_loop_timer,
play_loop_point,
NULL,
NULL,
look_keybd,
- NULL,
+ look_buttn,
0, 0
};