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;
}
}
}
}
}
}