public void Init(LevelDataManager.Descriptor descriptor, SelectorPrefab prefab, bool noStatusCheck = false)
 {
     levelDescriptor = descriptor;
     meshRenderer    = GetComponent <MeshRenderer>();
     lightBeacon.SetActive(false);
     if (noStatusCheck || levelDescriptor.state.Revealed)
     {
         // set up height above the world sphere
         string     iconPath    = LevelDataManager.GraphicsResource(levelDescriptor.init.id);
         bool       glow        = false;
         float      iconOpacity = normalIconOpacity;
         Material[] materials   = meshRenderer.materials;
         if (noStatusCheck)
         {
             iconPath    += "/icon";
             materials[0] = prefab.opaqueMaterial;
         }
         else
         {
             if (levelDescriptor.state.Playable)
             {
                 Debug.Log("WorldSelectorController.Init: id=" + levelDescriptor.init.id.ToString() + ", playable=" + levelDescriptor.state.Playable.ToString());
                 iconPath += "/icon";
                 if (levelDescriptor.init.id == GlobalManager.MStorage.SelectedLevel)
                 {
                     materials[0] = prefab.glowMaterial;
                     lightBeacon.SetActive(true);
                     glow = true;
                 }
                 else
                 {
                     materials[0] = prefab.opaqueMaterial;
                 }
             }
             else
             {
                 iconPath    += "/grayicon";
                 iconOpacity  = disabledIconOpacity;
                 materials[0] = prefab.transparentMaterial;
             }
         }
         meshRenderer.materials = materials;
         iconRenderer.sprite    = Resources.Load <Sprite>(iconPath);
         Color c = iconRenderer.color;
         c.a = iconOpacity;
         iconRenderer.color = c;
         if (glow)
         {
             StartFlash();
         }
     }
     else
     {
         gameObject.SetActive(false);
     }
 }
        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);
        }