(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.
This commit is contained in:
peter1138 2007-01-01 01:40:56 +00:00
parent 71c89cf8ee
commit 3ba932e30f

View File

@ -2351,14 +2351,47 @@ static void SkipIf(byte *buf, int len)
return; return;
} }
if (param == 0x88 && GetFileByGRFID(cond_val) == NULL) { param_val = GetParamVal(param, &cond_val);
grfmsg(7, "Test condtype %d, param 0x%08X, condval 0x%08X", condtype, param_val, cond_val);
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)); grfmsg(7, "GRFID 0x%08X unknown, skipping test", BSWAP32(cond_val));
return; return;
} }
param_val = GetParamVal(param, &cond_val); 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;
grfmsg(7, "Test condtype %d, param 0x%08X, condval 0x%08X", condtype, param_val, cond_val); 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) { switch (condtype) {
case 0: result = !!(param_val & (1 << cond_val)); case 0: result = !!(param_val & (1 << cond_val));
break; break;
@ -2373,44 +2406,9 @@ static void SkipIf(byte *buf, int len)
case 5: result = (param_val & mask) > cond_val; case 5: result = (param_val & mask) > cond_val;
break; 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;
}
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;
}
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;
}
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; default: grfmsg(1, "Unsupported test %d. Ignoring", condtype); return;
} }
}
if (!result) { if (!result) {
grfmsg(2, "Not skipping sprites, test was false"); grfmsg(2, "Not skipping sprites, test was false");