From 393e9a4e5926d87081f08412559c52c565860948 Mon Sep 17 00:00:00 2001 From: vickydotbat Date: Thu, 14 May 2026 12:21:47 +0200 Subject: [PATCH] Lockfile priority normalization --- internal/topdata/native.go | 2 +- internal/topdata/topdata_test.go | 66 ++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/internal/topdata/native.go b/internal/topdata/native.go index 114bb74..44ba53d 100644 --- a/internal/topdata/native.go +++ b/internal/topdata/native.go @@ -1110,7 +1110,7 @@ func pruneLockDataToActiveRows(lockData map[string]int, rows []map[string]any, r } updated := 0 for key, rowID := range activeKeys { - if lockedID, ok := lockData[key]; ok && lockedID != rowID { + if lockedID, ok := lockData[key]; !ok || lockedID != rowID { lockData[key] = rowID updated++ } diff --git a/internal/topdata/topdata_test.go b/internal/topdata/topdata_test.go index 72b75c8..3dd000a 100644 --- a/internal/topdata/topdata_test.go +++ b/internal/topdata/topdata_test.go @@ -8488,6 +8488,72 @@ func TestBuildSpellsAllowsDuplicateBaseKeyToBeSplitAcrossTwoOverrideRenames(t *t } } +func TestBuildBaseitemsSplitReaddsRetiredKeyToLockfile(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "baseitems", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "baseitems", "base.json"), `{ + "output": "baseitems.2da", + "columns": ["label", "MaxRange"], + "rows": [ + {"id": 58, "key": "baseitems:shortspear", "label": "shortspear", "MaxRange": "100"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "baseitems", "lock.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "baseitems", "modules", "00_ovr_baseitems_spear.json"), `{ + "overrides": [ + { + "id": 58, + "key": "baseitems:spear", + "label": "spear" + } + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "baseitems", "modules", "10_add_baseitems_shortspear.json"), `{ + "entries": { + "baseitems:shortspear": { + "label": "shortspear", + "MaxRange": "255" + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "baseitems", "modules", "20_ovr_baseitems_maxranges.json"), `{ + "overrides": [ + { + "key": "baseitems:shortspear", + "MaxRange": "255" + } + ] +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + lockRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "baseitems", "lock.json")) + if err != nil { + t.Fatalf("read baseitems lock: %v", err) + } + lockText := string(lockRaw) + if !strings.Contains(lockText, `"baseitems:spear": 58`) { + t.Fatalf("expected spear lock entry, got:\n%s", lockText) + } + if !strings.Contains(lockText, `"baseitems:shortspear": 59`) { + t.Fatalf("expected shortspear lock entry on new row, got:\n%s", lockText) + } + + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "baseitems.2da")) + if err != nil { + t.Fatalf("read baseitems.2da: %v", err) + } + text := string(got) + if !strings.Contains(text, "58\tspear") || !strings.Contains(text, "59\tshortspear") { + t.Fatalf("expected split spear rows in output, got:\n%s", text) + } +} + func TestBuildSkillsIgnoresStaleBaseSpanLockDuringInitialLoad(t *testing.T) { root := testProjectRoot(t) mkdirAll(t, filepath.Join(root, "topdata", "data", "skills", "modules"))