{"id":13687707,"url":"https://github.com/z0w0/helm","last_synced_at":"2025-10-21T13:39:51.659Z","repository":{"id":62436125,"uuid":"11231382","full_name":"z0w0/helm","owner":"z0w0","description":"A functionally reactive game engine, with headgear to protect you from the headache of game development provided.","archived":true,"fork":false,"pushed_at":"2018-12-01T21:50:12.000Z","size":505,"stargazers_count":598,"open_issues_count":23,"forks_count":69,"subscribers_count":36,"default_branch":"master","last_synced_at":"2024-04-27T02:43:56.788Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://helm-engine.org/","language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/z0w0.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2013-07-07T09:38:09.000Z","updated_at":"2024-03-12T15:17:38.000Z","dependencies_parsed_at":"2022-11-01T21:34:59.687Z","dependency_job_id":null,"html_url":"https://github.com/z0w0/helm","commit_stats":null,"previous_names":["switchface/helm"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/z0w0%2Fhelm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/z0w0%2Fhelm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/z0w0%2Fhelm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/z0w0%2Fhelm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/z0w0","download_url":"https://codeload.github.com/z0w0/helm/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224257961,"owners_count":17281808,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-02T15:00:59.145Z","updated_at":"2025-10-21T13:39:51.313Z","avatar_url":"https://github.com/z0w0.png","language":"Haskell","funding_links":[],"categories":["Haskell"],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"http://helm-engine.org\" title=\"Homepage\"\u003e\u003cimg src=\"http://helm-engine.org/img/logo-alt.png\" /\u003e\u003c/a\u003e\n  \u003cbr\u003e\n  \u003cbr\u003e\n  \u003ca href=\"https://circleci.com/gh/z0w0/helm\" title=\"CircleCI\"\u003e\u003cimg src=\"https://circleci.com/gh/z0w0/helm.svg?style=svg\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\nHelm is **currently looking for co-maintainers**. If you would like to help to develop Helm further, please contact me.\n\n## Introduction\n\nHelm is a purely functional game engine written in Haskell and built with\nthe [Elerea functionally-reactive programming framework](https://github.com/cobbpg/elerea)\nand [SDL2](https://www.libsdl.org/). Helm was originally inspired by the\n[Elm programming language](http://elm-lang.org).\n\nIn Helm, every piece of input that can be gathered from a user (or the operating system)\nis contained in a subscription, which is essentially \nas a collection of input events changing over time mapped to game interactions.\n\nThink of it this way - when you hold down the w and a keys, two keyboard events are being captured at every moment.\nYou might want your game to move your character forward by pressing `w`.\nWhen you add a subscription to your game, you choose how to map these two input events\ninto a game action type (which you provide, the engine doesn't have any concept\nof how the action works). So if you mapped the `w` key to some game action variant (game\nactions are usually represented as a collection of data type variants), and the `w` key was held down,\nthen at every game tick the game would produce a `w` key press event and turn this into\nthe relevant game action.\n\nOn top of subscriptions, Helm has another core concept called commands.\nCommands are essentially IO-like monads that have context about the engine state.\nLike subscriptions, commands are mapped directly to game actions. This\nmeans that when interacting with IO through Helm, you directly\nspecify how the result maps to a game action and allows you to make logical\nconclusions about how certain monadic results should interact with your game.\n\nHelm provides a structure familiar to MVC-based framework developers.\nThere is a model (which represents the state of your game), \na view of the current model (i.e. what's actually shown on the screen) and a function similiar\nto a controller that folds the model forward based off of input actions (which are in turn\nmapped to from subscription events).\n\nThis presents a powerful paradigm shift for game development. Instead of writing event listeners,\nHelm treats input events as first-class citizens of the type system, and the actual interaction\nbetween the game state and input events becomes immediately clearer.\n\n## Features\n\n* Interactions between input and game logic is made clear by events and game actions being treated\n  first-class by the engine\n* Color composition via `Helm.Color`\n* 2D vector graphics rendering via `Helm.Graphics2D`\n  * Advanced text rendering via `Helm.Graphics2D.Text`\n  * Matrix-based 2D transformations (for advanced techniques like skewing) via `Helm.Graphics2D.Transform`\n* Keyboard event interactions via `Helm.Keyboard`\n* Mouse event interactions via `Helm.Mouse`\n* Command-related utilities such as batching via `Helm.Cmd`\n* Subscription-related utilities, such as batching and lifting IO-likes via `Helm.Sub`\n* Time-based event interactions via `Helm.Time`\n* Window event interactions and other utilities via `Helm.Window`\n* The base functionality of Helm is separate from the backend engine implementation, so\n  custom media frameworks (which generally handle rendering, input, etc.) can be integrated\n  with Helm quite easily. At the moment, the only available implementation is SDL2\n  (which is currently bundled with the game engine) however the plan is to have more options in the future.\n\n## Installing and Building\n\nBefore you can use Helm, you'll to follow the\n[Gtk2Hs installation guide](https://wiki.haskell.org/Gtk2Hs/Installation)\n(which is required for the Haskell Cairo bindings). Additionally, Helm\nrequires a GHC version of 7.6 or higher.\n\nUsing [Stack](https://haskellstack.org) when working with Helm is recommended.\nTo install Helm with Stack, use:\n\n```\nstack install helm\n```\n\nIt's best to add Helm as a dependency in your game's Cabal file rather\nthan installing it globally, however if you're new to the engine, installing\nit globally will let you run the example Helm games. See the next section.\n\n## Getting Started\n\nCheck out the `examples` directory for some examples; the `hello` example is a\nparticularly good start and `flappy` is a bit more advanced. We could always\nuse more examples so if you end up making something cool and lightweight that\nyou'd think would be a good one, feel free to open a pull request!\n\nIf you have installed Helm globally using Stack, you can run the `flappy` example using:\n\n```\nstack exec helm-example-flappy\n```\n\nOr the `hello` example using:\n\n```\nstack exec helm-example-hello\n```\n\n## Documentation\n\nAPI documentation for the latest stable version of Helm is available on [Hackage](http://hackage.haskell.org/package/helm).\nAlternatively, if you've cloned this repo, you can build the documentation manually using Haddock.\n\n## License\n\nHelm is licensed under the MIT license. See the LICENSE file for more details.\n\n## Contributing\n\nHelm would benefit from either of the following contributions:\n\n1. Try out the engine, reporting any issues or suggestions you have.\n2. Look through the source, get a feel for the code and then\n   contribute some features or fixes. If you plan on contributing\n   code, please follow\n   [Johan Tibell's Haskell style guide](https://github.com/tibbe/haskell-style-guide/blob/master/haskell-style.md)\n   with the following exceptions:\n   * Up to 120 characters per line are allowed (widescreens for life).\n   * Use a two space indent.\n   * Acronyms in all caps for identifiers (while maintaing camel-case), i.e. SDL or 2D/3D.\n   \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fz0w0%2Fhelm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fz0w0%2Fhelm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fz0w0%2Fhelm/lists"}