feat: NTE gear optimizer web app
Client-side optimizer for Neverness to Everness console builds. Imports a gear export from nte-history-exporter, keeps it in IndexedDB, and solves for the best module placement per character or across a team. - domain/: pure ports of the Python research scripts (shapes, cartridges, board tiling, stats, scoring, set bonuses, Arc effects, sheet prediction). No DOM, no storage imports, so they stay worker-safe and Node-testable. - solver/: single-character solve with branch and bound, plus a three-phase team solve (portfolio, leximin, column generation) over disjoint item sets. Runs in a Worker when one can be constructed, inline otherwise. - db/: three storage tiers selected by use rather than feature detection, fail-closed import validation, and undo that restores both sides of a steal. - ui/: React 19 views for items, characters and teams; the board is drawn as the deliverable rather than a score. - Two build targets: a hosted bundle and a single self-contained nte.html with no external requests. Values the model cannot measure are reported as unavailable rather than guessed: cartridge set bonuses, the level 80 base-stat multiplier, and the distinction between "optimal for this packing" and globally optimal. 145 tests, tsc clean, both build targets clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
commit
141bb2c751
157 changed files with 92605 additions and 0 deletions
127
data-src/set-bonuses.json
Normal file
127
data-src/set-bonuses.json
Normal file
|
|
@ -0,0 +1,127 @@
|
|||
{
|
||||
"format": "nte-set-bonuses",
|
||||
"format_version": 1,
|
||||
"note": "Bonus VALUES are not in any capture and not on everness: items.json carries only the cartridge boxes. Each tier stays unknown until read in game or scraped, and an unknown tier contributes nothing rather than a guessed number.",
|
||||
"sets": {
|
||||
"Crimson: Twin Butterflies": {
|
||||
"2": {
|
||||
"unknown": true,
|
||||
"stats": []
|
||||
},
|
||||
"4": {
|
||||
"unknown": true,
|
||||
"stats": []
|
||||
}
|
||||
},
|
||||
"Devil's Blood: Curse": {
|
||||
"2": {
|
||||
"unknown": true,
|
||||
"stats": []
|
||||
},
|
||||
"4": {
|
||||
"unknown": true,
|
||||
"stats": []
|
||||
}
|
||||
},
|
||||
"Diabolos": {
|
||||
"2": {
|
||||
"unknown": true,
|
||||
"stats": []
|
||||
},
|
||||
"4": {
|
||||
"unknown": true,
|
||||
"stats": []
|
||||
}
|
||||
},
|
||||
"Fireflies and the Forest": {
|
||||
"2": {
|
||||
"unknown": true,
|
||||
"stats": []
|
||||
},
|
||||
"4": {
|
||||
"unknown": true,
|
||||
"stats": []
|
||||
}
|
||||
},
|
||||
"Kingdom's Guard": {
|
||||
"2": {
|
||||
"unknown": true,
|
||||
"stats": []
|
||||
},
|
||||
"4": {
|
||||
"unknown": true,
|
||||
"stats": []
|
||||
}
|
||||
},
|
||||
"Lost Radiance": {
|
||||
"2": {
|
||||
"unknown": true,
|
||||
"stats": []
|
||||
},
|
||||
"4": {
|
||||
"unknown": true,
|
||||
"stats": []
|
||||
}
|
||||
},
|
||||
"Quiet Manor": {
|
||||
"2": {
|
||||
"unknown": true,
|
||||
"stats": []
|
||||
},
|
||||
"4": {
|
||||
"unknown": true,
|
||||
"stats": []
|
||||
}
|
||||
},
|
||||
"Shadow Creed": {
|
||||
"2": {
|
||||
"unknown": true,
|
||||
"stats": []
|
||||
},
|
||||
"4": {
|
||||
"unknown": true,
|
||||
"stats": []
|
||||
}
|
||||
},
|
||||
"Speedy Hedgehog": {
|
||||
"2": {
|
||||
"unknown": true,
|
||||
"stats": []
|
||||
},
|
||||
"4": {
|
||||
"unknown": true,
|
||||
"stats": []
|
||||
}
|
||||
},
|
||||
"Street Boxer": {
|
||||
"2": {
|
||||
"unknown": true,
|
||||
"stats": []
|
||||
},
|
||||
"4": {
|
||||
"unknown": true,
|
||||
"stats": []
|
||||
}
|
||||
},
|
||||
"Thea's Night Tavern": {
|
||||
"2": {
|
||||
"unknown": true,
|
||||
"stats": []
|
||||
},
|
||||
"4": {
|
||||
"unknown": true,
|
||||
"stats": []
|
||||
}
|
||||
},
|
||||
"Tiny Big Adventure": {
|
||||
"2": {
|
||||
"unknown": true,
|
||||
"stats": []
|
||||
},
|
||||
"4": {
|
||||
"unknown": true,
|
||||
"stats": []
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue