奇遇 Set Piece

本教程基于 JackSlender 和 Kzisor 在 Klei 论坛上的教程整理。

引言

本教程讲解如何制作自定义的奇遇 / 彩蛋(即一块已经构建好的地形)。学习之前,你应该已经掌握 Mod 基础(文件夹结构、modmain 等)。

准备工作

运行饥荒 MOD 工具,然后启动 Tiled。这个程序相当强大,但制作彩蛋只需要用到最基本的功能。

点击「文件 → 新建」,会弹出一个小窗口:

  • 地图大小:宽度、高度
  • 块的大小(像素):设为 64×64。游戏里一块就是 64 像素;如果你设成 16×16,那么 4 块才相当于游戏里的一块

下载一份图块集合,用来编辑彩蛋地形。

点击「地图 → 添加外部图块」(不是新图块),选择刚下载的文件。解压后有一个 png 图片和一个 .tsx 文件,后者就是图块文件。导入成功后,右下角会显示可用的地皮纹理。

先给图层命名:在右边「图层」选项卡里找到「块层 1」,双击重命名为 BG_TILES;再在选项卡空白处右键,选择「添加对象层」,重命名为 FG_OBJECTS。准备工作到此完成。

开始创建奇遇

在左边地图上铺设地皮。请确保当前选中的是 BG_TILES 图层(否则铺不了地皮)。在图块集右下角选中需要的图块,然后在屏幕中间单击并拖动即可铺开。

记住游戏里图块是 64×64。如果你把图块设成了 16×16,那就要用 4×4 个图块拼成游戏里的一块。

接下来创建物品:选择 FG_OBJECTS 对象层,切到「对象」选项卡,单击工具栏上的「插入矩形」。

在你需要的位置单击,会出现一个小灰色矩形。右键单击它,选择「对象属性」,会弹出对话框。在「类型」编辑框里输入要生成的预设物(prefab)名称。注意:必须填在「类型」框里,填在「名称」框不会生效。 点击确定即可。对象数量不限。

可以用工具栏的光标工具移动对象,右键选择「删除 1 个对象」可删除。

建议随时保存。最后一步最重要:文件 → 导出为…,另存为 Lua(*.lua),然后放到 /你的mod文件夹/scripts/map/static_layouts/。

实现奇遇

添加代码把它初始化进游戏:

1
2
3
4
5
6
7
8
9
10
11
-- 引入需要的模块
local Layouts = GLOBAL.require("map/layouts").Layouts -- 存放所有彩蛋
local StaticLayout = GLOBAL.require("map/static_layout") -- 用于加载彩蛋
Layouts["ReplaceName"] = StaticLayout.Get("map/static_layouts/replace") -- 索引你的 setpiece

AddRoomPreInit("Forest", function(room) -- "Forest" 是生态环境(森林)
if not room.contents.countstaticlayouts then
room.contents.countstaticlayouts = {}
end
room.contents.countstaticlayouts["ResearchLab"] = 1 -- 添加一个
end)

这段代码应保存到 modworldgenmain.lua,与 modmain.lua 放在同一位置。

制作场景

如果已经在奇遇中的对象上添加了场景属性(位于 scripts/scenarios 文件夹内除 .lua 之外的文件),就可以把它链接到脚本场景。场景预加载时,这个脚本也会被加载,文件结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
local function OnCreate(inst, scenariorunner) -- 只在首次加载执行
-- 例如:填充箱子(前提是场景中有箱子)
end

local function OnLoad(inst, scenariorunner) -- 脚本加载时执行
-- 在这里完成初始化
end

local function OnDestroy(inst) -- 场景预设物被销毁时执行
-- 对切斯特陷阱、冬季陷阱这类场景很重要
end

return -- 这一行下面的内容会交给场景管理器
{ -- 这是一个 table
OnCreate = OnCreate,
OnLoad = OnLoad,
OnDestroy = OnDestroy,
}

延伸阅读