forge_api.py:
- Split Nightmare Arena into its own action (separate legendary counts, no rate)
- Dwarf-Multi: /player & /player-detail accept names= to union multiple accounts
- Arena/Nightmare leaderboard: "Most legendarys" sort; luckiest/unluckiest now
legendary-per-attempt ratio (no floor, >=1 always beats 0)
forge_stats.js:
- Sub-tabs restructured to Leaderboard (default) + Totals; Item Tables moved under
Totals as "Dwarf" (first); Combine Accounts moved into the lookup
- Combined-account dwarf items are clickable for level distribution
- Nightmare shows legendarys like arena; sort options gated per drop action
app.py:
- VIP backend + Space-side sidecar (vip_lookup.js reads world_10 VIPLeaderboard via
authenticated lookup account), /vip-status + /ingest-vip
index.html:
- VIP badge (no star), Thorns/Freeze formula cards, forge_stats.js cache bump
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Client (static/analytics.js): smTrack('cat:name') sammelt Events und schickt
sie gebuendelt per navigator.sendBeacon('/track') -> feuern-und-vergessen,
blockiert nie den Render-/Interaktionspfad. Nichts Personenbezogenes (kein
Name/IP/UA). Hooks: Tab-Wechsel, Optimize (market/nomarket), Leaderboard-Suche,
Account-/Room-/Clan-/Forge-Lookup, welche Forge-Stat-Details geoeffnet werden.
Server (app.py): /track zaehlt In-Memory pro UTC-Tag + flusht gedrosselt
(<=1x/60s) als winziges JSON nach /data/usage_stats.json; Kategorie-Allowlist
+ Zeichensatz/Laenge + Tages-Kardinalitaetsdeckel + 4KB-Body-Cap als
Flood-Schutz. /usage-admin (MOD-only, wie power-series-admin): stats/raw/csv/
clear. Heisse Pfade (Leaderboard/Stream/Lookups) unberuehrt.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Launch mob-kill leaderboard UI + allow comments on 'planned' suggestions
Mob-kill leaderboard now visible: 3rd sub-tab in the Leaderboards tab (Player /
Forge & Actions / Mob Kills). Pick any of the 29 enemies -> ranked accounts by kills
of that mob, styled like the player leaderboard, with a total-kills counter on top.
Backed by the cached per-enemy count arrays already deployed. Data is now populated
(~39k accounts with kill data after a full pusher cycle, top killers correct).
Files: static/mob_leaderboard.js (new), static/forge_stats.js (sub-tab wiring),
static/index.html (include + cache-bust bumps).
Suggestions: 'planned' posts are now commentable too (were locked like the finished
statuses). open + planned stay open for non-mod comments; implemented/declined/closed
stay locked. Enforced on both sides: feedback_comment endpoint and feedback_tab.js
composer gate.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Reworked the forge lucky/unlucky to match how players think about it,
all computed per-player in forge_api at query time (no DB rebuild):
- Per-action LUCK = percent over/under expected, shown ONLY for dwarf,
elf, pet_enhance (there the odds are clean; dwarf/elf via the logged
luck% incl. Fortune, pet via per-pet rate). smelt/enchant/downgrade
get no luck chip -- their odds depend on free/paid & player level
which the logs don't record. arena shows only the legendary count.
- VALUE per action (dwarf/elf/pet) + the OVERALL "lucky/unlucky" is now
value-weighted over dwarf+elf+pet: realized vs expected value, input
always lost, output only on success (dwarf -> item L+1, elf -> the
legendary L1, pet -> the XPet). Elf is included. Weighted so a failed
expensive elf/L9 legendary dominates and cheap noise doesn't.
- New forge_prices.json (bundled price snapshot) + ELF/PET recipes let
the API price the value swings without a price service. Global bucket
rates cached from…
Two fixes to the forge lucky/unlucky calculation:
1) Per-action luck for smelt/enchant/downgrade/pet was expected =
attempts x GLOBAL rate, but success depends on the bucket (smelt:
ore 20-70%, enchant: type, ...). A Coal-heavy smelter looked "+50
lucky" purely from ore mix. Now bucket-standardized (like dwarf's
per-rarity/level), in build_stats.py -- pure selection bias removed.
2) The combined score pooled dwarf/elf/pet/arena as an equal statistical
z-score, ignoring stakes. Now VALUE-weighted: per event contribution =
stake x (outcome - p), pooled Z = sum / sqrt(sum stake^2 p(1-p)).
Stake = coins at risk: dwarf=item@level, elf=10x input@L5-epic,
pet=10x normal-pet, arena=avg legendary value. A failed L9 legendary
or burned elf dominates; cheap smelts are noise.
forge_api is backward-compatible: falls back to the old count-based
overall when the DB lacks the new vluck_num/vluck_var columns, so the
forge tab keeps working until the rebuilt DB is uploaded.…