summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/newgrf.cpp144
1 files changed, 95 insertions, 49 deletions
diff --git a/src/newgrf.cpp b/src/newgrf.cpp
index 915cd3f99..f6561df95 100644
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -1771,6 +1771,68 @@ static ChangeInfoResult GlobalVarChangeInfo(uint gvid, int numinfo, int prop, by
return ret;
}
+static ChangeInfoResult GlobalVarReserveInfo(uint gvid, int numinfo, int prop, byte **bufp, int len)
+{
+ byte *buf = *bufp;
+ ChangeInfoResult ret = CIR_SUCCESS;
+
+ for (int i = 0; i < numinfo; i++) {
+ switch (prop) {
+ case 0x08: // Cost base factor
+ grf_load_byte(&buf);
+ 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;
+ }
+
+ free(_cur_grffile->cargo_list);
+ _cur_grffile->cargo_max = numinfo;
+ _cur_grffile->cargo_list = MallocT<CargoLabel>(numinfo);
+ }
+
+ CargoLabel cl = grf_load_dword(&buf);
+ _cur_grffile->cargo_list[i] = BSWAP32(cl);
+ break;
+ }
+
+ case 0x0A: // Currency display names
+ case 0x0C: // Currency options
+ case 0x0F: // Euro introduction dates
+ grf_load_word(&buf);
+ break;
+
+ case 0x0B: // Currency multipliers
+ case 0x0D: // Currency prefix symbol
+ case 0x0E: // Currency suffix symbol
+ grf_load_dword(&buf);
+ break;
+
+ case 0x10: // Snow line height table
+ buf += SNOW_LINE_MONTHS * SNOW_LINE_DAYS;
+ break;
+
+ case 0x11: { // GRF match for engine allocation
+ uint32 s = grf_load_dword(&buf);
+ uint32 t = grf_load_dword(&buf);
+ SetNewGRFOverride(s, t);
+ break;
+ }
+
+ default:
+ ret = CIR_UNKNOWN;
+ break;
+ }
+ }
+
+ *bufp = buf;
+ return ret;
+}
+
+
static ChangeInfoResult CargoChangeInfo(uint cid, int numinfo, int prop, byte **bufp, int len)
{
byte *buf = *bufp;
@@ -2319,6 +2381,33 @@ static ChangeInfoResult IndustriesChangeInfo(uint indid, int numinfo, int prop,
return ret;
}
+static bool HandleChangeInfoResult(const char *caller, ChangeInfoResult cir, uint8 feature, uint8 property)
+{
+ switch (cir) {
+ default: NOT_REACHED();
+
+ case CIR_SUCCESS:
+ return false;
+
+ case CIR_UNHANDLED:
+ grfmsg(1, "%s: Ignoring property 0x%02X of feature 0x%02X (not implemented)", caller, property, feature);
+ return false;
+
+ case CIR_UNKNOWN:
+ grfmsg(0, "%s: Unknown property 0x%02X of feature 0x%02X, disabling", caller, property, feature);
+ /* Fall through */
+
+ case CIR_INVALID_ID:
+ /* No debug message for an invalid ID, as it has already been output */
+ _skip_sprites = -1;
+ _cur_grfconfig->status = GCS_DISABLED;
+ _cur_grfconfig->error = CallocT<GRFError>(1);
+ _cur_grfconfig->error->severity = STR_NEWGRF_ERROR_MSG_FATAL;
+ _cur_grfconfig->error->message = (cir == CIR_INVALID_ID) ? STR_NEWGRF_ERROR_INVALID_ID : STR_NEWGRF_ERROR_UNKNOWN_PROPERTY;
+ return true;
+ }
+}
+
/* Action 0x00 */
static void FeatureChangeInfo(byte *buf, size_t len)
{
@@ -2372,27 +2461,7 @@ static void FeatureChangeInfo(byte *buf, size_t len)
uint8 prop = grf_load_byte(&buf);
ChangeInfoResult cir = handler[feature](engine, numinfo, prop, &buf, bufend - buf);
- switch (cir) {
- case CIR_SUCCESS:
- break;
-
- case CIR_UNHANDLED:
- grfmsg(1, "FeatureChangeInfo: Ignoring property 0x%02X of feature 0x%02X (not implemented)", prop, feature);
- break;
-
- case CIR_UNKNOWN:
- grfmsg(0, "FeatureChangeInfo: Unknown property 0x%02X of feature 0x%02X, disabling", prop, feature);
- /* Fall through */
-
- case CIR_INVALID_ID:
- /* No debug message for an invalid ID, as it has already been output */
- _skip_sprites = -1;
- _cur_grfconfig->status = GCS_DISABLED;
- _cur_grfconfig->error = CallocT<GRFError>(1);
- _cur_grfconfig->error->severity = STR_NEWGRF_ERROR_MSG_FATAL;
- _cur_grfconfig->error->message = (cir == CIR_INVALID_ID) ? STR_NEWGRF_ERROR_INVALID_ID : STR_NEWGRF_ERROR_UNKNOWN_PROPERTY;
- return;
- }
+ if (HandleChangeInfoResult("FeatureChangeInfo", cir, feature, prop)) return;
}
}
@@ -2436,43 +2505,20 @@ static void ReserveChangeInfo(byte *buf, size_t len)
while (numprops-- && buf < bufend) {
uint8 prop = grf_load_byte(&buf);
- bool ignoring = false;
+ ChangeInfoResult cir = CIR_SUCCESS;
switch (feature) {
default: NOT_REACHED();
case GSF_CARGOS:
- ignoring = CargoChangeInfo(index, numinfo, prop, &buf, bufend - buf);
+ cir = CargoChangeInfo(index, numinfo, prop, &buf, bufend - buf);
break;
- case GSF_GLOBALVAR:
- switch (prop) {
- case 0x09: // Cargo Translation Table
- if (index != 0) {
- grfmsg(1, "ReserveChangeInfo: Cargo translation table must start at zero");
- return;
- }
- free(_cur_grffile->cargo_list);
- _cur_grffile->cargo_max = numinfo;
- _cur_grffile->cargo_list = MallocT<CargoLabel>(numinfo);
-
- for (uint i = 0; i < numinfo; i++) {
- CargoLabel cl = grf_load_dword(&buf);
- _cur_grffile->cargo_list[i] = BSWAP32(cl);
- }
- break;
-
- case 0x11: // GRF match for engine allocation
- for (uint i = 0; i < numinfo; i++) {
- uint32 s = grf_load_dword(&buf);
- uint32 t = grf_load_dword(&buf);
- SetNewGRFOverride(s, t);
- }
- break;
- }
+ case GSF_GLOBALVAR:
+ cir = GlobalVarReserveInfo(index, numinfo, prop, &buf, bufend - buf);
break;
}
- if (ignoring) grfmsg(2, "ReserveChangeInfo: Ignoring property 0x%02X (not implemented)", prop);
+ if (HandleChangeInfoResult("ReserveChangeInfo", cir, feature, prop)) return;
}
}