|  | @@ -1,38 +1,99 @@
 | 
	
		
			
				|  |  |  package me.hammerle.supersnuvi.gamelogic.pathfinding;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +import org.jgrapht.Graph;
 | 
	
		
			
				|  |  | +import org.jgrapht.GraphPath;
 | 
	
		
			
				|  |  | +import org.jgrapht.alg.shortestpath.ALTAdmissibleHeuristic;
 | 
	
		
			
				|  |  | +import org.jgrapht.alg.shortestpath.AStarShortestPath;
 | 
	
		
			
				|  |  | +import org.jgrapht.graph.DefaultUndirectedWeightedGraph;
 | 
	
		
			
				|  |  | +import org.jgrapht.graph.DefaultWeightedEdge;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import java.util.HashMap;
 | 
	
		
			
				|  |  |  import java.util.HashSet;
 | 
	
		
			
				|  |  | +import java.util.Map;
 | 
	
		
			
				|  |  |  import java.util.Set;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -/**
 | 
	
		
			
				|  |  | - * level representation as graph
 | 
	
		
			
				|  |  | - * used to apply path finding for entities
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -public class LevelGraph implements IGraph, IModifieableGraph {
 | 
	
		
			
				|  |  | +public class LevelGraph {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    protected Map<String, LevelGraphVertex> vertices;
 | 
	
		
			
				|  |  | +    protected Graph<LevelGraphVertex, DefaultWeightedEdge> graph;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private LevelGraphVertexCalculator vertexCalculator;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public LevelGraph() {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        vertices = new HashMap<>();
 | 
	
		
			
				|  |  | +        graph = new DefaultUndirectedWeightedGraph<>(DefaultWeightedEdge.class);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        vertexCalculator = new LevelGraphVertexCalculator();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public void addVertex(int x, int y){
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        String key = generateKeyForVertex(x, y);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if(!vertices.containsKey(key)){
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            LevelGraphVertex vertex = new LevelGraphVertex(x, y);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            vertices.put(key, vertex);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    private Set<LevelGraphNode> nodes;
 | 
	
		
			
				|  |  | +            graph.addVertex(vertex);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +//    public void removeVertex(int x, int y){
 | 
	
		
			
				|  |  | +//
 | 
	
		
			
				|  |  | +//        String key = generateKeyForVertex(x, y);
 | 
	
		
			
				|  |  | +//
 | 
	
		
			
				|  |  | +//        if(vertices.containsKey(key)){
 | 
	
		
			
				|  |  | +//
 | 
	
		
			
				|  |  | +//            graph.removeVertex(vertices.get(key));
 | 
	
		
			
				|  |  | +//            vertices.remove(key);
 | 
	
		
			
				|  |  | +//        }
 | 
	
		
			
				|  |  | +//    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private LevelGraphVertex getVertexAt(int x, int y){
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    public LevelGraph(){
 | 
	
		
			
				|  |  | +        String key = generateKeyForVertex(x, y);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        nodes = new HashSet<>();
 | 
	
		
			
				|  |  | +        return vertices.getOrDefault(key, null);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    public void addEdge(int startX, int startY, int endX, int endY){
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public Set<LevelGraphNode> getNodes() {
 | 
	
		
			
				|  |  | -        return nodes;
 | 
	
		
			
				|  |  | +        LevelGraphVertex start = getVertexAt(startX, startY);
 | 
	
		
			
				|  |  | +        LevelGraphVertex end = getVertexAt(endX, endY);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if(start != null && end != null){
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            DefaultWeightedEdge edge = graph.addEdge(start, end);
 | 
	
		
			
				|  |  | +            graph.setEdgeWeight(edge, vertexCalculator.calculateWeightBetween(start, end));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public void addNode(INode node) {
 | 
	
		
			
				|  |  | +    public Object doo() {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        if(node instanceof LevelGraphNode)
 | 
	
		
			
				|  |  | -            nodes.add((LevelGraphNode) node);
 | 
	
		
			
				|  |  | +        Set<LevelGraphVertex> landmarks = new HashSet<>();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        for(LevelGraphVertex vertex : vertices.values()){
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            landmarks.add(vertex);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        ALTAdmissibleHeuristic<LevelGraphVertex, DefaultWeightedEdge> heuristic = new ALTAdmissibleHeuristic<>(graph, landmarks);
 | 
	
		
			
				|  |  | +        AStarShortestPath<LevelGraphVertex, DefaultWeightedEdge> astar = new AStarShortestPath<>(graph, heuristic);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        GraphPath<LevelGraphVertex, DefaultWeightedEdge> path = astar.getPath(getVertexAt(36, 10), getVertexAt(32,13));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return path;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public void removeNode(INode node) {
 | 
	
		
			
				|  |  | +    private String generateKeyForVertex(int x, int y){
 | 
	
		
			
				|  |  | +        return x + ":" + y;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        if(node instanceof LevelGraphNode)
 | 
	
		
			
				|  |  | -            nodes.remove(node);
 | 
	
		
			
				|  |  | +    Graph<LevelGraphVertex, DefaultWeightedEdge> getGraph() {
 | 
	
		
			
				|  |  | +        return graph;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 |