Loading…
a327ex.com

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 the todo file.
  • 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_multipliers deleted); 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_m and 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 folder E:/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.