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);
}
}