package com.planet_ink.coffee_mud.Libraries.layouts;
import java.util.Vector;
import com.planet_ink.coffee_mud.core.Directions;
import com.planet_ink.coffee_mud.core.Log;
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 GridCityLayout extends AbstractLayout
{
public String name() { return "GRIDCITY";}
public Vector<LayoutNode> generate(int num, int dir)
{
Vector<LayoutNode> set = new Vector<LayoutNode>();
int diameter = (int)Math.round(Math.sqrt((double)num));
int plusX = (diff(diameter,diameter,num) > diff(diameter+1,diameter,num)) ? 1 : 0;
LayoutSet lSet = new LayoutSet(set,num);
lSet.drawABox(diameter+plusX,diameter);
int middle=(diameter+plusX)/2;
LayoutNode firstNode=null;
for(int x=0;x<diameter+plusX;x+=2)
{
LayoutNode n = lSet.getNode(new long[]{x,0});
if(n!=null)
{
if((dir==Directions.NORTH)&&(x>=middle-1)&&(x<=middle+1))
firstNode=n;
for(int y=0;y<diameter-1;y++)
{
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;
}
lSet.use(n,LayoutTypes.street);
n.flagRun(LayoutRuns.ns);
if((dir==Directions.SOUTH)&&(x>=middle-1)&&(x<=middle+1))
firstNode=n;
}
}
int endX=diameter+plusX-1;
middle=(-diameter+1)/2;
for(int y=-2;y>=-diameter+1;y-=2)
{
LayoutNode n = lSet.getNode(new long[]{0,y});
if(n!=null)
{
if((dir==Directions.EAST)&&(y>=middle-1)&&(y<=middle+1))
firstNode=n;
for(int x=0;x<endX;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)&&(y>=middle-1)&&(y<=middle+1))
firstNode=n;
}
}
boolean north=true;
for(int y=0;y>=(-diameter)+1;y-=2)
{
for(int x=1;x<endX;x++)
{
LayoutNode n = lSet.getNode(new long[]{x,y});
LayoutNode nn = lSet.getNextNode(n, Directions.NORTH);
if(nn==null)
{
if(north)
{
if(y>(-diameter)+2)
{
nn = lSet.makeNextNode( n, Directions.NORTH);
}
}
if(nn != null)
{
n.crossLink(nn);
lSet.use(nn,LayoutTypes.interior);
}
north = !north;
}
}
}
for(int y=-2;y>=(-diameter)+1;y-=2)
{
for(int x=1;x<endX;x++)
{
LayoutNode n = lSet.getNode(new long[]{x,y});
LayoutNode nn = lSet.getNextNode(n, Directions.SOUTH);
if(nn==null)
{
nn = lSet.makeNextNode( n, Directions.SOUTH);
if(nn != null)
{
n.crossLink(nn);
lSet.use(nn,LayoutTypes.interior);
}
}
}
}
lSet.fillInFlags();
if(firstNode != null)
{
set.remove(firstNode);
set.insertElementAt(firstNode, 0);
}
else
Log.errOut("GridCityLayout","Not able to find start room for direction: "+dir);
return set;
}
}