/**********************************************************************************/ // устанавливаем параметры миссионного дропа // /**********************************************************************************/ public void SetLevel(List <DropItemDescriptor> dropSettings, int maxNumOfDropInSceen) { if (dropSettings.Count == 0) { Debug.LogError("Drop settings is empty!"); return; } m_levelTimer = 0.0f; m_deploedDrops = new Dictionary <Base.GO_TYPE, int>(); m_dropDescriptor = new List <DropItemDescriptorEditor>(); // сохраняем настройки по количеству дропа foreach (var drop in dropSettings) { DropItemDescriptorEditor itemDrop = new DropItemDescriptorEditor(drop); m_dropDescriptor.Add(itemDrop); // устанавливаем одновременно допустимое на карте количесво конкретного дропа if (itemDrop.MaxNumOfDrop != (int)DropItemDescriptorEditor.DROP_MARKER.UNLIMITED) { m_deploedDrops[itemDrop.DropType] = itemDrop.MaxNumOfDrop; } else { m_deploedDrops[itemDrop.DropType] = maxNumOfDropInSceen; } } m_maxNumberOfDroppedBonus = maxNumOfDropInSceen; m_currentNumberOfDroppedBonus = 0; m_state = DM_STATE.WAIT_FOR_DEPLAY; m_currentTimerToNextDrop = Random.Range(TimeBetweenDropMin, TimeBetweenDropMax); }
/**********************************************************************************/ // проверяем состояние дропа // /**********************************************************************************/ private void FixedUpdate() { if (GameManager.GamePaused) { return; } if (m_state == DM_STATE.WAIT_FOR_DEPLAY) { m_currentTimerToNextDrop -= Time.deltaTime; if (m_currentTimerToNextDrop <= 0.0f) { DeployRandomBonus(); if (m_currentNumberOfDroppedBonus >= m_maxNumberOfDroppedBonus) { m_state = DM_STATE.READY; } else { m_currentTimerToNextDrop = Random.Range(TimeBetweenDropMin, TimeBetweenDropMax); } } } m_levelTimer += Time.deltaTime; }
/**********************************************************************************************/ // Загружаем все данные из файлов настройки (m_defaultSettingsDataFile) // /**********************************************************************************************/ void LoadSettingsFromFile() { m_state = DM_STATE.INITIALIZATION; string filePath = Path.Combine(Application.streamingAssetsPath, m_defaultSettingsDataFile); if (File.Exists(filePath)) { string dataAsJson = File.ReadAllText(filePath); m_companyMissionData = JsonUtility.FromJson <CompanyDescriptor>(dataAsJson); m_state = DM_STATE.READY; } else { Debug.LogError("Cannot find file!"); } }
/**********************************************************************************/ // функция извещающая CompanyManager о загрузке новой карты в компании // /**********************************************************************************/ public void OnSceneLoaded() { MissionDescriptor missionSettings = m_companyMissionData.missions[m_levelNumber]; MapGenerator.MapGeneratorSettings set = new MapGenerator.MapGeneratorSettings(); set.MapXSize = missionSettings.MapXSize; set.MapYSize = missionSettings.MapYSize; // разбираем все доступные для данной миссии здания и устанавливаем их в сет for (int i = 0; i < missionSettings.Buildings.Length; i++) { AvailableBuilding building = missionSettings.Buildings[i]; Base.BLOCK_TYPE blockType = Base.StringToBlockType(building.BuildingType); MapGenerator.BlockWeight bw = new MapGenerator.BlockWeight(); bw.BlockType = blockType; bw.Weight = building.Weight; set.AvalibleBlocks.Add(bw); } // генерируем карту для уровня в соответствии с настройками MapGenerator.GetInstance().GenerateMap(set); // устанавливаем параметры дропа List <DropItemDescriptor> dropList = new List <DropItemDescriptor>(missionSettings.DropDescriptor.DropItems); DropManager.GetInstance().SetLevel(dropList, missionSettings.DropDescriptor.MaxNumOfDroppedItem); /* * DropManager.GetInstance().TimeBetweenDropMin = 8; * DropManager.GetInstance().TimeBetweenDropMin = 16; */ // приостанавливаем игру до момента начала раунда GameManager.SetPauseState(true, true); // ожидаем начала раунда m_state = DM_STATE.WAIT_FOR_ROUND_START; m_currectTimer = PauseBeforeRound; // обновляем счётчик побед UIController.GetInstance().SetGameScore(m_pl1WinnNum, m_pl2WinnNum); }
/**********************************************************************************/ // в FixedUpdate мы проверяем состояние игры // /**********************************************************************************/ public void OnGoalAchived(PLAYER losePlayerID) { PLAYER winner = PLAYER.NO_PLAYER; if (losePlayerID == PLAYER.PL1) { winner = PLAYER.PL2; m_pl2WinnNum++; } else if (losePlayerID == PLAYER.PL2) { winner = PLAYER.PL1; m_pl1WinnNum++; } // обновляем UI и пишем имя победителя на экране string playerName = Base.GetPlayerName(winner); if (m_pl1WinnNum >= RoundsToWin || m_pl2WinnNum >= RoundsToWin) { UIController.GetInstance().DeclareWinner(playerName); m_duelIsFinished = true; } else { UIController.GetInstance().DeclareRoundWinner(playerName); } // обновляем счётчик побед UIController.GetInstance().SetGameScore(m_pl1WinnNum, m_pl2WinnNum); // приостанавливаем игру до следующего раунда / выхода из дуэли GameManager.SetPauseState(true, true); // ожидаем окончания рауда m_state = DM_STATE.WAIT_FOR_ROUND_END; m_currectTimer = PauseAfterRound; }
/**********************************************************************************/ // в FixedUpdate мы проверяем состояние игры // /**********************************************************************************/ private void FixedUpdate() { // дожидаемся начала раунда if (m_state == DM_STATE.WAIT_FOR_ROUND_START) { m_currectTimer -= Time.deltaTime; UIController.GetInstance().SetTimerMessage((int)Mathf.Floor(m_currectTimer + 0.5f)); if (m_currectTimer <= 0.0) { GameManager.SetPauseState(false, true); m_state = DM_STATE.IN_GAME; UIController.GetInstance().HideMessagePanel(); } } // выдерживаем паузу перед началом следующего раунда else if (m_state == DM_STATE.WAIT_FOR_ROUND_END) { m_currectTimer -= Time.deltaTime; if (m_currectTimer <= 0.0) { m_state = DM_STATE.READY; // если дуэль закончилась - выходим if (m_duelIsFinished) { SceneManager.LoadScene("MainMenu", LoadSceneMode.Single); } else { m_levelNumber++; SceneManager.LoadScene("DuelLevel", LoadSceneMode.Single); } } } }
/**********************************************************************************/ // извещаем менеджер, что бонус был подобран // /**********************************************************************************/ public void BonusWasTaked(Base.GO_TYPE bonusType) { // в отношении бонусов прибывших не с орбиты - ничего не предпринимаем - они не в юрисдикции DropManager if (!m_deploedDrops.ContainsKey(bonusType)) { Debug.Log("Bonus ignored: " + bonusType.ToString()); return; } m_currentNumberOfDroppedBonus--; // увеличиваем счётчик одновременно присутствующих бонусов if (m_deploedDrops[bonusType] != (int)DropItemDescriptorEditor.DROP_MARKER.UNLIMITED) { m_deploedDrops[bonusType]++; } // корректируем общий счётчик бонусов if (m_currentNumberOfDroppedBonus < m_maxNumberOfDroppedBonus) { m_state = DM_STATE.WAIT_FOR_DEPLAY; m_currentTimerToNextDrop = Random.Range(TimeBetweenDropMin, TimeBetweenDropMax); } }
//Helper function that sets our state to the inputted state. void SetState(DM_STATE STATE) { cur_state = STATE; }