summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpeter1138 <peter1138@openttd.org>2007-01-01 01:40:56 +0000
committerpeter1138 <peter1138@openttd.org>2007-01-01 01:40:56 +0000
commit8fc0201a1124368d0c813e4622e4c92f9d680c68 (patch)
treea7223c177ce167b73be29347fcdf530741046d40
parent12c8d37a6b07e8118c0855e9ce3d84c8dfe0e1f6 (diff)
downloadopenttd-8fc0201a1124368d0c813e4622e4c92f9d680c68.tar.xz
(svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
from parameter conditions to remove code duplication in GRF checking code.
-rw-r--r--newgrf.c94
1 files changed, 46 insertions, 48 deletions
diff --git a/newgrf.c b/newgrf.c
index d82ab294e..c2b4e464b 100644
--- a/newgrf.c
+++ b/newgrf.c
@@ -2351,65 +2351,63 @@ static void SkipIf(byte *buf, int len)
return;
}
- if (param == 0x88 && GetFileByGRFID(cond_val) == NULL) {
- grfmsg(7, "GRFID 0x%08X unknown, skipping test", BSWAP32(cond_val));
- return;
- }
-
param_val = GetParamVal(param, &cond_val);
grfmsg(7, "Test condtype %d, param 0x%08X, condval 0x%08X", condtype, param_val, cond_val);
- switch (condtype) {
- case 0: result = !!(param_val & (1 << cond_val));
- break;
- case 1: result = !(param_val & (1 << cond_val));
- break;
- case 2: result = (param_val & mask) == cond_val;
- break;
- case 3: result = (param_val & mask) != cond_val;
- break;
- case 4: result = (param_val & mask) < cond_val;
- break;
- case 5: result = (param_val & mask) > cond_val;
- break;
- /* Tests 6 to 10 are only for param 0x88, GRFID checks */
- case 6: { /* Is GRFID active? */
- const GRFConfig *c = GetGRFConfig(cond_val);
- if (c == NULL) return;
- result = HASBIT(c->flags, GCF_ACTIVATED);
- break;
- }
+ if (param == 0x88) {
+ /* GRF ID checks */
- case 7: { /* Is GRFID non-active? */
- const GRFConfig *c = GetGRFConfig(cond_val);
- if (c == NULL) return;
- result = !HASBIT(c->flags, GCF_ACTIVATED);
- break;
- }
+ const GRFConfig *c = GetGRFConfig(cond_val);
- case 8: { /* GRFID is not but will be active? */
- const GRFConfig *c = GetGRFConfig(cond_val);
- if (c == NULL) return;
- result = !HASBIT(c->flags, GCF_ACTIVATED) && !HASBIT(c->flags, GCF_DISABLED);
- break;
+ if (condtype != 10 && c == NULL) {
+ grfmsg(7, "GRFID 0x%08X unknown, skipping test", BSWAP32(cond_val));
+ return;
}
- case 9: { /* GRFID is or will be active? */
- const GRFConfig *c = GetGRFConfig(cond_val);
- if (c == NULL) return;
- result = !HASBIT(c->flags, GCF_NOT_FOUND) && !HASBIT(c->flags, GCF_DISABLED);
- break;
- }
+ switch (condtype) {
+ /* Tests 6 to 10 are only for param 0x88, GRFID checks */
+ case 6: /* Is GRFID active? */
+ result = HASBIT(c->flags, GCF_ACTIVATED);
+ break;
- case 10: { /* GRFID is not nor will be active */
- const GRFConfig *c = GetGRFConfig(cond_val);
- /* This is the only condtype that doesn't get ignored if the GRFID is not found */
- result = c == NULL || HASBIT(c->flags, GCF_DISABLED) || HASBIT(c->flags, GCF_NOT_FOUND);
- break;
+ case 7: /* Is GRFID non-active? */
+ result = !HASBIT(c->flags, GCF_ACTIVATED);
+ break;
+
+ case 8: /* GRFID is not but will be active? */
+ result = !HASBIT(c->flags, GCF_ACTIVATED) && !HASBIT(c->flags, GCF_DISABLED);
+ break;
+
+ case 9: /* GRFID is or will be active? */
+ result = !HASBIT(c->flags, GCF_NOT_FOUND) && !HASBIT(c->flags, GCF_DISABLED);
+ break;
+
+ case 10: /* GRFID is not nor will be active */
+ /* This is the only condtype that doesn't get ignored if the GRFID is not found */
+ result = c == NULL || HASBIT(c->flags, GCF_DISABLED) || HASBIT(c->flags, GCF_NOT_FOUND);
+ break;
+
+ default: grfmsg(1, "Unsupported GRF test %d. Ignoring", condtype); return;
}
+ } else {
+ /* Parameter or variable tests */
+ switch (condtype) {
+ case 0: result = !!(param_val & (1 << cond_val));
+ break;
+ case 1: result = !(param_val & (1 << cond_val));
+ break;
+ case 2: result = (param_val & mask) == cond_val;
+ break;
+ case 3: result = (param_val & mask) != cond_val;
+ break;
+ case 4: result = (param_val & mask) < cond_val;
+ break;
+ case 5: result = (param_val & mask) > cond_val;
+ break;
- default: grfmsg(1, "Unsupported test %d. Ignoring", condtype); return;
+ default: grfmsg(1, "Unsupported test %d. Ignoring", condtype); return;
+ }
}
if (!result) {