Language selection in-game is no more. It might return some day, but
[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 #ifdef WIN32
18 #pragma comment(lib, "SDL_ttf.lib")
19 #pragma comment(lib, "SDL_mixer.lib")
20 #pragma comment(lib, "SDL_image.lib")
21 #pragma comment(lib, "SDL.lib")
22 #pragma comment(lib, "SDLmain.lib")
23 #pragma comment(lib, "opengl32.lib")
24 #endif
25
26 /*---------------------------------------------------------------------------*/
27
28 #include <SDL.h>
29 #include <SDL_ttf.h>
30 #include <SDL_mixer.h>
31 #include <SDL_image.h>
32 #include <time.h>
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include <string.h>
36 #include <locale.h>
37
38 #include "glext.h"
39 #include "audio.h"
40 #include "image.h"
41 #include "state.h"
42 #include "config.h"
43 #include "course.h"
44 #include "hole.h"
45 #include "game.h"
46 #include "gui.h"
47
48 #include "st_conf.h"
49 #include "st_all.h"
50
51 #define TITLE "Neverputt"
52
53 /*---------------------------------------------------------------------------*/
54
55 static int shot(void)
56 {
57     static char filename[MAXSTR];
58     static int  num = 0;
59
60     sprintf(filename, "screen%02d.png", num++);
61
62     image_snap(filename);
63
64     return 1;
65 }
66
67 /*---------------------------------------------------------------------------*/
68
69 static void toggle_wire(void)
70 {
71     static int wire = 0;
72
73     if (wire)
74     {
75         glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
76         glEnable(GL_TEXTURE_2D);
77         glEnable(GL_LIGHTING);
78         wire = 0;
79     }
80     else
81     {
82         glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
83         glDisable(GL_TEXTURE_2D);
84         glDisable(GL_LIGHTING);
85         wire = 1;
86     }
87 }
88 /*---------------------------------------------------------------------------*/
89
90 static int loop(void)
91 {
92     SDL_Event e;
93     int d = 1;
94
95     while (d && SDL_PollEvent(&e))
96     {
97         if (e.type == SDL_QUIT)
98             return 0;
99
100         switch (e.type)
101         {
102         case SDL_MOUSEMOTION:
103             st_point(+e.motion.x,
104                      -e.motion.y + config_get_d(CONFIG_HEIGHT),
105                      +e.motion.xrel,
106                      -e.motion.yrel);
107             break;
108
109         case SDL_MOUSEBUTTONDOWN:
110             d = st_click((e.button.button == SDL_BUTTON_LEFT) ? -1 : 1, 1);
111             break;
112
113         case SDL_MOUSEBUTTONUP:
114             d = st_click((e.button.button == SDL_BUTTON_LEFT) ? -1 : 1, 0);
115             break;
116
117         case SDL_KEYDOWN:
118             switch (e.key.keysym.sym)
119             {
120             case SDLK_F10: d = shot();                break;
121             case SDLK_F9:  config_tgl_d(CONFIG_FPS);  break;
122             case SDLK_F8:  config_tgl_d(CONFIG_NICE); break;
123             case SDLK_F7:  toggle_wire();             break;
124
125             default:
126                 d = st_keybd(e.key.keysym.sym, 1);
127             }
128             break;
129
130         case SDL_ACTIVEEVENT:
131             if (e.active.state == SDL_APPINPUTFOCUS)
132             {
133                 if (e.active.gain == 0)
134                     goto_pause(&st_over, 0);
135             }
136             break;
137         }
138     }
139     return d;
140 }
141
142 int main(int argc, char *argv[])
143 {
144     int camera = 0;
145     SDL_Surface *icon;
146
147     srand((int) time(NULL));
148
149     language_init("neverball", CONFIG_LOCALE);
150
151     if (config_data_path((argc > 1 ? argv[1] : NULL), COURSE_FILE))
152     {
153         if (config_user_path(NULL))
154         {
155             if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) == 0)
156             {
157                 config_init();
158                 config_load();
159
160                 /* Cache Neverball's camera setting. */
161
162                 camera = config_get_d(CONFIG_CAMERA);
163
164                 /* Initialize the audio. */
165
166                 audio_bind(AUD_BIRDIE,  1, "snd/birdie.ogg");
167                 audio_bind(AUD_BOGEY,   1, "snd/bogey.ogg");
168                 audio_bind(AUD_BUMP,    1, "snd/bink.wav");
169                 audio_bind(AUD_DOUBLE,  1, "snd/double.ogg");
170                 audio_bind(AUD_EAGLE,   1, "snd/eagle.ogg");
171                 audio_bind(AUD_JUMP,    2, "snd/jump.ogg");
172                 audio_bind(AUD_MENU,    2, "snd/menu.wav");
173                 audio_bind(AUD_ONE,     1, "snd/one.ogg");
174                 audio_bind(AUD_PAR,     1, "snd/par.ogg");
175                 audio_bind(AUD_PENALTY, 1, "snd/penalty.ogg");
176                 audio_bind(AUD_PLAYER1, 1, "snd/player1.ogg");
177                 audio_bind(AUD_PLAYER2, 1, "snd/player2.ogg");
178                 audio_bind(AUD_PLAYER3, 1, "snd/player3.ogg");
179                 audio_bind(AUD_PLAYER4, 1, "snd/player4.ogg");
180                 audio_bind(AUD_SWITCH,  2, "snd/switch.wav");
181                 audio_bind(AUD_SUCCESS, 1, "snd/success.ogg");
182
183                 audio_init();
184
185                 /* Require 16-bit double buffer with 16-bit depth buffer. */
186
187                 SDL_GL_SetAttribute(SDL_GL_RED_SIZE,     5);
188                 SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE,   5);
189                 SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE,    5);
190                 SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,  16);
191                 SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
192
193                 icon = IMG_Load(config_data("icon/neverputt.png"));
194
195                 if (icon)
196                 {
197                     SDL_WM_SetIcon(icon, NULL);
198                     SDL_FreeSurface(icon);
199                 }
200
201                 /* Initialize the video. */
202
203                 if (config_mode(config_get_d(CONFIG_FULLSCREEN),
204                                 config_get_d(CONFIG_WIDTH),
205                                 config_get_d(CONFIG_HEIGHT)))
206                 {
207                     int t1, t0 = SDL_GetTicks();
208
209                     SDL_WM_SetCaption(TITLE, TITLE);
210
211                     /* Run the main game loop. */
212
213                     init_state(&st_null);
214                     goto_state(&st_title);
215
216                     while (loop())
217                         if ((t1 = SDL_GetTicks()) > t0)
218                         {
219                             st_timer((t1 - t0) / 1000.f);
220                             st_paint();
221                             SDL_GL_SwapBuffers();
222
223                             t0 = t1;
224
225                             if (config_get_d(CONFIG_NICE))
226                                 SDL_Delay(1);
227                         }
228                 }
229                 else fprintf(stderr, "%s: %s\n", argv[0], SDL_GetError());
230
231                 /* Restore Neverball's camera setting. */
232
233                 config_set_d(CONFIG_CAMERA, camera);
234                 config_save();
235
236                 SDL_Quit();
237             }
238             else fprintf(stderr, "%s: %s\n", argv[0], SDL_GetError());
239         }
240         else fprintf(stderr, _("Failure to establish config directory\n"));
241     }
242     else fprintf(stderr, _("Failure to establish game data directory\n"));
243
244     return 0;
245 }
246
247 /*---------------------------------------------------------------------------*/
248