跳转到内容

可视化编辑器

这些源表可以用 Elin ModMaker 在浏览器里编辑。同一个角色的贴图、立绘、台词、剧情与各语言译文会聚合到一处,种族、职业、元素这类跨表引用带补全与校验。

纹理替换与瓦片贴图

地图瓦片(方块、地板、物件、装饰、格子效果)都画在几张大的精灵表上。每张表被切成大小相同的格子,源表行只记录要画哪一格tiles 列)。把自己的美术放进游戏有两条路:

方式目录适用场景
纹理替换(Texture Replace)Texture Replace/<表>_<槽位>.png重画一个已经存在的格子:vanilla 美术,或物品/NPC 精灵。
瓦片贴图(Tile Textures)Texture/<表名>/<alias>.png新增的 Block / Floor / Obj / Deco / CellEffect 行配图。游戏在启动时替你找一个空格。

新增的行不要用纹理替换

槽位号只是一个数字。两个 mod 选了同一个槽位会互相覆盖而且没有任何提示;游戏更新一旦用上那个格子,两个 mod 一起被盖掉。新增的行一律用下面的 Texture/<表名>/ 目录。

纹理替换

文件放进 mod 的 Texture Replace 目录,命名为 <表>_<槽位>.png(扩展名小写 .png)。

精灵表格子尺寸谁在用
blockblockSnow64×64Block 行(墙、方块、屋顶、柱子)
floorfloorSnow64×48Floor 行
objobjSnow64×64_idRenderDataobj 的 Obj 行
objSobjSSnow32×32obj_S / obj_S flat 的 Obj 行(小型植物、作物、杂草)
objLobjLSnow80×64obj_L / obj_LV 的 Obj 行(树、高大物件)
objCobjCLobjCLL使用槽位式 _idRenderData 的 Thing / Chara 精灵(见 Thing
  • 槽位号行 * 100 + 列,从精灵表左上角那一格起算。它就是行的 tiles 列里的数字,也是纹理查看器(Esc → 工具 → 纹理查看器)显示的数字。
  • 图片尺寸:格子尺寸的任意整数倍。更大的图从该槽位的左上角开始,向右、向盖住相邻格子。
  • ...Snow 表是独立的。重画 block_1234.png 时也要重画 blockSnow_1234.png
  • 游戏运行中文件会自动重载,不用重启就能调整。

给新增行配贴图

给行填上 aliastiles 列留空(或保持默认的 0),把 PNG 放到 Texture/<表名>/<alias>.png

txt
Mod_MyTiles/
  package.xml
  LangMod/EN/mytiles.xlsx          ← sheet 名为 Block / Floor / Obj / Material ...
  Texture/
    Block/
      mymod_wall.png               ← 64×256:墙 + 3 行柱子(见"墙与栅栏")
      mymod_wall_snow.png          ← 可选的雪季版本,尺寸相同
    Floor/
      mymod_floor.png              ← 64×48
    Obj/
      mymod_statue.png             ← 64×64
      mymod_path.png               ← 1024×48:16 种自动拼接边缘形状(floor_obj)
      mymod_wheat.png              ← 448×64:7 帧生长阶段
  • <表名>BlockFloorObjDecoCellEffect。目录名和文件名不区分大小写。
  • 文件名必须等于行的 alias。旁边再放一个 <alias>_snow.png 就是雪季版本。
  • 图片必须是该行格子尺寸的整数倍(见上表;由行的 _idRenderData 决定,例如 obj_S flat → 32×32,obj_LV → 80×64)。最宽 99 格,最高 4 格。
  • 启动时游戏在精灵表里挑一块空位,把你的图贴进去,再把格子号填进 tiles。空位不会用完:精灵表满了游戏会把它加大。Texture Replace 文件占用的格子永远不会被分出去。

格子号不会存进存档

格子每次启动重新分配。存档只记你的行 id,所以装卸其他 mod 永远不会弄坏地图。不要自己往 tiles 里填格子号。

格子里画什么

Elin 是 2:1 等距视角,格子从来不是"整格填满":每类瓦片都有自己的形状和锚点,画成一个方块的结果就是又大又方、一半陷进地面。最省事的办法是把同类的 vanilla 格子当模板(Esc → 工具 → 纹理查看器)照着重画。下面的数字实测自 vanilla 精灵表,像素行从格子顶部数起:

贴地范围是一个 60×30 的菱形。 相邻瓦片横向相距 30 像素、纵向相距 15 像素,所以只有这个菱形能无缝平铺。每往下一行,形状必须正好宽 4 像素或窄 4 像素。斜率不对的菱形(比如 62×34)画得再大,相邻瓦片之间也会露出一条条斜向的地面。

贴地物件:只外扩朝后的两条边

前方那一格的地板永远盖在你的瓦片上面,所以朝前两条边(左下、右下)最外侧的几个像素不管怎么画都会被盖住;精细图案不要放在那里。朝后的两条边(左上、右上)不会被任何东西盖住,路面、田地下面的草就是从这里的接缝露出来的。

想让贴地物件和相邻的同类瓦片连成一片,就只在朝后的边上、且那一侧还有同一种瓦片时,把这条边向外扩约 5 像素;其余的边一律停在菱形边界上。四条边全部外扩只会把轮廓弄坏,看上去反而像瓦片没有拼接在一起。两处外扩在顶角处要分开:每条边只向它正对的那一格延伸,绝不要伸进斜后方那一格。

地毯要做成地板,不是物件

贴地物件盖不住它下面的草:每一格的地板都画在它后方各格物件的前面,而草叶会伸进后方那一格很远,落在地毯的中间而不只是边缘。vanilla 的地毯全是 Floor 行;vanilla 的 autotile 物件都是路、苔藓和栏杆,边缘毛糙反而显得自然。凡是要读作「一整片覆盖物」的东西都写进 Floor 表,autotile 物件留给路面。

格子画在哪里
地板 Floor 64×48,以及 floor_obj 的平铺物件以 (32, 25) 为中心的 60×30 菱形,即第 10–40 行。vanilla 地板画成「贴地范围 + 朝前两条边各多约 5 像素」,朝后的两条边不越界。厚板类地板会把顶面画低几行、下面再加一圈厚度,那是美术风格,不是硬性要求。
实心块 64×64(_idRenderData 留空)填满整格的等距立方体:顶面菱形加两个可见侧面。
薄墙 block_thin 64×64墙是立在菱形左后边上的一块斜板,只用格子左侧 38 px(x 0–37,第 1–62 行),右侧留空。另一个方向由游戏自动镜像,所以只画一个方向。四行从上到下:墙 / 矮墙(第 16 行起)/ 转角柱(x 25–39,第 12 行起)/ 矮转角柱(第 28 行起)。
物件 obj 64×64底部贴地、左右居中:脚点靠近格子底部(vanilla 多在第 57–63 行)。铺在地上的平面物件(路面、苔藓、落叶)不该用 obj:请用 floor_obj,它位于地板精灵表(64×48)、几何和地板完全一样,vanilla 的苔藓和花田就是这么做的。地毯则应该写进 Floor 表,见上面的提示。
小物件 obj_S flat 32×32底部贴地(第 27–30 行)、左右居中;作物和杂草用它。
高物件 obj_LV 80×64 × 2 行整棵树以两格的交界为中心:树干底部落在下格的上半部分(vanilla 帕鲁鲁树:第 0–28 行,下面 36 行留空),树冠在上格的下半部分(第 27–63 行)。收获帧(果实)也画在下格的同一位置。

一格一帧:条带

比一格更宽的 PNG 就是条带:每一格是一帧。帧的含义取决于行:

帧的含义
普通行变体。游戏按朝向选一帧,和 vanilla 里 tiles 写多个值的行一样。
anime 列的行(Floor、Deco、CellEffect)动画帧。anime = 帧数,毫秒[,循环[,音效]]
tagautotile 的 Obj路面/田地的 16 种边缘形状。帧号 = 没有同类邻居的各侧之和:后 1、右 2、前 4、左 8。第 0 帧是四面都有邻居的内部块,第 15 帧是孤立块。对应到屏幕:左是左上边、后是右上边、右是右下边、前是左下边。贴地物件请把 _idRenderData 填成 floor_obj(帧为 64×48);地毯则写进 Floor 表。
CellEffect8 帧;液体动画用第 5 到第 8 帧。
_growth 的 Obj生长阶段,见下文。

Obj 行的 anime 列不起作用,不要用。

墙与栅栏:下方多几行

_tileType 为墙或栅栏类型的 Block 由上下叠放的四格画出来:墙本身、低墙(压低墙壁视角时显示)、转角柱低墙转角柱。图要做成 4 格高,从上到下按这个顺序。栅栏至少要有墙和柱子两行。

高大物件:上方多一行

obj_LV 绘制的物件(树和其他高大物件)会多用基格上方的一格。图做成 2 行高:树干在下行(底部落在下格的上半部分),树冠在上行,见上文「格子里画什么」。

生长条带(作物、树、杂草)

_growth 列的行(_growth = 类型,阶段帧,收获帧,收获物,最大数量)用条带存放生长阶段。阶段帧收获帧 填的是你条带里的帧号,从 0 数起。

_growth 类型阶段帧数收获帧示例 _growth
CropBerryPlantFlowerSunFlowerHerb4(第一阶段用游戏自带的嫩芽图)可选,1 帧Crop,0,4,carrot,2 → 5 帧
RoseCactusChaPastureSeaweed5可选Rose,0,5,flower,1 → 6 帧
Kinoko4无(写 0Kinoko,0,0,#mushroom
WheatRice5必填,2 帧:结穗,然后是收割后Wheat,0,5,wheat,2 → 7 帧
TreeTreeFeywood5(前两个阶段共用第 0 帧),2 行高可选,叠在树干上Tree,0,5,apple,3 → 6 帧 × 2 行
Weed5 帧;第 3 帧是菜单里显示的那张Weed,0
DecoTreeCoralwood帧是变体,没有阶段Deco,0
  • 收获物 是你收到的东西(物品 id,或 #分类 表示该分类的随机物品);最大数量 是一次最多能收多少。
  • 菜单图标自动挑选:树用第 2 帧,其他植物有收获帧就用收获帧,否则用成熟阶段。
  • 树需要 _idRenderData = obj_LV_tileType = TreevalType = Growth;小型作物和杂草用 obj_S flat
  • 条带太短只会让缺的阶段留白,绝不会画到别的 mod 的格子上。

作物还需要哪些列,见瓦片表

瓦片被雪覆盖时,雪季美术叠在正常美术之上,所以没有 _snow.png 的瓦片冬天只是保持原样。

  • Block:想要雪景版本就加 <alias>_snow.png(尺寸相同,含柱子行)。
  • Floor:下雪时户外地板会整体换成雪地,除非行的 tag 里有 noSnow_snow.png 只对仍然显示的地板有意义。
  • Obj:物件冬天外观不变,可以不做雪图。snowTile > 0 的 Obj 行会反过来被雪盖住不显示。

边玩边改

瓦片 PNG 和其他替换一样,文件一变就重载。游戏运行中不要改图片尺寸:空位是启动时预留的,更大的文件会溢出到旁边的格子,直到你重启。

This project is an unofficial documentation site and is not affiliated with, endorsed by, or associated with Elin or Lafrontier / Noa. All trademarks are the property of their respective owners.