GITS/Targeting/Source
Jump to navigation
Jump to search
GITS Targeting (Source) - from version 0.5-051509
public void onScannedRobot(ScannedRobotEvent e) {
double rSweep = 0.99; //RadarSweep tweak
double myX = getX();
double myY = getY();
double aBearing = (getHeadingRadians() + e.getBearingRadians());
double hisX = (getX() + e.getDistance() * Math.sin(aBearing));
double hisY = (getY() + e.getDistance() * Math.cos(aBearing));
double eAbsBearing = e.getBearingRadians() + getHeadingRadians(); //Enemy Absolute Bearing
double eHeading = e.getHeadingRadians();
double eHeadingChange = eHeading - _eHeading; //Heading data for later
_eHeading = eHeading; //Update the enemy heading
double eVelocity = e.getVelocity();
double eLatVel = eVelocity*Math.sin(eHeading - eAbsBearing); //Enemy Lateral Velocity
double eDistance = e.getDistance();
double eEnergy = e.getEnergy();
double dTime = 0;
double fHeight = getBattleFieldHeight(),
fWidth = getBattleFieldWidth();
double aHisX = hisX, aHisY = hisY;
int GBM = (eVelocity < 0 ? -1 : 1); //Going Backwards Multiplier
int MCV = 0; //Most Common Velocity
int eAbsVelocity = (int)Math.round(Math.abs(eVelocity));
_vCounts[eAbsVelocity]++;
int _MCV = _vCounts[0];
//A bunch of bullet calulations
double MBP = (eEnergy > 15.9 ? 3.0 : //If Enemy's Energy is at or over 16 points
(eEnergy > 7.9 ? 2.0 : //If Enemy's Energy is at or over 8 points
(eEnergy > 3.9 ? 1.0 : 0.5))); //Everything else, basically
double bPower = Math.min(MBP,getEnergy()); //Figure out the max you can spend on firing a bullet
double bVelocity = (20 - (3 * bPower));
//Historical Velocity Recall
for (int i = 1; i < 9; i++) {
if(_vCounts[i] > _MCV) {
_MCV = _vCounts[i];
MCV = i;
}
}
while((++dTime) * bVelocity < Point2D.Double.distance(myX, myY, aHisX, aHisY)) {
aHisX += (Math.sin(eHeading) * eVelocity);
aHisY += (Math.cos(eHeading) * eVelocity);
eHeading += eHeadingChange;
if(aHisX < 20.0 || aHisX > (fWidth - 20.0) || aHisY < 20.0 || aHisY > (fHeight - 20.0)) {
aHisX = Math.min(Math.max(20.0, aHisX), (fWidth - 20.0));
aHisY = Math.min(Math.max(20.0, aHisY), (fHeight - 20.0));
break;
}
}
double theta = Utils.normalAbsoluteAngle(Math.atan2((aHisX - getX()), (aHisY - getY())));
//Set and Execute Things
setTurnGunRightRadians(Utils.normalRelativeAngle(theta - getGunHeadingRadians()));
setTurnRadarRightRadians((rSweep)*Utils.normalRelativeAngle(aBearing - getRadarHeadingRadians()));
execute();
if(eEnergy >= (0.025 * eDistance)) { setFire(bPower); } //PowerConserve tweak
}
Currently, this targeting formula works for simple robots 90% of the time. It's rubbish against most advanced robots. Feel free to improve/comment on it so I can learn (since tutorials are utterly useless on me, I need visual aids).