You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
PlumberUltimateAds/Assets/Scripts/LevelDesigner.cs

342 lines
9.2 KiB
C#

4 weeks ago
/*
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 MS;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class LevelDesigner : MonoBehaviour
{
public List<Cell> _cellPrefab;
public LevelDesignCell _levelDesigncellPrefab;
public Button newBtn;
public Button openBtn;
public Button saveBtn;
public int row;
public int column;
public InputField rowInput;
public InputField columnInput;
public Text levelSizeLbl;
public Popup cellTypePopup;
public Text pipeColorLbl;
public GameObject chooseColorBegin;
public GameObject chooseColorEnd;
[Header("Layout Setting")]
public RectTransform _levelContainer;
public float _space = 1f;
public bool enableSaveWithoutCheck;
[HideInInspector]
public List<LevelDesignCell> allCellList;
private RectTransform rootCanvas;
private float _levelContainerMaxHeight;
public static LevelDesigner instance;
private LevelDesignCell _selectedCell;
public LevelDesignCell SelectedCell
{
get
{
return _selectedCell;
}
set
{
if (_selectedCell != null)
{
_selectedCell.selectionImage.gameObject.SetActive(value: false);
}
_selectedCell = value;
if (_selectedCell != null)
{
chooseColorBegin.gameObject.SetActive(SelectedCell != null && SelectedCell.cell.pipeCellType == CellType.Start);
chooseColorEnd.gameObject.SetActive(SelectedCell != null && SelectedCell.cell.pipeCellType == CellType.End);
_selectedCell.selectionImage.gameObject.SetActive(value: true);
}
else
{
chooseColorBegin.gameObject.SetActive(value: false);
chooseColorEnd.gameObject.SetActive(value: false);
UpdatePipes();
}
}
}
private void Start()
{
instance = this;
rowInput.onValueChanged.AddListener(delegate(string arg)
{
if (arg.StartsWith("-"))
{
rowInput.text = string.Empty;
}
else
{
int.TryParse(arg, out row);
}
});
columnInput.onValueChanged.AddListener(delegate(string arg)
{
if (arg.StartsWith("-"))
{
columnInput.text = string.Empty;
}
else
{
int.TryParse(arg, out column);
}
});
ResetLevelDesigner();
rootCanvas = base.transform.parent.GetComponent<RectTransform>();
_levelContainerMaxHeight = _levelContainer.rect.height;
}
private void Update()
{
if (SelectedCell != null)
{
if (UnityEngine.Input.GetKeyUp(KeyCode.Alpha1) || UnityEngine.Input.GetKeyUp(KeyCode.Keypad1))
{
OnCellSilider(2f);
OnCRotSilider(1f);
}
else if (UnityEngine.Input.GetKeyUp(KeyCode.Alpha2) || UnityEngine.Input.GetKeyUp(KeyCode.Keypad2))
{
OnCellSilider(2f);
OnCRotSilider(0f);
}
else if (UnityEngine.Input.GetKeyUp(KeyCode.Alpha3) || UnityEngine.Input.GetKeyUp(KeyCode.Keypad3))
{
OnCellSilider(6f);
}
else if (UnityEngine.Input.GetKeyUp(KeyCode.X))
{
OnCellSilider(0f);
}
else if (UnityEngine.Input.GetKeyUp(KeyCode.RightArrow))
{
OnCRotSilider((SelectedCell.cellData.RightRotationValue + 1) % 4);
}
else if (UnityEngine.Input.GetKeyUp(KeyCode.LeftArrow))
{
OnCRotSilider((SelectedCell.cellData.RightRotationValue - 1 >= 0) ? (SelectedCell.cellData.RightRotationValue - 1) : 3);
}
}
saveBtn.interactable = (saveBtn.interactable || enableSaveWithoutCheck);
}
public void OnNewBtn()
{
if (rowInput.gameObject.activeSelf)
{
if (string.IsNullOrEmpty(rowInput.text) || string.IsNullOrEmpty(columnInput.text))
{
Toast.instance.ShowMessage("You can't leave row or column empty");
return;
}
if (row == 0 || column == 0)
{
Toast.instance.ShowMessage("Row and column must be larger than 0");
return;
}
SetupLevel(row, column);
newBtn.GetComponentInChildren<Text>().text = "New";
openBtn.gameObject.SetActive(value: true);
saveBtn.gameObject.SetActive(value: true);
rowInput.gameObject.SetActive(value: false);
columnInput.gameObject.SetActive(value: false);
}
else
{
newBtn.GetComponentInChildren<Text>().text = "Ok";
openBtn.gameObject.SetActive(value: false);
saveBtn.gameObject.SetActive(value: false);
rowInput.gameObject.SetActive(value: true);
columnInput.gameObject.SetActive(value: true);
ResetLevelDesigner();
}
}
public void OnOpenBtn()
{
}
public void OnSaveBtn()
{
}
public void ResetLevelDesigner()
{
SelectedCell = null;
saveBtn.interactable = false;
allCellList = new List<LevelDesignCell>();
for (int num = _levelContainer.childCount - 1; num >= 0; num--)
{
UnityEngine.Object.DestroyImmediate(_levelContainer.GetChild(num).gameObject);
}
}
public void SetupLevel(int row, int column)
{
ResetLevelDesigner();
_levelContainer.sizeDelta = new Vector2(rootCanvas.rect.width, _levelContainerMaxHeight);
float a = Mathf.Min(_levelContainer.rect.width / (float)column, _levelContainer.rect.height / (float)row);
a = Mathf.Min(a, 140f);
_levelContainer.sizeDelta = new Vector2((float)column * a, (float)row * a);
for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; j++)
{
LevelDesignCell levelDesignCell = UnityEngine.Object.Instantiate(_levelDesigncellPrefab, _levelContainer);
levelDesignCell.GetComponent<RectTransform>().sizeDelta = Vector2.one * a;
levelDesignCell.GetComponent<RectTransform>().anchoredPosition = new Vector2((float)j * a + (float)j * _space, (float)(-i) * a - (float)i * _space);
levelDesignCell.cellData = new LevelCellData(0, 0, 0, PipeColor.None, redundant: false);
levelDesignCell.pos = new Vector2Int(j, i);
allCellList.Add(levelDesignCell);
levelDesignCell.UpdateCell();
}
}
SelectedCell = null;
}
public void OnCellSilider(float t)
{
int cellIndex = (int)t;
if (SelectedCell != null)
{
SelectedCell.cellData.CellIndex = cellIndex;
SelectedCell.cellData.DefaultColor = PipeColor.None;
SelectedCell.UpdateCell();
}
chooseColorBegin.gameObject.SetActive(SelectedCell != null && SelectedCell.cell.pipeCellType == CellType.Start);
chooseColorEnd.gameObject.SetActive(SelectedCell != null && SelectedCell.cell.pipeCellType == CellType.End);
UpdatePipes();
}
public void OnCRotSilider(float t)
{
int num = (int)t;
if (SelectedCell != null)
{
SelectedCell.cellData.RightRotationValue = num;
SelectedCell.cell.RotationValue = num;
SelectedCell.cell.ApplyRotationOnImage();
UpdatePipes();
}
}
public void OnColorChosen(int v)
{
Text text = pipeColorLbl;
PipeColor pipeColor = (PipeColor)v;
text.text = "Color : " + pipeColor.ToString();
SelectedCell.cellData.DefaultColor = (PipeColor)v;
SelectedCell.cell.defaultColor = (PipeColor)v;
UpdatePipes();
}
public void OnButtonClick(LevelDesignCell c)
{
SelectedCell = c;
}
private void UpdatePipes()
{
allCellList.ForEach(delegate(LevelDesignCell obj)
{
obj.RemoveAllPipeColor();
});
allCellList.ForEach(delegate(LevelDesignCell designCell)
{
Cell cell = designCell.cell;
if (cell.pipeCellType == CellType.Start)
{
LevelDesignCell levelDesignCell = cell.pipes[0].T ? designCell.TopCell : (cell.pipes[0].B ? designCell.BottomCell : ((!cell.pipes[0].L) ? designCell.RightCell : designCell.LeftCell));
Side sourceSide = cell.pipes[0].T ? Side.T : (cell.pipes[0].R ? Side.R : (cell.pipes[0].B ? Side.B : Side.L));
if (levelDesignCell != null)
{
levelDesignCell.FillColor(new List<PipeColor>
{
cell.defaultColor
}, designCell, sourceSide);
}
}
});
allCellList.ForEach(delegate(LevelDesignCell obj)
{
obj.cell.UpdatePipeColor();
});
saveBtn.interactable = IsGameOver();
}
public bool IsGameOver()
{
List<LevelDesignCell> list = allCellList.FindAll((LevelDesignCell obj) => obj.cell.pipeCellType == CellType.End);
List<LevelDesignCell> list2 = allCellList.FindAll((LevelDesignCell obj) => obj.cell.pipeCellType == CellType.Start);
List<LevelDesignCell> list3 = list.FindAll((LevelDesignCell x) => x.cell.defaultColor == PipeColor.None);
List<LevelDesignCell> list4 = list2.FindAll((LevelDesignCell x) => x.cell.defaultColor == PipeColor.None);
if (list.Count == 0 || list2.Count == 0 || list3.Count != 0 || list4.Count != 0)
{
return false;
}
foreach (LevelDesignCell item in list)
{
if (item.cell.defaultColor != ColorManager.MixPipeColor(item.cell.pipes[0].fillColor))
{
return false;
}
}
foreach (LevelDesignCell allCell in allCellList)
{
Cell cell = allCell.cell;
foreach (Pipe pipe in cell.pipes)
{
if (((cell.pipeCellType != CellType.Start && cell.pipeCellType != CellType.End) ? ColorManager.MixPipeColor(pipe.fillColor) : cell.defaultColor) != 0)
{
if ((pipe.L && allCell.LeftCell == null) || (pipe.R && allCell.RightCell == null) || (pipe.T && allCell.TopCell == null) || (pipe.B && allCell.BottomCell == null))
{
return false;
}
if ((pipe.L && !allCell.LeftCell.HasSide(Side.R)) || (pipe.R && !allCell.RightCell.HasSide(Side.L)) || (pipe.T && !allCell.TopCell.HasSide(Side.B)) || (pipe.B && !allCell.BottomCell.HasSide(Side.T)))
{
return false;
}
}
}
}
return true;
}
}