protected override void Visualize(float factor)
 {
     RealmData.Init startData = RealmData.initializers[start];
     RealmData.Init endData   = RealmData.initializers[end];
     worldLight.color      = Color.Lerp(startData.worldLightColor, endData.worldLightColor, factor);
     worldLight.intensity  = Mathf.Lerp(startData.worldLightIntensity, endData.worldLightIntensity, factor);
     worldLight.renderMode = LightRenderMode.ForcePixel;
 }
Esempio n. 2
0
        void OnPuzzleComplete(object sender, InstantMessageArgs args)
        {
            PuzzleCompleteStatus completeStatus = (PuzzleCompleteStatus)args.arg;

            if (!puzzleCompletionProcessed)
            {
                // this may be the first pass at tutorial levels
                puzzleCompletionProcessed = true;
                Debug.Log("GameManager.OnPuzzleComplete: set puzzleCompletionProcessed flag to true");
                bool firstRound = GlobalManager.MStorage.FirstRound;
                if (completeStatus != null)
                {
                    int            nextLevelId = GlobalManager.MLevel.NextLevel(completeStatus.descriptor.init.id);
                    int            prevLevelId = GlobalManager.MLevel.PreviousLevel(completeStatus.descriptor.init.id);
                    RealmData.Init realmData   = RealmData.initializers[completeStatus.descriptor.init.realmId];

                    // set a message queue for the Victory screen
                    if (completeStatus.firstTime)   // a puzzle is assembled for the first time
                    {
                        GlobalManager.MQueue.PostMessage(levelCompletedId);
                        if (completeStatus.descriptor.init.id == 0)                                  // this is the very first puzzle in the game
                        {
                            GlobalManager.MStorage.GalleryLevel = completeStatus.descriptor.init.id; // set the gallery level to the newly completed one
                            GlobalManager.MStorage.FirstGallery = true;                              // gallery message should be shown
                            GlobalManager.MQueue.PostMessage(galleryOpenedId);                       // post a message about the gallery
                        }
                        if (completeStatus.descriptor.init.realmId >= 0)                             // this should always be true, yet...
                        {
                            if (realmData.mainLevelId == completeStatus.descriptor.init.id)
                            {
                                // main (first) level of the realm has been complete
                                GlobalManager.MQueue.PostMessage(realmRevealedId);
                            }
                        }
                        if (nextLevelId >= 0)
                        {
                            // there is another level to play at
                            GlobalManager.MQueue.PostMessage(newLevelPlayableId);
                        }
                    }
                    else
                    {
                        GlobalManager.MQueue.PostMessage(levelCompletedOnceAgainId);
                    }

                    // Do the accounting chores
                    // Also report of achievements
                    long earnedPoints = completeStatus.descriptor.state.EarnedPoints;
                    if (firstRound)
                    {
                        switch (completeStatus.descriptor.init.id)
                        {
                        case 0:
                            completeStatus.descriptor.state.EarnedPoints =
                                ((completeStatus.descriptor.init.height + 1) * completeStatus.descriptor.init.height / 2) * puzzleAssembledRowBonusStep +
                                firstRunLevel0Row0Bonus +
                                puzzleCompleteBonus;
                            GlobalManager.MAchievement.ReportNewAchievement(AchievementType.FirstPuzzleAssembled);
                            break;

                        case 1:
                            completeStatus.descriptor.state.EarnedPoints =
                                ((completeStatus.descriptor.init.height + 1) * completeStatus.descriptor.init.height / 2) * puzzleAssembledRowBonusStep +
                                firstRunLevel1Row0Bonus +
                                firstRunLevel1Row1Bonus +
                                puzzleCompleteBonus;
                            AddBonusCoins();
                            GlobalManager.MAchievement.ReportNewAchievement(AchievementType.SecondPuzzleAssembled);
                            break;

                        case 2:
                            GlobalManager.MAchievement.ReportNewAchievement(AchievementType.ThirdPuzzleAssembled);
                            break;

                        default:
                            AddPoints(ref earnedPoints, puzzleCompleteBonus);
                            completeStatus.descriptor.state.EarnedPoints = earnedPoints;
                            break;
                        }
                    }
                    else
                    {
                        AddPoints(ref earnedPoints, puzzleCompleteBonus);
                        completeStatus.descriptor.state.EarnedPoints = earnedPoints;
                    }
                    GlobalManager.MInstantMessage.DeliverMessage(InstantMessageType.GUIRotoChipsChanged, this, (decimal)completeStatus.descriptor.state.EarnedPoints);
                    earnedPoints = GlobalManager.MStorage.CurrentPoints;
                    AddPoints(ref earnedPoints, completeStatus.descriptor.state.EarnedPoints);
                    GlobalManager.MStorage.CurrentPoints = earnedPoints;
                    //completeStatus.descriptor.state.Complete = true;

                    // set all the levels in the current realm revealed
                    bool realmComplete = true;
                    for (int i = 0; i < realmData.members.Length; i++)
                    {
                        LevelDataManager.Descriptor descriptor = GlobalManager.MLevel.GetDescriptor(realmData.members[i]);
                        if (!descriptor.state.Revealed)
                        {
                            descriptor.state.Revealed = true;
                        }
                        // check if all other levels in the realm are complete
                        if (descriptor.init.id != completeStatus.descriptor.init.id && !descriptor.state.Complete)
                        {
                            realmComplete = false;
                        }
                    }

                    // now add an achievement
                    if (firstRound)
                    {
                        switch (completeStatus.descriptor.init.id)
                        {
                        case 0:
                            break;

                        case 1:
                            break;
                        }
                    }

                    if (nextLevelId >= 0)
                    {
                        // make next level revealed and playable
                        LevelDataManager.Descriptor descriptor = GlobalManager.MLevel.GetDescriptor(nextLevelId);
                        descriptor.state.Revealed = true;
                        descriptor.state.Playable = true;
                        completeStatus.descriptor.state.NextPlayableId = nextLevelId;
                        //GlobalManager.MStorage.SelectedLevel = nextLevelId;
                    }
                    if (prevLevelId >= 0)
                    {
                        // link previously completed level to the newly completed one
                        LevelDataManager.Descriptor descriptor = GlobalManager.MLevel.GetDescriptor(prevLevelId);
                        descriptor.state.NextCompleteId = completeStatus.descriptor.init.id;
                    }

                    // check if the game is complete
                    if (realmComplete)
                    {
                        GlobalManager.MQueue.PostMessage(realmCompletedId);
                        if (realmData.id >= 0 && realmData.id < realmAchievements.Length)
                        {
                            GlobalManager.MAchievement.ReportNewAchievement(realmAchievements[realmData.id]);
                        }
                        if (nextLevelId < 0)    // no more new levels
                        {
                            // the game is complete
                            GlobalManager.MStorage.GameFinished = true;
                            GlobalManager.MStorage.FirstRound   = false;
                            GlobalManager.MQueue.PostMessage(gameCompletedId);
                            GlobalManager.MAchievement.ReportNewAchievement(AchievementType.FirstRunFinished);
                        }
                        else
                        {
                            GlobalManager.MQueue.PostMessage(realmOpenedId);
                        }
                    }
                }
            }
            // there may be some unshown hints; notify for puzzle processing completion otherwise
            if (puzzleHintsShown)
            {
                // this may be the second pass at tutorial levels (0 and 1)
                Debug.Log("GameManager.OnPuzzleComplete: all hints are shown, completing the level");
                completeStatus.descriptor.state.Complete = true;
                GlobalManager.MStorage.SelectedLevel     = GlobalManager.MLevel.NextLevel(completeStatus.descriptor.init.id);
                GlobalManager.MInstantMessage.DeliverMessage(InstantMessageType.PuzzleCompleteProcessed, this, completeStatus);
            }
            else
            {
                Debug.Log("GameManager.OnPuzzleComplete: not every hint is shown yet");
            }
        }
        protected override void AwakeInit()
        {
            registrator.Add(new MessageRegistrationTuple {
                type = InstantMessageType.GUIWhiteCurtainFaded, handler = OnGUIWhiteCurtainFaded
            });

            fadeClouds = false;

            //EnableRotation(false);                                  // make sure the sphere does not rotate while constructing spikes

            // now construct and set up level selectors
            transform.eulerAngles = new Vector3(0, 0, 0);
            float radius = transform.localScale.x / 2f;             // all radii are aqual

            selectors = new List <GameObject>();                    // a list of selector objects
            Vector3 position = transform.position;

            position.z = -radius;
            GameObject previousSelector = null;     // this one is needed to draw the intercube connector

            Quaternion cloudsRotation   = Quaternion.Euler(0, 0, 0);
            bool       setClouds        = false;
            int        visibleSelectors = 0;

            foreach (LevelDataManager.Descriptor descriptor in GlobalManager.MLevel.LevelDescriptors())
            {
                if (noStatusCheck || descriptor.state.Revealed)     // the level is visible on the world map
                {
                    // set initial rotation for the level button
                    Quaternion rotation = Quaternion.Euler(descriptor.init.eulerX, descriptor.init.eulerY, descriptor.init.eulerZ);
                    transform.rotation = rotation;

                    // create and set up a level selector
                    int            prefabId = descriptor.init.realmId % selectorPrefabs.Length;
                    SelectorPrefab prefab   = selectorPrefabs[prefabId];
                    GameObject     selector = (GameObject)Instantiate(prefab.prefab);
                    selectors.Add(selector);
                    RealmData.Init realmData   = RealmData.initializers[descriptor.init.realmId];
                    Vector3        newPosition = position + new Vector3(0, 0, (descriptor.init.id == realmData.mainLevelId ? -selectorHeight.max : -selectorHeight.min));
                    selector.transform.position = newPosition;
                    WorldSelectorController wsc = selector.GetComponent <WorldSelectorController>();
                    wsc.Init(descriptor, prefab, noStatusCheck);
                    selector.transform.SetParent(transform);

                    // check for clouds effect
                    if (noStatusCheck || descriptor.state.Playable)
                    {
                        if (descriptor.init.id == realmData.mainLevelId)
                        {
                            setClouds        = !noStatusCheck; // if status is not checked, then the clouds are not instatiated at all
                            cloudsRotation   = rotation;
                            visibleSelectors = 0;
                        }
                        else
                        {
                            if (setClouds)
                            {
                                visibleSelectors++;
                            }
                        }
                    }

                    // now try to connect current selector with the previous one using glowing lines
                    if (descriptor.init.id != realmData.mainLevelId && (noStatusCheck || (descriptor.state.Playable && descriptor.state.Complete)))
                    {
                        if (previousSelector != null)
                        {
                            GameObject connectorLine = (GameObject)Instantiate(ConnectLinePrefab);
                            connectorLine.transform.position = newPosition;
                            connectorLine.transform.SetParent(selector.transform);
                            connectorLine.GetComponent <IntercubeConnectorFlasher>().Init(realmData.connectorColor, previousSelector.transform.position - newPosition);
                        }
                    }
                    Debug.Log("Creating selector " + descriptor.init.id.ToString() + ": revealed=" + descriptor.state.Revealed.ToString() + ", complete=" + descriptor.state.Complete.ToString());
                    previousSelector = selector;
                }
            }
            if (setClouds && visibleSelectors == 1) // if there is only one visible (playable) selector in the realm (except the main one)
            {
                fadeClouds = true;                  // fade the clouds later
            }
            else if (visibleSelectors > 1)
            {
                setClouds = false;  // do not set up the clouds
            }
            if (setClouds)          // set up the clouds
            {
                transform.rotation = cloudsRotation;
                clouds             = (GameObject)Instantiate(cloudsPrefab);
                clouds.transform.SetParent(transform);
            }
            // set the world sphere to the initial position
            transform.rotation = Quaternion.Euler(0, 0, 0);
        }