@Override
	public boolean invoke(MOB mob, List<String> commands, Physical givenTarget, boolean auto, int asLevel)
	{
		final MOB target=mob;
		if(target==null)
			return false;
		if(target.charStats().getBodyPart(Race.BODY_WING)<=0)
		{
			mob.tell(L("You can't flap without wings."));
			return false;
		}

		final boolean wasFlying=CMLib.flags().isFlying(target);
		Ability A=target.fetchEffect(ID());
		if(A!=null)
			A.unInvoke();
		target.recoverPhyStats();
		String str="";
		if(wasFlying)
			str=L("<S-NAME> stop(s) flapping <S-HIS-HER> wings.");
		else
			str=L("<S-NAME> start(s) flapping <S-HIS-HER> wings.");


		if(!super.invoke(mob,commands,givenTarget,auto,asLevel))
			return false;

		final boolean success=proficiencyCheck(mob,0,auto);
		if(success)
		{
			final CMMsg msg=CMClass.getMsg(mob,target,this,CMMsg.MSG_NOISYMOVEMENT,str);
			if(target.location().okMessage(target,msg))
			{
				target.location().send(target,msg);
				beneficialAffect(mob,target,asLevel,9999);
				A=target.fetchEffect(ID());
				if(A!=null)
				{
					A.makeLongLasting();
					A.setMiscText("FLYING="+(!wasFlying));
				}
				target.location().recoverRoomStats();
			}
		}
		else
			return beneficialVisualFizzle(mob,target,L("<T-NAME> fumble(s) trying to use <T-HIS-HER> wings."));


		// return whether it worked
		return success;
	}