# HG changeset patch # User peter1138 # Date 1167615656 0 # Node ID 3f848403a81400e43beba28a3af7f57df1a9ba1c # Parent b33ea3bc2e1c4f6802a1157388d61ea0576599c3 (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. diff -r b33ea3bc2e1c -r 3f848403a814 newgrf.c --- a/newgrf.c Sun Dec 31 21:02:44 2006 +0000 +++ b/newgrf.c Mon Jan 01 01:40:56 2007 +0000 @@ -2351,65 +2351,63 @@ 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 */ + + const GRFConfig *c = GetGRFConfig(cond_val); + + if (condtype != 10 && c == NULL) { + grfmsg(7, "GRFID 0x%08X unknown, skipping test", BSWAP32(cond_val)); + return; } - case 7: { /* Is GRFID non-active? */ - const GRFConfig *c = GetGRFConfig(cond_val); - if (c == NULL) return; - result = !HASBIT(c->flags, GCF_ACTIVATED); - break; - } - - 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; + 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 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; } - - 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; + } 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; } - - 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; - } - - default: grfmsg(1, "Unsupported test %d. Ignoring", condtype); return; } if (!result) {