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");*/
            }
Esempio n. 2
0
        /// <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);
     }
 }
Esempio n. 4
0
        /// <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");
                    }
                }
            }
Esempio n. 8
0
        /// <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);
        }
Esempio n. 9
0
        /// <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);
        }
Esempio n. 10
0
        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);
        }
Esempio n. 11
0
        /// <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);
                        }
                    }
                }
            }
Esempio n. 13
0
 /// <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 ();
    }