diff options
author | peter1138 <peter1138@openttd.org> | 2007-01-01 01:40:56 +0000 |
---|---|---|
committer | peter1138 <peter1138@openttd.org> | 2007-01-01 01:40:56 +0000 |
commit | 3ba932e30f2fbe3fcaed0ebabff2f65ba8d54db4 (patch) | |
tree | a7223c177ce167b73be29347fcdf530741046d40 | |
parent | 71c89cf8eef973b8b9e0740e4d9043531ac41fe9 (diff) | |
download | openttd-3ba932e30f2fbe3fcaed0ebabff2f65ba8d54db4.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.c | 94 |
1 files changed, 46 insertions, 48 deletions
@@ -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) { |