该技能用于修改 Tiny World Builder 的模式指示器、启动工具选择或 Esc 退回 Select 的行为。
模式安全:启动结束时总是落在 Select 工具上,bootApp 在 loadState() 后调用 selectTool(DEFAULT_TOOL),因此恢复的世界所保存的 toolId 不会让新会话处于“已武装”的建造状态。Build/Play 模式与 Showcase 相互独立:#build-play-mode 切换 body.tw-play-mode,持久化 tinyworld:build-play-mode.v1,并暴露 window.__tinyworldIsPlayMode() / window.__tinyworldMode。PLAY 模式下隐藏建造面板与编辑轮盘,清除选择/子编辑状态,变更路径应通过与 mpEditAllowed() 相同的编辑检查来限制。
首次加载经过 #welcome-modal:圆角 .launch-modal 显示 assets/twlogo.png 与 Tinyverse、Battleworlds、Build、Play 按钮,含 “Created by Jason Kneen” 页脚及 @jasonkneen、@tinyworldsapp 链接,并通过 body.welcome-launch-open 隐藏应用外壳。Build/Play 调用 window.__tinyworldMode;Tinyverse 等待 window.__tinyworldWorlds.open()(或 tinyworld:worlds-ready 信号)后打开 Worlds 前端,而不是静默回退到 Build;Battleworlds 在存在时调用 window.__tinyworldBattleworlds.open(),否则回退到 Play。不要恢复旧的农场/车辆欢迎选择器,并保持 publish.sh 将 assets/ 复制到 dist/assets/。
Showcase 模式只保留右上角圆形 #showcase-exit X 按钮,不要恢复为宽文字胶囊,保留 aria-keyshortcuts="Escape" 与调用 setShowcaseActive(false) 的 Escape 处理程序。
#mode-indicator(HUD 芯片,在 19-tools-toolbar.js 的 updateModeIndicator 中更新)显示当前模式并用颜色区分:select 平静、build 琥珀色、erase 红色,保持 pointer-events:none。Esc 将任何建造/绘制/擦除工具退回 Select(处理程序在 20-input-place-erase.js,第一人称步行模式中跳过)。
视图模式弹窗含五种:俯视、等距、透视、第三人称步行(tp)与第一人称步行(fp)。两种步行模式由 20-input-place-erase.js 中同一个 fp 控制器驱动;tp 在体素化身之后显示追随相机,fp 使用化身骨架的 getEyeWorldPosition() 并通过 setFirstPerson(true) 隐藏头部。修改已保存相机校验时,应把 tp 保留在相机模式 schema/导入允许列表中。
两种步行模式仅限家园建造器。fp 化身被加入共享 worldGroup,因此绝不能与 Tinyverse 房间自带的联网化身共存,否则玩家会看到两个自己。当 window.__tinyworldInWorldRoom 设置时,setCameraMode 将 fp/tp 重定向为透视;47-worlds-room.js 的 enterRoom 调用 window.__tinyworldExitWalkMode(由 20-input-place-erase.js 暴露)在生成房间化身之前销毁活动的步行化身。房间自带的第一人称是表面漫游缩放(v 键,47 中的 _sr*),而非建造器的 fp 控制器。
注意:npm test(tools/check.js / smoke-static.js)会从 tiny-world-builder.html 与 engine/**/*.js 重建拆分后的应用,改变启动模式、启动器外壳或模式持久化时需更新这些静态守卫。
底部工具栏与浮动方块面板:默认使用分组式底部 .toolbar。设置 → 应用中的 “Show groups” 复选框(#toolbar-show-groups,持久化为 tinyworld:showGroups,默认开启)切换模式。关闭时 body.hide-groups 仅隐藏底部工具栏的方块工具/分组按钮,并显示可调整大小、可拖动的浮动 #tool-palette,包含所有可放置方块(select + 所有带房屋变体展开的 TOOL_GROUPS 工具 + erase)。底部工具栏本身必须保持可见,以容纳 Build/Play、Home、Shield、视图模式、时间/天气、声音、图层、设置和账户等实用控件。
该面板是自包含模块:engine/world/35-tool-palette.js。方块用 buildToolButton(t, { flyout: true }) 构建,保留颜色并由同一个 updateToolActiveStates() 循环高亮。
小屏强制分组模式:showGroupsEnabled() 在 ≤700px 时无论存储偏好都返回 true(isSmallScreenForGroups()),复选框在此禁用,resize 监听器跨断点重新应用。浮动面板在手机上不可用,绝不可在那里打开。手机工具栏在 @media (max-width: 700px) 中压缩为纯图标(隐藏标签/箭头,按钮更小)。网格使用固定 64px 方格(repeat(auto-fill, 64px)),调整面板大小时方块重排到最近的方格。buildToolbar() 调用 rebuildToolPaletteIfActive(),使工具栏重建刷新已打开的面板。
分组弹出菜单(.flyout.tool-menu)的图标布局为两行网格块(renderToolGroupFlyout 中设置 gridTemplateColumns: repeat(ceil(n/2), auto))。
旧的垂直 .controls 导轨不再显示。保留其元素 ID 作为稳定接线目标,但把日常外壳放在底部工具栏:Build/Play、Home、Shield、视图模式、时间/天气、设置和账户。导入/导出必须保持仅所有者可用,不应加入普通用户工具栏。
旧的 #mode-indicator HUD 芯片已从 DOM 移除;updateModeIndicator() 仍运行但对缺失元素无操作。在 Tinyverse 多人 HUD 外壳中,只有账户退出应使用门箭头退出图标;返回世界选择器的世界内退出使用 tw-hud-back-worlds、回复字形和 worlds.backToWorlds,以免与登出混淆。