Tweak GLES compile-time switch semantics
[neverball] / putt / main.c
1 /*
2  * Copyright (C) 2003 Robert Kooima
3  *
4  * NEVERPUTT 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 /*---------------------------------------------------------------------------*/
16
17 #include <SDL.h>
18 #include <time.h>
19 #include <stdio.h>
20 #include <stdlib.h>
21 #include <string.h>
22 #include <locale.h>
23
24 #include "glext.h"
25 #include "audio.h"
26 #include "image.h"
27 #include "state.h"
28 #include "config.h"
29 #include "video.h"
30 #include "course.h"
31 #include "hole.h"
32 #include "game.h"
33 #include "gui.h"
34 #include "fs.h"
35
36 #include "st_conf.h"
37 #include "st_all.h"
38
39 const char TITLE[] = "Neverputt " VERSION;
40 const char ICON[] = "icon/neverputt.png";
41
42 /*---------------------------------------------------------------------------*/
43
44 static int shot_pending;
45
46 static void shot_prep(void)
47 {
48     shot_pending = 1;
49 }
50
51 static void shot_take(void)
52 {
53     static char filename[MAXSTR];
54
55     if (shot_pending)
56     {
57         sprintf(filename, "Screenshots/screen%05d.png", config_screenshot());
58         image_snap(filename);
59         shot_pending = 0;
60     }
61 }
62
63 /*---------------------------------------------------------------------------*/
64
65 static void toggle_wire(void)
66 {
67 #if !ENABLE_OPENGLES
68     static int wire = 0;
69
70     if (wire)
71     {
72         glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
73         glEnable(GL_TEXTURE_2D);
74         glEnable(GL_LIGHTING);
75         wire = 0;
76     }
77     else
78     {
79         glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
80         glDisable(GL_TEXTURE_2D);
81         glDisable(GL_LIGHTING);
82         wire = 1;
83     }
84 #endif
85 }
86 /*---------------------------------------------------------------------------*/
87
88 static int loop(void)
89 {
90     SDL_Event e;
91     int d = 1;
92     int c;
93
94     while (d && SDL_PollEvent(&e))
95     {
96         if (e.type == SDL_QUIT)
97             return 0;
98
99         switch (e.type)
100         {
101         case SDL_MOUSEMOTION:
102             st_point(+e.motion.x,
103                      -e.motion.y + config_get_d(CONFIG_HEIGHT),
104                      +e.motion.xrel,
105                      -e.motion.yrel);
106             break;
107
108         case SDL_MOUSEBUTTONDOWN:
109             d = st_click(e.button.button, 1);
110             break;
111
112         case SDL_MOUSEBUTTONUP:
113             d = st_click(e.button.button, 0);
114             break;
115
116         case SDL_KEYDOWN:
117
118             c = e.key.keysym.sym;
119
120             if (config_tst_d(CONFIG_KEY_FORWARD, c))
121                 st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y), -1.0f);
122
123             else if (config_tst_d(CONFIG_KEY_BACKWARD, c))
124                 st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y), +1.0f);
125
126             else if (config_tst_d(CONFIG_KEY_LEFT, c))
127                 st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X), -1.0f);
128
129             else if (config_tst_d(CONFIG_KEY_RIGHT, c))
130                 st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X), +1.0f);
131
132             else switch (c)
133             {
134             case SDLK_F10: shot_prep();               break;
135             case SDLK_F9:  config_tgl_d(CONFIG_FPS);  break;
136             case SDLK_F8:  config_tgl_d(CONFIG_NICE); break;
137             case SDLK_F7:  toggle_wire();             break;
138
139             case SDLK_RETURN:
140                 d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_A), 1);
141                 break;
142             case SDLK_ESCAPE:
143                 d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_EXIT), 1);
144                 break;
145
146             default:
147                 d = st_keybd(e.key.keysym.sym, 1);
148             }
149             break;
150
151         case SDL_KEYUP:
152
153             c = e.key.keysym.sym;
154
155             if (config_tst_d(CONFIG_KEY_FORWARD, c))
156                 st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y), 0.0f);
157
158             else if (config_tst_d(CONFIG_KEY_BACKWARD, c))
159                 st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y), 0.0f);
160
161             else if (config_tst_d(CONFIG_KEY_LEFT, c))
162                 st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X), 0.0f);
163
164             else if (config_tst_d(CONFIG_KEY_RIGHT, c))
165                 st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X), 0.0f);
166
167             else switch (c)
168             {
169             case SDLK_RETURN:
170                 d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_A), 0);
171                 break;
172             case SDLK_ESCAPE:
173                 d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_EXIT), 0);
174                 break;
175
176             default:
177                 d = st_keybd(e.key.keysym.sym, 0);
178             }
179             break;
180
181         case SDL_ACTIVEEVENT:
182             if (e.active.state == SDL_APPINPUTFOCUS)
183                 if (e.active.gain == 0 && video_get_grab())
184                     goto_pause(&st_over, 0);
185             break;
186
187         case SDL_JOYAXISMOTION:
188             st_stick(e.jaxis.axis, JOY_VALUE(e.jaxis.value));
189             break;
190
191         case SDL_JOYBUTTONDOWN:
192             d = st_buttn(e.jbutton.button, 1);
193             break;
194
195         case SDL_JOYBUTTONUP:
196             d = st_buttn(e.jbutton.button, 0);
197             break;
198         }
199     }
200     return d;
201 }
202
203 int main(int argc, char *argv[])
204 {
205     int camera = 0;
206     SDL_Joystick *joy = NULL;
207
208     if (!fs_init(argv[0]))
209     {
210         fprintf(stderr, "Failure to initialize virtual file system: %s\n",
211                 fs_error());
212         return 1;
213     }
214
215     srand((int) time(NULL));
216
217     lang_init("neverball");
218     config_paths(argc > 1 ? argv[1] : NULL);
219     fs_mkdir("Screenshots");
220
221     if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK) == 0)
222     {
223         config_init();
224         config_load();
225
226         /* Cache Neverball's camera setting. */
227
228         camera = config_get_d(CONFIG_CAMERA);
229
230         /* Initialize the joystick. */
231
232         if (config_get_d(CONFIG_JOYSTICK) && SDL_NumJoysticks() > 0)
233         {
234             joy = SDL_JoystickOpen(config_get_d(CONFIG_JOYSTICK_DEVICE));
235             if (joy)
236             {
237                 SDL_JoystickEventState(SDL_ENABLE);
238                 set_joystick(joy);
239             }
240         }
241
242         /* Initialize the audio. */
243
244         audio_init();
245
246         /* Initialize the video. */
247
248         if (video_init(TITLE, ICON))
249         {
250             int t1, t0 = SDL_GetTicks();
251
252             /* Run the main game loop. */
253
254             init_state(&st_null);
255             goto_state(&st_title);
256
257             while (loop())
258                 if ((t1 = SDL_GetTicks()) > t0)
259                 {
260                     st_timer((t1 - t0) / 1000.f);
261                     st_paint(0.001f * t1);
262                     shot_take();
263                     SDL_GL_SwapBuffers();
264
265                     t0 = t1;
266
267                     if (config_get_d(CONFIG_NICE))
268                         SDL_Delay(1);
269                 }
270         }
271
272         /* Restore Neverball's camera setting. */
273
274         config_set_d(CONFIG_CAMERA, camera);
275         config_save();
276
277         SDL_Quit();
278     }
279     else fprintf(stderr, "%s: %s\n", argv[0], SDL_GetError());
280
281     return 0;
282 }
283
284 /*---------------------------------------------------------------------------*/
285