{"id":15138037,"url":"https://github.com/rust-gamedev/rust-game-ports","last_synced_at":"2025-10-23T13:31:13.419Z","repository":{"id":36995590,"uuid":"368618343","full_name":"rust-gamedev/rust-game-ports","owner":"rust-gamedev","description":"Official host of games ported using Rust game libraries.","archived":false,"fork":false,"pushed_at":"2023-07-31T10:54:05.000Z","size":46612,"stargazers_count":123,"open_issues_count":9,"forks_count":8,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-02-06T12:08:52.365Z","etag":null,"topics":["bevy","fyrox","game","game-development","game-engine","gamedev","ggez","hacktoberfest","macroquad","rust"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rust-gamedev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-05-18T17:42:36.000Z","updated_at":"2024-11-13T09:28:40.000Z","dependencies_parsed_at":"2023-01-17T12:31:54.596Z","dependency_job_id":null,"html_url":"https://github.com/rust-gamedev/rust-game-ports","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rust-gamedev%2Frust-game-ports","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rust-gamedev%2Frust-game-ports/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rust-gamedev%2Frust-game-ports/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rust-gamedev%2Frust-game-ports/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rust-gamedev","download_url":"https://codeload.github.com/rust-gamedev/rust-game-ports/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":237834730,"owners_count":19373783,"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":["bevy","fyrox","game","game-development","game-engine","gamedev","ggez","hacktoberfest","macroquad","rust"],"created_at":"2024-09-26T07:04:28.527Z","updated_at":"2025-10-23T13:31:10.199Z","avatar_url":"https://github.com/rust-gamedev.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Rust Game Ports\n\nOfficial host of games ported using Rust game libraries.\n\nThis project is intended to inform and help developers in the area of *actual* game programming with Rust and Rust game engines.\n\nIf you're a developer planning a contribution, it's **crucial** to read the [Contribution Infos](#contribution-infos) section.\n\n- [Rust Game Ports](#rust-game-ports)\n  - [Summary](#summary)\n  - [Contribution Infos](#contribution-infos)\n    - [Choosing and implementing a port](#choosing-and-implementing-a-port)\n    - [Low-level requirements](#low-level-requirements)\n    - [High level guidelines](#high-level-guidelines)\n  - [Screenshots](#screenshots)\n  - [Port notes](#port-notes)\n    - [Boing/ggez](#boingggez)\n    - [Cavern/Macroquad](#cavernmacroquad)\n    - [Rusty Roguelike/Bevy ECS](#rusty-roguelikebevy-ecs)\n    - [Soccer/Fyrox](#soccerfyrox)\n    - [Rusty Roguelike/Macroquad](#rusty-roguelikemacroquad)\n    - [Bunner/Macroquad](#bunnermacroquad)\n    - [Catacomb II/SDL 2](#catacomb-iisdl-2)\n\n## Summary\n\nThe completed ports are:\n\n\u003c!-- Add new releases at the bottom; this makes more likely to found outdated ports at the top --\u003e\n\n|                  Game                  |                                   Part of                                    | Source Language |               Source Libraries               |                   Port Libraries                   | Tested on |\n| :------------------------------------: | :--------------------------------------------------------------------------: | :-------------: | :------------------------------------------: | :------------------------------------------------: | :-------: |\n|             [Boing][Boing]             |             [Code the Classics Vol. 1][Code the Classics Vol. 1]             |     Python      |          [PyGame Zero][PyGame Zero]          |                  [ggez][ggez] 0.7                  |   Linux   |\n| [Catacomb II (SDL)][Catacomb II (SDL)] |                                      -                                       |        C        |                [SDL 2][SDL 2]                |            [Rust-SDL2][Rust-SDL2] 0.35             |   Linux   |\n|            [Cavern][Cavern]            |             [Code the Classics Vol. 1][Code the Classics Vol. 1]             |     Python      |          [PyGame Zero][PyGame Zero]          |             [Macroquad][Macroquad] 0.3             |   Linux   |\n|            [Soccer][Soccer]            |             [Code the Classics Vol. 1][Code the Classics Vol. 1]             |     Python      |          [PyGame Zero][PyGame Zero]          |                [Fyrox][Fyrox] 0.26                 |   Linux   |\n|   [Rusty Roguelike][Rusty Roguelike]   | [Hands-on Rust: Effective Learning...][Hands-on Rust: Effective Learning...] |      Rust       | [bracket-lib][bracket-lib], [Legion][Legion] | [bracket-lib][bracket-lib], [Bevy][Bevy] (ECS) 0.7 |   Linux   |\n|   [Rusty Roguelike][Rusty Roguelike]   | [Hands-on Rust: Effective Learning...][Hands-on Rust: Effective Learning...] |      Rust       | [bracket-lib][bracket-lib], [Legion][Legion] |  [Macroquad][Macroquad] 0.3, [Legion][Legion] 0.3  |   Linux   |\n|            [Bunner][Bunner]            |             [Code the Classics Vol. 1][Code the Classics Vol. 1]             |     Python      |          [PyGame Zero][PyGame Zero]          |             [Macroquad][Macroquad] 0.3             |   Linux   |\n\n\u003c!-- Keep the entries of each group sorted by name --\u003e\n\n\u003c!-- Game --\u003e\n\n[Boing]: https://github.com/Wireframe-Magazine/Code-the-Classics/tree/master/boing-master\n[Bunner]: https://github.com/Wireframe-Magazine/Code-the-Classics/tree/master/bunner-master\n[Catacomb II (SDL)]: https://github.com/Blzut3/CatacombSDL\n[Cavern]: https://github.com/Wireframe-Magazine/Code-the-Classics/tree/master/cavern-master\n[Rusty Roguelike]: https://github.com/thebracket/HandsOnRust\n[Soccer]: https://github.com/Wireframe-Magazine/Code-the-Classics/tree/master/soccer-master\n\n\u003c!-- Part of... --\u003e\n\n[Code the Classics Vol. 1]: https://wireframe.raspberrypi.org/books/code-the-classics1\n[Hands-on Rust: Effective Learning...]: https://pragprog.com/titles/hwrust/hands-on-rust\n\n\u003c!-- Source Libraries --\u003e\n\n[bracket-lib]: https://github.com/amethyst/bracket-lib\n[Legion]: https://github.com/amethyst/legion\n[PyGame Zero]: https://pygame-zero.readthedocs.io/en/stable\n[Rust-SDL2]: https://github.com/Rust-SDL2/rust-sdl2\n[SDL 2]: https://www.libsdl.org/\n\n\u003c!-- Port Libraries --\u003e\n\n[Bevy]: https://github.com/bevyengine/bevy\n[Fyrox]: https://github.com/FyroxEngine/Fyrox\n[ggez]: https://github.com/ggez/ggez\n[Macroquad]: https://github.com/not-fl3/macroquad\n\n## Contribution Infos\n\nContributions are welcome!\n\nSince this project is intended to be educational above all, it's important for the candidate ports to constitute proper examples 😄\n\nIn this section you'll find some suggestions to start a port, and the low and high level guidelines. Feel free to skip the first, but don't underestimate it! 😉\n\n### Choosing and implementing a port\n\nDevs motivated to implement a port are advised to be very careful with what they choose 😄\n\nWhile some ports are straightforward, for example Rust+immediate mode library (\"IML\") -\u003e Rust+IML, other types of port can be subtly challenging:\n\n- Dynamic language+IML (e.g. Python+Pygame -\u003e Rust+ggez) are challenging for many reasons:\n  - It's difficult to understand the exact structure/state of the classes/instances\n  - Globals may be used\n  - Numeric types can be difficult to ascertain, and the descriptions may be buggy (e.g. a number may accept negative values, while being described as accepting only positive ones)\n- IML -\u003e Retained mode library are very time consuming, as they require a full redesign, an example can be porting a Rust game from ggez to Fyrox\n- Object oriented -\u003e ECS is another time consuming one, since it requires a full redesign\n\nFor beginners, a good starting point is to take a Rust+IML project, e.g. Boing, and convert it to another IML, e.g. Macroquad.\n\nMore adventurous devs can start from a Python/PyGame source, and port it to Rust+IML.\n\nCommitted devs can perform ports that require a redesign (e.g. Fyrox Framework to Fyrox scripted).\n\nIt's not advised to perform a port that requires a language translation _and_ a redesign\n\n### Low-level requirements\n\nThese are the low-level requirements for candidate projects (they will be automated, so they don't need to be actively take caren of 🙂):\n\n- include a license in the port workspace (can be easily copied and edited from other similar projects)\n- work on stable Rust (this is because they ubiquitous Rust Analyzer has some open issues with nighly Rust)\n- be formatted according to `cargo fmt`\n- be linted according to `cargo clippy -- -W clippy::correctness -D warnings`\n- not have any unsafe code (it's not necessary for idiomatically ported games)\n- not use any highly unidiomatic Rust (e.g. globals)\n\n### High level guidelines\n\nHigh level guidelines are under discussion. Generally speaking, ports should be performed according to the intended design of the game library used, since ports are meant to be examples for Rust game development. You'll be famous! 😎😂\n\n## Screenshots\n\n\u003c!-- Keep the entries sorted by name --\u003e\n\nBoing:\n\n![Boing](/images/readme/boing.png?raw=true)\n\nBunner:\n\n![Bunner](/images/readme/bunner.png?raw=true)\n\nCavern:\n\n![Cavern](/images/readme/cavern.png?raw=true)\n\nRusty Roguelike:\n\n![Rusty Roguelike](/images/readme/rusty_roguelike.png?raw=true)\n\nSoccer:\n\n![Soccer](/images/readme/soccer.png?raw=true)\n\nCatacomb II:\n\n![Catacomb II](/images/readme/catacomb_2.png?raw=true)\n\n## Port notes\n\n### Boing/ggez\n\nA very straightforward port 🙂\n\nThis port suffers from one (Winit) bug:\n\n- corruption when running on fullscreen (reported [here](https://github.com/ggez/ggez/issues/1066)).\n\n### Cavern/Macroquad\n\nAnother very straightforward port 🙂\n\nThis port suffers from two Macroquad bugs:\n\n- the music starts with a delay (reported by another developer [here](https://github.com/not-fl3/macroquad/issues/440));\n- on Nvidia cards, on Linux, CPU runs at 100% load (reported [here](https://github.com/not-fl3/macroquad/issues/275#issuecomment-939525290)).\n\nOnly the stable part of the library is used (the experimental [`scene`](https://github.com/not-fl3/macroquad/blob/master/src/experimental/scene.rs) API is not used).\n\n### Rusty Roguelike/Bevy ECS\n\nThe ECS part of this game, originally Legion, has been ported to Bevy (the graphic/input library used is still [bracket-lib](https://github.com/amethyst/bracket-lib)).\n\nA mini book, [\"Learn Bevy's ECS by ripping off someone else's project\"](https://saveriomiroddi.github.io/learn_bevy_ecs_by_ripping_off), is based on this project.\n\n### Soccer/Fyrox\n\nThis port required a redesign, in order to move to a scene graph.\n\nThe port suffers from one Fyrox bug:\n\n- at least one sound plays with a delay (reported [here](https://github.com/FyroxEngine/Fyrox/issues/324)).\n\n### Rusty Roguelike/Macroquad\n\nThe graphics portion of the Rusty Roguelike has been ported to Macroquad. The ECS used is still Legion, and the pathfinding is from [bracket-lib](https://github.com/amethyst/bracket-lib)).\n\n### Bunner/Macroquad\n\nA straight port from PyGame Zero to Macroquad of this infinite frogger like game.\n\n### Catacomb II/SDL 2\n\nThis is an exact port of the source codebase, performed in two stages - first transpiling to unsafe Rust via [C2Rust](https://github.com/immunant/c2rust), then manually converting to safe Rust.\n\nSince the objective was testing such type of port, the result is not idiomatic Rust; nonetheless, the code is still 100% safe, and the Rust-SDL2 library is properly used. More details are provided on the [port project repository](https://github.com/64kramsystem/catacomb_ii-64k).\n\nIn order to play this game, the game datafiles are required; a pack with all the Catacomb games [currently costs just 4$ on GOG](https://www.gog.com/de/game/catacombs_pack).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frust-gamedev%2Frust-game-ports","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frust-gamedev%2Frust-game-ports","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frust-gamedev%2Frust-game-ports/lists"}