/
com/planet_ink/coffee_mud/Abilities/Common/
com/planet_ink/coffee_mud/Abilities/Diseases/
com/planet_ink/coffee_mud/Abilities/Druid/
com/planet_ink/coffee_mud/Abilities/Fighter/
com/planet_ink/coffee_mud/Abilities/Languages/
com/planet_ink/coffee_mud/Abilities/Misc/
com/planet_ink/coffee_mud/Abilities/Prayers/
com/planet_ink/coffee_mud/Abilities/Properties/
com/planet_ink/coffee_mud/Abilities/Skills/
com/planet_ink/coffee_mud/Abilities/Songs/
com/planet_ink/coffee_mud/Abilities/Spells/
com/planet_ink/coffee_mud/Abilities/Thief/
com/planet_ink/coffee_mud/Abilities/Traps/
com/planet_ink/coffee_mud/Behaviors/
com/planet_ink/coffee_mud/CharClasses/interfaces/
com/planet_ink/coffee_mud/Commands/
com/planet_ink/coffee_mud/Commands/interfaces/
com/planet_ink/coffee_mud/Common/
com/planet_ink/coffee_mud/Common/interfaces/
com/planet_ink/coffee_mud/Exits/interfaces/
com/planet_ink/coffee_mud/Items/Armor/
com/planet_ink/coffee_mud/Items/Basic/
com/planet_ink/coffee_mud/Items/CompTech/
com/planet_ink/coffee_mud/Items/MiscMagic/
com/planet_ink/coffee_mud/Items/Weapons/
com/planet_ink/coffee_mud/Items/interfaces/
com/planet_ink/coffee_mud/Libraries/
com/planet_ink/coffee_mud/Libraries/interfaces/
com/planet_ink/coffee_mud/Locales/
com/planet_ink/coffee_mud/MOBS/
com/planet_ink/coffee_mud/Races/
com/planet_ink/coffee_mud/Races/interfaces/
com/planet_ink/coffee_mud/WebMacros/
com/planet_ink/coffee_mud/WebMacros/interfaces/
com/planet_ink/coffee_mud/core/
com/planet_ink/coffee_mud/core/collections/
com/planet_ink/coffee_mud/core/interfaces/
com/planet_ink/coffee_mud/core/intermud/
com/planet_ink/coffee_mud/core/intermud/i3/
com/planet_ink/coffee_web/server/
com/planet_ink/siplet/applet/
lib/
resources/factions/
resources/fakedb/
resources/progs/autoplayer/
resources/quests/holidays/
web/
web/admin.templates/
web/admin/grinder/
web/admin/images/
web/clan.templates/
web/pub.templates/
web/pub/images/mxp/
web/pub/sounds/
web/pub/textedit/
package com.planet_ink.coffee_mud.Items.CompTech;
import com.planet_ink.coffee_mud.core.interfaces.*;
import com.planet_ink.coffee_mud.core.*;
import com.planet_ink.coffee_mud.core.collections.*;
import com.planet_ink.coffee_mud.Abilities.interfaces.*;
import com.planet_ink.coffee_mud.Areas.interfaces.*;
import com.planet_ink.coffee_mud.Behaviors.interfaces.*;
import com.planet_ink.coffee_mud.CharClasses.interfaces.*;
import com.planet_ink.coffee_mud.Commands.interfaces.*;
import com.planet_ink.coffee_mud.Common.interfaces.*;
import com.planet_ink.coffee_mud.Exits.interfaces.*;
import com.planet_ink.coffee_mud.Items.interfaces.*;
import com.planet_ink.coffee_mud.Libraries.interfaces.GenericBuilder;
import com.planet_ink.coffee_mud.Locales.interfaces.*;
import com.planet_ink.coffee_mud.MOBS.interfaces.*;
import com.planet_ink.coffee_mud.Races.interfaces.*;

import java.util.*;

/*
   Copyright 2015-2016 Bo Zimmerman

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

	   http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
*/
public class GenGraviticSensor extends GenElecCompSensor
{
	@Override
	public String ID()
	{
		return "GenGraviticSensor";
	}

	public GenGraviticSensor()
	{
		super();
		setName("a gravitic sensor");
		setDisplayText("a gravitic sensor sits here.");
		setDescription("");
	}
	
	@Override
	protected long getSensorMaxRange()
	{
		return SpaceObject.Distance.Parsec.dm;
	}

	@Override
	protected Converter<SpaceObject, Environmental> getSensedObjectConverter()
	{
		return new Converter<SpaceObject, Environmental>()
		{
			@Override
			public Environmental convert(final SpaceObject obj)
			{
				final SpaceObject spaceMe = CMLib.map().getSpaceObject(me, true);
				final long distance = CMLib.map().getDistanceFrom(spaceMe.coordinates(), obj.coordinates()) - spaceMe.radius() - obj.radius();
				final double[] direction = CMLib.map().getDirection(spaceMe, obj);
				final String name = L("an object of mass @x1",CMath.abbreviateLong(obj.getMass()));
				final String displayText = L("An object of mass @x1 at @x2, distance: @x3",
											CMath.abbreviateLong(obj.getMass()),
											CMLib.english().directionDescShort(direction),
											CMLib.english().distanceDescShort(distance));
				final String description = displayText + L(". The object has an approximate radius of @x1.", CMLib.english().sizeDescShort(obj.radius()));
				return new SpaceObject() 
				{
					@Override
					public String Name()
					{
						return name;
					}
	
					@Override
					public void setName(String newName)
					{
					}
	
					@Override
					public String displayText()
					{
						return displayText;
					}
	
					@Override
					public void setDisplayText(String newDisplayText)
					{
					}
	
					@Override
					public String description()
					{
						return description;
					}
	
					@Override
					public void setDescription(String newDescription)
					{
					}
	
					@Override
					public String image()
					{
						return null;
					}
	
					@Override
					public String rawImage()
					{
						return null;
					}
	
					@Override
					public void setImage(String newImage)
					{
					}
	
					@Override
					public boolean isGeneric()
					{
						return false;
					}
	
					@Override
					public void setMiscText(String newMiscText)
					{
					}
	
					@Override
					public String text()
					{
						return "";
					}
	
					@Override
					public String miscTextFormat()
					{
						return null;
					}
	
					@Override
					public boolean sameAs(Environmental E)
					{
						return E==this || E==obj;
					}
	
					@Override
					public long expirationDate()
					{
						return 0;
					}
	
					@Override
					public void setExpirationDate(long dateTime)
					{
					}
	
					@Override
					public int maxRange()
					{
						return 0;
					}
	
					@Override
					public int minRange()
					{
						return 0;
					}
	
					@Override
					public String L(String str, String... xs)
					{
						return str;
					}
	
					@Override
					public String name()
					{
						return Name();
					}
	
					@Override
					public int getTickStatus()
					{
						return 0;
					}
	
					@Override
					public boolean tick(Tickable ticking, int tickID)
					{
						return false;
					}
	
					@Override
					public String ID()
					{
						return obj.ID();
					}
	
					@Override
					public CMObject newInstance()
					{
						return obj.newInstance();
					}
	
					@Override
					public CMObject copyOf()
					{
						return obj.copyOf();
					}
	
					@Override
					public void initializeClass()
					{
					}
	
					@Override
					public int compareTo(CMObject o)
					{
						return obj.compareTo(o);
					}
	
					@Override
					public void affectPhyStats(Physical affected, PhyStats affectableStats)
					{
					}
	
					@Override
					public void affectCharStats(MOB affectedMob, CharStats affectableStats)
					{
					}
	
					@Override
					public void affectCharState(MOB affectedMob, CharState affectableMaxState)
					{
					}
	
					@Override
					public void executeMsg(Environmental myHost, CMMsg msg)
					{
					}
	
					@Override
					public boolean okMessage(Environmental myHost, CMMsg msg)
					{
						return true;
					}
	
					@Override
					public void destroy()
					{
						// Nope!
					}
	
					@Override
					public boolean isSavable()
					{
						return false;
					}
	
					@Override
					public boolean amDestroyed()
					{
						return obj.amDestroyed();
					}
	
					@Override
					public void setSavable(boolean truefalse)
					{
					}
	
					@Override
					public String[] getStatCodes()
					{
						return new String[0];
					}
	
					@Override
					public int getSaveStatIndex()
					{
						return 0;
					}
	
					@Override
					public String getStat(String code)
					{
						return "";
					}
	
					@Override
					public boolean isStat(String code)
					{
						return false;
					}
	
					@Override
					public void setStat(String code, String val)
					{
					}
	
					@Override
					public BoundedCube getBounds()
					{
						return obj.getBounds();
					}
	
					@Override
					public long[] coordinates()
					{
						return new long[]{0,0,0};
					}
	
					@Override
					public void setCoords(long[] coords)
					{
					}
	
					@Override
					public long radius()
					{
						return 0;
					}
	
					@Override
					public void setRadius(long radius)
					{
					}
	
					@Override
					public double[] direction()
					{
						return new double[]{0,0};
					}
	
					@Override
					public void setDirection(double[] dir)
					{
					}
	
					@Override
					public double speed()
					{
						return 0;
					}
	
					@Override
					public void setSpeed(double v)
					{
					}
	
					@Override
					public SpaceObject knownTarget()
					{
						return null;
					}
	
					@Override
					public void setKnownTarget(SpaceObject O)
					{
					}
	
					@Override
					public SpaceObject knownSource()
					{
						return obj;
					}
	
					@Override
					public void setKnownSource(SpaceObject O)
					{
					}
	
					@Override
					public long getMass()
					{
						return obj.getMass();
					}
				};
			}
		};
	}
	
	protected static SpaceObject star = null;
	
	protected long getMassDetected()
	{
		if(star == null)
		{
			star = (SpaceObject)CMClass.getBasicItem("Star");
		}
		return star.getMass();
	}

	@Override
	protected Filterer<SpaceObject> getSensedObjectFilter()
	{
		return new Filterer<SpaceObject>()
		{
			final SpaceObject spaceMe = CMLib.map().getSpaceObject(me, true);
			@Override
			public boolean passesFilter(SpaceObject obj)
			{
				if((spaceMe == null)||(me == obj)||(spaceMe == obj))
					return false;
				final long distance = CMLib.map().getDistanceFrom(spaceMe.coordinates(), obj.coordinates());
				final long adjustedMax = Math.round(obj.getMass() * (1.0 - CMath.div(distance, getSensorMaxRange())));
				// tiny objects are not detected, nor ships at great distance, nor things inside us
				return (adjustedMax > 100) && (distance > obj.radius() + spaceMe.radius()); 
			}
		};
	}

	@Override
	public boolean sameAs(Environmental E)
	{
		if(!(E instanceof GenGraviticSensor))
			return false;
		return super.sameAs(E);
	}
}