Looking great. Just one question: in the MRU game list, is it possible to display both the path and the game type? It can't also detect tutu, while the latest JOH beta did. Here is the WeiDU detection code from tp.ml:
| PE_GameIs(game_list) -> begin
let game_list = Str.split many_whitespace_regexp game_list in
eval_pe game (List.fold_left (fun acc this -> if acc = (get_pe_int "1") then (get_pe_int "1") else begin
match String.uppercase this with
| "BG2"
| "SOA" -> PE_And(PE_And(Pred_File_Exists_In_Game(get_pe_string "flythr01.mve"),
PE_Not(Pred_File_Exists_In_Game(get_pe_string "saradush.mve"))),
PE_Not(Pred_File_Exists_In_Game(get_pe_string "_eregost.mve")))
| "TOB" -> PE_And(Pred_File_Exists_In_Game(get_pe_string "saradush.mve"),
PE_Not(Pred_File_Exists_In_Game(get_pe_string "_eregost.mve")))
| "IWD2" -> Pred_File_Exists_In_Game(get_pe_string "subrace.ids")
| "PST" -> Pred_File_Exists_In_Game(get_pe_string "faction.ids")
| "BG1" -> PE_And(Pred_File_Exists_In_Game(get_pe_string "beregost.mve"),
PE_Not(Pred_File_Exists_In_Game(get_pe_string "durlag.mve")))
| "TOTSC" -> Pred_File_Exists_In_Game(get_pe_string "durlag.mve")
| "IWD"
| "IWD1" -> PE_And(Pred_File_Exists_In_Game(get_pe_string "avalanch.mve"),
PE_Not(Pred_File_Exists_In_Game(get_pe_string "howdrag.mve")))
| "HOW" -> Pred_File_Exists_In_Game(get_pe_string "howdrag.mve")
| "TUTU" -> PE_And(Pred_File_Exists_In_Game(get_pe_string "_eregost.mve"),
PE_Not(Pred_File_Exists_In_Game(get_pe_string "_durlag.mve")))
| "TUTU_TOTSC"
| "TUTU+TOTSC" -> Pred_File_Exists_In_Game(get_pe_string "_durlag.mve")
| _ -> failwith (Printf.sprintf "No rule to identify %s" (String.uppercase this))
end
) (get_pe_int "0") game_list )
end