/**
*
*/
package rampancy.leela;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.util.*;
import rampancy.*;
import rampancy.standard.RDefaultSurfingSegmentArray;
import rampancy.util.*;
import rampancy.util.movement.*;
import rampancy.util.vector.*;
import rampancy.util.wave.REnemyWave;
import rampancy.util.wave.REnemyWaveWithStats;
/**
* @author Matthew Chun-Lum
*
*/
public class RMeleMovementManager implements RMovementManager {
private RampantRobot reference;
private RVectorField vectorField;
private HashMap<String, RRepulsiveObject> repulsiveObjects;
private RVector lastMoveVector;
public RMeleMovementManager(RampantRobot reference) {
this.reference = reference;
double width = reference.getBattleFieldWidth();
double height = reference.getBattleFieldHeight();
vectorField = new RVectorField(width, height, 0.02);
setupRepulsiveObjects();
}
public RMoveChoice computeBestMove(REnemyRobot enemy) {
updateRepulsivePoints(enemy);
updateVectorField(enemy);
lastMoveVector = new RVector(reference.getLocation());
for(RRepulsiveObject point : repulsiveObjects.values()) {
RVector force = point.getForceAtPoint(reference.getLocation());
if(force != null && force.magnitude > 0) {
lastMoveVector.add(force);
}
}
if(lastMoveVector.magnitude == 0)
return null;
RPoint endPoint = lastMoveVector.getEndPoint();
return new RMoveChoice(endPoint, lastMoveVector.getAngle(), 100, 8, 0, 0, 0, 0);
}
public void draw(Graphics2D g) {
if(vectorField != null)
vectorField.draw(g);
if(lastMoveVector != null)
lastMoveVector.draw(g);
}
public void updateReference(RampantRobot reference) {
this.reference = reference;
setupRepulsiveObjects();
}
public void removeWave(REnemyWave wave) {
repulsiveObjects.remove(wave.hashCode() + "");
}
private void updateRepulsivePoints(REnemyRobot enemy) {
List<REnemyWave> waves = RampantRobot.getWaveManager().getEnemyWaves();
for(REnemyWave wave : waves) {
if(wave instanceof REnemyWaveWithStats) {
REnemyWaveWithStats eWave = (REnemyWaveWithStats) wave;
double angle = RUtil.computeAbsoluteBearing(eWave.getOrigin(), reference.getLocation());
RPoint dangerPoint = RUtil.project(eWave.getOrigin(), angle, eWave.getDistanceTraveled());
double danger = eWave.getDangerForLocation(dangerPoint, RDefaultSurfingSegmentArray.NUM_GUESS_FACTORS);
repulsiveObjects.put(wave.hashCode() + "", new RRepulsivePoint(dangerPoint, 200, 1000, 100));
}
}
repulsiveObjects.put(enemy.getName(),
new RRepulsivePoint(enemy.getCurrentState().location.getCopy(), 300, 3000, 100));
}
private void updateVectorField(REnemyRobot enemy) {
vectorField.update(repulsiveObjects.values());
}
private void setupRepulsiveObjects() {
double width = reference.getBattleFieldWidth();
double height = reference.getBattleFieldHeight();
repulsiveObjects = new HashMap<String, RRepulsiveObject>();
Rectangle bfRect = RampantRobot.getGlobalBattlefield().innerRect;
repulsiveObjects.put("Center", new RRepulsivePoint(width / 2, height / 2, 200, 1000, 1.5));
repulsiveObjects.put("Lower Left", new RRepulsivePoint(bfRect.x, bfRect.y, 150, 200000, 1));
repulsiveObjects.put("Lower Right", new RRepulsivePoint(bfRect.getMaxX(), bfRect.y, 150, 200000, 1));
repulsiveObjects.put("Upper Left", new RRepulsivePoint(bfRect.x, bfRect.getMaxY(), 150, 200000, 1));
repulsiveObjects.put("Upper Right", new RRepulsivePoint(bfRect.getMaxX(), bfRect.getMaxY(), 150, 200000, 1));
repulsiveObjects.put("Left Wall", new RRepulsiveLine(bfRect.x, bfRect.y, bfRect.x, bfRect.getMaxY(), 75, 20000, 1.0));
repulsiveObjects.put("Right Wall", new RRepulsiveLine(bfRect.getMaxX(), bfRect.y, bfRect.getMaxX(), bfRect.getMaxY(), 75, 20000, 1.0));
repulsiveObjects.put("Top Wall", new RRepulsiveLine(bfRect.x, bfRect.getMaxY(), bfRect.getMaxX(), bfRect.getMaxY(), 75, 20000, 1.0));
repulsiveObjects.put("Bottom Wall", new RRepulsiveLine(bfRect.x, bfRect.y, bfRect.getMaxX(), bfRect.y, 75, 20000, 1.0));
}
}