package fight3D;

import javax.vecmath.Vector3d;

import framework.gameMain.Mode;
import framework.gameMain.ModeFreeFall;
import framework.gameMain.ModeOnGround;
import framework.physics.PhysicsUtility;
import framework.physics.Velocity3D;


public class StateLeftMove extends StateRepeatable {
	private Velocity3D initialVelocity = new Velocity3D(-5.0, 0.0, 0.0);
	
	void setSpeed(double speed) {
		initialVelocity.setX(-speed);
	}
	
	public boolean canChange(State nextState, Mode mode) {		
		if(mode instanceof ModeFreeFall) {
			//落下中
			if(nextState instanceof StateBend) return false;
			if(nextState instanceof StateGuard) return false;
			if(nextState instanceof StateJump) return false;
		}		
		return true;
	}
	
	public Velocity3D getInitialVelocity() {
		return initialVelocity;
	}

	public Velocity3D getVelocity(Velocity3D curVelocity, Mode mode) {
		if (mode instanceof ModeOnGround) {
			// 地面の向きに沿うように速度ベクトルの向きを変える
			// （地上を歩いているときはアニメーションなどの影響で速度が変わる可能性があるので、状態変化がなくても同じ速度を設定し続ける）
			ModeOnGround modeOnGround = (ModeOnGround)mode;
			Vector3d v = getInitialVelocity().getVector3d();
			double d = v.dot(modeOnGround.getNormal());
			v.scaleAdd(-d, modeOnGround.getNormal(), v);
			return new Velocity3D(v);
		}
		// 空中に滞在している場合は水平方向の速度成分だけ変更する（自由落下には影響を与えないように）
		if (counter == 0) {
			// 空中の場合、水平方向に加減速することはないので、速度を設定するのは初回のみでいい
			Vector3d v0 = curVelocity.getVector3d();
			Vector3d v1 = getInitialVelocity().getVector3d();
			v0.add(v1);
			double d0 = v0.dot(PhysicsUtility.horizon);	
			double d1 = v1.dot(PhysicsUtility.horizon);	
			v0.scaleAdd(d1 - d0, PhysicsUtility.horizon, v0);
			return new Velocity3D(v0);
		}
		return null;
	}
}
