/*
http://www.cgsoso.com/forum-211-1.html
CG搜搜 Unity3d 每日Unity3d插件免费更新 更有VIP资源!
CGSOSO 主打游戏开发,影视设计等CG资源素材。
插件如若商用,请务必官网购买!
daily assets update for try.
U should buy the asset from home store if u use it in your project!
*/
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
[Serializable]
//public class PipeSprites
//{
// public List sprites;
//}
public class Cell : MonoBehaviour
{
public Vector2Int pos;
public PipeColor defaultColor;
public int rightRotationValue;
[Header("PipeDetail")]
public RectTransform pipeParent;
public CellType pipeCellType;
public List pipes;
public List pipeSprites;
//public List _PipeSprites;
public int correctRotateDelta = 4;
[HideInInspector]
public bool redundant;
private bool _isHint;
public int _rotationValue;
private object pipe;
public CellKind cellKind;
public bool IsHint
{
get
{
return _isHint;
}
set
{
if (value)
{
RotationValue = rightRotationValue;
ApplyRotationOnImage(0.05f);
GetComponent().color = ColorManager.intance.hintCellBGColor;
}
else
{
GetComponent().color = ColorManager.intance.normalCellBGColor;
}
_isHint = value;
}
}
public int RotationValue
{
get
{
return _rotationValue;
}
set
{
if (!IsHint)
{
int num = (value < 4) ? value : 0;
num = (_rotationValue = ((num >= 0) ? num : 3));
pipes.ForEach(delegate (Pipe obj)
{
obj.SetPipeRotation(_rotationValue);
SetCellFlowSide(cellKind);
});
}
}
}
public Cell RightCell
{
get
{
Vector2Int v = pos + Vector2Int.right;
if (!IsValidIndex(v))
{
return null;
}
return GetCellFromVector(v);
}
}
public Cell LeftCell
{
get
{
Vector2Int v = pos + Vector2Int.left;
if (!IsValidIndex(v))
{
return null;
}
return GetCellFromVector(v);
}
}
public Cell TopCell
{
get
{
Vector2Int v = pos + Vector2Int.down;
if (!IsValidIndex(v))
{
return null;
}
return GetCellFromVector(v);
}
}
public Cell BottomCell
{
get
{
Vector2Int v = pos + Vector2Int.up;
if (!IsValidIndex(v))
{
return null;
}
return GetCellFromVector(v);
}
}
public void SetLevelData(LevelCellData lcd)
{
defaultColor = lcd.DefaultColor;
if (pipeCellType != 0)
{
GetComponent().onClick.AddListener(delegate
{
if (GamePlayManager.instance != null)
{
GamePlayManager.instance.OnButtonClick(this);
}
});
}
rightRotationValue = lcd.RightRotationValue;
RotationValue = lcd.CurrentRotationValue;
ApplyRotationOnImage();
UpdatePipeColor();
IsHint = false;
redundant = lcd.Redundant;
}
public void UpdatePipeColor()
{
if (pipeCellType == CellType.Start)
{
pipes.ForEach(delegate (Pipe p)
{
switch (defaultColor)
{
case PipeColor.None:
pipes.ForEach(delegate (Pipe obj)
{
obj.Img_1.transform.GetChild(0).GetComponent().color = ColorManager.intance.None;
obj.Img_2.transform.GetChild(0).GetComponent().color = ColorManager.intance.None;
obj.Img_3.transform.GetChild(0).GetComponent().color = ColorManager.intance.None;
});
break;
case PipeColor.A:
pipes.ForEach(delegate (Pipe obj)
{
obj.Img_1.transform.GetChild(0).GetComponent().color = ColorManager.intance.Red;
obj.Img_2.transform.GetChild(0).GetComponent().color = ColorManager.intance.Red;
obj.Img_3.transform.GetChild(0).GetComponent().color = ColorManager.intance.Red;
});
break;
case PipeColor.B:
pipes.ForEach(delegate (Pipe obj)
{
obj.Img_1.transform.GetChild(0).GetComponent().color = ColorManager.intance.Blue;
obj.Img_2.transform.GetChild(0).GetComponent().color = ColorManager.intance.Blue;
obj.Img_3.transform.GetChild(0).GetComponent().color = ColorManager.intance.Blue;
});
break;
case PipeColor.C:
pipes.ForEach(delegate (Pipe obj)
{
obj.Img_1.transform.GetChild(0).GetComponent().color = ColorManager.intance.Yellow;
obj.Img_2.transform.GetChild(0).GetComponent().color = ColorManager.intance.Yellow;
obj.Img_3.transform.GetChild(0).GetComponent().color = ColorManager.intance.Yellow;
});
break;
case PipeColor.AB:
pipes.ForEach(delegate (Pipe obj)
{
obj.Img_1.transform.GetChild(0).GetComponent().color = ColorManager.intance.Purple;
obj.Img_2.transform.GetChild(0).GetComponent().color = ColorManager.intance.Purple;
obj.Img_3.transform.GetChild(0).GetComponent().color = ColorManager.intance.Purple;
});
break;
case PipeColor.AC:
pipes.ForEach(delegate (Pipe obj)
{
obj.Img_1.transform.GetChild(0).GetComponent().color = ColorManager.intance.Orange;
obj.Img_2.transform.GetChild(0).GetComponent().color = ColorManager.intance.Orange;
obj.Img_3.transform.GetChild(0).GetComponent().color = ColorManager.intance.Orange;
});
break;
case PipeColor.BC:
pipes.ForEach(delegate (Pipe obj)
{
obj.Img_1.transform.GetChild(0).GetComponent().color = ColorManager.intance.Green;
obj.Img_2.transform.GetChild(0).GetComponent().color = ColorManager.intance.Green;
obj.Img_3.transform.GetChild(0).GetComponent().color = ColorManager.intance.Green;
});
break;
case PipeColor.ABC:
pipes.ForEach(delegate (Pipe obj)
{
obj.Img_1.transform.GetChild(0).GetComponent().color = ColorManager.intance.Brown;
obj.Img_2.transform.GetChild(0).GetComponent().color = ColorManager.intance.Brown;
obj.Img_3.transform.GetChild(0).GetComponent().color = ColorManager.intance.Brown;
});
break;
default:
break;
}
});
}
if (pipeCellType == CellType.Middle)
{
pipes.ForEach(delegate (Pipe p)
{
p.pipeImage.sprite = pipeSprites[(int)ColorManager.MixPipeColor(p.fillColor)];
switch (ColorManager.MixPipeColor(p.fillColor))
{
case PipeColor.None:
pipes.ForEach(delegate (Pipe obj)
{
obj.Img_1.transform.GetChild(0).GetComponent().color = ColorManager.intance.None;
obj.Img_2.transform.GetChild(0).GetComponent().color = ColorManager.intance.None;
obj.Img_3.transform.GetChild(0).GetComponent().color = ColorManager.intance.None;
});
break;
case PipeColor.A:
pipes.ForEach(delegate (Pipe obj)
{
obj.Img_1.transform.GetChild(0).GetComponent().color = ColorManager.intance.Red;
obj.Img_2.transform.GetChild(0).GetComponent().color = ColorManager.intance.Red;
obj.Img_3.transform.GetChild(0).GetComponent().color = ColorManager.intance.Red;
});
break;
case PipeColor.B:
pipes.ForEach(delegate (Pipe obj)
{
obj.Img_1.transform.GetChild(0).GetComponent().color = ColorManager.intance.Blue;
obj.Img_2.transform.GetChild(0).GetComponent().color = ColorManager.intance.Blue;
obj.Img_3.transform.GetChild(0).GetComponent().color = ColorManager.intance.Blue;
});
break;
case PipeColor.C:
pipes.ForEach(delegate (Pipe obj)
{
obj.Img_1.transform.GetChild(0).GetComponent().color = ColorManager.intance.Yellow;
obj.Img_2.transform.GetChild(0).GetComponent().color = ColorManager.intance.Yellow;
obj.Img_3.transform.GetChild(0).GetComponent().color = ColorManager.intance.Yellow;
});
break;
case PipeColor.AB:
pipes.ForEach(delegate (Pipe obj)
{
obj.Img_1.transform.GetChild(0).GetComponent().color = ColorManager.intance.Purple;
obj.Img_2.transform.GetChild(0).GetComponent().color = ColorManager.intance.Purple;
obj.Img_3.transform.GetChild(0).GetComponent().color = ColorManager.intance.Purple;
});
break;
case PipeColor.AC:
pipes.ForEach(delegate (Pipe obj)
{
obj.Img_1.transform.GetChild(0).GetComponent().color = ColorManager.intance.Orange;
obj.Img_2.transform.GetChild(0).GetComponent().color = ColorManager.intance.Orange;
obj.Img_3.transform.GetChild(0).GetComponent().color = ColorManager.intance.Orange;
});
break;
case PipeColor.BC:
pipes.ForEach(delegate (Pipe obj)
{
obj.Img_1.transform.GetChild(0).GetComponent().color = ColorManager.intance.Green;
obj.Img_2.transform.GetChild(0).GetComponent().color = ColorManager.intance.Green;
obj.Img_3.transform.GetChild(0).GetComponent().color = ColorManager.intance.Green;
});
break;
case PipeColor.ABC:
pipes.ForEach(delegate (Pipe obj)
{
obj.Img_1.transform.GetChild(0).GetComponent().color = ColorManager.intance.Brown;
obj.Img_2.transform.GetChild(0).GetComponent().color = ColorManager.intance.Brown;
obj.Img_3.transform.GetChild(0).GetComponent().color = ColorManager.intance.Brown;
});
break;
default:
break;
}
});
}
else
{
pipes.ForEach(delegate (Pipe p)
{
p.pipeImage.sprite = pipeSprites[(int)defaultColor];
});
}
}
public void ApplyRotationOnImage(float t = 0f)
{
LeanTween.rotateZ(pipeParent.gameObject, (float)_rotationValue * -90f, t);
}
private bool IsValidIndex(Vector2Int v)
{
if (v.x < 0 || v.y < 0 || v.x >= GameManager.currentLevel.column || v.y >= GameManager.currentLevel.row)
{
return false;
}
Cell cellFromVector = GetCellFromVector(v);
if (cellFromVector.pipeCellType == CellType.Blank)
{
return false;
}
return true;
}
private Cell GetCellFromVector(Vector2Int v)
{
int index = v.y * GameManager.currentLevel.column + v.x;
return GamePlayManager.instance.allCellList[index];
}
public bool HasSide(Side side)
{
foreach (Pipe pipe in pipes)
{
if (pipe.R && side == Side.R)
{
return true;
}
if (pipe.L && side == Side.L)
{
return true;
}
if (pipe.T && side == Side.T)
{
return true;
}
if (pipe.B && side == Side.B)
{
return true;
}
}
return false;
}
public bool HasAnyColor()
{
foreach (Pipe pipe in pipes)
{
if (pipe.fillColor.Count > 0)
{
return true;
}
}
return false;
}
public bool IsInRighRotation()
{
return (Mathf.Max(RotationValue, rightRotationValue) - Mathf.Min(RotationValue, rightRotationValue)) % correctRotateDelta == 0;
}
public void RemoveAllPipeColor()
{
pipes.ForEach(delegate (Pipe obj)
{
obj.RemoveAll();
});
// Reset Pipe Leaking
pipes.ForEach(delegate (Pipe obj)
{
obj.BottomLeak = false;
obj.LeftLeak = false;
obj.RightLeak = false;
obj.TopLeak = false;
if(obj.Img_1)
obj.Img_1.gameObject.SetActive(false);
if(obj.Img_2)
obj.Img_2.gameObject.SetActive(false);
if(obj.Img_3)
obj.Img_3.gameObject.SetActive(false);
});
}
public void FillColor(List c, Cell source, Side sourceSide)
{
if (pipeCellType != CellType.Start)
{
foreach (Pipe pipe in pipes)
{
if ((pipe.L && sourceSide == Side.R) || (pipe.R && sourceSide == Side.L) || (pipe.T && sourceSide == Side.B) || (pipe.B && sourceSide == Side.T))
{
if (pipe.AddColor(c) == 0)
{
break;
}
if (pipe.L && LeftCell != null && LeftCell != source)
{
LeftCell.FillColor(c, this, Side.L);
}
if (pipe.L)
{
if (LeftCell != null)
{
foreach (Pipe leftCellPipe in LeftCell.pipes)
{
if (leftCellPipe.R)
{
pipe.LeftLeak = false;
if (pipe.leakL != null)
{
pipe.leakL.gameObject.SetActive(false);
}
break;
}
else
{
pipe.LeftLeak = true;
if (pipe.leakL != null)
{
pipe.leakL.gameObject.SetActive(true);
}
}
}
}
else
{
pipe.LeftLeak = true;
if (pipe.leakL != null)
{
pipe.leakL.gameObject.SetActive(true);
}
}
//if (LeftCell == null)
//{
// pipe.LeftLeak = true;
//}
//else if (LeftCell.pipes[0].R)
//{
// pipe.LeftLeak = false;
//}
//else
//{
// pipe.LeftLeak = true;
//}
}
if (pipe.R && RightCell != null && RightCell != source)
{
RightCell.FillColor(c, this, Side.R);
}
if (pipe.R)
{
if (RightCell != null)
{
foreach (Pipe rightCellPipe in RightCell.pipes)
{
if (rightCellPipe.L)
{
pipe.RightLeak = false;
if (pipe.leakR != null)
{
pipe.leakR.gameObject.SetActive(false);
}
break;
}
else
{
pipe.RightLeak = true;
if (pipe.leakR != null)
{
pipe.leakR.gameObject.SetActive(true);
}
}
}
}
else
{
pipe.RightLeak = true;
if (pipe.leakR != null)
{
pipe.leakR.gameObject.SetActive(true);
}
}
}
if (pipe.T && TopCell != null && TopCell != source)
{
TopCell.FillColor(c, this, Side.T);
}
if (pipe.T)
{
if (TopCell != null)
{
foreach (Pipe topCellPipe in TopCell.pipes)
{
if (topCellPipe.B)
{
pipe.TopLeak = false;
if (pipe.leakT != null)
{
pipe.leakT.gameObject.SetActive(false);
}
break;
}
else
{
pipe.TopLeak = true;
if (pipe.leakT != null)
{
pipe.leakT.gameObject.SetActive(true);
}
}
}
}
else
{
pipe.TopLeak = true;
if (pipe.leakT != null)
{
pipe.leakT.gameObject.SetActive(true);
}
}
}
if (pipe.B && BottomCell != null && BottomCell != source)
{
BottomCell.FillColor(c, this, Side.B);
}
if (pipe.B)
{
if (BottomCell != null)
{
foreach (Pipe bottomCellPipe in BottomCell.pipes)
{
if (bottomCellPipe.T)
{
pipe.BottomLeak = false;
if (pipe.leakB != null)
{
pipe.leakB.gameObject.SetActive(false);
}
break;
}
else
{
pipe.BottomLeak = true;
if (pipe.leakB != null)
{
pipe.leakB.gameObject.SetActive(true);
}
}
}
}
else
{
pipe.BottomLeak = true;
if (pipe.leakB != null)
{
pipe.leakB.gameObject.SetActive(true);
}
}
}
}
}
}
}
public void SetCellFlowSide(CellKind cellKind)
{
switch (cellKind)
{
case CellKind.Single:
if (_rotationValue ==0)
{
pipes[0].leakB = pipes[0].Img_1.gameObject;
}
else if (_rotationValue == 1)
{
pipes[0].leakL = pipes[0].Img_1.gameObject;
}
else if (_rotationValue == 2)
{
pipes[0].leakT = pipes[0].Img_1.gameObject;
}
else if (_rotationValue == 3)
{
pipes[0].leakR = pipes[0].Img_1.gameObject;
}
break;
case CellKind.StraightTwoFace:
if (_rotationValue == 0)
{
pipes[0].leakB = pipes[0].Img_1.gameObject;
pipes[0].leakT = pipes[0].Img_2.gameObject;
}
else if (_rotationValue == 1)
{
pipes[0].leakL = pipes[0].Img_1.gameObject;
pipes[0].leakR = pipes[0].Img_2.gameObject;
}
else if (_rotationValue == 2)
{
pipes[0].leakT = pipes[0].Img_1.gameObject;
pipes[0].leakB = pipes[0].Img_2.gameObject;
}
else if (_rotationValue == 3)
{
pipes[0].leakR = pipes[0].Img_1.gameObject;
pipes[0].leakL = pipes[0].Img_2.gameObject;
}
break;
case CellKind.CurvedTwoFace:
if (_rotationValue == 0)
{
pipes[0].leakB = pipes[0].Img_1.gameObject;
pipes[0].leakR = pipes[0].Img_2.gameObject;
}
else if (_rotationValue == 1)
{
pipes[0].leakL = pipes[0].Img_1.gameObject;
pipes[0].leakB = pipes[0].Img_2.gameObject;
}
else if (_rotationValue == 2)
{
pipes[0].leakT = pipes[0].Img_1.gameObject;
pipes[0].leakL = pipes[0].Img_2.gameObject;
}
else if (_rotationValue == 3)
{
pipes[0].leakR = pipes[0].Img_1.gameObject;
pipes[0].leakT = pipes[0].Img_2.gameObject;
}
break;
case CellKind.ThreeFace:
if (_rotationValue == 0)
{
pipes[0].leakB = pipes[0].Img_1.gameObject;
pipes[0].leakL = pipes[0].Img_2.gameObject;
pipes[0].leakR = pipes[0].Img_3.gameObject;
}
else if (_rotationValue == 1)
{
pipes[0].leakL = pipes[0].Img_1.gameObject;
pipes[0].leakB = pipes[0].Img_3.gameObject;
pipes[0].leakT = pipes[0].Img_2.gameObject;
}
else if (_rotationValue == 2)
{
pipes[0].leakT = pipes[0].Img_1.gameObject;
pipes[0].leakL = pipes[0].Img_3.gameObject;
pipes[0].leakR = pipes[0].Img_2.gameObject;
}
else if (_rotationValue == 3)
{
pipes[0].leakR = pipes[0].Img_1.gameObject;
pipes[0].leakB = pipes[0].Img_2.gameObject;
pipes[0].leakT = pipes[0].Img_3.gameObject;
}
break;
case CellKind.StraightDualTwoFace:
if (_rotationValue == 0)
{
pipes[0].leakB = pipes[0].Img_1.gameObject;
pipes[0].leakT = pipes[0].Img_2.gameObject;
}
else if (_rotationValue == 1)
{
pipes[0].leakL = pipes[0].Img_1.gameObject;
pipes[0].leakR = pipes[0].Img_2.gameObject;
}
else if (_rotationValue == 2)
{
pipes[0].leakT = pipes[0].Img_1.gameObject;
pipes[0].leakB = pipes[0].Img_2.gameObject;
}
else if (_rotationValue == 3)
{
pipes[0].leakR = pipes[0].Img_1.gameObject;
pipes[0].leakL = pipes[0].Img_2.gameObject;
}
//////////////////////////////////////////////////////////
if (_rotationValue == 0)
{
pipes[1].leakL = pipes[1].Img_1.gameObject;
pipes[1].leakR = pipes[1].Img_2.gameObject;
}
else if (_rotationValue == 1)
{
pipes[1].leakT = pipes[1].Img_1.gameObject;
pipes[1].leakB = pipes[1].Img_2.gameObject;
}
else if (_rotationValue == 2)
{
pipes[1].leakL = pipes[1].Img_2.gameObject;
pipes[1].leakR = pipes[1].Img_1.gameObject;
}
else if (_rotationValue == 3)
{
pipes[1].leakT = pipes[1].Img_2.gameObject;
pipes[1].leakB = pipes[1].Img_1.gameObject;
}
break;
case CellKind.CurvedDualTwoFace:
if (_rotationValue == 0)
{
pipes[0].leakR = pipes[0].Img_1.gameObject;
pipes[0].leakB = pipes[0].Img_2.gameObject;
}
else if (_rotationValue == 1)
{
pipes[0].leakB = pipes[0].Img_1.gameObject;
pipes[0].leakL = pipes[0].Img_2.gameObject;
}
else if (_rotationValue == 2)
{
pipes[0].leakL = pipes[0].Img_1.gameObject;
pipes[0].leakT = pipes[0].Img_2.gameObject;
}
else if (_rotationValue == 3)
{
pipes[0].leakT = pipes[0].Img_1.gameObject;
pipes[0].leakR = pipes[0].Img_2.gameObject;
}
//////////////////////////////////////////////////
if (_rotationValue == 0)
{
pipes[1].leakT = pipes[1].Img_1.gameObject;
pipes[1].leakL = pipes[1].Img_2.gameObject;
}
else if (_rotationValue == 1)
{
pipes[1].leakR = pipes[1].Img_1.gameObject;
pipes[1].leakT = pipes[1].Img_2.gameObject;
}
else if (_rotationValue == 2)
{
pipes[1].leakB = pipes[1].Img_1.gameObject;
pipes[1].leakR = pipes[1].Img_2.gameObject;
}
else if (_rotationValue == 3)
{
pipes[1].leakL = pipes[1].Img_1.gameObject;
pipes[1].leakB = pipes[1].Img_2.gameObject;
}
break;
default:
break;
}
}
}