# ghostland-game This is a continuation of my [goland-game](https://github.com/five-hundred-eleven/goland-game) project. While the previous project was implemented in go, for this project I was not able to get the go bindings for OpenGL working, and so I went with C++. [Repository Guidelines](AGENTS.md) outlines code structure, build steps, and contribution conventions. ## Configuration (`ghostland.json`) `ghostland.json` is parsed at startup with a minimal line-by-line reader, so keep it a flat list of key-value pairs (`"key": value`). Omitted keys fall back to in-code defaults. | Key | Type | Default | Description | | --- | --- | --- | --- | | `camera_speed` | float | `20.0` | Scales how fast the free camera pans when you move the mouse to the screen edge or hold movement keys. Raise for faster fly-through, lower for precise adjustments. | | `ghost_reset_distance` | float | `10.0` | Minimum distance (units) between the player and the nearest ghost before the player is snapped back to the maze start. Increase for a safer buffer, decrease for higher tension. | | `ghost_count` | int | `800` | Number of ghosts spawned across the maze at startup. | | `minimap_enabled` | int | `1` | Set to `0` to disable the minimap overlay entirely. | | `minimap_width` / `minimap_height` | int | `200` / `200` | Size in pixels of the minimap rectangle rendered in the bottom-left corner. | | `minimap_margin` | int | `16` | Padding (pixels) between the minimap and the screen edges. | | `minimap_wall_[rgb]` | float | `0.0 / 0.0 / 0.0` | Wall line color per channel (0–1). | | `minimap_background_[rgb]` | float | `1.0 / 1.0 / 1.0` | Background fill color per channel (0–1). | | `minimap_arrow_[rgb]` | float | `1.0 / 0.0 / 0.0` | Player arrow color per channel (0–1). | | `minimap_zoom` | float | `2.0` | Zoom level (pixels per world unit) for the minimap. | | `minimap_breadcrumb_[rgb]` | float | `1.0 / 0.3 / 0.3` | Breadcrumb dot color per channel (0–1). | | `minimap_breadcrumb_radius` | float | `3.0` | Breadcrumb radius in pixels. | | `breadcrumb_max_distance` | float | `200.0` | Bread crumbs beyond this world-space distance from the player are not drawn (both in-world and on the minimap). | | `minimap_ghost_fill_[rgb]` | float | `0.9 / 0.9 / 1.0` | Ghost dot interior color on the minimap. | | `minimap_ghost_border_[rgb]` | float | `0.2 / 0.2 / 0.4` | Ghost dot border color. | | `minimap_ghost_radius` | float | `4.0` | Ghost indicator radius in pixels. | Example: ```json { "camera_speed": 30.0, "ghost_reset_distance": 8.5, "ghost_count": 600, "ghost_count": 600, "minimap_enabled": 1, "minimap_width": 220, "minimap_height": 220, "minimap_margin": 24, "minimap_wall_r": 0.0, "minimap_wall_g": 0.0, "minimap_wall_b": 0.0, "minimap_background_r": 1.0, "minimap_background_g": 1.0, "minimap_background_b": 1.0, "minimap_arrow_r": 1.0, "minimap_arrow_g": 0.0, "minimap_arrow_b": 0.0, "minimap_zoom": 2.0, "minimap_breadcrumb_r": 1.0, "minimap_breadcrumb_g": 0.3, "minimap_breadcrumb_b": 0.3, "minimap_breadcrumb_radius": 3.0, "breadcrumb_max_distance": 200.0, "minimap_ghost_fill_r": 0.9, "minimap_ghost_fill_g": 0.9, "minimap_ghost_fill_b": 1.0, "minimap_ghost_border_r": 0.2, "minimap_ghost_border_g": 0.2, "minimap_ghost_border_b": 0.4, "minimap_ghost_radius": 4.0 } ``` ## Minimap Overlay The minimap is a HUD overlay that reuses data parsed from `maze.txt` to draw a scrolling view of the maze. Player breadcrumbs are recorded every second and rendered as solid discs so you can retrace recent movement. Ghosts are displayed as border + fill circles that remain unrotated while the player arrow rotates with camera yaw. Tweak the overlay’s sizing, colors, and zoom via `ghostland.json`—when `minimap_zoom` increases, the entire map scales up; breadcrumb/ghost radius and colors are controlled by the dedicated `minimap_breadcrumb_*` and `minimap_ghost_*` keys described above. ![gameplay capture](https://stromsy.com/content/ghostland_6.gif)