Initial NTE history exporter

Initial NTE history exporter

Add a Windows live-capture exporter for NTE pull history with support for
Permanent Monopoly, Limited Monopoly, and Arc Miracle Box histories.

Included:
- live packet capture via Windows raw sockets
- CSV and JSON export generation
- normalized reward and banner mapping files
- Monopoly v7 Points Gift / Chase Reward classification
- Arc Miracle Box decoding with shared pity metadata
- timestamp grouping and UID generation
- Windows launcher scripts with admin prompting
- docs for usage, export format, limitations, and packet notes
- tests covering decoder behaviour and mapping consistency

Generated exports, captures, briefs, and local data are ignored for privacy.
This commit is contained in:
Golumpa 2026-06-10 23:59:01 +01:00
commit bb3fe3b19a
35 changed files with 2439 additions and 0 deletions

View file

@ -0,0 +1,32 @@
{
"pool_key": "arc_miracle_box",
"game": "Neverness to Everness",
"system": {
"id": "gashapon",
"name": "Gashapon"
},
"banner": {
"id": "Arc_MiracleBox",
"name": "Arc Miracle Box",
"shared_pity": true
},
"request": {
"family": "arc",
"length": 34,
"constant": 2060,
"constant_hex": "0x080c",
"selector": null,
"cursor_offset": 29,
"cursor_step": 2,
"page_formula": "cursor / 2"
},
"response": {
"records_per_full_page": 5,
"timestamp_group_size": 10,
"first_record_offset_hex": "0x4c"
},
"notes": [
"Arc history is separate from Monopoly history.",
"Arc timestamp groups are expected to be complete 10-pull groups."
]
}

14
mappings/arcs.json Normal file
View file

@ -0,0 +1,14 @@
{
"fork_dustbin": {"name": "Dangerous Game", "rank": "B"},
"fork_vine": {"name": "Be Happy", "rank": "B"},
"fork_nonos": {"name": "First Step to Success", "rank": "B"},
"fork_appliance": {"name": "\"Real Music\"", "rank": "B"},
"fork_Prokaryon": {"name": "Us.", "rank": "B"},
"fork_PaperPlane": {"name": "Clear Skies", "rank": "A"},
"fork_mofeikesi": {"name": "Good Boy's Grand Adventure", "rank": "S"},
"fork_wuhuakuang": {"name": "The Forgotten", "rank": "A"},
"fork_jingmotingyuan": {"name": "Camellia Society", "rank": "S"},
"fork_Kite": {"name": "Watch Your Heads!", "rank": "A"},
"fork_yuren": {"name": "Umbrella", "rank": "A"},
"fork_yaodao": {"name": "Drawn Blade", "rank": "A"}
}

21
mappings/characters.json Normal file
View file

@ -0,0 +1,21 @@
{
"1003": {"name": "Sakiri", "rank": "S"},
"1004": {"name": "Lacrimosa", "rank": "S"},
"1008": {"name": "Skia", "rank": "A"},
"1010": {"name": "Nanally", "rank": "S"},
"1019": {"name": "Mint", "rank": "A"},
"1020": {"name": "Haniel", "rank": "A"},
"1021": {"name": "Edgar", "rank": "A"},
"1023": {"name": "Baicang", "rank": "S"},
"1025": {"name": "Hathor", "rank": "S"},
"1033": {"name": "Adler", "rank": "A"},
"1039": {"name": "Fadia", "rank": "S"},
"1046": {"name": "Zero", "rank": "S"},
"1051": {"name": "Zero", "rank": "S"},
"1052": {"name": "Hotori", "rank": "S"},
"1054": {"name": "Daffodill", "rank": "S"},
"1055": {"name": "Jiuyuan", "rank": "S"},
"1056": {"name": "Lacrimosa", "rank": "S"},
"1070": {"name": "Aurelia", "rank": "A"},
"1073": {"name": "Chiz", "rank": "S"}
}

View file

@ -0,0 +1,31 @@
{
"pool_key": "limited_character",
"game": "Neverness to Everness",
"system": {
"id": "monopoly",
"name": "Monopoly"
},
"banner": {
"id": "Lottery_LimitedCharacter",
"name": "Limited Character Board",
"shared_pity": true
},
"request": {
"family": "monopoly",
"length": 45,
"constant": 4220,
"constant_hex": "0x107c",
"selector": 8,
"cursor_offset": 31,
"cursor_step": 4,
"page_formula": "cursor / 4"
},
"response": {
"records_per_full_page": 5,
"marker_hex": "4c0000000c85c99141bdbdb17d0da185c9858dd195c901"
},
"notes": [
"Limited character boards are exported under one shared pool group.",
"Do not split by individual limited banners such as Nanali, Xun, or AnHunQu."
]
}

View file

@ -0,0 +1,57 @@
{
"pool_key": "permanent",
"game": "Neverness to Everness",
"system": {
"id": "monopoly",
"name": "Monopoly"
},
"banner": {
"id": "Lottery_Permanent",
"name": "Standard Board",
"shared_pity": false
},
"request": {
"family": "monopoly",
"length": 45,
"constant": 4220,
"constant_hex": "0x107c",
"selector": 4,
"cursor_offset": 31,
"cursor_step": 4,
"page_formula": "cursor / 4"
},
"response": {
"records_per_full_page": 5,
"marker_hex": "440000000c85c99141bdbdb17d3995dd49bdb19501"
},
"character_ids": [
"1003",
"1023",
"1025",
"1039",
"1054",
"1055",
"1008",
"1019",
"1020",
"1021",
"1033",
"1070"
],
"ssr_character_ids": [
"1003",
"1023",
"1025",
"1039",
"1054",
"1055"
],
"guarantee": {
"pool_guarantee_count": 90,
"pool_upgrade_count": 70,
"main_cost_item": {
"id": "DiceNormal",
"quantity": 1
}
}
}