It's mostly this line I don't get:
imageFont: Set 'index' to HashTable(Uppercase(mid(Function.Param(1), LoopIndex, 1)))-1
The hash table is an array where you access its content by keys instead of an index. So instead of index-value-pairs you have key-value-pairs. ROJOhound cleverly used the characters as keys and made the values being the index ('A' = 1, 'B' = 2, etc.)
Every 200ms the text box changes its content, like so:
0ms -> "T"
200ms -> "Th"
400ms -> "Thi"
600ms -> "This"
Now he destroys every instance of 'imageFont' and calls the function. The function determines the current length of the text in the text box and in a loop creates one 'imageFont'-object per character.
He now needs to get the value of a key that corresponds to the actual character in the loop. These characters can be lowercase (e.g. 'h'), but the keys he generated are all uppercase (see event 2). Whatever character he gets, he needs to make sure it is uppercase. The expression 'convert to uppercase', => uppercase(string), does exactly that.
mid returns a substring of a string at position p and with the length l: mid(text, p, l). this is 1-based. Something like mid("Four", 4, 1) returns 1 character starting at position 4, which is "r".
For example, at 600ms, the text of the text box is "This". The loop starts at 1 and ends at len(text), which is 4 in this case. In the first iteration of the loop, mid(Function.Param(1), LoopIndex, 1) equals mid("This", 1, 1) and therefore returns "T". The second iteration equals mid("This", 2, 1) which returns "h", etc. As mentioned earlier, that string is converted to uppercase, which returns "T", "H", etc.
He now has exactly one character of the text, and that character is uppercase. He can now use this character as a key of the hash table to get its value (which is the index of that char). For example, HashTable("T") was set to the value 20 in event 2.
mid (which he used to create the key-value-pairs in event 2) is 1-based, while image offset is 0-based. That's why 1 is substracted from the value of the key.
And the parts where you "destroy" imageFont, yet it's still there...
The whole concept of this is to not have one imageFont, but one instance of imageFont per character. These are rebuilt every 200ms, that's why all of them need to be destroyed before creating them again.