README: drop em-dashes, unwrap paragraphs to single lines

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Dominik Moritz Roth 2026-08-08 20:16:40 +02:00
parent 07c89c5be4
commit 0f29915c45

View File

@ -5,34 +5,18 @@
<br> <br>
</h1> </h1>
<p align="center"><b>Fe</b> (iron) + enigma we solve the geo puzzles.</p> <p align="center"><b>Fe</b> (iron) + enigma, we solve the geo puzzles.</p>
A companion app that mostly automates **IRON NEST: Heavy Turret Simulator** A companion app that mostly automates **IRON NEST: Heavy Turret Simulator** for you. Screenshot the game's typewriter orders and it solves the geo puzzle and the trajectory math, handing you ready-to-fire commands: elevation, azimuth, number of powder charges. Screenshot the field log and it picks up kills and newly-spotted units automatically. You can also plan strikes of your own, picking a shell for the blast radius you need. Pure screen-reading, no game files touched, no input injected.
for you. Screenshot the game's typewriter orders and it solves the geo
puzzle and the trajectory math, handing you ready-to-fire commands —
elevation, azimuth, number of powder charges. Screenshot the field log and
it picks up kills and newly-spotted units automatically. You can also plan
strikes of your own, picking a shell for the blast radius you need. Pure
screen-reading — no game files touched, no input injected.
![Showcase](showcase.png) ![Showcase](showcase.png)
## What it does ## What it does
- **Reads orders, solves the geometry.** Paste/screenshot the in-game - **Reads orders, solves the geometry.** Paste/screenshot the in-game typewriter text and it parses absolute grid refs and relative bearing/distance descriptions, then resolves everything into map coordinates, chained clues ("Bearing 293 from Alpha") included. The map shows its work: the actual bearing lines/circles behind each resolved position. When a description is genuinely ambiguous (two intersections), both candidates are shown instead of guessing.
typewriter text and it parses absolute grid refs and relative - **Calculates the shot.** Every resolved target gets a live firing card: elevation, azimuth, and minimum powder charge, computed from the Nest.
bearing/distance descriptions, then resolves everything into map - **Tracks the battle.** A second screenshot of the field log marks units destroyed and folds in newly-spotted contacts, merging with what's already known instead of duplicating it.
coordinates — chained clues ("Bearing 293 from Alpha") included. The - **Plans strikes.** Drop a strike anywhere on the map and pick a shell to preview its blast radius before committing.
map shows its work: the actual bearing lines/circles behind each
resolved position. When a description is genuinely ambiguous (two
intersections), both candidates are shown instead of guessing.
- **Calculates the shot.** Every resolved target gets a live firing card:
elevation, azimuth, and minimum powder charge, computed from the Nest.
- **Tracks the battle.** A second screenshot of the field log marks units
destroyed and folds in newly-spotted contacts, merging with what's
already known instead of duplicating it.
- **Plans strikes.** Drop a strike anywhere on the map and pick a shell to
preview its blast radius before committing.
## Run ## Run
@ -40,14 +24,8 @@ screen-reading — no game files touched, no input injected.
./run.sh ./run.sh
``` ```
GTK apps with this app ID are single-instance — if a run gets killed GTK apps with this app ID are single-instance, if a run gets killed uncleanly it can leave a zombie registered on D-Bus and silently no-op the next launch. If `./run.sh` seems to do nothing, `pgrep -af ironnest_assist` and kill any stragglers first.
uncleanly it can leave a zombie registered on D-Bus and silently no-op the
next launch. If `./run.sh` seems to do nothing, `pgrep -af ironnest_assist`
and kill any stragglers first.
## Stack ## Stack
GTK4 + libadwaita (PyGObject) for the UI, Tesseract (via pytesseract) for GTK4 + libadwaita (PyGObject) for the UI, Tesseract (via pytesseract) for OCR, Pillow/numpy for preprocessing. Details on the coordinate system, OCR formats, and solver internals live in code comments (`solver.py`, `ocr.py`, `models.py`) rather than here.
OCR, Pillow/numpy for preprocessing. Details on the coordinate system,
OCR formats, and solver internals live in code comments (`solver.py`,
`ocr.py`, `models.py`) rather than here.