// Path: GoingUnderBase/src/com/igorcrevar/goingunder/statemachine/IGeneratorStateMachine.java
// public interface IGeneratorStateMachine {
// 	ObstacleTypeEnum[] getFirst();
// 	ObstacleTypeEnum[] getPossibilitiesFor(ObstacleTypeEnum type);
// }


import com.badlogic.gdx.graphics.g2d.Sprite;
import com.igorcrevar.goingunder.statemachine.IGeneratorStateMachine;
package com.igorcrevar.goingunder;


public abstract class AGameLevel {
	// we use public fields instead to just make population of data for every level inside of abstract copyTo method
	// because I need to change efficiently level data while test mechanic
	public float boundariesBouncingFactor;	
	public float friction;
	public float velocityX;
	public float velocityY;
	public float obstacleGeneratorDistance;
	
	public float emptySpaceSizeInTheMiddle;
	public float emptySpaceSizeOnTheEnd;
	public int endOnScore;

	private IGeneratorStateMachine generatorStateMachine;
	
	public abstract void resolveObstacleTexture(Sprite part, GameManager gameManager);
	protected abstract IGeneratorStateMachine createGeneratorMachine();
	
	public void copyTo(GameData data) {
		data.EmptySpaceSizeInTheMiddle = emptySpaceSizeInTheMiddle;
		data.EmptySpaceSizeOnTheEnd = emptySpaceSizeOnTheEnd;
		data.ObstacleGeneratorDistance = obstacleGeneratorDistance;
		
		data.BoundariesBouncingFactor = boundariesBouncingFactor;
		data.Friction = friction;
		data.VelocityX = velocityX;
		data.VelocityY = velocityY;
	}
	
	public IGeneratorStateMachine getGeneratorStateMachine() {
// Path: GoingUnderBase/src/com/igorcrevar/goingunder/statemachine/IGeneratorStateMachine.java
// public interface IGeneratorStateMachine {
// 	ObstacleTypeEnum[] getFirst();
// 	ObstacleTypeEnum[] getPossibilitiesFor(ObstacleTypeEnum type);
// }


// Path: GoingUnderBase/src/com/igorcrevar/goingunder/AGameLevel.java
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.igorcrevar.goingunder.statemachine.IGeneratorStateMachine;

package com.igorcrevar.goingunder;


public abstract class AGameLevel {
	// we use public fields instead to just make population of data for every level inside of abstract copyTo method
	// because I need to change efficiently level data while test mechanic
	public float boundariesBouncingFactor;	
	public float friction;
	public float velocityX;
	public float velocityY;
	public float obstacleGeneratorDistance;
	
	public float emptySpaceSizeInTheMiddle;
	public float emptySpaceSizeOnTheEnd;
	public int endOnScore;

	private IGeneratorStateMachine generatorStateMachine;
	
	public abstract void resolveObstacleTexture(Sprite part, GameManager gameManager);
	protected abstract IGeneratorStateMachine createGeneratorMachine();
	
	public void copyTo(GameData data) {
		data.EmptySpaceSizeInTheMiddle = emptySpaceSizeInTheMiddle;
		data.EmptySpaceSizeOnTheEnd = emptySpaceSizeOnTheEnd;
		data.ObstacleGeneratorDistance = obstacleGeneratorDistance;
		
		data.BoundariesBouncingFactor = boundariesBouncingFactor;
		data.Friction = friction;
		data.VelocityX = velocityX;
		data.VelocityY = velocityY;
	}
	
	public IGeneratorStateMachine getGeneratorStateMachine() {
		if (generatorStateMachine == null) {