summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/newgrf.cpp118
1 files changed, 52 insertions, 66 deletions
diff --git a/src/newgrf.cpp b/src/newgrf.cpp
index f67c6b81e..d27faf57d 100644
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -2417,6 +2417,32 @@ static ChangeInfoResult TownHouseChangeInfo(uint hid, int numinfo, int prop, Byt
}
/**
+ * Load a cargo- or railtype-translation table.
+ * @param gvid ID of the global variable. This is basically only checked for zerones.
+ * @param numinfo Number of subsequent IDs to change the property for.
+ * @param buf The property value.
+ * @param [in,out] translation_table Storage location for the translation table.
+ * @param name Name of the table for debug output.
+ * @return ChangeInfoResult.
+ */
+template <typename T>
+static ChangeInfoResult LoadTranslationTable(uint gvid, int numinfo, ByteReader *buf, T &translation_table, const char *name)
+{
+ if (gvid != 0) {
+ grfmsg(1, "LoadTranslationTable: %s translation table must start at zero", name);
+ return CIR_INVALID_ID;
+ }
+
+ translation_table.Clear();
+ for (int i = 0; i < numinfo; i++) {
+ uint32 item = buf->ReadDWord();
+ *translation_table.Append() = BSWAP32(item);
+ }
+
+ return CIR_SUCCESS;
+}
+
+/**
* Define properties for global variables
* @param gvid ID of the global variable.
* @param numinfo Number of subsequent IDs to change the property for.
@@ -2426,8 +2452,20 @@ static ChangeInfoResult TownHouseChangeInfo(uint hid, int numinfo, int prop, Byt
*/
static ChangeInfoResult GlobalVarChangeInfo(uint gvid, int numinfo, int prop, ByteReader *buf)
{
- ChangeInfoResult ret = CIR_SUCCESS;
+ /* Properties which are handled as a whole */
+ switch (prop) {
+ case 0x09: // Cargo Translation Table; loading during both reservation and activation stage (in case it is selected depending on defined cargos)
+ return LoadTranslationTable(gvid, numinfo, buf, _cur.grffile->cargo_list, "Cargo");
+
+ case 0x12: // Rail type translation table; loading during both reservation and activation stage (in case it is selected depending on defined railtypes)
+ return LoadTranslationTable(gvid, numinfo, buf, _cur.grffile->railtype_list, "Rail type");
+
+ default:
+ break;
+ }
+ /* Properties which are handled per item */
+ ChangeInfoResult ret = CIR_SUCCESS;
for (int i = 0; i < numinfo; i++) {
switch (prop) {
case 0x08: { // Cost base factor
@@ -2442,22 +2480,6 @@ static ChangeInfoResult GlobalVarChangeInfo(uint gvid, int numinfo, int prop, By
break;
}
- case 0x09: { // Cargo Translation Table; loading during both reservation and activation stage (in case it is selected depending on defined cargos)
- if (i == 0) {
- if (gvid != 0) {
- grfmsg(1, "GlobalVarChangeInfo: Cargo translation table must start at zero");
- return CIR_INVALID_ID;
- }
-
- _cur.grffile->cargo_list.Clear();
- _cur.grffile->cargo_list.Append(numinfo);
- }
-
- CargoLabel cl = buf->ReadDWord();
- _cur.grffile->cargo_list[i] = BSWAP32(cl);
- break;
- }
-
case 0x0A: { // Currency display names
uint curidx = GetNewgrfCurrencyIdConverted(gvid + i);
StringID newone = GetGRFStringID(_cur.grffile->grfid, buf->ReadWord());
@@ -2570,22 +2592,6 @@ static ChangeInfoResult GlobalVarChangeInfo(uint gvid, int numinfo, int prop, By
buf->Skip(8);
break;
- case 0x12: { // Rail type translation table; loading during both reservation and activation stage (in case it is selected depending on defined railtypes)
- if (i == 0) {
- if (gvid != 0) {
- grfmsg(1, "GlobalVarChangeInfo: Rail type translation table must start at zero");
- return CIR_INVALID_ID;
- }
-
- _cur.grffile->railtype_list.Clear();
- _cur.grffile->railtype_list.Append(numinfo);
- }
-
- RailTypeLabel rtl = buf->ReadDWord();
- _cur.grffile->railtype_list[i] = BSWAP32(rtl);
- break;
- }
-
case 0x13: // Gender translation table
case 0x14: // Case translation table
case 0x15: { // Plural form translation
@@ -2661,8 +2667,20 @@ static ChangeInfoResult GlobalVarChangeInfo(uint gvid, int numinfo, int prop, By
static ChangeInfoResult GlobalVarReserveInfo(uint gvid, int numinfo, int prop, ByteReader *buf)
{
- ChangeInfoResult ret = CIR_SUCCESS;
+ /* Properties which are handled as a whole */
+ switch (prop) {
+ case 0x09: // Cargo Translation Table; loading during both reservation and activation stage (in case it is selected depending on defined cargos)
+ return LoadTranslationTable(gvid, numinfo, buf, _cur.grffile->cargo_list, "Cargo");
+
+ case 0x12: // Rail type translation table; loading during both reservation and activation stage (in case it is selected depending on defined railtypes)
+ return LoadTranslationTable(gvid, numinfo, buf, _cur.grffile->railtype_list, "Rail type");
+ default:
+ break;
+ }
+
+ /* Properties which are handled per item */
+ ChangeInfoResult ret = CIR_SUCCESS;
for (int i = 0; i < numinfo; i++) {
switch (prop) {
case 0x08: // Cost base factor
@@ -2670,22 +2688,6 @@ static ChangeInfoResult GlobalVarReserveInfo(uint gvid, int numinfo, int prop, B
buf->ReadByte();
break;
- case 0x09: { // Cargo Translation Table
- if (i == 0) {
- if (gvid != 0) {
- grfmsg(1, "ReserveChangeInfo: Cargo translation table must start at zero");
- return CIR_INVALID_ID;
- }
-
- _cur.grffile->cargo_list.Clear();
- _cur.grffile->cargo_list.Append(numinfo);
- }
-
- CargoLabel cl = buf->ReadDWord();
- _cur.grffile->cargo_list[i] = BSWAP32(cl);
- break;
- }
-
case 0x0A: // Currency display names
case 0x0C: // Currency options
case 0x0F: // Euro introduction dates
@@ -2709,22 +2711,6 @@ static ChangeInfoResult GlobalVarReserveInfo(uint gvid, int numinfo, int prop, B
break;
}
- case 0x12: { // Rail type translation table
- if (i == 0) {
- if (gvid != 0) {
- grfmsg(1, "ReserveChangeInfo: Rail type translation table must start at zero");
- return CIR_INVALID_ID;
- }
-
- _cur.grffile->railtype_list.Clear();
- _cur.grffile->railtype_list.Append(numinfo);
- }
-
- RailTypeLabel rtl = buf->ReadDWord();
- _cur.grffile->railtype_list[i] = BSWAP32(rtl);
- break;
- }
-
case 0x13: // Gender translation table
case 0x14: // Case translation table
while (buf->ReadByte() != 0) {