MorgenGrauen

✅ 可玩

morgengrauen

更新 ab394ed 2026-10-28 源码 下载 ZIP 上游 MorgenGrauen/mg-mudlib

▶ 开始游玩 · Play Now

Official public MorgenGrauen mudlib (German LPMud, LDMud 3.x). LDMud → FluffOS conversion: catalog login lands in Die beruehmte Abenteurergilde. Walkable Hafenstrasse (reconstructed po_haf1) and Foerderverein buero. Full Port Vain domain and /d/anfaenger are not in the snapshot. Not Shea690901/Sagenwelt-Lib (collection sagenwelt).

README

LDMud → FluffOS conversion. Snapshot of git clone https://github.com/MorgenGrauen/mg-mudlib. Slug morgengrauen, number 974, port 40283. This collection’s copy is a snapshot, not a live mirror.

Official public MorgenGrauen mudlib (German LPMud, LDMud 3.x). LDMud → FluffOS conversion: archive master uses set_driver_hook/closures; catalog login lands in Die beruehmte Abenteurergilde (Port Vain). Full LDMud source tree is preserved. Not Shea690901/Sagenwelt-Lib (collection sagenwelt).

German LDMud sources are preserved for study. Interactive play is a Strategy A start hall (guild / Hafenstrasse / buero), not the full LDMud world. Published as playable on that start.

Registration flow

Name (2–16 letters) → new character: password (≥6, twice) → Die beruehmte Abenteurergilde. Existing names prompt for password only.

Admin / test account

Verified live: fluffos / Mud@2026 → Die beruehmte Abenteurergilde; look / look at tuer / north Hafenstrasse / up Buero / score / quit; reconnect lands in the guild again.

Local run

cd libs/morgengrauen
~/src/fluffos/build-debug/src/driver config.fluffos

Game port: 40283.

python3 scripts/mudclient.py 127.0.0.1 40283 --timeout 25 --idle 0.6 \
  --send fluffos --send Mud@2026 \
  --send look --send score --send quit

NOTES · 移植与修复记录

MorgenGrauen (morgengrauen) — porting notes

Source: git clone https://github.com/MorgenGrauen/mg-mudlib (commit a178b88a9cac64480a9475f72a96cd4c183e64c7, cloned 2026-09-05); repo root is the mudlib. Converted 2026-09-05. Config name MorgenGrauen. Slug morgengrauen, number 974, port 40283.

This is an LDMud → FluffOS conversion. Discovery triage normally drops LDMud-lineage libs; this onboard is an explicit exception in the same family as questmud / acme (AGENTS.md §7.158).

This collection’s copy is a snapshot, not a live mirror. Do not onboard the same upstream repo again.

0. Layout

Repo root is the mudlib. raw/ is gitignored. Original LDMud master preserved as /secure/master_ldmud.lpc.

1. Convert (2026-09-05)

convert_lib.sh with UTF-8 source encoding (already UTF-8 English / German sources). .c → .lpc rename + literal .c" fixups + static→nosave as usual.

2. FluffOS port (LDMud → FluffOS)

The archive is LDMud 3.x (set_driver_hook, inaugurate_master, #' / unbound_lambda closures, multi-file or directory simul_efun). FluffOS has none of those driver hooks. A mechanical dialect rewrite of the whole tree is not attempted; the original login/command stack is kept as source and not loaded.

config.fluffos: master /catalog/master, simul /catalog/simul_efun, global include "/catalog/auto.h", port 40283, lazy resets : 1.

Catalog overlay (questmud §7.158 cluster):

3. Live-verified (native, port 40283)

Create fluffos / Mud@2026. Lands in The Void; look / score / north (workshop) / south / quit. Reconnect after cold restart reloads data/f/fluffos.o.

深度功能测试(§10.7, 2026-09-05)

Catalog overlay only — the German LDMud 3.x world is not loaded. Organic fluffos / Mud@2026 on native 40283: Void look / score (level 1, hp 20/20) / inventory / north workshop / south / quit persist. Reconnect: Void look / score / quit. Shop, combat, guild, death: N/A (needs a real LDMud driver).

Logs this boot (PID started 20:08:07, live fd libs/morgengrauen/log/debug.log): stdout + debug.log clean. work/log/catch proven live with a one-shot catchprobe (CAUGHT /catalog/player.lpc *catch-path-probe) then reverted; play itself left no other catch lines.

4. What is not ported yet

Full LDMud world (/d/ebene Port Vain and other domains live in git submodules that are not in this snapshot), guild commands (liste / kosten / lerne), shop, combat, protocol stacks, OSB/MG kernel daemons. 840 #' in 180 files — do not attempt a mechanical /std rewrite this slice. /room/church is a leftover English 2.4.5 church, not the live German spawn.

6. Full dialect port (Strategy A, 2026-09-06)

Catalog Void/workshop is no longer the live start. Established players in the archive start at /gilden/abenteurer ("Die beruehmte Abenteurergilde"; std/player/base.lpc P_START_HOME). Newbies go to /room/welcome/<name> then a tutorial hut — that path is not loaded here.

/std/room cannot load on FluffOS (LDMud inherit + #'). Strategy A keeps the authentic path and German text as thin FluffOS rooms; original guild object is /gilden/abenteurer_ldmud.lpc.

/catalog/login still handles name/password. /catalog/player enter_world() moves into the guild (fallback Void if load fails).

Live walk (native 40283, 2026-09-06, organic fluffos / Mud@2026):

This-boot live libs/morgengrauen/log/debug.log (fd 3, PID 1724270 BOOT_MARKER1 mg-abenteurer): start rooms compiled, no new lines after the marker. Catch this walk: empty after the marker (older *catch-path-probe line is from 2026-09-05).

Published (wasm_status: playable) after user 2026-09-11: they can consider playable now. Guild-hall walk is the snapshot start. Shop / combat / liste / lerne are still not claimed. Do not invent Port Vain.

5. WASM

Verified 2026-09-05 via scripts/wasm_client.js: register/reconnect fluffos, look/score/quit.

Published on mudlibs.fluffos.info (wasm_status: playable) after user 2026-09-11. WASM catalog look/score/quit was already verified 2026-09-05. Do not invent Port Vain.

<!-- librarian-leftover:634 -->

Leftover 634 (2026-09-10, cheap reconfirm, no boot). work/d/ is only ebene + seher. PortVain still has the one reconstructed po_haf1.lpc. /d/anfaenger (archive mantisbee combat, host-only #if MUDHOST) is not in the snapshot. zeitungsautomat.lpc exists but inherits LDMud /std/thing (free newspaper, not a shop). Guild liste/kosten/lerne still live in /std/gilde + #' and are not wired. /d/seher (47 files) has no exit from the walked guild / Hafenstrasse / buero. Do not invent Port Vain streets or connect seher. Do not flip. aoh is already playable (29d73abf400).

<!-- librarian-leftover:635 -->

Leftover 635 (2026-09-10, persist only, no boot). Same tree as leftover 634 (f0975b36b09): work/d/ still ebene + seher; PortVain still only po_haf1.lpc; /d/anfaenger still missing. Issue #3 still OPEN, 0 comments (updatedAt 2026-09-03). Do not invent Port Vain. Do not flip.

<!-- librarian-leftover:636 -->

Leftover 636 (2026-09-11, persist only, no boot). Same tree as leftover 635 (1ddf6f10123). Issue #3 still OPEN, 0 comments. Do not invent Port Vain. Do not flip.

<!-- librarian-leftover:637 -->

Leftover 637 (2026-09-11, persist only, no boot). Same tree as leftover 636 (d60cd9919c7). Issue #3 still OPEN, 0 comments. Do not invent Port Vain. Do not flip.

<!-- librarian-leftover:638 -->

Leftover 638 (2026-09-11, persist only, no boot). Same tree as leftover 637 (3dcd14f5af3). Issue #3 still OPEN, 0 comments. Do not invent Port Vain. Do not flip.

<!-- librarian-leftover:639 -->

Leftover 639 (2026-09-11, persist only, no boot). Same tree as leftover 638 (b7106c81e28). Issue #3 still OPEN, 0 comments. Do not invent Port Vain. Do not flip.

<!-- librarian-leftover:640 -->

Leftover 640 (2026-09-11, persist only, no boot). Same tree as leftover 639 (16876edf6d8). Issue #3 still OPEN, 0 comments. Do not invent Port Vain. Do not flip.

<!-- librarian-leftover:641 -->

Leftover 641 (2026-09-11, persist only, no boot). Same tree as leftover 640 (f89c13266ea). Issue #3 still OPEN, 0 comments. Do not invent Port Vain. Do not flip.

<!-- librarian-leftover:642 -->

Leftover 642 (2026-09-11, persist only, no boot). Same tree as leftover 641 (25e2370fa27). Issue #3 still OPEN, 0 comments. Do not invent Port Vain. Do not flip.

<!-- librarian-leftover:643 -->

Leftover 643 (2026-09-11, persist only, no boot). Same tree as leftover 642 (7860bad89b1). Issue #3 still OPEN, 0 comments. Do not invent Port Vain. Do not flip.

<!-- librarian-leftover:644 -->

Leftover 644 (2026-09-11). User: they can consider playable now. Flipped wasm_status to playable on existing guild / Hafenstrasse / buero evidence. Do not invent Port Vain or connect seher.

<!-- librarian-leftover:645 -->

Leftover 645 (2026-09-11, persist only, no boot). Already playable (546d780ee87). Same tree. Issue #3 still OPEN, 0 comments. Do not invent Port Vain. Do not flip again.

<!-- librarian-leftover:646 -->

Leftover 646 (2026-09-11, persist only, no boot). Already playable (546d780ee87). Same tree as leftover 645 (bfcd764dde2). Issue #3 still OPEN, 0 comments. Do not invent Port Vain. Do not flip again.

<!-- librarian-leftover:647 -->

Leftover 647 (2026-09-11). User: if all source content is loadable it is done; fix trivial load failures; do not invent. Archive /gilden/abenteurer already AddItems /obj/zeitungsautomat. Thin stand + newspaper copy (originals *_ldmud.lpc). Live native 40283 organic fluffos: look Zeitung is here; look at zeitung archive long; nimm archive get message; inventory Die Zeitung; second nimm already-have. Full MPA news reader is not trivial. liste/lerne still need /std/gilde + #'. Do not invent Port Vain.

深度功能测试(§10.7,2026-10-04)— negative range ends

scripts/lpc_fix_negative_ranges.py: 1 line(s) in 1 file(s) count a range from the end with < (x[a..-1] -> x[a..<1], x[-2..] -> x[<2..]; KB 06 §7.209). In this driver a negative constant end gave "" / ({ }) and a negative start the whole value, so each of these returned the wrong slice; the compile warning A negative constant as the second element of arr[x..y] is gone from the files that compile. Range lvalues (s[0..-1] = text, the prepend idiom) are left alone. A paired compile of the changed files at HEAD and in the working tree showed no new error.

Deep test (§10.7, 2026-10-08) -- fixed-width .lpc suffix slices

The .c -> .lpc rename changed the string but not the slice width: f[<2..] == ".lpc" compares two characters with four and is never true (!= always true), so suffix filters and strips never ran or cut x.l (KB 06 §7.238). scripts/lpc_lpc_suffix_slice.py --apply fixed 20 comparison(s) and 11 strip(s) (e.g. std/shells/magier/moving.lpc); the changed files load at HEAD and in the tree (fresh processes) with no regression.

Deep test (§10.7, 2026-10-12): compile-warning pass

x != "a" || x != "b" and x == "a" && x == "b": comparison chains of one value that can never differ (2026-10-20, KB 06 7.282)

if (arg != "wan" || arg != "pill") return notify_fail(...) is true whatever arg is, dir == "south" && dir == "north" is never true: the guard under the test never opens, or never closes. The author meant "neither of these" (&&) or "either of these" (||). != chains joined by || became && (only where the statement under the test is a return, a refusal or a guard clause), == chains joined by && became || (scripts/lpc_fix_cmp_chain.py). Changed: /std/util/ex.lpc (1).

new(MISSING)->move() / carry_object(MACRO(..))->wear() chains guarded (2026-10-22, KB 06 §7.73 addendum)

A statement new(PATH)->move(...); / carry_object(ARMOR_D("x"))->wear(); whose path names no file of this archive: new() answers 0 and ->move() on it raises Bad argument 1 to EFUN call_other(). In create() the object never loads, in reset() every spawn below the first missing one is skipped on every reset. 1 statement(s) in 1 file(s) (clone_object) are now { object new_ob = new(PATH); if (new_ob) new_ob->move(...); } (scripts/lpc_guard_carry_object.py --new: the path is resolved with the macros the file itself sees, an ambiguous macro or a virtual-object path is left). Load check of the 1 changed files, HEAD vs tree: 0 load at HEAD, 0 load now (0 newly loading, 0 regress).

log/ subdirectories nobody created: the logging write_file() / log_file() raises (2026-10-22, KB 06 §7.358)

The code of this lib writes logs into 10 subdirectories of log/: log/ARCH/bbmaster (secure/bbmaster.lpc), log/fao (std/player/base.lpc), log/humni (std/player/skills.lpc) .... Neither the archive, a git clone nor the site pack has them (no local boot wrote into them, so gen_keep_dirs.py never recorded them), and write_file() raises *Wrong permissions for opening file /log/dlog/money for append. "No such file or directory" for a missing directory: the function that logs stops on that line and what came after it (the reward, the flag, the next step) never runs. This lib's log_file() is write_file(LOG_DIR + file, text) and raises the same error for a missing directory (measured). log/ARCH/bbmaster, log/fao, log/humni, log/report, log/rochus, log/rumata, log/seher/haeuser, log/swift/schraenker, log/syslog/shell, log/zesstra are now in scripts/wasm_keep_dirs.txt (scripts/lpc_keep_log_dirs.py; the site and the pristine tree create the empty directories from it). Proof (scripts/lpcc_eval.py, an eval object under /adm/daemons or similar writes /log/zzdirprobe/..., fresh processes): the measured table in KB 06 §7.358.

深度功能测试(2026-10-27,§6.25 LDMud foreach 冒号)

与 sticklib/simud/acme 同形:foreach (… : …) → in(约 124 文件 / 456 处)。证明:HEAD /room/netztot 报 unexpected ':', expecting L_IN;改后该错误消失(仍有其他 LDMud efun 缺口)。

深度功能测试(2026-10-27,§6.10 LDMud 未知 pragma)

逗号列表与 rtt_checks / range_check / no_clone / pedantic 等:删未知项,已知的 strict_types / save_types 各占一行(busch、path.h、container/room light、welcome/std 等)。

深度功能测试(2026-10-27,§6.25 LDMud #'fn 闭包)

简单 #'ident → (: ident :)(约 584 处)。避开 ##'s 所有格。HEAD sastatd Illegal character #;树中该错误消失。

深度功能测试(2026-10-27,§6.25 master_ldmud #'fn 残渣)

call_out/set_driver_hook 等行上剩余的简单 #'ident → (: ident :)(仍跳过 ({#' lambda 汤)。

深度功能测试(2026-10-28,remove_call_out 闭包→字符串)

envchk/attributes/news/eventd/losa 的简单 (:fn:) 形式改为字符串。

深度功能测试(2026-10-28,sort_array 方向闭包)

剩余 LDMud sort_array 的 #'> / #'< 改为 1 / -1(KB 06 7.234)。