using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class LevelManager : WPFMonoBehaviour { public enum GameState { Undefined = 0, Building = 1, Preview = 2, PreviewMoving = 3, PreviewWhileBuilding = 4, PreviewWhileRunning = 5, Running = 6, Continue = 7, Completed = 8, PausedWhileRunning = 9, PausedWhileBuilding = 10, IngamePurchase = 11, AutoBuilding = 12 } [Serializable] public class CameraLimits { public Vector2 topLeft; public Vector2 size; } [Serializable] public class ScoreLimits { public int silverScore; public int goldScore; } [Serializable] public class PartCount { public BasePart.PartType type; public int count; } public GameObject m_inGameGuiPrefab; public Vector3 m_cameraOffset = new Vector3(0f, 0f, -10f); public float m_zoomOffset = -2f; public float m_predictionOffset = 2f; [HideInInspector] public float m_cameraMaxZoom; [HideInInspector] public float m_cameraMinZoom; public CameraLimits m_cameraLimits; public Vector3 m_constructionOffset = new Vector3(0f, 0f, -7f); public Vector3 m_previewOffset = new Vector3(0f, 0f, -10f); public float m_previewZoomOut = 15f; public float m_previewMoveTime = 5f; public float m_previewWaitTime = 5f; public Texture2D m_blueprintTexture; public ScoreLimits m_scoreLimits; private bool m_requireConnectedContraption; [HideInInspector] public int m_constructionUiRows = 1; [HideInInspector] public List m_constructionGridRows = new List(); [HideInInspector] public List m_secondStarConstructionGridRows = new List(); [HideInInspector] public List m_currentConstructionGridRows; [HideInInspector] public List m_partTypeCounts = new List(); public float m_tutorialDelayBeforeHint = 3f; public float m_tutorialDelayAfterHint = 1.5f; public GameData m_gameData; protected GameState m_gameState; protected float m_timeStateChanged; protected Contraption m_contraptionProto; protected Contraption m_contraptionRunning; protected ConstructionUI m_constructionUI; protected Transform m_collectibleBackup; protected int m_maxFood; protected int m_maxGoal; protected int m_foodCollected; protected int m_eggsCollected; protected int m_starCollected; protected float m_timeElapsed; protected float m_completionTime; private int m_totalScore; private AudioManager audioManager; [HideInInspector] public bool m_newHighscore; protected int m_gridHeight; protected int m_gridWidth; protected int m_gridXmin; protected int m_gridXmax; protected float m_previewAlpha; public GUIStyle m_buttonStyle; public float m_previewSpeed; public float m_previewTime; protected Vector3 m_previewCenter; public bool m_previewDragging; public Vector2 m_previewLastMousePos; protected float m_lastTimePlayedCollisionSound; public TextAsset m_prebuiltContraption; public TextAsset m_oneStarContraption; public List m_partsToUnlockOnCompletion = new List(); public bool m_showOnlyEngineButton; public bool m_disablePigCollisions; public List m_extraPartsForSecondStar = new List(); public bool m_sandbox; public string unlockSandboxLevelOnCompletion = string.Empty; [HideInInspector] public bool m_gridForSecondStar; public static string kDataPath; protected LevelStart m_levelStart; [HideInInspector] public int m_totalAvailableParts; [HideInInspector] public int m_totalDestroyedParts; public bool m_autoBuildUnlocked; private GameObject m_inGameGui; private List m_challenges = new List(); private float m_timeLimit; private List m_goals = new List(); private bool m_useSecondStarParts; private float m_autoBuildTimer; private int m_autoBuildIndex; private ContraptionDataset m_autoBuildData; public GameState gameState { get { return m_gameState; } } public bool RequireConnectedContraption { get { return m_requireConnectedContraption; } } public Contraption contraptionProto { get { return m_contraptionProto; } } public Contraption contraptionRunning { get { return m_contraptionRunning; } } public ConstructionUI constructionUI { get { return m_constructionUI; } } public float TimeLimit { get { return m_timeLimit; } } public int EggsCollected { get { return m_eggsCollected; } } public int TotalScore { get { return m_totalScore; } } public float TimeElapsed { get { return m_timeElapsed; } set { m_timeElapsed = value; } } public float CompletionTime { get { return m_completionTime; } } public int FoodCollected { get { return m_foodCollected; } } public int gridHeight { get { return m_gridHeight; } } public int gridWidth { get { return m_gridWidth; } } public int gridXmin { get { return m_gridXmin; } } public int gridXmax { get { return m_gridXmax; } } public float previewAlpha { get { return m_previewAlpha; } } public Vector3 previewCenter { get { return m_previewCenter; } set { m_previewCenter = value; } } public LevelStart StartingPosition { get { return m_levelStart; } } public Transform GoalPosition { get { GameObject gameObject = GameObject.FindGameObjectWithTag("Goal"); if ((bool)gameObject) { return gameObject.transform; } return null; } } public bool IsPartUsed(BasePart.PartType type) { return m_contraptionProto.HasPart(type); } private void Awake() { if (!SingletonSpawner.SpawnDone) { UnityEngine.Object.Instantiate(m_gameData.singletonSpawner); } UnityEngine.Object.Instantiate(m_gameData.effectManager); Debug.Log("Current level: " + Application.loadedLevelName); if ((bool)m_inGameGuiPrefab) { m_inGameGui = (GameObject)UnityEngine.Object.Instantiate(m_inGameGuiPrefab); m_inGameGui.name = m_inGameGuiPrefab.name; GameObject gameObject = GameObject.FindWithTag("HUDCamera"); Vector3 position = gameObject.transform.position; m_inGameGui.transform.position = new Vector3(position.x, position.y, m_inGameGui.transform.position.z); } WPFMonoBehaviour.gameData.m_useTouchControls = ((Application.platform == RuntimePlatform.IPhonePlayer || Application.platform == RuntimePlatform.Android) ? true : false); m_levelStart = WPFMonoBehaviour.FindSceneObjectOfType(); kDataPath = DeviceInfo.Instance.PersistentDataPath(); m_gridWidth = 1; m_useSecondStarParts = GameProgress.IsLevelCompleted(Application.loadedLevelName); if (m_useSecondStarParts && m_gridForSecondStar) { m_currentConstructionGridRows = m_secondStarConstructionGridRows; } else { m_currentConstructionGridRows = m_constructionGridRows; } for (int i = 0; i < m_currentConstructionGridRows.Count; i++) { if (m_currentConstructionGridRows[i] != 0) { int numberOfHighestBit = WPFMonoBehaviour.GetNumberOfHighestBit(m_currentConstructionGridRows[i]); if (numberOfHighestBit + 1 > m_gridWidth) { m_gridWidth = numberOfHighestBit + 1; } m_gridHeight = i + 1; } } m_gridXmin = -(m_gridWidth - 1) / 2; m_gridXmax = m_gridWidth / 2; Vector3 position2 = ((!m_levelStart) ? Vector3.zero : m_levelStart.transform.position); if ((bool)WPFMonoBehaviour.gameData.m_contraptionPrefab) { Transform transform = UnityEngine.Object.Instantiate(WPFMonoBehaviour.gameData.m_contraptionPrefab, position2, Quaternion.identity) as Transform; m_contraptionProto = transform.GetComponent(); } if ((bool)WPFMonoBehaviour.gameData.m_hudPrefab) { Transform transform2 = UnityEngine.Object.Instantiate(WPFMonoBehaviour.gameData.m_hudPrefab, position2, Quaternion.identity) as Transform; transform2.parent = base.transform; } if ((bool)WPFMonoBehaviour.gameData.m_constructionUIPrefab) { Transform transform3 = UnityEngine.Object.Instantiate(WPFMonoBehaviour.gameData.m_constructionUIPrefab) as Transform; transform3.gameObject.name = WPFMonoBehaviour.gameData.m_constructionUIPrefab.name; if ((bool)transform3) { m_constructionUI = transform3.GetComponent(); transform3.position = position2; } bool flag = false; ContraptionDataset cds; if (!m_prebuiltContraption) { cds = ((GameProgress.GetInt(Application.loadedLevelName + "_contraption") == 0) ? new ContraptionDataset() : WPFPrefs.LoadContraptionDataset(Application.loadedLevelName)); } else { cds = WPFPrefs.LoadContraptionDataset(m_prebuiltContraption); flag = true; } if (flag) { PreBuildContraption(cds); } else { BuildContraption(cds); } } foreach (ConstructionUI.PartDesc partDescriptor in m_constructionUI.PartDescriptors) { EventManager.Send(new PartCountChanged(partDescriptor.part.m_partType, partDescriptor.CurrentCount)); } m_constructionUI.SetMoveButtonStates(); if (!m_contraptionProto) { m_contraptionProto = WPFMonoBehaviour.FindSceneObjectOfType(); } GameObject gameObject2 = new GameObject("CollectibleStash"); gameObject2.transform.parent = base.transform; FindChallenges(); CheckStarBoxes(); Goal[] array = UnityEngine.Object.FindSceneObjectsOfType(typeof(Goal)) as Goal[]; int num = 1; Goal[] array2 = array; foreach (Goal goal in array2) { goal.transform.parent = null; goal.GoalId = num; num++; Transform transform4 = UnityEngine.Object.Instantiate(goal.transform) as Transform; transform4.parent = gameObject2.transform; transform4.gameObject.SetActiveRecursively(false); } m_maxGoal = array.Length; m_collectibleBackup = gameObject2.transform; InitializeChallenges(); SetGameState(GameState.Preview); if (base.audio == null) { base.gameObject.AddComponent(); } string value = GameObject.FindGameObjectWithTag("World").name; GameProgress.SetString("MenuBackground", value); if (BuildCustomizationLoader.Instance.AdsEnabled && BurstlyManager.Instance.InterstitialAdReady) { BurstlyManager.Instance.ShowBanner(BurstlyManager.AdType.Interstitial); } SendStartLevelFlurryEvent(); CheckForLevelStartAchievements(); m_autoBuildUnlocked = ((m_oneStarContraption != null) ? true : false); if (DeviceInfo.Instance.ActiveDeviceFamily != 0) { KeyListener.keyPressed += HandleKeyListenerkeyPressed; } } private void HandleKeyListenerkeyPressed(KeyCode obj) { switch (obj) { case KeyCode.Escape: if (gameState != GameState.PausedWhileBuilding && gameState != GameState.PausedWhileRunning) { EventManager.Send(new UIEvent(UIEvent.Type.Pause)); } else { EventManager.Send(new UIEvent(UIEvent.Type.LevelSelection)); } break; case KeyCode.Menu: if (gameState != GameState.PausedWhileBuilding && gameState != GameState.PausedWhileRunning) { EventManager.Send(new UIEvent(UIEvent.Type.Pause)); } break; } } private void BuildContraption(ContraptionDataset cds) { foreach (ContraptionDataset.ContraptionDatasetUnit contraptionDataset in cds.ContraptionDatasetList) { ConstructionUI.PartDesc partDesc = m_constructionUI.FindPartDesc((BasePart.PartType)contraptionDataset.partType); if (partDesc != null) { BuildPart(contraptionDataset, partDesc.part); partDesc.useCount++; } } } private void PreBuildContraption(ContraptionDataset cds) { foreach (ContraptionDataset.ContraptionDatasetUnit contraptionDataset in cds.ContraptionDatasetList) { GameObject part = WPFMonoBehaviour.gameData.GetPart((BasePart.PartType)contraptionDataset.partType); if ((bool)part) { BasePart component = part.GetComponent(); BasePart basePart = BuildPart(contraptionDataset, component); basePart.m_static = true; contraptionProto.IncreaseStaticPartCount(); } } } private BasePart BuildPart(ContraptionDataset.ContraptionDatasetUnit cdu, BasePart partPrefab) { BasePart basePart = m_constructionUI.SetPartAt(cdu.x, cdu.y, partPrefab, false); if (cdu.flipped) { basePart.SetFlipped(true); } else { basePart.SetRotation((BasePart.GridRotation)cdu.rot); } return basePart; } private void CheckStarBoxes() { List list = new List(); GameObject gameObject = GameObject.Find("StarBoxes"); if ((bool)gameObject) { for (int i = 0; i < gameObject.transform.GetChildCount(); i++) { list.Add(gameObject.transform.GetChild(i).GetComponent()); } } foreach (StarBox item in list) { foreach (StarBox item2 in list) { if (item != item2) { Assert.Check(item.name != item2.name, "StarBox objects must have unique names: " + item.name); } } } } private void FindChallenges() { GameObject gameObject = GameObject.Find("Challenges"); if ((bool)gameObject) { for (int i = 0; i < gameObject.transform.GetChildCount(); i++) { m_challenges.Add(gameObject.transform.GetChild(i).GetComponent()); } } else { Debug.Log("Challenges not found"); } foreach (Challenge challenge in m_challenges) { foreach (Challenge challenge2 in m_challenges) { if (challenge != challenge2) { Assert.Check(challenge.name != challenge2.name, "Challenge objects must have unique names: " + challenge.name); } } } m_challenges.Sort(new Challenge.ChallengeOrder()); } private void InitializeChallenges() { for (int i = 0; i < m_challenges.Count; i++) { Challenge challenge = m_challenges[i]; challenge.Initialize(); if ((bool)challenge.GetComponent()) { GameObject gameObject = new GameObject(challenge.name); WaypointChallenge waypointChallenge = gameObject.AddComponent(); waypointChallenge.m_goalId = challenge.GetComponent().m_goalId; waypointChallenge.m_icons = challenge.m_icons; waypointChallenge.transform.parent = GameObject.Find("Challenges").transform; m_challenges[i] = waypointChallenge; } if (challenge.TimeLimit() > 0f && (m_timeLimit == 0f || challenge.TimeLimit() > m_timeLimit)) { m_timeLimit = challenge.TimeLimit(); } } } private void Start() { audioManager = AudioManager.Instance; } private void OnEnable() { EventManager.Connect(ReceiveUIEvent); EventManager.Connect(ReceiveGadgetControlEvent); } private void OnDisable() { EventManager.Disconnect(ReceiveGadgetControlEvent); EventManager.Disconnect(ReceiveUIEvent); if (DeviceInfo.Instance.ActiveDeviceFamily != 0) { KeyListener.keyPressed -= HandleKeyListenerkeyPressed; } } public void ReceiveGadgetControlEvent(GadgetControlEvent data) { contraptionRunning.ActivatePartType(data.partType, data.direction); } public void CheckForLevelStartAchievements() { if (DeviceInfo.Instance.ActiveDeviceFamily == DeviceInfo.DeviceFamily.Ios && contraptionProto.Parts.Count >= AchievementData.Instance.GetAchievementLimit("grp.COMPLEX_COMPLEX")) { SocialGameManager.Instance.ReportAchievementProgress("grp.COMPLEX_COMPLEX", 100.0); } } public void SendStartLevelFlurryEvent() { if (!BuildCustomizationLoader.Instance.Flurry) { return; } Dictionary dictionary = new Dictionary(); dictionary.Add("ID", Application.loadedLevelName); string text = "{"; for (Challenge.ChallengeType challengeType = Challenge.ChallengeType.DontUseParts; challengeType < Challenge.ChallengeType.Max; challengeType++) { int @int = GameProgress.GetInt(Application.loadedLevelName + "_challenge_" + challengeType); if (@int > 0) { string text2 = text; text = string.Concat(text2, string.Empty, challengeType, ","); } text = "}"; } if (Loader.Instance.LastLoadedString.CompareTo(Application.loadedLevelName) == 0) { dictionary.Add("SOURCE", "REPLAY"); } else { dictionary.Add("SOURCE", "LEVEL_SELECTION"); } FlurryManager.Instance.LogEventWithParameters("StartLevel", dictionary); } public void SendContraptionStartedFlurryEvent() { if (BuildCustomizationLoader.Instance.Flurry) { Dictionary dictionary = new Dictionary(); dictionary.Add("ID", Application.loadedLevelName); dictionary.Add("PARTS", string.Empty + m_contraptionProto.Parts.Count); dictionary.Add("MOVES", string.Empty + m_constructionUI.MoveCount); dictionary.Add("CONTRAPTION", m_contraptionProto.GetContraptionID()); FlurryManager.Instance.LogEventWithParameters("StartContraption", dictionary); } } public void SendStandardFlurryEventWithTime(string eventName, string id) { if (BuildCustomizationLoader.Instance.Flurry) { Dictionary dictionary = new Dictionary(); dictionary.Add("ID", id); dictionary.Add("TIME", string.Empty + m_timeElapsed); FlurryManager.Instance.LogEventWithParameters(eventName, dictionary); } } public void SendStandardFlurryEvent(string eventName, string id) { if (BuildCustomizationLoader.Instance.Flurry) { Dictionary dictionary = new Dictionary(); dictionary.Add("ID", id); FlurryManager.Instance.LogEventWithParameters(eventName, dictionary); } } public void SendClearContraptionFlurryEvent() { if (BuildCustomizationLoader.Instance.Flurry) { Dictionary dictionary = new Dictionary(); dictionary.Add("ID", Application.loadedLevelName); dictionary.Add("PARTS", string.Empty + m_contraptionProto.Parts.Count); FlurryManager.Instance.LogEventWithParameters("Pause Flight", dictionary); } } public void SendPauseWhileFlyingFlurryEvent() { if (BuildCustomizationLoader.Instance.Flurry) { Dictionary dictionary = new Dictionary(); dictionary.Add("ID", Application.loadedLevelName); dictionary.Add("TIME", string.Empty + m_timeElapsed); FlurryManager.Instance.LogEventWithParameters("Pause Flight", dictionary); } } public void SendNextLevelFlurryEvent() { if (BuildCustomizationLoader.Instance.Flurry) { Dictionary dictionary = new Dictionary(); dictionary.Add("ID", Application.loadedLevelName); string value = string.Empty; FlurryManager.Instance.FlurryDataHolder.TryGetValue("PREVIOUS_STARS", out value); dictionary.Add("PREVIOUS_STARS", value); FlurryManager.Instance.FlurryDataHolder.TryGetValue("PREVIOUS_STARS", out value); dictionary.Add("NEW_STARS", value); dictionary.Add("TIME", string.Empty + m_timeElapsed); FlurryManager.Instance.LogEventWithParameters("Next On Level End", dictionary); } } public void SendReplayFromCompleteFlurryEvent() { if (BuildCustomizationLoader.Instance.Flurry) { Dictionary dictionary = new Dictionary(); dictionary.Add("ID", Application.loadedLevelName); string value = string.Empty; FlurryManager.Instance.FlurryDataHolder.TryGetValue("PREVIOUS_STARS", out value); dictionary.Add("PREVIOUS_STARS", value); FlurryManager.Instance.FlurryDataHolder.TryGetValue("PREVIOUS_STARS", out value); dictionary.Add("NEW_STARS", value); dictionary.Add("TIME", string.Empty + m_timeElapsed); FlurryManager.Instance.LogEventWithParameters("Next On Level End", dictionary); } } public void SendExitFromCompleteFlurryEvent() { if (BuildCustomizationLoader.Instance.Flurry) { Dictionary dictionary = new Dictionary(); dictionary.Add("ID", Application.loadedLevelName); string value = string.Empty; FlurryManager.Instance.FlurryDataHolder.TryGetValue("PREVIOUS_STARS", out value); dictionary.Add("PREVIOUS_STARS", value); FlurryManager.Instance.FlurryDataHolder.TryGetValue("PREVIOUS_STARS", out value); dictionary.Add("NEW_STARS", value); dictionary.Add("TIME", string.Empty + m_timeElapsed); FlurryManager.Instance.LogEventWithParameters("Next On Level End", dictionary); } } public void ReceiveUIEvent(UIEvent data) { switch (data.type) { case UIEvent.Type.Play: { if (WPFMonoBehaviour.levelManager.gameState == GameState.Building) { SendContraptionStartedFlurryEvent(); } GameState gameState = ((WPFMonoBehaviour.levelManager.gameState != GameState.Building) ? GameState.Continue : GameState.Running); if (WPFMonoBehaviour.levelManager.gameState == GameState.Building) { AudioManager.Instance.Play2dEffect(AudioManager.Instance.CommonAudioCollection.buildContraption); } SetGameState(gameState); break; } case UIEvent.Type.Clear: SendClearContraptionFlurryEvent(); AudioManager.Instance.Play2dEffect(AudioManager.Instance.CommonAudioCollection.clearBuildGrid); constructionUI.ClearContraption(); break; case UIEvent.Type.LevelSelection: { if (GameTime.IsPaused()) { GameTime.Pause(false); } if (WPFMonoBehaviour.levelManager.gameState == GameState.PausedWhileRunning) { SendStandardFlurryEventWithTime("Exit From Flight Paused", Application.loadedLevelName); } else if (this.gameState == GameState.PausedWhileBuilding) { SendStandardFlurryEventWithTime("Exit From Build Paused", Application.loadedLevelName); } else if (this.gameState == GameState.Completed) { SendExitFromCompleteFlurryEvent(); } string levelName = ((!(GameManager.Instance.CurrentEpisode != string.Empty)) ? "EpisodeSelection" : GameManager.Instance.CurrentEpisode); Loader.Instance.LoadLevel(levelName, true); break; } case UIEvent.Type.Preview: { GameState gameState2 = ((this.gameState != GameState.Running) ? GameState.PreviewWhileBuilding : GameState.PreviewWhileRunning); SetGameState(gameState2); break; } case UIEvent.Type.Building: { if (WPFMonoBehaviour.levelManager.gameState == GameState.PausedWhileRunning) { SendStandardFlurryEvent("Restart From Flight Paused", Application.loadedLevelName); } else if (this.gameState == GameState.PausedWhileBuilding) { SendStandardFlurryEvent("Exit From Build Paused", Application.loadedLevelName); } Vector3 position = ((!m_levelStart) ? Vector3.zero : m_levelStart.transform.position); m_constructionUI.transform.position = position; m_contraptionProto.transform.position = position; SetGameState(GameState.Building); break; } case UIEvent.Type.ActivateRockets: { Rocket[] componentsInChildren = contraptionRunning.GetComponentsInChildren(); Rocket[] array = componentsInChildren; foreach (Rocket rocket in array) { rocket.ProcessTouch(); } break; } case UIEvent.Type.ActivateEngines: { Engine[] componentsInChildren2 = contraptionRunning.GetComponentsInChildren(); if (componentsInChildren2.Length > 0) { componentsInChildren2[0].ProcessTouch(); } else { contraptionRunning.m_pig.ProcessTouch(); } break; } case UIEvent.Type.BackFromPreview: { GameState gameState3 = ((this.gameState != GameState.PreviewWhileRunning) ? GameState.Building : GameState.Continue); WPFMonoBehaviour.levelManager.SetGameState(gameState3); break; } case UIEvent.Type.Pause: { if (WPFMonoBehaviour.levelManager.gameState == GameState.Building) { SendStandardFlurryEvent("Pause Build", Application.loadedLevelName); } else if (this.gameState == GameState.Running) { SendPauseWhileFlyingFlurryEvent(); } GameState gameState4 = ((this.gameState != GameState.Running) ? GameState.PausedWhileBuilding : GameState.PausedWhileRunning); WPFMonoBehaviour.levelManager.SetGameState(gameState4); break; } case UIEvent.Type.ContinueFromPause: { if (this.gameState == GameState.PausedWhileRunning) { SendStandardFlurryEvent("Continue From Flight Paused", Application.loadedLevelName); } else if (this.gameState == GameState.PausedWhileBuilding) { SendStandardFlurryEvent("Continue From Build Paused", Application.loadedLevelName); } GameState gameState5 = ((this.gameState != GameState.PausedWhileRunning) ? GameState.Building : GameState.Continue); WPFMonoBehaviour.levelManager.SetGameState(gameState5); break; } case UIEvent.Type.OpenIapMenu: WPFMonoBehaviour.levelManager.SetGameState(GameState.IngamePurchase); break; case UIEvent.Type.CloseIapMenu: WPFMonoBehaviour.levelManager.SetGameState(GameState.Building); break; case UIEvent.Type.ReplayLevel: if (this.gameState == GameState.Completed) { SendReplayFromCompleteFlurryEvent(); } Loader.Instance.LoadLevel(Application.loadedLevelName, true); break; case UIEvent.Type.ReplayFlight: StopRunningContraption(); SetGameState(GameState.Running); break; case UIEvent.Type.NextLevel: SendNextLevelFlurryEvent(); GameManager.Instance.LoadNextLevel(); break; case UIEvent.Type.QuestModeBuild: PlaceBuildArea(); SetGameState(GameState.Building); break; case UIEvent.Type.Blueprint: { if (!m_oneStarContraption) { break; } int @int = GameProgress.GetInt("Blueprints_Available"); if (@int == 0 && !GameProgress.GetBool(Application.loadedLevelName + "_autobuild_available")) { IapManager.Instance.EnableBlueprintsPurchasePage(true); break; } if (!GameProgress.GetBool(Application.loadedLevelName + "_autobuild_available")) { @int--; GameProgress.SetInt("Blueprints_Available", @int); GameProgress.SetBool(Application.loadedLevelName + "_autobuild_available", true); GameProgress.Save(); EventManager.Send(new InGameBuildMenu.AutoBuildEvent(@int)); } SetGameState(GameState.AutoBuilding); break; } case UIEvent.Type.Home: case UIEvent.Type.IapPurchaseCurrency: case UIEvent.Type.IapPurchaseRocket: case UIEvent.Type.IapPurchaseEngine: break; } } private void PlaceBuildArea() { float x = m_contraptionProto.FindPig().transform.localPosition.x; Vector3 position = m_contraptionRunning.FindPig().transform.position; Vector3 vector = position; int layerMask = 1 << LayerMask.NameToLayer("Ground"); RaycastHit hitInfo; if (Physics.Raycast(new Ray(position, new Vector3(0f, -1f, 0f)), out hitInfo, 100f, layerMask)) { vector.y = position.y - hitInfo.distance + 1.1f; } vector.x = position.x - x; int num = 0; int num2 = 0; for (int i = gridXmin; i <= gridXmax; i++) { int num3 = 0; for (int j = 0; j < gridHeight; j++) { for (int k = gridXmin - 1; k <= gridXmax + 1; k++) { if (!Physics.CheckSphere(vector + new Vector3(k + i, j, 0f), 0.55f, layerMask)) { num3++; } } } int num4 = num3; if (i == 0) { num4++; } if (num4 > num) { num = num4; num2 = i; } } vector.x += num2; vector.z = 0f; m_constructionUI.transform.position = vector; m_contraptionProto.transform.position = vector; } public void SetGameState(GameState newState) { Debug.Log("SetGameState: " + newState); switch (newState) { case GameState.Building: if (GameTime.IsPaused()) { GameTime.Pause(false); } if (m_gameState == GameState.Running || m_gameState == GameState.PausedWhileRunning) { StopRunningContraption(); } SetupCollectibles(); m_contraptionProto.SetVisible(true); m_contraptionProto.rigidbody.isKinematic = true; if ((bool)m_constructionUI) { m_constructionUI.SetEnabled(true, true); } break; case GameState.Running: if (GameTime.IsPaused()) { GameTime.Pause(false); } m_foodCollected = 0; m_eggsCollected = 0; m_timeElapsed = 0f; if ((bool)m_constructionUI) { m_constructionUI.SetEnabled(false, false); } m_contraptionRunning = m_contraptionProto.Clone(); m_contraptionProto.SetVisible(false); m_contraptionRunning.StartContraption(); m_contraptionRunning.SaveContraption(); break; case GameState.Continue: if (GameTime.IsPaused()) { GameTime.Pause(false); } newState = GameState.Running; break; case GameState.Preview: m_previewSpeed = 1f; m_previewTime = 0f; m_contraptionProto.SetVisible(false); if ((bool)m_constructionUI) { m_constructionUI.SetEnabled(false, true); } break; case GameState.PreviewMoving: m_previewAlpha = 0f; m_previewTime = 0f; m_contraptionProto.SetVisible(false); if ((bool)m_constructionUI) { m_constructionUI.SetEnabled(false, true); } break; case GameState.PreviewWhileRunning: m_previewCenter = m_contraptionRunning.transform.position; GameTime.Pause(true); m_previewDragging = false; break; case GameState.PreviewWhileBuilding: if ((bool)m_constructionUI) { m_constructionUI.SetEnabled(false, true); } m_previewCenter = m_contraptionProto.transform.position; m_previewDragging = false; break; case GameState.PausedWhileRunning: GameTime.Pause(true); break; case GameState.AutoBuilding: constructionUI.ClearContraption(); m_autoBuildData = WPFPrefs.LoadContraptionDataset(m_oneStarContraption); SetAutoBuildOrder(m_autoBuildData); m_autoBuildTimer = 0f; m_autoBuildIndex = 0; break; } m_timeStateChanged = Time.time; m_gameState = newState; EventManager.Send(new GameStateChanged(newState)); } private void StopRunningContraption() { if ((bool)m_contraptionRunning) { m_contraptionRunning.StopContraption(); UnityEngine.Object.Destroy(m_contraptionRunning.gameObject); m_contraptionRunning = null; } List list = new List(GameObject.FindGameObjectsWithTag("ParticleEmitter")); foreach (GameObject item in list) { UnityEngine.Object.Destroy(item); } } private void SetupCollectibles() { List list = new List(UnityEngine.Object.FindSceneObjectsOfType(typeof(Goal)) as Goal[]); foreach (Transform item in m_collectibleBackup) { Goal component = item.GetComponent(); if ((bool)component) { list.Remove(component); } } foreach (Goal item2 in list) { UnityEngine.Object.Destroy(item2.gameObject); } m_goals.Clear(); foreach (Transform item3 in m_collectibleBackup) { Transform transform2 = UnityEngine.Object.Instantiate(item3) as Transform; transform2.gameObject.SetActiveRecursively(true); transform2.transform.parent = null; m_goals.Add(transform2.GetComponent()); } } public GameObject GetGoal(int goalId) { foreach (Goal goal in m_goals) { if (goal.GoalId == goalId) { return goal.gameObject; } } return null; } public void NotifyGoalReached() { m_completionTime = m_timeElapsed; CheckTransportedParts(); StartCoroutine(LevelCompleted()); } public bool IsPartTransported(BasePart.PartType partType) { int connectedComponent = m_contraptionRunning.FindPig().ConnectedComponent; foreach (BasePart part in contraptionRunning.Parts) { if (part.m_partType != partType) { continue; } if (part.ConnectedComponent == connectedComponent) { return true; } foreach (BasePart part2 in contraptionRunning.Parts) { if (part2.ConnectedComponent == connectedComponent && Vector3.Distance(part.transform.position, part2.transform.position) < 2.5f) { return true; } } } return false; } public int TimesPartIsInContraptionProto(BasePart.PartType partType) { int connectedComponent = contraptionProto.FindPig().ConnectedComponent; int num = 0; foreach (BasePart part in contraptionRunning.Parts) { if (part == null || part.m_partType != partType) { continue; } if (part.ConnectedComponent == connectedComponent) { num++; continue; } foreach (BasePart part2 in contraptionRunning.Parts) { if (part2.ConnectedComponent == connectedComponent && !(part2 == null) && Vector3.Distance(part.transform.position, part2.transform.position) < 2.5f) { num++; } } } return num; } private void CheckTransportedParts() { } public void NotifyStarCollected(Star star) { m_starCollected++; } public void NotifyBlueprintCollected(Blueprint blueprint) { GameProgress.SetInt(Application.loadedLevelName + "_blueprint", 1); } public IEnumerator LevelCompleted() { GameObject.Find("InGameGUI").GetComponent().HideCurrentMenu(); SetGameState(GameState.Completed); PlayVictorySound(); LevelComplete levelComplete = GameObject.Find("InGameGUI").transform.FindChild("InGameLevelCompleteMenu").GetComponent(); levelComplete.SetChallenges(m_challenges); int bonusStyle = ((!((float)(m_totalDestroyedParts / m_totalAvailableParts) > 0.25f)) ? (500 * (m_totalAvailableParts - m_totalDestroyedParts)) : (500 * m_totalDestroyedParts)); m_totalScore = bonusStyle; int highscore = GameProgress.GetInt(Application.loadedLevelName + "_score"); if (m_totalScore > highscore) { GameProgress.SetInt(Application.loadedLevelName + "_score", m_totalScore); m_newHighscore = true; Debug.Log("new highscore"); } yield return new WaitForEndOfFrame(); } public bool CanPlacePartAtGridCell(int x, int y) { if (x < m_gridXmin || x > m_gridXmax || y < 0 || y >= m_gridHeight) { return false; } int index = m_gridHeight - y - 1; int num = x - m_gridXmin; int num2 = m_currentConstructionGridRows[index]; return (num2 & (1 << num)) != 0; } public int GetPartTypeCount(BasePart.PartType type) { int num = 0; foreach (PartCount partTypeCount in m_partTypeCounts) { if (partTypeCount.type == type) { num += partTypeCount.count; break; } } if (m_useSecondStarParts) { foreach (PartCount item in m_extraPartsForSecondStar) { if (item.type == type) { num += item.count; break; } } } if (m_sandbox) { num += GameProgress.GetSandboxPartCount(type); } return num; } public void SetPartTypeCount(BasePart.PartType type, int count) { for (int i = 0; i < m_partTypeCounts.Count; i++) { PartCount partCount = m_partTypeCounts[i]; if (partCount.type == type) { partCount.count = count; m_partTypeCounts[i] = partCount; return; } } PartCount partCount2 = new PartCount(); partCount2.type = type; partCount2.count = count; m_partTypeCounts.Add(partCount2); } public void OnDrawGizmosSelected() { LevelStart levelStart = WPFMonoBehaviour.FindSceneObjectOfType(); Transform goalPosition = GoalPosition; if ((bool)levelStart && (bool)goalPosition) { Gizmos.color = Color.green; Gizmos.DrawLine(levelStart.transform.position, goalPosition.transform.position); } if ((bool)levelStart) { Gizmos.color = Color.green; Vector3 constructionOffset = m_constructionOffset; constructionOffset.z = 0f; Vector3 center = levelStart.transform.position + constructionOffset; float num = 1.3333334f; Camera camera = GameObject.FindGameObjectWithTag("MainCamera").camera; float num2 = Mathf.Tan(camera.fov * ((float)Math.PI / 180f)); float num3 = num2 * Mathf.Abs(m_constructionOffset.z); Vector3 size = new Vector3(num3, num3 / num, 0f); Gizmos.DrawWireCube(center, size); } if ((bool)goalPosition) { Gizmos.color = Color.green; Vector3 previewOffset = m_previewOffset; previewOffset.z = 0f; Vector3 center2 = goalPosition.transform.position + previewOffset; float num4 = 1.3333334f; Camera camera2 = GameObject.FindGameObjectWithTag("MainCamera").camera; float num5 = Mathf.Tan(camera2.fov * ((float)Math.PI / 180f)); float num6 = num5 * Mathf.Abs(m_previewOffset.z); Vector3 size2 = new Vector3(num6, num6 / num4, 0f); Gizmos.DrawWireCube(center2, size2); } } public void Update() { switch (gameState) { case GameState.Preview: { m_previewTime += Time.deltaTime * m_previewSpeed; bool flag = ((Input.touchCount > 0 || Input.GetMouseButtonDown(0)) ? true : false); if (m_previewTime > m_previewWaitTime || flag) { SetGameState(GameState.PreviewMoving); } break; } case GameState.PreviewMoving: { m_previewTime += Time.deltaTime * m_previewSpeed; float num = m_previewTime / m_previewMoveTime; m_previewAlpha = num; break; } case GameState.Running: m_timeElapsed += Time.deltaTime; break; case GameState.AutoBuilding: AutoBuild(); break; } } private void AutoBuild() { m_autoBuildTimer += Time.deltaTime; if (!(m_autoBuildTimer > 0.3f)) { return; } m_autoBuildTimer = 0f; if (m_autoBuildIndex < m_autoBuildData.ContraptionDatasetList.Count) { ContraptionDataset.ContraptionDatasetUnit contraptionDatasetUnit = m_autoBuildData.ContraptionDatasetList[m_autoBuildIndex]; ConstructionUI.PartDesc partDesc = m_constructionUI.FindPartDesc((BasePart.PartType)contraptionDatasetUnit.partType); if (partDesc != null) { BasePart basePart = BuildPart(contraptionDatasetUnit, partDesc.part); basePart.GetComponent().ChangeVisualConnections(); contraptionProto.RefreshNeighbours(basePart.m_coordX, basePart.m_coordY); partDesc.useCount++; EventManager.Send(new PartCountChanged(partDesc.part.m_partType, partDesc.CurrentCount)); Vector3 position = m_constructionUI.GridPositionToWorldPosition(contraptionDatasetUnit.x, contraptionDatasetUnit.y); WPFMonoBehaviour.effectManager.CreateParticles(WPFMonoBehaviour.gameData.m_dustParticles, position); } m_autoBuildIndex++; } else { SetGameState(GameState.Building); } } public void SetAutoBuildOrder(ContraptionDataset data) { int num = -1; List contraptionDatasetList = data.ContraptionDatasetList; for (int i = 0; i < contraptionDatasetList.Count; i++) { if (contraptionDatasetList[i].partType == 10) { num = i; break; } } if (num != -1) { ContraptionDataset.ContraptionDatasetUnit value = contraptionDatasetList[contraptionDatasetList.Count - 1]; contraptionDatasetList[contraptionDatasetList.Count - 1] = contraptionDatasetList[num]; contraptionDatasetList[num] = value; } } public void PlayVictorySound() { audioManager.Play2dEffect(audioManager.CommonAudioCollection.victory); } public void PlayPartPlacedSound() { audioManager.Play2dEffect(audioManager.CommonAudioCollection.placePart); } public void PlayDragSound() { audioManager.Play2dEffect(audioManager.CommonAudioCollection.dragPart); } public void PlayRemoveSound() { audioManager.Play2dEffect(audioManager.CommonAudioCollection.removePart); } }