mirror of https://github.com/OpenTTD/OpenTTD
Fix: [NewGRF] Action 7/9 conditions 0x0F to 0x12 failed, if 'param' was 0x88. (#8382)
Fix: [NewGRF] Action 7/9 conditions 0x0B to 0x12 failed, if 'param' was 0x85. These conditions are supposed to ignore 'param' entirely.pull/8392/head
parent
0471de2d92
commit
d5f05fb781
|
@ -6553,19 +6553,45 @@ static void SkipIf(ByteReader *buf)
|
|||
return;
|
||||
}
|
||||
|
||||
uint32 param_val = GetParamVal(param, &cond_val);
|
||||
grfmsg(7, "SkipIf: Test condtype %d, param 0x%02X, condval 0x%08X", condtype, param, cond_val);
|
||||
|
||||
grfmsg(7, "SkipIf: Test condtype %d, param 0x%08X, condval 0x%08X", condtype, param_val, cond_val);
|
||||
|
||||
/*
|
||||
* Parameter (variable in specs) 0x88 can only have GRF ID checking
|
||||
* conditions, except conditions 0x0B, 0x0C (cargo availability) and
|
||||
* 0x0D, 0x0E (Rail type availability) as those ignore the parameter.
|
||||
* So, when the condition type is one of those, the specific variable
|
||||
* 0x88 code is skipped, so the "general" code for the cargo
|
||||
* availability conditions kicks in.
|
||||
/* condtypes that do not use 'param' are always valid.
|
||||
* condtypes that use 'param' are either not valid for param 0x88, or they are only valid for param 0x88.
|
||||
*/
|
||||
if (param == 0x88 && (condtype < 0x0B || condtype > 0x0E)) {
|
||||
if (condtype >= 0x0B) {
|
||||
/* Tests that ignore 'param' */
|
||||
switch (condtype) {
|
||||
case 0x0B: result = GetCargoIDByLabel(BSWAP32(cond_val)) == CT_INVALID;
|
||||
break;
|
||||
case 0x0C: result = GetCargoIDByLabel(BSWAP32(cond_val)) != CT_INVALID;
|
||||
break;
|
||||
case 0x0D: result = GetRailTypeByLabel(BSWAP32(cond_val)) == INVALID_RAILTYPE;
|
||||
break;
|
||||
case 0x0E: result = GetRailTypeByLabel(BSWAP32(cond_val)) != INVALID_RAILTYPE;
|
||||
break;
|
||||
case 0x0F: {
|
||||
RoadType rt = GetRoadTypeByLabel(BSWAP32(cond_val));
|
||||
result = rt == INVALID_ROADTYPE || !RoadTypeIsRoad(rt);
|
||||
break;
|
||||
}
|
||||
case 0x10: {
|
||||
RoadType rt = GetRoadTypeByLabel(BSWAP32(cond_val));
|
||||
result = rt != INVALID_ROADTYPE && RoadTypeIsRoad(rt);
|
||||
break;
|
||||
}
|
||||
case 0x11: {
|
||||
RoadType rt = GetRoadTypeByLabel(BSWAP32(cond_val));
|
||||
result = rt == INVALID_ROADTYPE || !RoadTypeIsTram(rt);
|
||||
break;
|
||||
}
|
||||
case 0x12: {
|
||||
RoadType rt = GetRoadTypeByLabel(BSWAP32(cond_val));
|
||||
result = rt != INVALID_ROADTYPE && RoadTypeIsTram(rt);
|
||||
break;
|
||||
}
|
||||
default: grfmsg(1, "SkipIf: Unsupported condition type %02X. Ignoring", condtype); return;
|
||||
}
|
||||
} else if (param == 0x88) {
|
||||
/* GRF ID checks */
|
||||
|
||||
GRFConfig *c = GetGRFConfig(cond_val, mask);
|
||||
|
@ -6606,7 +6632,8 @@ static void SkipIf(ByteReader *buf)
|
|||
default: grfmsg(1, "SkipIf: Unsupported GRF condition type %02X. Ignoring", condtype); return;
|
||||
}
|
||||
} else {
|
||||
/* Parameter or variable tests */
|
||||
/* Tests that use 'param' and are not GRF ID checks. */
|
||||
uint32 param_val = GetParamVal(param, &cond_val); // cond_val is modified for param == 0x85
|
||||
switch (condtype) {
|
||||
case 0x00: result = !!(param_val & (1 << cond_val));
|
||||
break;
|
||||
|
@ -6620,34 +6647,6 @@ static void SkipIf(ByteReader *buf)
|
|||
break;
|
||||
case 0x05: result = (param_val & mask) > cond_val;
|
||||
break;
|
||||
case 0x0B: result = GetCargoIDByLabel(BSWAP32(cond_val)) == CT_INVALID;
|
||||
break;
|
||||
case 0x0C: result = GetCargoIDByLabel(BSWAP32(cond_val)) != CT_INVALID;
|
||||
break;
|
||||
case 0x0D: result = GetRailTypeByLabel(BSWAP32(cond_val)) == INVALID_RAILTYPE;
|
||||
break;
|
||||
case 0x0E: result = GetRailTypeByLabel(BSWAP32(cond_val)) != INVALID_RAILTYPE;
|
||||
break;
|
||||
case 0x0F: {
|
||||
RoadType rt = GetRoadTypeByLabel(BSWAP32(cond_val));
|
||||
result = rt == INVALID_ROADTYPE || !RoadTypeIsRoad(rt);
|
||||
break;
|
||||
}
|
||||
case 0x10: {
|
||||
RoadType rt = GetRoadTypeByLabel(BSWAP32(cond_val));
|
||||
result = rt != INVALID_ROADTYPE && RoadTypeIsRoad(rt);
|
||||
break;
|
||||
}
|
||||
case 0x11: {
|
||||
RoadType rt = GetRoadTypeByLabel(BSWAP32(cond_val));
|
||||
result = rt == INVALID_ROADTYPE || !RoadTypeIsTram(rt);
|
||||
break;
|
||||
}
|
||||
case 0x12: {
|
||||
RoadType rt = GetRoadTypeByLabel(BSWAP32(cond_val));
|
||||
result = rt != INVALID_ROADTYPE && RoadTypeIsTram(rt);
|
||||
break;
|
||||
}
|
||||
default: grfmsg(1, "SkipIf: Unsupported condition type %02X. Ignoring", condtype); return;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue