[{"name":"Messenger.Audio.Base","comment":"\n\n\n# Audio Base\n\n@docs AudioOption\n\n","unions":[{"name":"AudioOption","comment":" AudioOption\n\nYou can play one audio once or loop it.\n\n","args":[],"cases":[["ALoop",[]],["AOnce",[]]]}],"aliases":[],"values":[],"binops":[]},{"name":"Messenger.Base","comment":"\n\n\n# Base Module\n\nSome Basic Data Types for the game\n\n@docs WorldEvent\n@docs GlobalData, InternalData\n@docs Env\n@docs Flags\n@docs removeCommonData, addCommonData\n@docs UserViewGlobalData\n@docs emptyInternalData, userGlobalDataToGlobalData, globalDataToUserGlobalData\n\n","unions":[{"name":"WorldEvent","comment":" World Event\n\nThis is the World Event for the game.\n\nUsers can get outside information through the events.\n\n`Tick` records the time.\n\n`KeyDown`, `KeyUp` records the keyboard events\n\n`MouseDown`, `MouseUp` records the button code and position when mouse up and down\n\n`MouseWheel` records the wheel event for mouse, it can be also used for touchpad\n\n**Note: Do Not use MouseMove Event to get mouse position. Use Globaldata instead.**\n\n","args":[],"cases":[["Tick",["Time.Posix"]],["KeyDown",["Basics.Int"]],["KeyUp",["Basics.Int"]],["NewWindowSize",["( Basics.Float, Basics.Float )"]],["WindowVisibility",["Browser.Events.Visibility"]],["SoundLoaded",["String.String","Messenger.Audio.Base.AudioOption","Result.Result Audio.LoadError Audio.Source"]],["PlaySoundGotTime",["String.String","Messenger.Audio.Base.AudioOption","Audio.Source","Time.Posix"]],["TextureLoaded",["String.String","Maybe.Maybe Canvas.Texture.Texture"]],["MouseDown",["Basics.Int","( Basics.Float, Basics.Float )"]],["MouseUp",["Basics.Int","( Basics.Float, Basics.Float )"]],["MouseMove",["( Basics.Float, Basics.Float )"]],["MouseWheel",["Basics.Int"]],["Prompt",["String.String","String.String"]],["NullEvent",[]]]}],"aliases":[{"name":"Env","comment":" Environment\n\nEnvironment is provided to users almost all the time.\n\nIt stores GlobalData and CommonData (Similar to GlobalData but just for one scene),\nso you can get and modify them through the Env.\n\n","args":["common","userdata"],"type":"{ globalData : Messenger.Base.GlobalData userdata, commonData : common }"},{"name":"Flags","comment":" Flags\n\nThe main flags.\nGet info from js script.\n\n**Learn more about flags [here](https://guide.elm-lang.org/interop/flags)**\n\n","args":[],"type":"{ windowWidth : Basics.Float, windowHeight : Basics.Float, timeStamp : Basics.Int, info : String.String }"},{"name":"GlobalData","comment":" GlobalData\n\nGlobalData is the data that doesn't change during the game.\n\nIt won't be reset if you change the scene.\n\nIt is mainly used for display and reading/writing some localstorage data.\n\n  - `globalTime` records the past frames number since the game started\n  - `sceneStartTime` records the past frames number since this scene started\n  - `userdata` records the data that users set to save\n  - `extraHTML` is used to render extra HTML tags. Be careful to use this\n  - `windowVisibility` records whether users stay in this tab/window\n  - `pressedKeys` records the keycodes that are be pressed now\n  - `pressedMouseButtons` records the mouse buttons that are pressed now\n\n","args":["userdata"],"type":"{ internalData : Messenger.Base.InternalData, sceneStartTime : Basics.Int, globalTime : Basics.Int, currentTimeStamp : Time.Posix, windowVisibility : Browser.Events.Visibility, mousePos : ( Basics.Float, Basics.Float ), pressedMouseButtons : Set.Set Basics.Int, pressedKeys : Set.Set Basics.Int, extraHTML : Maybe.Maybe (Html.Html Messenger.Base.WorldEvent), canvasAttributes : List.List (Html.Attribute Messenger.Base.WorldEvent), volume : Basics.Float, userData : userdata, currentScene : String.String }"},{"name":"InternalData","comment":" Internal GlobalData\n\nBasically users do not need to get or modify them.\n\n  - `browserViewPort` records the browser size.\n  - `sprites` records all the sprites(images).\n\n","args":[],"type":"{ browserViewPort : ( Basics.Float, Basics.Float ), realWidth : Basics.Float, realHeight : Basics.Float, startLeft : Basics.Float, startTop : Basics.Float, sprites : Dict.Dict String.String Canvas.Texture.Texture, virtualWidth : Basics.Float, virtualHeight : Basics.Float }"},{"name":"UserViewGlobalData","comment":" UserViewGlobalData\n\nThis type is for user to use when initializing the messenger.\n\n","args":["userdata"],"type":"{ sceneStartTime : Basics.Int, globalTime : Basics.Int, volume : Basics.Float, extraHTML : Maybe.Maybe (Html.Html Messenger.Base.WorldEvent), canvasAttributes : List.List (Html.Attribute Messenger.Base.WorldEvent), userData : userdata }"}],"values":[{"name":"addCommonData","comment":" Add the common data to a Environment without common data.\n","type":"cdata -> Messenger.Base.Env () userdata -> Messenger.Base.Env cdata userdata"},{"name":"emptyInternalData","comment":" Empty InternalData\n","type":"Messenger.Base.InternalData"},{"name":"globalDataToUserGlobalData","comment":" Translate GlobalData to UserViewGlobalData\n","type":"Messenger.Base.GlobalData userdata -> Messenger.Base.UserViewGlobalData userdata"},{"name":"removeCommonData","comment":" Remove common data from environment.\n\nUseful when dealing with portable components by yourself.\n\nMost of the time it will not be used since it has been built into prepared update functions.\n\n","type":"Messenger.Base.Env cdata userdata -> Messenger.Base.Env () userdata"},{"name":"userGlobalDataToGlobalData","comment":" Translate UserViewGlobalData to GlobalData\n","type":"Messenger.Base.UserViewGlobalData userdata -> Messenger.Base.GlobalData userdata"}],"binops":[]},{"name":"Messenger.Component.Component","comment":"\n\n\n# Component\n\nA component is an object that you may put in your layers.\n\nThere are two types of components:\n\n  - Portable components\n  - User components\n\n\n## User components\n\nThese are components that you users can create with custom **basedata**.\n\nBasedata is the data that components with the same type can share.\n\nFor example, you may want a game component to have some common properties like position, velocity, etc.\n\nIn this case, your basedata would be a record with these properties.\n\n@docs AbstractComponent\n@docs ConcreteUserComponent\n@docs genComponent\n@docs updateComponents\n@docs updateComponentsWithTarget\n\n\n## View components\n\n@docs genComponentsRenderList, viewComponentsRenderList\n@docs viewComponents\n\n\n# Type sugar\n\n@docs ComponentInit, ComponentUpdate, ComponentUpdateRec, ComponentView, ComponentMatcher\n@docs ComponentStorage\n\n","unions":[],"aliases":[{"name":"AbstractComponent","comment":" AbstractComponent\n","args":["cdata","userdata","tar","msg","bdata","scenemsg"],"type":"Messenger.GeneralModel.AbstractGeneralModel (Messenger.Base.Env cdata userdata) Messenger.Base.WorldEvent tar msg ( Canvas.Renderable, Basics.Int ) bdata (Messenger.Scene.Scene.SceneOutputMsg scenemsg userdata)"},{"name":"ComponentInit","comment":" Component init type sugar\n","args":["cdata","userdata","msg","data","bdata"],"type":"Messenger.Base.Env cdata userdata -> msg -> ( data, bdata )"},{"name":"ComponentMatcher","comment":" Component matcher type sugar\n","args":["data","bdata","tar"],"type":"data -> bdata -> tar -> Basics.Bool"},{"name":"ComponentStorage","comment":" Component storage type sugar\n","args":["cdata","userdata","tar","msg","bdata","scenemsg"],"type":"Messenger.Base.Env cdata userdata -> msg -> Messenger.Component.Component.AbstractComponent cdata userdata tar msg bdata scenemsg"},{"name":"ComponentUpdate","comment":" Component update type sugar\n","args":["cdata","data","userdata","scenemsg","tar","msg","bdata"],"type":"Messenger.Base.Env cdata userdata -> Messenger.Base.WorldEvent -> data -> bdata -> ( ( data, bdata ), List.List (Messenger.GeneralModel.Msg tar msg (Messenger.Scene.Scene.SceneOutputMsg scenemsg userdata)), ( Messenger.Base.Env cdata userdata, Basics.Bool ) )"},{"name":"ComponentUpdateRec","comment":" Component updaterec type sugar\n","args":["cdata","data","userdata","scenemsg","tar","msg","bdata"],"type":"Messenger.Base.Env cdata userdata -> msg -> data -> bdata -> ( ( data, bdata ), List.List (Messenger.GeneralModel.Msg tar msg (Messenger.Scene.Scene.SceneOutputMsg scenemsg userdata)), Messenger.Base.Env cdata userdata )"},{"name":"ComponentView","comment":" Component view type sugar\n","args":["cdata","userdata","data","bdata"],"type":"Messenger.Base.Env cdata userdata -> data -> bdata -> ( Canvas.Renderable, Basics.Int )"},{"name":"ConcreteUserComponent","comment":" ConcreteUserComponent\n","args":["data","cdata","userdata","tar","msg","bdata","scenemsg"],"type":"Messenger.GeneralModel.ConcreteGeneralModel data (Messenger.Base.Env cdata userdata) Messenger.Base.WorldEvent tar msg ( Canvas.Renderable, Basics.Int ) bdata (Messenger.Scene.Scene.SceneOutputMsg scenemsg userdata)"}],"values":[{"name":"genComponent","comment":" genComponent\n\nGenerate abstract user component from concrete component.\n\n","type":"Messenger.Component.Component.ConcreteUserComponent data cdata userdata tar msg bdata scenemsg -> Messenger.Component.Component.ComponentStorage cdata userdata tar msg bdata scenemsg"},{"name":"genComponentsRenderList","comment":" generate render list for one list of components\n\nUseful when there are several component lists\n\nthe output should be used as the input of `viewComponentsRenderList`\n\n","type":"Messenger.Base.Env cdata userdata -> List.List (Messenger.Component.Component.AbstractComponent cdata userdata tar msg bdata scenemsg) -> List.List ( Canvas.Renderable, Basics.Int )"},{"name":"updateComponents","comment":" updateComponents\n\nUpdate a list of abstract user components.\n\n","type":"Messenger.Base.Env cdata userdata -> Messenger.Base.WorldEvent -> List.List (Messenger.Component.Component.AbstractComponent cdata userdata tar msg bdata scenemsg) -> ( List.List (Messenger.Component.Component.AbstractComponent cdata userdata tar msg bdata scenemsg), List.List (Messenger.GeneralModel.MsgBase msg (Messenger.Scene.Scene.SceneOutputMsg scenemsg userdata)), ( Messenger.Base.Env cdata userdata, Basics.Bool ) )"},{"name":"updateComponentsWithTarget","comment":" updateComponentsWithTarget\n\nUpdate a list of abstract user components with targeted msgs.\n\n","type":"Messenger.Base.Env cdata userdata -> List.List (Messenger.GeneralModel.Msg tar msg (Messenger.Scene.Scene.SceneOutputMsg scenemsg userdata)) -> List.List (Messenger.Component.Component.AbstractComponent cdata userdata tar msg bdata scenemsg) -> ( List.List (Messenger.Component.Component.AbstractComponent cdata userdata tar msg bdata scenemsg), List.List (Messenger.GeneralModel.MsgBase msg (Messenger.Scene.Scene.SceneOutputMsg scenemsg userdata)), Messenger.Base.Env cdata userdata )"},{"name":"viewComponents","comment":" viewComponents\n\nView one list of abstract components.\n\nUsed when there is only one list of components\n\n","type":"Messenger.Base.Env cdata userdata -> List.List (Messenger.Component.Component.AbstractComponent cdata userdata tar msg bdata scenemsg) -> Canvas.Renderable"},{"name":"viewComponentsRenderList","comment":" view the render list of components\n\nUseful when there are several component lists\n\nthe input should be generated by several `genComponentsRenderList`\n\n","type":"List.List ( Canvas.Renderable, Basics.Int ) -> Canvas.Renderable"}],"binops":[]},{"name":"Messenger.Component.PortableComponent","comment":"\n\n\n## Portable components\n\nThese are components that might be provided by an elm package.\n\nThere are some limitations for portable components:\n\n  - They don't have the base data\n  - They cannot get the common data\n  - They cannot change scene\n  - You need to set the msg and target type for every dependent portable component\n  - You need to provide a codec in the layer to translate the messages and targets\n\nA concrete portable component can generate two kinds of abstract component: **Specific Component** or **General Portable Component**.\n\n@docs ConcretePortableComponent\n@docs PortableMsgCodec\n@docs PortableTarCodec\n\n\n### Specific Component\n\nYou can generate a general type of component from a concrete portable component, which means you can manage this component with a\nlist of user components.\n\n@docs genPortableComponentSpecific\n@docs translatePortableComponentSpecific\n\n\n### General Portable Component\n\nYou can generate a component in specific type from a concrete portable component, which means you can manage this component in a\nlist for all general portable components generated in this type.\n\n**You should update this type of components by using specialized function provided.**\n\n@docs AbstractGeneralPortableComponent\n@docs genPortableComponentGeneral\n@docs translatePortableComponentGeneral\n@docs updatePortableComponents, updatePortableComponentsWithTarget\n\n\n# Type sugar\n\n@docs PortableComponentInit, PortableComponentUpdate, PortableComponentUpdateRec, PortableComponentView\n@docs PortableComponentStorageSpecific, PortableComponentStorageGeneral\n\n","unions":[],"aliases":[{"name":"AbstractGeneralPortableComponent","comment":" AbstractPortableComponent\n\nAbstract General Portable Component with common data, base data, and scene msg set to unit type.\n\nThis means you cannot send scene msg from a portable component. And you cannot put a general portable\ncomponent in a list of other user components.\n\n","args":["userdata","tar","msg"],"type":"Messenger.Component.Component.AbstractComponent () userdata tar msg () ()"},{"name":"ConcretePortableComponent","comment":" ConcretePortableComponent\n\nUsed when createing a portable component.\n\nUse `translatePortableComponent` to create a `ConcreteUserComponent` from a `ConcretePortableComponent`.\n\nThe `scenemsg` type is replaced by `()` because you cannot send changescene message.\n\n","args":["data","userdata","tar","msg"],"type":"{ init : Messenger.Component.PortableComponent.PortableComponentInit userdata msg data, update : Messenger.Component.PortableComponent.PortableComponentUpdate data userdata tar msg, updaterec : Messenger.Component.PortableComponent.PortableComponentUpdateRec data userdata tar msg, view : Messenger.Component.PortableComponent.PortableComponentView userdata data, matcher : Messenger.GeneralModel.Matcher data tar }"},{"name":"PortableComponentInit","comment":" Portable component init type sugar\n","args":["userdata","msg","data"],"type":"Messenger.Base.Env () userdata -> msg -> data"},{"name":"PortableComponentStorageGeneral","comment":" Portable component storage as general portable component type sugar\n","args":["cdata","userdata","tar","msg","gtar","gmsg"],"type":"Messenger.Component.PortableComponent.PortableTarCodec tar gtar -> Messenger.Component.PortableComponent.PortableMsgCodec msg gmsg -> Messenger.Base.Env cdata userdata -> gmsg -> Messenger.Component.PortableComponent.AbstractGeneralPortableComponent userdata gtar gmsg"},{"name":"PortableComponentStorageSpecific","comment":" Portable component storage as a specific component type sugar\n","args":["cdata","userdata","tar","msg","gtar","gmsg","bdata","scenemsg"],"type":"Messenger.Component.PortableComponent.PortableTarCodec tar gtar -> Messenger.Component.PortableComponent.PortableMsgCodec msg gmsg -> bdata -> Messenger.Base.Env cdata userdata -> gmsg -> Messenger.Component.Component.AbstractComponent cdata userdata gtar gmsg bdata scenemsg"},{"name":"PortableComponentUpdate","comment":" Portable component update type sugar\n","args":["data","userdata","tar","msg"],"type":"Messenger.Base.Env () userdata -> Messenger.Base.WorldEvent -> data -> ( data, List.List (Messenger.GeneralModel.Msg tar msg (Messenger.Scene.Scene.SceneOutputMsg () userdata)), ( Messenger.Base.Env () userdata, Basics.Bool ) )"},{"name":"PortableComponentUpdateRec","comment":" Portable component updaterec type sugar\n","args":["data","userdata","tar","msg"],"type":"Messenger.Base.Env () userdata -> msg -> data -> ( data, List.List (Messenger.GeneralModel.Msg tar msg (Messenger.Scene.Scene.SceneOutputMsg () userdata)), Messenger.Base.Env () userdata )"},{"name":"PortableComponentView","comment":" Portable component view type sugar\n","args":["userdata","data"],"type":"Messenger.Base.Env () userdata -> data -> ( Canvas.Renderable, Basics.Int )"},{"name":"PortableMsgCodec","comment":" Portable Component Message Codec\n","args":["specificmsg","generalmsg"],"type":"{ encode : generalmsg -> specificmsg, decode : specificmsg -> generalmsg }"},{"name":"PortableTarCodec","comment":" Portable Component Target Codec\n","args":["specifictar","generaltar"],"type":"{ encode : generaltar -> specifictar, decode : specifictar -> generaltar }"}],"values":[{"name":"genPortableComponentGeneral","comment":" genPortableComponentGeneral\n\nGenerate abstract component in general portable type from concrete component.\n\n**you don't need to give a Env without commondata**\n\n","type":"Messenger.Component.PortableComponent.ConcretePortableComponent data userdata tar msg -> Messenger.Component.PortableComponent.PortableTarCodec tar gtar -> Messenger.Component.PortableComponent.PortableMsgCodec msg gmsg -> Messenger.Base.Env cdata userdata -> gmsg -> Messenger.Component.PortableComponent.AbstractGeneralPortableComponent userdata gtar gmsg"},{"name":"genPortableComponentSpecific","comment":" genPortableComponentSpecific\n\nGenerate abstract component in a specific component type from concrete component.\n\n","type":"Messenger.Component.PortableComponent.ConcretePortableComponent data userdata tar msg -> Messenger.Component.PortableComponent.PortableTarCodec tar gtar -> Messenger.Component.PortableComponent.PortableMsgCodec msg gmsg -> bdata -> Messenger.Base.Env cdata userdata -> gmsg -> Messenger.Component.Component.AbstractComponent cdata userdata gtar gmsg bdata scenemsg"},{"name":"translatePortableComponentGeneral","comment":" Translate a `ConcretePortableComponent` to a special kind of `ConcreteUserComponent`.\n**Then you should treat it as a general portable component, in the same type of other general portable components **\n\nThis will add an empty basedata (unit) when init and upcast target and messages to the generalized type.\n\nThe commondata and scenemsg will also be set to unit type.\n\n","type":"Messenger.Component.PortableComponent.ConcretePortableComponent data userdata tar msg -> Messenger.Component.PortableComponent.PortableTarCodec tar gtar -> Messenger.Component.PortableComponent.PortableMsgCodec msg gmsg -> Messenger.Component.Component.ConcreteUserComponent data () userdata gtar gmsg () ()"},{"name":"translatePortableComponentSpecific","comment":" Translate a `ConcretePortableComponent` to a specific `ConcreteUserComponent`.\n**Then you can treat it as a normal component in the declared type**\n\nThis will add an empty basedata provided when init and upcast target and messages to the generalized type.\n\nYou should also pass CommonData and SceneMsg with any value, which means you just need to match the data type.\n\n","type":"Messenger.Component.PortableComponent.ConcretePortableComponent data userdata tar msg -> Messenger.Component.PortableComponent.PortableTarCodec tar gtar -> Messenger.Component.PortableComponent.PortableMsgCodec msg gmsg -> bdata -> Messenger.Component.Component.ConcreteUserComponent data cdata userdata gtar gmsg bdata scenemsg"},{"name":"updatePortableComponents","comment":" updatePortableComponents\n\nUpdate a list of abstract general portable components.\n\n**Use this function instead of updateComponents to update general portable components!**\n\n**you don't need to give a Env without commondata**\n\n","type":"Messenger.Base.Env cdata userdata -> Messenger.Base.WorldEvent -> List.List (Messenger.Component.PortableComponent.AbstractGeneralPortableComponent userdata tar msg) -> ( List.List (Messenger.Component.PortableComponent.AbstractGeneralPortableComponent userdata tar msg), List.List (Messenger.GeneralModel.MsgBase msg (Messenger.Scene.Scene.SceneOutputMsg scenemsg userdata)), ( Messenger.Base.Env cdata userdata, Basics.Bool ) )"},{"name":"updatePortableComponentsWithTarget","comment":" updatePortableComponentsWithTarget\n\nUpdate a list of abstract portable components with target msgs.\n\n**Use this function instead of updateComponentsWithTarget to update general portable components!**\n\n**you don't need to give a Env without commondata**\n\n","type":"Messenger.Base.Env cdata userdata -> List.List (Messenger.GeneralModel.Msg tar msg (Messenger.Scene.Scene.SceneOutputMsg () userdata)) -> List.List (Messenger.Component.PortableComponent.AbstractGeneralPortableComponent userdata tar msg) -> ( List.List (Messenger.Component.PortableComponent.AbstractGeneralPortableComponent userdata tar msg), List.List (Messenger.GeneralModel.MsgBase msg (Messenger.Scene.Scene.SceneOutputMsg scenemsg userdata)), Messenger.Base.Env cdata userdata )"}],"binops":[]},{"name":"Messenger.Coordinate.Coordinates","comment":"\n\n\n# Coordinate\n\nThis module deals with the coordinate transformation.\n\nThis module is very important because it can calculate the correct position of the point you want to draw.\n\n@docs fixedPosToReal\n@docs posToReal, posToVirtual\n@docs lengthToReal\n@docs fromRealLength\n@docs maxHandW\n@docs getStartPoint\n@docs judgeMouseRect\n@docs fromMouseToVirtual\n\n","unions":[],"aliases":[],"values":[{"name":"fixedPosToReal","comment":" fixedPosToReal\n\nSame as posToReal, but add the initial position of canvas.\n\n","type":"Messenger.Base.GlobalData a -> ( Basics.Float, Basics.Float ) -> ( Basics.Float, Basics.Float )"},{"name":"fromMouseToVirtual","comment":" fromMouseToVirtual\n","type":"Messenger.Base.GlobalData a -> ( Basics.Float, Basics.Float ) -> ( Basics.Float, Basics.Float )"},{"name":"fromRealLength","comment":" The inverse function of widthToReal.\n","type":"Messenger.Base.GlobalData a -> Basics.Float -> Basics.Float"},{"name":"getStartPoint","comment":" getStartPoint\n","type":"( Basics.Float, Basics.Float ) -> ( Basics.Float, Basics.Float ) -> ( Basics.Float, Basics.Float )"},{"name":"judgeMouseRect","comment":" judgeMouseRect\nJudge whether the mouse position is in the rectangle.\n","type":"( Basics.Float, Basics.Float ) -> ( Basics.Float, Basics.Float ) -> ( Basics.Float, Basics.Float ) -> Basics.Bool"},{"name":"lengthToReal","comment":" widthToReal\n\nUse this if you want to draw something based on the length.\n\n","type":"Messenger.Base.GlobalData a -> Basics.Float -> Basics.Float"},{"name":"maxHandW","comment":" maxHandW\n","type":"( Basics.Float, Basics.Float ) -> ( Basics.Float, Basics.Float ) -> ( Basics.Float, Basics.Float )"},{"name":"posToReal","comment":" posToReal\n\nTransform from the virtual coordinate system to the real pixel system.\n\n","type":"Messenger.Base.GlobalData a -> ( Basics.Float, Basics.Float ) -> ( Basics.Float, Basics.Float )"},{"name":"posToVirtual","comment":" Inverse of posToReal.\n","type":"Messenger.Base.GlobalData a -> ( Basics.Float, Basics.Float ) -> ( Basics.Float, Basics.Float )"}],"binops":[]},{"name":"Messenger.Coordinate.HTML","comment":"\n\n\n# HTML Coordinate Lib\n\nThis is only useful when you use extraHTML.\n\n@docs genAttribute\n\n","unions":[],"aliases":[],"values":[{"name":"genAttribute","comment":" Generate HTML Attributes that has the correct position\n\nUseful when you try to add extra HTML\n\n","type":"Messenger.Base.GlobalData a -> ( Basics.Float, Basics.Float ) -> ( Basics.Float, Basics.Float ) -> List.List (Html.Attribute msg)"}],"binops":[]},{"name":"Messenger.GeneralModel","comment":"\n\n\n# General Model\n\nGeneral model is designed to be an abstract interface of layers, components, etc..\n\nA Gernel model has the ability to:\n\n  - specialize its own data types\n  - share some data types with objects in the same type\n  - be initialized by some inputs\n  - be updated by event and msgs\n  - be updated in a list of same type objects\n  - send msg to the objects in the same type\n  - send msg to the parent object\n  - render itself\n  - identify itself by a matcher\n\n@docs Msg, MsgBase\n@docs ConcreteGeneralModel, AbstractGeneralModel\n@docs MConcreteGeneralModel, MAbstractGeneralModel\n@docs unroll, abstract\n@docs viewModelList\n@docs Matcher\n\n","unions":[{"name":"AbstractGeneralModel","comment":" Rolled Abstract General Model.\n\nCannot be directedly modified.\nUsed for storage.\n\n","args":["env","event","tar","msg","ren","bdata","sommsg"],"cases":[["Roll",["Messenger.GeneralModel.UnrolledAbstractGeneralModel env event tar msg ren bdata sommsg"]]]},{"name":"Msg","comment":" Msg\n\nThe Basic Msg Model.\n\nUsing **Other** when sending msg to objects in the same type.\nMake sure the `othertar` can pass the matcher of target object.\n\n","args":["othertar","msg","sommsg"],"cases":[["Parent",["Messenger.GeneralModel.MsgBase msg sommsg"]],["Other",["othertar","msg"]]]},{"name":"MsgBase","comment":" MsgBase\n\nUsed when sending a msg to parent object.\n\nUsing **SOMMsg** when sending a `SceneOutputMsg`, which will be directedly handled by Top-level.\n\n","args":["othermsg","sommsg"],"cases":[["SOMMsg",["sommsg"]],["OtherMsg",["othermsg"]]]}],"aliases":[{"name":"ConcreteGeneralModel","comment":" Concrete General Model.\n\nUsers deal with the fields in concrete model.\n\n","args":["data","env","event","tar","msg","ren","bdata","sommsg"],"type":"{ init : env -> msg -> ( data, bdata ), update : env -> event -> data -> bdata -> ( ( data, bdata ), List.List (Messenger.GeneralModel.Msg tar msg sommsg), ( env, Basics.Bool ) ), updaterec : env -> msg -> data -> bdata -> ( ( data, bdata ), List.List (Messenger.GeneralModel.Msg tar msg sommsg), env ), view : env -> data -> bdata -> ren, matcher : data -> bdata -> tar -> Basics.Bool }"},{"name":"MAbstractGeneralModel","comment":" Specialized Abstract Model for Messenger\n","args":["common","userdata","tar","msg","bdata","scenemsg"],"type":"Messenger.GeneralModel.AbstractGeneralModel (Messenger.Base.Env common userdata) Messenger.Base.WorldEvent tar msg Canvas.Renderable bdata (Messenger.Scene.Scene.SceneOutputMsg scenemsg userdata)"},{"name":"MConcreteGeneralModel","comment":" Specialized Concrete Model for Messenger\n","args":["data","common","userdata","tar","msg","bdata","scenemsg"],"type":"Messenger.GeneralModel.ConcreteGeneralModel data (Messenger.Base.Env common userdata) Messenger.Base.WorldEvent tar msg Canvas.Renderable bdata (Messenger.Scene.Scene.SceneOutputMsg scenemsg userdata)"},{"name":"Matcher","comment":" A general matcher type sugar\n","args":["data","tar"],"type":"data -> tar -> Basics.Bool"}],"values":[{"name":"abstract","comment":" Abstract a concrete model to an abstract model.\n\nInitialize it with env and msg.\n\n","type":"Messenger.GeneralModel.ConcreteGeneralModel data env event tar msg ren bdata sommsg -> env -> msg -> Messenger.GeneralModel.AbstractGeneralModel env event tar msg ren bdata sommsg"},{"name":"unroll","comment":" Unroll a rolled abstract model.\n","type":"Messenger.GeneralModel.AbstractGeneralModel env event tar msg ren bdata sommsg -> Messenger.GeneralModel.UnrolledAbstractGeneralModel env event tar msg ren bdata sommsg"},{"name":"viewModelList","comment":" View model list.\n","type":"Messenger.Base.Env common userdata -> List.List (Messenger.GeneralModel.MAbstractGeneralModel common userdata tar msg bdata scenemsg) -> List.List Canvas.Renderable"}],"binops":[]},{"name":"Messenger.Layer.Layer","comment":"\n\n\n# Layer\n\nGerneral Model and Helper functions for Layers.\n\n@docs ConcreteLayer, AbstractLayer\n\n\n## Generate\n\n@docs genLayer\n\n\n## Update\n\n@docs BasicUpdater, Distributor, Handler\n@docs handleComponentMsgs\n@docs LayerInit, LayerUpdate, LayerUpdateRec, LayerView\n@docs LayerStorage\n\n","unions":[],"aliases":[{"name":"AbstractLayer","comment":" Abstract Layer Model.\n\nCannot be directedly modified.\nUsed for storage.\n\n","args":["cdata","userdata","tar","msg","scenemsg"],"type":"Messenger.GeneralModel.MAbstractGeneralModel cdata userdata tar msg () scenemsg"},{"name":"BasicUpdater","comment":" Basic Update Type\n\nA basic updater type used to update the basic data of the layer with event.\n\nUsers can use it as the first step of the update process\n\n","args":["data","cdata","userdata","tar","msg","scenemsg"],"type":"Messenger.Base.Env cdata userdata -> Messenger.Base.WorldEvent -> data -> ( data, List.List (Messenger.GeneralModel.Msg tar msg (Messenger.Scene.Scene.SceneOutputMsg scenemsg userdata)), ( Messenger.Base.Env cdata userdata, Basics.Bool ) )"},{"name":"ConcreteLayer","comment":" Concrete Layer Model\n\nUsers deal with the fields in concrete model.\n\n","args":["data","cdata","userdata","tar","msg","scenemsg"],"type":"{ init : Messenger.Layer.Layer.LayerInit cdata userdata msg data, update : Messenger.Layer.Layer.LayerUpdate cdata userdata tar msg scenemsg data, updaterec : Messenger.Layer.Layer.LayerUpdateRec cdata userdata tar msg scenemsg data, view : Messenger.Layer.Layer.LayerView cdata userdata data, matcher : Messenger.GeneralModel.Matcher data tar }"},{"name":"Distributor","comment":" Distributor Type\n\nA distributor is used to generate several list of Component Msgs for corresponding components list.\n\nThe `cmsgpacker` is a custom type to store the component msgs and their targets.\n\n","args":["data","cdata","userdata","tar","msg","scenemsg","cmsgpacker"],"type":"Messenger.Base.Env cdata userdata -> Messenger.Base.WorldEvent -> data -> ( data, ( List.List (Messenger.GeneralModel.Msg tar msg (Messenger.Scene.Scene.SceneOutputMsg scenemsg userdata)), cmsgpacker ), Messenger.Base.Env cdata userdata )"},{"name":"Handler","comment":" Handler Type\n\nA handler is used to handle the Component Msg sent to the layer.\n\n**Make handler for every type of component msg**\n\n","args":["data","cdata","userdata","tar","msg","scenemsg","cmsg"],"type":"Messenger.Base.Env cdata userdata -> Messenger.GeneralModel.MsgBase cmsg (Messenger.Scene.Scene.SceneOutputMsg scenemsg userdata) -> data -> ( data, List.List (Messenger.GeneralModel.Msg tar msg (Messenger.Scene.Scene.SceneOutputMsg scenemsg userdata)), Messenger.Base.Env cdata userdata )"},{"name":"LayerInit","comment":" init type sugar\n","args":["cdata","userdata","msg","data"],"type":"Messenger.Base.Env cdata userdata -> msg -> data"},{"name":"LayerStorage","comment":" Layer Storage\n","args":["cdata","userdata","tar","msg","scenemsg"],"type":"Messenger.Base.Env cdata userdata -> msg -> Messenger.Layer.Layer.AbstractLayer cdata userdata tar msg scenemsg"},{"name":"LayerUpdate","comment":" update type sugar\n","args":["cdata","userdata","tar","msg","scenemsg","data"],"type":"Messenger.Base.Env cdata userdata -> Messenger.Base.WorldEvent -> data -> ( data, List.List (Messenger.GeneralModel.Msg tar msg (Messenger.Scene.Scene.SceneOutputMsg scenemsg userdata)), ( Messenger.Base.Env cdata userdata, Basics.Bool ) )"},{"name":"LayerUpdateRec","comment":" updaterec type sugar\n","args":["cdata","userdata","tar","msg","scenemsg","data"],"type":"Messenger.Base.Env cdata userdata -> msg -> data -> ( data, List.List (Messenger.GeneralModel.Msg tar msg (Messenger.Scene.Scene.SceneOutputMsg scenemsg userdata)), Messenger.Base.Env cdata userdata )"},{"name":"LayerView","comment":" view type sugar\n","args":["cdata","userdata","data"],"type":"Messenger.Base.Env cdata userdata -> data -> Canvas.Renderable"}],"values":[{"name":"genLayer","comment":" Generate abstract layer by a concrete layer.\n\nInitialize it with env and msg.\n\n","type":"Messenger.Layer.Layer.ConcreteLayer data cdata userdata tar msg scenemsg -> Messenger.Layer.Layer.LayerStorage cdata userdata tar msg scenemsg"},{"name":"handleComponentMsgs","comment":" Handle a list of component msgs\n\n**Note that for several list of component msgs with different types, you may have to use this function repeatedly**\n\n","type":"Messenger.Base.Env cdata userdata -> List.List (Messenger.GeneralModel.MsgBase cmsg (Messenger.Scene.Scene.SceneOutputMsg scenemsg userdata)) -> data -> List.List (Messenger.GeneralModel.Msg tar msg (Messenger.Scene.Scene.SceneOutputMsg scenemsg userdata)) -> Messenger.Layer.Layer.Handler data cdata userdata tar msg scenemsg cmsg -> ( data, List.List (Messenger.GeneralModel.Msg tar msg (Messenger.Scene.Scene.SceneOutputMsg scenemsg userdata)), Messenger.Base.Env cdata userdata )"}],"binops":[]},{"name":"Messenger.Recursion","comment":"\n\n\n# RecursionList\n\nList implementation for the recursion algorithm\n\n@docs updateObjects, updateObjectsWithTarget\n\n","unions":[],"aliases":[],"values":[{"name":"updateObjects","comment":" Recursively update all the objects in the List\n","type":"env -> event -> List.List (Messenger.GeneralModel.AbstractGeneralModel env event tar msg ren bdata sommsg) -> ( List.List (Messenger.GeneralModel.AbstractGeneralModel env event tar msg ren bdata sommsg), List.List (Messenger.GeneralModel.MsgBase msg sommsg), ( env, Basics.Bool ) )"},{"name":"updateObjectsWithTarget","comment":" Recursively update all the objects in the List, but also uses target\n","type":"env -> List.List (Messenger.GeneralModel.Msg tar msg sommsg) -> List.List (Messenger.GeneralModel.AbstractGeneralModel env event tar msg ren bdata sommsg) -> ( List.List (Messenger.GeneralModel.AbstractGeneralModel env event tar msg ren bdata sommsg), List.List (Messenger.GeneralModel.MsgBase msg sommsg), env )"}],"binops":[]},{"name":"Messenger.Render.Shape","comment":"\n\n\n# Shape Rendering\n\n@docs circle, rect\n\n","unions":[],"aliases":[],"values":[{"name":"circle","comment":" Draw circle based on global dataa.\n","type":"Messenger.Base.GlobalData a -> ( Basics.Float, Basics.Float ) -> Basics.Float -> Canvas.Shape"},{"name":"rect","comment":" Draw rectangle based on global dataa.\n","type":"Messenger.Base.GlobalData a -> ( Basics.Float, Basics.Float ) -> ( Basics.Float, Basics.Float ) -> Canvas.Shape"}],"binops":[]},{"name":"Messenger.Render.Sprite","comment":"\n\n\n# Sprite Rendering\n\n@docs renderSprite, renderSpriteWithRev\n@docs renderSpriteCropped\n\n","unions":[],"aliases":[],"values":[{"name":"renderSprite","comment":" Render a single sprite.\n","type":"Messenger.Base.GlobalData a -> List.List Canvas.Settings.Setting -> ( Basics.Float, Basics.Float ) -> ( Basics.Float, Basics.Float ) -> String.String -> Canvas.Renderable"},{"name":"renderSpriteCropped","comment":" Render a single sprite with crop.\n","type":"Messenger.Base.GlobalData a -> List.List Canvas.Settings.Setting -> ( Basics.Float, Basics.Float ) -> ( Basics.Float, Basics.Float ) -> { x : Basics.Float, y : Basics.Float, width : Basics.Float, height : Basics.Float } -> String.String -> Canvas.Renderable"},{"name":"renderSpriteWithRev","comment":" renderSpriteWithRev\n\nRender a single sprite with (possible) reverse.\n\nThe first argument is the reverse flag. Sent true to make the sprite being rendered in reverse.\n\n","type":"Basics.Bool -> Messenger.Base.GlobalData a -> List.List Canvas.Settings.Setting -> ( Basics.Float, Basics.Float ) -> ( Basics.Float, Basics.Float ) -> String.String -> Canvas.Renderable"}],"binops":[]},{"name":"Messenger.Render.SpriteSheet","comment":"\n\n\n# Sprite Sheet\n\n@docs SingleSprite\n@docs SpriteSheet\n\n","unions":[],"aliases":[{"name":"SingleSprite","comment":" A Single Sprite in a SpriteSheet\n\nThe unit of realSize is pixel.\n\n","args":[],"type":"{ realStartPoint : ( Basics.Float, Basics.Float ), realSize : ( Basics.Float, Basics.Float ) }"},{"name":"SpriteSheet","comment":" SpriteSheet\n\nUsers should both name the sprite sheets and every single sprite.\nUsing it by **format: \"sheet\\_name.sprite\\_name\"**\n\nSprite sheets are useful when managing the art resourses or making frame-by-frame animations.\n\n","args":[],"type":"Dict.Dict String.String (List.List ( String.String, Messenger.Render.SpriteSheet.SingleSprite ))"}],"values":[],"binops":[]},{"name":"Messenger.Render.Text","comment":"\n\n\n# Text Rendering\n\n@docs renderText, renderTextWithStyle\n@docs renderTextWithColor, renderTextWithColorStyle\n@docs renderTextWithColorCenter, renderTextWithColorCenterStyle\n@docs renderTextWithColorAlignBaseline, renderTextWithColorAlignBaselineStyle\n@docs renderTextWithSettings, renderTextWithSettingsStyle\n\n","unions":[],"aliases":[],"values":[{"name":"renderText","comment":" Render Text. Black color, left top align.\n","type":"Messenger.Base.GlobalData a -> Basics.Float -> String.String -> String.String -> ( Basics.Float, Basics.Float ) -> Canvas.Renderable"},{"name":"renderTextWithColor","comment":" renderTextWithColor\nRender colorful texts.\n","type":"Messenger.Base.GlobalData a -> Basics.Float -> String.String -> String.String -> Color.Color -> ( Basics.Float, Basics.Float ) -> Canvas.Renderable"},{"name":"renderTextWithColorAlignBaseline","comment":" Render texts with color, align and baseline.\n","type":"Messenger.Base.GlobalData a -> Basics.Float -> String.String -> String.String -> Color.Color -> Canvas.Settings.Text.TextAlign -> Canvas.Settings.Text.TextBaseLine -> ( Basics.Float, Basics.Float ) -> Canvas.Renderable"},{"name":"renderTextWithColorAlignBaselineStyle","comment":" Render texts with color, align and baseline.\n","type":"Messenger.Base.GlobalData a -> Basics.Float -> String.String -> String.String -> Color.Color -> Canvas.Settings.Text.TextAlign -> Canvas.Settings.Text.TextBaseLine -> String.String -> ( Basics.Float, Basics.Float ) -> Canvas.Renderable"},{"name":"renderTextWithColorCenter","comment":" renderTextWithColorAlign\nRender texts with color and align.\n","type":"Messenger.Base.GlobalData a -> Basics.Float -> String.String -> String.String -> Color.Color -> ( Basics.Float, Basics.Float ) -> Canvas.Renderable"},{"name":"renderTextWithColorCenterStyle","comment":" renderTextWithColorAlign\nRender texts with color and align.\n","type":"Messenger.Base.GlobalData a -> Basics.Float -> String.String -> String.String -> Color.Color -> String.String -> ( Basics.Float, Basics.Float ) -> Canvas.Renderable"},{"name":"renderTextWithColorStyle","comment":" renderTextWithColor\nRender colorful texts.\n","type":"Messenger.Base.GlobalData a -> Basics.Float -> String.String -> String.String -> Color.Color -> String.String -> ( Basics.Float, Basics.Float ) -> Canvas.Renderable"},{"name":"renderTextWithSettings","comment":" Use customized settings to render texts.\n","type":"Messenger.Base.GlobalData a -> Basics.Float -> String.String -> String.String -> List.List Canvas.Settings.Setting -> ( Basics.Float, Basics.Float ) -> Canvas.Renderable"},{"name":"renderTextWithSettingsStyle","comment":" Use customized settings to render texts.\n","type":"Messenger.Base.GlobalData a -> Basics.Float -> String.String -> String.String -> List.List Canvas.Settings.Setting -> String.String -> ( Basics.Float, Basics.Float ) -> Canvas.Renderable"},{"name":"renderTextWithStyle","comment":" Render Text. Black color, left top align.\n","type":"Messenger.Base.GlobalData a -> Basics.Float -> String.String -> String.String -> String.String -> ( Basics.Float, Basics.Float ) -> Canvas.Renderable"}],"binops":[]},{"name":"Messenger.Scene.LayeredScene","comment":"\n\n\n# Layered Scene\n\nLayered scene is a pre-defined scene implementation provided by Messenger.\nA layered scene can only handle a list of layers with fixed `cdata`, `userdata`, `tar`, `msg` and `scenemsg` types.\n\n@docs LayeredSceneData\n@docs genLayeredScene\n@docs LayeredSceneInit, LayeredSceneSettingsFunc\n\n","unions":[],"aliases":[{"name":"LayeredSceneData","comment":" LayeredSceneData\n\n    - `renderSettings` is used in `group` while viewing the layers as a whole\n    - `commonData` is the common data for the whole scene\n    - `layers` are the layers of the scene with type `AbstractLayer`\n\n","args":["cdata","userdata","tar","msg","scenemsg"],"type":"{ renderSettings : List.List Canvas.Settings.Setting, commonData : cdata, layers : List.List (Messenger.Layer.Layer.AbstractLayer cdata userdata tar msg scenemsg) }"},{"name":"LayeredSceneInit","comment":" init type sugar\n","args":["cdata","userdata","tar","msg","scenemsg"],"type":"Messenger.Base.Env () userdata -> Maybe.Maybe scenemsg -> Messenger.Scene.LayeredScene.LayeredSceneData cdata userdata tar msg scenemsg"},{"name":"LayeredSceneSettingsFunc","comment":" settingsFunc type sugar\n","args":["cdata","userdata","tar","msg","scenemsg"],"type":"Messenger.Base.Env () userdata -> Messenger.Base.WorldEvent -> Messenger.Scene.LayeredScene.LayeredSceneData cdata userdata tar msg scenemsg -> List.List Canvas.Settings.Setting"}],"values":[{"name":"genLayeredScene","comment":" genLayeredScene\n\nThis creates a layered scene.\n\n  - `init` creates the initial layered scene from env data and init msg.\n  - `settingsFunc` is a user provided function to modify `renderSettings` each time the scene updates. If you don't need `settingsFunc`, simply provide a `func _ _ _ = settings`\n\n","type":"Messenger.Scene.LayeredScene.LayeredSceneInit cdata userdata tar msg scenemsg -> Messenger.Scene.LayeredScene.LayeredSceneSettingsFunc cdata userdata tar msg scenemsg -> Messenger.Scene.Scene.SceneStorage userdata scenemsg"}],"binops":[]},{"name":"Messenger.Scene.RawScene","comment":"\n\n\n# RawScene\n\nRaw Scene is a scene without anything. Users can add whatever they like in the raw scene!\n\n@docs RawSceneInit, RawSceneUpdate, RawSceneView\n@docs genRawScene\n\n","unions":[],"aliases":[{"name":"RawSceneInit","comment":" init type sugar\n","args":["data","userdata","scenemsg"],"type":"Messenger.Base.Env () userdata -> Maybe.Maybe scenemsg -> data"},{"name":"RawSceneUpdate","comment":" update type sugar\n","args":["data","userdata","scenemsg"],"type":"Messenger.Base.Env () userdata -> Messenger.Base.WorldEvent -> data -> ( data, List.List (Messenger.Scene.Scene.SceneOutputMsg scenemsg userdata), Messenger.Base.Env () userdata )"},{"name":"RawSceneView","comment":" view type sugar\n","args":["userdata","data"],"type":"Messenger.Base.Env () userdata -> data -> Canvas.Renderable"}],"values":[{"name":"genRawScene","comment":" generate a raw scene from a concrete scene\n","type":"Messenger.Scene.Scene.MConcreteScene data userdata scenemsg -> Messenger.Scene.Scene.SceneStorage userdata scenemsg"}],"binops":[]},{"name":"Messenger.Scene.Scene","comment":"\n\n\n# Scene Base\n\nGerneral Model and Basic types for Scenes\n\n@docs AbstractScene\n@docs MConcreteScene, MAbstractScene\n@docs unroll, abstract\n@docs SceneOutputMsg\n@docs SceneStorage, AllScenes\n\n","unions":[{"name":"AbstractScene","comment":" Rolled Abstract Scene Model.\n\nCannot be directedly modified.\nUsed for storage.\n\n","args":["env","event","ren","scenemsg","userdata"],"cases":[["Roll",["Messenger.Scene.Scene.UnrolledAbstractScene env event ren scenemsg userdata"]]]},{"name":"SceneOutputMsg","comment":" Scene Output Msg\n\nScene Output Msg is the Msg that directedly handled by Top-level.\n\n`scenemsg` is a custom type which represents the message type users wants\nto send to a scene when switching scenes.\n\n  - `SOMChangeScene` is used to change to a target scene by giving a **(initMsg, name, trasition)**\n  - `SOMPlayAudio` is used to play an audio resourse by giving **name url option**\n  - `SOMStopAudio` is used to stop a playing audio by giving its **name**\n  - `SOMSetVolume` is used to set the volume with a value **from 0 to 1**\n  - `SOMAlert` makes an alert\n  - `SOMPromp` makes a prompt with **name title**\n  - `SOMSaveUserData` saves the userdata by encode funtion given in UserUonfig\n\n","args":["scenemsg","userdata"],"cases":[["SOMChangeScene",["( Maybe.Maybe scenemsg, String.String, Maybe.Maybe (Messenger.Scene.Transitions.Base.Transition userdata) )"]],["SOMPlayAudio",["String.String","String.String","Messenger.Audio.Base.AudioOption"]],["SOMAlert",["String.String"]],["SOMStopAudio",["String.String"]],["SOMSetVolume",["Basics.Float"]],["SOMPrompt",["String.String","String.String"]],["SOMSaveUserData",[]]]}],"aliases":[{"name":"AllScenes","comment":" AllScenes\n","args":["userdata","scenemsg"],"type":"List.List ( String.String, Messenger.Scene.Scene.SceneStorage userdata scenemsg )"},{"name":"MAbstractScene","comment":" Specialized Abstract scene for Messenger\n","args":["userdata","scenemsg"],"type":"Messenger.Scene.Scene.AbstractScene (Messenger.Base.Env () userdata) Messenger.Base.WorldEvent Canvas.Renderable scenemsg userdata"},{"name":"MConcreteScene","comment":" Specialized Concrete scene for Messenger\n","args":["data","userdata","scenemsg"],"type":"Messenger.Scene.Scene.ConcreteScene data (Messenger.Base.Env () userdata) Messenger.Base.WorldEvent Canvas.Renderable scenemsg userdata"},{"name":"SceneStorage","comment":" SceneStorage\n\nThe type used to store the scene data\n\n","args":["userdata","scenemsg"],"type":"Messenger.Base.Env () userdata -> Maybe.Maybe scenemsg -> Messenger.Scene.Scene.MAbstractScene userdata scenemsg"}],"values":[{"name":"abstract","comment":" Abstract a concrete scene to an abstract scene.\n\nInitialize it with env and msg.\n\n","type":"Messenger.Scene.Scene.ConcreteScene data env event ren scenemsg userdata -> env -> Maybe.Maybe scenemsg -> Messenger.Scene.Scene.AbstractScene env event ren scenemsg userdata"},{"name":"unroll","comment":" Unroll a rolled abstract scene.\n","type":"Messenger.Scene.Scene.AbstractScene env event ren scenemsg userdata -> Messenger.Scene.Scene.UnrolledAbstractScene env event ren scenemsg userdata"}],"binops":[]},{"name":"Messenger.Scene.Transition","comment":"\n\n\n# Transtition Library\n\n@docs makeTransition\n\n","unions":[],"aliases":[],"values":[{"name":"makeTransition","comment":" Generate transition from transition data\n","type":"Messenger.Base.GlobalData a -> Maybe.Maybe (Messenger.Scene.Transitions.Base.Transition a) -> Canvas.Renderable -> Canvas.Renderable"}],"binops":[]},{"name":"Messenger.Scene.Transitions.Base","comment":"\n\n\n# Transition Base\n\n@docs Transition, SingleTrans\n@docs genTransition, nullTransition\n\n","unions":[],"aliases":[{"name":"SingleTrans","comment":" Single Transition\n","args":["ls"],"type":"Messenger.Base.GlobalData ls -> Canvas.Renderable -> Basics.Float -> Canvas.Renderable"},{"name":"Transition","comment":" Transition has three stages:\n\n1.  From the old scene to the transition scene\n2.  Transition scene\n3.  From the transition scene to the new scene\n\n","args":["ls"],"type":"{ currentTransition : Basics.Int, outT : Basics.Int, inT : Basics.Int, fadeout : Messenger.Scene.Transitions.Base.SingleTrans ls, fadein : Messenger.Scene.Transitions.Base.SingleTrans ls }"}],"values":[{"name":"genTransition","comment":" Generate new transition\n","type":"Basics.Int -> Basics.Int -> Messenger.Scene.Transitions.Base.SingleTrans ls -> Messenger.Scene.Transitions.Base.SingleTrans ls -> Messenger.Scene.Transitions.Base.Transition ls"},{"name":"nullTransition","comment":" Null Transition\n","type":"Messenger.Base.GlobalData ls -> Canvas.Renderable -> Basics.Float -> Canvas.Renderable"}],"binops":[]},{"name":"Messenger.Scene.Transitions.Fade","comment":" Fading Effects\n\n@docs fadeIn, fadeOut\n@docs fadeOutBlack, fadeInBlack\n@docs fadeOutWithRenderable, fadeInWithRenderable\n\n","unions":[],"aliases":[],"values":[{"name":"fadeIn","comment":" Fade In with Color\n","type":"Color.Color -> Messenger.Base.GlobalData ls -> Canvas.Renderable -> Basics.Float -> Canvas.Renderable"},{"name":"fadeInBlack","comment":" Fade In with Black\n","type":"Messenger.Scene.Transitions.Base.SingleTrans ls"},{"name":"fadeInWithRenderable","comment":" Fade In with Renderable\n","type":"Canvas.Renderable -> Messenger.Base.GlobalData ls -> Canvas.Renderable -> Basics.Float -> Canvas.Renderable"},{"name":"fadeOut","comment":" Fade Out with Color\n","type":"Color.Color -> Messenger.Base.GlobalData ls -> Canvas.Renderable -> Basics.Float -> Canvas.Renderable"},{"name":"fadeOutBlack","comment":" Fade Out with Black\n","type":"Messenger.Scene.Transitions.Base.SingleTrans ls"},{"name":"fadeOutWithRenderable","comment":" Fade Out with Renderable\n","type":"Canvas.Renderable -> Messenger.Base.GlobalData ls -> Canvas.Renderable -> Basics.Float -> Canvas.Renderable"}],"binops":[]},{"name":"Messenger.Scene.Transitions.Scroll","comment":" Scroll Transition\n\n@docs scrollIn, scrollOut\n\n","unions":[],"aliases":[],"values":[{"name":"scrollIn","comment":" Scroll In\n","type":"Color.Color -> Messenger.Base.GlobalData ls -> Canvas.Renderable -> Basics.Float -> Canvas.Renderable"},{"name":"scrollOut","comment":" Scroll Out\n","type":"Color.Color -> Messenger.Base.GlobalData ls -> Canvas.Renderable -> Basics.Float -> Canvas.Renderable"}],"binops":[]},{"name":"Messenger.UI","comment":"\n\n\n# User Interface\n\nTop-level user interface to the Messenger engine.\n\n@docs Input, Output\n@docs genMain\n\n","unions":[],"aliases":[{"name":"Input","comment":" The input to the Messenger UI.\n","args":["userdata","scenemsg"],"type":"{ config : Messenger.UserConfig.UserConfig userdata scenemsg, allScenes : Messenger.Scene.Scene.AllScenes userdata scenemsg }"},{"name":"Output","comment":" The output of the Messenger UI.\n","args":["userdata","scenemsg"],"type":"Platform.Program Messenger.Base.Flags (Audio.Model Messenger.Base.WorldEvent (Messenger.Model.Model userdata scenemsg)) (Audio.Msg Messenger.Base.WorldEvent)"}],"values":[{"name":"genMain","comment":" Generate the main program (output) from input.\n\n**Use this for your main function**\n\n","type":"Messenger.UI.Input userdata scenemsg -> Messenger.UI.Output userdata scenemsg"}],"binops":[]},{"name":"Messenger.UserConfig","comment":"\n\n\n# User Configuration\n\n@docs UserConfig, PortDefs\n@docs coloredBackground, transparentBackground\n\n","unions":[],"aliases":[{"name":"PortDefs","comment":" The ports that the user must provide to the messenger.\n\n**Learn more about ports [here](https://guide.elm-lang.org/interop/ports)**\n\n","args":[],"type":"{ sendInfo : String.String -> Platform.Cmd.Cmd Messenger.Base.WorldEvent, audioPortToJS : Json.Encode.Value -> Platform.Cmd.Cmd (Audio.Msg Messenger.Base.WorldEvent), audioPortFromJS : (Json.Decode.Value -> Audio.Msg Messenger.Base.WorldEvent) -> Platform.Sub.Sub (Audio.Msg Messenger.Base.WorldEvent), alert : String.String -> Platform.Cmd.Cmd Messenger.Base.WorldEvent, prompt : { name : String.String, title : String.String } -> Platform.Cmd.Cmd Messenger.Base.WorldEvent, promptReceiver : ({ name : String.String, result : String.String } -> Messenger.Base.WorldEvent) -> Platform.Sub.Sub Messenger.Base.WorldEvent }"},{"name":"UserConfig","comment":" User Configuration for the messenger.\n\n`userdata` is a custom type which can store any data in the game.\nusers can **save their own global data** and **implement local storage** here.\n\n`scenemsg` is another custom type which represents the message type users wants\nto send to a scene when switching scenes.\n\n  - `initScene` represents the scene users get start\n  - `initSceneMsg` represents the message to initialize the start scene\n  - `globalDataCodec` is for local storage, users can encode the any data in global data\n    and user data to storage them, and decode them when reopen the game.\n    This globalData is a subset of the real global data, removing all internal data structures\n  - `virtualSize` represents how users want their game be virtual sized. In other words,\n    users make their game in the virtual size, and the game will be resized due to the browser window size\n    but keeping the aspect ratio\n  - `debug` option determines whether enable some simple debugging tools or not\n    remember to disable it when releasing game\n  - `background` determines the background of the game\n    transparent background and colored background is already prepared\n  - `allTexture` stores all the texture assets users will use in the game. the path is based on the project folder.\n    **format: (name, path)**\n  - `allSpriteSheets` stores all the sprite sheets users set for this game. users should both\n    name the sprite sheets and every single sprite. Using it by **format: \"sheet\\_name.sprite\\_name\"**\n    Sprite sheets are useful when managing the art recourses or making frame-by-frame animations\n  - `timeInterval` determines the highest fps of the game, representing the interval\n    between every two frames. More strictly speaking, it represents the interval between\n    every two **Tick** events\n  - `ports` stores the ports that users must provide.\n\n","args":["userdata","scenemsg"],"type":"{ initScene : String.String, initSceneMsg : Maybe.Maybe scenemsg, globalDataCodec : { encode : Messenger.Base.UserViewGlobalData userdata -> String.String, decode : String.String -> Messenger.Base.UserViewGlobalData userdata }, virtualSize : { width : Basics.Float, height : Basics.Float }, debug : Basics.Bool, background : Messenger.Base.GlobalData userdata -> Canvas.Renderable, allTexture : List.List ( String.String, String.String ), allSpriteSheets : Messenger.Render.SpriteSheet.SpriteSheet, timeInterval : Basics.Float, ports : Messenger.UserConfig.PortDefs }"}],"values":[{"name":"coloredBackground","comment":" A colored background.\n","type":"Color.Color -> Messenger.Base.GlobalData userdata -> Canvas.Renderable"},{"name":"transparentBackground","comment":" A transparent background. You should use this for release.\n","type":"Messenger.Base.GlobalData userdata -> Canvas.Renderable"}],"binops":[]}]