地面样式配置归一化


1. 唯一真相源 scripts/数据/地图/地面样式配置.lua
lualocal FloorStyleConfig = {} -- ★ 所有地面样式集中定义在这里 FloorStyleConfig.STYLES = { ["木地板"] = { texture = "image/地面/木地板_无缝.png", tileSize = 40 }, ["草地"] = { texture = "image/地面/campus_background.png", tileSize = 64 }, ["水泥地"] = { texture = "image/地面/campus_canteen_floor.png", tileSize = 40 }, ["教室地砖"] = { texture = "image/地面/campus_classroom_floor.png",tileSize = 40 }, -- ... 其他地砖 } local DEFAULT_STYLE = "木地板" -- 旧存档兼容:旧名 → 标准 key(不再静默回退木地板) local LEGACY_ALIASES = { ["教室地面"] = "教室地砖", ["食堂"] = "食堂地砖", ["办公室"] = "水泥地", ["医务室"] = "医务室地砖", } function FloorStyleConfig.Normalize(styleName) if not styleName or styleName == "" then return DEFAULT_STYLE end return LEGACY_ALIASES[styleName] or styleName end -- 主查询接口(带别名归一化 + 默认兜底) function FloorStyleConfig.Get(styleName) local key = FloorStyleConfig.Normalize(styleName) return FloorStyleConfig.STYLES[key] or FloorStyleConfig.STYLES[DEFAULT_STYLE] end -- 房间类型 → 默认地面样式 FloorStyleConfig.ROOM_DEFAULTS = { ["教室"] = "教室地砖", ["厕所"] = "卫生间瓷砖", ["办公室"] = "水泥地", ["食堂"] = "食堂地砖", ["医务室"] = "医务室地砖", ["操场"] = "草地", } function FloorStyleConfig.GetForRoom(roomType) local styleName = FloorStyleConfig.ROOM_DEFAULTS[roomType] or DEFAULT_STYLE return styleName, FloorStyleConfig.Get(styleName) end return FloorStyleConfig


2. 调用方统一委托模式(删除本地副本)
校园地图.lua(运行时地图):
lua-- 删除了 ROOM_TEXTURES / FLOOR_STYLE_TEXTURES 本地表,改为: local FloorStyleConfig = require("数据.地图.地面样式配置") local function GetFloorStyleTexture(styleName) return FloorStyleConfig.Get(styleName) -- 自动走别名归一化 end -- 房间卡片取纹理: local _, roomDefaultFloor = FloorStyleConfig.GetForRoom(room.type) local texture = room.floorTexture or roomDefaultFloor.texture
地图编辑模式.lua(编辑器主页面):
lua-- 关键修复:不再直接索引 FLOOR_STYLE_CONFIGS[styleName](绕过别名) -- 改为委托到 Catalog → FloorStyleConfig.Get(走 Normalize → LEGACY_ALIASES) GetFloorStyleConfig = function(styleName) return MapEditorCatalog.GetFloorStyleConfig(styleName) end -- CreateCanvasRoom 不再依赖注册表冗余 floorTexture/floorTileSize: local _, roomDefaultFloor = FloorStyleConfig.GetForRoom(room.type) local floorTexture = room.floorTexture or roomDefaultFloor.texture
编辑器目录.lua(编辑器面板数据源):
lualocal FloorStyleConfig = require("数据.地图.地面样式配置") MapEditorCatalog.FLOOR_STYLE_CONFIGS = FloorStyleConfig.STYLES MapEditorCatalog.PALETTE_ITEMS.floor = FloorStyleConfig.GetPaletteItems() function MapEditorCatalog.GetFloorStyleConfig(styleName) return FloorStyleConfig.Get(styleName) end
功能空间类型注册表.lua(房间类型注册):
lua-- 删除了每个房间类型的 floorTexture / floorTileSize 冗余字段, -- 只保留 floorStyle = "config key",旧名通过 LEGACY_ALIASES 自动归一化: ["教室"] = { floorStyle = "教室地面", -- 旧名,归一化 → "教室地砖" wallStyle = "教室墙", -- floorTexture/floorTileSize 已删除 },
地面区域编辑.lua(子模块):
lua-- 零改动:通过注入的 self.getFloorStyleConfig 回调自动走新链路 -- options.getFloorStyleConfig → GetFloorStyleConfig → Catalog → FloorStyleConfig.Get


3. 委托链(一次查询的完整路径)
业务代码调用 GetFloorStyleConfig("教室地面")
→ MapEditorCatalog.GetFloorStyleConfig("教室地面")
→ FloorStyleConfig.Get("教室地面")
→ Normalize("教室地面") → LEGACY_ALIASES["教室地面"] → "教室地砖"
→ STYLES["教室地砖"] → { texture, tileSize=40, hint }

4. 新增地面/房间类型的操作对比
| 操作 | 重构前 | 重构后 |
| 新增地面样式 | 改 3–4 个文件(注册表、编辑器目录、运行时地图、面板常量) | 改 1 个文件:地面样式配置.lua STYLES 表 + PALETTE_ORDER |
| 新增房间类型默认地面 | 重复写 texture/tileSize 到注册表 | 只在 ROOM_DEFAULTS 加一行映射 |
| 旧存档名字不匹配 | 静默回退到木地板(视觉 bug) | LEGACY_ALIASES 显式归一化 |

