/** * Save the highscores in a network game when it has ended * @return Position of the local company in the highscore list. */ int8 SaveHighScoreValueNetwork() { const Company *c; const Company *cl[MAX_COMPANIES]; uint count = 0; int8 company = -1; /* Sort all active companies with the highest score first */ FOR_ALL_COMPANIES(c) cl[count++] = c; QSortT(cl, count, &HighScoreSorter); { uint i; memset(_highscore_table[SP_MULTIPLAYER], 0, sizeof(_highscore_table[SP_MULTIPLAYER])); /* Copy over Top5 companies */ for (i = 0; i < lengthof(_highscore_table[SP_MULTIPLAYER]) && i < count; i++) { HighScore *hs = &_highscore_table[SP_MULTIPLAYER][i]; SetDParam(0, cl[i]->index); SetDParam(1, cl[i]->index); GetString(hs->company, STR_HIGHSCORE_NAME, lastof(hs->company)); // get manager/company name string hs->score = cl[i]->old_economy[0].performance_history; hs->title = EndGameGetPerformanceTitleFromValue(hs->score); /* get the ranking of the local company */ if (cl[i]->index == _local_company) company = i; } } /* Add top5 companies to highscore table */ return company; }
/** Initialize the highscore table to 0 and if any file exists, load in values */ void LoadFromHighScore() { FILE *fp = fopen(_highscore_file, "rb"); memset(_highscore_table, 0, sizeof(_highscore_table)); if (fp != NULL) { uint i; HighScore *hs; for (i = 0; i < SP_SAVED_HIGHSCORE_END; i++) { for (hs = _highscore_table[i]; hs != endof(_highscore_table[i]); hs++) { byte length; if (fread(&length, sizeof(length), 1, fp) != 1 || fread(hs->company, min<int>(lengthof(hs->company), length), 1, fp) > 1 || // Yes... could be 0 bytes too fread(&hs->score, sizeof(hs->score), 1, fp) != 1 || fseek(fp, 2, SEEK_CUR) == -1) { // XXX - placeholder for hs->title, not saved anymore; compatibility DEBUG(misc, 1, "Highscore corrupted"); i = SP_SAVED_HIGHSCORE_END; break; } str_validate(hs->company, lastof(hs->company), SVS_NONE); hs->title = EndGameGetPerformanceTitleFromValue(hs->score); } } fclose(fp); } }
/** Save the highscore for the company */ int8 SaveHighScoreValue(const Company *c) { HighScore *hs = _highscore_table[SP_CUSTOM]; uint i; uint16 score = c->old_economy[0].performance_history; /* Exclude cheaters from the honour of being in the highscore table */ if (CheatHasBeenUsed()) return -1; for (i = 0; i < lengthof(_highscore_table[0]); i++) { /* You are in the TOP5. Move all values one down and save us there */ if (hs[i].score <= score) { /* move all elements one down starting from the replaced one */ memmove(&hs[i + 1], &hs[i], sizeof(HighScore) * (lengthof(_highscore_table[0]) - i - 1)); SetDParam(0, c->index); SetDParam(1, c->index); GetString(hs[i].company, STR_HIGHSCORE_NAME, lastof(hs[i].company)); // get manager/company name string hs[i].score = score; hs[i].title = EndGameGetPerformanceTitleFromValue(score); return i; } } return -1; // too bad; we did not make it into the top5 }
/** Initialize the highscore table to 0 and if any file exists, load in values */ void LoadFromHighScore() { FILE *fp = fopen(_highscore_file, "rb"); memset(_highscore_table, 0, sizeof(_highscore_table)); if (fp != NULL) { uint i; HighScore *hs; for (i = 0; i < LAST_HS_ITEM; i++) { // don't load network highscores for (hs = _highscore_table[i]; hs != endof(_highscore_table[i]); hs++) { byte length; if (fread(&length, sizeof(length), 1, fp) != 1 || fread(hs->company, length, 1, fp) > 1 || // Yes... could be 0 bytes too fread(&hs->score, sizeof(hs->score), 1, fp) != 1 || fseek(fp, 2, SEEK_CUR) == -1) { // XXX - placeholder for hs->title, not saved anymore; compatibility DEBUG(misc, 1, "Highscore corrupted"); i = LAST_HS_ITEM; break; } *lastof(hs->company) = '\0'; hs->title = EndGameGetPerformanceTitleFromValue(hs->score); } } fclose(fp); } }
virtual void OnPaint() { this->SetupHighScoreEndWindow(); Point pt = this->GetTopLeft640x480(); const Company *c = Company::GetIfValid(_local_company); if (c == NULL) return; /* We need to get performance from last year because the image is shown * at the start of the new year when these things have already been copied */ if (this->background_img == SPR_TYCOON_IMG2_BEGIN) { // Tycoon of the century \o/ SetDParam(0, c->index); SetDParam(1, c->index); SetDParam(2, EndGameGetPerformanceTitleFromValue(c->old_economy[0].performance_history)); DrawStringMultiLine(pt.x + 15, pt.x + 640 - 25, pt.y + 90, pt.y + 160, STR_HIGHSCORE_PRESIDENT_OF_COMPANY_ACHIEVES_STATUS, TC_FROMSTRING, SA_CENTER); } else { SetDParam(0, c->index); SetDParam(1, EndGameGetPerformanceTitleFromValue(c->old_economy[0].performance_history)); DrawStringMultiLine(pt.x + 36, pt.x + 640, pt.y + 140, pt.y + 206, STR_HIGHSCORE_COMPANY_ACHIEVES_STATUS, TC_FROMSTRING, SA_CENTER); } }