public AudioTab() {
      OptionSlider musicVol =
          new OptionSlider(Messages.get(this, "music_vol"), "0", "10", 0, 10) {
            @Override
            protected void onChange() {
              Music.INSTANCE.volume(getSelectedValue() / 10f);
              ShatteredPixelDungeon.musicVol(getSelectedValue());
            }
          };
      musicVol.setSelectedValue(ShatteredPixelDungeon.musicVol());
      musicVol.setRect(0, 0, WIDTH, SLIDER_HEIGHT);
      add(musicVol);

      CheckBox musicMute =
          new CheckBox(Messages.get(this, "music_mute")) {
            @Override
            protected void onClick() {
              super.onClick();
              ShatteredPixelDungeon.music(!checked());
            }
          };
      musicMute.setRect(0, musicVol.bottom() + GAP_SML, WIDTH, BTN_HEIGHT);
      musicMute.checked(!ShatteredPixelDungeon.music());
      add(musicMute);

      OptionSlider SFXVol =
          new OptionSlider(Messages.get(this, "sfx_vol"), "0", "10", 0, 10) {
            @Override
            protected void onChange() {
              Sample.INSTANCE.volume(getSelectedValue() / 10f);
              ShatteredPixelDungeon.SFXVol(getSelectedValue());
            }
          };
      SFXVol.setSelectedValue(ShatteredPixelDungeon.SFXVol());
      SFXVol.setRect(0, musicMute.bottom() + GAP_LRG, WIDTH, SLIDER_HEIGHT);
      add(SFXVol);

      CheckBox btnSound =
          new CheckBox(Messages.get(this, "sfx_mute")) {
            @Override
            protected void onClick() {
              super.onClick();
              ShatteredPixelDungeon.soundFx(!checked());
              Sample.INSTANCE.play(Assets.SND_CLICK);
            }
          };
      btnSound.setRect(0, SFXVol.bottom() + GAP_SML, WIDTH, BTN_HEIGHT);
      btnSound.checked(!ShatteredPixelDungeon.soundFx());
      add(btnSound);

      resize(WIDTH, (int) btnSound.bottom());
    }
 @Override
 protected void onClick() {
   if (Game.scene() instanceof TitleScene) {
     Game.instance.finish();
   } else {
     ShatteredPixelDungeon.switchNoFade(TitleScene.class);
   }
 }
  @Override
  public void create() {

    super.create();

    Music.INSTANCE.play(Assets.HAPPY, true);
    Music.INSTANCE.volume(ShatteredPixelDungeon.musicVol() / 10f);

    uiCamera.visible = false;

    int w = Camera.main.width;
    int h = Camera.main.height;

    Archs archs = new Archs();
    archs.reversed = true;
    archs.setSize(w, h);
    add(archs);

    float vx = align((w - SKY_WIDTH) / 2);
    float vy = align((h - SKY_HEIGHT - BUTTON_HEIGHT) / 2);

    Point s = Camera.main.cameraToScreen(vx, vy);
    viewport = new Camera(s.x, s.y, SKY_WIDTH, SKY_HEIGHT, defaultZoom);
    Camera.add(viewport);

    Group window = new Group();
    window.camera = viewport;
    add(window);

    boolean dayTime = Calendar.getInstance().get(Calendar.HOUR_OF_DAY) >= 7;

    Sky sky = new Sky(dayTime);
    sky.scale.set(SKY_WIDTH, SKY_HEIGHT);
    window.add(sky);

    if (!dayTime) {
      for (int i = 0; i < NSTARS; i++) {
        float size = Random.Float();
        ColorBlock star = new ColorBlock(size, size, 0xFFFFFFFF);
        star.x = Random.Float(SKY_WIDTH) - size / 2;
        star.y = Random.Float(SKY_HEIGHT) - size / 2;
        star.am = size * (1 - star.y / SKY_HEIGHT);
        window.add(star);
      }
    }

    float range = SKY_HEIGHT * 2 / 3;
    for (int i = 0; i < NCLOUDS; i++) {
      Cloud cloud =
          new Cloud((NCLOUDS - 1 - i) * (range / NCLOUDS) + Random.Float(range / NCLOUDS), dayTime);
      window.add(cloud);
    }

    int nPatches = (int) (sky.width() / GrassPatch.WIDTH + 1);

    for (int i = 0; i < nPatches * 4; i++) {
      GrassPatch patch =
          new GrassPatch((i - 0.75f) * GrassPatch.WIDTH / 4, SKY_HEIGHT + 1, dayTime);
      patch.brightness(dayTime ? 0.7f : 0.4f);
      window.add(patch);
    }

    Avatar a = new Avatar(Dungeon.hero.heroClass);
    // Removing semitransparent contour
    a.am = 2;
    a.aa = -1;
    a.x = PixelScene.align((SKY_WIDTH - a.width) / 2);
    a.y = SKY_HEIGHT - a.height;
    window.add(a);

    final Pet pet = new Pet();
    pet.rm = pet.gm = pet.bm = 1.2f;
    pet.x = SKY_WIDTH / 2 + 2;
    pet.y = SKY_HEIGHT - pet.height;
    window.add(pet);

    window.add(
        new TouchArea(sky) {
          protected void onClick(Touch touch) {
            pet.jump();
          };
        });

    for (int i = 0; i < nPatches; i++) {
      GrassPatch patch = new GrassPatch((i - 0.5f) * GrassPatch.WIDTH, SKY_HEIGHT, dayTime);
      patch.brightness(dayTime ? 1.0f : 0.8f);
      window.add(patch);
    }

    Image frame = new Image(Assets.SURFACE);

    frame.frame(0, 0, FRAME_WIDTH, FRAME_HEIGHT);
    frame.x = vx - FRAME_MARGIN_X;
    frame.y = vy - FRAME_MARGIN_TOP;
    add(frame);

    if (dayTime) {
      a.brightness(1.2f);
      pet.brightness(1.2f);
    } else {
      frame.hardlight(0xDDEEFF);
    }

    RedButton gameOver =
        new RedButton("Game Over") {
          protected void onClick() {
            Game.switchScene(TitleScene.class);
          }
        };
    gameOver.setSize(SKY_WIDTH - FRAME_MARGIN_X * 2, BUTTON_HEIGHT);
    gameOver.setPos(frame.x + FRAME_MARGIN_X * 2, frame.y + frame.height + 4);
    add(gameOver);

    Badges.validateHappyEnd();

    fadeIn();
  }
  @Override
  public void create() {

    super.create();

    Music.INSTANCE.play(Assets.THEME, true);
    Music.INSTANCE.volume(ShatteredPixelDungeon.musicVol() / 10f);

    uiCamera.visible = false;

    int w = Camera.main.width;
    int h = Camera.main.height;

    Archs archs = new Archs();
    archs.setSize(w, h);
    add(archs);

    Image title = BannerSprites.get(BannerSprites.Type.PIXEL_DUNGEON);
    add(title);

    float height =
        title.height
            + (ShatteredPixelDungeon.landscape() ? DashboardItem.SIZE : DashboardItem.SIZE * 2);

    title.x = (w - title.width()) / 2;
    title.y = (h - height) / 2;

    placeTorch(title.x + 18, title.y + 20);
    placeTorch(title.x + title.width - 18, title.y + 20);

    Image signs =
        new Image(BannerSprites.get(BannerSprites.Type.PIXEL_DUNGEON_SIGNS)) {
          private float time = 0;

          @Override
          public void update() {
            super.update();
            am = (float) Math.sin(-(time += Game.elapsed));
          }

          @Override
          public void draw() {
            GLES20.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE);
            super.draw();
            GLES20.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
          }
        };
    signs.x = title.x;
    signs.y = title.y;
    add(signs);

    DashboardItem btnBadges =
        new DashboardItem(TXT_BADGES, 3) {
          @Override
          protected void onClick() {
            ShatteredPixelDungeon.switchNoFade(BadgesScene.class);
          }
        };
    add(btnBadges);

    DashboardItem btnAbout =
        new DashboardItem(TXT_ABOUT, 1) {
          @Override
          protected void onClick() {
            ShatteredPixelDungeon.switchNoFade(AboutScene.class);
          }
        };
    add(btnAbout);

    DashboardItem btnPlay =
        new DashboardItem(TXT_PLAY, 0) {
          @Override
          protected void onClick() {
            ShatteredPixelDungeon.switchNoFade(StartScene.class);
          }
        };
    add(btnPlay);

    DashboardItem btnHighscores =
        new DashboardItem(TXT_HIGHSCORES, 2) {
          @Override
          protected void onClick() {
            ShatteredPixelDungeon.switchNoFade(RankingsScene.class);
          }
        };
    add(btnHighscores);

    if (ShatteredPixelDungeon.landscape()) {
      float y = (h + height) / 2 - DashboardItem.SIZE;
      btnHighscores.setPos(w / 2 - btnHighscores.width(), y);
      btnBadges.setPos(w / 2, y);
      btnPlay.setPos(btnHighscores.left() - btnPlay.width(), y);
      btnAbout.setPos(btnBadges.right(), y);
    } else {
      btnBadges.setPos(w / 2 - btnBadges.width(), (h + height) / 2 - DashboardItem.SIZE);
      btnAbout.setPos(w / 2, (h + height) / 2 - DashboardItem.SIZE);
      btnPlay.setPos(w / 2 - btnPlay.width(), btnAbout.top() - DashboardItem.SIZE);
      btnHighscores.setPos(w / 2, btnPlay.top());
    }

    BitmapText version = new BitmapText("v " + Game.version + "", pixelFont);
    version.measure();
    version.hardlight(0xCCCCCC);
    version.x = w - version.width();
    version.y = h - version.height();
    add(version);

    Button changes = new ChangesButton();
    changes.setPos(w - changes.width(), h - version.height() - changes.height());
    add(changes);

    PrefsButton btnPrefs = new PrefsButton();
    btnPrefs.setPos(0, 0);
    add(btnPrefs);

    ExitButton btnExit = new ExitButton();
    btnExit.setPos(w - btnExit.width(), 0);
    add(btnExit);

    int gameversion = ShatteredPixelDungeon.version();

    if (gameversion != Game.versionCode) {
      if (gameversion < 65) {
        // TODO special code for 0.3.2 update to notify people about mastery book changes. Remove
        // when not needed
        Badges.loadGlobal();

        if (Badges.isUnlocked(Badges.Badge.MASTERY_WARRIOR)
            || Badges.isUnlocked(Badges.Badge.MASTERY_ROGUE)
            || Badges.isUnlocked(Badges.Badge.MASTERY_MAGE)
            || Badges.isUnlocked(Badges.Badge.MASTERY_HUNTRESS)) {
          add(
              new WndHardNotification(
                  new ItemSprite(ItemSpriteSheet.MASTERY, null),
                  "Mastery Book Changes",
                  "v0.3.2 brings new prison content and some big balance changes to subclasses:\n"
                      + "\n"
                      + "_The Book of Mastery is no longer given at floor 1, it is only dropped by Tengu._\n"
                      + "\n"
                      + "There have been balance tweaks to accommodate this, so the difficulty should be similar.\n"
                      + "\n"
                      + "This change is necessary to allow for more interesting subclasses in the future, "
                      + "apologies for any frustration.",
                  "See All Changes",
                  10) {
                @Override
                public void hide() {
                  super.hide();
                  Game.switchScene(WelcomeScene.class);
                }
              });
        } else {
          Game.switchScene(WelcomeScene.class);
          return;
        }
      } else {
        Game.switchScene(WelcomeScene.class);
        return;
      }
    }

    fadeIn();
  }
    public UITab() {
      super();

      RenderedText barDesc = PixelScene.renderText(Messages.get(this, "mode"), 9);
      barDesc.x = (WIDTH - barDesc.width()) / 2;
      PixelScene.align(barDesc);
      add(barDesc);

      RedButton btnSplit =
          new RedButton(Messages.get(this, "split")) {
            @Override
            protected void onClick() {
              ShatteredPixelDungeon.toolbarMode(Toolbar.Mode.SPLIT.name());
              Toolbar.updateLayout();
            }
          };
      btnSplit.setRect(1, barDesc.y + barDesc.baseLine() + GAP_TINY, 36, 16);
      add(btnSplit);

      RedButton btnGrouped =
          new RedButton(Messages.get(this, "group")) {
            @Override
            protected void onClick() {
              ShatteredPixelDungeon.toolbarMode(Toolbar.Mode.GROUP.name());
              Toolbar.updateLayout();
            }
          };
      btnGrouped.setRect(btnSplit.right() + 1, barDesc.y + barDesc.baseLine() + GAP_TINY, 36, 16);
      add(btnGrouped);

      RedButton btnCentered =
          new RedButton(Messages.get(this, "center")) {
            @Override
            protected void onClick() {
              ShatteredPixelDungeon.toolbarMode(Toolbar.Mode.CENTER.name());
              Toolbar.updateLayout();
            }
          };
      btnCentered.setRect(
          btnGrouped.right() + 1, barDesc.y + barDesc.baseLine() + GAP_TINY, 36, 16);
      add(btnCentered);

      CheckBox chkFlipToolbar =
          new CheckBox(Messages.get(this, "flip_toolbar")) {
            @Override
            protected void onClick() {
              super.onClick();
              ShatteredPixelDungeon.flipToolbar(checked());
              Toolbar.updateLayout();
            }
          };
      chkFlipToolbar.setRect(0, btnGrouped.bottom() + GAP_TINY, WIDTH, BTN_HEIGHT);
      chkFlipToolbar.checked(ShatteredPixelDungeon.flipToolbar());
      add(chkFlipToolbar);

      final CheckBox chkFlipTags =
          new CheckBox(Messages.get(this, "flip_indicators")) {
            @Override
            protected void onClick() {
              super.onClick();
              ShatteredPixelDungeon.flipTags(checked());
              GameScene.layoutTags();
            }
          };
      chkFlipTags.setRect(0, chkFlipToolbar.bottom() + GAP_TINY, WIDTH, BTN_HEIGHT);
      chkFlipTags.checked(ShatteredPixelDungeon.flipTags());
      add(chkFlipTags);

      OptionSlider slots =
          new OptionSlider(Messages.get(this, "quickslots"), "0", "4", 0, 4) {
            @Override
            protected void onChange() {
              ShatteredPixelDungeon.quickSlots(getSelectedValue());
              Toolbar.updateLayout();
            }
          };
      slots.setSelectedValue(ShatteredPixelDungeon.quickSlots());
      slots.setRect(0, chkFlipTags.bottom() + GAP_TINY, WIDTH, SLIDER_HEIGHT);
      add(slots);

      CheckBox chkFont =
          new CheckBox(Messages.get(this, "system_font")) {
            @Override
            protected void onClick() {
              super.onClick();
              ShatteredPixelDungeon.switchNoFade(
                  (Class<? extends PixelScene>) ShatteredPixelDungeon.scene().getClass(),
                  new Game.SceneChangeCallback() {
                    @Override
                    public void beforeCreate() {
                      ShatteredPixelDungeon.classicFont(!checked());
                    }

                    @Override
                    public void afterCreate() {
                      Game.scene().add(new WndSettings());
                    }
                  });
            }
          };
      chkFont.setRect(0, slots.bottom() + GAP_SML, WIDTH, BTN_HEIGHT);
      chkFont.checked(!ShatteredPixelDungeon.classicFont());
      add(chkFont);
    }
    public ScreenTab() {
      super();

      OptionSlider scale =
          new OptionSlider(
              Messages.get(this, "scale"),
              (int) Math.ceil(2 * Game.density) + "X",
              PixelScene.maxDefaultZoom + "X",
              (int) Math.ceil(2 * Game.density),
              PixelScene.maxDefaultZoom) {
            @Override
            protected void onChange() {
              if (getSelectedValue() != ShatteredPixelDungeon.scale()) {
                ShatteredPixelDungeon.scale(getSelectedValue());
                ShatteredPixelDungeon.switchNoFade(
                    (Class<? extends PixelScene>) ShatteredPixelDungeon.scene().getClass(),
                    new Game.SceneChangeCallback() {
                      @Override
                      public void beforeCreate() {
                        // do nothing
                      }

                      @Override
                      public void afterCreate() {
                        Game.scene().add(new WndSettings());
                      }
                    });
              }
            }
          };
      scale.setSelectedValue(PixelScene.defaultZoom);
      scale.setRect(0, 0, WIDTH, SLIDER_HEIGHT);
      if ((int) Math.ceil(2 * Game.density) < PixelScene.maxDefaultZoom) add(scale);

      OptionSlider brightness =
          new OptionSlider(
              Messages.get(this, "brightness"),
              Messages.get(this, "dark"),
              Messages.get(this, "bright"),
              -2,
              2) {
            @Override
            protected void onChange() {
              ShatteredPixelDungeon.brightness(getSelectedValue());
            }
          };
      brightness.setSelectedValue(ShatteredPixelDungeon.brightness());
      brightness.setRect(0, scale.bottom() + GAP_TINY, WIDTH, SLIDER_HEIGHT);
      add(brightness);

      CheckBox chkImmersive =
          new CheckBox(Messages.get(this, "soft_keys")) {
            @Override
            protected void onClick() {
              super.onClick();
              ShatteredPixelDungeon.immerse(checked());
            }
          };
      chkImmersive.setRect(0, brightness.bottom() + GAP_SML, WIDTH, BTN_HEIGHT);
      chkImmersive.checked(ShatteredPixelDungeon.immersed());
      chkImmersive.enable(android.os.Build.VERSION.SDK_INT >= 19);
      add(chkImmersive);

      CheckBox chkSaver =
          new CheckBox(Messages.get(this, "saver")) {
            @Override
            protected void onClick() {
              super.onClick();
              if (checked()) {
                checked(!checked());
                ShatteredPixelDungeon.scene()
                    .add(
                        new WndOptions(
                            Messages.get(ScreenTab.class, "saver"),
                            Messages.get(ScreenTab.class, "saver_desc"),
                            Messages.get(ScreenTab.class, "okay"),
                            Messages.get(ScreenTab.class, "cancel")) {
                          @Override
                          protected void onSelect(int index) {
                            if (index == 0) {
                              checked(!checked());
                              ShatteredPixelDungeon.powerSaver(checked());
                            }
                          }
                        });
              } else {
                ShatteredPixelDungeon.powerSaver(checked());
              }
            }
          };
      chkSaver.setRect(0, chkImmersive.bottom() + GAP_TINY, WIDTH, BTN_HEIGHT);
      chkSaver.checked(ShatteredPixelDungeon.powerSaver());
      if (PixelScene.maxScreenZoom >= 2) add(chkSaver);

      RedButton btnOrientation =
          new RedButton(
              ShatteredPixelDungeon.landscape()
                  ? Messages.get(this, "portrait")
                  : Messages.get(this, "landscape")) {
            @Override
            protected void onClick() {
              ShatteredPixelDungeon.landscape(!ShatteredPixelDungeon.landscape());
            }
          };
      btnOrientation.setRect(0, chkSaver.bottom() + GAP_SML, WIDTH, BTN_HEIGHT);
      add(btnOrientation);
    }