From f9ea48bf3d0fe0c4a00313c45c31c73be614e210 Mon Sep 17 00:00:00 2001 From: belugas Date: Fri, 15 Sep 2006 02:52:17 +0000 Subject: (svn r6454) -Fix(r6108) : Allow custom currency to display both prefix and suffix -Codechange : Divide rate of conversion from grf by 1000, to match OTTD internal system --- currency.c | 2 +- currency.h | 9 +++++++-- newgrf.c | 13 +++++++++---- strings.c | 10 +++++++--- 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/currency.c b/currency.c index e31972d81..7d2594647 100644 --- a/currency.c +++ b/currency.c @@ -38,7 +38,7 @@ const CurrencySpec origin_currency_specs[NUM_CURRENCY] = { { 350, '.', CF_NOEURO, "", " SIT", 1, STR_CURR_SIT }, // slovenian tolar { 13, '.', CF_NOEURO, "", " Kr", 1, STR_CURR_SEK }, // swedish krona { 2, '.', CF_NOEURO, "", " YTL", 1, STR_CURR_YTL }, // turkish lira - { 1, ' ', CF_NOEURO, "", "", 0, STR_CURR_CUSTOM }, // custom currency + { 1, ' ', CF_NOEURO, "", "", 2, STR_CURR_CUSTOM }, // custom currency }; /* Array of currencies used by the system */ diff --git a/currency.h b/currency.h index c097c4b81..9a76b1495 100644 --- a/currency.h +++ b/currency.h @@ -17,8 +17,13 @@ typedef struct { char prefix[16]; char suffix[16]; /** - * Position of the currency symbol on the amount string. - * 0 = placed before, 1 = placed after + * The currency symbol is represented by two possible values, prefix and suffix + * Usage of one or the other is determined by symbol_pos. + * 0 = prefix + * 1 = suffix + * 2 = both : Special case only for custom currency. + * It is not a spec from Newgrf, + * rather a way to let users do what they want with custom curency */ byte symbol_pos; StringID name; diff --git a/newgrf.c b/newgrf.c index be151521b..7fe829194 100644 --- a/newgrf.c +++ b/newgrf.c @@ -1105,7 +1105,10 @@ static bool GlobalVarChangeInfo(uint gvid, int numinfo, int prop, byte **bufp, i uint32 rate = grf_load_dword(&buf); if (curidx < NUM_CURRENCY) { - _currency_specs[curidx].rate = rate; + /* TTDPatch uses a multiple of 1000 for its conversion calculations, + * which OTTD does not. For this reason, divide grf value by 1000, + * to be compatible */ + _currency_specs[curidx].rate = rate / 1000; } else { grfmsg(GMS_WARN, "GlobalVarChangeInfo: Currency multipliers %d out of range, ignoring.", curidx); } @@ -1119,14 +1122,16 @@ static bool GlobalVarChangeInfo(uint gvid, int numinfo, int prop, byte **bufp, i if (curidx < NUM_CURRENCY) { _currency_specs[curidx].separator = GB(options, 0, 8); - _currency_specs[curidx].symbol_pos = GB(options, 8, 8); + /* By specifying only one bit, we prevent errors, + * since newgrf specs said that only 0 and 1 can be set for symbol_pos */ + _currency_specs[curidx].symbol_pos = GB(options, 8, 1); } else { grfmsg(GMS_WARN, "GlobalVarChangeInfo: Currency option %d out of range, ignoring.", curidx); } } break; - case 0x0D: // Currency symbols + case 0x0D: // Currency prefix symbol FOR_EACH_OBJECT { uint curidx = gvid +i; uint32 tempfix = grf_load_dword(&buf); @@ -1140,7 +1145,7 @@ static bool GlobalVarChangeInfo(uint gvid, int numinfo, int prop, byte **bufp, i } break; - case 0x0E: // Currency symbols + case 0x0E: // Currency suffix symbol FOR_EACH_OBJECT { uint curidx = gvid +i; uint32 tempfix = grf_load_dword(&buf); diff --git a/strings.c b/strings.c index 8436dfcd4..67669a5e4 100644 --- a/strings.c +++ b/strings.c @@ -381,8 +381,10 @@ static char *FormatGenericCurrency(char *buff, const CurrencySpec *spec, int64 n number = -number; } - /* add prefix part, only if it is specified by symbol_pos */ - if (spec->symbol_pos == 0) { + /* Add prefix part, folowing symbol_pos specification. + * Here, it can can be either 0 (prefix) or 2 (both prefix anf suffix). + * The only remaining value is 1 (suffix), so everything that is not 1 */ + if (spec->symbol_pos != 1){ s = spec->prefix; while (s != spec->prefix + lengthof(spec->prefix) && (c = *(s++)) != '\0') *(buff)++ = c; } @@ -413,7 +415,9 @@ static char *FormatGenericCurrency(char *buff, const CurrencySpec *spec, int64 n if (compact) *buff++ = compact; - /* add suffix part, only if it is specified by symbol_pos */ + /* Add suffix part, folowing symbol_pos specification. + * Here, it can can be either 1 (suffix) or 2 (both prefix anf suffix). + * The only remaining value is 1 (prefix), so everything that is not 0 */ if (spec->symbol_pos != 0) { s = spec->suffix; while (s != spec->suffix + lengthof(spec->suffix) && (c = *(s++)) != '\0') *(buff++) = c; -- cgit v1.2.3-70-g09d2