unit KaMGeneratedTerrainBridge; interface uses KM_ResTypes, KM_ResTilesetTypes; type TKaMGeneratedTerrainInfoQuery = function(aTerrain: Integer): TKMGenTerrainInfo of object; TKaMGeneratedTerrainTransitionQuery = function( aTerKind: TKMTerrainKind; aMaskKind: TKMTileMaskKind; aMaskType: TKMTileMaskType; aMaskSubtype: TKMTileMaskSubType ): Word of object; function KaMGeneratedTerrainInfo(aTerrain: Integer): TKMGenTerrainInfo; function KaMGeneratedTerrainInfoLegacy(aTerrain: Integer): TKMGenTerrainInfo; function KaMGeneratedTerrainTransition( aTerKind: TKMTerrainKind; aMaskKind: TKMTileMaskKind; aMaskType: TKMTileMaskType; aMaskSubtype: TKMTileMaskSubType ): Word; procedure KaMPublishGeneratedTerrainProvider( aOwner: TObject; aCurrentInfo: TKaMGeneratedTerrainInfoQuery; aLegacyInfo: TKaMGeneratedTerrainInfoQuery; aTransition: TKaMGeneratedTerrainTransitionQuery ); procedure KaMUnpublishGeneratedTerrainProvider(aOwner: TObject); implementation uses SysUtils; var GProviderOwner: TObject; GCurrentInfoQuery: TKaMGeneratedTerrainInfoQuery; GLegacyInfoQuery: TKaMGeneratedTerrainInfoQuery; GTransitionQuery: TKaMGeneratedTerrainTransitionQuery; procedure ClearGeneratedTerrainProvider; begin GProviderOwner := nil; GCurrentInfoQuery := nil; GLegacyInfoQuery := nil; GTransitionQuery := nil; end; procedure RequireGeneratedTerrainProvider; begin if (GProviderOwner = nil) or not Assigned(GCurrentInfoQuery) or not Assigned(GLegacyInfoQuery) or not Assigned(GTransitionQuery) then raise Exception.Create('Generated-terrain provider is unavailable'); end; function KaMGeneratedTerrainInfo(aTerrain: Integer): TKMGenTerrainInfo; begin RequireGeneratedTerrainProvider; Result := GCurrentInfoQuery(aTerrain); end; function KaMGeneratedTerrainInfoLegacy(aTerrain: Integer): TKMGenTerrainInfo; begin RequireGeneratedTerrainProvider; Result := GLegacyInfoQuery(aTerrain); end; function KaMGeneratedTerrainTransition( aTerKind: TKMTerrainKind; aMaskKind: TKMTileMaskKind; aMaskType: TKMTileMaskType; aMaskSubtype: TKMTileMaskSubType ): Word; begin RequireGeneratedTerrainProvider; Result := GTransitionQuery(aTerKind, aMaskKind, aMaskType, aMaskSubtype); end; procedure KaMPublishGeneratedTerrainProvider( aOwner: TObject; aCurrentInfo: TKaMGeneratedTerrainInfoQuery; aLegacyInfo: TKaMGeneratedTerrainInfoQuery; aTransition: TKaMGeneratedTerrainTransitionQuery ); begin if (aOwner = nil) or not Assigned(aCurrentInfo) or not Assigned(aLegacyInfo) or not Assigned(aTransition) then raise Exception.Create('Generated-terrain provider binding is incomplete'); GProviderOwner := aOwner; GCurrentInfoQuery := aCurrentInfo; GLegacyInfoQuery := aLegacyInfo; GTransitionQuery := aTransition; end; procedure KaMUnpublishGeneratedTerrainProvider(aOwner: TObject); begin if (aOwner <> nil) and (aOwner = GProviderOwner) then ClearGeneratedTerrainProvider; end; end.