无名江湖服务端是一个基于 Go 的 MUD 游戏后端,提供 WebSocket 会话、核心玩法逻辑、持久化与可选 LLM 能力。
提示:可以使用wumingmud-tui客户端进行游戏体验。
- Go 1.21+
- SQLite 3 + GORM
- WebSocket
- OpenAI 兼容 LLM 接口(可选)
.
├── cmd/ # 程序入口
├── internal/ # 核心实现(engine/transport/storage/...)
├── config/ # 服务配置
├── world/ # 世界定义与规则配置
├── deploy/ # 生产部署示例(systemd/nginx)
├── scripts/ # 开发/构建脚本
├── data/ # SQLite 数据文件
├── bin/ # 构建产物
├── go.mod
└── .env.example
- Go 1.21+
- SQLite 3(用于备份脚本)
cp .env.example .env
go mod tidy
go run cmd/main.go或使用脚本:
./scripts/setup-env.sh
./scripts/deps.sh
./scripts/run.shsetup-env.sh 会直接复制 .env.example 为 .env,避免双份配置模板长期漂移。
请参考 .env.example,常用项如下:
| 变量名 | 默认值 | 说明 |
|---|---|---|
CONFIG_DIR |
./config |
服务配置目录 |
WORLD_DIR |
./world |
世界配置目录 |
SERVER_PORT |
8080 |
服务监听端口 |
SERVER_HOST |
0.0.0.0 |
服务监听地址 |
DATABASE_PATH |
data/game.db |
SQLite 文件路径 |
LLM_ENABLED |
true |
是否开启 LLM 能力 |
LLM_API_KEY |
空 | LLM API Key |
LLM_BASE_URL |
https://api.openai.com/v1 |
LLM 基地址 |
LLM_MODEL |
gpt-5.2 |
LLM 模型名称 |
LLM_TIMEOUT |
5 |
LLM 请求超时(秒,影响指令解析与战斗叙事) |
LOG_OUTPUT |
logs/server.log |
日志输出文件 |
服务支持通过启动参数覆盖路径:
./bin/wumingmud \
--config-dir /opt/wumingmud/config \
--world-dir /opt/wumingmud/world \
--env-file /etc/wumingmud/wumingmud.env优先级:命令行参数 > 环境变量(CONFIG_DIR/WORLD_DIR/ENV_FILE)> 默认值。
- 服务监听地址为
SERVER_HOST:SERVER_PORT(例如0.0.0.0:8080) LOG_OUTPUT=stdout或LOG_OUTPUT=-:输出到标准输出LOG_OUTPUT=logs/server.log这类文件路径:自动创建目录并追加写入文件
./scripts/run.sh # 运行服务
./scripts/dev.sh # 开发模式
./build.sh # 构建二进制(bin/wumingmud)
./scripts/test.sh # 测试
./scripts/lint.sh # 格式化 + 静态检查
./scripts/migrate.sh # 数据迁移
./scripts/backup.sh # 备份数据库
./scripts/world-check.sh # 世界配置检查(引用/可达性/任务关联)
./scripts/world-gen.sh # 使用 LLM 生成世界配置草案- 服务配置:
config/server.yaml - 世界配置:
world/config/game.yaml .env会在启动时自动加载(若存在),并覆盖server.yaml对应项- 生产部署模板:
deploy/systemd/wumingmud.service、deploy/nginx/wumingmud.conf - 战斗描述支持 LLM 增强,由
world/config/game.yaml中game.llm.scenarios.combat_narrative控制
- 启动后先看
server.startup与llm.init日志: llm_enabled=truellm_has_api_key=truellm_base_url、llm_model是否符合预期- 指令解析链路看:
llm.intent.success(命中)llm.intent.failed/llm.intent.parse_failed(失败原因)- 战斗叙事链路看:
llm.combat.success(命中)llm.combat.failed/llm.combat.empty/llm.combat.skipped(降级原因)
./scripts/world-gen.sh --kind quest --count 5 --theme "金庸武侠,偏江湖恩怨"
./scripts/world-gen.sh --kind location --count 3
./scripts/world-gen.sh --kind npc --count 8 --output world/generated/npcs_batch.yaml- 生成结果默认写到
world/generated/ --kind支持:quest|location|npc|item|faction- 依赖
LLM_ENABLED=true与有效LLM_API_KEY
./scripts/world-check.sh
./scripts/world-check.sh --strict
./scripts/world-check.sh --world-dir ./world- 默认校验:位置/NPC 双向引用、任务依赖与奖励引用、安全区一致性、地点可达性
--strict会将 warning 也视为失败
- 使用
systemd运行服务,启用自动重启(模板已提供) - 通过
nginx反代并保留 WebSocket 升级头(模板已提供,含 HTTPS/WSS) - 将数据库与日志目录放在独立可写路径(如
/opt/wumingmud/data、/opt/wumingmud/logs) - 优先把日志输出到
stdout并交给journald/systemd管理 - 使用
http://127.0.0.1:8080/healthz作为基础健康检查