using UnityEngine;

using System.Collections;


public class FollowPlayer : MonoBehaviour {


private Transform Target;

float OffsetX = 0;//-14.5f

float OffsetY = 0;//13.5f

void Awake(){


}

void Start () {

//Target = GameObject.Find ("PalletTownInHouseMap/4thPalletTownInHouse/Player/4thPalletTownInHouse_Player_4thPalletTownHeroBlue").transform;

Target = GameObject.FindGameObjectWithTag("HeroBlue").transform;

OffsetX = transform.position.x - Target.position.x;

OffsetY = transform.position.y - Target.position.y;

}

// Update is called once per frame

void Update () {

transform.position = new Vector3 (Target.position.x - OffsetX, Target.position.y - OffsetY, transform.position.z);

}

}



using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Player : MonoBehaviour{
private Animator PlayerAnimator;
public const int DIR_UP = 1;
public const int DIR_RIGHT = 2;
public const int DIR_DOWN = 3;
public const int DIR_LEFT = 4;
public int currentDir = 0;
public int collisionDir = 0;
public float Force;
public bool[] canMove = {false, true, true, true, true};
public bool dontmove = false;


public Door door = new Door();
private GameObject DoorGroup;
//public List<Stair> stairList = new List<Stair>();
private StairSet stairSet;
List<Door> DoorList = new List<Door>();
GameObject Tilemap2;
GameObject[] Shadow = new GameObject[5];
void Start () {
PlayerAnimator = GetComponent<Animator> ();
stairSet = GameObject.Find("StairSet").GetComponent<StairSet>();
Tilemap2 = GameObject.Find ("PalletTownInHouseMap").transform.Find("4thPalletTownInHouse").gameObject;
for (int i = 0; i < Shadow.GetLength(0); i++)
Shadow [i] = Tilemap2.transform.Find ("OutSideTileLayer" + (i + 1).ToString()).gameObject;
Shadow [2].SetActive (false);


DoorGroup = GameObject.Find ("DoorGroup");

door.SetDoor (DoorGroup.transform.GetChild (0).gameObject, DoorGroup.transform.GetChild (1).gameObject);
DoorList.Add (door);

door.SetDoor (DoorGroup.transform.GetChild (2).gameObject, DoorGroup.transform.GetChild (3).gameObject);
DoorList.Add (door);

door.SetDoor (DoorGroup.transform.GetChild (4).gameObject, DoorGroup.transform.GetChild (5).gameObject);
DoorList.Add (door);

Debug.Log ("Door1_1 = " + DoorList [0].GetStartName () +", Door1_2 = "+DoorList [0].GetEndName());
Debug.Log ("Door2_1 = " + DoorList [1].GetStartName () +", Door2_2 = "+DoorList [1].GetEndName());
Debug.Log ("Door3_1 = " + DoorList [2].GetStartName () +", Door3_2 = "+DoorList [2].GetEndName());
Debug.Log ("Complete Add");
//stairSet.GetComponent<SecondFloorEntrance>().;
//stairSet.GetComponent<FirstFloorEntrance>();
}

float time;

int dir_idle;

bool[] IsTrigger = {false, false, false ,false};
bool[] IsblueDoor = {false, false};
//bool[] IsRedDoor = {false, false};
//bool[] IsOkidDoor = {false, false};


public float angleBetween = 0.0F;



bool[] enter = {true, true};
void Update () {
if(!dontmove){
if(Input.GetKey (KeyCode.S) || Input.GetKey(KeyCode.DownArrow))
{
currentDir = DIR_DOWN;
PlayerAnimator.SetInteger("Dir", currentDir);
if (canMove[DIR_DOWN])
transform.position = new Vector2(transform.position.x, transform.position.y - 0.1f);
}

if(Input.GetKey (KeyCode.A) || Input.GetKey (KeyCode.LeftArrow)) {
currentDir = DIR_LEFT;
PlayerAnimator.SetInteger("Dir", currentDir);
if (canMove[DIR_LEFT])
transform.position = new Vector2(transform.position.x - 0.1f, transform.position.y);
}

if(Input.GetKey (KeyCode.W) || Input.GetKey(KeyCode.UpArrow)) {
currentDir = DIR_UP;
PlayerAnimator.SetInteger("Dir", currentDir);
if (canMove[DIR_UP])
transform.position = new Vector2(transform.position.x, transform.position.y + 0.1f);
}

if(Input.GetKey (KeyCode.D) || Input.GetKey(KeyCode.RightArrow)) {
currentDir = DIR_RIGHT;
PlayerAnimator.SetInteger("Dir", currentDir);
if (canMove[DIR_RIGHT])
transform.position = new Vector2(transform.position.x + 0.1f, transform.position.y);
}

if(Input.GetKeyUp(KeyCode.S) || Input.GetKeyUp (KeyCode.DownArrow)
|| Input.GetKeyUp(KeyCode.A) || Input.GetKeyUp (KeyCode.LeftArrow)
|| Input.GetKeyUp(KeyCode.W) || Input.GetKeyUp (KeyCode.UpArrow)
|| Input.GetKeyUp(KeyCode.D) || Input.GetKeyUp (KeyCode.RightArrow)) {
PlayerAnimator.SetInteger("Dir", currentDir * 10);
for (int i = 1; i <= 4; i++)
canMove[i] = true;
}
}

/*if (!enter [0]) {
if (IsTrigger [3]) {
StartCoroutine (SetPos2 (currentDir = DIR_RIGHT));
transform.position = new Vector2 (transform.position.x + 0.1f, transform.position.y + 0.05f);
}
if (IsTrigger [2]) {
GameObject obj = GameObject.FindGameObjectWithTag ("Blue's house Second Stair IngDown");
StartCoroutine (SetPos (obj.transform.position, currentDir = DIR_LEFT));
}
if (IsTrigger [1]) {
transform.position = new Vector2 (transform.position.x - 0.1f, transform.position.y - 0.01f);
}
if (IsTrigger [0]) {
transform.position = new Vector2 (transform.position.x, transform.position.y);
PlayerAnimator.SetInteger ("Dir", currentDir * 10);
dontmove = false;
}
}*/
/*if(dontmove) {
if(enter[1]){
if(IsblueDoor[0]){
GameObject obj = GameObject.FindGameObjectWithTag("Blue's Door");
StartCoroutine(SetPos (obj.transform.position, currentDir = DIR_DOWN ));
}
if(IsblueDoor[1]){
transform.position = new Vector2(transform.position.x, transform.position.y);
PlayerAnimator.SetInteger("Dir", currentDir * 10);
dontmove = false;
enter[1] = false;
IsblueDoor[1] = false;
}
}
if(!enter[1]){
if(IsblueDoor[1]){
GameObject obj = GameObject.FindGameObjectWithTag("Blue's house first floor staircase");
StartCoroutine(SetPos (obj.transform.position, currentDir = DIR_UP));
}
if(IsblueDoor[0]){
transform.position = new Vector2(transform.position.x, transform.position.y);
PlayerAnimator.SetInteger("Dir", currentDir * 10);
dontmove = false;
enter[1] =true;
IsblueDoor[0]= false;
}
}
}*/
// if(Input.GetKeyDown(KeyCode.S) || Input.GetKeyDown (KeyCode.DownArrow)
// || Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown (KeyCode.LeftArrow)
// || Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown (KeyCode.UpArrow)
// || Input.GetKeyDown(KeyCode.D) || Input.GetKeyDown (KeyCode.RightArrow)) {
// PlayerAnimator.SetBool("Stop", false);
// }

}


/*IEnumerator MoveStairsDown2(Hashtable hashtable) {
dontmove = true;
//canMove[collisionDir] = false;
// 2nd floor -> 1st floor
yield return StartCoroutine(SetDir (DIR_RIGHT));
Debug.LogWarning("1");


yield return StartCoroutine(Stairmove ((string)hashtable["path1"], (float)hashtable["Duration"], false));
Debug.LogWarning("2");
yield return StartCoroutine(SetDir (DIR_LEFT));
Debug.LogWarning("3");
yield return StartCoroutine(ShadowOnOff((int)hashtable["layerMask1"], (int)hashtable["layerMask2"]));
Debug.LogWarning("4");
yield return StartCoroutine(Stairmove ((string)hashtable["path2"], (float)hashtable["Duration"], false));
Debug.LogWarning("5");
yield return StartCoroutine(SetDir (DIR_LEFT*10));
Debug.LogWarning("6");
yield return StartCoroutine(MovePos2 ((float)hashtable["MoveX"], (float)hashtable["MoveY"]));
Debug.LogWarning("7");
//StopCoroutine(Move (moveX, moveY));
Debug.LogWarning("8");
//GetComponent<Collider2D> ().enabled=false;
for (collisionDir = 1; collisionDir <= 4; collisionDir++)
canMove[collisionDir] = true;
dontmove = false;
//yield return null;
}*/
public IEnumerator SetDir(int CurrentDir){
//yield return new WaitForSeconds(0.01f);
PlayerAnimator.SetInteger("Dir", currentDir=CurrentDir);
yield return null;
}



public IEnumerator MovePos2(float moveX, float moveY){
transform.position = new Vector2 (transform.position.x + moveX, transform.position.y + moveY);
yield return null;
}
public IEnumerator ShadowOnOff(int layerMask1, int layerMask2){
Shadow [layerMask1].SetActive (true);
Shadow [layerMask2].SetActive (false);
yield return null;
}
public IEnumerator DoorShadowOnOff(bool reverse, int layerMask3){
if (reverse) {
Shadow[layerMask3].SetActive (false);
}else{
Shadow[layerMask3].SetActive (true);
}
yield return null;
}
public IEnumerator DoorOnOff(Vector2 StartPos, Vector2 EndPos, bool reverse, float moveY_IsF, int layerMask3){
dontmove = true;


print ("currentDir A = " + currentDir);
yield return transform.position = reverse ? StartPos+new Vector2(0,moveY_IsF) : EndPos+new Vector2(0,-moveY_IsF);
print(reverse);
print ("currentDir B = " + currentDir);
yield return StartCoroutine(DoorShadowOnOff (reverse, layerMask3));
yield return reverse ? StartCoroutine(SetDir (currentDir = DIR_UP * 10)) : StartCoroutine(SetDir (currentDir = DIR_DOWN * 10));
//yield return reverse ? SetDir (currentDir = DIR_UP * 10) : SetDir (currentDir = DIR_DOWN * 10);
dontmove = false;
print ("currentDir C = " + currentDir);
}
Vector2 Pos2;
int layerMask1 = 0, layerMask2 = 0, layerMask3;



void OnTriggerEnter2D(Collider2D coll){
if (coll.gameObject.tag == "Blue's house Second Stair FloorDown") {
if(!dontmove){
Hashtable hashtable = new Hashtable();
//List<Hashtable> hashtablelist = new List<Hashtable>();
hashtable.Add("path1", stairSet.secondstairList[0].path1);
//hashtablelist.Add (hashtable);
hashtable.Add("path2", stairSet.secondstairList[0].path2);
//hashtablelist.Add (hashtable);
hashtable.Add("Duration", 2.0f);
//hashtablelist.Add (hashtable);
hashtable.Add("MoveX", -1.15f);
//hashtablelist.Add (hashtable);
hashtable.Add("MoveY", 0.2f);
//hashtablelist.Add (hashtable);
hashtable.Add("layerMask1", 2);
//hashtablelist.Add (hashtable);
hashtable.Add("layerMask2", 1);
//hashtablelist.Add (hashtable);
StartCoroutine("MoveStairsDown2", hashtable);
for (int i = 1; i <= 4; i++)
canMove[i] = true;
//GetComponent<Collider2D> ().enabled=true;
}
}
if (coll.gameObject.tag == "Blue's house First Stair FloorUp") {
if(!dontmove){
//StartCoroutine (MoveStairsUp (stairList [0].Get_iTweenPath2 (), stairList [0].Get_iTweenPath1 (), 2.0f, -1.25f, 0.25f, layerMask1 = 1, layerMask2 = 2));
for (int i = 1; i <= 4; i++)
canMove[i] = true;
//GetComponent<Collider2D> ().enabled=true;
}
}
if (coll.gameObject.tag == "Red's house Second Stair FloorDown") {
if(!dontmove){
//StartCoroutine (MoveStairsDown (stairList [1].Get_iTweenPath1 (), stairList [1].Get_iTweenPath2 (), 2.0f, -1.75f, 0.25f, layerMask1 = 4, layerMask2 = 3));
for (int i = 1; i <= 4; i++)
canMove[i] = true;
//GetComponent<Collider2D> ().enabled=true;
}
}
if (coll.gameObject.tag == "Red's house First Stair FloorUp") {
if(!dontmove){
//StartCoroutine (MoveStairsUp (stairList [1].Get_iTweenPath2 (), stairList [1].Get_iTweenPath1 (), 2.0f, -2.15f, 0.25f, layerMask1 = 3, layerMask2 = 4));//-1.15F,-0.25
for (int i = 1; i <= 4; i++)
canMove[i] = true;
//GetComponent<Collider2D> ().enabled=true;
}
}
if (coll.gameObject.tag == "Blue's house first floor staircase"){
StartCoroutine (DoorOnOff(DoorList[0].GetStartPos(), DoorList[0].GetEndPos(), false, 1.0f, layerMask3 = 1));
Debug.Log ("A : false");
for (int i = 1; i <= 4; i++)
canMove[i] = true;
}
if (coll.gameObject.tag == "Blue's Door") {
StartCoroutine (DoorOnOff(DoorList[0].GetStartPos(), DoorList[0].GetEndPos(), true, -0.25f, layerMask3 = 1));
Debug.Log ("B : true");
for (int i = 1; i <= 4; i++)
canMove[i] = true;
}
if (coll.gameObject.tag == "Red's house first floor staircase") {
StartCoroutine (DoorOnOff (DoorList [1].GetStartPos (), DoorList [1].GetEndPos (), false, 1.0f, layerMask3 = 3));
}
if (coll.gameObject.tag == "Red's Door") {
StartCoroutine (DoorOnOff (DoorList [1].GetStartPos (), DoorList [1].GetEndPos (), true, -0.25f, layerMask3 = 3));
for (int i = 1; i <= 4; i++)
canMove[i] = true;
}
if (coll.gameObject.tag == "Okid's house first floor staircase") {
StartCoroutine (DoorOnOff (DoorList [2].GetStartPos (), DoorList [2].GetEndPos (), false, 1.0f, layerMask3 = 0));
for (int i = 1; i <= 4; i++)
canMove[i] = true;
}
if (coll.gameObject.tag == "Okid's Door") {
StartCoroutine (DoorOnOff (DoorList [2].GetStartPos (), DoorList [2].GetEndPos (), true, -0.25f, layerMask3 = 0));
for (int i = 1; i <= 4; i++)
canMove[i] = true;
}
}
public IEnumerator Stairmove(string stringpath, float Duration, bool IsReversePercent){
Vector3[] paths = iTweenPath.GetPath (stringpath);
float startTime = Time.time;
while(Time.time < startTime + Duration){
//1.5f < 0.0f 2.0f;
//2.0f < 0.0f 2.0f;
float percent = (Time.time - startTime) / Duration;
float CurrentPercent = IsReversePercent ? (1-percent) : percent;
gameObject.transform.position = iTween.PointOnPath(paths, CurrentPercent);

//Debug.LogWarning (percent);
//yield return new WaitForSeconds(0.01f);
// 이 부분
yield return null;
}
yield return null;
}

/*public IEnumerator MovePos(float moveX, float moveY, string path2){
Vector3[] vpath= iTweenPath.GetPath (path2);
transform.position = new Vector2 (vpath[1].x + moveX, vpath[1].y + moveY);
yield return null;
}*/



/*public IEnumerator SetPos(Vector2 CurrentPos, int currentDir) {
//yield return new WaitForSeconds(0.01f);
transform.position = CurrentPos;
PlayerAnimator.SetInteger("Dir", currentDir);
yield return null;
}*/
/*public IEnumerator SetPos2(int currentDir) {
PlayerAnimator.SetInteger("Dir", currentDir);
yield return null;
}*/
/*IEnumerator MoveStair(){
dontmove = true;
float speed = 0.05f;

for (int i = 0; i < 1.0f / speed; i++) {
Vector2 targetDir1 = stairList [0].StairGetPos2 () - (Vector2)transform.position;
transform.position = (Vector2)transform.position + targetDir1 * speed;
yield return new WaitForSeconds (0.1f);
}
// 2nd floor -> 1st floor
StartCoroutine(SetPos(stairList[0].StairGetPos3(), currentDir = DIR_LEFT));

for (int i = 0; i < 1.0f / speed; i++) {
Vector2 targetDir2 = stairList [0].StairGetPos4 () - (Vector2)transform.position;
transform.position = (Vector2)transform.position + targetDir2 * speed;
yield return new WaitForSeconds(0.1f);
}
//transform.position = new Vector2(transform.position.x, transform.position.y);
transform.position = stairList [0].StairGetPos4 () - new Vector2(0.5f, 0);
PlayerAnimator.SetInteger("Dir", currentDir * 10);
yield return null;
dontmove = false;
}

IEnumerator MoveStair2(){
dontmove = true;
float speed = 0.05f;

StartCoroutine (SetPos2 (currentDir = DIR_RIGHT));

for (int i = 0; i < 1.0f / speed; i++) {
Vector2 targetDir1 = stairList [1].StairGetPos2 () - (Vector2)transform.position;
transform.position = (Vector2)transform.position + targetDir1 * speed;
yield return new WaitForSeconds (0.1f);
}
// 1st floor -> 2nd floor
StartCoroutine (SetPos (stairList[1].StairGetPos4(), currentDir = DIR_LEFT));
for (int i = 0; i < 1.0f / speed; i++) {
Vector2 targetDir2 = stairList [1].StairGetPos3() - (Vector2)transform.position;
transform.position = (Vector2)transform.position + targetDir2 * speed;
yield return new WaitForSeconds (0.1f);
}

transform.position = stairList [1].StairGetPos3() - new Vector2(0.85f, -0.02f );
PlayerAnimator.SetInteger ("Dir", currentDir * 10);
yield return null;
dontmove = false;
}*/
void OnCollisionEnter2D(Collision2D coll) {
canMove [currentDir] = false;
collisionDir = currentDir;
}



void OnCollisionExit2D(Collision2D coll) {
canMove [collisionDir] = true;
}

void FixedUpdate() {

}

/*IEnumerator MoveStairsDown(string stringpath1, string stringpath2, float Duration, float moveX, float moveY, int layerMask1, int layerMask2) {
dontmove = true;
yield return StartCoroutine(SetDir (DIR_RIGHT));
//Debug.LogWarning("1");
yield return StartCoroutine(Stairmove (stringpath1, Duration = 1.0f, false));
//Debug.LogWarning("2");
yield return StartCoroutine(SetDir (DIR_LEFT));
//Debug.LogWarning("3");
yield return StartCoroutine(ShadowOnOff(layerMask1, layerMask2));
//Debug.LogWarning("4");
yield return StartCoroutine(Stairmove (stringpath2, Duration = 0.5f, false));
//Debug.LogWarning("5");
yield return StartCoroutine(SetDir (DIR_LEFT*10));
//Debug.LogWarning("6");
yield return StartCoroutine(MovePos (moveX, moveY, stringpath2));
//Debug.LogWarning("7");
//StopCoroutine(Move (moveX, moveY));
//Debug.LogWarning("8");
GetComponent<Collider2D> ().enabled=false;
//canMove[collisionDir] = true;
dontmove = false;
//yield return null;
}*/
}