{"id":51121026,"url":"https://github.com/brian-gates/sts2-damage-charts","last_synced_at":"2026-06-25T02:30:28.757Z","repository":{"id":366512049,"uuid":"1275467294","full_name":"brian-gates/sts2-damage-charts","owner":"brian-gates","description":"In-combat damage analytics overlay mod for Slay the Spire 2 (Godot/C#) — per-round dealt/taken bars plus a by-source breakdown.","archived":false,"fork":false,"pushed_at":"2026-06-22T07:16:28.000Z","size":157,"stargazers_count":0,"open_issues_count":11,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-22T07:26:46.206Z","etag":null,"topics":["csharp","game-overlay","godot","harmony","mod","modding","slay-the-spire-2","sts2"],"latest_commit_sha":null,"homepage":null,"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/brian-gates.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-06-20T18:17:48.000Z","updated_at":"2026-06-22T07:16:33.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/brian-gates/sts2-damage-charts","commit_stats":null,"previous_names":["brian-gates/sts2-damage-charts"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/brian-gates/sts2-damage-charts","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brian-gates%2Fsts2-damage-charts","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brian-gates%2Fsts2-damage-charts/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brian-gates%2Fsts2-damage-charts/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brian-gates%2Fsts2-damage-charts/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/brian-gates","download_url":"https://codeload.github.com/brian-gates/sts2-damage-charts/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brian-gates%2Fsts2-damage-charts/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34757353,"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-25T02:00:05.521Z","response_time":101,"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":["csharp","game-overlay","godot","harmony","mod","modding","slay-the-spire-2","sts2"],"created_at":"2026-06-25T02:30:28.076Z","updated_at":"2026-06-25T02:30:28.751Z","avatar_url":"https://github.com/brian-gates.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Damage Charts — Slay the Spire 2 mod\n\nA standalone in-combat damage analytics overlay for [Slay the Spire 2](https://www.megacrit.com/).\n\n- **Always-on compact chart** (top-right): grouped bars per round of damage **dealt** (solid) vs\n  **taken** (faded). Per-player colors in multiplayer.\n- **Hotkey-toggled full-screen breakdown** (default **C**, for \"combat stats\"): a full-screen\n  takeover with two columns — damage **dealt** and **taken** broken down **by source** (each card by\n  name; powers/DoTs like Poison, Doom, Thorns; orbs; relics), with totals and percentages, sorted\n  highest-first, over a tall scrollable combat log (mouse-wheel or drag the scrollbar).\n- **End-of-run recap**: the same hotkey, pressed **out of combat** (e.g. on the run's victory/death\n  screen), opens a run-wide recap — total **dealt / taken / healed / block**, the by-source breakdown,\n  a per-**fight** chart, and the whole run's combat log. The aggregate resets when a new run begins.\n- Single-player and multiplayer. Reads game state directly — no dependency on any other mod.\n\n## Requirements\n\n- A copy of **Slay the Spire 2** installed (the build references the game's own assemblies; nothing\n  proprietary is bundled or redistributed here).\n- The **.NET 9 SDK** to build the mod from source.\n\n## How it works\n\n- **Amounts** come from subscribing to each `Creature.CurrentHpChanged` event (true post-block HP\n  loss). Player-creature drops = taken; enemy drops = dealt; heals ignored.\n- **Source attribution** comes from one Harmony Prefix on the central\n  `CreatureCmd.Damage(..., IEnumerable\u003cCreature\u003e targets, decimal, ValueProp, Creature? dealer,\n  CardModel? cardSource)`. Card damage uses `cardSource.Title`; non-card damage resolves the\n  source from the calling type on the stack (`PoisonPower` → \"Poison\"). One patch covers every\n  damage source; unknowns bucket as \"Other\".\n\n## Build \u0026 install\n\nThe project resolves the game's DLLs (`sts2.dll`, `GodotSharp.dll`, `0Harmony.dll`) at build time\nfrom your STS2 install. Point `STS2GameDir` at that install. The build is the same on every\nplatform; only the install path and the `mods/` location differ.\n\n### macOS\n\n```bash\nGAME_DIR=\"$HOME/Library/Application Support/Steam/steamapps/common/Slay the Spire 2\"\ndotnet build STS2_DamageCharts.csproj -c Release -o out -p:STS2GameDir=\"$GAME_DIR\"\nMODS_DIR=\"$GAME_DIR/SlayTheSpire2.app/Contents/MacOS/mods\"\ncp out/STS2_DamageCharts.dll \"$MODS_DIR/\"\ncp mod_manifest.json \"$MODS_DIR/STS2_DamageCharts.json\"\n```\n\n### Windows\n\n```powershell\n# Adjust to your Steam library; the .csproj defaults to D:\\SteamLibrary\\... if unset.\n$GameDir = \"C:\\Program Files (x86)\\Steam\\steamapps\\common\\Slay the Spire 2\"\ndotnet build STS2_DamageCharts.csproj -c Release -o out -p:STS2GameDir=\"$GameDir\"\ncopy out\\STS2_DamageCharts.dll \"$GameDir\\mods\\\"\ncopy mod_manifest.json \"$GameDir\\mods\\STS2_DamageCharts.json\"\n```\n\n### Linux\n\n```bash\nGAME_DIR=\"$HOME/.steam/steam/steamapps/common/Slay the Spire 2\"\ndotnet build STS2_DamageCharts.csproj -c Release -o out -p:STS2GameDir=\"$GAME_DIR\"\ncp out/STS2_DamageCharts.dll \"$GAME_DIR/mods/\"\ncp mod_manifest.json \"$GAME_DIR/mods/STS2_DamageCharts.json\"\n```\n\nThen launch the game and enable **Damage Charts** in **Settings → Mods** (accept the consent dialog\non first launch). Restart the game after replacing the DLL — mods load at startup.\n\n## Steam Workshop\n\n### Players\n\nSubscribe to **Damage Charts** on the Steam Workshop and it installs automatically — no manual file\ncopying. Enable it in **Settings → Mods** and restart the game.\n\n### Maintainers (publishing)\n\nPublishing uses MegaCrit's official [`sts2-mod-uploader`](https://github.com/megacrit/sts2-mod-uploader),\nwhich talks to Steam directly — so it runs **locally with the Steam client open and logged in**, never\nin CI. The workspace lives in `dist/workshop/` (`workshop.json` + `image.png`); built content is staged\ninto `dist/workshop/content/` (git-ignored).\n\n```bash\n# One-time: download the uploader (osx-arm64) from the sts2-mod-uploader releases page,\n# place the binary at ./tools/ModUploader (git-ignored), or set $MODUPLOADER.\n\n# Build, stage content/, and upload (or print the upload command if the CLI isn't found):\n./scripts/package-workshop.sh\n```\n\nFirst run **creates** the Workshop item with the visibility set in `workshop.json` (starts `private`)\nand writes `dist/workshop/mod_id.txt` — **commit that file** so later runs update the same item.\nAfter the first publish, subscribe in-client and verify the overlay loads in a run, then flip\n`visibility` to `public` (in `workshop.json` or on the Workshop page) and re-run the script.\n\n## Config — `STS2_DamageCharts.conf` (next to the DLL in `mods/`)\n\n```json\n{\n  \"enabled\": true,\n  \"hotkey\": \"c\",\n  \"show_bars\": true\n}\n```\n\n- `hotkey`: a bare key like `c` (the default) or `f9`, or modifier+key, e.g. `cmd+d`, `shift+d`, `alt+d`, `ctrl+d`.\n- `show_bars`: set `false` to hide the always-on bars and use only the hotkey panel.\n- `run_recap`: set `false` to disable the out-of-combat end-of-run recap (the hotkey then only toggles\n  the in-combat breakdown).\n- `ui_scale`: a number (default `1.0`) that scales the overlay — the always-on chart and the full-screen\n  breakdown/recap (text and spacing) — on top of the automatic resolution scaling. Bump it (e.g. `1.5`)\n  if the text reads too small. Applied live, no restart needed.\n- `source_hooks`: **default `false`.** When `true`, damage-over-time and relic/orb/potion hits are\n  attributed by name (Poison, Doom, Thorns, …) instead of the generic `Status`/`Other`. This requires\n  Harmony-patching many game methods, which can intermittently destabilize the game (a hard hang / \"Bad\n  IL range\"), so it ships off. Enable at your own risk; all other stats work regardless.\n\nEdits to this file are picked up live — change the `hotkey` or `show_bars` and it applies within\nabout half a second, no restart needed.\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrian-gates%2Fsts2-damage-charts","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbrian-gates%2Fsts2-damage-charts","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrian-gates%2Fsts2-damage-charts/lists"}