package com.akjava.gwt.lib.client.game;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import com.akjava.lib.common.repackaged.org.apache.xmlgraphics.util.DefaultEdgeDirectory;
import com.akjava.lib.common.repackaged.org.apache.xmlgraphics.util.DijkstraAlgorithm;
public class SimpleMapResolver {
private int[][] map;
private List<Integer> wallNumbers;
public SimpleMapResolver(int[][] mapDataYX,List<Integer> wallNumbers){
this.map=mapDataYX;
this.wallNumbers=wallNumbers;
}
/**
*
* @param start
* @param goal
* @return route from start to goal,warn start included but goal not contain.
*/
public ArrayList<PtVertex> resolveMap(PtVertex start,PtVertex goal){
HashMap<String,PtVertex> hmap=new HashMap<String,PtVertex>();
hmap.put(start.toString(), start);
hmap.put(goal.toString(), goal);
DefaultEdgeDirectory directory=mapToDirectory(hmap,map,wallNumbers);
ArrayList<PtVertex> route=new ArrayList<PtVertex>();
DijkstraAlgorithm di=new DijkstraAlgorithm(directory);
di.execute(start, goal);
PtVertex v=goal;
//System.out.println("goal:"+v);
while(v!=null){
v=(PtVertex) di.getPredecessor(v);
if(v!=null){
route.add(0,v);
//route.add(route.size(),v);
}
}
return route;
}
public static DefaultEdgeDirectory mapToDirectory(HashMap<String,PtVertex> pts,int[][] map,List<Integer> wallNumbers){
DefaultEdgeDirectory directory=new DefaultEdgeDirectory();
for(int y=0;y<map.length;y++){
for(int x=0;x<map[y].length;x++){
if(map[y][x]==0){ // i have no idea.
System.out.println("maybe invalid 0 on map mode:"+x+","+y);
}
String label=x+"x"+y;
PtVertex pt=pts.get(label);
int ptPenalty=map[y][x];
if(pt==null){
pt=new PtVertex(x,y);
pts.put(label, pt);
}
//get right - left
LOOP:if(x+1<map[y].length){
if(wallNumbers.contains(map[y][x+1])){
break LOOP;
}
String label2=(x+1)+"x"+y;
int pt2Penalty=map[y][x+1];
PtVertex pt2=pts.get(label2);
if(pt2==null){
pt2=new PtVertex(x+1,y);
pts.put(label2, pt2);
}
//each eay
directory.addEdge(new PtEdge(pt, pt2,pt2Penalty));
directory.addEdge(new PtEdge(pt2, pt,ptPenalty));
//System.out.println("add:"+pt+","+pt2);
}
//get up - down
LOOP:if(y+1<map.length){
if(wallNumbers.contains(map[y+1][x])){
break LOOP;
}
String label2=x+"x"+(y+1);
int pt2Penalty=map[y+1][x];
PtVertex pt2=pts.get(label2);
if(pt2==null){
pt2=new PtVertex(x,y+1);
pts.put(label2, pt2);
}
directory.addEdge(new PtEdge(pt, pt2,pt2Penalty));
directory.addEdge(new PtEdge(pt2, pt,ptPenalty));
//System.out.println("add:"+pt+","+pt2);
}
}
}
return directory;
}
}