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.
25 #include "st_shared.h"
27 #include "st_play_end.h"
35 /*---------------------------------------------------------------------------*/
37 #define PLAY_END_NEXT 2
38 #define PLAY_END_SAME 3
39 #define PLAY_END_SAVE 4
40 #define PLAY_END_BACK 5
41 #define PLAY_END_DONE 6
42 #define PLAY_END_NAME 7
43 #define PLAY_END_OVER 8
50 extern struct state st_play_end_bis;
52 static int play_end_action(int i)
54 audio_play(AUD_MENU, 1.0f);
60 return goto_end_level();
63 return goto_save(&st_play_end_bis, &st_play_end_bis);
66 return goto_name(&st_play_end_bis, &st_play_end_bis);
69 return goto_state(&st_done);
73 return goto_state(&st_level);
76 return goto_state(&st_level);
82 static void play_end_over(int id)
87 switch (gui_token(id))
93 gui_set_label(status_id, _("Save a replay file"));
96 case PLAY_END_SAVE | GUI_NULL_MASK:
97 gui_set_label(status_id, _("Replay file already saved"));
101 gui_set_label(status_id, _("Change the player's name"));
105 gui_set_label(status_id, _("You complete the set"));
109 gui_set_label(status_id, _("Play the next level"));
112 case PLAY_END_NEXT | GUI_NULL_MASK:
113 if (curr_lg()->mode == MODE_PRACTICE)
114 gui_set_label(status_id,
115 _("Cannot unlock in practice mode"));
117 gui_set_label(status_id,
118 _("Finish this level to unlock the next one"));
122 gui_set_label(status_id, _("Replay this level"));
125 case PLAY_END_SAME | GUI_NULL_MASK:
126 gui_set_label(status_id, _("You cannot replay in challenge mode"));
130 gui_set_label(status_id, "");
135 static int play_end_init(int *gidp)
137 const struct level_game *lg = curr_lg();
139 int state = lg->state;
140 const struct level *l = lg->level;
145 high = (lg->time_rank < 3) || (lg->goal_rank < 3) || (lg->coin_rank < 3);
147 if ((id = gui_vstack(0)))
151 if (state == GAME_SPEC)
152 gid = gui_label(id, _("SPECIAL GOAL"), GUI_MED, GUI_ALL,
154 else if (state == GAME_FALL)
155 gid = gui_label(id, _("Fall-out!"), GUI_MED, GUI_ALL,
157 else if (state == GAME_TIME)
158 gid = gui_label(id, _("Time's Up!"), GUI_MED, GUI_ALL,
161 gid = gui_label(id, _("New Record"), GUI_MED, GUI_ALL,
164 gid = gui_label(id, _("GOAL"), GUI_LRG, GUI_ALL,
169 if (mode == MODE_CHALLENGE &&
170 (lg->state == GAME_GOAL || lg->state == GAME_SPEC || l->is_bonus))
172 int coins = lg->coins;
173 int score = lg->score - coins;
174 int balls = lg->balls - count_extra_balls(score, coins);
175 if ((jd = gui_hstack(id)))
177 if ((kd = gui_harray(jd)))
179 balls_id = gui_count(kd, 100, GUI_MED, GUI_RGT);
180 gui_label(kd, _("Balls"), GUI_SML, GUI_LFT, gui_wht, gui_wht);
182 if ((kd = gui_harray(jd)))
184 score_id = gui_count(kd, 1000, GUI_MED, GUI_RGT);
185 gui_label(kd, _("Score"), GUI_SML, GUI_LFT, gui_wht, gui_wht);
187 if ((kd = gui_harray(jd)))
189 coins_id = gui_count(kd, 100, GUI_MED, GUI_RGT);
190 gui_label(kd, _("Coins"), GUI_SML, GUI_LFT, gui_wht, gui_wht);
193 gui_set_count(balls_id, balls);
194 gui_set_count(score_id, score);
195 gui_set_count(coins_id, coins);
200 balls_id = score_id = coins_id = 0;
203 if (state == GAME_GOAL)
206 if ((jd = gui_harray(id)))
208 gui_most_coins(jd, 1);
209 gui_best_times(jd, 1);
215 if ((jd = gui_harray(id)))
217 int nlid = 0, rlid = 0;
221 gui_start(jd, _("Finish"), GUI_SML, PLAY_END_DONE, 0);
223 nlid = gui_maybe(jd, _("Next Level"), PLAY_END_NEXT,
224 lg->next_level != NULL);
227 gui_start(jd, _("Game Over"), GUI_SML, PLAY_END_OVER, 0);
230 b = mode != MODE_CHALLENGE || ((state == GAME_FALL || state == GAME_TIME) && !lg->dead && !l->is_bonus);
231 rlid = gui_maybe(jd, _("Retry Level"), PLAY_END_SAME, b);
234 gui_maybe(jd, _("Save Replay"), PLAY_END_SAVE, demo_play_saved());
236 /* default is next if the next level is newly unkocked */
237 if (nlid != 0 && lg->unlock)
244 gui_state(id, _("Change Player Name"), GUI_SML, PLAY_END_NAME, 0);
247 status_id = gui_label(id, "Neverball", GUI_SML, GUI_ALL, 0, 0);
249 gui_layout(id, 0, 0);
250 if (gidp) *gidp = gid;
253 if (state == GAME_GOAL)
255 set_most_coins(&l->score.most_coins, lg->coin_rank);
256 if (mode == MODE_CHALLENGE || mode == MODE_NORMAL)
257 set_best_times(&l->score.unlock_goal, lg->goal_rank, 1);
259 set_best_times(&l->score.best_times, lg->time_rank, 0);
267 static int play_end_enter(void)
272 r = play_end_init(&gid);
274 gui_pulse(gid, 1.2f);
275 audio_music_fade_out(2.0f);
279 static int play_end_bis_enter(void)
281 level_update_player_name();
282 return play_end_init(NULL);
285 static void play_end_timer(int id, float dt)
287 static float DT = 0.0f;
289 float gg[3] = { 0.0f, 9.8f, 0.0f };
290 float gf[3] = { 0.0f, -9.8f, 0.0f };
291 int state = curr_lg()->state;
295 if (time_state() < 2.f)
296 game_step((state == GAME_GOAL || state == GAME_SPEC) ? gg : gf, dt, NULL);
298 if (time_state() > 1.f && DT > 0.05f && coins_id != 0)
300 int coins = gui_value(coins_id);
303 int score = gui_value(score_id);
304 int balls = gui_value(balls_id);
306 gui_set_count(coins_id, coins - 1);
307 gui_pulse(coins_id, 1.1f);
309 gui_set_count(score_id, score + 1);
310 gui_pulse(score_id, 1.1f);
312 if ((score + 1) % 100 == 0)
314 gui_set_count(balls_id, balls + 1);
315 gui_pulse(balls_id, 2.0f);
316 audio_play(AUD_BALL, 1.0f);
327 void play_end_stick(int id, int a, int v)
329 play_end_over(shared_stick_basic(id, a, v));
332 void play_end_point(int id, int x, int y, int dx, int dy)
334 play_end_over(shared_point_basic(id, x, y));
337 static int play_end_buttn(int b, int d)
341 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_A, b))
342 return play_end_action(gui_token(gui_click()));
343 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_EXIT, b))
344 return play_end_action(PLAY_END_BACK);
349 /*---------------------------------------------------------------------------*/
351 struct state st_play_end = {
364 struct state st_play_end_bis = {