public void loadTheme(final String themeFile) {
		if (themeFile == null || "".equals(themeFile)) {
			debug("Not loading theme, filename: " + themeFile);
			return;
		}

		debug("Loading theme, filename: " + themeFile);

		String section = "";

		for (final String line : Utils.loadStrings(themeFile)) {
			// skip blanklines
			if ("".equals(line) || line.trim().startsWith("//")) {
				continue;
			}

			if (line.startsWith("[/")) { // end section
				// if end tag doesn't match current section
				if (!line.substring(2, line.length() - 1).equals(section)) {
					throw new IllegalStateException("Theme section is " + section + " but ending tag is " + line);
				}
				else {
					section = ""; // clear section
					//debug("Leaving " + section);
				}
			}
			else if (line.startsWith("[")) { // start section
				section = line.substring(line.indexOf('[') + 1, line.indexOf(']'));
				//debug("Entering " + section);
				debug("** " + section);
			}
			else if (line.indexOf(" = ") == -1) { // start section
				throw new IllegalStateException("Theme line is not section name, but missing \" = \": " + line);
			}
			else {
				final String[] parts = line.split(" = ", 2);

				if( parts.length != 2 ) continue;

				final String var = parts[0];
				final String val = parts[1];
				
				// TODO debug or not?
				//System.out.println("" + var + ": \'" + val + "\'");

				if (section.equals("theme")) {
					// TODO should db be a variable in Theme?
					if(var.equals("name") )            ;
					else if (var.equals("mud_name"))   mud_name = val;
					else if (var.equals("motd_file"))  motd = val;
					// MOTD_FILE = MOTD_DIR + val;
					// WORLD_DIR + world + "\\motd\\" + motd
					else if (var.equals("start_room")) start_room = Utils.toInt(val, 0);
					else if (var.equals("module"))     ;
					else if (var.equals("world"))      world = val;
					else if (var.equals("db"))         this.DB_FILE = DATA_DIR + "databases\\" + val;
					else {
						debug("Theme Loader (" + section + "): unknown var \'" + var + "\' with value of \'" + val + "\'.");
					}
				}
				else if (section.equals("calendar")) {
					// NOTE: could I set the day/month/year on time loop in here?
					debug(line);
					if (var.equals("day"))         day = Utils.toInt(val, 0);
					else if (var.equals("month"))  month = Utils.toInt(val, 0);
					else if (var.equals("year"))   year = Utils.toInt(val, 0);
					else if (var.equals("season")) season = Seasons.fromStringLower(val);
					else if (var.equals("reckon")) reckoning = val;
					else {
						debug("Theme Loader (" + section + "): unknown var \'" + var + "\' with value of \'" + val + "\'.");
					}
				}
				else if (section.equals("months")) {
					final int monthIndex = Utils.toInt(var, -1) - 1;
					MONTH_NAMES[monthIndex] = val;
					debug("Month " + Utils.padRight("" + monthIndex, ' ', 2) + " set to \"" + val + "\"");
				}
				else if (section.equals("months_alt")) {
				}
				else if (section.equals("holidays")) {
					/*final String[] dateInfo = var.split(",");

					final int m = Utils.toInt(dateInfo[0], 0);
					final int d = Utils.toInt(dateInfo[1], 0);

					debug(Utils.padRight(MONTH_NAMES[m], ' ', 8) + " " + Utils.padRight(d, ' ', 2) + " "   , 2);*/

					// day, month = holiday name/day name
					// E.g.: 9,21 = Autumn Equinox

					final int month = Integer.parseInt(Utils.trim(var.split(",")[0]));
					final int day = Integer.parseInt(Utils.trim(var.split(",")[1]));

					final String hname = Utils.trim(val);

					debug(Utils.padRight(MONTH_NAMES[month - 1], ' ', 9) + " " + Utils.padRight("" + day, ' ', 2) + " - " + hname, 2);

					holidays.put(hname, new Date(month, day));

					// multi-day holidays not handled very well at all, only one
					// day recorded for now
					// holidays.put(new
					// Date(Integer.parseInt(trim(dateline[1])),
					// Integer.parseInt(trim(dateline[0]))), trim(line[1]));
				}
				else if (section.equals("years")) {
					debug(line, 2);
					years.put(Integer.parseInt(Utils.trim(var)), Utils.trim(val));
				}
			}
		}

		debug("");
		debug("Theme Loaded.");
	}