package mhfc.net.common.world.controller;
public enum CornerType {
// Counter-clockwise
DOWN_RIGHT(true, Direction.DOWN, Direction.RIGHT),
RIGHT_UP(true, Direction.RIGHT, Direction.UP),
UP_LEFT(true, Direction.UP, Direction.LEFT),
LEFT_DOWN(true, Direction.LEFT, Direction.DOWN),
DOWN_LEFT(false, Direction.DOWN, Direction.LEFT),
LEFT_UP(false, Direction.LEFT, Direction.UP),
UP_RIGHT(false, Direction.UP, Direction.RIGHT),
RIGHT_DOWN(false, Direction.RIGHT, Direction.DOWN);
public final boolean isOuter;
public final Direction incoming, outgoing;
private CornerType(boolean isOuter, Direction from, Direction to) {
this.isOuter = isOuter;
this.incoming = from;
this.outgoing = to;
}
public boolean isOuter() {
return isOuter;
}
public static CornerType fromIncoming(Direction dir, boolean outer) {
switch (dir) {
case RIGHT:
return outer ? CornerType.RIGHT_UP : RIGHT_DOWN;
case UP:
return outer ? CornerType.UP_LEFT : UP_RIGHT;
case LEFT:
return outer ? LEFT_DOWN : LEFT_UP;
case DOWN:
return outer ? CornerType.DOWN_RIGHT : DOWN_LEFT;
default:
throw new IllegalArgumentException("Invalid direction");
}
}
public CornerType followUp(boolean outer) {
return fromIncoming(outgoing, outer);
}
/**
* branches in the other direction. if this is an outer corner, the returned corner will be innner..
*
* @return
*/
public CornerType rebranch(boolean rebranchInc) {
return rebranchInc ? fromIncoming(incoming.inverted(), !isOuter()) : fromIncoming(incoming, !isOuter());
}
@Override
public String toString() {
return (isOuter ? "." : "!") + super.toString();
}
}