Please add comments if you experience an issue - if it is regarding a missing item or an item showing where it shouldnt, provide the related encounter please!
# SHART — Spec Handler And Roll Tracker
The complete loot-spec and bonus-roll utility for Midnight Season 1. Stop missing spec swaps right before the pull. Stop guessing whether to spend that Nebulous Voidcore. SHART tracks your wishlists, your Voidcore balance, your weekly cap, and every bonus-roll outcome — and runs your loot-spec swaps automatically the moment a fight starts.
---
## Features
### Automatic loot-spec swapping
Set a preferred loot spec for each raid boss and each Mythic+ dungeon. SHART switches your loot spec the moment you target a boss, the encounter starts, or you zone into a dungeon — and switches back when the encounter ends.
If you'd rather decide manually, set the mode to **Reminders** and you'll get a chat notification instead of an auto-swap.
### Voidforge bonus-roll advisor
The instant the Voidforge prompt opens after a kill, SHART pops up a side panel with:
- Your **remaining wishlisted items** for that activity
- Your **odds of getting a wishlisted item** from this specific roll (e.g. *"1 in 7.5, 13.3%"*)
- Your current **Voidcore balance**, your **spend this week**, and your **weekly cap**
You see the math before you click Spend.
### Encounter Journal wishlist
Open the in-game Encounter Journal (default key: **J**), browse loot, and click the checkbox SHART injects next to each item. No external website, no item-ID copy-paste. Wishlists are stored per-boss and per-dungeon, and items you've already received drop out of your remaining-items count automatically.
### "Mark Items as Won" manager
Already got an item from a vendor, BoE, or group-loot run? Open the Won Manager (`/shart won`) and check it off. The item disappears from your wishlist summary. Change your mind? Untick it — the wishlist entry is restored automatically.
Bonus: a per-spec radio row at the top of the Won Manager lets you flip between your specs and **preview the loot pool for each one** before committing.
### Smart item filtering, every class and every spec
- Class armor-type and weapon-proficiency tables for all 13 classes (including the new Demon Hunter Devourer spec)
- Flex-stat items (Agi/Int, Str/Int, all-three) routed correctly to every spec whose primary is in the set
- Healer-only items hidden for DPS, tank-only trinkets hidden for non-tanks — detected by both item name AND tooltip text (catches items like *Whisper of the Duskwraith* whose name doesn't say "healing")
- Tier tokens (**Nullcore** / **Riftbloom** / **Void Curio**) classified by name pattern and matched to the right armor class
- When Blizzard tags an item with an explicit spec list, that list is treated as authoritative — handles loot-spec stat conversion correctly (an item that displays "Intellect" but converts to Agi for the looter still shows up for Agi specs)
### Roll tracker
Every bonus-roll outcome is logged with item, source, and date. Wishlist hits are highlighted; misses are recorded too so you can see your real luck across a whole season.
The auto-detector watches for the **Voidcore balance to decrease** — it's the spend that arms the recorder, not the kill. Normal drops in the post-kill loot window won't be mis-attributed as bonus-roll outcomes.
### Voidcore currency tracking
Auto-discovers the Nebulous Voidcore currency on first run. Tracks current balance, weekly cap, and spent-this-week count. Drives the advisor odds and shows up in the main UI banner.
### Performance
Engineered to be invisible when it isn't doing work:
- **No always-on tickers.** The Voidforge popup watcher only runs while a roll is pending; the Encounter Journal injector only runs while the EJ is open.
- **Combat-heavy events** (target changes, nameplate adds) are registered only inside raids — open-world and dungeon CPU cost is effectively zero.
- **Filter results cached** per item, so opening the Won Manager twice in a row is instant.
### Minimap button
Optional minimap button with a poop emoji icon. (*It's not a bug, it's a feature.*) Draggable, position-saved, left-click opens the main UI, right-click pops a quick-access menu (Spec Swaps / Bonus Rolls / Roll Tracker / Mark Items as Won / Hide). Also wired into the addon-compartment dropdown.
Toggle anytime with `/shart minimap show` or `/shart minimap hide`.
---
## Getting started
1. Install and `/reload`
2. Type `/shart` to open the main UI
3. **Spec Swaps** tab — assign a loot spec to each raid boss and dungeon you care about
4. **Bonus Rolls** tab — open the Encounter Journal once and tick the items you want
5. Play
The addon ships with a pre-built loot pool for every Midnight Season 1 activity, so the Won Manager and odds advisor work out of the box. Captures are unioned with the seed, so any per-character or alt data is preserved.
---
## Settings
- **Mode:** *Auto* (recommended) / *Reminders* / *Off*
- **Raid difficulty:** LFR / Normal / Heroic / Mythic — drives what counts as a real pull
- **Per-character** data for swap state; **account-wide** captured-pool encyclopedia so your alts share the same Midnight S1 loot data
---
## Compatibility
- Retail only — Midnight 12.x patch onward
- No known conflicts with WeakAuras, Details, ElvUI, BigWigs, or DBM
- No external library dependencies
---
## Slash commands
### Everyday commands
| Command | What it does |
|---|---|
| `/shart` | Open the main UI (Spec Swaps + Bonus Rolls tabs) |
| `/shart rolls` | Open the Roll Tracker window |
| `/shart won` | Open the Mark Items as Won manager |
| `/shart status` | Print a one-line summary to chat (Voidcores in bag, spent this week, weekly cap, wishlist size) |
| `/shart mode Off\|Reminders\|Auto` | Change behavior mode |
| `/shart minimap show\|hide` | Toggle the minimap button |
Also responds to: `/spechandlerandrolltracker`, `/mls`, `/midnightlootswap`
### Power-user commands
| Command | What it does |
|---|---|
| `/shart populate` | Bulk-capture every activity's loot from the Encounter Journal API. Tries multiple difficulties so legacy-tuned dungeons (Pit of Saron, Skyreach, etc.) get their full current loot tables. Use this whenever a patch adds new items. |
| `/shart export` | Open the export popup — dumps the entire captured pool as paste-ready Lua. Useful for sharing or backing up. |
| `/shart wishlist add <activity> <itemID>` | Manually add an item to a wishlist (chat alternative to the EJ checkbox) |
| `/shart wishlist remove <activity> <itemID>` | Manually remove an item from a wishlist |
| `/shart roll <activity> <itemID> [name]` | Manually log a roll outcome — use this if the auto-detector misses one |
| `/shart voidcoreid <id>` | Manually override the Voidcore currency ID if auto-discovery missed it |
---
## Development / diagnostic commands
You almost certainly won't need these in normal play. They exist to help debug "why is this item showing / not showing for my spec?" and to inspect the addon's internal state during development.
| Command | What it does |
|---|---|
| `/shart debug item <itemID>` | Print the full filter trace for a specific item — armor type, weapon proficiency, primary stat, tier-token classification, healer/tank-only flags, and the final pass/fail verdict. The fastest way to diagnose "why doesn't this item show up?" |
| `/shart pooldebug` | Print captured-pool counts per activity, sample item info, seed-load status, and current min-ID threshold |
| `/shart ejscan` (or `/shart ejdebug`) | Force a fresh Encounter Journal scan, then print every discovered raid / dungeon / encounter mapping |
| `/shart ilvls` | Bucket every captured item by iLvl decile and print the distribution |
| `/shart minid <N>` | Set the minimum item-ID threshold for the legacy filter (default 246000; rarely needed since Midnight reuses legacy IDs for re-tuned dungeons) |
| `/shart cleanpool` | Manually run the legacy-ID prune on the captured pool |
| `/shart poolwipe` | Wipe the entire captured pool (run `/shart populate` afterwards to rebuild) |
| `/shart poolclear <activity>` | Wipe one specific activity's captured pool |
| `/shart scanpopup` | List every visible frame whose name contains "Voidforge" or "Voidcore" — use during a live Voidforge prompt if the advisor isn't appearing |
| `/shart scanloot` | Dump the structure of currently-visible EJ loot rows. Use with the Encounter Journal open |
| `/shart whereami` | Show which encounter / dungeon the Encounter Journal context currently resolves to |
| `/shart clearstate` | Reset the addon's swap/dungeon tracking state without touching saved settings |
| `/shart forget` | Clear all recorded encounter IDs (the addon will re-learn them on the next kill) |
| `/shart test on\|off` | Simulate dungeon entry / leave events for testing without entering an instance |
---
## Bug reports & feature requests
If you hit a "why doesn't this item show up?" issue, run `/shart debug item <itemID>` and include the output. If it's an encounter-detection issue, run `/shart ejscan` and include that.

