@Override
		public boolean tick(Tickable ticking, int tickID)
		{
			if(noTickers) return true;
			for(final Ability A : myEffects)
				if(!A.tick(ticking, tickID))
					return false;
			for(final Behavior B : myBehaviors)
				if(!B.tick(ticking, tickID))
					return false;
			for(final Ability A : lightPresenceAbilities)
				if(!A.tick(A.invoker(), tickID))
					return false;
			return true;
		}
	}

	public class DefaultFactionZapFactor implements Faction.FZapFactor
	{
		private double gainF=1.0;
		private double lossF=1.0;
		private String mask="";
		private MaskingLibrary.CompiledZapperMask compiledMask=null;
		public DefaultFactionZapFactor(double gain, double loss, String mask)
		{
			setGainFactor(gain);
			setLossFactor(loss);
			setMOBMask(mask);
		}
		@Override public double gainFactor() { return gainF;}
		@Override public void setGainFactor(double val){gainF=val;}
		@Override public double lossFactor(){return lossF;}
		@Override public void setLossFactor(double val){lossF=val;}
		@Override public String MOBMask(){return mask;}
		@Override public MaskingLibrary.CompiledZapperMask compiledMOBMask(){return compiledMask;}
		@Override
		public void setMOBMask(String str)
		{
			mask=str;
			compiledMask=CMLib.masking().maskCompile(str);
		}
		@Override public String toString(){ return gainF+";"+lossF+";"+mask; }
	}

	public class DefaultFactionReactionItem implements Faction.FReactionItem
	{
		private String reactionObjectID="";
		private String mobMask="";
		private String rangeName="";
		private String parms="";
		private MaskingLibrary.CompiledZapperMask compiledMobMask=null;
		@Override public String reactionObjectID(){return reactionObjectID;}
		@Override public void setReactionObjectID(String str){reactionObjectID=str;}
		@Override public String presentMOBMask(){return mobMask;}
		@Override
		public void setPresentMOBMask(String str)
		{
			mobMask=str;
			if((str==null)||(str.trim().length()==0))
				compiledMobMask=null;
			else
				compiledMobMask=CMLib.masking().maskCompile(str);
		}
		@Override public MaskingLibrary.CompiledZapperMask compiledPresentMOBMask(){ return compiledMobMask;}
		@Override public String rangeCodeName(){return rangeName;}
		@Override public void setRangeName(String str){rangeName=str.toUpperCase().trim();}
		@Override public String parameters(){return parms;}
		public String parameters(String name){ return CMStrings.replaceAll(parms,"<TARGET>", name);}
		@Override public void setParameters(String str){parms=str;}
		@Override public String toString(){ return rangeName+";"+mobMask+";"+reactionObjectID+";"+parms;}
		public DefaultFactionReactionItem(){}

		public DefaultFactionReactionItem(String key)
		{
			int x=key.indexOf(';');
			String str = key.substring(0,x).toUpperCase().trim();
			String rest = key.substring(x+1);
			setRangeName(str);

			x=rest.indexOf(';');
			str = rest.substring(0,x).trim();
			rest = rest.substring(x+1);
			setPresentMOBMask(str);

			x=rest.indexOf(';');
			str = rest.substring(0,x).trim();
			rest = rest.substring(x+1);
			setReactionObjectID(str);
			setParameters(rest);
		}

	}

	public class DefaultFactionAbilityUsage implements Faction.FAbilityUsage
	{
		public String ID="";
		public boolean possibleAbilityID=false;
		public int type=-1;
		public int domain=-1;
		public int flag=-1;
		public int low=0;
		public int high=0;
		public int notflag=-1;

		@Override public String abilityFlags(){return ID;}
		@Override public boolean possibleAbilityID(){return possibleAbilityID;}
		@Override public int type(){return type;}
		@Override public int domain(){return domain;}
		@Override public int flag(){return flag;}
		@Override public int low(){return low;}
		@Override public int high(){return high;}
		@Override public int notflag(){return notflag;}
		@Override public void setLow(int newVal){low=newVal;}
		@Override public void setHigh(int newVal){high=newVal;}

		public DefaultFactionAbilityUsage(){}
		public DefaultFactionAbilityUsage(String key)
		{
			final List<String> v = CMParms.parseSemicolons(key,false);
			setAbilityFlag(v.get(0));
			low = CMath.s_int( v.get(1));
			high = CMath.s_int( v.get(2));
		}
		@Override
		public String toString()
		{
			return ID+";"+low+";"+high;
		}

		@Override
		public List<String> setAbilityFlag(String str)
		{
			ID=str;
			final Vector<String> flags=CMParms.parse(ID);
			final Vector<String> unknowns=new Vector<String>();
			possibleAbilityID=false;
			for(int f=0;f<flags.size();f++)
			{
				String strflag=flags.elementAt(f);
				final boolean not=strflag.startsWith("!");
				if(not) strflag=strflag.substring(1);
				switch(CMLib.factions().getAbilityFlagType(strflag))
				{
				case 1:
					type=CMParms.indexOfIgnoreCase(Ability.ACODE_DESCS, strflag);
					break;
				case 2:
					domain=CMParms.indexOfIgnoreCase(Ability.DOMAIN_DESCS, strflag);
					break;
				case 3:
					final int val=CMParms.indexOfIgnoreCase(Ability.FLAG_DESCS, strflag);
					if(not)
					{
						if(notflag<0) notflag=0;
						notflag=notflag|(int)CMath.pow(2,val);
					}
					else
					{
						if(flag<0) flag=0;
						flag=flag|(int)CMath.pow(2,val);
					}
					break;
				default:
					unknowns.addElement(strflag);
					break;
				}
			}
			if((type<0)&&(domain<0)&&(flag<0))
				possibleAbilityID=true;
			return unknowns;
		}
	}

	@Override
	public void destroy()
	{
		CMLib.factions().removeFaction(this.factionID());
		this.destroyed=true;
		defaults.clear();
		autoDefaults.clear();
		ranges.clear();
		affBehavs.clear();
		changes.clear();
		abilityChangesCache.clear();
		factors.clear();
		relations.clear();
		abilityUsages.clear();
		choices.clear();
		reactions.clear();
		reactionHash.clear();
	}

	@Override public boolean isSavable() { return true; }
	@Override public void setSavable(boolean truefalse) {}