Hey Fable fans. I'm mad. Here's why. I work on my projects, right, but I also need continuous learning experiences. So I look at what other people have done and think, how did they do that. If they released a file, I can go through it and figure it out. If they didn't, maybe they talked about how they did it. But sometimes, sometimes, there's just nothing.
https://i.imgur.com/ZQMtj.jpg
Johndoe knew how to do some pretty advanced things and didn't share that knowledge. Or maybe he did and it was lost when he asked for his posts to be deleted. Because that knowledge is lost I spent the past two weeks trying to replicate that screenshot, or come close to it at least.
The steps involved in making a reflecting pool is as follows:
One - Solve the mystery of the Environment theme data.
https://i.imgur.com/0FjVWpu.png
Here's the relevant data for the def.xml. This allows you to manipulate the environments from within FableExplorer or ChocolateBox.
Two - Change the data pertaining to water to that of your choosing. ColourLookupColumn has predetermined values that seriously affect how things look in the game. I think the one used in that screenshot is the same as that used for Snowspire.
Three - Take one of the oakvale sea maps and make it its own region.
Four - Assign that region the binary data that uses your new environment.
Five - Manually hex edit the map to change the terrain height to match the water height. Keep in mind that heights are stored as floats and for some reason you need to divide the desired value by 2048. For this map, the water's at 3, so you'd use 0.00146484375.
Six - Manually hex edit the ground theme palette of another map without water into this map, and change the heightmap data again to use this new data. I borrowed fresco dome data to paste into my map.
Seven - Change anything you want to be reflected in the water, in its main entry (Building, Creature, Object), to have DrawAfterWater set to 0. 0 is drawn before water is rendered, which the water reflects once it is rendered. Anything drawn after that is ignored by the water.
But maybe don't use it on the hero. He doesn't get reflected correctly.
Two weeks guys. Two weeks because you don't write down what you know. Even if you don't think it's important, even if you don't think anyone reads it, even if you don't think it matters, please write down everything you know. Trivial as it sounds it'll make a difference to somebody.
https://i.imgur.com/ZQMtj.jpg
Johndoe knew how to do some pretty advanced things and didn't share that knowledge. Or maybe he did and it was lost when he asked for his posts to be deleted. Because that knowledge is lost I spent the past two weeks trying to replicate that screenshot, or come close to it at least.
The steps involved in making a reflecting pool is as follows:
One - Solve the mystery of the Environment theme data.
https://i.imgur.com/0FjVWpu.png
Here's the relevant data for the def.xml. This allows you to manipulate the environments from within FableExplorer or ChocolateBox.
Code:
<!-- ENVIRONMENT_THEME_DAY -->
<Control name="TimeArray" id="67E8E2EE">
<Member name="TimeArrayCount" type="uint"/>
<Array name="TimeArray" elementcount="TimeArrayCount">
<Member name="TimeOfDayCRC" type="uint"/>
<Member name="TimeOfDay" type="Float"/>
<Member name="MoonlitCRC" type="uint"/>
<Member name="Moonlit" type="byte"/>
<Member name="FogStartZCRC" type="uint"/>
<Member name="FogStartZ" type="Float"/>
<Member name="FogEndZCRC" type="uint"/>
<Member name="FogEndZ" type="float"/>
<Member name="SkyTexture0CRC" type="uint"/>
<Member name="SkyTexture0" type="uint">
<Link to="MainTextureID"/>
</Member>
<Member name="SkyTexture1CRC" type="uint"/>
<Member name="SkyTexture1" type="uint">
<Link to="MainTextureID"/>
</Member>
<Member name="SkyTexture1BlendCRC" type="uint"/>
<Member name="SkyTexture1Blend" type="float"/>
<Member name="CloudLowerLayerTexture0CRC" type="uint"/>
<Member name="CloudLowerLayerTexture0" type="uint">
<Link to="MainTextureID"/>
</Member>
<Member name="CloudLowerLayerTexture1CRC" type="uint"/>
<Member name="CloudLowerLayerTexture1" type="uint">
<Link to="MainTextureID"/>
</Member>
<Member name="CloudLowerLayerTexture1BlendCRC" type="uint"/>
<Member name="CloudLowerLayerTexture1Blend" type="float"/>
<Member name="CloudLowerLayerSpeedMultiplierCRC" type="uint"/>
<Member name="CloudLowerLayerSpeedMultiplier" type="float"/>
<Member name="CloudUpperLayerTexture0CRC" type="uint"/>
<Member name="CloudUpperLayerTexture0" type="uint">
<Link to="MainTextureID"/>
</Member>
<Member name="CloudUpperLayerTexture1CRC" type="uint"/>
<Member name="CloudUpperLayerTexture1" type="uint">
<Link to="MainTextureID"/>
</Member>
<Member name="CloudUpperLayerTexture1BlendCRC" type="uint"/>
<Member name="CloudUpperLayerTexture1Blend" type="float"/>
<Member name="CloudUpperLayerSpeedMultiplierCRC" type="uint"/>
<Member name="CloudUpperLayerSpeedMultiplier" type="float"/>
<Member name="WaterColourToReflectionBlendCRC" type="uint"/>
<Member name="WaterColourToReflectionBlend" type="float"/>
<Member name="WaterAlphaFactorCRC" type="uint"/>
<Member name="WaterAlphaFactor" type="float"/>
<Member name="WaterSpecularHightlightFactorCRC" type="uint"/>
<Member name="WaterSpecularHightlightFactor" type="float"/>
<Member name="RainStrengthCRC" type="uint"/>
<Member name="RainStrength" type="float"/>
<Member name="SnowStrengthCRC" type="uint"/>
<Member name="SnowStrength" type="float"/>
<Member name="MistAlphaCRC" type="uint"/>
<Member name="MistAlpha" type="float"/>
<Member name="LightningFrequencyCRC" type="uint"/>
<Member name="LightningFrequency" type="float"/>
<Member name="GlowThresholdScaleCRC" type="uint"/>
<Member name="GlowThresholdScale" type="float"/>
<Member name="GlowBloomScaleCRC" type="uint"/>
<Member name="GlowBloomScale" type="float"/>
<Member name="UnknownCRC" type="uint"/>
<Member name="Unknown" type="float"/>
<Member name="ShadowFactorCRC" type="uint"/>
<Member name="ShadowFactor" type="float"/>
<Member name="FadedShadowFactorCRC" type="uint"/>
<Member name="FadedShadowFactor" type="float"/>
<Member name="WaterRefractionBlendStartCRC" type="uint"/>
<Member name="WaterRefractionBlendStart" type="float"/>
<Member name="WaterRefractionBlendEndCRC" type="uint"/>
<Member name="WaterRefractionBlendEnd" type="float"/>
<Member name="WaterFlowSpeedFactorCRC" type="uint"/>
<Member name="WaterFlowSpeedFactor" type="float"/>
<Member name="WaterOscilationSpeedCRC" type="uint"/>
<Member name="WaterOscilationSpeed" type="float"/>
<Member name="WaterSwellFactorCRC" type="uint"/>
<Member name="WaterSwellFactor" type="float"/>
<Member name="WaterShoreSwellFactorCRC" type="uint"/>
<Member name="WaterShoreSwellFactor" type="float"/>
<Member name="WaterReflectionOffsetCRC" type="uint"/>
<Member name="WaterReflectionOffset" type="float"/>
</Array>
</Control>
<Control name="SunTilt" id="A05F99F2">
<Member name="_" type="float"/>
</Control>
<Control name="SunRotate" id="662301F5">
<Member name="_" type="float"/>
</Control>
<Control name="SunHeight" id="6594C537">
<Member name="_" type="float"/>
</Control>
<Control name="MoonTilt" id="47668F8D">
<Member name="_" type="float"/>
</Control>
<Control name="MoonRotate" id="53B13BBB">
<Member name="_" type="float"/>
</Control>
<Control name="MoonHeight" id="5006FF79">
<Member name="_" type="float"/>
</Control>
<Control name="ColourLookupColumn" id="30B1A712">
<Member name="_" type="uint"/>
</Control>
<Control name="EditorColour" id="772ADAF6">
<Member name="EditorColourRed" type="byte"/>
<Member name="EditorColourGreen" type="byte"/>
<Member name="EditorColourBlue" type="byte"/>
<Member name="EditorColourAlpha" type="byte"/>
</Control>
Two - Change the data pertaining to water to that of your choosing. ColourLookupColumn has predetermined values that seriously affect how things look in the game. I think the one used in that screenshot is the same as that used for Snowspire.
Three - Take one of the oakvale sea maps and make it its own region.
Four - Assign that region the binary data that uses your new environment.
Five - Manually hex edit the map to change the terrain height to match the water height. Keep in mind that heights are stored as floats and for some reason you need to divide the desired value by 2048. For this map, the water's at 3, so you'd use 0.00146484375.
Six - Manually hex edit the ground theme palette of another map without water into this map, and change the heightmap data again to use this new data. I borrowed fresco dome data to paste into my map.
Seven - Change anything you want to be reflected in the water, in its main entry (Building, Creature, Object), to have DrawAfterWater set to 0. 0 is drawn before water is rendered, which the water reflects once it is rendered. Anything drawn after that is ignored by the water.
But maybe don't use it on the hero. He doesn't get reflected correctly.



Two weeks guys. Two weeks because you don't write down what you know. Even if you don't think it's important, even if you don't think anyone reads it, even if you don't think it matters, please write down everything you know. Trivial as it sounds it'll make a difference to somebody.
Last edited: