From aeb7c0916c442cdb493bd905abf098956c936885 Mon Sep 17 00:00:00 2001 From: belugas Date: Wed, 20 Sep 2006 00:34:06 +0000 Subject: [PATCH] (svn r6485) -NewGRF Feature: Match the order of TTDPatch's currencies with those used in OTTD. This will not reorder OTTD's currencies, but will make it so that currencies affected by a grf will be those aimed by the writer. --- currency.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ currency.h | 1 + newgrf.c | 14 +++++----- 3 files changed, 84 insertions(+), 7 deletions(-) diff --git a/currency.c b/currency.c index 7d2594647c..3347d6eb4d 100644 --- a/currency.c +++ b/currency.c @@ -44,6 +44,82 @@ const CurrencySpec origin_currency_specs[NUM_CURRENCY] = { /* Array of currencies used by the system */ CurrencySpec _currency_specs[NUM_CURRENCY]; +/** + * These enums are only declared in order to make sens + * out of the TTDPatch_To_OTTDIndex array that will follow + * Every currency used by Ottd is there, just in case TTDPatch will + * add those missing in its code + **/ +enum { + CURR_GBP, + CURR_USD, + CURR_EUR, + CURR_YEN, + CURR_ATS, + CURR_BEF, + CURR_CHF, + CURR_CZK, + CURR_DEM, + CURR_DKK, + CURR_ESP, + CURR_FIM, + CURR_FRF, + CURR_GRD, + CURR_HUF, + CURR_ISK, + CURR_ITL, + CURR_NLG, + CURR_NOK, + CURR_PLN, + CURR_ROL, + CURR_RUR, + CURR_SIT, + CURR_SEK, + CURR_YTL, +}; + +/** + * This array represent the position of OpenTTD's currencies, + * compared to TTDPatch's ones. + * When a grf sends currencies, they are based on the order defined by TTDPatch. + * So, we must reindex them to our own order. + **/ +const byte TTDPatch_To_OTTDIndex[] = +{ + CURR_GBP, + CURR_USD, + CURR_FRF, + CURR_DEM, + CURR_YEN, + CURR_ESP, + CURR_HUF, + CURR_PLN, + CURR_ATS, + CURR_BEF, + CURR_DKK, + CURR_FIM, + CURR_GRD, + CURR_CHF, + CURR_NLG, + CURR_ITL, + CURR_SEK, + CURR_RUR, + CURR_EUR, +}; + +/** + * Will return the ottd's index correspondance to + * the ttdpatch's id. If the id is bigger then the array, + * it is a grf written for ottd, thus returning the same id. + * Only called from newgrf.c + * @param grfcurr_id currency id coming from newgrf + * @return the corrected index + **/ +byte GetNewgrfCurrencyIdConverted(byte grfcurr_id) +{ + return (grf_id >= lengthof(TTDPatch_To_OTTDIndex)) ? grfcurr_id : TTDPatch_To_OTTDIndex[grfcurr_id]; +} + /* get a mask of the allowed currencies depending on the year */ uint GetMaskOfAllowedCurrencies(void) { diff --git a/currency.h b/currency.h index 9a76b14959..46445590fc 100644 --- a/currency.h +++ b/currency.h @@ -40,5 +40,6 @@ uint GetMaskOfAllowedCurrencies(void); void CheckSwitchToEuro(void); void ResetCurrencies(void); StringID* BuildCurrencyDropdown(void); +byte GetNewgrfCurrencyIdConverted(byte grfcurr_id); #endif /* CURRENCY_H */ diff --git a/newgrf.c b/newgrf.c index 7fe8291944..6a552066d2 100644 --- a/newgrf.c +++ b/newgrf.c @@ -1090,8 +1090,8 @@ static bool GlobalVarChangeInfo(uint gvid, int numinfo, int prop, byte **bufp, i case 0x0A: // Currency display names FOR_EACH_OBJECT { - uint curidx = gvid + i; - StringID newone = GetGRFStringID(_cur_grffile->grfid,grf_load_word(&buf)); + uint curidx = GetNewgrfCurrencyIdConverted(gvid + i); + StringID newone = GetGRFStringID(_cur_grffile->grfid, grf_load_word(&buf)); if ((newone != STR_UNDEFINED) && (curidx < NUM_CURRENCY)) { _currency_specs[curidx].name = newone; @@ -1101,7 +1101,7 @@ static bool GlobalVarChangeInfo(uint gvid, int numinfo, int prop, byte **bufp, i case 0x0B: // Currency multipliers FOR_EACH_OBJECT { - uint curidx = gvid + i; + uint curidx = GetNewgrfCurrencyIdConverted(gvid + i); uint32 rate = grf_load_dword(&buf); if (curidx < NUM_CURRENCY) { @@ -1117,7 +1117,7 @@ static bool GlobalVarChangeInfo(uint gvid, int numinfo, int prop, byte **bufp, i case 0x0C: // Currency options FOR_EACH_OBJECT { - uint curidx = gvid +i; + uint curidx = GetNewgrfCurrencyIdConverted(gvid + i); uint16 options = grf_load_word(&buf); if (curidx < NUM_CURRENCY) { @@ -1133,7 +1133,7 @@ static bool GlobalVarChangeInfo(uint gvid, int numinfo, int prop, byte **bufp, i case 0x0D: // Currency prefix symbol FOR_EACH_OBJECT { - uint curidx = gvid +i; + uint curidx = GetNewgrfCurrencyIdConverted(gvid + i); uint32 tempfix = grf_load_dword(&buf); if (curidx < NUM_CURRENCY) { @@ -1147,7 +1147,7 @@ static bool GlobalVarChangeInfo(uint gvid, int numinfo, int prop, byte **bufp, i case 0x0E: // Currency suffix symbol FOR_EACH_OBJECT { - uint curidx = gvid +i; + uint curidx = GetNewgrfCurrencyIdConverted(gvid + i); uint32 tempfix = grf_load_dword(&buf); if (curidx < NUM_CURRENCY) { @@ -1161,7 +1161,7 @@ static bool GlobalVarChangeInfo(uint gvid, int numinfo, int prop, byte **bufp, i case 0x0F: // Euro introduction dates FOR_EACH_OBJECT { - uint curidx = gvid +i; + uint curidx = GetNewgrfCurrencyIdConverted(gvid + i); Year year_euro = grf_load_word(&buf); if (curidx < NUM_CURRENCY) {