//поличить информацию из дб public void TakeData(PathForBuy PathForBuy) { base.TakeData(PathForBuy); this.idPlayer = PathForBuy.IdPlayer; this.builds = PathForBuy.Builds; this.priceStreetPath = PathForBuy.PriceStreetPath; }
//кнструктор public ThingForTrade(PathForBuy pathforTrade, int price, Player forWhichPlayer, Player fromWhichPlayer) { PathforTrade = pathforTrade; Price = price; ForWhichPlayer = forWhichPlayer; FromWhichPlayer = fromWhichPlayer; }
//удаление из списка предложений товара public static void RemoveItemFromList(Player playerFrom, Player playerFor, PathForBuy path) { if (playerFrom.IdPlayer < playerFor.IdPlayer) { foreach (ThingForTrade thingForTrade in things[playerFrom.IdPlayer, playerFor.IdPlayer]) { if (thingForTrade.ForWhichPlayer == playerFor && thingForTrade.FromWhichPlayer == playerFrom && thingForTrade.PathforTrade == path) { things[playerFrom.IdPlayer, playerFor.IdPlayer].Remove(thingForTrade); break; } } } else { foreach (ThingForTrade thingForTrade in things[playerFor.IdPlayer, playerFrom.IdPlayer]) { if (thingForTrade.ForWhichPlayer == playerFor && thingForTrade.FromWhichPlayer == playerFrom && thingForTrade.PathforTrade == path) { things[playerFor.IdPlayer, playerFrom.IdPlayer].Remove(thingForTrade); break; } } } }
//разблокировка улицы при выплате полной стоимости private static void UnBlockStreetPath(PathForBuy pathForBuy, Player ownerPlayer) { if (pathForBuy.IsBlocked && ownerPlayer.Money >= pathForBuy.PriceStreetPath) { pathForBuy.IsBlocked = false; ownerPlayer.Money -= pathForBuy.PriceStreetPath; } }
//добавление в список предложений товара public static void AddItemToList(Player playerFrom, Player playerFor, PathForBuy path) { if (playerFrom.IdPlayer < playerFor.IdPlayer) { things[playerFrom.IdPlayer, playerFor.IdPlayer].Add(new ThingForTrade(path, 0, playerFor, playerFrom)); } else { things[playerFor.IdPlayer, playerFrom.IdPlayer].Add(new ThingForTrade(path, 0, playerFor, playerFrom)); } }
//обновить данные об участке для продажи public void updatePath(PathForBuy path) { paths[path.GetIdStreetPath()] = path; for (int i = 0; i < pathForBuys.Count; i++) { if (pathForBuys[i].GetIdStreetPath() == path.GetIdStreetPath()) { pathForBuys[i] = path; } } }
//блокировка улицы и возмещение её полной стоимости вместе с построенными зданиями игроку private static void BlockStreetPath(PathForBuy pathForBuy, Player ownerPlayer) { if (!pathForBuy.IsBlocked) { pathForBuy.IsBlocked = true; int sum = 0; sum += pathForBuy.PriceStreetPath; ownerPlayer.Money += sum; } else { UnBlockStreetPath(pathForBuy, ownerPlayer); } }
//выбор компьютерным игроком пути private int ThinkOfWay() { List <int> ends = _dbWork.GetPossibleEnds(currentStreetPath.GetIdStreetPath(), maxSteps - currentSteps); foreach (int possibleEnd in ends) { PathForBuy path = _dbWork.GetPathForBuy(possibleEnd); if (CheckIfNeed(possibleEnd) && (path == null || path.IdPlayer == 0)) { return(possibleEnd); } } int number = Random.Range(0, ends.Count - 2); Debug.Log(ends.Count + " " + number); return(ends[number]); }
//показать информацию об объекте private void onButtonInfoClick(int id, int type) { //type = 1 - streetspaths; 2 - players; 3 - builds string info = ""; switch (type) { case 1: PathForBuy pathForBuy = getDbWork().GetPathForBuy(id); if (pathForBuy != null) { info = "Название: " + pathForBuy.namePath + "\n" + "Владелец: " + getDbWork().GetPlayerbyId(pathForBuy.IdPlayer).NickName + "\n" + "Рента: " + pathForBuy.GetRenta() + "\n" + "Здания: " + pathForBuy.GetBuildsName() + "\n\n Информация об улице: " + getDbWork().getStreetById(pathForBuy.GetIdStreetParent()).AboutStreet; } else { StreetPath path = getDbWork().GetPathById(id); info = "Название: " + path.namePath + "\n" + "Гос. учереждение \n\n Информация об улице: " + getDbWork().getStreetById(path.GetIdStreetParent()).AboutStreet; } break; case 2: info = getDbWork().GetPlayerbyId(id).NickName + " " + getDbWork().GetPlayerbyId(id).Money; break; case 3: info = getDbWork().GetBuild(id).NameBuild + "\n" + getDbWork().GetBuild(id).AboutBuild; break; } ButtonWithInfo.GetComponentInChildren <Text>().text = info + "\n\n" + "(нажмите, чтобы закрыть)"; ButtonWithInfo.SetActive(true); }
//перемещение к выбранной улице, включение кнопки зданий на этой улице и важной информации об улице private void onButtonStreetClick(int idPath) { if (buildsButton.activeInHierarchy && idPath == currentIdPath) { buildsButton.SetActive(false); ImportantInfoAboutStreetText.transform.parent.gameObject.SetActive(false); } else { currentIdPath = idPath; buildsButton.SetActive(true); idStreetWhichOPened = idPath; ImportantInfoAboutStreetText.transform.parent.gameObject.SetActive(true); ImportantInfoAboutStreetText.gameObject.SetActive(true); PathForBuy pathForBuy = getDbWork().GetPathForBuy(idPath); camerasScript.SetActiveFirstCamera(); // if (camerasScript.isActiveOrtoCamera()) // { camerasScript.moveOrtoCamera(getDbWork().GetPathById(idPath).transform.position); // } if (pathForBuy != null) { ImportantInfoAboutStreetText.text = "Название: " + pathForBuy.namePath + "\n" + "Владелец: " + getDbWork().GetPlayerbyId(pathForBuy.IdPlayer) .NickName + "\n" + "Рента: " + pathForBuy.GetRenta() + "\n" + "Здания: " + pathForBuy.GetBuildsName(); } else { ImportantInfoAboutStreetText.text = "Название: " + getDbWork().GetPathById(idPath).namePath + "\n" + "Гос. учереждение"; } } }
//если игрок закончил ход на чужой улице, то с него снимается плата в пользу игрока, владеющего этой улицей void checkPlayer(int idPlayer) { Player ourPlayer = _dBwork.GetPlayerbyId(idPlayer); if (ourPlayer.GetCurrentStreetPath().canBuy) { PathForBuy path = _dBwork.GetPathForBuy(ourPlayer.GetCurrentStreetPath().GetIdStreetPath()); if (path.IdPlayer != 0 && path.IdPlayer != idPlayer) { path.StepOnMe(idPlayer); } } else { GovermentPath path = _dBwork.GetGovermentPath(ourPlayer.GetCurrentStreetPath().GetIdStreetPath()); path.StepOnMe(idPlayer); } if (ourPlayer.Money <= 0) { CheckForBankrupt(ourPlayer); } }
//корутина движенния бота private IEnumerator GoBot() { if (!isCheating) { _gameCanvas.OnOffSavedButtons(); way = _dbWork.GetWay(currentStreetPath.GetIdStreetPath(), ThinkOfWay()); bool tried = (Random.value * 100 > 95); if (tried) { GameController.aboutPlayer += "Игрок " + NickName + " пытался смухлевать \n"; if (Random.Range(0, 2) != 1) { GetCheat(); GameController.aboutPlayer += "Игрок " + NickName + " не попался \n"; alreadyCheat = true; } else { GameController.aboutPlayer += "Игрок " + NickName + " попался \n"; corutine = false; _gameCanvas.gameObject.GetComponent <GameController>().cathedPlayer(); yield break; } } } while (currentSteps < maxSteps || isCheating && way.Count > 0) { bool endFirstStep = false; int num = way.Count; StreetPath somewhere = null; for (int i = 0; i < num; i++) { if (i != 0) { somewhere = _dbWork.GetPathById(way.Dequeue()); } if (i == 0 && !endFirstStep) { somewhere = _dbWork.GetPathById(way.Dequeue()); if (currentStreetPath.isBridge && (currentStreetPath.start.Equals(somewhere.start) || currentStreetPath.start.Equals(somewhere.end))) { destination = currentStreetPath.start; angle = MapBuilder.Angle(transform.position, destination); yield return(new WaitUntil(() => transform.position == destination)); } else { destination = currentStreetPath.end; angle = MapBuilder.Angle(transform.position, destination); yield return(new WaitUntil(() => transform.position == destination)); } endFirstStep = true; i--; continue; } if (i == num - 1) { destination = MapBuilder.GetCenter(somewhere.start, somewhere.end); angle = MapBuilder.Angle(transform.position, destination); currentStreetPath = somewhere; yield return(new WaitUntil(() => transform.position == destination)); } else { if (somewhere.isBridge && transform.position.Equals(somewhere.end)) { destination = somewhere.start; angle = MapBuilder.Angle(transform.position, destination); yield return(new WaitUntil(() => transform.position == destination)); } else { destination = somewhere.end; angle = MapBuilder.Angle(transform.position, destination); yield return(new WaitUntil(() => transform.position == destination)); } } currentSteps++; } } GameController.aboutPlayer += "Игрок " + NickName + " пришел на " + currentStreetPath.namePath + "\n"; PathForBuy pathForBuy = _dbWork.GetPathForBuy(currentStreetPath.GetIdStreetPath()); if (currentStreetPath.CanBuy && pathForBuy.IdPlayer == 0 && money > pathForBuy.PriceStreetPath) { GameController.aboutPlayer += "Игрок " + NickName + " купил " + currentStreetPath.namePath + "\n"; pathForBuy.Buy(this); } corutine = false; ready = true; _gameCanvas.OnOffSavedButtons(); }
//предложение о торговле от компьютерного игрока private void TryToTrade() { //монополии (не обязательно полные) бота List <int> monopolies = GetMyMonopolies(_dbWork.GetMyPathes(idPlayer)); //поиск pathforbuy которого не хватает до полной монополии int count = 0; PathForBuy trade = null; foreach (int monopoly in monopolies) { foreach (StreetPath path in _dbWork.GetPathsOfStreet(monopoly)) { if (trade == null) { PathForBuy pathForBuy = _dbWork.GetPathForBuy(path.GetIdStreetPath()); if (path.canBuy && pathForBuy.IdPlayer != 0 && pathForBuy.IdPlayer != idPlayer) { trade = pathForBuy; count = 1; break; } } } if (trade != null) { break; } } //если нет таких, то выходим if (trade == null) { return; } //поиск, какому игроку принадлежит улица Player player = _dbWork.GetPlayerbyId(trade.IdPlayer); Trade.CreateListThings(player, this); Trade.AddItemToList(player, this, trade); //проверяем, есть ли у этого игрока ещё улицы из этой монополии foreach (StreetPath streetPath in _dbWork.GetPathsOfStreet(trade.GetIdStreetParent())) { PathForBuy path = _dbWork.GetPathForBuy(streetPath.GetIdStreetPath()); if (streetPath.CanBuy && path.GetIdStreetPath() != trade.GetIdStreetPath() && path.IdPlayer == trade.IdPlayer) { Trade.AddItemToList(player, this, path); count++; } } //если достаточно денег, то записываем деньги в сделку и открываем игроку канву с предложением о сделке if (count * price <= money) { Trade.AddMoneyToList(player, this, count * price); if (!player.IsBot()) { _gameCanvas.OpenTradeFromBotToPlayer(this, player, count * price); } else { player.ThinkAboutTrade(this); } } else { //прописать отмену сделки } }