private double ComputeTicketRatio(double a, double b, double goal, bool countDown, out String msg)
{
if (IsRush() && fMaxTickets != -1) {
// normalize Rush ticket ratio
b = fMaxTickets - (fRushMaxTickets - b);
b = Math.Max(b, 1);
}
double ratio = 0;
if (countDown) {
// ratio of difference from max
if (a < b) {
ratio = (goal - a) / Math.Max(1, (goal - b));
msg = "Ratio T1/T2: " + a + " vs " + b + " <- [" + goal + "]: " + (goal-a) + "/" + Math.Max(1, (goal-b)) + " = " + ratio.ToString("F2");
} else {
ratio = (goal - b) / Math.Max(1, (goal - a));
msg = "Ratio T2/T1: " + a + " vs " + b + " <- [" + goal + "]: " + (goal-b) + "/" + Math.Max(1, (goal-a)) + " = " + ratio.ToString("F2");
}
} else {
// direct ratio
if (a > b) {
ratio = a / Math.Max(1, b);
msg = "Ratio T1/T2: " + a + " vs " + b + " -> [" + goal + "]: " + a + "/" + Math.Max(1, b) + " = " + ratio.ToString("F2");
} else {
ratio = b / Math.Max(1, a);
msg = "Ratio T2/T2: " + a + " vs " + b + " -> [" + goal + "]: " + b + "/" + Math.Max(1, a) + " = " + ratio.ToString("F2");
}
}
return ratio;
}