void Start() { Debug.Log("\n--------------Testing Arithmetic Start--------------"); Debug.Log(ArithmeticWrapper.addition(5.0f, 4.0f)); Debug.Log(ArithmeticWrapper.substraction(10, 3)); Debug.Log(ArithmeticWrapper.multiplication(2, 5)); Debug.Log(ArithmeticWrapper.division(10, 2)); Debug.Log("End"); Debug.Log("\n--------------Testing Printer Start--------------"); Debug.Log(PrinterWrapper.PrintANumber()); Debug.Log(Marshal.PtrToStringAuto(PrinterWrapper.PrintHello())); Debug.Log(PrinterWrapper.AddTwoIntegers(2, 2)); Debug.Log(PrinterWrapper.AddTwoFloats(2.5F, 4F)); Debug.Log("End"); Debug.Log("\n--------------Testing Bomb Start--------------"); Debug.Log("bomb has been created"); IntPtr oneBomb = BombWrapper.Bomb_Create(); BombWrapper.Bomb_SetTime(oneBomb, 100.0f); float time = BombWrapper.Bomb_GetTime(oneBomb); Debug.Log("bomb time current is set to " + time); BombWrapper.Bomb_Delete(oneBomb); Debug.Log("bomb has been deleted"); Debug.Log("End"); }
public void LateUpdate() { if (currentBomb == null) { currentBomb = Tweaks.bombWrappers.Find(x => x.holdable.HoldState == FloatingHoldable.HoldStateEnum.Held); if (currentBomb != null) { UpdateSolves(); UpdateStrikes(); int needies = currentBomb.Bomb.BombComponents.Count(bombComponent => bombComponent.GetComponent <NeedyComponent>() != null); NeediesPrefab.gameObject.SetActive(needies > 0); NeediesPrefab.text = needies.ToString(); if (Tweaks.settings.ShowEdgework && !Tweaks.TwitchPlaysActiveCache) { SetupEdgeworkCameras(); } } else { foreach (GameObject edgeworkCamera in edgeworkCameras) { Destroy(edgeworkCamera); } } } bool enabled = currentBomb != null && (Tweaks.settings.BombHUD || BombWrapper.Alerts.Count != 0) && !Tweaks.TwitchPlaysActiveCache; CanvasGroup.alpha = Math.Min(Math.Max(CanvasGroup.alpha + (enabled ? 1 : -1) * 0.1f, 0), 1); if (!enabled) { return; } if (Tweaks.settings.BombHUD) { string formattedTime = currentBomb.GetFullFormattedTime; TimerPrefab.text = formattedTime; TimerShadowPrefab.text = formattedTime.Select(character => character == ':' ? character : '8').Join(""); UpdateConfidence(); } float y = Tweaks.settings.BombHUD ? 173 : 0; foreach (RectTransform alert in BombWrapper.Alerts) { alert.anchoredPosition = new Vector3(0, -y); y += alert.rect.height; } }
void LateUpdate() { if (currentBomb == null) { WidgetResponses.Clear(); currentBomb = Array.Find(Tweaks.bombWrappers, x => x.holdable.HoldState == FloatingHoldable.HoldStateEnum.Held); if (currentBomb != null) { UpdateSolves(); UpdateStrikes(); int needies = currentBomb.Bomb.BombComponents.Count(bombComponent => bombComponent.GetComponent <NeedyComponent>() != null); NeediesPrefab.gameObject.SetActive(needies > 0); NeediesPrefab.text = needies.ToString(); } } bool enabled = currentBomb != null && !Tweaks.TwitchPlaysActive; CanvasGroup.alpha = Math.Min(Math.Max(CanvasGroup.alpha + (enabled ? 1 : -1) * 0.1f, 0), 1); if (!enabled) { return; } string formattedTime = currentBomb.GetFullFormattedTime; TimerPrefab.text = formattedTime; TimerShadowPrefab.text = Regex.Replace(formattedTime, @"\d", "8"); UpdateConfidence(); if (Tweaks.settings.ShowEdgework) { UpdateWidgets(); } }
public IEnumerator CheckForBombs() { yield return(new WaitUntil(() => (SceneManager.Instance.GameplayState.Bombs?.Count > 0))); yield return(null); List <Bomb> bombs = SceneManager.Instance.GameplayState.Bombs; if (settings.SkipGameplayDelay) { StartCoroutine(SkipGameplayDelay()); } LogJSON("LFAEvent", new Dictionary <string, object>() { { "type", "ROUND_START" }, { "mission", Localization.GetLocalizedString(SceneManager.Instance.GameplayState.Mission.DisplayNameTerm) }, }); var snoozeButton = FindObjectOfType <AlarmClock>()?.SnoozeButton; if (snoozeButton != null) { FixKeypadButtons(snoozeButton); } void wrapInitialBombs() { for (int i = 0; i < bombs.Count; i++) { Bomb bomb = bombs[i]; BombWrapper bombWrapper = bomb.gameObject.AddComponent <BombWrapper>(); bombWrappers.Add(bombWrapper); if (CurrentMode == Mode.Time) { bombWrapper.CurrentTimer = Modes.settings.TimeModeStartingTime * 60; } else if (CurrentMode == Mode.Zen) { bombWrapper.CurrentTimer = 0.001f; } } } if (CurrentModeCache == Mode.Zen) { GameplayMusicController gameplayMusic = MusicManager.Instance.GameplayMusicController; gameplayMusic.StopMusic(); var controller = gameplayMusic.GetComponent <DarkTonic.MasterAudio.PlaylistController>(); controller.ClearQueue(); controller.QueuePlaylistClip(controller.CurrentPlaylist.MusicSettings[0].songName, true); } if (ReflectedTypes.FactoryRoomType != null && ReflectedTypes.StaticModeType != null) { UnityEngine.Object factoryRoom = FindObjectOfType(ReflectedTypes.FactoryRoomType); if (factoryRoom) { if (ReflectedTypes.FactoryRoomDataType != null && ReflectedTypes.WarningTimeField != null) { var roomData = FindObjectOfType(ReflectedTypes.FactoryRoomDataType); if (roomData != null) { ReflectedTypes.WarningTimeField.SetValue(roomData, CurrentMode == Mode.Zen ? 0 : 60); } } object gameMode = ReflectedTypes.GameModeProperty.GetValue(factoryRoom, null); if (ReflectedTypes.StaticModeType != gameMode.GetType()) { IEnumerable <object> adaptations = ((IEnumerable)ReflectedTypes.AdaptationsProperty.GetValue(gameMode, null)).Cast <object>(); bool globalTimerDisabled = !adaptations.Any(adaptation => ReflectedTypes.GlobalTimerAdaptationType.IsAssignableFrom(adaptation.GetType())); Component getBomb() => (Component)ReflectedTypes._CurrentBombField.GetValue(gameMode); yield return(new WaitUntil(() => getBomb() != null || factoryRoom == null)); Component currentBomb = getBomb(); bool firstBomb = true; while (currentBomb != null && factoryRoom != null) { BombWrapper bombWrapper = currentBomb.gameObject.AddComponent <BombWrapper>(); bombWrappers.Add(bombWrapper); if (globalTimerDisabled || firstBomb) { firstBomb = false; if (CurrentMode == Mode.Time) { bombWrapper.CurrentTimer = Modes.settings.TimeModeStartingTime * 60; } else if (CurrentMode == Mode.Zen) { bombWrapper.CurrentTimer = 0.001f; } } yield return(new WaitUntil(() => currentBomb != getBomb() || factoryRoom == null)); bombWrappers.Remove(bombWrapper); currentBomb = getBomb(); if (currentBomb == null || factoryRoom == null) { break; } } } else { wrapInitialBombs(); } yield break; } } // This code only runs if we aren't in the Factory room. wrapInitialBombs(); // If TP is enabled, let it handle managing the emergency lights. if (TwitchPlaysActiveCache) { yield break; } SceneManager.Instance.GameplayState.Room.PacingActions.RemoveAll(pacingAction => pacingAction.EventType == Assets.Scripts.Pacing.PaceEvent.OneMinuteLeft); UnityEngine.Object portalRoom = null; if (ReflectedTypes.PortalRoomType != null && ReflectedTypes.RedLightsMethod != null && ReflectedTypes.RoomLightField != null) { portalRoom = FindObjectOfType(ReflectedTypes.PortalRoomType); } bool lastState = false; IEnumerator portalEmergencyRoutine = null; while (CurrentState == KMGameInfo.State.Gameplay) { bool targetState = CurrentModeCache != Mode.Zen; targetState &= bombWrappers.Any((BombWrapper bombWrapper) => bombWrapper.CurrentTimer < 60f && !bombWrapper.Bomb.IsSolved()); if (targetState != lastState) { foreach (EmergencyLight emergencyLight in FindObjectsOfType <EmergencyLight>()) { if (targetState) { emergencyLight.Activate(); } else { emergencyLight.Deactivate(); } } if (portalRoom != null) { if (targetState) { portalEmergencyRoutine = (IEnumerator)ReflectedTypes.RedLightsMethod.Invoke(portalRoom, null); StartCoroutine(portalEmergencyRoutine); } else { StopCoroutine(portalEmergencyRoutine); portalEmergencyRoutine = null; ((GameObject)ReflectedTypes.RoomLightField.GetValue(portalRoom)).GetComponent <Light>().color = new Color(0.5f, 0.5f, 0.5f); } } lastState = targetState; } yield return(null); } }
public IEnumerator CheckForBombs() { yield return(new WaitUntil(() => (SceneManager.Instance.GameplayState.Bombs?.Count > 0))); yield return(null); List <Bomb> bombs = SceneManager.Instance.GameplayState.Bombs; void wrapInitialBombs() { Array.Resize(ref bombWrappers, bombs.Count); for (int i = 0; i < bombs.Count; i++) { Bomb bomb = bombs[i]; BombWrapper bombWrapper = new BombWrapper(bomb); bombWrappers[i] = bombWrapper; bombWrapper.holdable.OnLetGo += () => BombStatus.Instance.currentBomb = null; if (CurrentMode == Mode.Time) { bombWrapper.CurrentTimer = Modes.settings.TimeModeStartingTime * 60; } else if (CurrentMode == Mode.Zen) { bombWrapper.CurrentTimer = 0.001f; } } } if (CurrentMode == Mode.Zen) { GameplayMusicController gameplayMusic = MusicManager.Instance.GameplayMusicController; gameplayMusic.StopMusic(); var controller = gameplayMusic.GetComponent <DarkTonic.MasterAudio.PlaylistController>(); controller.ClearQueue(); controller.QueuePlaylistClip(controller.CurrentPlaylist.MusicSettings[0].songName, true); } if (ReflectedTypes.FactoryRoomType != null && ReflectedTypes.StaticModeType != null) { UnityEngine.Object factoryRoom = FindObjectOfType(ReflectedTypes.FactoryRoomType); if (factoryRoom) { if (ReflectedTypes.FactoryRoomDataType != null && ReflectedTypes.WarningTimeField != null) { var roomData = FindObjectOfType(ReflectedTypes.FactoryRoomDataType); if (roomData != null) { ReflectedTypes.WarningTimeField.SetValue(roomData, CurrentMode == Mode.Zen ? 0 : 60); } } object gameMode = ReflectedTypes.GameModeProperty.GetValue(factoryRoom, null); if (ReflectedTypes.StaticModeType != gameMode.GetType()) { IEnumerable <object> adaptations = ((IEnumerable)ReflectedTypes.AdaptationsProperty.GetValue(gameMode, null)).Cast <object>(); bool globalTimerDisabled = !adaptations.Any(adaptation => ReflectedTypes.GlobalTimerAdaptationType.IsAssignableFrom(adaptation.GetType())); Component getBomb() => (Component)ReflectedTypes._CurrentBombField.GetValue(gameMode); yield return(new WaitUntil(() => getBomb() != null || factoryRoom == null)); Component currentBomb = getBomb(); bool firstBomb = true; Array.Resize(ref bombWrappers, 1); while (currentBomb != null && factoryRoom != null) { BombWrapper bombWrapper = new BombWrapper(currentBomb.GetComponent <Bomb>()); bombWrappers[0] = bombWrapper; bombWrapper.holdable.OnLetGo += () => BombStatus.Instance.currentBomb = null; if (globalTimerDisabled || firstBomb) { firstBomb = false; if (CurrentMode == Mode.Time) { bombWrapper.CurrentTimer = Modes.settings.TimeModeStartingTime * 60; } else if (CurrentMode == Mode.Zen) { bombWrapper.CurrentTimer = 0.001f; } } yield return(new WaitUntil(() => currentBomb != getBomb() || factoryRoom == null)); currentBomb = getBomb(); if (currentBomb == null || factoryRoom == null) { break; } } } else { wrapInitialBombs(); } yield break; } } // This code only runs if we aren't in the Factory room. wrapInitialBombs(); SceneManager.Instance.GameplayState.Room.PacingActions.RemoveAll(pacingAction => pacingAction.EventType == Assets.Scripts.Pacing.PaceEvent.OneMinuteLeft); UnityEngine.Object portalRoom = null; if (ReflectedTypes.PortalRoomType != null && ReflectedTypes.RedLightsMethod != null && ReflectedTypes.RoomLightField != null) { portalRoom = FindObjectOfType(ReflectedTypes.PortalRoomType); } bool lastState = false; IEnumerator portalEmergencyRoutine = null; while (CurrentState == KMGameInfo.State.Gameplay) { bool targetState = CurrentMode != Mode.Zen && bombWrappers.Any((BombWrapper bombWrapper) => !bombWrapper.Bomb.IsSolved() && bombWrapper.CurrentTimer < 60f); if (targetState != lastState) { foreach (Assets.Scripts.Props.EmergencyLight emergencyLight in FindObjectsOfType <Assets.Scripts.Props.EmergencyLight>()) { if (targetState) { emergencyLight.Activate(); } else { emergencyLight.Deactivate(); } } if (portalRoom != null) { if (targetState) { portalEmergencyRoutine = (IEnumerator)ReflectedTypes.RedLightsMethod.Invoke(portalRoom, null); StartCoroutine(portalEmergencyRoutine); } else { StopCoroutine(portalEmergencyRoutine); portalEmergencyRoutine = null; ((GameObject)ReflectedTypes.RoomLightField.GetValue(portalRoom)).GetComponent <Light>().color = new Color(0.5f, 0.5f, 0.5f); } } lastState = targetState; } yield return(null); } }
public void Awake() { MainThreadQueue.Initialize(); GameInfo = GetComponent <KMGameInfo>(); SettingWarning = transform.Find("UI").Find("SettingWarning").gameObject; BetterCasePicker.BombCaseGenerator = GetComponentInChildren <BombCaseGenerator>(); modConfig = new ModConfig <TweakSettings>("TweakSettings"); UpdateSettings(); bool changeFadeTime = settings.FadeTime >= 0; FreeplayDevice.MAX_SECONDS_TO_SOLVE = float.MaxValue; FreeplayDevice.MIN_MODULE_COUNT = 1; if (settings.EnableModsOnlyKey) { var lastFreeplaySettings = FreeplaySettings.CreateDefaultFreeplaySettings(); lastFreeplaySettings.OnlyMods = true; ProgressionManager.Instance.RecordLastFreeplaySettings(lastFreeplaySettings); } UpdateSettingWarning(); // Setup API/properties other mods to interact with GameObject infoObject = new GameObject("Tweaks_Info", typeof(TweaksProperties)); infoObject.transform.parent = gameObject.transform; // Watch the TweakSettings file for Time Mode state being changed in the office. FileSystemWatcher watcher = new FileSystemWatcher(Path.Combine(Application.persistentDataPath, "Modsettings"), "TweakSettings.json") { NotifyFilter = NotifyFilters.LastWrite }; watcher.Changed += (object source, FileSystemEventArgs e) => { if (modConfig.SerializeSettings(settings) == modConfig.SerializeSettings(modConfig.Settings)) { return; } UpdateSettings(); UpdateSettingWarning(); MainThreadQueue.Enqueue(() => StartCoroutine(ModifyFreeplayDevice(false))); }; // Setup our "service" to block the leaderboard submission requests ReflectedTypes.InstanceField.SetValue(null, new SteamFilterService()); // Create a fake case with a bunch of anchors to trick the game when using CaseGenerator. TweaksCaseGeneratorCase = new GameObject("TweaksCaseGenerator"); TweaksCaseGeneratorCase.transform.SetParent(transform); var kmBomb = TweaksCaseGeneratorCase.AddComponent <KMBomb>(); kmBomb.IsHoldable = false; kmBomb.WidgetAreas = new List <GameObject>(); kmBomb.visualTransform = transform; kmBomb.Faces = new List <KMBombFace>(); TweaksCaseGeneratorCase.AddComponent <ModBomb>(); var kmBombFace = TweaksCaseGeneratorCase.AddComponent <KMBombFace>(); kmBombFace.Anchors = new List <Transform>(); kmBomb.Faces.Add(kmBombFace); for (int i = 0; i <= 9001; i++) { kmBombFace.Anchors.Add(transform); } // Handle scene changes UnityEngine.SceneManagement.SceneManager.sceneLoaded += (Scene scene, LoadSceneMode _) => { UpdateSettings(); UpdateSettingWarning(); Modes.settings = Modes.modConfig.Settings; Modes.modConfig.Settings = Modes.settings; if ((scene.name == "mainScene" || scene.name == "gameplayScene") && changeFadeTime) { SceneManager.Instance.RapidFadeInTime = settings.FadeTime; } switch (scene.name) { case "mainScene": if (changeFadeTime) { SceneManager.Instance.SetupState.FadeInTime = SceneManager.Instance.SetupState.FadeOutTime = SceneManager.Instance.UnlockState.FadeInTime = settings.FadeTime; } break; case "gameplayLoadingScene": var gameplayLoadingManager = FindObjectOfType <GameplayLoadingManager>(); if (settings.InstantSkip) { gameplayLoadingManager.MinTotalLoadTime = 0; } if (changeFadeTime) { gameplayLoadingManager.FadeInTime = gameplayLoadingManager.FadeOutTime = settings.FadeTime; } ReflectedTypes.UpdateTypes(); ReflectedTypes.CurrencyAPIEndpointField?.SetValue(null, settings.FixFER ? "http://api.exchangeratesapi.io" : "http://api.fixer.io"); break; case "gameplayScene": if (changeFadeTime) { SceneManager.Instance.GameplayState.FadeInTime = SceneManager.Instance.GameplayState.FadeOutTime = settings.FadeTime; } break; } }; // Handle state changes GameInfo.OnStateChange += (KMGameInfo.State state) => { CurrentState = state; watcher.EnableRaisingEvents = state == KMGameInfo.State.Setup; if (state == KMGameInfo.State.Gameplay) { bool disableRecords = settings.BombHUD || settings.ShowEdgework || CurrentMode != Mode.Normal || settings.MissionSeed != -1; Assets.Scripts.Stats.StatsManager.Instance.DisableStatChanges = Assets.Scripts.Records.RecordManager.Instance.DisableBestRecords = disableRecords; if (disableRecords) { SteamFilterService.TargetMissionID = GameplayState.MissionToLoad; } BetterCasePicker.HandleCaseGeneration(); BombStatus.Instance.widgetsActivated = false; BombStatus.Instance.HUD.SetActive(settings.BombHUD); BombStatus.Instance.Edgework.SetActive(settings.ShowEdgework); BombStatus.Instance.ConfidencePrefab.gameObject.SetActive(CurrentMode != Mode.Zen); BombStatus.Instance.StrikesPrefab.color = CurrentMode == Mode.Time ? Color.yellow : Color.red; Modes.Multiplier = Modes.settings.TimeModeStartingMultiplier; BombStatus.Instance.UpdateMultiplier(); bombWrappers = new BombWrapper[] { }; StartCoroutine(CheckForBombs()); if (settings.SkipGameplayDelay) { StartCoroutine(SkipGameplayDelay()); } if (GameplayState.BombSeedToUse == -1) { GameplayState.BombSeedToUse = settings.MissionSeed; } } else if (state == KMGameInfo.State.Setup) { if (ReflectedTypes.LoadedModsField.GetValue(ModManager.Instance) is Dictionary <string, Mod> loadedMods) { Mod tweaksMod = loadedMods.Values.FirstOrDefault(mod => mod.ModID == "Tweaks"); if (tweaksMod != null) { if (CaseGeneratorSettingCache != settings.CaseGenerator) { if (settings.CaseGenerator) { tweaksMod.ModObjects.Add(TweaksCaseGeneratorCase); } else { tweaksMod.ModObjects.Remove(TweaksCaseGeneratorCase); } CaseGeneratorSettingCache = settings.CaseGenerator; UpdateSettingWarning(); } } } StartCoroutine(ModifyFreeplayDevice(true)); GetComponentInChildren <ModSelectorExtension>().FindAPI(); GameplayState.BombSeedToUse = -1; } else if (state == KMGameInfo.State.Transitioning) { // Because the settings are checked on a scene change and there is no scene change from exiting the gameplay room, // we need to update the settings here in case the user changed their HideTOC settings. UpdateSettings(); bool modified = false; var ModMissionToCs = ModManager.Instance.ModMissionToCs; foreach (var metaData in ModMissionToCs) { modified |= ModToCMetaData.Add(metaData); } var unloadedMods = (Dictionary <string, Mod>)ReflectedTypes.UnloadedModsField.GetValue(ModManager.Instance); if (unloadedMods != null) { foreach (var unloadedMod in unloadedMods.Values) { var tocs = (List <ModTableOfContentsMetaData>)ReflectedTypes.TocsField.GetValue(unloadedMod); if (tocs != null) { foreach (var metaData in tocs) { modified |= ModToCMetaData.Remove(metaData); } } } } var newToCs = ModToCMetaData.Where(metaData => !settings.HideTOC.Any(pattern => Localization.GetLocalizedString(metaData.DisplayNameTerm).Like(pattern))); modified |= (newToCs.Count() != ModMissionToCs.Count || !newToCs.All(ModMissionToCs.Contains)); ModMissionToCs.Clear(); ModMissionToCs.AddRange(newToCs); if (modified) { SetupState.LastBombBinderTOCIndex = 0; SetupState.LastBombBinderTOCPage = 0; } } }; }