mirror of
https://github.com/JGRennison/OpenTTD-patches.git
synced 2024-11-04 06:00:15 +00:00
(svn r4816) - NewGRF: action 7/9 improvements:
- split of parameter retrieving to separate function, - handle param size for grf parameters, - add more grfid (param 0x88) tests.
This commit is contained in:
parent
214f73894b
commit
aeca70f15a
141
newgrf.c
141
newgrf.c
@ -1931,6 +1931,58 @@ static void CfgApply(byte *buf, int len)
|
||||
grfmsg(GMS_NOTICE, "CfgApply: Ignoring (not implemented).\n");
|
||||
}
|
||||
|
||||
static uint32 GetParamVal(byte param, uint32 *cond_val)
|
||||
{
|
||||
switch (param) {
|
||||
case 0x83: /* current climate, 0=temp, 1=arctic, 2=trop, 3=toyland */
|
||||
return _opt.landscape;
|
||||
|
||||
case 0x84: /* .grf loading stage, 0=initialization, 1=activation */
|
||||
return _cur_stage;
|
||||
|
||||
case 0x85: { /* TTDPatch flags, only for bit tests */
|
||||
uint32 param_val = _ttdpatch_flags[*cond_val / 0x20];
|
||||
*cond_val %= 0x20;
|
||||
return param_val;
|
||||
}
|
||||
|
||||
case 0x86: /* road traffic side, bit 4 clear=left, set=right */
|
||||
return _opt.road_side << 4;
|
||||
|
||||
case 0x88: /* GRF ID check */
|
||||
return 0;
|
||||
|
||||
case 0x8B: { /* TTDPatch version */
|
||||
uint major = 2;
|
||||
uint minor = 0;
|
||||
uint revision = 10; // special case: 2.0.1 is 2.0.10
|
||||
uint build = 73;
|
||||
return (major << 24) | (minor << 20) | (revision << 16) | (build * 10);
|
||||
}
|
||||
|
||||
case 0x8D: /* TTD Version, 00=DOS, 01=Windows */
|
||||
return !_use_dos_palette;
|
||||
|
||||
case 0x8E: /* Y-offset for train sprites */
|
||||
return _traininfo_vehicle_pitch;
|
||||
|
||||
case 0x92: /* Game mode */
|
||||
return _game_mode;
|
||||
|
||||
case 0x9D: /* TTD Platform, 00=TTDPatch, 01=OpenTTD */
|
||||
return 1;
|
||||
|
||||
default:
|
||||
/* GRF Parameter */
|
||||
if (param < 0x80) return _cur_grffile->param[param];
|
||||
|
||||
/* In-game variable. */
|
||||
grfmsg(GMS_WARN, "Unsupported in-game variable 0x%02X.", param);
|
||||
return -1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* Action 0x07 */
|
||||
/* Action 0x09 */
|
||||
static void SkipIf(byte *buf, int len)
|
||||
@ -1949,6 +2001,7 @@ static void SkipIf(byte *buf, int len)
|
||||
uint8 numsprites;
|
||||
uint32 param_val = 0;
|
||||
uint32 cond_val = 0;
|
||||
uint32 mask = 0;
|
||||
bool result;
|
||||
GRFLabel *label;
|
||||
GRFLabel *choice = NULL;
|
||||
@ -1965,61 +2018,27 @@ static void SkipIf(byte *buf, int len)
|
||||
}
|
||||
|
||||
switch (paramsize) {
|
||||
case 4: cond_val = grf_load_dword(&buf); break;
|
||||
case 2: cond_val = grf_load_word(&buf); break;
|
||||
case 1: cond_val = grf_load_byte(&buf); break;
|
||||
case 4: cond_val = grf_load_dword(&buf); mask = 0xFFFFFFFF; break;
|
||||
case 2: cond_val = grf_load_word(&buf); mask = 0x0000FFFF; break;
|
||||
case 1: cond_val = grf_load_byte(&buf); mask = 0x000000FF; break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
switch (param) {
|
||||
case 0x83: /* current climate, 0=temp, 1=arctic, 2=trop, 3=toyland */
|
||||
param_val = _opt.landscape;
|
||||
break;
|
||||
case 0x84: /* .grf loading stage, 0=initialization, 1=activation */
|
||||
param_val = _cur_stage;
|
||||
break;
|
||||
case 0x85: /* TTDPatch flags, only for bit tests */
|
||||
param_val = _ttdpatch_flags[cond_val / 0x20];
|
||||
cond_val %= 0x20;
|
||||
break;
|
||||
case 0x86: /* road traffic side, bit 4 clear=left, set=right */
|
||||
param_val = _opt.road_side << 4;
|
||||
break;
|
||||
case 0x88: { /* see if specified GRFID is active */
|
||||
param_val = (GetFileByGRFID(cond_val) != NULL);
|
||||
} break;
|
||||
|
||||
case 0x8B: { /* TTDPatch version */
|
||||
uint major = 2;
|
||||
uint minor = 0;
|
||||
uint revision = 10; // special case: 2.0.1 is 2.0.10
|
||||
uint build = 73;
|
||||
param_val = (major << 24) | (minor << 20) | (revision << 16) | (build * 10);
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x8D: /* TTD Version, 00=DOS, 01=Windows */
|
||||
param_val = !_use_dos_palette;
|
||||
break;
|
||||
case 0x8E:
|
||||
param_val = _traininfo_vehicle_pitch;
|
||||
break;
|
||||
case 0x9D: /* TTD Platform, 00=TTDPatch, 01=OpenTTD */
|
||||
param_val = 1;
|
||||
break;
|
||||
/* TODO */
|
||||
case 0x8F: /* Track type cost multipliers */
|
||||
default:
|
||||
if (param < 0x80) {
|
||||
/* Parameter. */
|
||||
param_val = _cur_grffile->param[param];
|
||||
} else {
|
||||
/* In-game variable. */
|
||||
grfmsg(GMS_WARN, "Unsupported in-game variable 0x%02X. Ignoring test.", param);
|
||||
return;
|
||||
}
|
||||
if (param < 0x80 && _cur_grffile->param_end <= param) {
|
||||
DEBUG(grf, 7) ("Param %d undefined, skipping test", param);
|
||||
return;
|
||||
}
|
||||
|
||||
if (param == 0x88 && GetFileByGRFID(cond_val) == NULL) {
|
||||
DEBUG(grf, 7) ("GRFID 0x%08X unknown, skipping test", BSWAP32(cond_val));
|
||||
return;
|
||||
}
|
||||
|
||||
param_val = GetParamVal(param, &cond_val);
|
||||
|
||||
/* Apply parameter mask, only for GRF parameters. */
|
||||
if (param < 0x80) param_val &= mask;
|
||||
|
||||
DEBUG(grf, 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));
|
||||
@ -2035,9 +2054,27 @@ static void SkipIf(byte *buf, int len)
|
||||
break;
|
||||
case 5: result = (param_val > cond_val);
|
||||
break;
|
||||
case 6: result = !!param_val; /* GRFID is active (only for param-num=88) */
|
||||
/* Tests 6 to 10 are only for param 0x88, GRFID checks */
|
||||
case 6: /* Is GRFID active? */
|
||||
case 9: /* GRFID is or will be active? */
|
||||
result = (GetFileByGRFID(cond_val)->flags & 1) == 1;
|
||||
break;
|
||||
case 7: result = !param_val; /* GRFID is not active (only for param-num=88) */
|
||||
case 7: /* Is GRFID non-active? */
|
||||
case 10: /* GRFID is not nor will be active */
|
||||
result = (GetFileByGRFID(cond_val)->flags & 1) == 0;
|
||||
break;
|
||||
case 8: /* GRFID is not but will be active? */
|
||||
result = 0;
|
||||
if ((GetFileByGRFID(cond_val)->flags & 1) == 1) {
|
||||
const GRFFile *file;
|
||||
for (file = _first_grffile; file != NULL; file = file->next) {
|
||||
if (file->grfid == cond_val) break;
|
||||
if (file == _cur_grffile) {
|
||||
result = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
grfmsg(GMS_WARN, "Unsupported test %d. Ignoring.", condtype);
|
||||
|
Loading…
Reference in New Issue
Block a user