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.
28 /*---------------------------------------------------------------------------*/
30 /* The level currently playing */
31 static struct level_game current_level_game;
33 /*---------------------------------------------------------------------------*/
35 int level_replay(const char *filename)
37 return demo_replay_init(filename, ¤t_level_game);
40 static struct level single_level; /* a level without set */
42 int level_play_go(void)
43 /* Start to play the current level */
45 struct level_game *lg = ¤t_level_game;
46 const struct level *l = lg->level;
51 lg->goal = (mode == MODE_PRACTICE) ? 0 : l->goal;
52 lg->time = (mode == MODE_PRACTICE) ? 0 : l->time;
54 /* clear other fields */
55 lg->state = GAME_NONE;
58 lg->coin_rank = lg->goal_rank = lg->time_rank =
59 lg->score_rank = lg->times_rank = 3;
60 lg->win = lg->dead = lg->unlock = 0;
61 lg->next_level = NULL;
63 return demo_play_init(USER_REPLAY_FILE, l, lg);
66 /* Prepare to play a single level */
68 void level_play_single(const char *filename)
70 struct level *l = &single_level;
72 level_load(filename, l);
73 level_play(l, MODE_SINGLE);
76 /* Prepare to play a level sequence from the `i'th level */
78 void level_play(const struct level *l, int m)
80 struct level_game *lg = ¤t_level_game;
82 memset(lg, 0, sizeof (struct level_game));
89 /*---------------------------------------------------------------------------*/
91 const struct level_game *curr_lg(void)
93 return ¤t_level_game;
96 int count_extra_balls(int old_score, int coins)
98 int modulo = old_score % 100;
99 int sum = modulo + coins;
103 /* Stop the current playing level */
105 void level_stop(int state, int state_value, int clock, int coins)
107 struct level_game *lg = ¤t_level_game;
109 int timer = (mode == MODE_PRACTICE
110 || mode == MODE_SINGLE) ? clock : lg->time - clock;
115 lg->state_value = state_value;
117 /* Performs challenge mode opperations */
118 if (mode == MODE_CHALLENGE)
123 /* sum coins an earn extra balls */
124 if (state == GAME_GOAL || state == GAME_SPEC || lg->level->is_bonus)
126 lg->balls += count_extra_balls(lg->score, coins);
130 /* lose ball and game */
131 else /* if ((state == GAME_TIME || state == GAME_FALL) && !lg->level->is_bonus) */
133 lg->dead = (lg->balls <= 0);
138 /* Update high-scores and next level */
139 set_finish_level(lg, config_simple_get_s(CONFIG_PLAYER));
141 /* stop demo recording */
145 void level_next(void)
147 struct level_game *lg = ¤t_level_game;
148 lg->level = lg->next_level;
151 void level_update_player_name(void)
153 score_change_name(¤t_level_game, config_simple_get_s(CONFIG_PLAYER));
156 /*---------------------------------------------------------------------------*/