summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbelugas <belugas@openttd.org>2006-09-20 00:34:06 +0000
committerbelugas <belugas@openttd.org>2006-09-20 00:34:06 +0000
commitaeb7c0916c442cdb493bd905abf098956c936885 (patch)
tree1e18ce466f13c77758a0b7649707f86edc02fb32
parentb24857baba390252a765f3614dc2e8e566515d7f (diff)
downloadopenttd-aeb7c0916c442cdb493bd905abf098956c936885.tar.xz
(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.
-rw-r--r--currency.c76
-rw-r--r--currency.h1
-rw-r--r--newgrf.c14
3 files changed, 84 insertions, 7 deletions
diff --git a/currency.c b/currency.c
index 7d2594647..3347d6eb4 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 9a76b1495..46445590f 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 7fe829194..6a552066d 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) {