mirror of
https://github.com/JGRennison/OpenTTD-patches.git
synced 2024-11-04 06:00:15 +00:00
(svn r10108) -Codechange: implement variable 0x60 (Get industry tile ID at offset) for industries.
It is exposed for for industry tiles who will reuse it too, for variable 0x62.
This commit is contained in:
parent
f94300a433
commit
af35821a2a
@ -8,6 +8,7 @@
|
|||||||
#include "functions.h"
|
#include "functions.h"
|
||||||
#include "macros.h"
|
#include "macros.h"
|
||||||
#include "industry.h"
|
#include "industry.h"
|
||||||
|
#include "industry_map.h"
|
||||||
#include "newgrf.h"
|
#include "newgrf.h"
|
||||||
#include "newgrf_callbacks.h"
|
#include "newgrf_callbacks.h"
|
||||||
#include "newgrf_spritegroup.h"
|
#include "newgrf_spritegroup.h"
|
||||||
@ -59,6 +60,51 @@ static uint GetClosestWaterDistance(TileIndex tile, bool water)
|
|||||||
return best_dist;
|
return best_dist;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Make an analysis of a tile and check for its belonging to the same
|
||||||
|
* industry, and/or the same grf file
|
||||||
|
* @param new_tile TileIndex of the tile to query
|
||||||
|
* @param old_tile TileINdex of teh reference tile
|
||||||
|
* @param i Industry to which old_tile belongs to
|
||||||
|
* @return value encoded as per NFO specs */
|
||||||
|
uint32 GetIndustryIDAtOffset(TileIndex new_tile, TileIndex old_tile, const Industry *i)
|
||||||
|
{
|
||||||
|
if (IsTileType(new_tile, MP_INDUSTRY)) { // Is this an industry tile?
|
||||||
|
|
||||||
|
if (GetIndustryIndex(new_tile) == i->index) { // Does it belong to the same industry?
|
||||||
|
IndustryGfx gfx = GetIndustryGfx(new_tile);
|
||||||
|
const IndustryTileSpec *indtsp = GetIndustryTileSpec(gfx);
|
||||||
|
const IndustryTileSpec *indold = GetIndustryTileSpec(GetIndustryGfx(old_tile));
|
||||||
|
|
||||||
|
if (gfx < NEW_INDUSTRYOFFSET) { // Does it belongs to an old type?
|
||||||
|
/* It is an old tile. We have to see if it's been overriden */
|
||||||
|
if (indtsp->grf_prop.override == INVALID_INDUSTRYTILE) { // has it been overridden?
|
||||||
|
return 0xFF << 8 | gfx; // no. Tag FF + the gfx id of that tile
|
||||||
|
} else { // yes. FInd out if it is from the same grf file or not
|
||||||
|
const IndustryTileSpec *old_tile_ovr = GetIndustryTileSpec(indtsp->grf_prop.override);
|
||||||
|
|
||||||
|
if (old_tile_ovr->grf_prop.grffile->grfid == indold->grf_prop.grffile->grfid) {
|
||||||
|
return old_tile_ovr->grf_prop.local_id; // same grf file
|
||||||
|
} else {
|
||||||
|
return 0xFFFE; // not the same grf file
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (indtsp->grf_prop.spritegroup != NULL) { // tile has a spritegroup ?
|
||||||
|
if (indtsp->grf_prop.grffile->grfid == indold->grf_prop.grffile->grfid) { // same industry, same grf ?
|
||||||
|
return indtsp->grf_prop.local_id;
|
||||||
|
} else {
|
||||||
|
return 0xFFFE; // Defined in another grf file
|
||||||
|
}
|
||||||
|
} else { // tile has no spritegroup
|
||||||
|
return 0xFF << 8 | indtsp->grf_prop.subst_id; // so just give him the substitute
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0xFFFF; // tile is not an industry one or does not belong to the current industry
|
||||||
|
}
|
||||||
|
|
||||||
/** This function implements the industries variables that newGRF defines.
|
/** This function implements the industries variables that newGRF defines.
|
||||||
* @param variable that is queried
|
* @param variable that is queried
|
||||||
* @param parameter unused
|
* @param parameter unused
|
||||||
@ -85,16 +131,8 @@ uint32 IndustryGetVariable(const ResolverObject *object, byte variable, byte par
|
|||||||
/* TODO: somehow determine whether we're in water or not */
|
/* TODO: somehow determine whether we're in water or not */
|
||||||
case 0x43: return GetClosestWaterDistance(tile, true); // Manhattan distance of closes dry/water tile
|
case 0x43: return GetClosestWaterDistance(tile, true); // Manhattan distance of closes dry/water tile
|
||||||
|
|
||||||
case 0x60: { /* Get industry ID at offset param */
|
/* Get industry ID at offset param */
|
||||||
/*The parameter of this variable is an offset from the northernmost tile of the industry:
|
case 0x60: return GetIndustryIDAtOffset(GetNearbyTile(parameter, industry->xy), tile, industry);
|
||||||
* the high nibble contains the Y offset, the low one the X offset; both are unsigned.
|
|
||||||
* The high word of the return value is currently reserved, and the low word can be:
|
|
||||||
* 00xxh if the tile is an industry tile and was defined in the current GRF with ID xx.
|
|
||||||
* FFxxh if the tile is an industry tile of an old type, and has the ID xx.
|
|
||||||
* FFFEh if the tile is an industry tile that was defined in another GRF file
|
|
||||||
* FFFFh if the tile isn't an industry tile, or doesn't belong to the current industry */
|
|
||||||
return GetIndustry(GetNearbyTile(parameter, tile))->type;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 0x61: return 0; // Get random tile bits at offset param
|
case 0x61: return 0; // Get random tile bits at offset param
|
||||||
|
|
||||||
|
@ -10,5 +10,6 @@
|
|||||||
|
|
||||||
uint32 IndustryGetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available);
|
uint32 IndustryGetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available);
|
||||||
uint16 GetIndustryCallback(uint16 callback, uint32 param1, uint32 param2, Industry *industry, TileIndex tile);
|
uint16 GetIndustryCallback(uint16 callback, uint32 param1, uint32 param2, Industry *industry, TileIndex tile);
|
||||||
|
uint32 GetIndustryIDAtOffset(TileIndex new_tile, TileIndex old_tile, const Industry *i);
|
||||||
|
|
||||||
#endif /* NEWGRF_INDUSTRIES_H */
|
#endif /* NEWGRF_INDUSTRIES_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user