emollick/perilous-ways

GitHub: emollick/perilous-ways

一个基于 three.js 的奇幻大陆 3D 铁路经营模拟游戏,融合了经济贸易、种族关系和叙事系统,无需构建步骤即可在浏览器中运行。

Stars: 0 | Forks: 0

# 危险的途径 **在线演示:LICENSE** 这是一个 3D 世界模拟器。你将扮演疆域交通局(Realm Transit Authority)的局长,管辖一片居住着半身人、矮人、精灵、人类和兽人的大陆。你无需战斗、统治或探险。你的职责是铺设铁轨、购买机车,以及处理公文。 随后,你将发现铁路的真正用途。 ![第一周的边境区](https://static.pigsec.cn/wp-content/uploads/repos/cas/8d/8d4ca773ba8234e2d3b3746f89697b34d2841cb0af80ed37e94900de900e7c3d.jpg) ![布拉肯福德,特写](https://static.pigsec.cn/wp-content/uploads/repos/cas/af/afb10c2ca20097cddfce42f3cd6a314054bb5638850d7f055ee27d6dfdcbbb2d.jpg) ## 游戏玩法 点击一个定居点,再点击另一个,即可勘测两地之间的路线。勘测员会根据真实的高度图自行规划线路——顺应地势、跨越河流、开凿隧道——随后向你提交账单。你可以选择批准或拒绝,并决定这是开通新线路还是延伸现有线路。 确认后即可投入运营。在 *The Fleet*(车队)中点击某项服务,打开其档案并进行设置: | 操作杆 | 功能 | |---|---| | **Carries(承运类型)** | 货运按吨计费收益更高;客运的单次运载人数是数倍之多。两者都不会增加额外的运力吨数——要提升运力,需将更多生产地接入路网 | | **Fares(票价)** | 高昂的票价能立即获取金钱,但会损害繁荣度、治安度,并最终导致人口流失。廉价的票价收益较少,但定居点会围绕线路发展壮大 | | **Engines(机车)** | 决定由哪些机车执行该服务——Hammerhead 的牵引力比 Pony 高出 56%;Windward 的运载能力是后者的 3.4 倍,且不使用煤炭 | | **Rolling stock(铁路车辆)** | 每列火车的车厢数量,上限受限于交通局的现有库存。列车编组会以图形展示,车厢也会直观显示该线路的实际承运情况 | | **Wardens(守卫)** | 每周花费 8 克朗,可使该线路的事故率减半 | | **Calls at(停靠站点)** | 可添加、取消停靠站、调整顺序,或将该服务拆分为两段 | ### 委托 **Commissions**(委托)面板(位于顶部栏,或按 `C` 键)是疆域内各方具名向你提出需求的地方。每项委托都是一个需要你付诸行动的陈述:*这批货物,运至此地,限于此周,支付此酬金,否则……* - **Freight(货运)** —— 将谷物运往无法自给自足的穴城(Delve);为婚礼运送葡萄酒(婚期不可更改);为委员会运送两车秘银(用途不明)。通过常规运营完成:只要运营的服务将货物运至指定地点,即可自动计入交付量。 - **Passage(客运)** —— 朝圣者前往灰港(Grey Quays),前往集市的旅游客流,或是正式出访的矮人代表团。只要路线*具备*客运服务即可满足要求,这也正是客运线路存在的价值。 - **Sieges(围攻)** —— 在 Age III 时代,某座前哨被围困,需要在四周内运抵武器。你可以选择拒绝。如果接受任务却未能完成,该据点将沦陷,王室定会铭记此事。 - **Physic(医疗物资)** —— 瘟疫蔓延需要阿塞拉斯(athelas),这种植物仅生长于大陆的某一处,且由一群不紧不慢的人负责采摘。 **Ledger**(账簿)(位于顶部栏,或按 `L` 键)能解答“为何会发生这种情况”:包含各项服务的收入与维护成本、昨日实际运输的物资及其路线、哪些路段已达运力上限,以及哪些定居点正处于物资短缺状态 *及其原因* —— 例如未接入供应网络、指定地点的运力短缺、或是换乘次数过多。 ### 车队 每辆机车都属于特定的**车型(class)** —— Pony、Drover、Delver、Hammerhead、Windward、Slagmaw —— 在机车工厂中,每一款都有精美的侧面机械图纸展示。它们在牵引力、速度、乘客吸引力、耐久度及维护成本之间有着真实的权衡取舍,且每款车型仅由与交通局尚有外交关系的人民出售。机车会随着运营产生磨损;在彻底大修之前,磨损的机车牵引力会下降。 ![六种车型](https://static.pigsec.cn/wp-content/uploads/repos/cas/04/044f2aaf76ca6a4ee66c00f1604ae37c3ba2e117ed6c3ec18cd847d1ad11fc49.png) 每辆机车都是独立的个体,拥有自己的名字、制造商、专属车库和运营记录。**点击一列火车**即可查看其信息卡:*Anvilheart,矮人制造,1 号机车,正在 Vermilion Way 上运行 —— 已行驶 4,212 单位,运载 180 批次,自第 3 周投入运营,发生过两次事故。* 在此界面,你可以选择**随车视角**(镜头将跟随该列车,直至你手动收回视角控制权)、**鸣笛**,或直接跳转至其执行的运营服务。 列车进站时会鸣笛示警,伴随着刺耳的刹车声和四溅的火花减速停靠,等待后会伴随着哧哧的排气声重新启动。空闲的机车停驻在 *The Fleet*(车队)下方的车库中,点击它们即可查看其过往履历。 - **左键拖拽**旋转视角,**右键拖拽**或**Shift + 拖拽**平移视角,**滚轮**缩放 - **WASD** / 方向键平移视角,**Q**/**E** 旋转 - **空格键**暂停,**1**/**2**/**3** 切换游戏速度,**L** 打开账簿,**C** 打开委托 - **点击列车**选中,按 **F** 进入随车视角 - 在展开某项服务详情的情况下,点击定居点可将其添加为新的停靠站 ## 实际模拟的底层机制 穴城(Delve)盛产铁矿却无法种植粮食;郡邑(Shire)盛产粮食却缺乏工具。如果没有你,双方都无能为力。游戏中的所有其他系统都是建立在这个基础之上的。 - **Trade(贸易)** —— 在每个模拟日中,共有十四种商品在铁路运输网络中流动,受限于线路运力和运输时间,并具备真实的生产制造链(如:矿石 + 煤炭 → 钢铁 → 武器)。 - **Growth(发展)** —— 繁荣度取决于需求是否得到满足,人口随繁荣度增长,定居点会以各自文化的建筑风格,通过五个层级向外肉眼可见地扩建。未接入服务网的地区会走向衰落,并最终从地籍册中注销。 - **Concord(民心)** —— 五大种族各有其立场。为精灵提供优质服务,他们便会留下;若无视他们,他们将从灰港乘船离去永不复返,并永久带走经济中的学识(Lore)加成。(数据验证:为他们提供服务大致能使货运吨位和收入都翻倍。) - **Peril(危险)** —— 复杂地形伴随着风险。隧道、Mirkholt 和 Ashenreach 会引发事故,其中一些甚至会彻底摧毁你的铁轨。 - **The Shadow(暗影)** —— 其力量会随着交通局的扩张而滋养壮大:路网向东延伸的距离、为兽人运输的物资、工厂的浓烟、以及隧道开凿的深度。唯有上下齐心的疆域才能将其阻挡。时间紧迫,但它是最微小的威胁。 - **Money(金融)** —— 议会的拨款取决于受服务的定居点数量,若路网停止扩张,拨款也会随之枯竭;三位放贷人收取三种不同货币的利息(王室收取“义务”,Ironmoot & Sons 收取普通利息,灰港收取“约束”);而票价的设定则是在收入与民意之间的权衡。 - **Age III(第三时代)** —— 最暴露的路段会遭到袭击,难民潮会沿着你的铁路向西涌动,随后一支军队会沿着你铺设的铁轨以你建设的速度发起进军。你必须做出抉择:强化线路防御、征用铁路用于疏散撤离,或是亲手拆毁你建造过的最伟大的工程。每种选择都会导向完全不同的游戏结局。 - **The Errand(差事)** —— 一件小巧的物品,需由人工运送,目的地是任何明智的铁路都不会抵达的偏远之地。它会随着你的金属资源延伸而向前推进,并在那里等待。 每年,交通局都会发布一份**年度报告** —— 运营里程、服务覆盖的区域、从时刻表中取消的班次 —— 所有的数据都直接取自你这一年的运营档案,并与上一年的数据进行对比。这些数字本身便构成了游戏的故事。 跨越三个时代,多种结局,并在游戏终局时呈现一部作为最终评分的编年史。 ## 本地运行 ``` python -m http.server 8577 -d . # then open http://localhost:8577 ``` 无需构建步骤。采用原生 ES modules、import map,以及内置的 three.js r185。`window.PW` 是调试接口(提供 `PW.snapshot()`、`PW.fastForward(weeks)` 等方法)。 ## 测试 除了最后两项测试需要驱动本机已安装的 Chrome 浏览器外,其他所有测试均无需浏览器即可运行。 ``` node tools/imports.mjs # every named import resolves to a real export node tools/smoke.mjs # real three.js in Node: 37 construction checks node tools/balance.mjs eardon 30 # an AI plays 30 weeks, reports the loop node tools/balance.mjs eardon 30 --elfcare # ...playing well by the Elves node tools/mapcheck.mjs eardon # ASCII map + height bands node tools/routecheck.mjs eardon # surveyor behaviour and pricing node tools/visual.mjs eardon # headless Chrome, screenshots to shots/ node tools/agencycheck.mjs # drives every operational control, asserts it moved the sim node tools/traincheck.mjs # clicks a train, rides it, whistles, checks it stops and remembers node tools/commcheck.mjs # offers, accepts and discharges commissions; sieges, athelas, mithril node tools/stockcheck.mjs # buys engines, changes rakes, checks the drawings render node tools/age3check.mjs # plays the whole Age III arc once per answer; all must terminate node tools/freevars.mjs # names used but never imported (the class of bug imports.mjs cannot see) node tools/register.mjs eardon 40 # the register in play order — read it; if you can hear machinery, file a bug node tools/balance.mjs eardon 40 --story # the chronicle as one story node tools/prodcheck.mjs # boots the deployed site, plays a few moves node tools/build.mjs # assemble dist/ for deploy ``` ## 布局 ``` src/world/worldgen.js authored macro-geography + procedural detail src/sim/route.js the surveyor: A* + deck-profile fitting src/sim/model.js the economy as tables src/sim/sim.js the tick: flow, growth, money, concord, the Shadow src/sim/events.js outcomes, petitions, endings — and the writing src/gfx/terrain.js ground, sea, 13.5k instanced trees, cloud shadows src/gfx/props.js settlement architecture for six cultures, five tiers src/gfx/trains.js four engine styles, seven wagon types, steam src/gfx/rails.js rails, sleepers, ballast, piers, portals src/gfx/scene.js camera, sun, sky, fitted shadows, bloom src/sim/fleet.js locomotive classes, names by builder, the roster src/sim/commissions.js named clients wanting cargo by a deadline src/sim/registry.js draws the written corpus without repeating itself src/text/reports.js the corpus: 209 register entries in five peoples' voices src/gfx/world3d.js binds sim to scene: stations, consists, growth, labels src/ui/hud.js the paperwork: panels, dossiers, ledger, modals src/ui/plates.js sixteen engraved SVG plates, tone by hairline src/ui/locos.js locomotive side elevations and consist strips src/audio/audio.js entirely procedural score and sound ``` `DESIGN.md`、`WORLD.md`、`ART.md`、`VOICE.md`、`UI-SPEC.md` 和 `INTERFACES.md` 是编写代码时所参照的设计规范文档。其中 `VOICE.md` 尤为重要,它记录了如何让文本设定的文风摆脱机械感,以及为此付出的学习成本。 ## 许可证 [MIT](https://github.com/mrdoob/three.js)。`vendor/three/` 目录下内置的 [three.js]() 副本版权归其作者所有,同样基于 MIT 许证。
标签:3D可视化, MITM代理, three.js, WebGL, 前端项目, 多模态安全, 数据可视化, 模拟经营, 游戏开发, 自定义脚本, 逆向工具