icarus pet editor
Icarus Pet Editor
A web-based save editor for Icarus pets, mounts, and farm animals. Served at /pets
on the portal as a Flask Blueprint.
Project Details
| Field | Value |
|---|---|
| GitLab Project | icarus/pets |
| GitLab Project ID | 1 |
| Repository | https://git.eurekaendeavors.com/icarus/pets |
| Visibility | private |
| License | GPL v3 |
| Portal route | /pets |
| Package name | icarus-pets |
| Depends on | icarus/core |
| Status | ✅ Live — 1,162+ uploads processed |
What It Does
Users upload their Icarus Mounts.json save file, modify pets and animals in the
browser, and download the modified file. No installation required.
Supported features: - Edit pets, mounts, and farm animals (26 creature types) - 457 talents — view, assign, reset, click-to-cycle ranks - Phenotype editing (colour, pattern, size) with pak-sourced variation data - Species swap (change creature type while preserving talents) - Clone pets (with unique GUID generation) - Create new pets from templates (with GUID) - Delete pets - Breed/bloodline swap - Session-based: no persistent storage of save data
Package Architecture
icarus/pets is a pip-installable package (icarus_pets) and a git submodule in the
portal at icarus-pets/.
Canonical data sources (in icarus_pets):
- talent_data.py — 457 talent definitions
- variation_data.py — Phenotype variations (pak-sourced from D_MissionNPC.json)
- breed_data.py — Breed/colour sub-variants
- template_data.py — New pet templates
- bestiary_data.json — Creature type metadata
Portal wiring (thin re-exports):
- portal/blueprints/pets/data/*.py — re-exports from icarus_pets (don't edit directly)
- portal/blueprints/pets/__init__.py — create_blueprint() factory
Variation Data
Variation (phenotype) data is sourced from D_MissionNPC.json in the game's data.pak,
NOT from D_Mounts.json (which is actually saddle data despite the name).
Types with pak-sourced variations: Buffalo(8), Moa(8), Wolf(8), Raptor(8), RaptorDesert(8), TundraMonkey(8), Slinker(7).
Naming gotchas:
- Slinker = Stalker mount in-game (devs use inconsistent naming)
- Snow Striker ≠ Stalker. Snow Striker is an NPC with no mount blueprint.
- Cat is a domestic cat (Tame_Cat), not the Stalker — no variations.
- Chew is the old Draven — zero variations in pak.
- Game shows Phenotype [{0}] — no human-readable phenotype names exist in game data.
Bug History
| Issue | Problem | Fix |
|---|---|---|
| Bloodline bug | Hardcoded dropdown showed wrong options | Populate from authoritative data source |
| #124 | Slinker variations keyed under Chew | Rekeyed to Slinker |
| GUID clone bug | Cloned mounts shared source GUID → despawn each other | Fresh GUID on clone |
| GUID create bug | Template had no GUID → can't deploy to planet | GUID field added to templates |
| #150 | Pre-fix clones with duplicate GUIDs | dedup_actor_guids() runs on upload |
| #151 | Species swap from old saves loses ownership | Under investigation |
Accessibility (WCAG 2.1 Level A)
| Feature | Notes |
|---|---|
Upload error alert links to input via aria-describedby |
Error div conditionally rendered |
Error alert contains Fix this issue link anchored to #savefile |
Guides keyboard/SR users |
Talent card aria-label includes creature name |
Format: "<Creature>: <Talent> — <Desc> — rank N of M" |
aria-label updated on rank cycle |
Label stays current via cycleTalent() |
Deprecation of .exe Releases
The previous desktop application (IcarusPetEditor-vX.X.X-win64.zip) is deprecated and
archived to icarus/icarus-pets-tkinter-deprecated (project ID 9, now deleted from
GitLab). The web Blueprint replaces it entirely.