Exemplo n.º 1
0
        public static void EjectorComponent_SetOrbit_Postfix(ref EjectorComponent __instance, int _orbitId)
        {
            var ejectorUID = GetEjectorUID(__instance);

            ManagedEjector managedEjector = GetOrCreateManagedEjector(ejectorUID, _orbitId);

            managedEjector.originalOrbitId = _orbitId;
        }
Exemplo n.º 2
0
        public static void EjectorComponent_Export_Prefix(ref EjectorComponent __instance, ref int __state)
        {
            // at save time we store the current orbitId , replace it with the originalOne, and restore it after the save.
            var            ejectorUID     = GetEjectorUID(__instance);
            ManagedEjector managedEjector = GetOrCreateManagedEjector(ejectorUID, __instance.orbitId);

            __state            = __instance.orbitId;
            __instance.orbitId = managedEjector.originalOrbitId;
        }
Exemplo n.º 3
0
        public static void EjectorComponent_InternalUpdate_Postfix(ref EjectorComponent __instance, DysonSwarm swarm, AstroPose[] astroPoses)
        {
            var ejectorUID = GetEjectorUID(__instance);

            if (ejectorUID % BATCH_COUNT != batch)
            {
                return;
            }

            ManagedEjector managedEjector = GetOrCreateManagedEjector(ejectorUID, __instance.orbitId);

            if (!IsOrbitValid(managedEjector.originalOrbitId, swarm))
            {
                managedEjector.originalOrbitId = 0;
            }

            if (__instance.orbitId != managedEjector.originalOrbitId && IsOrbitReachable(__instance, swarm, astroPoses, managedEjector.originalOrbitId))
            {
                // by default we try to check if the original orbit is available
                SetOrbit(ref __instance, managedEjector.originalOrbitId);
            }
            else if (
                (__instance.targetState == EjectorComponent.ETargetState.AngleLimit ||
                 __instance.targetState == EjectorComponent.ETargetState.Blocked ||
                 (__instance.targetState == EjectorComponent.ETargetState.None && forceRetargeting.Value))

                && swarm.orbitCursor > 1)
            {
                // if the current orbit is not reachable activate auto targeting
                var testOrbit   = __instance.orbitId;
                var orbitsCount = swarm.orbitCursor;
                while (--orbitsCount > 0)
                {
                    testOrbit++;
                    if (testOrbit >= swarm.orbitCursor)
                    {
                        testOrbit = 1;
                    }

                    if (testOrbit == 1 && ignoreOrbit1.Value)
                    {
                        continue;
                    }

                    if (IsOrbitReachable(__instance, swarm, astroPoses, testOrbit))
                    {
                        SetOrbit(ref __instance, testOrbit);
                        return;
                    }
                }

                // no alternative orbit has been found. set the original as default
                SetOrbit(ref __instance, managedEjector.originalOrbitId);
            }
        }
Exemplo n.º 4
0
        internal static ManagedEjector GetOrCreateManagedEjector(int ejectorUID, int originalOrbitId)
        {
            if (!managedEjectors.ContainsKey(ejectorUID))
            {
                var managedEjector = new ManagedEjector()
                {
                    originalOrbitId = originalOrbitId
                };
                managedEjectors.Add(ejectorUID, managedEjector);
            }

            return(managedEjectors[ejectorUID]);
        }
Exemplo n.º 5
0
        public static void UIEjectorWindow__OnUpdate_Postfix(ref UIEjectorWindow __instance, ref UIOrbitPicker ___orbitPicker)
        {
            if (__instance.ejectorId != 0 && __instance.factory != null)
            {
                if (autoRetargetingGO == null)
                {
                    var stateText = GameObject.Find("UI Root/Overlay Canvas/In Game/Windows/Ejector Window/state/state-text");
                    autoRetargetingGO = Instantiate(stateText, stateText.transform.position, Quaternion.identity);

                    autoRetargetingGO.name = "auto-retargeting";
                    autoRetargetingGO.transform.SetParent(stateText.transform.parent);


                    autoRetargetingGO.transform.localScale    = new Vector3(1f, 1f, 1f);
                    autoRetargetingGO.transform.localPosition = stateText.transform.localPosition + new Vector3(0f, -24f, 0f);
                }

                EjectorComponent ejector = __instance.factorySystem.ejectorPool[__instance.ejectorId];
                var ejectorUID           = GetEjectorUID(ejector);

                var text  = "Retargeting - Original Orbit";
                var color = TEXT_WHITE;

                ManagedEjector managedEjector     = GetOrCreateManagedEjector(ejectorUID, ejector.orbitId);
                bool           isAlternativeOrbit = ejector.orbitId != managedEjector.originalOrbitId;

                if (ejector.targetState == EjectorComponent.ETargetState.AngleLimit)
                {
                    text  = "Retargeting - No valid alternative";
                    color = TEXT_ORANGE;
                }

                if (isAlternativeOrbit)
                {
                    ___orbitPicker.orbitId = managedEjector.originalOrbitId;

                    text  = $"Retargeting - Alternative Orbit [ {ejector.orbitId} ]";
                    color = TEXT_CYAN;
                }


                for (var i = 0; i < ___orbitPicker.orbitButtons.Length; i++)
                {
                    var orbitButton = ___orbitPicker.orbitButtons[i];
                    var transition  = orbitButton.transitions[0];

                    if (orbitButton.highlighted || orbitButton.updating || orbitButton.isPointerEnter || orbitButton.isPointerDown || !orbitButton.button.interactable)
                    {
                        continue;
                    }

                    if (isAlternativeOrbit && i == ejector.orbitId)
                    {
                        transition.target.color = BUTTON_CYAN;
                    }
                    else if (transition.target.color != transition.normalColor)
                    {
                        transition.target.color = transition.normalColor;
                    }
                }

                var autoRetargetingText = autoRetargetingGO.GetComponent <Text>();
                autoRetargetingText.text  = text;
                autoRetargetingText.color = color;
            }
        }