예제 #1
0
        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);
        }
예제 #2
0
        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++;
        }