diff options
Diffstat (limited to 'src/currency.cpp')
-rw-r--r-- | src/currency.cpp | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/src/currency.cpp b/src/currency.cpp new file mode 100644 index 000000000..7bc81139a --- /dev/null +++ b/src/currency.cpp @@ -0,0 +1,182 @@ +/* $Id$ */ + +#include "stdafx.h" +#include "openttd.h" +#include "currency.h" +#include "news.h" +#include "variables.h" +#include "table/strings.h" +#include "date.h" + + // exchange rate prefix symbol_pos + // | separator | postfix | + // | | Euro year | | | name + // | | | | | | | +static const CurrencySpec origin_currency_specs[NUM_CURRENCY] = { + { 1, ',', CF_NOEURO, "£", "", 0, STR_CURR_GBP }, // british pounds + { 2, ',', CF_NOEURO, "$", "", 0, STR_CURR_USD }, // us dollars + { 2, ',', CF_ISEURO, "€", "", 0, STR_CURR_EUR }, // Euro + { 220, ',', CF_NOEURO, "¥", "", 0, STR_CURR_YEN }, // yen + { 20, ',', 2002, "", " S.", 1, STR_CURR_ATS }, // austrian schilling + { 59, ',', 2002, "BEF ", "", 0, STR_CURR_BEF }, // belgian franc + { 2, ',', CF_NOEURO, "CHF ", "", 0, STR_CURR_CHF }, // swiss franc + { 41, ',', CF_NOEURO, "", " Kč", 1, STR_CURR_CZK }, // czech koruna + { 3, '.', 2002, "DM ", "", 0, STR_CURR_DEM }, // deutsche mark + { 11, '.', CF_NOEURO, "", " kr", 1, STR_CURR_DKK }, // danish krone + { 245, '.', 2002, "Pts ", "", 0, STR_CURR_ESP }, // spanish pesetas + { 9, ',', 2002, "", " mk", 1, STR_CURR_FIM }, // finnish markka + { 10, '.', 2002, "FF ", "", 0, STR_CURR_FRF }, // french francs + { 500, ',', 2002, "", "Dr.", 1, STR_CURR_GRD }, // greek drachma + { 378, ',', 2010, "", " Ft", 1, STR_CURR_HUF }, // hungarian forint + { 130, '.', CF_NOEURO, "", " Kr", 1, STR_CURR_ISK }, // icelandic krona + { 2850, ',', 2002, "", " L.", 1, STR_CURR_ITL }, // italian lira + { 3, ',', 2002, "NLG ", "", 0, STR_CURR_NLG }, // dutch gulden + { 12, '.', CF_NOEURO, "", " Kr", 1, STR_CURR_NOK }, // norwegian krone + { 6, ' ', CF_NOEURO, "", " zl", 1, STR_CURR_PLN }, // polish zloty + { 5, '.', CF_NOEURO, "", " Lei", 1, STR_CURR_ROL }, // romanian Lei + { 50, ' ', CF_NOEURO, "", " p", 1, STR_CURR_RUR }, // russian rouble + { 352, '.', CF_NOEURO, "", " SIT", 1, STR_CURR_SIT }, // slovenian tolar + { 13, '.', CF_NOEURO, "", " Kr", 1, STR_CURR_SEK }, // swedish krona + { 3, '.', CF_NOEURO, "", " YTL", 1, STR_CURR_YTL }, // turkish lira + { 52, ',', CF_NOEURO, "", " Sk", 1, STR_CURR_SKK }, // slovak koruna + { 4, ',', CF_NOEURO, "R$ ", "", 0, STR_CURR_BRR }, // brazil real + { 1, ' ', CF_NOEURO, "", "", 2, STR_CURR_CUSTOM }, // custom 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 (grfcurr_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) +{ + uint mask = 0; + uint i; + + for (i = 0; i < NUM_CURRENCY; i++) { + Year to_euro = _currency_specs[i].to_euro; + + if (to_euro != CF_NOEURO && to_euro != CF_ISEURO && _cur_year >= to_euro) continue; + if (to_euro == CF_ISEURO && _cur_year < 2000) continue; + mask |= (1 << i); + } + mask |= (1 << CUSTOM_CURRENCY_ID); // always allow custom currency + return mask; +} + +/** + * Verify if the currency chosen by the user is about to be converted to Euro + **/ +void CheckSwitchToEuro(void) +{ + if (_currency_specs[_opt.currency].to_euro != CF_NOEURO && + _currency_specs[_opt.currency].to_euro != CF_ISEURO && + _cur_year >= _currency_specs[_opt.currency].to_euro) { + _opt.currency = 2; // this is the index of euro above. + AddNewsItem(STR_EURO_INTRODUCE, NEWS_FLAGS(NM_NORMAL, 0, NT_ECONOMY, 0), 0, 0); + } +} + +/** + * Called only from newgrf.c. Will fill _currency_specs array with + * default values from origin_currency_specs + **/ +void ResetCurrencies(void) +{ + memcpy(&_currency_specs, &origin_currency_specs, sizeof(origin_currency_specs)); +} + +/** + * Build a list of currency names StringIDs to use in a dropdown list + * @return Pointer to a (static) array of StringIDs + */ +StringID* BuildCurrencyDropdown(void) +{ + /* Allow room for all currencies, plus a terminator entry */ + static StringID names[CUSTOM_CURRENCY_ID]; + uint i; + + /* Add each name */ + for (i = 0; i < NUM_CURRENCY; i++) { + names[i] = _currency_specs[i].name; + } + /* Terminate the list */ + names[i] = INVALID_STRING_ID; + + return names; +} |