| 244 | inline int seconds(int v) { return (v % (60)); } |
| 245 | |
| 246 | static void SaveStatistics(const char *fn, TArray<FStatistics> &statlist) |
| 247 | { |
| 248 | unsigned int j; |
| 249 | |
| 250 | FileWriter *fw = FileWriter::Open(fn); |
| 251 | if (fw == nullptr) return; |
| 252 | |
| 253 | qsort(&statlist[0], statlist.Size(), sizeof(statlist[0]), compare_episode_names); |
| 254 | for(unsigned i=0;i<statlist.Size ();i++) |
| 255 | { |
| 256 | FStatistics &ep_stats = statlist[i]; |
| 257 | |
| 258 | qsort(&ep_stats.stats[0], ep_stats.stats.Size(), sizeof(ep_stats.stats[0]), compare_dates); |
| 259 | |
| 260 | fw->Printf("%s \"%s\"\n{\n", ep_stats.epi_header.GetChars(), ep_stats.epi_name.GetChars()); |
| 261 | for(j=0;j<ep_stats.stats.Size();j++) |
| 262 | { |
| 263 | FSessionStatistics *sst = &ep_stats.stats[j]; |
| 264 | if (sst->info[0]>0) |
| 265 | { |
| 266 | fw->Printf("\t%2i. %10s \"%-33s\" %02d:%02d:%02d %i\n", j+1, sst->name, sst->info, |
| 267 | hours(sst->timeneeded), minutes(sst->timeneeded), seconds(sst->timeneeded), sst->skill); |
| 268 | |
| 269 | TArray<FLevelStatistics> &ls = sst->levelstats; |
| 270 | if (ls.Size() > 0) |
| 271 | { |
| 272 | fw->Printf("\t{\n"); |
| 273 | |
| 274 | // Only makes sense if level names follow a strict format. This is noz the case here. |
| 275 | //qsort(&ls[0], ls.Size(), sizeof(ls[0]), compare_level_names); |
| 276 | |
| 277 | for(unsigned k=0;k<ls.Size ();k++) |
| 278 | { |
| 279 | fw->Printf("\t\t%-8s \"%-33s\" %02d:%02d:%02d\n", ls[k].name, ls[k].info, |
| 280 | hours(ls[k].timeneeded), minutes(ls[k].timeneeded), seconds(ls[k].timeneeded)); |
| 281 | } |
| 282 | fw->Printf("\t}\n"); |
| 283 | } |
| 284 | } |
| 285 | } |
| 286 | fw->Printf("}\n\n"); |
| 287 | } |
| 288 | delete fw; |
| 289 | } |
| 290 | |
| 291 | |
| 292 | // ==================================================================== |