北境之地资源加成模组
WisdomEquan Lv2

记录一次Northgard(北境之地)模组编写的过程

游戏介绍

AFTER YEARS OF TIRELESS EXPLORATIONS…

Brave Vikings have discovered a new land filled with mystery, danger and riches: Northgard.

The boldest Northmen have set sail to explore and conquer these new shores, bring fame to their Clan and write history through conquest, trading, or devotion to the Gods.

经过多年不懈的探索……

勇敢的维京人发现了一片充满神秘、危险和财富的新大陆:北加德。

最大胆的北方人已经起航去探索和征服这些新的海岸,通过征服、贸易或对神的忠诚来为他们的氏族带来名声,并写下历史。

准备工作

确保你已经阅读完了Northgard官方帮助文档,并且你已经知道了如何创建一个mod。确保我们的步骤一致你需要检查一下步骤:

  1. 在Northgard的根目录下创建一个Northgard\mods目录
  2. 打开Northgard——创意——创建地图
  3. 地图大小:巨大
  4. 玩家人数:8
  5. 难度:普通
  6. 游戏类型:随机
  7. 点击创建地图
  8. 然后保存地图并设置一个名称,比如cheatRes
  9. 创意——启动北加尔编辑器——加载刚才创建的模组目录
  10. 从游戏目录中复制Northgard\NGEditor\res\script.hxcheatRes目录下
  11. 打开北加尔编辑器——Database——Diff——Create
  12. 创建一个模组预览图片比如x512、x1024的正方形大小,命名为preview.jpg

你的模组目录Northgard\mods\cheatRes下应该有以下四个文件:

cdb.diff 修改游戏规则的数据库文件
map.dat 在游戏中创建的自定义地图
preview.jpg 上传创意工坊的模组预览图
script.hx 修改游戏逻辑的

目标

每隔一段时间自动增加资源,比如:木材、食物、石材、铁锭等

script.hx

首先阅读一遍示例代码,可以发现主要用的只有三个方法:saveState()init()regularUpdate(dt : Float),其他不需要的方法都可以删掉了

  • saveState():用于保存游戏的,保持默认就好
  • init():模组执行逻辑的主入口且只执行一次
  • regularUpdate(dt : Float):每0.5秒就会执行一次

从这三个方法中可以发现主要代码写在regularUpdate即可,通读官方提供的API文档可以发现有一个Player表示玩家点进去后发现有一个类似添加资源的函数addResource(kind:ResourceKind, amount:Float, produced:Bool = true):Void,这里第一个参数应该是指要添加的资源类型,但遗憾的是文档中并没有提及有哪些资源类型,第二个是指资源的数量,第三个可选。

那就只能参考别人的模组看看怎么写,打开创意工坊订阅最热门的模组。下载完成后打开SteamLibrary\steamapps\workshop\content目录下修改日期排序中最新的目录,只需要关注script.hx文件,在代码里搜索关键字addResource发现有一行类似的me().addResource(Resource.Fame, 100);,看到这里让我突然想起官方文档中对于玩家的修改使用的就是me()这样就不用判断是否是AI还是玩家了。

尝试编写模组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 保存游戏(保持默认)
savedInt = 0;

function saveState() {
state.scriptProps = {
savedInt : savedInt,
};
}

// 开局执行一次
function init() {
if (state.time == 0){
// 声望
me().addResource(Resource.Fame, 100);
}
}

打开游戏选择单人游戏,添加模组,选择本地模组,进入游戏。

可以看到开局增加了100声望,同时增加了货币、食物、木材、知识。从这一点可以发现Resource.Fame是指声望。

继续查找其他资源类型,又看到一个资源类型Resource.Money,进入游戏发现增加的是货币。然后再次返回别人的代码中查找,遗憾的是没有发现其他资源类型。

到这里可以大胆的推测一下游戏中的其他资源类型,比如:

1
2
3
4
5
6
7
8
// 石头
Resource.Stone
// 铁矿
Resource.Iron
// 木头
Resource.Wood
// 食物
Resource.Food

然后代入参数类型再次尝试运行模组,令人高兴的是推测是正确的。

然后添加所有可能的资源类型,然后保存。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 保存游戏(保持默认)
savedInt = 0;

function saveState() {
state.scriptProps = {
savedInt : savedInt,
};
}

// 开局执行一次
function init() {
if (state.time == 0){
// 声望
me().addResource(Resource.Fame, 100);
}
}

// 0.5秒执行一次
function regularUpdate(dt : Float) {
// 金钱
me().addResource(Resource.Money,1);
// 石头
me().addResource(Resource.Stone,1);
// 铁矿
me().addResource(Resource.Iron,1);
// 木头
me().addResource(Resource.Wood,1);
// 食物
me().addResource(Resource.Food,1);
}

到这里一个模组就编写完成了!

上传模组

确保你的模组目录中拥有一个名为preview的图片文件,这将用来在模组浏览页面展示你的模组。

然后打开游戏——创意——上传模组,上传成功后打开创意工坊中你发布的文件,完善模组信息比如标题和描述以及需要展示的图片或者视频。

注意:添加的模组标题和描述必须是符合当前语言的,你可以添加:日语、简体中文、英语,其他国家的人会看到不同的语言

订阅我

萌新资源大礼包(cheatRes)