public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) {
    if (((mob.location().domainType() & Room.INDOORS) > 0) && (!auto)) {
      mob.tell("You must be outdoors for this chant to work.");
      return false;
    }
    if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false;

    int size = mob.location().getArea().numberOfProperIDedRooms();
    size = size / (mob.phyStats().level() + (2 * super.getXLEVELLevel(mob)));
    if (size < 0) size = 0;
    boolean success = proficiencyCheck(mob, -size, auto);
    if (success) {
      Climate C = mob.location().getArea().getClimateObj();
      Climate oldC = (Climate) C.copyOf();
      CMMsg msg =
          CMClass.getMsg(
              mob,
              null,
              this,
              verbalCastCode(mob, null, auto),
              auto
                  ? "^JThe sky changes color!^?"
                  : "^S<S-NAME> chant(s) into the sky for water!^?");
      if (mob.location().okMessage(mob, msg)) {
        mob.location().send(mob, msg);
        switch (C.weatherType(mob.location())) {
          case Climate.WEATHER_BLIZZARD:
            C.setNextWeatherType(Climate.WEATHER_BLIZZARD);
            break;
          case Climate.WEATHER_CLEAR:
            C.setNextWeatherType(Climate.WEATHER_RAIN);
            break;
          case Climate.WEATHER_CLOUDY:
            C.setNextWeatherType(Climate.WEATHER_RAIN);
            break;
          case Climate.WEATHER_DROUGHT:
            C.setNextWeatherType(Climate.WEATHER_CLEAR);
            break;
          case Climate.WEATHER_DUSTSTORM:
            C.setNextWeatherType(Climate.WEATHER_CLOUDY);
            break;
          case Climate.WEATHER_HAIL:
            C.setNextWeatherType(Climate.WEATHER_SLEET);
            break;
          case Climate.WEATHER_HEAT_WAVE:
            C.setNextWeatherType(Climate.WEATHER_RAIN);
            break;
          case Climate.WEATHER_RAIN:
            C.setNextWeatherType(Climate.WEATHER_THUNDERSTORM);
            break;
          case Climate.WEATHER_SLEET:
            C.setNextWeatherType(Climate.WEATHER_SLEET);
            break;
          case Climate.WEATHER_SNOW:
            C.setNextWeatherType(Climate.WEATHER_SLEET);
            break;
          case Climate.WEATHER_THUNDERSTORM:
            C.setNextWeatherType(Climate.WEATHER_THUNDERSTORM);
            break;
          case Climate.WEATHER_WINDY:
            C.setNextWeatherType(Climate.WEATHER_THUNDERSTORM);
            break;
          case Climate.WEATHER_WINTER_COLD:
            C.setNextWeatherType(Climate.WEATHER_SNOW);
            break;
          default:
            break;
        }
        C.forceWeatherTick(mob.location().getArea());
        Chant_CalmWeather.xpWorthyChange(mob, mob.location().getArea(), oldC, C);
      }
    } else
      beneficialVisualFizzle(
          mob, null, "<S-NAME> chant(s) into the sky for water, but the magic fizzles.");

    return success;
  }