{"id":50902431,"url":"https://github.com/zvory/rts-0","last_synced_at":"2026-06-16T04:02:06.552Z","repository":{"id":361248561,"uuid":"1253605595","full_name":"zvory/rts-0","owner":"zvory","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-14T20:12:35.000Z","size":12581,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-14T20:15:41.772Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"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/zvory.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,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-29T16:26:27.000Z","updated_at":"2026-06-14T20:12:39.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/zvory/rts-0","commit_stats":null,"previous_names":["zvory/rts-0"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/zvory/rts-0","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zvory%2Frts-0","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zvory%2Frts-0/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zvory%2Frts-0/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zvory%2Frts-0/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zvory","download_url":"https://codeload.github.com/zvory/rts-0/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zvory%2Frts-0/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34390052,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-16T02:00:06.860Z","response_time":126,"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":"2026-06-16T04:02:05.589Z","updated_at":"2026-06-16T04:02:06.549Z","avatar_url":"https://github.com/zvory.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Bewegungskrieg\n\n![Bewegungskrieg cover art](cover-art.png)\n\nBewegungskrieg is a small real-time-strategy game inspired by classic base-building RTS games.\nGather steel and oil, expand your base, train an army, scout through fog of war, and defeat the\nother players.\n\nThe game is server-authoritative: a Rust server owns the simulation, serves the static browser\nclient, and streams fog-filtered snapshots over WebSocket. The client is plain HTML/CSS/JS with\nPixiJS loaded from a CDN, so there is no JavaScript build step.\n\nFor architecture, protocol, balance, hardening rules, and module contracts, start with\n[DESIGN.md](DESIGN.md), then follow the relevant `docs/design/` link. This README is only the\nquickstart.\n\n## Play Locally\n\nRequirements:\n\n- A recent Rust toolchain with `cargo`\n- A browser with WebGL enabled\n\nStart the server:\n\n```bash\n./runserver\n```\n\nOpen the URL printed by the server, usually `http://127.0.0.1:8080/` or\n`http://localhost:8080/`.\n\nTo change the bind address:\n\n```bash\nRTS_ADDR=127.0.0.1:8090 ./runserver\n```\n\n## Starting A Match\n\nOpen the game in one or more browser windows.\n\n- Join the same room to play together.\n- The host can add AI opponents from the lobby.\n- All human players must ready up before the host starts the match.\n- A one-player match with no AI is a never-ending sandbox.\n- The lobby's \"Start with more money mode\" gives every player a larger opening economy.\n\nMatches support up to four total players, counting humans and AI.\n\n## Game Basics\n\n- Engineers gather steel and oil.\n- Buildings let you increase supply and unlock new units.\n- Units can move, attack, attack-move, stop, gather, build, and train through the command card.\n- Fog of war is enforced by the server, so hidden enemies are not sent to the client.\n- Last player standing wins in matches with two or more players.\n\n## Controls\n\n| Action | Input |\n|--------|-------|\n| Select unit or building | Left-click |\n| Box-select | Left-drag |\n| Move, gather, or attack | Right-click |\n| Command card | Q W E / A S D / Z X C |\n| Pan camera | WASD, arrow keys, screen edge, or minimap drag |\n| Zoom | Mouse wheel |\n| Cancel placement | Esc or right-click |\n\n## Developer Quickstart\n\nUseful entry points:\n\n- `server/` contains the Rust server and authoritative simulation.\n- `client/` contains the static browser client served by the Rust process.\n- `tests/` contains live-server integration and browser smoke tests.\n- [DESIGN.md](DESIGN.md) indexes the source-of-truth contract docs under `docs/design/`.\n- [tests/README.md](tests/README.md) explains the test suites in detail.\n\nCommon commands:\n\n```bash\n# Run the game.\n./runserver\n\n# Build, lint, and format the Rust crate.\ncd server \u0026\u0026 cargo build \u0026\u0026 cargo clippy \u0026\u0026 cargo fmt\n\n# Run the full local test orchestrator from the repo root.\ntests/run-all.sh\n```\n\nThe full test runner starts or reuses a local server, runs the Rust simulation tests, runs the\nWebSocket/API suites, and runs the headless client smoke test when Chrome is available.\n\nFor focused test runs, see [tests/README.md](tests/README.md).\n\n## Local Commit Test Gate\n\nEvery local commit must pass the canonical local CI command:\n\n```bash\n./tests/run-all.sh\n```\n\nInstall the tracked Git hooks in each checkout:\n\n```bash\n./scripts/install-hooks.sh\n```\n\nThe hooks run `./tests/run-all.sh` before ordinary local commits. Merge commits intentionally\nbypass the local hook gate, including non-fast-forward merge commits and conflict-resolution\ncommits. After commits and merges on `main`, the hooks also run\n`scripts/cleanup-worktrees.sh --auto` to remove clean, already-merged `zvorygin/*` worktrees and a\nsmall bounded batch of stale per-worktree Cargo target dirs.\n\nGit does not distribute active local hook configuration through clones. Each checkout needs to run\nthe installer once. GitHub Actions also runs `./tests/run-all.sh` after pushes to `main` as a\nshared signal, but `main` is intentionally left open for direct pushes.\n\nThe local gate uses a per-worktree Cargo target directory under `/tmp/rts-cargo-target/` so\nparallel agents do not share final binaries or test artifacts.\n\nTo preview or force cleanup manually:\n\n```bash\nscripts/cleanup-worktrees.sh --dry-run\nscripts/cleanup-worktrees.sh\n```\n\n## Deploy\n\nThe app is configured for Fly.io through [fly.toml](fly.toml):\n\n```bash\nflyctl deploy --ha=false\n```\n\nFirst-time setup and operational notes live in [docs/fly.md](docs/fly.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzvory%2Frts-0","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzvory%2Frts-0","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzvory%2Frts-0/lists"}