Случайный вопрос выбирается этой частью кода в процедуре 
::tpub::question:
                "get" {
                        # random question
                        if {![info exists qpos] || ![llength $qpos]} {
                                putlog "Out of questions, rehashing..."
                                if {![question rehash]} {
                                        putlog "No questions available, eek."
                                        return {}
                                }
                        }
                        set idx [expr int(rand() * [llength $qpos])]
                        set fpos [lindex $qpos $idx]
                        set qpos [lreplace $qpos $idx $idx]
                        if {[catch {open $conf(fnquestions) r} fileID]} { return {} }
                        seek $fileID $fpos start
                        set line [gets $fileID]
                        set line [split [string trim $line] |]
                        set line "[toupper [string range $line 0 0]][string range $line 1 end]"
                        close $fileID
                        lappend game(qid2qpos) "$game(qid) $fpos"
                        return [list [lindex $line 0] [split [lrange $line 1 end] ,]]
                }
  Код возвращает список из двух элементов, в первом сам вопрос, во втором ответ на него. Попробуй закомментировать строку 
                        set line "[toupper [string range $line 0 0]][string range $line 1 end]"
Что она делает и зачем я не совсем понимаю, переводит в верхний регистр вопрос и слепляет его с ответом, превращая в строку. После чего, в return берется первый элемент этой строки, который будет первым словом вопроса, а ответом становятся все остальные слова. В общем, она всю логику разрушает.