1ed2b22901063d77018a9104b9d8e4cf65e20106
[neverball] / ball / st_level.c
1 /*   
2  * Copyright (C) 2003 Robert Kooima
3  *
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.
8  *
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.
13  */
14
15 #include "gui.h"
16 #include "game.h"
17 #include "set.h"
18 #include "level.h"
19 #include "audio.h"
20 #include "config.h"
21
22 #include "st_level.h"
23 #include "st_play.h"
24 #include "st_over.h"
25
26 /*---------------------------------------------------------------------------*/
27
28 static int level_enter(void)
29 {
30     int id, jd, kd, ld;
31
32     if ((id = gui_vstack(0)))
33     {
34         if ((jd = gui_hstack(id)))
35         {
36             gui_filler(jd);
37             if ((kd = gui_vstack(jd)))
38             {
39                 if ((ld = gui_hstack(kd)))
40                 {
41                     gui_count(ld, curr_level(), GUI_LRG, GUI_NE);
42                     gui_label(ld, _("Level "),  GUI_LRG, GUI_NW, 0, 0);
43                 }
44                 gui_label(kd, _(set_name(set_curr())),  GUI_SML, GUI_BOT, gui_wht, gui_wht);
45             }
46             gui_filler(jd);
47         }
48         gui_space(id);
49         gui_multi(id, _(curr_intro()), GUI_SML, GUI_ALL, gui_wht, gui_wht);
50
51         gui_layout(id, 0, 0);
52     }
53
54     game_set_fly(1.f);
55
56     return id;
57 }
58
59 static void level_leave(int id)
60 {
61     gui_delete(id);
62 }
63
64 static void level_timer(int id, float dt)
65 {
66     game_step_fade(dt);
67     audio_timer(dt);
68 }
69
70 static void level_paint(int id, float st)
71 {
72     game_draw(0, st);
73     gui_paint(id);
74 }
75
76 static int level_click(int b, int d)
77 {
78     return (b < 0 && d == 1) ? goto_state(&st_play_ready) : 1;
79 }
80
81 static int level_keybd(int c, int d)
82 {
83     if (d && c == SDLK_ESCAPE)
84         goto_state(&st_over);
85     if (d && c == SDLK_F12)
86         goto_state(&st_poser);
87     return 1;
88 }
89
90 static int level_buttn(int b, int d)
91 {
92     if (d)
93     {
94         if (config_tst_d(CONFIG_JOYSTICK_BUTTON_A, b))
95             return goto_state(&st_play_ready);
96         if (config_tst_d(CONFIG_JOYSTICK_BUTTON_EXIT, b))
97             return goto_state(&st_over);
98     }
99     return 1;
100 }
101
102 /*---------------------------------------------------------------------------*/
103
104 static void poser_paint(int id, float st)
105 {
106     game_draw(1, st);
107 }
108
109 static int poser_keybd(int c, int d)
110 {
111     return (d && c == SDLK_ESCAPE) ? goto_state(&st_level) : 1;
112 }
113
114 /*---------------------------------------------------------------------------*/
115
116 struct state st_level = {
117     level_enter,
118     level_leave,
119     level_paint,
120     level_timer,
121     NULL,
122     NULL,
123     level_click,
124     level_keybd,
125     level_buttn,
126     1, 0
127 };
128
129 struct state st_poser = {
130     NULL,
131     NULL,
132     poser_paint,
133     NULL,
134     NULL,
135     NULL,
136     NULL,
137     poser_keybd,
138     NULL,
139     1, 0
140 };