package com.planet_ink.coffee_mud.Libraries.layouts;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Hashtable;
import com.planet_ink.coffee_mud.Libraries.interfaces.AreaGenerationLibrary.LayoutFlags;
import com.planet_ink.coffee_mud.Libraries.interfaces.AreaGenerationLibrary.LayoutNode;
import com.planet_ink.coffee_mud.Libraries.interfaces.AreaGenerationLibrary.LayoutRuns;
import com.planet_ink.coffee_mud.Libraries.interfaces.AreaGenerationLibrary.LayoutTags;
import com.planet_ink.coffee_mud.Libraries.interfaces.AreaGenerationLibrary.LayoutTypes;
import com.planet_ink.coffee_mud.Locales.interfaces.Room;
import com.planet_ink.coffee_mud.core.Directions;
public class DefaultLayoutNode implements LayoutNode
{
public long[] coord;
public Room associatedRoom = null;
public Hashtable<Integer,LayoutNode> links = new Hashtable<Integer,LayoutNode>();
private Hashtable<LayoutTags,String> tags = new Hashtable<LayoutTags,String>();
private HashSet<LayoutFlags> flags = new HashSet<LayoutFlags>();
public DefaultLayoutNode(long[] coord) {
this.coord = coord;
}
public DefaultLayoutNode(long x, long y) {
this.coord = new long[]{x,y};
}
public Room room() { return associatedRoom;}
public void setRoom(Room room){associatedRoom=room;}
public long[] coord(){ return coord;}
public Hashtable<LayoutTags,String> tags(){ return tags;}
public Hashtable<Integer,LayoutNode> links() { return links;}
public void crossLink(LayoutNode to) {
links.put(Integer.valueOf(AbstractLayout.getDirection(this,to)),to);
to.links().put(Integer.valueOf(AbstractLayout.getDirection(to,this)),this);
}
public boolean isFlagged(LayoutFlags flag) { return flags.contains(flag);}
public LayoutRuns getFlagRuns(){
if(tags.containsKey(LayoutTags.NODERUN))
return LayoutRuns.valueOf(tags.get(LayoutTags.NODERUN));
return null;
}
public void delLink(LayoutNode linkNode) {
for(Enumeration<Integer> e=links.keys();e.hasMoreElements();)
{
Integer key=e.nextElement();
if(links.get(key)==linkNode)
links.remove(key);
}
}
public LayoutNode getLink(int d) { return links.get(Integer.valueOf(d));}
public boolean isStreetLike() {
if(links.size()!=2) return false;
Enumeration<LayoutNode> linksE=links.elements();
LayoutNode n1=linksE.nextElement();
LayoutNode n2=linksE.nextElement();
int d1=AbstractLayout.getDirection(this, n1);
int d2=AbstractLayout.getDirection(this, n2);
switch(d1)
{
case Directions.NORTH: return d2==Directions.SOUTH;
case Directions.SOUTH: return d2==Directions.NORTH;
case Directions.EAST: return d2==Directions.WEST;
case Directions.WEST: return d2==Directions.EAST;
}
return false;
}
public void deLink() {
for(Enumeration<Integer> e=links.keys();e.hasMoreElements();)
{
Integer key=e.nextElement();
LayoutNode linkNode=links.get(key);
linkNode.delLink(this);
}
links.clear();
}
public String toString() {
String s= "("+coord[0]+","+coord[1]+") ->";
for(LayoutNode n : links.values())
s+= "("+n.coord()[0]+","+n.coord()[1]+"), ";
return s;
}
public void flag(LayoutFlags flag) {
String s=tags.get(LayoutTags.NODEFLAGS);
flags.add(flag);
if(s==null)
tags.put(LayoutTags.NODEFLAGS,","+flag.toString()+",");
else
if(s.indexOf(","+flag.toString()+",")<0)
tags.put(LayoutTags.NODEFLAGS,s+flag.toString()+",");
}
public void flagRun(LayoutRuns run) {
tags.put(LayoutTags.NODERUN,run.toString());
}
public LayoutTypes type(){ return LayoutTypes.valueOf(tags.get(LayoutTags.NODETYPE));}
public void setExits(int[] dirs) {
StringBuffer buf=new StringBuffer(",");
for(int d=0;d<Directions.NUM_DIRECTIONS();d++)
for(int i=0;i<dirs.length;i++)
if(dirs[i]==d)
{
buf.append(Directions.getDirectionChar(d).toLowerCase())
.append(",");
}
tags.put(LayoutTags.NODEEXITS,buf.toString());
}
public void flagGateExit(int dir) {
tags.put(LayoutTags.NODEGATEEXIT,Directions.getDirectionChar(dir).toLowerCase());
}
public void reType(LayoutTypes type) {
tags.put(LayoutTags.NODETYPE,type.toString());
}
public String getColorRepresentation(int line) {
switch(line)
{
case 0:
if(links.containsKey(Integer.valueOf(Directions.NORTH)))
return " ^ ";
return " ";
case 1:
{
if(links.containsKey(Integer.valueOf(Directions.EAST)))
{
if(links.containsKey(Integer.valueOf(Directions.WEST)))
return "<*>";
return " *>";
}
else
if(links.containsKey(Integer.valueOf(Directions.WEST)))
return "<* ";
return " * ";
}
case 2:
if(links.containsKey(Integer.valueOf(Directions.SOUTH)))
return " v ";
return " ";
default: return " ";
}
}
}