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.
26 #include "st_shared.h"
32 extern struct state st_demo_play;
33 extern struct state st_demo_end;
34 extern struct state st_demo_del;
36 /*---------------------------------------------------------------------------*/
44 static float replay_time;
45 static float global_time;
47 /*---------------------------------------------------------------------------*/
49 static int demo_action(int i)
51 audio_play(AUD_MENU, 1.0f);
56 return goto_state(&st_title);
60 return goto_state(&st_demo);
65 return goto_state(&st_demo);
69 if (level_replay(get_demo(i)->filename))
70 return goto_demo_play(0);
75 static void demo_replay(int id, int i)
77 int w = config_get_d(CONFIG_WIDTH);
78 int h = config_get_d(CONFIG_HEIGHT);
82 if ((jd = gui_vstack(id)))
86 gui_image(jd, get_demo(i)->shot, w / 6, h / 6);
88 strncpy(nam, get_demo(i)->name, MAXNAM);
89 if (nam[MAXNAM-1] != '\0')
96 gui_state(jd, nam, GUI_SML, i, 0);
109 static int player_id;
111 static int gui_demo_status(int id, const struct demo * d)
112 /* Create a layout for some demo info, if d is NULL, try to reserve enought space */
115 const char *mode, *state;
121 /* Build a long name */
122 memset(noname, 'M', MAXNAM-1);
123 noname[MAXNAM-1] = '\0';
125 /* Get a long mode */
126 mode = mode_to_str(0);
128 for(i=1; i<=MODE_SINGLE; i++)
130 k = strlen(mode_to_str(i));
134 mode = mode_to_str(i);
138 /* Get a long state */
139 state = state_to_str(0);
141 for(i=1; i<=GAME_FALL; i++)
143 k = strlen(state_to_str(i));
147 state = state_to_str(i);
153 mode = mode_to_str(d->mode);
154 state = state_to_str(d->state);
157 if ((jd = gui_hstack(id)))
159 if((kd = gui_vstack(jd)))
161 if ((ld = gui_harray(kd)))
163 if ((md = gui_vstack(ld)))
165 player_id = gui_label(md, (d?d->player:noname), GUI_SML, GUI_RGT, 0, 0);
166 coin_id = gui_count(md, (d?d->coins:100), GUI_SML, GUI_RGT);
167 state_id = gui_label(md, state, GUI_SML, GUI_RGT, gui_red, gui_red);
169 if ((md = gui_vstack(ld)))
171 gui_label(md, _("Player"), GUI_SML, GUI_LFT, gui_wht, gui_wht);
172 gui_label(md, _("Coins"), GUI_SML, GUI_LFT, gui_wht, gui_wht);
173 gui_label(md, _("State"), GUI_SML, GUI_LFT, gui_wht, gui_wht);
175 if ((md = gui_vstack(ld)))
177 name_id = gui_label(md, (d?d->name:noname), GUI_SML, GUI_RGT, 0, 0);
178 time_id = gui_clock(md, (d?d->timer:35000), GUI_SML, GUI_RGT);
179 mode_id = gui_label(md, mode, GUI_SML, GUI_RGT, 0, 0);
182 level_id = gui_label(kd, (d?d->file:"M"), GUI_SML, GUI_RGT, gui_wht, gui_wht);
183 date_id = gui_label(kd, (d?date_to_str(d->date):"M"), GUI_SML, GUI_RGT, 0, 0);
185 if((kd = gui_vstack(jd)))
187 gui_label(kd, _("Replay"), GUI_SML, GUI_LFT, gui_wht, gui_wht);
188 gui_label(kd, _("Time"), GUI_SML, GUI_LFT, gui_wht, gui_wht);
189 gui_label(kd, _("Mode"), GUI_SML, GUI_LFT, gui_wht, gui_wht);
190 gui_label(kd, _("Level"), GUI_SML, GUI_LFT, gui_wht, gui_wht);
191 gui_label(kd, _("Date"), GUI_SML, GUI_LFT, gui_wht, gui_wht);
193 if(d && d->state == GAME_GOAL)
194 gui_set_color(state_id, gui_grn, gui_grn);
199 static void gui_demo_update_status(int i)
201 const struct demo * d = get_demo(i);
203 gui_set_label(name_id, d->name);
204 gui_set_label(date_id, date_to_str(d->date));
205 gui_set_label(level_id, d->file);
206 gui_set_label(player_id, d->player);
207 gui_set_label(mode_id, mode_to_str(d->mode));
208 if (d->state == GAME_GOAL)
209 gui_set_color(state_id, gui_grn, gui_grn);
211 gui_set_color(state_id, gui_red, gui_red);
212 gui_set_label(state_id, state_to_str(d->state));
213 gui_set_count(coin_id, d->coins);
214 gui_set_clock(time_id, d->timer);
217 static int demo_enter(void)
227 gui_label(id, _("No Replays"), GUI_MED, GUI_ALL, 0,0);
229 gui_multi(id, _("You can save replays of your games.\\"
230 "Currently, there are no replays saved."),
231 GUI_SML, GUI_ALL, gui_wht, gui_wht);
233 gui_start(id, _("Back"), GUI_SML, GUI_BACK, 0);
234 gui_layout(id, 0, 0);
238 if ((jd = gui_hstack(id)))
241 ld = gui_label(jd, _("Select Replay"), GUI_SML, GUI_ALL, 0,0);
243 gui_back_prev_next(jd, first > 0, first + DEMO_STEP < total);
245 if ((jd = gui_varray(id)))
246 for (i = first; i < first + DEMO_STEP ; i += DEMO_LINE)
247 if ((kd = gui_harray(jd)))
249 for (j = i + DEMO_LINE - 1; j >= i; j--)
256 gui_demo_status(id, NULL);
257 gui_layout(id, 0, 0);
258 gui_demo_update_status(0);
261 audio_music_fade_to(0.5f, "bgm/inter.ogg");
266 static void demo_point(int id, int x, int y, int dx, int dy)
268 int jd = shared_point_basic(id, x, y);
269 int i = gui_token(jd);
271 gui_demo_update_status(i);
274 static void demo_stick(int id, int a, int v)
276 int jd = shared_stick_basic(id, a, v);
277 int i = gui_token(jd);
279 gui_demo_update_status(i);
282 static int demo_buttn(int b, int d)
286 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_A, b))
287 return demo_action(gui_token(gui_click()));
288 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_EXIT, b))
289 return demo_action(GUI_BACK);
294 /*---------------------------------------------------------------------------*/
296 static int simple_play;
297 int goto_demo_play(int simple)
299 simple_play = simple;
300 return goto_state(&st_demo_play);
303 static int demo_play_enter(void)
307 if ((id = gui_vstack(0)))
309 gui_label(id, _("Replay"), GUI_LRG, GUI_ALL, gui_blu, gui_grn);
310 gui_layout(id, 0, 0);
324 static void demo_play_paint(int id, float st)
329 if (time_state() < 1.f)
333 static void demo_play_timer(int id, float dt)
344 /* Spin or skip depending on how fast the demo wants to run. */
346 while (replay_time < global_time)
347 if (demo_replay_step(&t))
353 goto_state(&st_demo_end);
358 static int demo_play_buttn(int b, int d)
362 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_EXIT, b))
363 return goto_state(&st_demo_end);
368 /*---------------------------------------------------------------------------*/
373 #define DEMO_REPLAY 3
375 static int demo_end_action(int i)
377 audio_play(AUD_MENU, 1.0f);
382 return goto_state(&st_demo_del);
385 return goto_state(&st_demo);
391 level_replay(curr_demo_replay()->filename);
392 return goto_state(&st_demo_play);
397 static int demo_end_enter(void)
401 if ((id = gui_vstack(0)))
403 kd = gui_label(id, _("Replay Ends"), GUI_LRG, GUI_ALL, gui_gry, gui_red);
405 if ((jd = gui_harray(id)))
407 gui_start(jd, _("Replay Again"), GUI_SML, DEMO_REPLAY, 0);
409 gui_start(jd, _("OK"), GUI_SML, DEMO_QUIT, 1);
412 gui_start(jd, _("Keep"), GUI_SML, DEMO_KEEP, 1);
413 gui_state(jd, _("Delete"), GUI_SML, DEMO_DEL, 0);
419 if ((jd = gui_hstack(id)))
422 gui_demo_status(jd, curr_demo_replay());
427 gui_layout(id, 0, 0);
429 audio_music_fade_out(2.0f);
434 static void demo_end_timer(int id, float dt)
436 float g[3] = { 0.0f, -9.8f, 0.0f };
438 if (time_state() < 2.f)
439 game_step(g, dt, NULL);
445 static int demo_end_buttn(int b, int d)
449 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_A, b))
450 return demo_end_action(gui_token(gui_click()));
451 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_EXIT, b))
452 return demo_end_action(simple_play ? DEMO_QUIT : DEMO_KEEP);
457 /*---------------------------------------------------------------------------*/
459 static int demo_del_action(int i)
461 audio_play(AUD_MENU, 1.0f);
463 demo_replay_stop(i == DEMO_DEL);
464 return goto_state(&st_demo);
467 static int demo_del_enter(void)
471 if ((id = gui_vstack(0)))
473 kd = gui_label(id, _("Delete Replay?"), GUI_MED, GUI_ALL, gui_red, gui_red);
475 if ((jd = gui_harray(id)))
477 gui_start(jd, _("No"), GUI_SML, DEMO_KEEP, 1);
478 gui_state(jd, _("Yes"), GUI_SML, DEMO_DEL, 0);
482 gui_layout(id, 0, 0);
484 audio_music_fade_out(2.0f);
489 static int demo_del_buttn(int b, int d)
493 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_A, b))
494 return demo_del_action(gui_token(gui_click()));
495 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_EXIT, b))
496 return demo_del_action(DEMO_KEEP);
501 /*---------------------------------------------------------------------------*/
503 struct state st_demo = {
516 struct state st_demo_play = {
529 struct state st_demo_end = {
542 struct state st_demo_del = {