Files
healer-man/docs/ROM_FIVE_NATIVE_SCALING_2026-10-03.md
T
2026-10-04 13:13:35 -04:00

108 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# RoM five-class native scaling and automatic training gear
This targeted check covers Knight/Scout, Priest/Knight, Rogue/Warrior, Scout/Rogue, and Mage/Warlock using the named, race-legal identities in `src/game/romFiveIdentities.ts`. It does not promote RoM builds to Ready or introduce loot progression.
Other RoM classes remain available in the existing generated companion pools; this diagnostic verifies the five requested active identities and does not certify the other classes.
## Character and NPC growth
Player and companion native stats use `deriveCharacterStats(..., "rom")`, dispatched to `romNativeStats.ts`. Class-specific source growth starts from the level-one attributes and repeats `value = value * (1 + percentGrowth) + flatGrowth` for each additional level. Native HP/MP and attack/defense then use the source coefficients for the primary class, equipment, and active modifiers. Wisdom is a distinct attribute rather than WoW Spirit.
The shared simulator activates each named identity's secondary class at level 10 and treats its level as the primary level. The secondary contributes one tenth of its base growth; it does not supply a second complete equipment set. Native secondary Mana pools retain sourced MP, while the primary kit keeps its existing Mana/Energy/Focus resource behavior.
Generated RoM companions explicitly select native stats. A configured companion must explicitly pass `statRuleset: "rom"`; omission deliberately retains legacy WoW compatibility. Existing saved RoM players also retain WoW compatibility unless switched. A player's selector does not overwrite every NPC's independently owned mode.
The follow-up fixed two real NPC inconsistencies. `partyStore.ts` now normalizes creation and level synchronization to the shared finite 1–80 range before deriving gear, talents, resources, and secondary unlocks. Native full HP/MP remain equal to their precise caps after creation, leveling, and gear rescaling; wounded pools stay bounded and defeated actors remain at zero. `combatActorAuthority.ts` now refreshes a native companion's health cap when its source changes, preserving the live actor's precise health fraction. Previously a level-up could calculate the new member cap correctly, then actor synchronization could overwrite it with the old cap. Unchanged source/caps retain the authoritative live actor values.
## Gear without loot progression
RoM has no authentic heirloom item system. The simulator's shared equipment fallback supplies **automatic training gear** for the player and party, using compact ordinary RoM source-item references for these five classes. It fills eligible empty slots and recalculates the reference values with level, class, role, and applicable secondary weapon unlocks. Reference selection and interpolation are simulator policies, not the original game's acquisition or item-upgrade rules.
The existing player and NPC reference curve caps at level 79. At level 80, character base growth continues but automatic gear retains its level-79 values. This avoids inventing unsupported endgame gear. The same cap applies to both owners. Native item payloads are counted once; their accompanying WoW projection is ignored in native derivation.
Training references are not a smooth linear curve: source-item tiers/package anchors and weapon-slot unlocks cause step changes. An exact levels-1–80 audit found byte-identical player/NPC payloads; one example is Rogue's 65→66 increase of 912 DMG and 362 MDMG. At 79→80 all five classes' gear DMG/MDMG stay unchanged while base ATK/MATK grow. In this source version both attack-to-damage coefficients are zero, so gearless native DMG/MDMG are zero; the current shared adapter and ability resolver are still separate from complete native combat.
RoM fallback item names, source labels, and Equipment slot labels now say Training rather than Heirloom. Stable item IDs, internal quality, stat budgets, saved inventory, and assignment behavior are unchanged. The panel explains the level-79 cap. No loot source, drop table, boss reward, card reward, or loot distribution behavior is changed by this work.
## Enemy health
`src/scene/MobPopulation.tsx` passes both `contentCategoryForClass(player.classId)` and the player's selected ruleset to `dungeonEnemyScaling`. The original curve below follows character origin. The later native-only factor applies only to RoM-origin characters using native `rom` stats; RoM characters in legacy WoW-stat mode continue to use the original curve. Dungeon source, NPC composition, and party size do not select the health policy.
Ordinary enemy level follows player level, clamped to 1–80. Bosses have a one-level edge, also capped at 80. Before authored multipliers, RoM trash HP is:
```text
round((1000 + 100 * L + 8 * L²) * (1 - max(0, L - 70) * 0.006))
```
Campaign bosses use the larger of authored baseline HP and a separate durability floor:
```text
max(trashBaseline(L) * authoredHealthMultiplier,
(1000 + 1200 * L + 22 * L²) * 1.15 * finaleOrSliceFactor)
```
Normal campaign finales use a 1.9 floor factor unless explicitly marked standard. Boss difficulty and any per-boss balance override then multiply the result. Bite-Sized bosses instead use their existing interpolated floor/ceiling bands. Boss Testing has its own reduced floor and may use source creature health. Manastorm follows its separate enemy modifiers. Dungeon difficulty chooses encounter/population variants; it is not an extra generic HP multiplier in this helper.
| Player level | RoM trash baseline HP | Boss level | Standard campaign boss floor HP |
|---|---:|---:|---:|
| 1 | 1,108 | 2 | 4,011.2 |
| 10 | 2,800 | 11 | 19,391.3 |
| 30 | 11,200 | 31 | 68,243.3 |
| 60 | 35,800 | 61 | 179,471.3 |
| 79 | 55,651 | 80 | 273,470 |
| 80 | 56,588 | 80 | 273,470 |
These are the legacy WoW-stat baseline/floor examples, not every creature's final HP. The historical curve predates native character stats; the current native-only adjustment is separately anchored and measured below. Neither calculation claims a RuneWaker source mob-HP formula.
Anglo in full Barren Caves has an authored health multiplier of 7.5 and is the default finale, so its 1.9 finale floor dominates from level 10 onward. Its actual registered legacy-mode HP at player levels 1/10/30/60/79/80 is **9,240 / 36,843 / 129,662 / 340,995 / 519,593 / 519,593**; native-stat RoM multiplies those results by the separate boss anchor below. The older `romDungeonHealth.test.ts` boss sample manually used baseline × 7.5 rather than the actual finale floor, and initialized a compatibility-mode player with seed-selected native NPCs. That older sample is not evidence for a complete native five-identity party or the current real boss pool.
The earlier fixed-cohort diagnostic is historical: it rotates five identities into the player seat, explicitly creates four native companions, and samples one real Barren Caves trash spawn and Anglo at six levels (60 samples) while omitting active player damage except Priest healing. It predates exact-pair active player rotations and native-only HP pacing, so its timings and defeats are not current outcomes.
| Player level | Trash kill-time range | Anglo kill-time range |
|---|---:|---:|
| 1 | 15–18 s | 148.2–232.3 s |
| 10 | 4.5–7 s | 82–105 s |
| 30 | 10.5–12 s | 78–118.3 s |
| 60 | 7.6–11 s | 49.5–72 s |
| 79–80 | 2.5–5.4 s | 25–37.5 s |
The saved earlier report records that all 60 samples completed; trash had no companion defeats, while level-one Anglo caused companion defeats in four of five variants. This was a conservative diagnostic because active player damage was omitted, not a balance certification or automatic tuning target. Its 240-second level-one boss limit and 120-second limit elsewhere differ from the current fixed-rotation report.
## Evidence
- `src/game/romFiveNativeDungeonHealth.test.ts`: three targeted checks passed, including the actual RoM/WoW dungeon HP helper, all 60 fixed-cohort samples, and boss difficulty/finale behavior. Diagnostic report: `artifacts/rom-five-native-dungeon-health/report.json` (ignored local artifact).
- Exact gear audit: player/NPC owner contexts match for all five identities; reference payloads were inspected across levels 1–80, including weapon unlocks, source tier jumps, and the 79→80 plateau.
- The final focused selection passed 176 tests across 12 files. The new parity suite contributes 13 cases covering the five native player/generated/configured identities at levels 1/9/10/30/60/79/80, explicit-versus-omitted rulesets, secondary unlock, level bounds, owner gear parity, and full/wounded/defeated pools. Existing native aura/channel/periodic integration and legacy compatibility regression tests also passed.
- Ready-five passed seven Vitest and twenty Python checks. Avatar validation passed 47 tests across ten files before the subsequent party-only fixes; avatar and numerical gear code were not changed afterward.
- Final full production build passed: 8 GB TypeScript project compilation, Vite (1,266 modules), asset audits, compression, and release-bundle verification (5,562 objects, 123 chunks). Final chunks: `index-Ba_szGct.js`, `combatStore-BGky6YlB.js`, and `PartyFrames-CcpsvWIi.js`.
- Exact-final-dist Edge QA passed through `scripts/playtest-stat-rulesets.cjs` using an isolated temporary account/server. Native player tabs, a native Mage NPC owner panel, Training gear labels/cap note, legacy migration, independent saved mode choices, switching locks, build/checkpoint preservation, both native/compatibility dungeon runs, and desktop/390-pixel layouts passed. Visual review confirmed roster and both dungeon character bodies with held starter staffs and closed overlays/loading intro.
- Browser report: `playtest-artifacts/stat-rulesets/results.json` and its eleven referenced screenshots, including `05-native-npc-stats-attributes-desktop.png`. Diagnostics had zero page errors, HTTP failures, or failed application-resource responses; the only console response error was the optional favicon 404. Synthetic legacy/combat/online fixtures remain guard checks, not a live multiplayer certification.
- Final `npm run release:check` and `git diff --check` passed, including untracked files and concurrent unrelated work. The four owned vault notes passed whitespace/EOF checks. The prior stat-ruleset validation remains in `docs/CHARACTER_STAT_RULESETS_2026-10-03.md`; its 219-test result is historical and is not added again to this task's totals. This follow-up supersedes the browser artifacts stored at the shared stat-rulesets path.
## Player-rotation combat follow-up (2026-10-03)
The final diagnostic in `src/game/romFiveNativeRotation.integration.test.ts` uses the shared `BenchmarkController` rotation and damage path, turns each requested identity into the player in turn, explicitly constructs the other four native identities as companions, and samples one real Barren Caves trash spawn plus Anglo at levels 1/10/30/60/65/66/79/80. This is 80 fixed samples with static actors, not a scene-driven dungeon run; navigation and authored encounter mechanics remain outside its scope.
The post-haste-retention report records 80/80 cleared pulls, zero player or companion deaths, and zero invalid cast failures. Trash took 4.5–9 seconds; Anglo took 39–53.4 seconds. The harness checks for a dead target before making another controller decision. Actors remain fixed in place; no navigation or authored encounter mechanics run.
## Native-only enemy health pacing (2026-10-03)
`dungeonEnemyScaling` accepts a selected character stat ruleset with a backwards-compatible default of `"wow"`. Live `MobPopulation` passes the active player ruleset. The added piecewise-linear factor is active only for RoM-origin characters using native `"rom"` stats; it leaves the legacy RoM curve, WoW/CoA-origin results, enemy damage, level, boss difficulty, authored multipliers, and level-80 cap unchanged.
| Character level | Trash scale | Boss scale |
|---:|---:|---:|
| 1 | 0.9 | 0.45 |
| 10 | 1.4 | 0.85 |
| 30 | 1.4 | 0.95 |
| 60 | 1.5 | 1.25 |
| 65 | 1.8 | 1.5 |
| 66 | 2.1 | 1.9 |
| 79 | 3.6 | 2.8 |
| 80 | 3.6 | 2.8 |
Values between anchors interpolate linearly against the clamped 1–80 character level. This is a simulator health budget measured against the five canonical training builds, not a source RuneWaker mob-health formula. The general generated companion pool and RoM readiness state are unchanged.
`artifacts/rom-five-native-rotation/before-native-combat.json` is the earlier 60-sample, six-level comparator; it predates the current native-only health policy and the final eight-level active-rotation matrix. Do not treat it as a paired health-curve experiment. Native amount routing, supported auto-attack channels, limitations, and current verification state are summarized in [`ROM_NATIVE_COMBAT_PASS_2026-10-03.md`](ROM_NATIVE_COMBAT_PASS_2026-10-03.md).
The final production build passed with asset audits, compression, and bundle verification. Exact-dist browser QA passed against `index-D_h9IRuA.js` and `combatStore-BiA9BOQG.js`; 11 screenshots were captured and four representative roster, dungeon, NPC-stat, and 390×844 mobile screenshots were visually reviewed. No page/server errors occurred and the network response-errors list was empty; the only console error was the optional existing favicon 404. A release check passed on 249 paths; the final documentation update requires the final hygiene/release check. The full source hit/defense model and RoM readiness certification remain outside this follow-up.