private void GenerateNewTrain() { var lastTrain = Trains.Last(); var newTrainPos = lastTrain.LastTrainPos; var newTrainController = _poolService.GetObject <TrainController>("Train", newTrainPos); newTrainController.NextTrain = lastTrain; newTrainController.IsDead = false; newTrainController.StartCoroutine(newTrainController.SetLastTrainPos()); Trains.Add(newTrainController); newTrainController.spriteRenderer.sprite = spriteRenderer.sprite; _audioService.Play(AudioClipType.NewTrain); if (Trains.Count == 15) { _achievementsService.UnlockAchievement(GPGSIds.achievement_long_long_train); } _achievementsService.IncrementAchievement(GPGSIds.achievement_little_factory, 1); _achievementsService.IncrementAchievement(GPGSIds.achievement_train_company, 1); _achievementsService.IncrementAchievement(GPGSIds.achievement_steam_baron, 1); }
public void GenerateRails() { NewRow = new Row(); int maxRailCountFromOutput = CurrentRow <= 4 ? 1 : 3; var enabledPrefabs = GetRailPrefabs(OldRow.Outputs); foreach (var output in OldRow.Outputs) { if (output.Value.OutputRails.Count == 0) { continue; } var outputId = output.Key; var outputRail = output.Value.OutputRails.First(); var outputPosition = outputRail.EndPoint.position; List <RailController> prefabs = enabledPrefabs[outputId]; int newRailsCount = 1; if (_uiService.IsFirstTime) { if (_hasFirstStop) { newRailsCount = Random.Range(1, maxRailCountFromOutput + 1); } else { switch (CurrentRow) { case 1: case 2: case 3: case 6: case 9: newRailsCount = 1; break; case 4: case 5: case 7: case 8: newRailsCount = 2; break; case 10: newRailsCount = 3; break; } } } else { if (CurrentRow >= 4) { newRailsCount = Random.Range(1, maxRailCountFromOutput + 1); } } List <int> indexes = GetPrefabsIndexes(newRailsCount, prefabs.Count); foreach (var newRailController in indexes.Select(index => _poolService.GetObject <RailController>(prefabs[index].name, outputPosition + Vector3.up * 0.01f, Quaternion.identity))) { newRailController.NextRails.Clear(); newRailController.NextActiveRail = null; newRailController.Row = CurrentRow; output.Value.OutputRails.ForEach(rail => { rail.NextActiveRail = newRailController; rail.NextRails.Add(newRailController); }); newRailController.InputId = outputId; if (indexes.Count > 1) { newRailController._spriteMask.sprite = newRailController._splitMask; } switch (newRailController.RailDirection) { case RailDirection.Left: newRailController.OutputId = outputId - 1; break; case RailDirection.Strait: case RailDirection.CircleRight: case RailDirection.CircleLeft: newRailController.OutputId = outputId; break; case RailDirection.Right: newRailController.OutputId = outputId + 1; break; default: throw new ArgumentOutOfRangeException(); } NewRow.Rails.Add(newRailController); if (NewRow.Outputs.ContainsKey(newRailController.OutputId)) { NewRow.Outputs[newRailController.OutputId].OutputRails.Add(newRailController); } else { NewRow.Outputs.Add(newRailController.OutputId, new Output { OutputRails = new List <RailController> { newRailController } }); } } } CircleRailConfig circleConfig; if (CircleRailsConfig.ToList().Any(kv => !kv.Value)) { circleConfig = GetRandomCircleConfig(); } else { UpdateCircleRailsConfigDictionary(); circleConfig = GetRandomCircleConfig(); } GenerateItems(circleConfig); _rowsList.Add(CurrentRow, NewRow); OldRow = new Row(NewRow); CurrentRow++; }