//Вызывается при нажатии на кнопку загрузки определенного сохранения, открывает файл, генерирует кампанию из полученного сида и передает ее на UI для отрисовки public void loadSave(int index) { Stream stream = File.Open(savePath + "/save" + index + ".xml", FileMode.Open); BinaryFormatter formatter = new BinaryFormatter(); curSaveIndex = index; cl_campaign loaded = (cl_campaign)formatter.Deserialize(stream); stream.Close(); loaded.generate(true, loaded.seed); curCampaign = loaded; ui.openCampaign(curCampaign); }
//Вызывается при создании, либо обновлении статуса кампании, сохраняет ее в указанный файл public void saveGame(cl_campaign camp, bool newSave, int index) { if (newSave) { index = savescount + 1; savescount++; } Stream stream = File.Open(savePath + "/save" + index + ".xml", FileMode.Create); BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(stream, camp); stream.Close(); }
//Вызывается при нажатии кнопки "New Game", проверяет, не превышено ли максимальное количество сохранений, если нет - генерирует новую кампанию, сохраняет ее и передает на UI для отрисовки public void newGame() { checkSaves(); if (savescount < 3) { curCampaign = new cl_campaign(); curCampaign.generate(false, 0); ui.openCampaign(curCampaign); curSaveIndex = savescount + 1; saveGame(curCampaign, true, 4); } else { InitLoadMenu(); } }
//Метод, используемый для отрисовки кампании на UI, очищает соответствующее поле, определяет его размеры, создает и расставляет необходимые кнопки, добавляет евент открытия соответствующего уровня при их нажатии, //отображает статус уровня, исходя из текущего прогресса, рисует линии между открытыми и пройденными уровнями public void openCampaign(cl_campaign curCampaign) { switchToGameView(false); setMenuScreen(2); foreach (Transform child in menuScreens[2].transform) { if (child.name != "Back") { Destroy(child.gameObject); } } float maxX = Menu.transform.GetComponent <RectTransform>().rect.width / 2 - LevelButPrefab.transform.GetComponent <RectTransform>().rect.width; float maxY = Menu.transform.GetComponent <RectTransform>().rect.height / 2 - LevelButPrefab.transform.GetComponent <RectTransform>().rect.height; float prevX = 0; GameObject[] buts = new GameObject[curCampaign.levels.Count]; System.Random rndObj = new System.Random(curCampaign.seed); for (int i = 0; i < curCampaign.levels.Count; i++) { buts[i] = Instantiate(LevelButPrefab, menuScreens[2].transform); if (prevX > 0) { buts[i].transform.GetComponent <RectTransform>().localPosition = new Vector3(rndObj.Next(System.Convert.ToInt32(-maxX), 0), -maxY + i * (maxY * 2 / curCampaign.levels.Count), 0); } else { buts[i].transform.GetComponent <RectTransform>().localPosition = new Vector3(rndObj.Next(0, System.Convert.ToInt32(maxX)), -maxY + i * (maxY * 2 / curCampaign.levels.Count), 0); } prevX = buts[i].transform.GetComponent <RectTransform>().localPosition.x; buts[i].transform.Find("Text").GetComponent <Text>().text = (i + 1) + "\nlevel"; int flag = i; buts[i].GetComponent <Button>().onClick.AddListener(delegate() { gameC.openLevel(flag); }); switch (curCampaign.states[i]) { case 0: buts[i].GetComponent <Button>().interactable = false; break; case 1: break; case 2: buts[i].GetComponent <Image>().color = Color.green; break; } if (i != 0 && curCampaign.states[i] != 0) { GameObject lineObj = new GameObject(); LineRenderer lr = lineObj.AddComponent <LineRenderer>(); lineObj.transform.parent = menuScreens[2].transform; lineObj.transform.position = buts[i - 1].transform.position; lr.material = lineMaterial; lr.startWidth = 0.2f; lr.endWidth = 0.2f; lr.SetPositions(new Vector3[] { new Vector3(buts[i - 1].transform.position.x, buts[i - 1].transform.position.y, 0), new Vector3(buts[i].transform.position.x, buts[i].transform.position.y, 0) }); } } }