summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormaedhros <maedhros@openttd.org>2007-02-21 17:20:44 +0000
committermaedhros <maedhros@openttd.org>2007-02-21 17:20:44 +0000
commit61fa3909f28b282dd04f578757723b93c891e334 (patch)
tree64aca0d2d141be35a37fb94f3ddf1c49459129ab
parent62ff0ab073a19936c355e4fcd12535bc5b645955 (diff)
downloadopenttd-61fa3909f28b282dd04f578757723b93c891e334.tar.xz
(svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
in Action B is encountered. Also be more strict on the values accepted.
-rw-r--r--src/newgrf.cpp48
1 files changed, 35 insertions, 13 deletions
diff --git a/src/newgrf.cpp b/src/newgrf.cpp
index 5a32dad49..ae9429fb0 100644
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -2655,12 +2655,12 @@ static void GRFError(byte *buf, int len)
/* TODO: For now we just show the message, sometimes incomplete and never translated. */
static const char *const msgstr[] = {
- "%sRequires at least pseudo-TTDPatch version %s",
- "%sThis file is for %s version of TTD",
+ "%sRequires at least pseudo-TTDPatch version %s.",
+ "%sThis file is for %s version of TTD.",
"%sDesigned to be used with %s",
- "%sInvalid parameter %s",
- "%sMust be loaded before %s",
- "%sMust be loaded after %s",
+ "%sInvalid parameter %s.",
+ "%sMust be loaded before %s.",
+ "%sMust be loaded after %s.",
"%s%s"
};
@@ -2674,20 +2674,42 @@ static void GRFError(byte *buf, int len)
if (!check_length(len, 6, "GRFError")) return;
buf++; /* Skip the action byte. */
- byte sevid = grf_load_byte(&buf);
+ byte severity = grf_load_byte(&buf);
buf++; /* TODO: Language id. */
- byte msgid = grf_load_byte(&buf);
+ byte message_id = grf_load_byte(&buf);
+ len -= 4;
- const char *data = grf_load_string(&buf, len - 4);
-
- // Undocumented TTDPatch feature.
- if (!HASBIT(sevid, 7) && _cur_stage < GLS_ACTIVATION) {
+ /* Skip the error until the activation stage unless bit 7 of the severity
+ * is set. */
+ if (!HASBIT(severity, 7) && _cur_stage < GLS_ACTIVATION) {
grfmsg(7, "Skipping non-fatal GRFError in stage 1");
return;
}
+ CLRBIT(severity, 7);
+
+ if (severity >= lengthof(sevstr)) {
+ grfmsg(7, "GRFError: Invalid severity id %d. Setting to 2 (non-fatal error).", severity);
+ severity = 2;
+ } else if (severity == 3) {
+ /* This is a fatal error, so make sure the GRF is deactivated and no
+ * more of it gets loaded. */
+ SETBIT(_cur_grfconfig->flags, GCF_DISABLED);
+ CLRBIT(_cur_grfconfig->flags, GCF_ACTIVATED);
+
+ _skip_sprites = -1;
+ }
+
+ if (message_id >= lengthof(msgstr) && message_id != 0xFF) {
+ grfmsg(7, "GRFError: Invalid message id.");
+ return;
+ }
+
+ if (len <= 1) {
+ grfmsg(7, "GRFError: No message data supplied.");
+ return;
+ }
- sevid = GB(sevid, 0, 2);
- grfmsg(0, msgstr[(msgid == 0xFF) ? lengthof(msgstr) - 1 : msgid], sevstr[sevid], data);
+ grfmsg(0, msgstr[(message_id == 0xFF) ? lengthof(msgstr) - 1 : message_id], sevstr[severity], grf_load_string(&buf, len));
}
/* Action 0x0C */