info.html · 介绍 · play.html · 游玩 · llms.txt · 下载与本地运行 · ZIP · GitHub
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
- name:
fluffos - password:
Mud@2026 - privilege: seeded mortal (level 1). This overlay does not auto-god the first player.
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.fluffosGame 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 quitNOTES · 移植与修复记录
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):
/catalog/master.lpc—get_root_uid/get_bb_uid,creator_filealways returns string"BACKBONE",valid_readincludesload_object/recompile_object/include/restore_object,valid_overridereturns 1,error_handler→/log/catch/catalog/simul_efun.lpc— thincat/log_file/exists/catalog/login.lpc,/catalog/player.lpc— name/password →/gilden/abenteurer(Strategy A; Void fallback if load fails)/catalog/void.lpc,/catalog/workshop.lpc— leftover overlay rooms
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.
/gilden/abenteurer— guild hall (login)/d/ebene/room/PortVain/po_haf1— Hafenstrasse (north). Domain files.ebene is not in the snapshot; text reconstructed from the guild's own Hafenstrasse / Port Vain details so the exit walks./p/verein/room/buero— Foerderverein office (up)
/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):
- Lands in Die beruehmte Abenteurergilde.
look at tuer/dielen/uhr. - North → Hafenstrasse von Port Vain. South back. Up → Buero des Foerdervereins. Down back.
scorelevel 1, hp 20/20. Quit persist. Reconnect lands in the guild again.
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.
- 2026-10-10:编译警告第二轮(按驱动报告逐条修):按位 & 改逻辑运算 0 处,返回类型/原型 0 处,NPC+F_UNIQUE 的 init() 0 个,带初始化的未用局部变量 3 个,只在 #if 分支用的声明移进分支 0 个文件;改动 3 个文件,HEAD 与工作树各载入一次无回退(3 objects; HEAD PASS 1, tree PASS 1; regress 0; newly loading 0),这些文件的警告 3 -> 0。
Deep test (§10.7, 2026-10-12): compile-warning pass
nosavefunctions ->protected(263), 2 bad escapes, 2 unused locals; LDMud pragmas FluffOS reports and ignores, including comma lists (#pragma strong_types,rtt_checks, ~480 lines;lpc_warnings.pynow recognises the comma form).doc/beispiele/precompiler/konstanten.lpc(a preprocessor tutorial):#undefbefore the two redefinitions it demonstrates (BS,ROOM), so the lesson stays and the example is correct C preprocessor usage.- 0 warnings left in files that compile. No load regression (101 checked objects); deleted-declaration audit clean. 635 of 663 files still do not compile (LDMud efuns and closures): a port, not a 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)。