This is very accurate, nicely done 

May I host it on my website? You will be credited for that awesome work.
Another thing I would like to point out is that I made an OD table some time ago. It would be useful as they all contain the "300" values and follow a formula for EZ and HR, and values are multiplied by their factor with DT and HT. It will be much easier to use for this aspect. Instead of constantly looking for what 7+DT+HR is, or 3+EZ+DT, or 5.5 being inaccurate, the program will get the values on their own.
https://www.dropbox.com/s/kaqumg6u91yt6hh/ULTIMATE%20OD%20TABLE%20FIXED.pdf?dl=0
There are different formulas but yeah I'll probably try to figure them out again
NM OD: Initial ODHope it helps
EZ OD: OD/2
HR OD: OD*1.4
DT OD: ROUND(OD/1.5+5.5) TO 2 DECIMALS
HT OD: ROUND(OD/0.75-5.5) TO 2 DECIMALS
EZ+DT OD: ROUND(EZ OD/1.5+5.5) TO 2 DECIMALS
HR+DT OD: ROUND(HR OD/1.5+5.5) TO 2 DECIMALS
EZ+HT OD: ROUND(EZ OD/0.75-5.5) TO 2 DECIMALS
HR+HT OD: ROUND(HR OD/0.75-5.5) TO 2 DECIMALS
300 Hit window: ROUND(49.5-(OD/0.5)*1.5) TO 1 DECIMAL
I've finally figured out the formulas in a clean way (these are on the spreadsheet as well):NM OD: Initial ODHope it helps
EZ OD: OD/2
HR OD: OD*1.4
DT OD: ROUND(OD/1.5+5.5) TO 2 DECIMALS
HT OD: ROUND(OD/0.75-5.5) TO 2 DECIMALS
EZ+DT OD: ROUND(EZ OD/1.5+5.5) TO 2 DECIMALS
HR+DT OD: ROUND(HR OD/1.5+5.5) TO 2 DECIMALS
EZ+HT OD: ROUND(EZ OD/0.75-5.5) TO 2 DECIMALS
HR+HT OD: ROUND(HR OD/0.75-5.5) TO 2 DECIMALS
300 Hit window: ROUND(49.5-(OD/0.5)*1.5) TO 1 DECIMAL
EDIT: Here's the new and better (???) taiko pp calculator (automated 300 hit window calculation based off _Gezo_'s od table): https://www.dropbox.com/s/52mikcnntehqn ... .html?dl=0
private double GetHitWindow300()If anyone needs an explanation I can explain it, but yea, OD is weird when it comes to decimals...
{
string ODstr = map.GetTag("Difficulty", "OverallDifficulty");
if(ODstr.Length > 3)
throw new Exception("Error, OD has more than one decimal place");
double OD = Convert.ToDouble(ODstr);
if(((int)mods & (int)Modifiers.HardRock) > 0)
OD *= 1.4;
else if(((int)mods & (int)Modifiers.Easy) > 0)
OD *= 0.5;
OD = Dewlib.Clamp(OD, 0, 10);
//Calculate the integer part of OD first, then modify later based on the decimal
double window = 49.5 - 3 * Math.Floor(OD);
//If OD has a decimal place
if(OD % 1 != 0)
{
//Avoid precision bugs - round to one decimal place
double ODdecimal = Math.Round(OD - Math.Floor(OD), 1);
if(0.1 <= ODdecimal && ODdecimal <= 0.3)
window -= 1;
else if(0.4 <= ODdecimal && ODdecimal <= 0.6)
window -= 2;
else if(0.7 <= ODdecimal && ODdecimal <= 0.9)
window -= 3;
}
if(((int)mods & (int)Modifiers.DoubleTime) > 0 || ((int)mods & (int)Modifiers.Nightcore) > 0)
window /= 1.5;
else if(((int)mods & (int)Modifiers.HalfTime) > 0)
window /= 0.75;
return window;
}
Fixed the broken OD calculations by everyone, made some checkboxes pretty, made the calculation realtime, added a nice hosted domain.
I might add input validation and more CSS later.
http://pp.mon.im/