How to Play 20,000 Games in Ticket to Ride Without Actually Playing it

In this guide I’ll explain what counts for Conductor achievements and present you with 2 ways of reaching the final Level 5 achievement. Unfortunately slow progress and announcement of shutting down the servers pushed me to look for a new approach to unlock these achievements.

What counts for Conductor achievements

With some testing I came to a conclusion that only the following counts for Conductor achievements:

  • Online ranked games,
  • Solo games against bots
  • Tutorial games (sic!)

The progress for offline games (solo and tutorial) is stored locally.

The More Legit way

Yes, you read it right, tutorial games count for the achievement and that’s what we’re gonna use.
Finishing one tutorial game takes ~70 seconds which is almost 4x faster than a game against bot (when farming).
70 seconds x 20,0000 games ~= 389 hours ~= 16 days

We’ll use AutoHotkey, since going through tutorial 20,000 times manually would be extremely boring.
Below is my script, just make sure to:

  • Run it always on the same PC – the progress is not saved on the cloud/servers,
  • Use AutoHotkey v1.1, the script is not compatible with the newer version. You can download it from here.
  • Set your Display resolution to 1920×1080,
  • Run the game in Fullscreen mode,
  • Run the game and the ahk script, then press F2 key to start the script,
  • Stop the script with F3 key before you exit the game.
; This script will keep playing Ticket To Ride

F2::

SetDefaultMouseSpeed,6
WinWaitActive Ticket to Ride
Run()

F3::ExitApp


Run() {
    while true {
        StartNewTutorialGame()
        DrawTicket()
        if (CheckIsStuck()) {
            Restart()
            continue
        }
        PlayMiamiAtlanta()
        PlayAtlantaWashington()
        DrawSecondAndFourth()
        PlayWashingtonNewYork()
        DrawNewTicket()
        DrawFourthAndDeck()
        PlayNewYorkMontreal()
        DrawNewTicket()
        DrawFourthAndFifth()
        PlayMontrealChicago()
        DrawSecondAndDeck()
        PlayChicagoDuluth()
        DrawSecondAndDeck()
        PlayDuluthDenver()
        ConfirmLastTurn()
        Draw2Deck()
        ClickForwardAndQuit()
    }
}

StartNewTutorialGame()
{
    ;Click Play
    Click, 713, 299
    Sleep, 1000
    ;Click Tutorial
    Click, 1061, 139
    Sleep, 1000
    ;Click Go
    Click, 1000, 839
    Sleep, 1000
}

DrawTicket()
{
    Click, 1846, 345
    Sleep, 1000
    Click, 1846, 903
    Sleep, 1000
}

PlayMiamiAtlanta()
{
    Click, 1000, 959
    Sleep, 500
    Click, 1506, 883
    Sleep, 1000
}

PlayAtlantaWashington()
{
    Click, 1000, 959
    Sleep, 500
    Click, 1496, 653
    Sleep, 1000
}

DrawSecondAndFourth()
{
    Sleep, 2000
    DrawSecond()
    DrawFourth()
}

PlayWashingtonNewYork()
{
    Click, 1000, 959
    Sleep, 500
    Click, 1566, 405
    Sleep, 1000
}

DrawNewTicket()
{
    Sleep, 1000
    ;Click Go
    Click, 1000, 939
    Sleep, 1000
    ;Click Ticket Pile
    Click, 1846, 100
    Sleep, 1000
    DrawTicket()
    Sleep, 1000
}

DrawFourthAndDeck()
{
    Sleep, 2000
    DrawFourth()
    DrawFromDeck()
}

PlayNewYorkMontreal()
{
    Click, 850, 959
    Sleep, 500
    Click, 1566, 305
    Sleep, 1000
}

DrawFourthAndFifth()
{
    Sleep, 2000
    DrawFourth()
    DrawFifth()
}

PlayMontrealChicago()
{
    Click, 1000, 959
    Sleep, 500
    Click, 1366, 305
    Sleep, 1000
}

DrawSecondAndDeck()
{
    Sleep, 1000
    DrawSecond()
    DrawFromDeck()
}

PlayChicagoDuluth()
{
    Click, 1000, 959
    Sleep, 500
    Click, 1166, 365
    Sleep, 1000
}

PlayDuluthDenver()
{
    Click, 1000, 959
    Sleep, 500
    Click, 876, 445
    Sleep, 1000
}

Draw2Deck()
{
    Sleep, 1000
    DrawFromDeck()
    DrawFromDeck()
}

ConfirmLastTurn()
{
    Sleep, 2000
    ;Click Go
    Click, 1000, 839
    Sleep, 1000
    Send, {Enter 100}
}

DrawFirst()
{
    
}

DrawSecond()
{
    Click, 1846, 345
    Sleep, 1000
}

DrawThird()
{

}

DrawFourth()
{
    Click, 1846, 557
    Sleep, 1000
}

DrawFifth()
{
    Click, 1846, 757
    Sleep, 1000
}

DrawFromDeck()
{
    Click, 1846, 803
    Sleep, 1000
}

ClickForwardAndQuit()
{
    Sleep, 1000
    ; Forward
    Click, 1446, 957
    Sleep, 1000
    ; Quit
    Click, 877, 42
    Sleep, 1000
}

CheckIsStuck()
{
    PixelGetColor, color, 1000, 550, RGB
    if (color = 0xF4EFE1)
    {
        Sleep, 1000
        return true
    }
    else
    {
        return false
    }
}

Restart()
{
    Sleep, 1000
    Send, {Escape 100}
    Sleep, 1000
    Send, {Escape 100}
    Sleep, 1000
    Send, {Enter 100}
}

Feel free to experiment with DefaultMouseSpeed value and Sleep times, but I found above to be the most reliable. Tutorial sometimes get stuck during drawing the ticket, I’ve added some logic to restart it in case of that happening.

The Less Legit way

If 390 hours is still too much and you feel like a bit of cheating is ok, then you can get there much much faster. The progress for offline games is stored locally in UserDefault.xml file. You can find it in local app data:

%localappdata%\Days of Wonder\Ticket to Ride\UserDefault.xml

Just:

  1. Open the file in your favourite text editor (when the game is not running),
  2. Find <NbSoloGamesPlayed> element <NbSoloGamesPlayed>12345</NbSoloGamesPlayed>
  3. Update the value to 200000 (or whatever you want) and save the file.
  4. Run the game, done. (Actually you might need to play one more game, didn’t test that).
This guide about Ticket to Ride was written by PapaSmok. You can visit the original publication from this link. If you have any concerns about this guide, please don't hesitate to reach us here.

About the author