Deny playing bonus levels in any mode, including challenge mode. Todo: inform the...
[neverball] / ball / level.c
index 18d0b76..983cde2 100644 (file)
@@ -20,6 +20,7 @@
 
 #include "config.h"
 #include "demo.h"
+#include "text.h"
 #include "level.h"
 #include "mode.h"
 #include "set.h"
@@ -88,15 +89,21 @@ int level_load(const char *filename, struct level *level)
     memset(level, 0, sizeof (struct level));
     memset(&sol,  0, sizeof (sol));
 
-    /* Try to load the sol file */
-    if (!sol_load_only_file(&sol, config_data(filename)))
+#define format \
+    L_("Error while loading level file '%s': %s\n")
+#define default_error \
+    L_("Not a valid level file")
+
+    if (!sol_load_only_head(&sol, config_data(filename)))
     {
-        fprintf(stderr,
-                _("Error while loading level file '%s': %s\n"), filename,
-                errno ? strerror(errno) : _("Not a valid level file"));
+        const char *error = errno ? strerror(errno) : default_error;
+        fprintf(stderr, format, filename, error);
         return 0;
     }
 
+#undef format
+#undef default_error
+
     strcpy(level->file, filename);
 
     /* Init hs with default values */
@@ -169,6 +176,8 @@ void level_dump(const struct level *l)
 
 /*---------------------------------------------------------------------------*/
 
+static unsigned int do_level_init = 1;
+
 int level_replay(const char *filename)
 {
     return demo_replay_init(filename, curr_lg());
@@ -178,11 +187,14 @@ int level_play(const struct level *l, int m)
 {
     struct level_game *lg = curr_lg();
 
-    memset(lg, 0, sizeof (struct level_game));
+    if (do_level_init)
+    {
+        memset(lg, 0, sizeof (struct level_game));
 
-    lg->mode  = m;
-    lg->level = l;
-    lg->balls = 3;
+        lg->mode  = m;
+        lg->level = l;
+        lg->balls = 3;
+    }
 
     lg->goal = (lg->mode == MODE_PRACTICE) ? 0 : lg->level->goal;
     lg->time = (lg->mode == MODE_PRACTICE) ? 0 : lg->level->time;
@@ -244,6 +256,7 @@ void level_stat(int status, int clock, int coins)
 void level_stop(void)
 {
     demo_play_stop();
+    do_level_init = 1;
 }
 
 int level_next(void)
@@ -252,12 +265,15 @@ int level_next(void)
 
     level_stop();
     lg->level = lg->next_level;
+    do_level_init = 0;
+
     return level_play(lg->level, lg->mode);
 }
 
 int level_same(void)
 {
     level_stop();
+    do_level_init = 0;
     return level_play(curr_lg()->level, curr_lg()->mode);
 }