@Override
  public void revive() {
    super.revive();

    speed.set(0);
    acc.set(0);
    dropInterval = 0;

    heap = null;
  }
  @Override
  public void update() {
    super.update();

    visible = (heap == null || Dungeon.visible[heap.pos]);

    if (dropInterval > 0 && (dropInterval -= Game.elapsed) <= 0) {

      speed.set(0);
      acc.set(0);
      place(heap.pos);

      if (visible) {
        boolean water = Level.water[heap.pos];

        if (water) {
          GameScene.ripple(heap.pos);
        } else {
          int cell = Dungeon.level.map[heap.pos];
          water = (cell == Terrain.WELL || cell == Terrain.ALCHEMY);
        }

        if (!(heap.peek() instanceof Gold)) {
          Sample.INSTANCE.play(water ? Assets.SND_WATER : Assets.SND_STEP, 0.8f, 0.8f, 1.2f);
        }
      }
    }

    if (visible && glowing != null) {
      if (glowUp && (phase += Game.elapsed) > glowing.period) {

        glowUp = false;
        phase = glowing.period;

      } else if (!glowUp && (phase -= Game.elapsed) < 0) {

        glowUp = true;
        phase = 0;
      }

      float value = phase / glowing.period * 0.6f;

      rm = gm = bm = 1 - value;
      ra = glowing.red * value;
      ga = glowing.green * value;
      ba = glowing.blue * value;
    }
  }
  @Override
  public void update() {

    super.update();

    if (paused && listener != null) {
      listener.onComplete(curAnim);
    }

    if (flashTime > 0 && (flashTime -= Game.elapsed) <= 0) {
      resetColor();
    }

    boolean visible = getVisible();

    if (burning != null) {
      burning.setVisible(visible);
    }
    if (levitation != null) {
      levitation.setVisible(visible);
    }
    if (iceBlock != null) {
      iceBlock.setVisible(visible);
    }
    if (sleeping) {
      showSleep();
    } else {
      hideSleep();
    }

    if (controlled) {
      showMindControl();
    }

    if (emo != null) {
      emo.setVisible(visible);
    }
  }
 @Override
 public void kill() {
   super.kill();
   removeEmo();
 }