@Override
  public void destroy() {
    Badges.saveGlobal();

    Camera.remove(viewport);
    super.destroy();
  }
  @Override
  public void create() {

    super.create();

    Music.INSTANCE.play(Assets.HAPPY, true);
    Music.INSTANCE.volume(1f);

    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) {
          @Override
          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") {
          @Override
          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();
  }