Changeset - r10781:758b3ae29fdd
[Not reviewed]
master
0 3 0
peter1138 - 15 years ago 2009-01-16 19:53:52
peter1138@openttd.org
(svn r15114) -Codechange: Add support for 8 byte action7/9 data, used as a mask for GRFID checks.
3 files changed with 5 insertions and 4 deletions:
0 comments (0 inline, 0 general)
src/newgrf.cpp
Show inline comments
 
@@ -3954,24 +3954,25 @@ static void SkipIf(byte *buf, size_t len
 
	if (!check_length(len, 6, "SkipIf")) return;
 
	buf++;
 
	uint8 param     = grf_load_byte(&buf);
 
	uint8 paramsize = grf_load_byte(&buf);
 
	uint8 condtype  = grf_load_byte(&buf);
 

	
 
	if (condtype < 2) {
 
		/* Always 1 for bit tests, the given value should be ignored. */
 
		paramsize = 1;
 
	}
 

	
 
	switch (paramsize) {
 
		case 8: cond_val = grf_load_dword(&buf); mask = grf_load_dword(&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;
 
	}
 

	
 
	if (param < 0x80 && _cur_grffile->param_end <= param) {
 
		grfmsg(7, "SkipIf: Param %d undefined, skipping test", param);
 
		return;
 
	}
 

	
 
	uint32 param_val = GetParamVal(param, &cond_val);
 
@@ -3979,25 +3980,25 @@ static void SkipIf(byte *buf, size_t len
 
	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 and 0x0C (cargo availability)
 
	 * as those ignore the parameter. So, when the condition type is
 
	 * either of those, the specific variable 0x88 code is skipped, so
 
	 * the "general" code for the cargo availability conditions kicks in.
 
	 */
 
	if (param == 0x88 && condtype != 0x0B && condtype != 0x0C) {
 
		/* GRF ID checks */
 

	
 
		GRFConfig *c = GetGRFConfig(cond_val);
 
		GRFConfig *c = GetGRFConfig(cond_val, mask);
 

	
 
		if (c != NULL && HasBit(c->flags, GCF_STATIC) && !HasBit(_cur_grfconfig->flags, GCF_STATIC) && c->status != GCS_DISABLED && _networking) {
 
			DisableStaticNewGRFInfluencingNonStaticNewGRFs(c);
 
			c = NULL;
 
		}
 

	
 
		if (condtype != 10 && c == NULL) {
 
			grfmsg(7, "SkipIf: GRFID 0x%08X unknown, skipping test", BSWAP32(cond_val));
 
			return;
 
		}
 

	
 
		switch (condtype) {
src/newgrf_config.cpp
Show inline comments
 
@@ -447,30 +447,30 @@ char *FindUnknownGRFName(uint32 grfid, u
 
	grf->next  = unknown_grfs;
 
	strecpy(grf->name, UNKNOWN_GRF_NAME_PLACEHOLDER, lastof(grf->name));
 
	memcpy(grf->md5sum, md5sum, sizeof(grf->md5sum));
 

	
 
	unknown_grfs = grf;
 
	return grf->name;
 
}
 

	
 
#endif /* ENABLE_NETWORK */
 

	
 

	
 
/* Retrieve a NewGRF from the current config by its grfid */
 
GRFConfig *GetGRFConfig(uint32 grfid)
 
GRFConfig *GetGRFConfig(uint32 grfid, uint32 mask)
 
{
 
	GRFConfig *c;
 

	
 
	for (c = _grfconfig; c != NULL; c = c->next) {
 
		if (c->grfid == grfid) return c;
 
		if ((c->grfid & mask) == (grfid & mask)) return c;
 
	}
 

	
 
	return NULL;
 
}
 

	
 

	
 
/* Build a space separated list of parameters, and terminate */
 
char *GRFBuildParamList(char *dst, const GRFConfig *c, const char *last)
 
{
 
	uint i;
 

	
 
	/* Return an empty string if there are no parameters */
src/newgrf_config.h
Show inline comments
 
@@ -73,25 +73,25 @@ struct GRFConfig : public GRFIdentifier 
 
	struct GRFConfig *next; ///< NOSAVE: Next item in the linked list
 

	
 
	bool IsOpenTTDBaseGRF() const;
 
};
 

	
 
extern GRFConfig *_all_grfs;          ///< First item in list of all scanned NewGRFs
 
extern GRFConfig *_grfconfig;         ///< First item in list of current GRF set up
 
extern GRFConfig *_grfconfig_newgame; ///< First item in list of default GRF set up
 
extern GRFConfig *_grfconfig_static;  ///< First item in list of static GRF set up
 

	
 
void ScanNewGRFFiles();
 
const GRFConfig *FindGRFConfig(uint32 grfid, const uint8 *md5sum = NULL);
 
GRFConfig *GetGRFConfig(uint32 grfid);
 
GRFConfig *GetGRFConfig(uint32 grfid, uint32 mask = 0xFFFFFFFF);
 
GRFConfig **CopyGRFConfigList(GRFConfig **dst, const GRFConfig *src, bool init_only);
 
void AppendStaticGRFConfigs(GRFConfig **dst);
 
void AppendToGRFConfigList(GRFConfig **dst, GRFConfig *el);
 
void ClearGRFConfig(GRFConfig **config);
 
void ClearGRFConfigList(GRFConfig **config);
 
void ResetGRFConfig(bool defaults);
 
GRFListCompatibility IsGoodGRFConfigList();
 
bool FillGRFDetails(GRFConfig *config, bool is_static);
 
char *GRFBuildParamList(char *dst, const GRFConfig *c, const char *last);
 

	
 
/* In newgrf_gui.cpp */
 
void ShowNewGRFSettings(bool editable, bool show_params, bool exec_changes, GRFConfig **config);
0 comments (0 inline, 0 general)