270def achievements(cur, prev, cap=3):
290 for end
in sorted(set(cur[
"endings"]) - was[
"endings"]):
291 out.append(f
"ENDING: {end}")
292 if prev
and (cur[
"ng_plus"]
or 0) > (prev[
"ng_plus"]
or 0):
293 out.append(f
"NEW JOURNEY: NG+{cur['ng_plus']}")
298 had = set(prev[
"bosses"])
if prev
else set()
299 new_bosses = sorted(set(cur[
"bosses"]) - had)
303 +
" · ".join(new_bosses[:2])
304 + (f
" +{len(new_bosses) - 2} more" if len(new_bosses) > 2
else "")
309 if cur[
"attack"]
is not None and cur[
"attack"] > was[
"attack"] >= 0:
310 out.append(f
"MEMORY SPENT: attack {was['attack']} → {cur['attack']}")
313 if cur[
"vitality"]
is not None and cur[
"vitality"] > was[
"vitality"] >= 0:
314 out.append(f
"NECKLACE USED: vitality {was['vitality']} → {cur['vitality']}")
317 if cur[
"gourd"]
is not None and cur[
"gourd"] > was[
"gourd"] >= 0:
318 out.append(f
"GOURD SEED USED: gourd {was['gourd']} → {cur['gourd']}")
323 new_keys = sorted(set(cur[
"key_items"]) - set(prev[
"key_items"]
if prev
else []))
327 +
" · ".join(new_keys[:2])
328 + (f
" +{len(new_keys) - 2} more" if len(new_keys) > 2
else "")
330 new_cinders = sorted(set(cur[
"cinders"]) - was[
"cinders"])
332 out.append(
"CINDERS: " +
" · ".join(new_cinders))
333 new_covs = sorted(set(cur[
"covenants"]) - was[
"covenants"])
335 out.append(
"COVENANT: " +
" · ".join(new_covs[:2]))
336 new_fires = sorted(progress(cur)[
"bonfires"] - was[
"bonfires"])
338 named =
" · ".join(n
for _a, n
in new_fires[:2])
340 f
"+{len(new_fires)} bonfire{'' if len(new_fires) == 1 else 's'}: {named}"
341 if len(new_fires) <= 2
342 else f
"+{len(new_fires)} bonfires"
344 if cur[
"estus"]
is not None and cur[
"estus"] > was[
"estus"] >= 0:
345 out.append(f
"Estus +{was['estus']} → +{cur['estus']}")
347 max(0, n - was[
"pickups"].get(a, 0))
for a, n
in cur[
"pickups"].items()
350 out.append(f
"+{gained} world item{'' if gained == 1 else 's'}")
351 if cur[
"level"] > was[
"level"]:
353 f
"lv{was['level']} → lv{cur['level']}" if prev
else f
"lv{cur['level']}"
371def reference_index(snaps):
374 if s[
"path"]
not in seen
or s[
"mtime"] < seen[s[
"path"]]:
375 seen[s[
"path"]] = s[
"mtime"]
376 order = sorted(seen.items(), key=
lambda kv: (kv[1], kv[0]))
377 refs = {p: i + 1
for i, (p, _t)
in enumerate(order)}
380 dupes[os.path.basename(p)] = dupes.get(os.path.basename(p), 0) + 1
385 root = os.path.commonpath([p
for p, _t
in order])
if len(order) > 1
else ""
388 if root
and not os.path.isdir(root):
389 root = os.path.dirname(root)
392 base = os.path.basename(p)
395 if dupes.get(base, 0) < 2
396 else (os.path.relpath(p, root)
if root
else p)
398 out.append((refs[p], label, t, p))