public static void Postfix(ManagementMenu.ScreenData screenData, ManagementMenu __instance) { KIconToggleMenu.ToggleInfo researchInfo = Traverse.Create(__instance).Field("researchInfo").GetValue <KIconToggleMenu.ToggleInfo>(); ManagementMenu.ScreenData activeScreen = Traverse.Create(__instance).Field("activeScreen").GetValue <ManagementMenu.ScreenData>(); if (screenData.toggleInfo == researchInfo && activeScreen == screenData) { RequirementFunctions.CountResourcesInReservoirs(); ResearchScreen researchScreen = (ResearchScreen)ManagementMenu.Instance.researchScreen; Dictionary <Tech, ResearchEntry> entryMap = Traverse.Create(researchScreen).Field("entryMap").GetValue <Dictionary <Tech, ResearchEntry> >(); foreach (Tech tech in entryMap.Keys) { if (!tech.IsComplete()) { LocText researchName = Traverse.Create(entryMap[tech]).Field("researchName").GetValue <LocText>(); if (!TechRequirements.Instance.HasTechReq(tech.Id)) { continue; } researchName.GetComponent <ToolTip>().toolTip = CreateTechTooltipText(tech); } } } /*else if (screenData.toggleInfo == researchInfo && activeScreen != screenData) * Debug.Log("ResearchRequirements: Research closed"); * else * Debug.Log("ResearchRequirements: Other screen toogled");*/ }
/// <summary> /// Applied after OnShow runs. /// </summary> internal static void Postfix(ResearchScreen __instance, bool show) { var content = __instance.scrollContent; if (show && content != null && __instance.isActiveAndEnabled) { if (content.TryGetComponent(out KChildFitter cf)) { cf.FitSize(); } __instance.StartCoroutine(FreezeLayouts(content.transform)); } }
public void AddResearchScreen(ResearchScreen researchScreen) { if (!((Object)this.researchScreen != (Object)null)) { this.researchScreen = researchScreen; this.researchScreen.gameObject.SetActive(false); ScreenInfoMatch.Add(researchInfo, new ScreenData { screen = this.researchScreen, tabIdx = 5, toggleInfo = researchInfo }); this.researchScreen.Show(false); } }
/// <summary> /// Zooms to the target coordinates if necessary. /// </summary> /// <param name="instance">The research screen instance to zoom.</param> /// <param name="dt">The unscaled delta time since the last update.</param> /// <param name="input">Whether user input is currently occurring.</param> /// <param name="anchorPos">The position of the tech tree to update.</param> private static void ZoomToTarget(ResearchScreen instance, float dt, bool input, ref Vector2 anchorPos) { Vector2 target = instance.forceTargetPosition, pos = anchorPos; if (instance.zoomingToTarget) { // Process automatic zoom in, cancel if user input occurs pos = Vector2.Lerp(pos, target, dt * 4.0f); if ((pos - target).sqrMagnitude < THRESHOLD_SQ || input) { instance.zoomingToTarget = false; } anchorPos = pos; } }
public static void Postfix(ResearchCenter __instance) { TechInstance activeResearch = Research.Instance.GetActiveResearch(); Tech tech = activeResearch.tech; TechRequirements.TechReq req = TechRequirements.Instance.GetTechReq(tech.Id); if (req.ContinuousCheck) { if (!req.ReqUnlocked()) { __instance.StopWork(__instance.worker, true); ResearchScreen researchScreen = (ResearchScreen)ManagementMenu.Instance.researchScreen; researchScreen.CancelResearch(); Research.Instance.SetActiveResearch(null, true); } } }
public static void Postfix(ResearchCenter __instance) { GVD.VersionAlert(false); /* * Works vor vanilla * */ TechInstance activeResearch = Research.Instance.GetActiveResearch(); Tech tech = activeResearch.tech; TechRequirements.TechReq req = TechRequirements.Instance.GetTechReq(tech.Id); if (req.ContinuousCheck) { if (!req.ReqUnlocked()) { __instance.StopWork(__instance.worker, true); ResearchScreen researchScreen = (ResearchScreen)ManagementMenu.Instance.researchScreen; researchScreen.CancelResearch(); Research.Instance.SetActiveResearch(null, true); } } /* * Works vor DLC * * TechInstance activeResearch = Research.Instance.GetActiveResearch(); * Tech tech = activeResearch.tech; * TechRequirements.TechReq req = TechRequirements.Instance.GetTechReq(tech.Id); * * if (req.ContinuousCheck) * if (!req.ReqUnlocked()) * { * __instance.StopWork(__instance.worker, true); * ResearchScreen researchScreen = Traverse.Create(ManagementMenu.Instance).Field("researchScreen").GetValue<ResearchScreen>(); * if (researchScreen == null) * return; * researchScreen.CancelResearch(); * Research.Instance.SetActiveResearch(null, true); * Debug.Log("ResearchRequirements: research canceled"); * } */ }
public static void Postfix(ResearchCenter __instance) { //throw new System.NotImplementedException("ResearchCenter_OnWorkTick_Patch - not implemented for DLC"); /* * Works vor vanilla * * TechInstance activeResearch = Research.Instance.GetActiveResearch(); * Tech tech = activeResearch.tech; * TechRequirements.TechReq req = TechRequirements.Instance.GetTechReq(tech.Id); * * if (req.ContinuousCheck) * if(!req.ReqUnlocked()) * { * __instance.StopWork(__instance.worker, true); * ResearchScreen researchScreen = (ResearchScreen)ManagementMenu.Instance.researchScreen; * researchScreen.CancelResearch(); * Research.Instance.SetActiveResearch(null, true); * } */ GVD.VersionAlert(true); TechInstance activeResearch = Research.Instance.GetActiveResearch(); Tech tech = activeResearch.tech; TechRequirements.TechReq req = TechRequirements.Instance.GetTechReq(tech.Id); if (req.ContinuousCheck) { if (!req.ReqUnlocked()) { __instance.StopWork(__instance.worker, true); ResearchScreen researchScreen = Traverse.Create(ManagementMenu.Instance).Field("researchScreen").GetValue <ResearchScreen>(); if (researchScreen == null) { return; } researchScreen.CancelResearch(); Research.Instance.SetActiveResearch(null, true); Debug.Log("ResearchRequirements: research canceled"); } } }
/// <summary> /// Updates the keyboard input for panning the research screen. /// </summary> /// <param name="instance">The research screen to pan.</param> /// <param name="dt">The unscaled delta time since the last update.</param> /// <param name="anchorPos">The position of the tech tree to update.</param> /// <param name="delta">The rate at which the keyboard is moving the view.</param> /// <returns>true if any keyboard keys are down, or false otherwise.</returns> private static bool UpdateKeyboard(ResearchScreen instance, float dt, ref Vector2 anchorPos, out Vector2 delta) { float speed = instance.keyboardScrollSpeed, easing = instance.keyPanEasing; Vector2 panDelta = instance.keyPanDelta; bool anyDown = false; if (instance.panUp) { panDelta.y -= dt * speed; anyDown = true; } else if (instance.panDown) { panDelta.y += dt * speed; anyDown = true; } if (instance.panLeft) { panDelta.x += dt * speed; anyDown = true; } else if (instance.panRight) { panDelta.x -= dt * speed; anyDown = true; } // Steam Controller/Deck support if (KInputManager.currentControllerIsGamepad) { panDelta = KInputManager.steamInputInterpreter.GetSteamCameraMovement() * dt * speed * -5.0f; anyDown = true; } // Deceleration panDelta.x -= Mathf.Lerp(0f, panDelta.x, dt * easing); panDelta.y -= Mathf.Lerp(0f, panDelta.y, dt * easing); instance.keyPanDelta = panDelta; anchorPos += panDelta; delta = panDelta; return(anyDown); }
/// <summary> /// Updates the drag state of the research screen. /// </summary> /// <param name="instance">The research screen instance to update.</param> /// <param name="mousePos">The current mouse position.</param> /// <returns>true if the user is dragging the screen, or false otherwise.</returns> private static bool UpdateDrag(ResearchScreen instance, Vector3 mousePos) { bool dragging = instance.isDragging, buttonDown = instance.leftMouseDown || instance.rightMouseDown; // No square root for you, sqrt(1) = 1 if (!dragging && buttonDown && (instance.dragStartPosition - mousePos). sqrMagnitude > THRESHOLD_SQ) { dragging = true; } else if (dragging && !buttonDown) { instance.leftMouseDown = false; instance.rightMouseDown = false; dragging = false; } instance.isDragging = dragging; return(dragging); }
private static Vector2 ClampBack(ResearchScreen __instance, RectTransform rt, float zoom, Vector2 inertia, Vector2 anchorPos) { const float ZS = 250.0f; Vector2 contentSize = rt.rect.size, deltaAnchor, target = __instance. forceTargetPosition; float y = 0.0f, xMin = (-contentSize.x * 0.5f - ZS) * zoom, xMax = ZS * zoom, yMin = -ZS * zoom, yMax; if (__instance.TryGetComponent(out RectTransform irt)) { y = irt.rect.size.y; } yMax = (contentSize.y + ZS) * zoom - y; target.x = Mathf.Clamp(target.x, xMin, xMax); target.y = Mathf.Clamp(target.y, yMin, yMax); deltaAnchor = new Vector2(Mathf.Clamp(anchorPos.x, xMin, xMax), Mathf.Clamp(anchorPos.y, yMin, yMax)) + inertia - anchorPos; __instance.forceTargetPosition = target; return(deltaAnchor); }
/// <summary> /// Updates the zoom state of the research screen. /// </summary> /// <param name="instance">The research screen instance to update.</param> /// <param name="mousePos">The current mouse position.</param> /// <param name="rt">The transform with the displayed tech tree.</param> /// <param name="dt">The unscaled delta time since the last update.</param> /// <param name="anchorPos">The position of the tech tree to update.</param> /// <returns>The current zoom level.</returns> private static float UpdateZoom(ResearchScreen instance, Vector3 mousePos, RectTransform rt, float dt, ref Vector2 anchorPos) { float zoom = instance.currentZoom, oldZoom = zoom; Vector2 target = mousePos, before; zoom = Mathf.Lerp(zoom, instance.targetZoom, Math.Min(0.9f, instance. effectiveZoomSpeed * dt)); instance.currentZoom = zoom; if (instance.zoomCenterLock) { target = new Vector2(0.5f * Screen.width, 0.5f * Screen.height); } before = zoom * rt.InverseTransformPoint(target); if (!Mathf.Approximately(zoom, oldZoom)) { rt.localScale = new Vector3(zoom, zoom, 1.0f); } anchorPos += (Vector2)rt.InverseTransformPoint(target) * zoom - before; return(zoom); }
public static void Postfix(ManagementMenu.ScreenData screenData, ManagementMenu __instance) { KIconToggleMenu.ToggleInfo researchInfo = Traverse.Create(__instance).Field("researchInfo").GetValue <KIconToggleMenu.ToggleInfo>(); ManagementMenu.ScreenData activeScreen = Traverse.Create(__instance).Field("activeScreen").GetValue <ManagementMenu.ScreenData>(); if (screenData.toggleInfo == researchInfo && activeScreen == screenData) { RequirementFunctions.CountResourcesInReservoirs(); ResearchScreen researchScreen = Traverse.Create(ManagementMenu.Instance).Field("researchScreen").GetValue <ResearchScreen>(); if (researchScreen == null) { return; } Dictionary <Tech, ResearchEntry> entryMap = Traverse.Create(researchScreen).Field("entryMap").GetValue <Dictionary <Tech, ResearchEntry> >(); foreach (Tech tech in entryMap.Keys) { if (!tech.IsComplete()) { LocText researchName = Traverse.Create(entryMap[tech]).Field("researchName").GetValue <LocText>(); researchName.GetComponent <ToolTip>().toolTip = CreateTechTooltipText(tech); } } } }
/// <summary> /// Applied before Update runs. /// </summary> internal static bool Prefix(ResearchScreen __instance) { if (__instance.canvas.enabled && __instance.scrollContent.TryGetComponent( out RectTransform rt)) { Vector2 anchorPos = rt.anchoredPosition, startPos = anchorPos, inertia = __instance.dragInteria; Vector3 mousePos = KInputManager.GetMousePos(); bool dragging = UpdateDrag(__instance, mousePos); float dt = Time.unscaledDeltaTime; // Update from user input float zoom = UpdateZoom(__instance, mousePos, rt, dt, ref anchorPos); bool anyDown = UpdateKeyboard(__instance, dt, ref anchorPos, out Vector2 keyDelta); if (dragging) { Vector2 inerDelta = mousePos - __instance.dragLastPosition; anchorPos += inerDelta; __instance.dragLastPosition = mousePos; inertia = Vector2.ClampMagnitude(inertia + inerDelta, 400.0f); } inertia *= Math.Max(0.0f, 1.0f - dt * 4.0f); __instance.dragInteria = inertia; // Slide view back in bounds if not dragging if (!dragging) { Vector2 deltaAnchor = ClampBack(__instance, rt, zoom, inertia, anchorPos); if (anyDown) { // Zero out keyboard input vectors at edge anchorPos += deltaAnchor; if (deltaAnchor.x < 0f) { keyDelta.x = Math.Min(0f, keyDelta.x); } if (deltaAnchor.x > 0f) { keyDelta.x = Math.Max(0f, keyDelta.x); } if (deltaAnchor.y < 0f) { keyDelta.y = Math.Min(0f, keyDelta.y); } if (deltaAnchor.y > 0f) { keyDelta.y = Math.Max(0f, keyDelta.y); } } else { anchorPos += deltaAnchor * __instance.edgeClampFactor * dt; } } __instance.keyPanDelta = keyDelta; ZoomToTarget(__instance, dt, anyDown || dragging, ref anchorPos); if (!Mathf.Approximately(anchorPos.x, startPos.x) || !Mathf.Approximately( anchorPos.y, startPos.y)) { rt.anchoredPosition = anchorPos; } } return(false); }
void Start() { mainScreen = GameObject.FindGameObjectWithTag(Utility.MainScreenTag).GetComponent<MainScreen>(); supervillainScreen = GameObject.FindGameObjectWithTag(Utility.SupervillainScreenTag).GetComponent<SupervillainScreen>(); colonyMembersScreen = GameObject.FindGameObjectWithTag (Utility.ColonyMembersScreenTag).GetComponent<ColonyMembersScreen>(); businessScreen = GameObject.FindGameObjectWithTag (Utility.BusinessScreenTag).GetComponent<BusinessScreen> (); recruitmentScreen = GameObject.FindGameObjectWithTag (Utility.RecruitmentScreenTag).GetComponent<RecruitmentScreen> (); researchScreen = GameObject.FindGameObjectWithTag (Utility.ResearchScreenTag).GetComponent<ResearchScreen> (); worldDominationScreen = GameObject.FindGameObjectWithTag (Utility.WorldDominationScreenTag).GetComponent<WorldDominationScreen> (); gradeSchoolScreen = GameObject.FindGameObjectWithTag(Utility.GradeSchoolScreenTag).GetComponent<GradeSchoolScreen>(); intelligenceUScreen = GameObject.FindGameObjectWithTag(Utility.IntelligenceUniversityScreenTag).GetComponent<IntelligenceUScreen>(); combatUScreen = GameObject.FindGameObjectWithTag(Utility.CombatUniversityScreenTag).GetComponent<CombatUScreen>(); teachingUScreen = GameObject.FindGameObjectWithTag(Utility.TeachingUniversityScreenTag).GetComponent<TeachingUScreen>(); gameScreenList = new List<GameScreen>(); gameScreenList.Add(supervillainScreen); gameScreenList.Add(colonyMembersScreen); gameScreenList.Add(businessScreen); gameScreenList.Add(recruitmentScreen); gameScreenList.Add(researchScreen); gameScreenList.Add(worldDominationScreen); gameScreenList.Add(gradeSchoolScreen); gameScreenList.Add(intelligenceUScreen); gameScreenList.Add(combatUScreen); gameScreenList.Add(teachingUScreen); moveAllScreensOffScreen (); }