using UnityEngine;
using System.Collections;

/* TO DO LIST
* grounded 		    		- 100% - DONE! 
* prawa / lewa kolizja		- 100% - DONE!
* ruch na platformach		- 100% - DONE!
* skok od ściany	   		- 100% - DONE!
* płynny ruch gracza		- 0% 
* double jump				- 100% - DONE!
*/

public class PlayerControler : MonoBehaviour
{
	public float maxSpeed = 10f;			// Maksymalna prędkość osiągana przez gracza
	public float jumpPower = 250f;			// Siła skoku

	public bool grounded; 					// Zmienna użyta do sprawdzenia czy gracz znajduje się na ziemi
	public float groundCheckRadius;			// Zmienna określająca promień do sprawdzania warunku 'grounded'
	public bool lewyBokCol, prawyBokCol; 	// Zmienne użyte do sprawdzenia czy gracz dotyka ściany jednym ze swoich boków
	bool doublejump; 						// Zmienna użyta do warunkowego wykonania podwójnego skoku 

	public Transform groundCheck;			// Zmienna zawierająca współrzędne Terenu
	public LayerMask warstwaTerenu;			// Zmienna zawierająca informację na jakiej warstwie znajduje się teren (Layer -> teren)

	private Rigidbody2D rb2d;

	void Start(){
		rb2d = gameObject.GetComponent<Rigidbody2D> ();											// Zmienna wskazująca na komponent RIGIDBODY
		doublejump = false;																		// Ustawienie początkowe podwójnego skoku 
	}

	void Update() {

	}

	void FixedUpdate(){

		grounded = Physics2D.OverlapCircle (groundCheck.position, groundCheckRadius, warstwaTerenu);

		if (Input.GetButtonDown ("Jump") ){														// Skakanie
			
			if ( (prawyBokCol == true || lewyBokCol == true || grounded == true) ) {			// Warunek skoku
			rb2d.velocity = new Vector2 (rb2d.velocity.x, 0);									// Wektor skoku Rigidbody postaci
			rb2d.AddForce (Vector2.up * jumpPower);												// Dodanie siły skoku do Rigidbody postaci
			doublejump = true;																	// Umożliwienie podwójnego skoku w powietrzu

			} else {

				if (Input.GetButtonDown ("Jump") && doublejump == true) {						// Warunek drugiego skoku
					rb2d.velocity = new Vector2 (rb2d.velocity.x, 0);							// Wektor skoku Rigidbody postaci
					rb2d.AddForce (Vector2.up * jumpPower);										// Dodanie siły skoku do Rigidbody postaci
					doublejump = false;															// Zablokowanie kolejnego skoku
				}
			}
		}

		float move = Input.GetAxis ("Horizontal");  											// Zmienna odpowiedzialna za ruch
		rb2d.velocity = new Vector2(move * maxSpeed, rb2d.velocity.y);
	
		if (rb2d.velocity.x > maxSpeed) {														// Ograniczenie prędkości
			rb2d.velocity = new Vector2 (maxSpeed, rb2d.velocity.y);
		}
			
		if (rb2d.velocity.x < -maxSpeed) {
			rb2d.velocity = new Vector2 (-maxSpeed, rb2d.velocity.y);
		}
	}

	void OnCollisionEnter2D(Collision2D other){													// Umożliwienie poruszania się gracza razem z platformą																							// poprzez ustawienie go jako dziecko obiektu z tagiem 'MovingPLatform'
		if (other.transform.tag == "MovingPlatform") {
			transform.parent = other.transform;
		}
	}
		void OnCollisionExit2D(Collision2D other){												// Przywrócenie gracza do stanu normalnego
		if (other.transform.tag == "MovingPlatform") {
			transform.parent = null;
		}
	}

}
