{"id":13951682,"url":"https://github.com/kul-sudo/eportal","last_synced_at":"2026-01-18T08:16:34.056Z","repository":{"id":224614605,"uuid":"762796253","full_name":"kul-sudo/eportal","owner":"kul-sudo","description":"An evolution simulator in Rust","archived":false,"fork":false,"pushed_at":"2024-12-23T22:57:57.000Z","size":1826,"stargazers_count":22,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-01-17T14:09:55.822Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kul-sudo.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-02-24T18:02:22.000Z","updated_at":"2025-11-21T12:01:39.000Z","dependencies_parsed_at":"2024-05-01T23:27:17.053Z","dependency_job_id":"13742662-e7fb-46d1-8e01-23e578323548","html_url":"https://github.com/kul-sudo/eportal","commit_stats":{"total_commits":85,"total_committers":2,"mean_commits":42.5,"dds":"0.48235294117647054","last_synced_commit":"abb9cc05bf21d0692db451f8a69d7bdc8facc9d3"},"previous_names":["kul-sudo/eportal-rust"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/kul-sudo/eportal","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kul-sudo%2Feportal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kul-sudo%2Feportal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kul-sudo%2Feportal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kul-sudo%2Feportal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kul-sudo","download_url":"https://codeload.github.com/kul-sudo/eportal/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kul-sudo%2Feportal/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28534141,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T00:39:45.795Z","status":"online","status_checked_at":"2026-01-18T02:00:07.578Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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-08T07:00:40.156Z","updated_at":"2026-01-18T08:16:34.035Z","avatar_url":"https://github.com/kul-sudo.png","language":"Rust","funding_links":["https://paypal.me/rustprogramming"],"categories":["Apps or visualizations"],"sub_categories":["Apps or visualizations: On top of macroquad"],"readme":"\u003col\u003e\n   \u003cli\u003e\n      \u003ca href=\"#what-is-eportal\"\u003eAbout the project\u003c/a\u003e\n      \u003cul\u003e\n         \u003cli\u003e\u003ca href=\"#what-is-eportal\"\u003eWhat is eportal?\u003c/a\u003e\u003c/li\u003e\n      \u003c/ul\u003e\n      \u003cul\u003e\n         \u003cli\u003e\u003ca href=\"#plants\"\u003ePlants\u003c/a\u003e\u003c/li\u003e\n         \u003cli\u003e\u003ca href=\"#bodies\"\u003eBodies\u003c/a\u003e\u003c/li\u003e\n         \u003cul\u003e\n            \u003cli\u003e\u003ca href=\"#energy\"\u003eEnergy\u003c/a\u003e\u003c/li\u003e\n         \u003c/ul\u003e\n         \u003cul\u003e\n            \u003cli\u003e\u003ca href=\"#properties\"\u003eProperties\u003c/a\u003e\u003c/li\u003e\n         \u003c/ul\u003e\n         \u003cul\u003e\n            \u003cli\u003e\u003ca href=\"#procreation\"\u003eProcreation\u003c/a\u003e\u003c/li\u003e\n         \u003c/ul\u003e\n         \u003cul\u003e\n            \u003cli\u003e\u003ca href=\"#death\"\u003eDeath\u003c/a\u003e\u003c/li\u003e\n         \u003c/ul\u003e\n         \u003cul\u003e\n            \u003cli\u003e\u003ca href=\"#skills\"\u003eSkills\u003c/a\u003e\u003c/li\u003e\n         \u003c/ul\u003e\n         \u003cul\u003e\n            \u003cli\u003e\u003ca href=\"#viruses\"\u003eViruses\u003c/a\u003e\u003c/li\u003e\n         \u003c/ul\u003e\n      \u003c/ul\u003e\n      \u003cul\u003e\u003cli\u003e\u003ca href=\"#zoom\"\u003eZoom\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\n      \u003cul\u003e\u003cli\u003e\u003ca href=\"#interactions\"\u003eInteractions\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\n      \u003cul\u003e\u003cli\u003e\u003ca href=\"#configuration\"\u003eConfiguration\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\n      \u003cul\u003e\u003cli\u003e\u003ca href=\"#how-to-download\"\u003eHow to download?\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\n      \u003cul\u003e\n         \u003cul\u003e\n            \u003cli\u003e\u003ca href=\"#compile-from-source\"\u003eCompile from source\u003c/a\u003e\u003c/li\u003e\n         \u003c/ul\u003e\n         \u003cul\u003e\n            \u003cli\u003e\u003ca href=\"#get-a-linux-or-windows-binary-from-the-releases\"\u003eGet a Linux or Windows binary from the releases\u003c/a\u003e\u003c/li\u003e\n         \u003c/ul\u003e\n      \u003c/ul\u003e\n   \u003c/li\u003e\n   \u003cli\u003e\u003ca href=\"#how-to-help-the-project\"\u003eHow to help the project?\u003c/a\u003e\u003c/li\u003e\n   \u003cul\u003e\n      \u003cli\u003e\u003ca href=\"#financially\"\u003eFinancially\u003c/a\u003e\u003c/li\u003e\n   \u003c/ul\u003e\n   \u003cul\u003e\n      \u003cli\u003e\u003ca href=\"#contributions\"\u003eContributions\u003c/a\u003e\u003c/li\u003e\n   \u003c/ul\u003e\n\u003c/ol\u003e\n\n# About the project\n![image](https://github.com/user-attachments/assets/fd844fd7-512e-4f3e-b683-105ef0fd8e34)\n\n## What is eportal?\n`e` in `eportal` stands for `evolution`, so eportal is an evolution portal where you can create your own configurable worlds.\n\n## Plants\nPlants spawn in different places and eventually die. They serve as food for the bodies.\nThe plants are split into green and yellow: grass and bananas. Bananas give more energy than grass.\n\n## Bodies\nBodies are split into types. Each type has a unique color.\n\nFood can be:\n- [plants](#plants)\n- [living bodies of other types](#bodies)\n- [dead](#death) bodies (crosses)\n\n\nEvery body has an eating strategy that can be:\n- `Herbivorous`: eats [plants](#plants)\n- `Carnivorous`: eats [living and dead bodies](#bodies)\n- `Omnivorous`: eats everything\n\nWhen the body reaches food, the food disappears, which means it's been eaten by the body. The body gets [energy](#energy) from it.\n\nWhen the body goes beyond the evolution field, it gets teleported to the opposite border.\n\n### Energy\nThe body gets energy by eating food:\n- `plants`: Plants of one kind all give the same energy.\n- `living bodies`: Living bodies give their current energy.\n- `dead bodies`: Dead bodies give the energy they had the moment they died.\n\n[Omnivorous bodies](#bodies) only get certain part of the energy of the food they eat, unlike carnivorous\nand herbivorous bodies.\n\nThe body constantly spends energy on:\n- `living`\n- `movement`\n- `skills`\n- `healing from viruses`\n- `vision`: Carnivorous bodies spend energy on vision only when someone is within their vision distance.\n\n### Properties\nThe body has properties that affect whether it survives.\n\n- `energy`: The amount of energy the body has left. When the energy goes below a specific point, the body [dies](#death).\n- `speed`: The speed the body moves with.\n- `vision distance`: The radius of how far the body can see.\n- `division threshold`: The threshold of energy the body has to be eligible to [procreate](#procreation).\n- `skills`: The [skills](#skills) the body has.\n- `viruses`: The [viruses](#viruses) the body has been infected with.\n- `lifespan`: How long the body has [left](#death) to live in case it theoretically stands still. The life shortens when the body moves, depending on the speed.\n\n### Procreation\nThe body procreates and therefore splits into 2 other bodies if and only if:\n- It isn't being chased by anyone\n- Its energy is greater than its division threshold\n\n\nBoth children of the body get the following properties directly:\n- eating strategy\n- viruses\n- energy / 2\n\nBoth children of the body get the following properties with a deviation:\n- speed\n- vision distance\n- division threshold\n- skills\n\n### Death\nThe body dies if:\n- Its energy drops below a specific point\n- Its lifetime is over\n- It's been eaten\n\nIt becomes an eatable cross in the first 2 cases. The cross disappears in a certain period of time.\n\n### Skills\nEvery body can coincidentally get or lose any of the following skills:\n\n0. `Do not compete with relatives`: When the body sees another body of its type following a plant, body, or cross, it doesn't try to follow the same object.\n1. `Do not compete with younger relatives`: When the body sees a younger body of its type following a plant, body, or cross, it doesn't try to follow the same object.\n2. `Alive when arrived`: When the body sees a plant or dead body, the body makes sure it doesn't die before it gets to the food.\n3. `Profitable when arrived`: When the body sees a living body, cross, or plant, the body makes sure it'll get more energy when it eats it than it spends on getting to that food.\n4. `Prioritize faster chasers`: When the body sees it's being chased by several other bodies, it escapes from the faster one.\n5. `Avoid new viruses`: When the body sees a living body, it makes sure that eating it won't result in getting viruses the body doesn't have yet.\n6. `Will arrive first`: When the body sees there are other bodies following the same food as it is following, the body makes sure it gets there the fastest.\n7. `Eat crosses of my type`: When the body sees a cross of its type, it eats the cross to make sure bodies of other types don't eat it and therefore don't get the energy.\n8. `Avoid infected crosses`: When the body sees a cross contains viruses the body itself doesn't have yet, it avoids the cross.\n\n### Viruses\nEvery omnivorous or carnivorous body can be infected (a red dot is shown on top of the body) with the following viruses:\n1. `Speed virus`: The virus steals specific part of the body's speed the moment the body gets infected with the virus.\n2. `Vision virus`: The virus steals specific part of the body's vision distance the moment the body gets infected with the virus.\n\nThe body gets infected with a virus:\n- At the start of the evolution\n- Throughout the evolution by eating infected living or dead bodies\n\nThe body spends energy on healing from the virus. However, if the body has got rid of the virus, the effects\nof the virus stay on.\n\n## Conditions\nThe evolution process is periodically struck by conditions.\n- `Drought`: Fewer plants grow.\n- `Rain`: More plants grow.\n\n## Zoom\nWhen the zoom mode is on, you can see:\n- Vision distance circles\n- Lines between the body and its food\n- The info about each specific body\n\n## Interactions\n- \u003ckbd\u003eesc\u003c/kbd\u003e: quit the program\n- \u003ckbd\u003eleft mouse button\u003c/kbd\u003e: toggle the [zoom](#zoom) mode\n- \u003ckbd\u003e1\u003c/kbd\u003e: toggle showing the info\n- \u003ckbd\u003e2\u003c/kbd\u003e: toggle showing the info about the current evolution\n- \u003ckbd\u003e3\u003c/kbd\u003e: update the mid-evolution settings from the config if there have been changes\n- \u003ckbd\u003espace\u003c/kbd\u003e: toggle drawing\n\n## Configuration\nAll configuration is done through `config.toml`.\nThe config has to:\n- be named correctly\n- be in the same directory as the binary/executable\n- have valid syntax\n\nThe default config is here: https://github.com/kul-sudo/eportal/blob/main/config.toml\n\n## How to run?\n### Compile from source\nIf you don't have the Rust compiler installed yet, get it from `rustup.rs`.\nThen simply run this command wherever you feel comfortable:\n```sh\ngit clone https://github.com/kul-sudo/eportal; cd eportal; RUSTFLAGS='-C target-cpu=native' cargo run --release;\n```\n\n### Get a Linux or Windows binary from the releases\nhttps://github.com/kul-sudo/eportal/releases\n\n\n# How to help the project?\n## Financially\nEven small donations are appreciated:\n- Monero: 89cGT7422X4HPdJB8Xcb9SNoqSHe75xYSEZXPM83AiNsK3WafD1YEoYFQWQt8D1yUH97NhfT69yLrWfSqMF1J9DmJTEtGfB\n- PayPal: https://paypal.me/rustprogramming\n\n## Contributions\nEspecially:\n1. Better organizing the code\n2. Documentantion in the code and in the README (what you're reading right now)\n3. Adding more viruses and skills\n4. Handle values in `config.toml` leading to crashes\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkul-sudo%2Feportal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkul-sudo%2Feportal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkul-sudo%2Feportal/lists"}