public override void Trigger(object os_obj)
        {
            OS os = (OS)os_obj;

            if ((double)this.Delay <= 0.0)
            {
                NetmapSortingAlgorithm sortingAlgorithm = NetmapSortingAlgorithm.Grid;
                switch (this.Method.ToLower())
                {
                case "scatter":
                    sortingAlgorithm = NetmapSortingAlgorithm.Scatter;
                    break;

                case "grid":
                    sortingAlgorithm = NetmapSortingAlgorithm.Grid;
                    break;

                case "chaos":
                    sortingAlgorithm = NetmapSortingAlgorithm.Chaos;
                    break;

                case "scangrid":
                case "seqgrid":
                case "sequencegrid":
                case "sequence grid":
                    sortingAlgorithm = NetmapSortingAlgorithm.LockGrid;
                    break;
                }
                os.netMap.SortingAlgorithm = sortingAlgorithm;
            }
            else
            {
                Computer computer = Programs.getComputer(os, this.DelayHost);
                if (computer == null)
                {
                    throw new NullReferenceException("Computer " + (object)computer + " could not be found as DelayHost for Function");
                }
                float delay = this.Delay;
                this.Delay = -1f;
                DelayableActionSystem.FindDelayableActionSystemOnComputer(computer).AddAction((SerializableAction)this, delay);
            }
        }
        internal static Vector2 GetNodePosition(NetmapSortingAlgorithm algorithm, float mapWidth, float mapHeight, Computer node, int nodeIndex, int totalNodes, int totalRevealedNodes, OS os)
        {
            switch (algorithm)
            {
            case NetmapSortingAlgorithm.Grid:
                int num1 = 5;
                int num2 = (int)((double)totalNodes / (double)num1) + 1;
                if (totalRevealedNodes > 60)
                {
                    num1 = 7;
                    num2 = (int)((double)totalNodes / (double)num1) + 1;
                }
                if (totalRevealedNodes > 150)
                {
                    num1 = 9;
                    num2 = (int)((double)totalNodes / (double)num1) + 1;
                }
                int num3 = (int)((double)nodeIndex / (double)num1 + 0.0);
                int num4 = num1 * num2;
                if (totalNodes > num4 - 10)
                {
                    num3 = (int)((double)nodeIndex / (double)num1 + 0.5);
                    ++num2;
                }
                int   num5  = nodeIndex % num1;
                float xout1 = (float)num3 / ((float)num2 - 2f);
                float yout1 = (float)num5 / ((float)num1 - 1f);
                NetmapSortingAlgorithms.ClipToMargins(xout1, yout1, totalRevealedNodes, out xout1, out yout1);
                float x1 = xout1 * mapWidth;
                yout1 *= mapHeight;
                return(new Vector2(x1, yout1));

            case NetmapSortingAlgorithm.Chaos:
                return(new Vector2(Utils.randm(1f) * mapWidth, Utils.randm(1f) * mapHeight));

            case NetmapSortingAlgorithm.LockGrid:
                int num6  = 5;
                int count = os.netMap.visibleNodes.Count;
                int num7  = (int)((double)(count + (int)((double)(totalNodes - count) / 8.0)) / (double)num6) + 1;
                if (count > 50)
                {
                    num6 = 6;
                    num7 = (int)((double)count / (double)num6) + 1;
                }
                if (count > 80)
                {
                    num6 = 7;
                    num7 = (int)((double)count / (double)num6) + 1;
                }
                if (count > 110)
                {
                    num6 = 8;
                    num7 = (int)((double)count / (double)num6) + 1;
                }
                if (count > 150)
                {
                    num6 = 9;
                    num7 = (int)((double)count / (double)num6) + 1;
                }
                int num8 = Math.Max(num7 + 1, 3);
                int num9 = os.netMap.visibleNodes.IndexOf(os.netMap.nodes.IndexOf(node));
                if (num9 == -1)
                {
                    num9 = 1;
                }
                int num10 = num9 / num6;
                if (count > 150)
                {
                    num10 = (int)((double)num9 / (double)num6 + 0.5);
                    ++num8;
                }
                int   num11 = num9 % num6;
                float xout2 = (float)num10 / ((float)num8 - 2f);
                float yout2 = (float)num11 / ((float)num6 - 1f);
                NetmapSortingAlgorithms.ClipToMargins(xout2, yout2, totalRevealedNodes, out xout2, out yout2);
                float x2 = xout2 * mapWidth;
                yout2 *= mapHeight;
                return(new Vector2(x2, yout2));

            default:
                Vector2 vector2 = Utils.Clamp(node.location, 0.0f, 1f);
                return(new Vector2(vector2.X * mapWidth, vector2.Y * mapHeight));
            }
        }