• Welcome to the Fable Community Forum!

    We're a group of fans who are passionate about the Fable series and video gaming.

    Register Log in

Replicating the Past

VinDiesel

Living Necromonger
Joined
Feb 10, 2019
Messages
79
Reaction score
85
Points
75
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.
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. :p
uqO6SF5.jpg

JZ79bek.jpg


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:
  • Like
Reactions: lee

lee

-Hero of Knowledge-
Joined
Oct 24, 2017
Messages
145
Reaction score
126
Points
120
Age
42
Beautiful screen shots of that reflecting water :thumbsup: glad that you have managed to figure some of it out now even though it has taken so long. I really hope that you don’t come across many more issues like this. There’s so few projects happening with Fable at the moment so I’m really hoping that your fantastic ideas will come to be something really special.
 

Hiroz41

Active Member
Joined
Mar 19, 2019
Messages
46
Reaction score
17
Points
30
Age
29
it looks great to thank you for the work
 
  • Like
Reactions: lee
Top