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
49 extern struct state st_play_end_bis;
51 static int play_end_action(int i)
53 audio_play(AUD_MENU, 1.0f);
59 return goto_end_level();
62 return goto_save(&st_play_end_bis, &st_play_end_bis);
65 return goto_name(&st_play_end_bis, &st_play_end_bis);
68 return goto_state(&st_done);
72 return goto_state(&st_level);
75 return goto_state(&st_level);
81 static int play_end_init(int *gidp)
83 const struct level_game *lg = curr_lg();
85 int state = lg->state;
86 const struct level *l = lg->level;
91 high = (lg->time_rank < 3) || (lg->goal_rank < 3) || (lg->coin_rank < 3);
93 if ((id = gui_vstack(0)))
97 if (state == GAME_SPEC)
98 gid = gui_label(id, _("SPECIAL GOAL"), GUI_MED, GUI_ALL,
100 else if (state == GAME_FALL)
101 gid = gui_label(id, _("Fall-out!"), GUI_MED, GUI_ALL,
103 else if (state == GAME_TIME)
104 gid = gui_label(id, _("Time's Up!"), GUI_MED, GUI_ALL,
107 gid = gui_label(id, _("New Record"), GUI_MED, GUI_ALL,
110 gid = gui_label(id, _("GOAL"), GUI_LRG, GUI_ALL,
115 if (mode == MODE_CHALLENGE &&
116 (lg->state == GAME_GOAL || lg->state == GAME_SPEC || l->is_bonus))
118 int coins = lg->coins;
119 int score = lg->score - coins;
120 int balls = lg->balls - count_extra_balls(score, coins);
121 if ((jd = gui_hstack(id)))
123 if ((kd = gui_harray(jd)))
125 balls_id = gui_count(kd, 100, GUI_MED, GUI_RGT);
126 gui_label(kd, _("Balls"), GUI_SML, GUI_LFT, gui_wht, gui_wht);
128 if ((kd = gui_harray(jd)))
130 score_id = gui_count(kd, 1000, GUI_MED, GUI_RGT);
131 gui_label(kd, _("Score"), GUI_SML, GUI_LFT, gui_wht, gui_wht);
133 if ((kd = gui_harray(jd)))
135 coins_id = gui_count(kd, 100, GUI_MED, GUI_RGT);
136 gui_label(kd, _("Coins"), GUI_SML, GUI_LFT, gui_wht, gui_wht);
139 gui_set_count(balls_id, balls);
140 gui_set_count(score_id, score);
141 gui_set_count(coins_id, coins);
146 balls_id = score_id = coins_id = 0;
149 if (state == GAME_GOAL)
152 if ((jd = gui_harray(id)))
154 gui_most_coins(jd, 1);
155 gui_best_times(jd, 1);
161 if ((jd = gui_harray(id)))
163 int nlid = 0, rlid = 0;
167 gui_start(jd, _("Finish"), GUI_SML, PLAY_END_DONE, 0);
169 nlid = gui_maybe(jd, _("Next Level"), PLAY_END_NEXT,
170 lg->next_level != NULL);
173 gui_start(jd, _("Game Over"), GUI_SML, PLAY_END_OVER, 0);
176 b = mode != MODE_CHALLENGE || ((state == GAME_FALL || state == GAME_TIME) && !lg->dead && !l->is_bonus);
177 rlid = gui_maybe(jd, _("Retry Level"), PLAY_END_SAME, b);
180 gui_maybe(jd, _("Save Replay"), PLAY_END_SAVE, demo_play_saved());
182 /* default is next if the next level is newly unkocked */
183 if (nlid != 0 && lg->unlock)
190 gui_state(id, _("Change Player Name"), GUI_SML, PLAY_END_NAME, 0);
192 gui_layout(id, 0, 0);
193 if (gidp) *gidp = gid;
196 if (state == GAME_GOAL)
198 set_most_coins(&l->coin_score, lg->coin_rank);
199 if (mode == MODE_CHALLENGE || mode == MODE_NORMAL)
200 set_best_times(&l->goal_score, lg->goal_rank, 1);
202 set_best_times(&l->time_score, lg->time_rank, 0);
210 static int play_end_enter(void)
215 r = play_end_init(&gid);
217 gui_pulse(gid, 1.2f);
218 audio_music_fade_out(2.0f);
222 static int play_end_bis_enter(void)
224 level_update_player_name();
225 return play_end_init(NULL);
228 static void play_end_timer(int id, float dt)
230 static float DT = 0.0f;
232 float gg[3] = { 0.0f, 9.8f, 0.0f };
233 float gf[3] = { 0.0f, -9.8f, 0.0f };
234 int state = curr_lg()->state;
238 if (time_state() < 2.f)
239 game_step((state == GAME_GOAL || state == GAME_SPEC) ? gg : gf, dt, NULL);
241 if (time_state() > 1.f && DT > 0.05f && coins_id != 0)
243 int coins = gui_value(coins_id);
246 int score = gui_value(score_id);
247 int balls = gui_value(balls_id);
249 gui_set_count(coins_id, coins - 1);
250 gui_pulse(coins_id, 1.1f);
252 gui_set_count(score_id, score + 1);
253 gui_pulse(score_id, 1.1f);
255 if ((score + 1) % 100 == 0)
257 gui_set_count(balls_id, balls + 1);
258 gui_pulse(balls_id, 2.0f);
259 audio_play(AUD_BALL, 1.0f);
270 static int play_end_buttn(int b, int d)
274 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_A, b))
275 return play_end_action(gui_token(gui_click()));
276 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_EXIT, b))
277 return play_end_action(PLAY_END_BACK);
282 /*---------------------------------------------------------------------------*/
284 struct state st_play_end = {
297 struct state st_play_end_bis = {