private static EngineType DetectEngineFromRules(MapFile mf,
IniFile rulesTS, IniFile rulesFS, IniFile rulesRA2, IniFile rulesYR,
TheaterSettings theaterTS, TheaterSettings theaterFS, TheaterSettings theaterRA2, TheaterSettings theaterYR,
VFS vfsTS, VFS vfsFS, VFS vfsRA2, VFS vfsYR)
{
double tsScore = PercentageObjectsKnown(mf, vfsTS, rulesTS, theaterTS);
double fsScore = PercentageObjectsKnown(mf, vfsFS, rulesFS, theaterFS);
double ra2Score = PercentageObjectsKnown(mf, vfsRA2, rulesRA2, theaterRA2);
double yrScore = PercentageObjectsKnown(mf, vfsYR, rulesYR, theaterYR);
double maxScore = Math.Max(Math.Max(Math.Max(tsScore, fsScore), ra2Score), yrScore);
if (maxScore == ra2Score) return EngineType.RedAlert2;
else if (maxScore == yrScore) return EngineType.YurisRevenge;
else if (maxScore == tsScore) return EngineType.TiberianSun;
else if (maxScore == fsScore) return EngineType.Firestorm;
return EngineType.YurisRevenge; // default
}