{"id":25603111,"url":"https://github.com/divverent/aaaaxy","last_synced_at":"2026-02-09T09:15:30.500Z","repository":{"id":39094487,"uuid":"324191722","full_name":"divVerent/aaaaxy","owner":"divVerent","description":"A nonlinear 2D puzzle platformer taking place in impossible spaces.","archived":false,"fork":false,"pushed_at":"2025-04-03T18:05:32.000Z","size":51045,"stargazers_count":240,"open_issues_count":10,"forks_count":13,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-04-03T19:22:53.737Z","etag":null,"topics":["2d","game","game-development","impossible-spaces","jumpnrun","non-euclidean","puzzle","puzzle-game"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/divVerent.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-12-24T16:04:10.000Z","updated_at":"2025-04-01T06:56:34.000Z","dependencies_parsed_at":"2023-10-26T03:29:10.321Z","dependency_job_id":"578284d5-b033-4eb4-936a-935f332613ee","html_url":"https://github.com/divVerent/aaaaxy","commit_stats":{"total_commits":3435,"total_committers":5,"mean_commits":687.0,"dds":0.09810771470160118,"last_synced_commit":"918b1f1e89d5a091053215700a0d7481bc6b108c"},"previous_names":[],"tags_count":155,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/divVerent%2Faaaaxy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/divVerent%2Faaaaxy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/divVerent%2Faaaaxy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/divVerent%2Faaaaxy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/divVerent","download_url":"https://codeload.github.com/divVerent/aaaaxy/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248647249,"owners_count":21139081,"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":["2d","game","game-development","impossible-spaces","jumpnrun","non-euclidean","puzzle","puzzle-game"],"created_at":"2025-02-21T17:25:06.656Z","updated_at":"2026-02-09T09:15:30.410Z","avatar_url":"https://github.com/divVerent.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ![AAAAXY](https://divVerent.github.io/aaaaxy/logo.png)\n\nAAAAXY is a nonlinear 2D puzzle platformer taking place in impossible\nspaces.\n\nAlthough your general goal is reaching the surprising end of the game,\nyou are encouraged to set your own goals while playing. Exploration will\nbe rewarded, and secrets await you!\n\nSo jump and run around, and enjoy losing your sense of orientation in\nthis World of Wicked Weirdness. Find out what Van Vlijmen will make you\ndo. Pick a path, get inside a Klein Bottle, recognize some memes, and by\nall means: don't look up.\n\nAnd beware of a minor amount of trolling.\n\nTo reach the end, a new player will take about 4 to 6 hours, a full\nplaythrough can be finished in about 1 hour and the end can be reached\nin about 15 minutes.\n\nThe game is available for the following platforms:\n\n| Platform     | Downloads                                                                                                                                                                                                           |\n|--------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| Android      | [F-Droid](https://f-droid.org/en/packages/io.github.divverent.aaaaxy/), [Google Play](https://play.google.com/store/apps/details?id=io.github.divverent.aaaaxy)                                                     |\n| HTML5 (slow) | [netcup](https://rm.cloudns.org/aaaaxy/current/aaaaxy.html)                                                                                                                                                         |\n| iOS          | [App Store](https://apps.apple.com/us/app/aaaaxy/id6447063878)                                                                                                                                                      |\n| Linux        | [Flathub](https://flathub.org/apps/details/io.github.divverent.aaaaxy), [GitHub](https://github.com/divVerent/aaaaxy/releases), [Itch](https://divverent.itch.io/aaaaxy), [Snap Store](https://snapcraft.io/aaaaxy) |\n| macOS        | [GitHub](https://github.com/divVerent/aaaaxy/releases), [Itch](https://divverent.itch.io/aaaaxy)                                                                                                                    |\n| Windows      | [GitHub](https://github.com/divVerent/aaaaxy/releases), [Itch](https://divverent.itch.io/aaaaxy)                                                                                                                    |\n\nAvailable languages: Arabic, Belarusian, Chinese (Simplified), Chinese\n(Traditional), English, German, Japanese, Latin, Portuguese and\nUkrainian.\n\n## Screenshots\n\n[![shot1](https://divVerent.github.io/aaaaxy/screenshots/shot1.jpg)](https://divVerent.github.io/aaaaxy/screenshots/shot1.png)\n[![shot2](https://divVerent.github.io/aaaaxy/screenshots/shot2.jpg)](https://divVerent.github.io/aaaaxy/screenshots/shot2.png)\n[![shot3](https://divVerent.github.io/aaaaxy/screenshots/shot3.jpg)](https://divVerent.github.io/aaaaxy/screenshots/shot3.png)\n[![shot4](https://divVerent.github.io/aaaaxy/screenshots/shot4.jpg)](https://divVerent.github.io/aaaaxy/screenshots/shot4.png)\n[![shot5](https://divVerent.github.io/aaaaxy/screenshots/shot5.jpg)](https://divVerent.github.io/aaaaxy/screenshots/shot5.png)\n[![shot6](https://divVerent.github.io/aaaaxy/screenshots/shot6.jpg)](https://divVerent.github.io/aaaaxy/screenshots/shot6.png)\n[![shot7](https://divVerent.github.io/aaaaxy/screenshots/shot7.jpg)](https://divVerent.github.io/aaaaxy/screenshots/shot7.png)\n[![shot8](https://divVerent.github.io/aaaaxy/screenshots/shot8.jpg)](https://divVerent.github.io/aaaaxy/screenshots/shot8.png)\n\n## More Resources\n\nThis documentation is intended for developers; user-centric\ndocumentation is available on the [game's\nwebsite](https://divverent.github.io/aaaaxy/).\n\n## Notable Libraries\n\nThis game is based on the following libraries:\n\n-   [Ebitengine](https://github.com/hajimehoshi/ebiten) for low level\n    graphics and input\n-   [Oto](https://github.com/hajimehoshi/oto) for sound.\n-   [tmx](https://github.com/fardog/tmx) for parsing\n    [Tiled](https://www.mapeditor.org/) tile maps.\n\n## Compiling\n\nThis game has been successfully compiled on Linux, FreeBSD and Windows,\nand will likely compile just fine on other unixoid systems as well. For\nother platforms some minor porting may be required so save games and\nsettings can be retained; in particular see `vfs/state_*.go`.\n\nTo build the game for yourself, install `git`, `golang`, `graphviz`,\n`imagemagick` and `pandoc`, and then run:\n\n``` sh\ngit clone https://github.com/divVerent/aaaaxy\ncd aaaaxy\ngit submodule update --init --remote\nmake\n```\n\nNOTE: On FreeBSD systems, use `gmake` instead of `make` to compile.\n\nTo update and rebuild, run:\n\n``` sh\ncd aaaaxy\ngit pull\ngit submodule update --remote\nmake\n```\n\nYou can also immediately compile and run the game using:\n\n``` sh\nmake run\n```\n\n## Editing\n\n### In a Source Checkout\n\nUse Tiled on the included `aaaaxy.tiled-project`. The map is in\n`assets/maps/level.tmx`.\n\nIf checkpoints were changed, run `make assets-update` to regenerate the\ncheckpoint map.\n\n`make run` will use the modified data.\n\n### On a Release Binary\n\nRun the game with `-dump_embedded_assets=/path/to/folder/for/editing`.\nDownload the `mappingsupport` pack from the release and extract it to\nthat same directory. Tell Tiled to use the included \\`objecttypes.xml.\n\nRunning the game with\n`-cheat_replace_embedded_assets=/path/to/folder/for/editing` will then\nuse the modified data.\n\nChanging checkpoints is not supported this way.\n\n## Mathematical Notes\n\nThis game does not take place in the Euclidean space you're used to -\ninstead, you are experiencing the universal cover of a massively twisted\nspace, which feels like a space with a locally-Euclidean topology and\ngeometry, which however violates some of their axioms globally (e.g. the\nshortest path from one point to another *modulo the equivalence\nrelation* is not necessarily a line, and parallels are not always\nunique).\n\nFor some added confusion, the space is occasionally reconfigured by\nturning portals on/off at runtime, further violating expectations.\n\nThis is rather similar to seamless portals, but yields stronger\nimmersion and is generally an interesting approach I wanted to try out.\nIn particular, gravity behaves consistently across portals, and objects\nare entirely glitch-free around them. The player is only ever visible\nonce. On the other hand, this approach can not sensibly support\nmulti-player games; a more traditional portal based engine would be more\nappropriate there, where the same object may be seen multiple times on\nthe screen. Sadly that approach would appear rather confusing in places\nwhere this would cause the player themselves to show up multiple times\nat once, which is why I did not go with it.\n\nIn 3D games with transparent portals/warpzones, immersion is usually\nachieved by treating each portal as a dynamic texture surface which\nshows a view out of a camera projected to the other side. An open source\nimplementation of this can e.g. be found in\n[Xonotic](https://www.xonotic.org). The reason why this works is that\nonly those parts of an object are shown that have a line of sight to the\nplayer - as expected in a first person game. Implementing a third person\nview that way is already a bit more tricky but usually one can work\naround the view origin mismatching but being close to the player origin;\nhowever what is usually not possible with transparent portals in a\ntop-down or other 2D-ish view, as conflicting (e.g. self-overlapping)\ngeometry may need to be rendered to the screen at the same time.\n\nThere are however two approaches to solve this:\n\n-   Design levels so that conflicting geometry is never on screen.\n    -   In other words, when transparently teleporting in order to move\n        the player past a portal, a screen-sized environment of the\n        source position must always match a screen-sized environment of\n        the destination position.\n    -   This approach is simple and very immersive and has already been\n        used in the original Super Mario Bros. game on the NES.\n    -   It however is not very flexible as any impossible geometry has\n        to be rather large and behave fully Euclidean on every\n        screen-sized environment around positions the player can visit.\n-   Hide anything that has no line of sight to the player.\n    -   This actually matches the approach used in first person 3D games\n    -   With this approach, the game needs to be consistent with\n        Euclidean geometry only in small environments around each\n        object.\n        -   In this implementation, the consistency requirement is that\n            an 1-tile environment around every portal must match, and\n            that the same \"screen tile\" cannot be reached by a 1-tile\n            environment around a line of sight through two different\n            sets of portals at the same time.\n        -   As this game demonstrates, this can yield rather interesting\n            while still obvious non-Euclidean topologic properties.\n    -   This is the approach has been explored in this game as well -\n        but very likely for the first time in a two dimensional game.\n\n## License\n\nThis project is released under the [Apache 2.0 License](LICENSE).\n\n## Disclaimer\n\nThis is not an officially supported Google product.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdivverent%2Faaaaxy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdivverent%2Faaaaxy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdivverent%2Faaaaxy/lists"}