package com.planet_ink.coffee_mud.Libraries.layouts;
import java.util.*;
import com.planet_ink.coffee_mud.core.Directions;
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.LayoutTypes;
public class CrossLayout extends AbstractLayout
{
public String name() { return "CROSS";}
public void addRoom(LayoutSet lSet, LayoutNode n2, int dir)
{
if(lSet.spaceAvailable())
{
LayoutNode nn = lSet.getNextNode(n2,dir);
if(nn == null)
{
nn = lSet.makeNextNode(n2,dir);
lSet.use(nn,LayoutTypes.leaf);
n2.crossLink(nn);
}
}
}
public Vector<LayoutNode> generate(int num, int dir) {
Vector<LayoutNode> set = new Vector<LayoutNode>();
int diameter = (num / 3 / 2) + 1;
LayoutSet lSet = new LayoutSet(set,num);
LayoutNode n = new DefaultLayoutNode(new long[]{0,0});
LayoutNode firstNode = n;
for(int x=0;x<diameter;x++)
{
lSet.use(n,LayoutTypes.street);
n.flagRun(LayoutRuns.ns);
LayoutNode nn = lSet.getNextNode(n, Directions.NORTH);
if(nn==null) nn=lSet.makeNextNode(n, Directions.NORTH);
n.crossLink(nn);
n=nn;
}
n.flagRun(LayoutRuns.ns);
lSet.use(n,LayoutTypes.street);
if(dir==Directions.SOUTH) firstNode=n;
n = new DefaultLayoutNode(new long[]{-(diameter/2),-(diameter/2)});
if(dir==Directions.EAST) firstNode=n;
for(int x=0;x<diameter;x++)
{
lSet.use(n,LayoutTypes.street);
n.flagRun(LayoutRuns.ew);
LayoutNode nn = lSet.getNextNode(n, Directions.EAST);
if(nn==null) nn = lSet.makeNextNode(n, Directions.EAST);
n.crossLink(nn);
n=nn;
}
lSet.use(n,LayoutTypes.street);
n.flagRun(LayoutRuns.ew);
if(dir==Directions.WEST) firstNode=n;
@SuppressWarnings("unchecked")
Vector<LayoutNode> corridors = (Vector<LayoutNode>)set.clone();
int x = 0;
for(LayoutNode n2 : corridors)
{
if(x<diameter)
{
addRoom(lSet,n2,Directions.EAST);
addRoom(lSet,n2,Directions.WEST);
}
else
{
addRoom(lSet,n2,Directions.NORTH);
addRoom(lSet,n2,Directions.SOUTH);
}
x++;
}
lSet.fillInFlags();
set.remove(firstNode);
set.insertElementAt(firstNode,0);
return set;
}
}