246 lines
7.2 KiB
C#
246 lines
7.2 KiB
C#
//#define _DIFFICULTYDEBUG
|
|
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
public enum Gate
|
|
{
|
|
open, closed, none
|
|
}
|
|
|
|
public enum Difficulty
|
|
{
|
|
Easy, Medium, Hard, Special, None
|
|
}
|
|
|
|
public class Room : MonoBehaviour
|
|
{
|
|
public Utils.DifficultyDebug debugDiff;
|
|
|
|
[SerializeField]
|
|
private Difficulty difficulty=Difficulty.None;
|
|
public Difficulty Difficulty
|
|
{
|
|
get
|
|
{
|
|
return difficulty;
|
|
}
|
|
set
|
|
{
|
|
difficulty = value;
|
|
#if _DIFFICULTYDEBUG
|
|
switch (difficulty)
|
|
{
|
|
case Difficulty.Easy:
|
|
GetComponentInChildren<MeshRenderer>().material.SetColor("RedChannel", Color.green);
|
|
break;
|
|
case Difficulty.Medium:
|
|
GetComponentInChildren<MeshRenderer>().material.SetColor("RedChannel", Color.yellow);
|
|
break;
|
|
case Difficulty.Hard:
|
|
GetComponentInChildren<MeshRenderer>().material.SetColor("RedChannel", Color.red);
|
|
break;
|
|
case Difficulty.Special:
|
|
GetComponentInChildren<MeshRenderer>().material.SetColor("RedChannel", Color.blue);
|
|
break;
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
|
|
[SerializeField]
|
|
private int roomID;
|
|
public int RoomID
|
|
{
|
|
get
|
|
{
|
|
return roomID;
|
|
}
|
|
}
|
|
|
|
[Space(10)]
|
|
public Gate top = Gate.none;
|
|
public Gate right = Gate.none;
|
|
public Gate bottom = Gate.none;
|
|
public Gate left = Gate.none;
|
|
|
|
public bool TopWalkable
|
|
{
|
|
get
|
|
{
|
|
return (top == Gate.closed || top == Gate.open);
|
|
}
|
|
}
|
|
public bool RightWalkable
|
|
{
|
|
get
|
|
{
|
|
return (right == Gate.closed || right == Gate.open);
|
|
}
|
|
}
|
|
public bool BottomWalkable
|
|
{
|
|
get
|
|
{
|
|
return (bottom == Gate.closed || bottom == Gate.open);
|
|
}
|
|
}
|
|
public bool LeftWalkable
|
|
{
|
|
get
|
|
{
|
|
return (left == Gate.closed || left == Gate.open);
|
|
}
|
|
}
|
|
|
|
public GameObject[] rooms;
|
|
|
|
public GameObject content=null;
|
|
|
|
public bool OpenEdges()
|
|
{
|
|
return top==Gate.open || right == Gate.open || bottom == Gate.open || left == Gate.open;
|
|
}
|
|
|
|
private bool checkGates(bool t, bool r, bool b, bool l)
|
|
{
|
|
return
|
|
(t ? top == Gate.open || top==Gate.closed : top == Gate.none) &&
|
|
(r ? right == Gate.open || right == Gate.closed : right == Gate.none) &&
|
|
(b ? bottom == Gate.open || bottom == Gate.closed : bottom == Gate.none) &&
|
|
(l ? left == Gate.open || left == Gate.closed : left == Gate.none);
|
|
}
|
|
|
|
[ContextMenu("Update room")]
|
|
public GameObject updateRoom()
|
|
{
|
|
GameObject aux;
|
|
//one open cases
|
|
if(checkGates(true, false, false, false))
|
|
aux=rooms[0];
|
|
else if (checkGates(false, true, false, false))
|
|
aux=rooms[1];
|
|
else if (checkGates(false, false, true, false))
|
|
aux=rooms[2];
|
|
else if (checkGates(false, false, false, true))
|
|
aux=rooms[3];
|
|
|
|
//two open cases
|
|
else if (checkGates(true, true, false, false))
|
|
aux=rooms[4];
|
|
else if (checkGates(true, false, true, false))
|
|
aux=rooms[5];
|
|
else if (checkGates(true, false, false, true))
|
|
aux=rooms[6];
|
|
else if (checkGates(false, true, true, false))
|
|
aux=rooms[7];
|
|
else if (checkGates(false, true, false, true))
|
|
aux=rooms[8];
|
|
else if (checkGates(false, false, true, true))
|
|
aux=rooms[9];
|
|
|
|
//three open cases
|
|
else if (checkGates(true, true, true, false))
|
|
aux=rooms[10];
|
|
else if (checkGates(true, true, false, true))
|
|
aux=rooms[11];
|
|
else if (checkGates(true, false, true, true))
|
|
aux=rooms[12];
|
|
else if (checkGates(false, true, true, true))
|
|
aux=rooms[13];
|
|
|
|
//four open cases
|
|
else //(checkGates(true, true, true, true))
|
|
aux=rooms[14];
|
|
|
|
if (aux.GetComponent<Room>().RoomID != RoomID)
|
|
{
|
|
aux = Instantiate(aux, transform);
|
|
aux.transform.parent = null;
|
|
StartCoroutine(Autodestroy(0.1f));//GameMaster.Instance.ReplaceGameObject(aux, gameObject);
|
|
}
|
|
return aux;
|
|
}
|
|
|
|
IEnumerator Autodestroy(float time)
|
|
{
|
|
yield return new WaitForEndOfFrame();
|
|
if (Application.isPlaying)
|
|
Destroy(gameObject);
|
|
else if (Application.isEditor)
|
|
DestroyImmediate(gameObject);
|
|
}
|
|
|
|
//deprecated
|
|
public void siblingness()
|
|
{
|
|
Debug.Log("Awake " + gameObject.name);
|
|
for (int i = 0; i < 4; ++i)
|
|
{
|
|
Gate currentGate;
|
|
switch (i)
|
|
{
|
|
default:
|
|
case 0:
|
|
currentGate = top;
|
|
break;
|
|
case 1:
|
|
currentGate = right;
|
|
break;
|
|
case 2:
|
|
currentGate = bottom;
|
|
break;
|
|
case 3:
|
|
currentGate = left;
|
|
break;
|
|
}
|
|
|
|
if (currentGate != Gate.none)
|
|
{
|
|
Vector3 dir = Vector3.zero;
|
|
switch (i)
|
|
{
|
|
default:
|
|
case 0:
|
|
dir = Vector3.up;
|
|
break;
|
|
case 1:
|
|
dir = Vector3.right;
|
|
break;
|
|
case 2:
|
|
dir = Vector3.down;
|
|
break;
|
|
case 3:
|
|
dir = Vector3.left;
|
|
break;
|
|
}
|
|
RaycastHit[] rch = Physics.RaycastAll(transform.position, dir, 10);
|
|
|
|
foreach (RaycastHit r in rch)
|
|
{
|
|
if (r.collider.gameObject != gameObject && r.collider.gameObject.GetComponent<Room>() != null)
|
|
{
|
|
Debug.Log(r.collider.gameObject.name + " awaken my master");
|
|
switch (i)
|
|
{
|
|
default:
|
|
case 0:
|
|
top = r.collider.gameObject.GetComponent<Room>().BottomWalkable ? Gate.closed : Gate.none;
|
|
break;
|
|
case 1:
|
|
right = r.collider.gameObject.GetComponent<Room>().LeftWalkable ? Gate.closed : Gate.none;
|
|
break;
|
|
case 2:
|
|
bottom = r.collider.gameObject.GetComponent<Room>().TopWalkable ? Gate.closed : Gate.none;
|
|
break;
|
|
case 3:
|
|
left = r.collider.gameObject.GetComponent<Room>().RightWalkable ? Gate.closed : Gate.none;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|