游客你好,登录后能编辑wiki哦!
MOD制作教学“从无知到装哔”你会是下一个大佬吗?
阅读
2020-04-02更新
最新编辑:逗比的马老师
阅读:
更新日期:2020-04-02
最新编辑:逗比的马老师
摘要:
此教程为本萌新接触工厂后五个月开始编写
那么,这里分享一下自己的学习成果以及尽量的讲解多个全新的mod的制作过程。
由于学习的知识比较零碎,只能想到什么讲解什么。
因为涉及各种工具的使用,因此工具的使用方法请自行百度,本文只提供工具名称。
本萌新学习时间不长,难免会有疏漏和错误,请各位大佬指正。
- 本帖所使用各种注解符号:
- ◆重点,必要、必须、强制
- ◇次要点,非必要、非必须、非强制,包含建议
- ★必要必填字段
- ☆必要但不是必填字段
- 其它为非必要字段
- 〖1〗〖2〗〖3〗……〖99〗〖100〗〖101〗……索引标签
- 【1】【2】【3】……【99】【100】【101】……解答对应索引标签
◆mod中,注意区分“大小写”
各种mod制作、创作、构思交流
欢迎进群讨论:208715008
制作准备
制作mod前,我们先要准备好制作环境和一些工具。
游戏本体
- 首先是游戏本体,我使用的是官方
alpha windows 64位 zip版本
- 版本支持 Windows 7, 8, 10, Vista(Mac请绕道)
- ◆而此版本官方下载渠道必须正版权限。
- (虽然Steam版本或其它版本游戏本体也可以,但可能无法看到调试信息)
- 下载连接请访问官方网站download页面,找到以下关键字点击下载即可
- MS Windows (64 bit zip package)
- compatible with Windows 7, 8, 10, Vista
文本编辑器
Notepad++
- 免费的文本编辑器
- 或
Sublime Text
等其它支持utf-8无BOM格式的文本编辑器均可 - ◆windows自带记事本不支持无BOM格式
图像处理软件
画图
- 系统自带的图像处理软件
- 或
PS
等只要能做png图片的各种图像处理软件均可 - ◆要注意的是画图不支持透明色
Blender
- Steam上免费使用的3d建模软件
- 或
3dsMax
等其它各种3d建模软件均可 - ◇前期教程均不涉及,此为进阶教程使用
WinRAR
- 共享软件,网上能找到破解版本
- 或 免费的
7-Zip
等其它各种支持zip格式的压缩软件均可
了解mod
工具准备好后,先了解一下mod的整体构造
整体构造
- mod是一个以zip格式储存内容的压缩包。
- 也可以不打包以文件夹形式存放使用
- ◇但游戏加载以zip格式mod优先
- 一个完整的mod分为两大部分:外壳和内容。
- 外壳包括mod本体文件夹和mod基础信息文件。
- ◆此为mod的核心,两者缺一不可
mod本体
- mod本体文件夹是以“mod核心名称加下划线加版本号”命名的文件夹
- mod名称分为“核心名称”和“显示名称”〖1〗
- 示例:
MyMods_0.1.0
Demo_1.0.0
test_ship_1.2.34
Iron-Man_4.5.678
mod基础信息
- mod基础信息文件是一个
info.json
文件 - 储存格式为JSON(JavaScript Object Notation, JS 对象标记)是一种轻量级的数据交换格式。
- 它基于ECMAScript(w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。
- 文件编码为
utf-8 无 BOM 格式
编码。 - 文件储存内容包括:
- ★mod核心名称:
name
【1】- 核心名称可由英文、数字、横杠、下划线、空格等组成。
- 但只能以英文、数字、下划线开头,不能以横杠或空格开头,不能以横杠、下划线或空格结尾。
- 核心名称区分大小写,并且确保是唯一的。〖2〗
- 核心名称在游戏中并不显示
- ◆必须跟文件夹的名称一致
- ◇强烈不建议使用横杠或空格,请用下划线代替
- ☆mod显示名称:
title
〖3〗 - 此为菜单中模组列表显示的标题名称
- 也是游戏中以黄色字体标注在物品中部的名称
- ★mod版本号:
version
- 版本号格式为GNU风格版本号格式
- 由主版本号、子版本号和修正版本号三个部分组成,所有定义的部分都必须是大于或等于 0 的整数。
- 示例:
0.1.2
0.1.234
1.23.456
12.34.567
- ◆必须跟文件夹的版本号一致
- mod描述:
description
〖4〗 - 描述mod简介及用途
- ☆mod作者:
author
- 填上你的名字,让别人知道这是谁制作的。
- 作者联系方式:
contact
- 可填写邮箱、QQ、Blog等等……
- mod主页:
homepage
- 一般为mod全面介绍及使用方法的网页页面连接。
- 如论坛、贴吧、视频等……
- 当然你填上自己的QQ空间连接也是没有问题的……
- ★游戏版本号:
factorio_version
- 此处填写能使用此mod游戏版本号,如0.18
- mod依赖关系:
dependencies
〖5〗 - 默认为
base
,即官方基础包(官方的mod) - 如果你的mod使用了其它mod的物品、图片、音乐或任何东西,
- 请把依赖的mod名称填上,更建议把mod的版本号指定(也可不填版本号),
- 依据版本号,可向上兼容依赖关系,但不能向下兼容。
- 某些建议依赖,但不是必须的,可以在mod名称前加问号。
- 可填写多个依赖mod名称。
- 示例:
"dependencies": ["base"]
"dependencies": ["base >= 0.15"]
"dependencies": ["base >= 0.15.31"]
"dependencies": ["base >= 0.15", "artsCore >= 0.1.3"]
"dependencies": ["base", "? EvoGUI"]
"dependencies": ["btsCrazyBlood", "EvoGUI", "? Waterfill_v15 >= 0.1.2"]
mod内容
- 内容包括各种数据文件、脚本文件、配置文件、语言文件、图像文件、音乐文件、其它文件。
- ◇内容不是必须全部都有,可选择性添加
数据文件
- 数据文件均为lua格式 〖6〗
data.lua
data-updates.lua
data-final-fixes.lua
- 以及在以上三个文件中使用require引用的文件
- 以上三个文件内容格式并无差异,不同文件名只是加载顺序不同
脚本文件
- 脚本文件也是lua格式 〖7〗
control.lua
- 以及在文件中使用require引用的文件
配置文件
- 配置文件同样是lua格式 〖8〗
settings.lua
settings-updates.lua
settings-final-fixes.lua
- 以及在以上三个文件中使用require引用的文件
- 以上三个文件内容格式并无差异,不同文件名只是加载顺序不同
语言文件
- 语言文件是cfg格式 〖9〗
- 文件路径为
mod本体文件夹\locale\①\②.cfg
- ①填写语言缩写(如
en
、zh-CN
等等) - ②填写文件名称(可任意英文名称)
- ①填写语言缩写(如
- 语言文件必须存放到对应目录下才生效
- ◇语言文件格式为ini文件格式
- ini文件是一种常见的配置文件。它以简单的文字与简单的结构组成。
- ini文件在不同的使用方式上,可用不同的扩展名,如ini、cfg等。
- 而这里mod使用的,便是以cfg为扩展名
- ◆mod仅支持cfg扩展名的语言文件
图像文件
- 图像文件是png格式 〖10〗
*.png
- 填写文件名称(可任意名称)
- ◆mod仅支持png格式图片
音乐文件
- 音乐文件是ogg格式
*.ogg
- 填写文件名称(可任意名称)
- ◆mod仅支持ogg格式音频文件
其它文件
- 其它文件如txt、log、md等等……
- ◆此类文件非mod文件,仅作为说明、日志、协议等用途
- ◇并不建议添加此类文件
物品及建筑
知道了mod结构,现在来说一下游戏中的物品及建筑
- 游戏中的物品,可以分为三大类型:物体、实体、流体。
物体
- 物体可细分为两个小类型:非功能性物体(配方)和功能性物体(装备、插件、科技包等)。
非功能性物体
- 铁板、电路板、塑料、处理器、卫星等…
- 一个非功能性物体一般由两段代码组成:
- 物品属性
type = "item"
- 物品配方
type = "recipe"
- 物品属性
功能性物体
- 铁斧镐、手枪、速度插件、机器人、胶囊、固体燃料、夜视镜、火箭等…
- 一个功能性物体一般由三段代码组成:
- 物品属性
type = "item"
- 物品配方
type = "recipe"
- 物体功能
type = "mining-tool"
或"gun"
或"ammo"
或"armor"
等……
- 物品属性
实体
- 实体也可细分为两个小类型:非建筑物(资源、汽车、生物等)和建筑物(电线杆、混凝土、铁轨等)。
非建筑物
- 矿、水域、油井、树、汽车、坦克、火车、鱼、虫子、你(没错,就是你…)
- 矿、油等资源一般由三段代码组成:
- 物品属性
type = "item"
- 资源属性
type = "resource"
- 资源生成控制
type = "autoplace-control"
- 物品属性
建筑物
- 铁箱子、研究中心、机枪塔、蓄电器、雷达、炼油厂、管道、机械臂、发射井等…
- 一个建筑物一般由三段代码组成:属性、配方和实体
- 物品属性
type = "item"
- 物品配方
type = "recipe"
- 实体功能
type = "car"
或"fish"
或"player"
或"lab"
或"rocket"
或"pipe"
等……
- 物品属性
流体
- 各种能通过管道运输的液体、气体…
- 一般流体由两段代码组成:
- 流体属性
type = "fluid"
- 流体配方
type = "recipe"
- 流体属性
看到这里估计会有些人看得一脸蒙蔽…
不过没关系,看着下面的实例再回来这里复习,就会非常清晰了
实例一:大容量木质箱子
首先,需要做一个基础计划
- 我们用原版的“木制箱”代码,来修改出“大容量木质箱子”
- 箱子堆叠每组100个(原版50)
- 箱子容量为30(原版16)
- 箱子配方为:木板8个(原版4个)
- 箱子燃烧热值8MJ(原版4MJ)
计划完毕,然后开始制作了…
第一步:建立mod目录结构文件
- 新建一个文件夹,名称为
TeachsBigWoodChest_0.1.0
- 打开
TeachsBigWoodChest_0.1.0
文件夹 - 建立两个文件
info.json
data.lua
- 再建立两个文件夹
prototypes
locale
- 打开
prototypes
文件夹
- 打开
- 建立三个文件
entity.lua
标识
item.lua
标识
recipe.lua
- 返回上一层目录,再打开
locale
文件夹 - 建立文件夹
zh-CN
- 打开
zh-CN
文件夹 - 建立文件
locale.cfg
至此目录结构已经建立完毕
- 以下为结构树形目录展示
+TeachsBigWoodChest_0.1.0 |+locale ||+zh-CN |||-locale.cfg |+prototypes ||-entity.lua ||-item.lua ||-recipe.lua |-data.lua |-info.json
第二步:编写代码
info.json
{
"name": "TeachsBigwoodenchest",
"version": "0.1.0",
"title": "Teach's Big wooden chest",
"author": "aspd199",
"contact": "admin@art8620.com",
"homepage": "https://mods.factorio.com/mods/aspd199",
"description": "Create a Big wooden chest",
"factorio_version": "0.15",
"dependencies": ["base >= 0.15"]
}
◇注意json格式,非结尾行,行尾需要“逗号”,结尾行,行尾不需要“逗号”
data.lua
- 【6】
- 格式为
require("文件夹.文件名")
require("prototypes.entity")
require("prototypes.item")
require("prototypes.recipe")
- 例如本例三个文件路径为:
TeachsBigwoodenchest_0.1.0\prototypes\entity.lua TeachsBigwoodenchest_0.1.0\prototypes\item.lua TeachsBigwoodenchest_0.1.0\prototypes\recipe.lua
item.lua
data:extend({
{
type = "item", --类型为物品属性
name = "Big-wooden-chest", --物体内部名称〖11〗
icon = "__base__/graphics/icons/wooden-chest.png", --物体在背包显示的图标
flags = {"goes-to-quickbar"}, --物体标识〖12〗
fuel_category = "chemical", --燃料类型
--由于燃烧属于化学反应,因此这里类型填写 chemical
fuel_value = "8MJ", --燃料热值
--可在游戏中进行能量转化,如发电、汽车驱动等
subgroup = "storage", --物品分组〖13〗
order = "a[items]-a[Big-wooden-chest]", --物品在分组中排列顺序〖14〗
place_result = "Big-wooden-chest", --放置物(一般填物体内部名称)〖15〗
stack_size = 100 --每格堆叠数量
}
})
recipe.lua
data:extend({
{
type = "recipe", --类型为物品配方
name = "Big-wooden-chest", --配方内部名称,一般为物体内部名称〖11〗
ingredients = {{"wood", 8}}, --配方需求原料〖16〗(原料名称,数量,多种原料格式参考json)
result = "Big-wooden-chest" --成品物体内部名称
}
})
entity.lua
data:extend({
{
type = "container", --这里实体功能的类型为容器箱子
name = "Big-wooden-chest", --物体内部名称
icon = "__base__/graphics/icons/wooden-chest.png", --物体在背包显示的图标
flags = {"placeable-neutral", "player-creation"}, --物体标识〖12〗
minable = {mining_time = 1, result = "Big-wooden-chest"}, --拆除回收建筑物的时间和回收后的物体内部名称
--例如拆除箱子后回收得到的是木板,这里就可以写 result = "wood"
max_health = 100, --箱子血量
corpse = "small-remnants", --损坏后的残骸量
collision_box = {{-0.35, -0.35}, {0.35, 0.35}}, --建筑碰撞面积
--这里使用的是“平面直角坐标系统”,数值为第三象限x,y,和第一象限x,y,和第一象限x
--游戏中每一格位置在坐标系统中为0.5跨度,所以箱子占地一格,大小就是 0.5 x 0.5
fast_replaceable_group = "container", --快速替换分组
--相同实体功能类型的物品,能快速放置替换,而无需拆除后才能放置
selection_box = {{-0.5, -0.5}, {0.5, 0.5}}, --鼠标移到建筑上的选择框大小
inventory_size = 30, --箱子容量
open_sound = { filename = "__base__/sound/wooden-chest-open.ogg" }, --打开箱子的声音
close_sound = { filename = "__base__/sound/wooden-chest-close.ogg" }, --关闭箱子的声音
vehicle_impact_sound = { filename = "__base__/sound/car-wood-impact.ogg", volume = 1.0 }, --被汽车撞的声音
picture = --建筑图片素材
{
filename = "__base__/graphics/entity/wooden-chest/wooden-chest.png",
priority = "extra-high", --图片优先级
width = 46, --图片素材宽度
height = 33, --图片素材高度
shift = {0.25, 0.015625} --建筑图片素材在游戏中偏移量(这里数值为百分比)
},
circuit_wire_connection_point = --电路连接点
{
shadow = --红绿线阴影基于坐标系统中心原点偏移量
{
red = {0.734375, 0.453125},
green = {0.609375, 0.515625},
},
wire = --红绿线连接点基于坐标系统中心原点偏移量
{
red = {0.40625, 0.21875},
green = {0.40625, 0.375},
}
},
circuit_connector_sprites = get_circuit_connector_sprites({0.1875, 0.15625}, nil, 18), --电路连接器
--电路连接器基于坐标系统中心原点偏移量
--这里的 18 是电路连接器样式〖17〗
circuit_wire_max_distance = 9 --红绿线最大连接距离格数
}
})
locale.cfg
[entity-name]
Big-wooden-chest=大容量木质箱子
[mod-name]
TeachsBigwoodenchest=教程实例一:大容量木质箱子
[mod-description]
TeachsBigwoodenchest=创建一个大容量木质箱子
◆这里entity-name使用的是“物体内部名称”【11】
- 格式为:
[entity-name] 物体内部名称=物体显示名称
- 物体显示名称即游戏中能看到的名称…
- 汉化也是通过修改此字段以达到更改名称显示语言
- 如果换成其它国家文字则游戏中显示其它国家文字
◆而mod-name和moddescription使用的是“mod核心名称”【1】
- 格式为:
[mod-name] mod核心名称=mod显示名称 [mod-description] mod核心名称=mod描述介绍
第三步:打包
- 把整个
TeachsBigwoodenchest_0.1.0
文件夹打包成TeachsBigwoodenchest_0.1.0.zip
压缩包
- ◆注意打包时必须是把整个文件夹打包,而不只是文件夹里面的文件
- ◆打包压缩文件必须为zip格式
- ◇最后把mod压缩包放置到
%appdata%\factorio\mods
目录中
启动游戏测试效果!
完成!
实例二:增加小型电线杆连接距离及覆盖范围
点击查看:MOD制作教学 - 大范围小型电线杆
番外篇:如何汉化MOD
点击查看:MOD汉化教学