changeset 4625:60dc10fc014e draft

(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.
author belugas <belugas@openttd.org>
date Wed, 20 Sep 2006 00:34:06 +0000
parents d744ea304ad8
children 9e744bae5e4e
files currency.c currency.h newgrf.c
diffstat 3 files changed, 84 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/currency.c
+++ b/currency.c
@@ -44,6 +44,82 @@
 /* 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)
 {
--- a/currency.h
+++ b/currency.h
@@ -40,5 +40,6 @@
 void CheckSwitchToEuro(void);
 void ResetCurrencies(void);
 StringID* BuildCurrencyDropdown(void);
+byte GetNewgrfCurrencyIdConverted(byte grfcurr_id);
 
 #endif /* CURRENCY_H */
--- a/newgrf.c
+++ b/newgrf.c
@@ -1090,8 +1090,8 @@
 
 		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 @@
 
 		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 @@
 
 		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 @@
 
 		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 @@
 
 		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 @@
 
 		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) {