diff --git a/sokoban.c b/sokoban.c
index 147c61f..69265f8 100644
--- a/sokoban.c
+++ b/sokoban.c
@@ -20,17 +20,22 @@ Font font;
 
 
 double speed = 256;
-
-char levels[256][1024];
-int levelsCount = 0;
 int level = 0;
 
 
 void loadLevel() {
-  if (level < 0) level = levelsCount - 1;
-  if (level >= levelsCount) level = 0;
+  FILE *f = NULL;
+  Directory dir = openDirectoryEx("data/levels/sokoban", "", ".level", FALSE, TRUE, FALSE);
+  if (dir) {
+    int count = directoryGetCount(dir);
+    if (count > 0) {
+      if (level >= count) level = 0;
+      if (level < 0) level = count - 1;
+      f = fopen(directoryGetFull(dir, level), "r");
+    }
+    closeDirectory(dir);
+  }
 
-  FILE *f = fopen(levels[level], "r");
   if (!f) {
     messageBox("Cannot open level file");
     return;
@@ -99,21 +104,6 @@ void init() {
   boxes = createGroup();
   places = createGroup();
 
-  Directory dir = openDirectory("data/levels/sokoban");
-  if (!dir || !directoryGetCount(dir)) {
-    messageBox("Cannot open levels directory");
-    exit(1);
-  }
-  for(int i = 0; i < directoryGetCount(dir); ++i) {
-    const char *filename = directoryGet(dir, i);
-    int l = strlen(filename);
-    if (l >= 6 && strcmp(filename + l - 6, ".level") == 0) {
-      snprintf(levels[levelsCount], 1023, "data/levels/sokoban/%s", filename);
-      ++levelsCount;
-    }
-  }
-  closeDirectory(dir);
-
   loadLevel();
 }