SNKRX Stats
Opus 4.8
Summary
Strategy pivot from Mini Looper into a (secret) SNKRX update on the Anchor 2 snkrx-template, followed by a complete, verified flat-integer port of SNKRX's offensive stat system — enemy HP curve plus per-unit base damages — built on a "preserve hits-to-kill" methodology.
Strategic decision (Mini Looper → SNKRX-as-a-mode):
- Opened by questioning whether Mini Looper is too SNKRX-like to ship as a separate game. Worked the relapse-vs-insight tension: abandoning the near-shippable Mini Looper for newer projects is the documented "A vs B" failure mode, but the redundancy observation was also genuinely sharp.
- Key realization: Mini Looper and SNKRX share an identical combat core and differ only in run/layout structure ("SNKRX on rails") — so they're two modes of one game, not two games.
- Decision: fold Mini Looper's looper/TD layout in as a mode of a SNKRX update built on the new template (one focused product aimed at SNKRX's existing audience). 062026 stays the designated unbounded juice sandbox with no ship deadline. Combat first, meta-loops later. The SNKRX update is kept secret (reason this log is sealed).
SNKRX old-roadmap research (web):
- Pulled the cancelled-rewrite promises from a327ex.com/posts/snkrx_log, the repo
devlog.md, and thetodofile. - The cancelled "rewrite update" = StS-style roguelite map mode + transparent 1–10 stat system + PoE-style tag system + per-unit items + permadeath/bench. User wants everything EXCEPT the StS node map.
- Note: "Invoker" was a planned-but-unbuilt SNKRX unit in the
todo.
Stat-system architecture (locked):
- Flat integers only, no percentages. The one legal multiplier is unit COUNT (army 1–12) × merge level (×2 doubling) — both integers; per-unit power is purely additive. Designed for a FINITE run (enemy HP caps at arena 25); infinite looping deferred to the meta layer.
- Unit/attack split: attacks own all offensive stats (damage/area/count/procs); units own HP/def/move-speed/attack-rate. Merge level bumps the unit's HP tier AND its attack's damage tier.
- Classes DROPPED as stat-multipliers (
class_stat_multipliersdeleted); classes survive purely as synergy TAGS driving the collect-N set-bonus mechanic. - Attack speed NOT buildable — fixed per-unit rhythm. Procs use an X-in-Y model (modifiers shift X or Y). Flat armor (subtract), parked.
Hits-to-kill methodology:
- Invariant to preserve = the full hits-to-kill(unit, merge, arena) table from SNKRX's real numbers; the port reproduces it (within tolerance) while swapping the underlying numbers to flat integers. Ratio-based, so overall scale is free (spent on clean integers).
- Merge timing is NOT modeled (user caution): the fit covers all (unit × merge × arena) cells via only two board-wide knobs — a shared enemy curve and one base-damage scalar per unit — plus uniform ×2 merge doubling. No per-unit schedule parameter exists, so it can't be inconsistent.
SNKRX stat model extracted (objects.lua:226-388, main.lua, enemies.lua):
- base_hp = 100×2^(merge-1), base_dmg = 10×2^(merge-1), base_def = 25, base_mvspd = 75.
- class_dmg_m: ranger 1.2, warrior 1.1, mage 1.4, rogue 1.3, forcer 1.1, voider 1.3, sorcerer 1.3; others 1.0.
- class area_dmg_m: mage 1.25, nuker 1.5, sorcerer 1.2, forcer 0.75, voider 0.8, rogue 0.6; others 1.0.
- Regular Seeker HP = (25 + 16.5×y[arena])×0.5; y = {0,1,3,3,4,6,5,6,9,7,8,12,10,11,15,12,13,18,16,17,21,17,20,24,25}. Seeker def 25 → all player hits ×0.8 (100/(100+def)). Run = 25 arenas; level % 25 == 0 = win/NG+ loop.
Offensive fit — enemy curve (verified):
- Port Seeker HP curve (def 0, multiples of 5, triplet low/low/spike):
15,25,45 | 45,55,75 | 65,75,105 | 85,95,135 | 115,130,175 | 135,150,205 | 185,195,235 | 195,225,265 | 275. - The ×0.8 mitigation and a ×1.25 enemy-HP rescale CANCEL → port unit damage = SNKRX's true pre-mitigation damage, and enemy def becomes 0 (armor reserved for special enemies later).
- Reproduces SNKRX vagrant (×1.0) hits-to-kill EXACTLY at all 75 cells (25 arenas × 3 merges); other damage bands within ±1 (integer-quantization floor).
- User correction: preserve the triplet "low/low/jump" pacing (every 3rd arena spikes). Nudged a14 125→130 and a17 145→150 to restore the a15/a18 spike proportions with zero change to any hits-to-kill.
Boss-layer discovery:
- User asked about bigger jumps at 18/25. Confirmed via source there are TWO enemy curves. Regular seeker triplet has 18 as its biggest spike. BOSSES spawn on a separate cadence —
(level − 25×loop) % 6 == 0 or level % 25 == 0→ arenas 6, 12, 18, 24, 25 (arena.lua:108), NOT every 9. Boss HP y-table explodes in the back third (y at boss arenas = 6, 12, 40, 64, 90). Boss curve DEFERRED to a later session.
Base damages + verification correction (the key technical event):
- Initial rule "base = displayed nominal damage" was WRONG for AoE/DoT units — SNKRX's in-game descriptions hide
area_dmg_mand several flat code multipliers (the opacity the port is meant to remove; the game effectively misreports its own damage). - Verified each unit's TRUE per-hit damage from attack code (subagent read player.lua). Corrected rule: base = dmg × area_dmg_m (if Area/DotArea) × code flat-mult, rounded to integer.
- Notable corrections: elementor 14→53 (2× nuker AoE), highlander 55→66 (code deals 6×; description says 5× — a shipped stale-description bug, player.lua:2457), cannoneer area 24→36, magician 14→18, psychic 13→16, juggernaut 12→9 (forcer area 0.75 — hits softer), cryomancer 18→36/s, pyromancer 18→27/s.
- Roster split: ~25 direct-damage attackers, ~6 DoT, ~3 summon/turret, and ~13 support/utility/economy units with NO per-hit damage (their power lives in the modifier/buff/curse/economy layers).
- Verification script (/tmp/verify.py): baking the corrected true damages reproduces SNKRX hits-to-kill within ±1 across all 28 direct units × 75 cells (worst dev = 1; vagrant/host/engineer/bomber exact).
DoT time-to-kill (verified):
- Confirmed DoT IS mitigated by enemy def (Seeker:apply_dot → hit → calculate_damage; enemies.lua:788/489) — so the same cancellation holds, port dps = SNKRX dps, no 1.25× adjustment.
- DoT dps (m1): plague_doctor 16, cryomancer 36, pyromancer 27, witch 16, usurer 13.
- Time-to-kill within ~6% (mostly ~4%) across all DoT cells (continuous metric, no integer-quantization cliff). Script /tmp/verify_dot.py.
Deliverables / state:
- All work captured in
stat_port_proposal.md(Parts 1–8; Part 8 authoritative). Moved to a new folderE:/a327ex/SNKRX-update/with a private GitHub repo (github.com/a327ex/SNKRX-update). - Offensive side COMPLETE and verified. Remaining for future sessions: the modifier layer (16 class set-bonuses + 88 items — defines the support roster), the boss curve, and summon construct-stat detail. The upstream SNKRX clone remains at
E:/a327ex/SNKRX-ref/for reference.
🔒 Only the summary of this log is public. Private because this is SNKRX update.