游客你好,登录后能编辑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汉化教学
 
                












 沪公网安备 31011002002714 号
                    沪公网安备 31011002002714 号