module Gravity (applyGravity) where import Data.Bits import World -- Black magic for gravity -- Possible values: -- -- L liquid C0 -- L liq, focus C1 -- ~ liq, space 40 -- ~ liqspace f 41 -- -- * non-focused 80 -- * focused 81 -- ~ non-focused 00 -- ~ focused 01 applyGravity :: WeightEnv -> MargPos applyGravity wenv = case wenv of -- L L --> L L -- L ~ ~ L 0x01C0C0C0 -> 2 0x00C1C0C0 -> 3 0x41C0C0C0 -> 2 0x40C1C0C0 -> 3 0x40C0C1C0 -> 1 0x00C0C1C0 -> 1 0x40C0C0C1 -> 0 0x00C0C0C1 -> 0 -- L L --> L L -- ~ L L ~ 0xC001C0C0 -> 3 0xC100C0C0 -> 2 0xC041C0C0 -> 3 0xC140C0C0 -> 2 0xC040C1C0 -> 1 0xC000C1C0 -> 1 0xC040C0C1 -> 0 0xC000C0C1 -> 0 -- L ~ --> ~ L -- * * * * 0x808000C1 -> 1 0x808001C0 -> 0 0x808040C1 -> 1 0x808041C0 -> 0 0x80C000C1 -> 1 0x80C001C0 -> 0 0x80C040C1 -> 1 0x80C041C0 -> 0 0xC08000C1 -> 1 0xC08001C0 -> 0 0xC08040C1 -> 1 0xC08041C0 -> 0 0xC0C000C1 -> 1 0xC0C001C0 -> 0 0xC0C040C1 -> 1 0xC0C041C0 -> 0 -- ~ L --> L ~ -- * * * * 0x8080C100 -> 0 0x8080C001 -> 1 0x8080C140 -> 0 0x8080C041 -> 1 0x80C0C100 -> 0 0x80C0C001 -> 1 0x80C0C140 -> 0 0x80C0C041 -> 1 0xC080C100 -> 0 0xC080C001 -> 1 0xC080C140 -> 0 0xC080C041 -> 1 0xC0C0C100 -> 0 0xC0C0C001 -> 1 0xC0C0C140 -> 0 0xC0C0C041 -> 1 -- ~ ~ --> ~ ~ -- L ~ ~ L 0x00C10000 -> 3 0x01C00000 -> 2 0x40C10000 -> 3 0x41C00000 -> 2 0x00C14000 -> 3 0x01C04000 -> 2 0x40C14000 -> 3 0x41C04000 -> 2 0x00C10040 -> 3 0x01C00040 -> 2 0x40C10040 -> 3 0x41C00040 -> 2 0x00C14040 -> 3 0x01C04040 -> 2 0x40C14040 -> 3 0x41C04040 -> 2 -- ~ ~ --> ~ ~ -- ~ L L ~ 0xC1000000 -> 2 0xC0010000 -> 3 0xC1400000 -> 2 0xC0410000 -> 3 0xC1004000 -> 2 0xC0014000 -> 3 0xC1404000 -> 2 0xC0414000 -> 3 0xC1000040 -> 2 0xC0010040 -> 3 0xC1400040 -> 2 0xC0410040 -> 3 0xC1004040 -> 2 0xC0014040 -> 3 0xC1404040 -> 2 0xC0414040 -> 3 _ -> case (wenv .&. 0x81818181) of -- * ~ --> ~ ~ -- ~ ~ * ~ 0x00000081 -> 2 0x00010080 -> 0 -- * * --> * ~ -- * ~ * * 0x00808180 -> 3 0x01808080 -> 1 -- * * --> ~ ~ -- ~ ~ * * 0x00008081 -> 2 0x00008180 -> 3 0x00018080 -> 0 0x01008080 -> 1 -- ~ * --> ~ ~ -- * ~ * * 0x00808100 -> 3 0x01808000 -> 1 -- ~ * --> ~ ~ -- ~ ~ ~ * 0x00008100 -> 3 0x01008000 -> 1 -- * * --> ~ * -- ~ * * * 0x80008081 -> 2 0x80018080 -> 0 -- * ~ --> ~ ~ -- ~ * * * 0x80000081 -> 2 0x80010080 -> 0 -- * ~ --> ~ ~ -- * ~ * * 0x00800081 -> 3 0x01800080 -> 0 -- ~ * --> ~ ~ -- ~ * * * 0x80008100 -> 2 0x80018000 -> 1 x -> case x .&. 0x01010101 of 0x01000000 -> 3 0x00010000 -> 2 0x00000100 -> 1 0x00000001 -> 0