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.
24 /*---------------------------------------------------------------------------*/
26 void score_init_hs(struct score *s, int timer, int coins)
30 strcpy(s->player[0], "Hard");
31 strcpy(s->player[1], "Medium");
32 strcpy(s->player[2], "Easy");
33 strcpy(s->player[3], "");
35 for (i = 0; i < NSCORE + 1; i++)
42 /*---------------------------------------------------------------------------*/
44 static int level_scan_metadata(struct level *l, char *av)
46 #define CASE(x) (strcmp((x), c) == 0)
48 char *stop = av + strlen(av);
53 /* look for the start of the value */
60 /* look the end of the value */
69 strcpy(l->message, v);
70 else if (CASE("back"))
72 else if (CASE("song"))
74 else if (CASE("grad"))
76 else if (CASE("shot"))
78 else if (CASE("goal"))
81 l->score.most_coins.coins[2] = l->goal;
83 else if (CASE("time"))
86 l->score.best_times.timer[2] = l->time;
87 l->score.unlock_goal.timer[2] = l->time;
89 else if (CASE("time_hs"))
91 &l->score.best_times.timer[0],
92 &l->score.best_times.timer[1]);
93 else if (CASE("goal_hs"))
95 &l->score.unlock_goal.timer[0],
96 &l->score.unlock_goal.timer[1]);
97 else if (CASE("coin_hs"))
99 &l->score.most_coins.coins[0],
100 &l->score.most_coins.coins[1]);
101 else if (CASE("version"))
102 strcpy(l->version, v);
103 else if (CASE("author"))
104 strcpy(l->author, v);
105 else if (CASE("special"))
106 l->is_bonus = atoi(v);
113 /* Load the sol file 'filename' and fill the 'level' structure. Return 1 on
114 * success, 0 on error. */
116 int level_load(const char *filename, struct level *level)
123 memset(level, 0, sizeof (struct level));
124 memset(&sol, 0, sizeof (sol));
126 /* Try to load the sol file */
127 if (!sol_load_only_head(&sol, config_data(filename)))
130 _("Error while loading level file '%s': %s\n"), filename,
131 errno ? strerror(errno) : _("Not a valid level file"));
135 strcpy(level->file, filename);
137 /* Init hs with default values */
138 score_init_hs(&level->score.best_times, 59999, 0);
139 score_init_hs(&level->score.unlock_goal, 59999, 0);
140 score_init_hs(&level->score.most_coins, 59999, 0);
142 /* Compute money and default max money */
144 for (i = 0; i < sol.hc; i++)
145 if (sol.hv[i].t == ITEM_COIN)
146 money += sol.hv[i].n;
147 level->score.most_coins.coins[0] = money;
149 /* Scan sol metadata */
151 level_scan_metadata(level, sol.av);
153 /* Compute initial hs default values */
157 t[0] = t[1] = t[2]; \
158 else if (t[2] c t[1]) \
159 t[1] = (t[0] + t[2]) / 2
161 HOP(level->score.best_times.timer, <=);
162 HOP(level->score.unlock_goal.timer, <=);
163 HOP(level->score.most_coins.coins, >=);
170 /*---------------------------------------------------------------------------*/
172 void level_dump_info(const struct level *l)
174 printf("filename: %s\n"
179 "time hs: %d %d %d\n"
180 "goal hs: %d %d %d\n"
181 "coin hs: %d %d %d\n"
192 l->score.best_times.timer[0],
193 l->score.best_times.timer[1],
194 l->score.best_times.timer[2],
195 l->score.unlock_goal.timer[0],
196 l->score.unlock_goal.timer[1],
197 l->score.unlock_goal.timer[2],
198 l->score.most_coins.coins[0],
199 l->score.most_coins.coins[1],
200 l->score.most_coins.coins[2],
208 /*---------------------------------------------------------------------------*/
210 const char *mode_to_str(int m)
214 case MODE_CHALLENGE: return _("Challenge");
215 case MODE_NORMAL: return _("Normal");
216 case MODE_PRACTICE: return _("Practice");
217 case MODE_SINGLE: return _("Single");
218 default: return _("Unknown");
222 /*---------------------------------------------------------------------------*/
224 const char *state_to_str(int m)
228 case GAME_NONE: return _("Aborted");
229 case GAME_TIME: return _("Time-out");
231 case GAME_GOAL: return _("Success");
232 case GAME_FALL: return _("Fall-out");
233 default: return _("Unknown");
237 /*---------------------------------------------------------------------------*/