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; }
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); }