private RPG() {
        // validate
        try {
            ConfigConst.validate();
        } catch (Exception e) {
            log.error("validate error", e);
            throw new RuntimeException(e);
        }

        // configure process
        String scriptFileName;
        try {
            scriptFileName = Loader.getResourceAsString(SCRIPT_FILE);
        } catch (FileNotFoundException e) {
            log.error(SCRIPT_FILE, e);
            throw new RuntimeException(e);
        }
        try {
            Python.execfile(scriptFileName);
        } catch (Exception e) {
            log.error("Failed to execute the file by Jython: " + scriptFileName, e);
            System.exit(1);
        }

        // configure input
        Controller controller = new Controller()
                .setKeyUp    (ConfigConst.KEY_UP)
                .setKeyDown  (ConfigConst.KEY_DOWN)
                .setKeyLeft  (ConfigConst.KEY_LEFT)
                .setKeyRight (ConfigConst.KEY_RIGHT)
                .setKeyOK    (ConfigConst.KEY_OK)
                .setKeyDown  (ConfigConst.KEY_DOWN);

        // configure output
        GameScreen screen = new GameScreen(ConfigConst.GUI_WIDTH, ConfigConst.GUI_HEIGHT);
        frame = new GameFrame(screen);

        // configure state
        // - move state
        MoveState state = MoveState.getInstance()
                .setDebug(ConfigConst.DEBUG);

        game = new Game(controller, screen)
                .setState(state);
    }