package com.igorcrevar.goingunder.statemachine;
import com.igorcrevar.goingunder.ObstacleTypeEnum;
public class GeneratorStateMachine implements IGeneratorStateMachine {
private ObstacleTypeEnum[] firstChoices;
private ObstacleTypeEnum[][] stateMatrix;
public GeneratorStateMachine(boolean simple) {
firstChoices = new ObstacleTypeEnum[] {
ObstacleTypeEnum.RightHole, ObstacleTypeEnum.LeftHole, ObstacleTypeEnum.LeftRightHoles, ObstacleTypeEnum.LeftRightMiddleHoles
};
if (simple) {
stateMatrix = new ObstacleTypeEnum[][]
{
new ObstacleTypeEnum[] { // right hole
ObstacleTypeEnum.LeftHole, ObstacleTypeEnum.MiddleHole, ObstacleTypeEnum.LeftMiddleHole
},
new ObstacleTypeEnum[] { // left hole
ObstacleTypeEnum.RightHole, ObstacleTypeEnum.MiddleHole, ObstacleTypeEnum.RightMiddleHole
},
new ObstacleTypeEnum[] { // left right holes
ObstacleTypeEnum.MiddleHole, ObstacleTypeEnum.LeftMiddleHole, ObstacleTypeEnum.RightMiddleHole, ObstacleTypeEnum.LeftRightMiddleHoles
},
new ObstacleTypeEnum[] { // MiddleHole
ObstacleTypeEnum.LeftHole, ObstacleTypeEnum.RightHole, ObstacleTypeEnum.LeftRightHoles
},
new ObstacleTypeEnum[] { // LeftMiddleHole
ObstacleTypeEnum.RightHole, ObstacleTypeEnum.RightMiddleHole, ObstacleTypeEnum.MiddleHole
},
new ObstacleTypeEnum[] { // RightMiddleHole
ObstacleTypeEnum.LeftHole, ObstacleTypeEnum.LeftMiddleHole, ObstacleTypeEnum.MiddleHole
},
new ObstacleTypeEnum[] { // LeftRightMiddleHoles
ObstacleTypeEnum.LeftRightHoles, ObstacleTypeEnum.MiddleHole
},
};
}
else {
stateMatrix = new ObstacleTypeEnum[][]
{
new ObstacleTypeEnum[] { // right hole
ObstacleTypeEnum.LeftHole, ObstacleTypeEnum.MiddleHole, ObstacleTypeEnum.LeftMiddleHole, ObstacleTypeEnum.Left4Hole, ObstacleTypeEnum.Left4MiddleHole,
ObstacleTypeEnum.LeftHole,
},
new ObstacleTypeEnum[] { // left hole
ObstacleTypeEnum.RightHole, ObstacleTypeEnum.MiddleHole, ObstacleTypeEnum.RightMiddleHole, ObstacleTypeEnum.Right4Hole, ObstacleTypeEnum.Right4MiddleHole,
ObstacleTypeEnum.RightHole,
},
new ObstacleTypeEnum[] { // left right holes
ObstacleTypeEnum.MiddleHole, ObstacleTypeEnum.LeftMiddleHole, ObstacleTypeEnum.RightMiddleHole, ObstacleTypeEnum.LeftRightMiddleHoles
},
new ObstacleTypeEnum[] { // MiddleHole
ObstacleTypeEnum.LeftHole, ObstacleTypeEnum.RightHole, ObstacleTypeEnum.LeftRightHoles,
ObstacleTypeEnum.Left4Hole, ObstacleTypeEnum.Right4Hole
},
new ObstacleTypeEnum[] { // LeftMiddleHole
ObstacleTypeEnum.RightHole, ObstacleTypeEnum.RightMiddleHole, ObstacleTypeEnum.MiddleHole, ObstacleTypeEnum.Right4Hole,
},
new ObstacleTypeEnum[] { // RightMiddleHole
ObstacleTypeEnum.LeftHole, ObstacleTypeEnum.LeftMiddleHole, ObstacleTypeEnum.MiddleHole, ObstacleTypeEnum.Left4Hole,
},
new ObstacleTypeEnum[] { // LeftRightMiddleHoles
ObstacleTypeEnum.LeftRightHoles, ObstacleTypeEnum.MiddleHole
},
new ObstacleTypeEnum[] { // Left4Hole
ObstacleTypeEnum.RightHole, ObstacleTypeEnum.RightMiddleHole
},
new ObstacleTypeEnum[] { // Right4Hole
ObstacleTypeEnum.LeftHole, ObstacleTypeEnum.LeftMiddleHole
},
new ObstacleTypeEnum[] { // Left4MiddleHole
ObstacleTypeEnum.RightHole, ObstacleTypeEnum.LeftRightHoles
},
new ObstacleTypeEnum[] { // Right4MiddleHole
ObstacleTypeEnum.LeftHole, ObstacleTypeEnum.LeftRightHoles
},
};
}
}
@Override
public ObstacleTypeEnum[] getFirst() {
return firstChoices;
}
@Override
public ObstacleTypeEnum[] getPossibilitiesFor(ObstacleTypeEnum type) {
return stateMatrix[type.ordinal()];
}
}