@Override
  public void link(Char ch) {
    super.link(ch);

    if (cloud == null) {
      cloud = emitter();
      cloud.pour(Speck.factory(Speck.TOXIC), 0.7f);
    }
  }
  public static void appear(Char ch, int pos) {

    ch.sprite.interruptMotion();

    ch.move(pos);
    ch.sprite.place(pos);

    if (ch.invisible == 0) {
      ch.sprite.alpha(0);
      ch.sprite.parent.add(new AlphaTweener(ch.sprite, 1, 0.4f));
    }

    ch.sprite.emitter().start(Speck.factory(Speck.LIGHT), 0.2f, 3);
    Sample.INSTANCE.play(Assets.SND_TELEPORT);
  }
  @Override
  public void activate() {
    Char ch = Actor.findChar(pos);

    if (ch != null) {
      int len = Random.Int(5, 10);
      Buff.prolong(ch, Blindness.class, len);
      Buff.prolong(ch, Cripple.class, len);
      if (ch instanceof Mob) {
        if (((Mob) ch).state == ((Mob) ch).HUNTING) ((Mob) ch).state = ((Mob) ch).WANDERING;
        ((Mob) ch).beckon(Dungeon.level.randomDestination());
      }
    }

    if (Dungeon.visible[pos]) {
      CellEmitter.get(pos).burst(Speck.factory(Speck.LIGHT), 4);
    }
  }
  @Override
  public void execute(final Hero hero, String action) {
    if (action.equals(AC_BLESS)) {

      DewVial vial = hero.belongings.getItem(DewVial.class);
      if (vial != null) {
        blessed = true;
        vial.empty();
        GLog.p(TXT_BLESS);
        hero.spend(1f);
        hero.busy();

        Sample.INSTANCE.play(Assets.SND_DRINK);
        CellEmitter.get(hero.pos).start(Speck.factory(Speck.LIGHT), 0.2f, 3);
        hero.sprite.operate(hero.pos);
      }
    } else {

      super.execute(hero, action);
    }
  }
  @Override
  public void activate() {

    for (Mob mob : Dungeon.level.mobs) {
      mob.beckon(pos);
    }

    if (Dungeon.visible[pos]) {
      GLog.w("The trap emits a piercing sound that echoes throughout the dungeon!");
      CellEmitter.center(pos).start(Speck.factory(Speck.SCREAM), 0.3f, 3);
    }

    Sample.INSTANCE.play(Assets.SND_ALERT);

    for (int i = 0; i < (Dungeon.depth - 5) / 5; i++) {
      Guardian guardian = new Guardian();
      guardian.state = guardian.WANDERING;
      guardian.pos = Dungeon.level.randomRespawnCell();
      GameScene.add(guardian);
      guardian.beckon(Dungeon.hero.pos);
    }
  }
  @Override
  public void use(BlobEmitter emitter) {
    super.use(emitter);

    emitter.pour(Speck.factory(Speck.STENCH), 0.4f);
  }