module Lseed.Mainloop where
import Lseed.Data
import Lseed.Geometry
import Lseed.Data.Functions
import Lseed.Constants
import Lseed.Logic
import Lseed.StipeInfo
import System.Time
import System.Random
import Control.Concurrent
import Control.Monad
lseedMainLoop :: Bool
-> Observer
-> Integer
-> Garden ()
-> IO ()
lseedMainLoop rt obs maxDays garden = do
obInit obs
let nextDay (tick, garden) =
let (day, tickOfDay) = tick `divMod` ticksPerDay in
if day > maxDays then
obFinished obs garden
else do
tickStart <- getClockTime
rgen <- newStdGen
let sampleAngle = lightAngle $ (fromIntegral tickOfDay + 0.5) /
fromIntegral ticksPerDay
let growingGarden = growGarden sampleAngle rgen garden
obState obs tick garden
when rt $ do
obGrowingState obs $ \later ->
let tickDiff = timeSpanFraction tickLength tickStart later
dayDiff = (fromIntegral tickOfDay + tickDiff) /
fromIntegral ticksPerDay
timeInfo = formatTimeInfo day dayDiff
visualizeAngle = lightAngle dayDiff
gardenNow = annotateGarden visualizeAngle $
growingGarden tickDiff
in ScreenContent gardenNow visualizeAngle timeInfo
threadDelay (round (tickLength * 1000 * 1000))
nextDay (succ tick, growingGarden 1)
nextDay (0::Integer, mapGarden (fmap (const NoGrowth)) garden)