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.
27 /*---------------------------------------------------------------------------*/
29 static void scan_level_attribs(struct level *l, const struct s_file *fp)
36 int need_time_easy = 0;
37 int need_goal_easy = 0;
38 int need_coin_easy = 0;
40 for (i = 0; i < fp->dc; i++)
42 char *k = fp->av + fp->dv[i].ai;
43 char *v = fp->av + fp->dv[i].aj;
45 if (strcmp(k, "message") == 0)
46 SAFECPY(l->message, v);
47 else if (strcmp(k, "song") == 0)
49 else if (strcmp(k, "shot") == 0)
51 else if (strcmp(k, "goal") == 0)
56 else if (strcmp(k, "time") == 0)
61 else if (strcmp(k, "time_hs") == 0)
63 switch (sscanf(v, "%d %d %d",
64 &l->scores[SCORE_TIME].timer[RANK_HARD],
65 &l->scores[SCORE_TIME].timer[RANK_MEDM],
66 &l->scores[SCORE_TIME].timer[RANK_EASY]))
68 case 2: need_time_easy = 1; break;
72 else if (strcmp(k, "goal_hs") == 0)
74 switch (sscanf(v, "%d %d %d",
75 &l->scores[SCORE_GOAL].timer[RANK_HARD],
76 &l->scores[SCORE_GOAL].timer[RANK_MEDM],
77 &l->scores[SCORE_GOAL].timer[RANK_EASY]))
79 case 2: need_goal_easy = 1; break;
83 else if (strcmp(k, "coin_hs") == 0)
85 switch (sscanf(v, "%d %d %d",
86 &l->scores[SCORE_COIN].coins[RANK_HARD],
87 &l->scores[SCORE_COIN].coins[RANK_MEDM],
88 &l->scores[SCORE_COIN].coins[RANK_EASY]))
90 case 2: need_coin_easy = 1; break;
94 else if (strcmp(k, "version") == 0)
95 SAFECPY(l->version, v);
96 else if (strcmp(k, "author") == 0)
97 SAFECPY(l->author, v);
98 else if (strcmp(k, "bonus") == 0)
99 l->is_bonus = atoi(v) ? 1 : 0;
105 l->scores[SCORE_COIN].coins[RANK_EASY] = l->goal;
107 l->scores[SCORE_GOAL].coins[RANK_HARD] = l->goal;
108 l->scores[SCORE_GOAL].coins[RANK_MEDM] = l->goal;
109 l->scores[SCORE_GOAL].coins[RANK_EASY] = l->goal;
115 l->scores[SCORE_TIME].timer[RANK_EASY] = l->time;
117 l->scores[SCORE_GOAL].timer[RANK_EASY] = l->time;
119 l->scores[SCORE_COIN].timer[RANK_HARD] = l->time;
120 l->scores[SCORE_COIN].timer[RANK_MEDM] = l->time;
121 l->scores[SCORE_COIN].timer[RANK_EASY] = l->time;
125 int level_load(const char *filename, struct level *level)
129 memset(level, 0, sizeof (struct level));
130 memset(&sol, 0, sizeof (sol));
132 if (!sol_load_only_head(&sol, filename))
134 fprintf(stderr, L_("Failure to load level file '%s'\n"), filename);
138 SAFECPY(level->file, filename);
139 SAFECPY(level->name, "00");
141 score_init_hs(&level->scores[SCORE_TIME], 59999, 0);
142 score_init_hs(&level->scores[SCORE_GOAL], 59999, 0);
143 score_init_hs(&level->scores[SCORE_COIN], 59999, 0);
145 scan_level_attribs(level, &sol);
152 /*---------------------------------------------------------------------------*/
154 int level_exists(int i)
156 return !!get_level(i);
159 void level_open(struct level *level)
161 level->is_locked = 0;
164 int level_opened(const struct level *level)
166 return !level->is_locked;
169 void level_complete(struct level *level)
171 level->is_completed = 1;
174 int level_completed(const struct level *level)
176 return level->is_completed;
179 int level_time(const struct level *level)
184 int level_goal(const struct level *level)
189 int level_bonus(const struct level *level)
191 return level->is_bonus;
194 const char *level_shot(const struct level *level)
199 const char *level_file(const struct level *level)
204 const char *level_song(const struct level *level)
209 const char *level_name(const struct level *level)
214 const char *level_msg(const struct level *level)
216 if (strlen(level->message) > 0)
217 return _(level->message);
221 const struct score *level_score(struct level *level, int s)
223 return &level->scores[s];
226 /*---------------------------------------------------------------------------*/
228 int level_score_update(struct level *l,
235 const char *player = config_get_s(CONFIG_PLAYER);
237 score_time_insert(&l->scores[SCORE_TIME], time_rank, player, timer, coins);
238 score_time_insert(&l->scores[SCORE_GOAL], goal_rank, player, timer, coins);
239 score_coin_insert(&l->scores[SCORE_COIN], coin_rank, player, timer, coins);
241 if ((time_rank && *time_rank < 3) ||
242 (goal_rank && *goal_rank < 3) ||
243 (coin_rank && *coin_rank < 3))
249 void level_rename_player(struct level *l,
255 SAFECPY(l->scores[SCORE_TIME].player[time_rank], player);
256 SAFECPY(l->scores[SCORE_GOAL].player[goal_rank], player);
257 SAFECPY(l->scores[SCORE_COIN].player[coin_rank], player);
260 /*---------------------------------------------------------------------------*/