public Descent(DescentFrame frame) {
        this.frame = frame;
        CardLayout layout = new CardLayout();
        setLayout(layout);
        setBackground(new Color(48, 0, 48));
        setPreferredSize(new Dimension(640, 480));
        setDoubleBuffered(true);
        this.logger = Logger.getLogger("Descent");
        this.options = new Options(this);
        try {
            this.titleFont = Font.createFont(Font.TRUETYPE_FONT, getClass().getResourceAsStream("/slkscr.ttf")).deriveFont(48F);
            this.font = Font.createFont(Font.TRUETYPE_FONT, getClass().getResourceAsStream("/slkscr.ttf")).deriveFont(16F);
        } catch (FontFormatException | IOException exception) {
            exception.printStackTrace();
        }
        this.eventManager = new EventManager(this);
        this.notificationManager = new NotificationManager(this);
        this.pluginManager = new PluginManager(this);
        this.soundPlayer = new SoundPlayer();
        MainMenu menu = new MainMenu(this);
        add(menu, "menu");
        BufferedImage map = null;
        try {
            map = ImageIO.read(getClass().getResourceAsStream("/map.png"));
        } catch (IOException exception) {
            exception.printStackTrace();
        }
        if (map != null) {
            Level level = new Level(this);
            try {
                player = new Player(this, level, ImageIO.read(getClass().getResourceAsStream("/player.png")));
            } catch (IOException exception) {
                exception.printStackTrace();
            }
            playerController = new KeyboardPlayerController(this, player);
            frame.addKeyListener(playerController);
            level.populate(map);
            this.levelPanel = new LevelPanel(this, level, player);
            add(levelPanel, "level");
        }
        setPanel("menu");
        SettingsMenu settingsMenu = new SettingsMenu(this);
        add(settingsMenu, "settings");
        SettingsDifficultyMenu settingsDifficultyMenu = new SettingsDifficultyMenu(this);
        add(settingsDifficultyMenu, "settings.difficulty");
        SettingsLightingMenu settingsLightingMenu = new SettingsLightingMenu(this);
        add(settingsLightingMenu, "settings.lighting");
        SettingsSoundMenu settingsSoundMenu = new SettingsSoundMenu(this);
        add(settingsSoundMenu, "settings.sound");
        pluginManager.loadPlugins();
    }