TEditXna.ViewModel.WorldViewModel.SetTrack C# (CSharp) Method

SetTrack() private method

private SetTrack ( int x, int y, Tile curTile, bool erase, bool hammer, bool check ) : void
x int
y int
curTile Tile
erase bool
hammer bool
check bool
return void
        private void SetTrack(int x, int y, Tile curTile, bool erase, bool hammer, bool check)
        {
            if (TilePicker.TrackMode == TrackMode.Pressure)
            {
                if (erase)
                    if (curTile.V == 21)
                        curTile.V = 1;
                    else
                    {
                        if (curTile.U >= 20 && curTile.U <= 23)
                            curTile.U -= 20;
                    }
                else
                {
                    if (curTile.V == 1)
                        curTile.V = 21;
                    else
                    {
                        if (curTile.U >= 0 && curTile.U <= 3)
                            curTile.U += 20;
                        if (curTile.U == 14 || curTile.U == 24)
                            curTile.U += 22;
                        if (curTile.U == 15 || curTile.U == 25)
                            curTile.U += 23;
                    }
                }
            }
            else if (TilePicker.TrackMode == TrackMode.Booster)
            {
                if (erase)
                {
                    if (curTile.U == 30 || curTile.U == 31)
                        curTile.U = 1;
                    if (curTile.U == 32 || curTile.U == 34)
                        curTile.U = 8;
                    if (curTile.U == 33 || curTile.U == 35)
                        curTile.U = 9;
                }
                else
                {
                    if (curTile.U == 1)
                        curTile.U = 30;
                    if (curTile.U == 8)
                        curTile.U = 32;
                    if (curTile.U == 9)
                        curTile.U = 33;
                }
            }
            else
            {
                if(erase)
                {
                    int num1 = curTile.U;
                    int num2 = curTile.V;
                    SetPixelAutomatic(curTile, tile: -1, u: 0, v: 0);
                    if (num1 > 0)
                    {
                        switch (Minecart.LeftSideConnection[num1])
                        {
                            case 0: SetTrack(x - 1, y - 1, CurrentWorld.Tiles[x - 1, y - 1], false, false, false); break;
                            case 1: SetTrack(x - 1, y, CurrentWorld.Tiles[x - 1, y], false, false, false); break;
                            case 2: SetTrack(x - 1, y + 1, CurrentWorld.Tiles[x - 1, y + 1], false, false, false); break;
                        }
                        switch (Minecart.RightSideConnection[num1])
                        {
                            case 0: SetTrack(x + 1, y - 1, CurrentWorld.Tiles[x + 1, y - 1], false, false, false); break;
                            case 1: SetTrack(x + 1, y, CurrentWorld.Tiles[x + 1, y], false, false, false); break;
                            case 2: SetTrack(x + 1, y + 1, CurrentWorld.Tiles[x + 1, y + 1], false, false, false); break;
                        }
                    }
                    if (num2 > 0)
                    {
                        switch (Minecart.LeftSideConnection[num2])
                        {
                            case 0: SetTrack(x - 1, y - 1, CurrentWorld.Tiles[x - 1, y - 1], false, false, false); break;
                            case 1: SetTrack(x - 1, y, CurrentWorld.Tiles[x - 1, y], false, false, false); break;
                            case 2: SetTrack(x - 1, y + 1, CurrentWorld.Tiles[x - 1, y + 1], false, false, false); break;
                        }
                        switch (Minecart.RightSideConnection[num2])
                        {
                            case 0: SetTrack(x + 1, y - 1, CurrentWorld.Tiles[x + 1, y - 1], false, false, false); break;
                            case 1: SetTrack(x + 1, y, CurrentWorld.Tiles[x + 1, y], false, false, false); break;
                            case 2: SetTrack(x + 1, y + 1, CurrentWorld.Tiles[x + 1, y + 1], false, false, false); break;
                        }
                    }
                }
                else
                {
                    int num = 0;
                    if (CurrentWorld.Tiles[x - 1, y - 1] != null && CurrentWorld.Tiles[x - 1, y - 1].Type == 314)
                        num++;
                    if (CurrentWorld.Tiles[x - 1, y] != null && CurrentWorld.Tiles[x - 1, y].Type == 314)
                        num += 2;
                    if (CurrentWorld.Tiles[x - 1, y + 1] != null && CurrentWorld.Tiles[x - 1, y + 1].Type == 314)
                        num += 4;
                    if (CurrentWorld.Tiles[x + 1, y - 1] != null && CurrentWorld.Tiles[x + 1, y - 1].Type == 314)
                        num += 8;
                    if (CurrentWorld.Tiles[x + 1, y] != null && CurrentWorld.Tiles[x + 1, y].Type == 314)
                        num += 16;
                    if (CurrentWorld.Tiles[x + 1, y + 1] != null && CurrentWorld.Tiles[x + 1, y + 1].Type == 314)
                        num += 32;
                    int Front = curTile.U;
                    int Back = curTile.V;
                    int num4;
                    if (Front >= 0 && Front < Minecart.TrackType.Length)
                        num4 = Minecart.TrackType[Front];
                    else
                        num4 = 0;
                    int num5 = -1;
                    int num6 = -1;
                    int[] array = Minecart.TrackSwitchOptions[num];
                    if (!hammer)
                    {
                        if (curTile.Type != 314)
                        {
                            curTile.Type = (ushort)314;
                            curTile.IsActive = true;
                            Front = 0;
                            Back = -1;
                        }
                        int num7 = -1;
                        int num8 = -1;
                        bool flag = false;
                        for (int k = 0; k < array.Length; k++)
                        {
                            int num9 = array[k];
                            if (Back == array[k])
                                num6 = k;
                            if (Minecart.TrackType[num9] == num4)
                            {
                                if (Minecart.LeftSideConnection[num9] == -1 || Minecart.RightSideConnection[num9] == -1)
                                {
                                    if (Front == array[k])
                                    {
                                        num5 = k;
                                        flag = true;
                                    }
                                    if (num7 == -1)
                                        num7 = k;
                                }
                                else
                                {
                                    if (Front == array[k])
                                    {
                                        num5 = k;
                                        flag = false;
                                    }
                                    if (num8 == -1)
                                        num8 = k;
                                }
                            }
                        }
                        if (num8 != -1)
                        {
                            if (num5 == -1 || flag)
                                num5 = num8;
                        }
                        else
                        {
                            if (num5 == -1)
                            {
                                if (num4 == 2 || num4 == 1)
                                    return;
                                num5 = num7;
                            }
                            num6 = -1;
                        }
                    }
                    else if (hammer && curTile.Type == 314)
                    {
                        for (int l = 0; l < array.Length; l++)
                        {
                            if (Front == array[l])
                                num5 = l;
                            if (Back == array[l])
                                num6 = l;
                        }
                        int num10 = 0;
                        int num11 = 0;
                        for (int m = 0; m < array.Length; m++)
                        {
                            if (Minecart.TrackType[array[m]] == num4)
                            {
                                if (Minecart.LeftSideConnection[array[m]] == -1 || Minecart.RightSideConnection[array[m]] == -1)
                                    num11++;
                                else
                                    num10++;
                            }
                        }
                        if (num10 < 2 && num11 < 2)
                            return;
                        bool flag2 = num10 == 0;
                        bool flag3 = false;
                        if (!flag2)
                        {
                            while (!flag3)
                            {
                                num6++;
                                if (num6 >= array.Length)
                                {
                                    num6 = -1;
                                    break;
                                }
                                if ((Minecart.LeftSideConnection[array[num6]] != Minecart.LeftSideConnection[array[num5]] || Minecart.RightSideConnection[array[num6]] != Minecart.RightSideConnection[array[num5]]) && Minecart.TrackType[array[num6]] == num4 && Minecart.LeftSideConnection[array[num6]] != -1 && Minecart.RightSideConnection[array[num6]] != -1)
                                    flag3 = true;
                            }
                        }
                        if (!flag3)
                        {
                            while (true)
                            {
                                num5++;
                                if (num5 >= array.Length)
                                    break;
                                if (Minecart.TrackType[array[num5]] == num4 && (Minecart.LeftSideConnection[array[num5]] == -1 || Minecart.RightSideConnection[array[num5]] == -1) == flag2)
                                    goto IL_100;
                            }
                            num5 = -1;
                            while (true)
                            {
                                num5++;
                                if (Minecart.TrackType[array[num5]] == num4)
                                {
                                    if ((Minecart.LeftSideConnection[array[num5]] == -1 || Minecart.RightSideConnection[array[num5]] == -1) == flag2)
                                        break;
                                }
                            }
                        }
                    }
                    IL_100:
                    if (num5 == -1)
                        curTile.U = 0;
                    else
                    {
                        curTile.U = (short)array[num5];
                        if (check)
                        {
                            switch (Minecart.LeftSideConnection[curTile.U])
                            {
                                case 0: SetTrack(x - 1, y - 1, CurrentWorld.Tiles[x - 1, y - 1], false, false, false); break;
                                case 1: SetTrack(x - 1, y, CurrentWorld.Tiles[x - 1, y], false, false, false); break;
                                case 2: SetTrack(x - 1, y + 1, CurrentWorld.Tiles[x - 1, y + 1], false, false, false); break;
                            }
                            switch (Minecart.RightSideConnection[curTile.U])
                            {
                                case 0: SetTrack(x + 1, y - 1, CurrentWorld.Tiles[x + 1, y - 1], false, false, false); break;
                                case 1: SetTrack(x + 1, y, CurrentWorld.Tiles[x + 1, y], false, false, false); break;
                                case 2: SetTrack(x + 1, y + 1, CurrentWorld.Tiles[x + 1, y + 1], false, false, false); break;
                            }
                        }
                    }
                    if (num6 == -1)
                        curTile.V = -1;
                    else
                    {
                        curTile.V = (short)array[num6];
                        if (check)
                        {
                            switch (Minecart.LeftSideConnection[curTile.V])
                            {
                                case 0: SetTrack(x - 1, y - 1, CurrentWorld.Tiles[x - 1, y - 1], false, false, false); break;
                                case 1: SetTrack(x - 1, y, CurrentWorld.Tiles[x - 1, y], false, false, false); break;
                                case 2: SetTrack(x - 1, y + 1, CurrentWorld.Tiles[x - 1, y + 1], false, false, false); break;
                            }
                            switch (Minecart.RightSideConnection[curTile.V])
                            {
                                case 0: SetTrack(x + 1, y - 1, CurrentWorld.Tiles[x + 1, y - 1], false, false, false); break;
                                case 1: SetTrack(x + 1, y, CurrentWorld.Tiles[x + 1, y], false, false, false); break;
                                case 2: SetTrack(x + 1, y + 1, CurrentWorld.Tiles[x + 1, y + 1], false, false, false); break;
                            }
                        }
                    }
                }
            }
        }