+ LispReader reader(lisp_cdr(root_obj));
+ reader.read_int("version", &version);
+ reader.read_int("width", &width);
+ if (!reader.read_int("start_pos_x", &start_pos_x)) start_pos_x = 100;
+ if (!reader.read_int("start_pos_y", &start_pos_y)) start_pos_y = 170;
+ reader.read_int("time", &time_left);
+
+ reader.read_int("bkgd_top_red", &bkgd_top.red);
+ reader.read_int("bkgd_top_green", &bkgd_top.green);
+ reader.read_int("bkgd_top_blue", &bkgd_top.blue);
+
+ reader.read_int("bkgd_bottom_red", &bkgd_bottom.red);
+ reader.read_int("bkgd_bottom_green", &bkgd_bottom.green);
+ reader.read_int("bkgd_bottom_blue", &bkgd_bottom.blue);
+
+ reader.read_float("gravity", &gravity);
+ reader.read_string("name", &name);
+ reader.read_string("author", &author);
+ reader.read_string("theme", &theme);
+ reader.read_string("music", &song_title);
+ reader.read_string("background", &bkgd_image);
+ reader.read_string("particle_system", &particle_system);
+ reader.read_int_vector("background-tm", &bg_tm);
+
+ if (!reader.read_int_vector("interactive-tm", &ia_tm))
+ reader.read_int_vector("tilemap", &ia_tm);
+
+ reader.read_int_vector("foreground-tm", &fg_tm);
+
+ { // Read ResetPoints
+ lisp_object_t* cur = 0;
+ if (reader.read_lisp("reset-points", &cur))
+ {
+ while (!lisp_nil_p(cur))
+ {
+ lisp_object_t* data = lisp_car(cur);
+
+ ResetPoint pos;
+
+ LispReader reader(lisp_cdr(data));
+ if (reader.read_int("x", &pos.x)
+ && reader.read_int("y", &pos.y))
+ {
+ reset_points.push_back(pos);
+ }
+
+ cur = lisp_cdr(cur);
+ }
+ }
+ }
+
+ { // Read BadGuys
+ lisp_object_t* cur = 0;
+ if (reader.read_lisp("objects", &cur))
+ {
+ while (!lisp_nil_p(cur))
+ {
+ lisp_object_t* data = lisp_car(cur);
+
+ BadGuyData bg_data;
+ bg_data.kind = badguykind_from_string(lisp_symbol(lisp_car(data)));
+ LispReader reader(lisp_cdr(data));
+ reader.read_int("x", &bg_data.x);
+ reader.read_int("y", &bg_data.y);
+ reader.read_bool("stay-on-platform", &bg_data.stay_on_platform);
+
+ badguy_data.push_back(bg_data);
+
+ cur = lisp_cdr(cur);
+ }
+ }
+ }
+
+ // Convert old levels to the new tile numbers
+ if (version == 0)
+ {
+ std::map<char, int> transtable;
+ transtable['.'] = 0;
+ transtable['x'] = 104;
+ transtable['X'] = 77;
+ transtable['y'] = 78;
+ transtable['Y'] = 105;
+ transtable['A'] = 83;
+ transtable['B'] = 102;
+ transtable['!'] = 103;
+ transtable['a'] = 84;
+ transtable['C'] = 85;
+ transtable['D'] = 86;
+ transtable['E'] = 87;
+ transtable['F'] = 88;
+ transtable['c'] = 89;
+ transtable['d'] = 90;
+ transtable['e'] = 91;
+ transtable['f'] = 92;
+
+ transtable['G'] = 93;
+ transtable['H'] = 94;
+ transtable['I'] = 95;
+ transtable['J'] = 96;
+
+ transtable['g'] = 97;
+ transtable['h'] = 98;
+ transtable['i'] = 99;
+ transtable['j'] = 100
+ ;
+ transtable['#'] = 11;
+ transtable['['] = 13;
+ transtable['='] = 14;
+ transtable[']'] = 15;
+ transtable['$'] = 82;
+ transtable['^'] = 76;
+ transtable['*'] = 80;
+ transtable['|'] = 79;
+ transtable['\\'] = 81;
+ transtable['&'] = 75;
+
+ int x = 0;
+ int y = 0;
+ for(std::vector<int>::iterator i = ia_tm.begin(); i != ia_tm.end(); ++i)
+ {
+ if (*i == '0' || *i == '1' || *i == '2')
+ {
+ badguy_data.push_back(BadGuyData(static_cast<BadGuyKind>(*i-'0'),
+ x*32, y*32, false));
+ *i = 0;
+ }
+ else
+ {
+ std::map<char, int>::iterator j = transtable.find(*i);
+ if (j != transtable.end())
+ *i = j->second;
+ else
+ printf("Error: conversion will fail, unsupported char: '%c' (%d)\n", *i, *i);
+ }
+ ++x;
+ if (x >= width)
+ {
+ x = 0;
+ ++y;
+ }
+ }
+ }