0.1.171: Startdaten ohne Pruefung und lazy zusammengefuehrt, Listen-Regler 10-100

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016onJCSHLwhs9udhC9ZLzk9
This commit is contained in:
Lacustat
2026-10-29 15:05:43 +01:00
co-authored by Claude Sonnet 5.5
parent 9194096d50
commit b94d8a1b44
5 changed files with 105 additions and 23 deletions
+94 -15
View File
@@ -1511,14 +1511,38 @@ function Share.BuiltinBegin()
builtin = { rec = {}, n = 0 }
end
function Share.BuiltinAdd(list, from, to)
-- Startdaten sind schon geprueft (trusted = true): Kreaturen, Objekte und Quests werden ohne erneute Formatpruefung
-- und ohne Kopie uebernommen. Nur Datensaetze, bei denen die Pruefung etwas aendern wuerde (Leerzeichen am Rand,
-- Steuerzeichen, sehr lange Texte), gehen weiter durch Sanitize.
local CHECK_TEXT = { "n", "ne", "cen", "cde", "t" }
local function NeedsCheck(raw)
for i = 1, 5 do
local v = raw[CHECK_TEXT[i]]
if v ~= nil and (type(v) ~= "string" or #v > 40 or v:find("^%s") or v:find("%s$") or v:find("[|%c]")) then
return true
end
end
return false
end
Share.BuiltinTrusted = true
function Share.BuiltinAdd(list, from, to, trusted)
local accepted = 0
local P = Codex.Path
for i = from or 1, to or #list do
local raw = list[i]
local key = type(raw) == "table" and type(raw.y) == "string" and type(raw.id) == "number"
and (raw.y .. math.floor(raw.id)) or nil
local rec = key and Share.Sanitize(key, raw, raw.upd)
local rec
if key then
local y = raw.y
if trusted and (y == "u" or y == "o" or y == "q") and type(raw.upd) == "number" and raw.upd >= 1
and raw.id >= 0 and raw.id == math.floor(raw.id) and not NeedsCheck(raw) then
rec = raw
else
rec = Share.Sanitize(key, raw, raw.upd)
end
end
if rec then
if rec.y == "p" then
local cells = P and P.ParseChunk(rec.c)
@@ -1542,9 +1566,9 @@ function Share.BuiltinDone()
if Codex.Spots then Codex.Spots.Bump() end
end
function Share.SetBuiltin(list)
function Share.SetBuiltin(list, trusted)
Share.BuiltinBegin()
local accepted = Share.BuiltinAdd(list or {}, 1, #(list or {}))
local accepted = Share.BuiltinAdd(list or {}, 1, #(list or {}), trusted)
Share.BuiltinDone()
return accepted
end
@@ -1723,7 +1747,7 @@ local function MergeEditorFields(m, e)
end
end
local function MergeEntity(own, list)
local function MergeEntity(own, list, lazy)
local m = {}
local remoteK = 0
if own then
@@ -1808,7 +1832,7 @@ local function MergeEntity(own, list)
if next(m.ro) == nil then m.ro = nil end
if next(m.wa) == nil then m.wa = nil end
if next(m.tr) == nil then m.tr = nil end
if Codex.LearnPlanReset then Codex.LearnPlanReset() end
if not lazy and Codex.LearnPlanReset then Codex.LearnPlanReset() end
if next(m.fl) == nil then m.fl = nil end
if next(m.tt) == nil then m.tt = nil end
if next(m.cells) == nil then m.cells = nil end
@@ -1997,8 +2021,50 @@ local function BuildTTK()
view.ttk = tk
end
-- Reine Startdaten-Eintraege (keine eigenen und keine fremden Daten dazu) werden erst beim ersten Zugriff
-- zusammengefuehrt: in der Sicht steht bis dahin eine leere Huelle, die sich beim Lesen oder Schreiben eines Feldes
-- mit genau dem Ergebnis fuellt, das das Zusammenfuehren sofort geliefert haette. pairs() sieht alle Schluessel.
local pending = setmetatable({}, { __mode = "k" }) -- Huelle -> Startdatensatz (bleibt ueber Neuaufbauten bestehen)
local lazyMade, lazyTotal = 0, 0
local STUB = {}
local function Materialize(t)
local rec = pending[t]
if not rec then return end
pending[t] = nil
setmetatable(t, nil)
local list = { { s = BUILTIN, rec = rec } }
local m = rec.y == "q" and MergeQuest(nil, list) or MergeEntity(nil, list, true)
for k, v in pairs(m) do rawset(t, k, v) end
lazyMade = lazyMade + 1
end
STUB.__index = function(t, k)
Materialize(t)
return rawget(t, k)
end
STUB.__newindex = function(t, k, v)
Materialize(t)
rawset(t, k, v)
end
local function NewStub(rec)
local t = setmetatable({}, STUB)
pending[t] = rec
lazyTotal = lazyTotal + 1
return t
end
-- Anzahl bisher zusammengefuehrter Huellen und Huellen insgesamt (seit dem letzten Neuaufbau)
function Share.LazyStats()
local waiting = 0
for _ in pairs(pending) do waiting = waiting + 1 end
return lazyMade, lazyTotal, waiting
end
local function Rebuild()
local db = Codex.db
lazyMade, lazyTotal = 0, 0
index = { u = {}, o = {}, q = {}, i = {} }
xpRecs = {}
ttkRecs = {}
@@ -2036,8 +2102,16 @@ local function Rebuild()
ttkRecs[#ttkRecs + 1] = rec
elseif index[rec.y] then
local bucket = index[rec.y]
bucket[rec.id] = bucket[rec.id] or {}
table.insert(bucket[rec.id], { s = BUILTIN, rec = rec })
local cur = bucket[rec.id]
if cur == nil and rec.y ~= "i" and rec.bad == nil and rec.ed == nil and not db[KIND_OF[rec.y]][rec.id] then
bucket[rec.id] = rec -- nur Startdaten: erst beim Zugriff zusammenfuehren
else
if cur == nil then
cur = {}
bucket[rec.id] = cur
end
table.insert(cur, { s = BUILTIN, rec = rec })
end
end
end
view = { quests = {}, units = {}, objects = {}, ied = {}, xpb = db.xpb, names = db.names }
@@ -2047,19 +2121,24 @@ local function Rebuild()
out[id] = e.ed and Codex.ApplyEd(e, field) or e
end
for id, list in pairs(index[letter]) do
local merged
if letter == "q" then
merged = MergeQuest(db[field][id], list)
if list.y then
out[id] = NewStub(list)
else
merged = MergeEntity(db[field][id], list)
local merged
if letter == "q" then
merged = MergeQuest(db[field][id], list)
else
merged = MergeEntity(db[field][id], list)
end
if merged.bad == true and not CanEditNames() then merged = nil end
if merged then merged = Codex.ApplyEd(merged, field, true) end
out[id] = merged
end
if merged.bad == true and not CanEditNames() then merged = nil end
if merged then merged = Codex.ApplyEd(merged, field, true) end
out[id] = merged
end
end
BuildXP()
BuildTTK()
if Codex.LearnPlanReset then Codex.LearnPlanReset() end
allDirty = false
dirtyIds = {}
end