{"id":50768371,"url":"https://github.com/bbfox0703/crimsonatomtic","last_synced_at":"2026-06-11T16:01:16.447Z","repository":{"id":361735449,"uuid":"1236258041","full_name":"bbfox0703/CrimsonAtomtic","owner":"bbfox0703","description":"A fast, structed Crimson Desert save editor","archived":false,"fork":false,"pushed_at":"2026-06-09T14:04:20.000Z","size":16489,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-09T15:25:28.029Z","etag":null,"topics":["crimson-desert","save-editor"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bbfox0703.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":null,"dco":null,"cla":null}},"created_at":"2026-05-12T04:57:00.000Z","updated_at":"2026-06-09T14:18:22.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/bbfox0703/CrimsonAtomtic","commit_stats":null,"previous_names":["bbfox0703/crimsonatomtic"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/bbfox0703/CrimsonAtomtic","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bbfox0703%2FCrimsonAtomtic","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bbfox0703%2FCrimsonAtomtic/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bbfox0703%2FCrimsonAtomtic/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bbfox0703%2FCrimsonAtomtic/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bbfox0703","download_url":"https://codeload.github.com/bbfox0703/CrimsonAtomtic/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bbfox0703%2FCrimsonAtomtic/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34206492,"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-11T02:00:06.485Z","response_time":57,"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":["crimson-desert","save-editor"],"created_at":"2026-06-11T16:01:15.341Z","updated_at":"2026-06-11T16:01:16.438Z","avatar_url":"https://github.com/bbfox0703.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CrimsonAtomtic\n\n\u003cimg src=\"./img/Logo.webp\" alt=\"CrimsonAtomic\"/\u003e  \n\n[![Platform](https://img.shields.io/badge/Platform-Windows%20x64-0078D4)](https://www.microsoft.com/windows)\n[![License](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)\n[![.NET](https://img.shields.io/badge/.NET-10.0-512BD4)](https://dotnet.microsoft.com/)\n[![Avalonia](https://img.shields.io/badge/Avalonia-UI-8B5CF6)](https://avaloniaui.net/)\n[![Built with Claude Code](https://img.shields.io/badge/Built%20with-Claude%20Code-CC785C?logo=claude)](https://claude.ai/code)\n[![Game Version](https://img.shields.io/badge/Game-Crimson%20Desert%201.05%E2%80%931.10-D63B3B)](https://www.playcrimsondesert.com/)\n\nA clean, fast save editor + game-data toolchain for **Crimson Desert** (Pearl\nAbyss). Two things move independently here:\n\n- **Save read/write is version-agnostic.** Each save embeds its own schema, so\n  the editor reads and **re-saves any patch's save (1.05–1.10) in that save's\n  own format** — no version conversion. Open a 1.05 save, edit it, save it\n  back, and it stays a 1.05 save (the version stamp is preserved; the round-trip\n  is byte-perfect). You never need to downgrade your install to open an older\n  save.\n- **Item names / icons resolve against the installed game (currently 1.10).**\n  Name and icon lookup reads the live install's game-data, *not* the schema\n  embedded in the save. So structural editing of an old save always works, but\n  if an item's key changed between that save's patch and 1.10 it may show as a\n  bare key instead of a name. This is also why the editor warns **once at\n  startup** if your *installed game* isn't a version it can resolve names for\n  (right now: anything other than 1.10) — that warning is about your install,\n  not about which save you open.\n\nCross-platform goal: Windows (primary), Linux, macOS.\n\n\u003cimg src=\"./img/UI_demo_01.webp\" alt=\"UI\"/\u003e  \n\n## Layout\n\n```\nCrimsonAtomtic/\n├── CLAUDE.md                 # minimal rule index — start here\n├── CrimsonAtomtic.slnx       # .NET solution\n├── Directory.Build.props     # shared MSBuild settings\n├── Directory.Packages.props  # central package versions\n├── global.json               # .NET SDK pin (10.0.x)\n├── docs/                     # architecture, format specs, data hygiene policy\n├── src/                      # C# / Avalonia 12 / .NET 10 / Native AOT\n│   ├── CrimsonAtomtic.Core         # platform abstractions\n│   ├── CrimsonAtomtic.SaveModel    # domain types (records + AOT JSON ctx)\n│   ├── CrimsonAtomtic.RustInterop  # crimson-rs P/Invoke layer\n│   ├── CrimsonAtomtic.Ui           # Avalonia app\n│   └── CrimsonAtomtic.Tests        # xUnit 3\n├── tools/                    # Python 3.12+ toolchain: extract / diff / inspect / analyze\n├── vendor/                   # cloned external deps (only crimson-rs for now)\n└── scripts/                  # build / setup / package scripts (PowerShell 7+)\n```\n\n## Why this project exists\n\nA fresh save editor for Crimson Desert, built around a few clear architectural choices:\n\n- Native AOT C# / Avalonia UI for performance and a fast startup path.\n- A single Rust core (`vendor/crimson-rs`, our fork) owns all binary-format\n  knowledge. No format logic is duplicated into C# or Python.\n- Hygienic data flow: only sources are committed; derived files are\n  regenerated, not stored. See [docs/data-policy.md](docs/data-policy.md).\n\nFor the full architectural rationale see [docs/architecture.md](docs/architecture.md).\n\n## Editor features (current)\n\nThe UI ships with a left-rail navigator over the decoded save and a focused\nset of Tools-menu bulk operations. Highlights:\n\n- **Generic block / field editor** — every TOC block surfaced as a tree;\n  per-field edit with typed validation, present/absent toggle, change\n  journal, and a close-on-dirty save prompt. Composite scalars\n  (`float3` / `float4` / `quaternion` / `uint4`) display + edit through a\n  single bracketed textbox (e.g. `\"[1.5, 2.0, -3.25]\"` for a position).\n- **Inventory** — virtualised lists per container, item picker with icons\n  via the on-disk `IconCache/`, add-to-bag, fill-stacks-to-max (per bag and\n  across all inventories), remove-element.\n- **Sockets editor (v2)** — Fill / Change / Clear per slot, durability\n  reset for greater gems, 3 built-in + 3 user-customisable gem sets with\n  an Apply-Set toolbar, automatic `_validSocketCount` bump.\n- **Dye editor** — per-item slot editor with R/G/B/A + grime + material\n  (palette tier) + colour-group dropdowns, all resolved live from the\n  three dye gamedata bridges. Async load + \"Loading dyed items…\"\n  feedback for large saves.\n- **Sealed Abyss Artifact challenges** — per-row \"Mark Challenge Complete\"\n  (Pattern B v1: FAR tracker flip + X_2 sub-mission insert) plus\n  **Tools → Complete All Sealed Abyss Artifact Challenges** which sweeps\n  every challenge whose data shape qualifies, regardless of whether the\n  artifact item is still held. Bulk dialog shows per-key skip reasons so\n  out-of-scope cases (multi-objective Living_*/Cooking shapes) are\n  explicitly explained. Deferred-redecode batch collapses ~423 body\n  re-decodes into one (200× wall-clock speedup on the 141-challenge\n  sweep).\n- **Abyss Gates** — bulk **Unlock All Abyss Gates (Map Discovery)** for\n  the knowledge layer plus a per-gate Lock/Unlock dialog for the gate-state\n  layer.\n- **Mount Unlock** — Tools → **Unlock Mounts** dialog. The six sigil-gated\n  special mounts (White Bear, Silver Fang, Snowwhite Deer, Alpine Ibex,\n  Rock Tusk Warthog, Phoenix) are unlocked the game-legitimate way: the\n  matching *Sigil of Solidarity* is granted into Quest Artifacts; you use\n  it in-game and the engine does the rest. The **Dragon (Blackstar)** is\n  unlocked fully in-editor — its real mercenary element (a 212-byte captured\n  blob whose schema type-indices are remapped onto your save by class name)\n  is inserted, its 187-key riding knowledge injected, and its HP filled — no\n  whole-save donor required.\n- **Knowledge editor** — Tools → **Edit Knowledge**. Every `knowledgeinfo`\n  entry bucketed into 16 curated categories, with search + learned/unlearned\n  filters and a checkbox table (Select all / Unselect all / Invert). Learn\n  per-item or per-category — never a blunt \"learn everything\" — with a\n  warning before map-reveal (`Node`) or codex (`Collection`) bulk sets.\n- **Vendor Buyback** — list every item the player has sold to vendors\n  (StoreKey resolved live via `storeinfo.pabgb`), per-row Remove to\n  free a buyback slot, per-row **Jump…** to open the item in the main\n  block editor for stack / endurance / sockets / dye edits; two-pass\n  filter (store-name match expands to every sold item in that store;\n  item-name narrows per-row).\n- **Mercenary rename** — with character portrait column driven by the\n  PAZ NPC portrait pipeline, plus generic class glyphs (🐎 / 🛒 / 🎈 /\n  🦌 / 👤) for mounts / wagons / animals / NPCs that don't ship a\n  per-character portrait.\n- **Browse Items / Browse Characters / NPCs** — reference dialogs over the\n  full `iteminfo` and `characterinfo` tables. The character browser\n  doubles as a **modal CharacterKey picker** invoked from the main\n  edit panel for `CharacterKey`-typed scalar fields.\n- **Browse Character References** — flat-list every save-side\n  `CharacterKey` reference (top-level + nested) via the\n  `crimson_save_list_character_refs` C ABI; per-row **Jump…** navigates\n  the main block tree to the containing block. Banner warns that\n  reference linkage is best-effort across different field contexts.\n- **Find Items** — cross-bag search with per-row Go button that jumps the\n  main window straight to the item-detail view.\n- **Auto-find saves on launch** — Steam / Epic / Game Pass plain-folder\n  probe + most-recent preference + per-platform backup tree.\n- **First-launch disclaimer** — bilingual (中文 + English) modal shown\n  once per machine; acceptance persisted to `settings.json`. Version-\n  gated so future material changes can re-prompt every user.\n- **32 key-resolver bridges** — name resolution for `MissionKey`,\n  `QuestKey`, `StageKey`, `KnowledgeKey`, `CharacterKey`, `SkillKey`,\n  `StoreKey`, `MercenaryKey`, `RegionKey`, `ItemGroupKey`, etc. — all\n  decoded live from the game's own gamedata catalogs so the user sees\n  \"Hernandian Honor Guard Armor / 赫南迪安榮譽近衛盔甲\" instead of\n  `9102 \u003cu32\u003e`.\n\nSee [docs/status.md](docs/status.md) for the full feature ledger and roadmap.\n\n## Stack\n\n| Layer | Tech |\n|---|---|\n| App / UI | Avalonia UI 12 on .NET 10, Native AOT trimmed |\n| Native core | Rust ([`vendor/crimson-rs`](vendor/crimson-rs/), C ABI + PyO3 from one cdylib) |\n| Tooling | Python 3.12+ under [`tools/`](tools/) |\n| Tests | xUnit 3 (C#), pytest (Python), `cargo test` (Rust) |\n\n## Thanks\n\nThanks to the community save editor `CRIMSON-DESERT-SAVE-EDITOR` for being a useful reference point during early reverse-engineering.\n\nThanks also to NattKh's\n[CRIMSON-DESERT-SAVE-EDITOR-AND-GAME-MODS](https://github.com/NattKh/CRIMSON-DESERT-SAVE-EDITOR-AND-GAME-MODS)\n— a valuable reference for several save structures (including the dragon-mount\nelement + knowledge set behind our Mount Unlock feature).\n\n## First-time setup\n\n```powershell\n# 1. Fetch vendored deps (clones crimson-rs from D:\\Github\\crimson-rs)\n.\\vendor\\update_vendors.ps1\n\n# 2. Build Rust core (produces crimson_rs.dll with both C ABI + PyO3)\n.\\scripts\\build_rust.ps1\n\n# 3. Set up Python venv + install crimson_rs via maturin develop\n.\\scripts\\setup_python_env.ps1\n\n# 4. Build the Avalonia UI\n.\\scripts\\build_ui.ps1\n```\n\n## Running a tool\n\n```powershell\n# After setup, with the venv active:\npython tools\\extract\\extract_iteminfo.py --help\n```\n\nEvery script in `tools/` prints full usage when run with no arguments. See\n[tools/CLAUDE.md](tools/CLAUDE.md) for conventions.\n\n## License\n\n[MIT](LICENSE). This project does not derive from any other editor's code;\nthe Rust core under `vendor/crimson-rs` is our own work.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbbfox0703%2Fcrimsonatomtic","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbbfox0703%2Fcrimsonatomtic","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbbfox0703%2Fcrimsonatomtic/lists"}