{"id":50409651,"url":"https://github.com/involvex/void-signal","last_synced_at":"2026-05-31T03:02:10.826Z","repository":{"id":347849831,"uuid":"1194587566","full_name":"involvex/void-signal","owner":"involvex","description":null,"archived":false,"fork":false,"pushed_at":"2026-03-29T18:19:49.000Z","size":1262,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-02T19:41:43.418Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"HTML","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/involvex.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","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},"funding":{"github":["involvex"],"custom":["https://buymeacoffee.com/involvex","https://paypal.me/involvex","https://rewards.bing.com/welcome?rh=14525F68\u0026ref=rafsrchae\u0026form=ML2XE3\u0026OCID=ML2XE3\u0026PUBL=RewardsDO\u0026CREA=ML2XE3"]}},"created_at":"2026-03-28T15:02:41.000Z","updated_at":"2026-03-29T18:19:52.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/involvex/void-signal","commit_stats":null,"previous_names":["involvex/void-signal"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/involvex/void-signal","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/involvex%2Fvoid-signal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/involvex%2Fvoid-signal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/involvex%2Fvoid-signal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/involvex%2Fvoid-signal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/involvex","download_url":"https://codeload.github.com/involvex/void-signal/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/involvex%2Fvoid-signal/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33717419,"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-05-31T02:00:06.040Z","response_time":95,"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-05-31T03:02:10.086Z","updated_at":"2026-05-31T03:02:10.820Z","avatar_url":"https://github.com/involvex.png","language":"HTML","funding_links":["https://github.com/sponsors/involvex","https://buymeacoffee.com/involvex","https://paypal.me/involvex","https://rewards.bing.com/welcome?rh=14525F68\u0026ref=rafsrchae\u0026form=ML2XE3\u0026OCID=ML2XE3\u0026PUBL=RewardsDO\u0026CREA=ML2XE3"],"categories":[],"sub_categories":[],"readme":"# Void Signal\n\nA terminal-based ASCII RPG with colored tile rendering, turn-based combat, NPCs, and branching dialogue. Built with [Bun](https://bun.sh) + TypeScript.\n\n## Features\n\n- Tile-based world rendered in real-time with 24-bit RGB color via ANSI escape codes\n- Turn-based combat with Attack, Use Item, and Flee options\n- 4 interconnected maps: Town, Forest, Cave, and Void Ruins\n- Branching dialogue system with 4 unique NPCs (Merchant, Elder, Guard, Sage)\n- Equipment system (weapons, armor) with stat bonuses\n- 8 item types including weapons, potions, keys, and quest items\n- Level-up system with scaling XP requirements and stat growth\n- Loot drops from enemies with weighted random chances\n- Animated torch effects across dark environments\n- Procedural terrain generation in Forest, Cave, and Ruins maps\n- Differential rendering for flicker-free 20fps display\n- Terminal resize handling with automatic HUD reflow\n\n## Prerequisites\n\n- [Bun](https://bun.sh/docs/install) v1.0 or later\n- A terminal that supports 24-bit RGB color (most modern terminals)\n\n## Installation\n\n```bash\ngit clone https://github.com/involvex/void-signal.git\ncd void-signal\nbun install\n```\n\n## Usage\n\n```bash\nbun run start          # Run the game\nbun run dev            # Run with file watching (auto-restart on changes)\n```\n\n## Controls\n\n### Overworld\n\n| Key                                 | Action                           |\n| ----------------------------------- | -------------------------------- |\n| `W` / `A` / `S` / `D` or Arrow Keys | Move player                      |\n| `E`                                 | Interact with adjacent NPC/enemy |\n| `Tab`                               | Open inventory                   |\n| `Escape`                            | Open pause menu                  |\n| `Ctrl+C`                            | Quit game                        |\n\n### Combat\n\n| Key                     | Action                                    |\n| ----------------------- | ----------------------------------------- |\n| `W` / `S` or Arrow Keys | Navigate actions (Attack, Use Item, Flee) |\n| `Enter`                 | Confirm action                            |\n| `Enter` / `Escape`      | Dismiss result screen                     |\n\n### Dialogue\n\n| Key       | Action                 |\n| --------- | ---------------------- |\n| `1` - `9` | Select dialogue choice |\n| `Escape`  | Close dialogue         |\n\n### Inventory\n\n| Key                     | Action                     |\n| ----------------------- | -------------------------- |\n| `W` / `S` or Arrow Keys | Navigate items             |\n| `Enter`                 | Use or equip selected item |\n| `Escape` / `Tab`        | Close inventory            |\n\n## Game World\n\nThe world consists of 4 maps connected by exits at the edges:\n\n```\nVoid Ruins (Boss area, no north exit)\n    ^\n    | (north)\n  Cave (dark caverns, Cave Sentinel, Bat Swarm)\n    ^\n    | (north)\nForest (procedural trees, Glitch Wolves, Signal Spider)\n    ^\n    | (north)\n  Town (NPCs, shops, starting area)\n```\n\n### Enemies\n\n| Enemy         | Location | HP  | ATK | DEF | XP  | Gold |\n| ------------- | -------- | --- | --- | --- | --- | ---- |\n| Glitch Wolf   | Forest   | 40  | 10  | 3   | 30  | 10   |\n| Signal Spider | Forest   | 55  | 13  | 5   | 45  | 15   |\n| Bat Swarm     | Cave     | 30  | 8   | 2   | 20  | 8    |\n| Cave Sentinel | Cave     | 80  | 15  | 7   | 60  | 20   |\n| Echo Wraith   | Ruins    | 60  | 14  | 6   | 50  | 18   |\n| Void Warden   | Ruins    | 150 | 20  | 10  | 200 | 50   |\n\n### Items\n\n| Item          | Type   | Effect                   |\n| ------------- | ------ | ------------------------ |\n| Rusty Sword   | Weapon | ATK +4                   |\n| Signal Blade  | Weapon | ATK +12                  |\n| Leather Armor | Armor  | DEF +4                   |\n| Void Cloak    | Armor  | DEF +8                   |\n| Health Potion | Potion | Heals 30 HP              |\n| Ether Flask   | Potion | Heals 20 MP              |\n| Town Key      | Key    | Opens northern gate      |\n| Echo Core     | Quest  | Pulsing void energy core |\n\n## Project Structure\n\n```\nsrc/\n  main.ts              Entry point: terminal setup, game loop, cleanup\n  engine/\n    game.ts            Game engine: tick/update/render cycle, state machine\n    screen-buffer.ts   2D cell grid with char + fg/bg color per cell\n    renderer.ts        Converts ScreenBuffer to ANSI escape codes\n    input.ts           stdin raw mode, key event parsing\n  entities/\n    entity.ts          Base entity class (position, glyph, color, name)\n    player.ts          Player: stats, inventory, equipment, movement\n    enemy.ts           Enemies: combat stats, loot tables\n    npc.ts             NPCs: dialogue triggers, merchant flag\n    item.ts            Item definitions and factory functions\n  systems/\n    combat.ts          Turn-based combat: attack, item, flee\n    dialogue.ts        Branching dialogue tree system\n    messages.ts        Colored message log for the HUD\n  world/\n    world.ts           World manager: scene registry and transitions\n    scene.ts           Scene: tile data, entities, collision, exits\n    maps.ts            Map definitions: town, forest, cave, ruins\n  ui/\n    hud.ts             HUD overlay: HP/MP/XP bars, sidebar, message log\n    menus.ts           Full-screen menus: title, inventory, pause, combat\n  types.ts             Shared interfaces and types\nindex.ts               Module entry point (re-exports src/main.ts)\n```\n\n## Development\n\n| Command             | Description                               |\n| ------------------- | ----------------------------------------- |\n| `bun run start`     | Run the game                              |\n| `bun run dev`       | Run with file watching                    |\n| `bun run build`     | Production bundle to `dist/`              |\n| `bun run typecheck` | TypeScript type checking (`tsc --noEmit`) |\n| `bun run lint`      | Lint `src/` with ESLint                   |\n| `bun run lint:fix`  | Lint with auto-fix                        |\n| `bun run format`    | Format all files with Prettier            |\n| `bun run prebuild`  | Runs format + lint:fix + typecheck        |\n\n## Tech Stack\n\n- **Runtime:** Bun (native TypeScript execution, no compilation step)\n- **Language:** TypeScript (strict mode, ES modules)\n- **Terminal:** `@xterm/headless` for buffer management and input parsing\n- **Rendering:** Direct ANSI escape codes (24-bit RGB, cursor positioning)\n- **Linting:** ESLint with `typescript-eslint`\n- **Formatting:** Prettier with `@involvex/prettier-config`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finvolvex%2Fvoid-signal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Finvolvex%2Fvoid-signal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finvolvex%2Fvoid-signal/lists"}