跳转到内容

Trainz/AM&C/数据模型

来自 Wikibooks,开放世界的开放书籍
logo
Trainz 资产维护和创建

Trainz 基础知识库
TOC | 开始乐趣 | AM&C | 创建 | 书内参考 ORP 参考:  • 索引 • 容器 • 种类 • 标签 | 附录  • 版本
 词汇表
 HKeys-CM
 HKeys-DVR
 HKeys-SUR
 HKeys-WIN
 鼠标使用
 符号
[e]
KIND(类型资产组)
容器



Trainz 数据模型

[编辑 | 编辑源代码]

据说,如果你要四处搬运数字比特,你需要一个 容器,一个带把手的水桶,你可以抓住它四处移动并在其功能范围内执行操作。在 Trainz 中,在 Windows 操作系统下编写的那个水桶是数据文件夹或目录,所有 Trainz 版本都将其转换为一组以树形层次结构排列的文件夹。
早期的 Trainz 版本建立了相对于游戏根文件夹路径的文件夹层次结构,该层次结构相对严格。某些类型的资产被要求将数据放在特定位置,以便该资产能够正常工作。好消息是该路径的开头没有强制(规定),因此,与其将数据隐藏在 Microsoft 定义的某个模式中的三到四层深处,不如将其放在主硬盘的根目录或其他硬盘中[注 1],与许多软件安装不同,用户可以而且仍然可以为每个安装选择她喜欢的文件夹名称,在任何她认为合适的根路径中。

配置,Trainz 实用程序管理器

[编辑 | 编辑源代码]

在所有 Trainz 版本中,资产文件夹中的老大是资产的 config.txt 文件。在该文件中,每一行(原文如此)包含数据对,一个“关键字”和一个配对的“”。合法格式的标签(关键字)和容器名称从左边缘开始。在一个容器中,该容器由一对花括号隔开

keyword-containername  {
       indented words and container guts
 }

后面的与匹配的闭合花括号需要平衡。惯例是在第一个字母下面并与关键字的第一个字母对齐。鉴于一些容器可以包含数百行,你一定会想知道我们如何还能说“每一行(原文如此)包含数据对,一个“关键字”和一个配对的“”。答案既是程序性的,也是概念性的;它是程序性的,关键字是一个容器名称,它将控制权传递给一个处理子例程。这些处理程序知道将与该类型容器中合法关键字相关联的数据放在哪里,以及如何找到下一个非空格字符,该字符将被评估为标签、值或括号,然后根据需要重复,直到找到一个与第一个(打开)花括号后面的花括号配对的闭合括号。只要每个关键字、内部括号(是的,马蒂尔达,有带子容器的容器,也有带可变数量子容器的容器。谢谢你的提问!)都是空格分隔的,并且在“可预期上下文中”是合法的,大型长 队列容器 的所有子容器仍然只是第二个标准的一部分——标签的值。在这种情况下,处于控制状态的标签有子项,这些子项又有子项,它们的每一行仍然只是一个标签,一个值。(只要稍微转动一下你的大脑,你很快就会习惯它。别管它——那个客运车站的子容器中包含超过 120 行文本——在容器数学中,它只是一个简单值。 <g> 只要不要在里面打错字……如果你这样做,你很可能收到不止一条错误消息!)

从最简单的意义上讲,所有 Trainz 数据都以文本文件数据行上的一对方式组织,一个关键字告诉软件如何处理随后的数据。


Trainz 中的每个部分都可以从游戏中加载,从纹理中发现的少量配置数据(颜色和照明资源)到最大的路线(布局或地图),都必须有一个 config.txt 文件。Trainz 的环境在计算机内部,因此毫无疑问,这些文件会引用和列出其他文件。
  1. 你可能知道、怀疑或听说过 Trainz 使用各种图像文件来纹理化物体。这些文件具有不同的强度、功能和尺寸影响,但它们是成熟的类型;除了最新的 TANE 后类型之外,从 DLS 下载的 500,000 多个资产中有 99.99% 依赖于.JPG 文件.TGA 文件和 Windows 自带的.BMP 文件的组合,如今,这些都是常见的文件类型。在这些文件中,TGA 格式是为图形艺术和电视的商业应用而发明的,可能最不为人所知——并且最难找到图形编辑器来处理。绝大多数 Trainz 纹理将使用 .tga 文件来定义资产。
    曾经因为数字游戏的流行需要掩蔽/透明度 Alpha 通道或它们功能背后的图层来与其他投影图像混合。
  2. 有一些文件带有“如何”应用纹理——这些文件带有后缀:.texture.txt


所有配置文件可能包含“任何”关键字和容器,其含义和合法数据类型在 枚举TBS 中列出,但大多数可以合法跳过,取决于枚举的 种类 是否需要该标记值对,但更多是因为大多数 TBS 标记更适合人类方便,而不是任何模块的渲染。有一些标记具有至关重要的作用。


  • 至少所有配置文件都包含一个数据库资产索引/唯一标识符
     • kuid 的行对——KUID,
     • KIND 行(kind——TBS
     • 以及一种或另一种(外部文件)引用标记值对。


在给定的最小行情况下,资产默认为原始 TBV 1.3 资产技术标准,并且外部引用将是资产文件名标记——从 TRS2004 开始过时的标记,会在 Trainz Classics(TBV 2.7)中触发警告,并在 V2.9(TS2009-SP0,2008 年秋季)以上触发错误消息。这种“旧标记消除”强制首次在 V2.7/TCC 版本中出现,其中引擎规范、蒸汽、电力和柴油机中允许的标记和容器列表发生了重大变化。


前一段中有一些重要的教训

  1. Trainz 数据模型是一个移动目标。
  2. 在任何给定时代(版本)中,它的确切含义取决于以前的做法,以及对先前版本技术和实践添加的新功能、关键字、约束、要求或方法的修改。
  3. 有很多标记仅仅是为了人类方便,比如作者、组织、电子邮件和国际化数据(语言翻译),我们将其描述为“-XX”变体,比如“description-es”或“username-ru”。这些会影响排序或显示的信息,从而为其他用户提供便利,但不是强制性的值。


这对初学者来说是个好消息——这意味着许多配置文件标记及其行可以忽略。坏消息是,诀窍当然是要知道哪些以及为什么,以及哪些组合和数据排列在一起是非法的。这是 KIND 的工作——在这里,我们会在认为合适的时候链接 KIND。

1999 年的数据安排

[edit | edit source]
学习旧的数据实践是必要的。在获取内容方面有任何重大经验的情况下,都会有一些情况,某些东西根本无法被该版本的 内容管理器 接受。关于 Trainz 社区中常见的这些情况的误称是将这些错误称为故障、有故障的内容、修复故障、错误消息。更准确的术语应该是过时的、过时的、更新的、现代化的(过时的)和重新配置的。DLS 上有一些真正的错误资产,但随着 DLS 清理项目的进行,这些资产正在迅速消失,曾经很长的列表现在正在减少。


  • Trainz 数据的第一条规则是有一个配置文件。
  • 第二条规则是所有网格和所有与网格相关的 texture.txt 文件必须位于同一个文件夹或子文件夹中。
  • 纹理分为两个部分:texture.txt 文件中的有关纹理的说明以及第一个明确引用的实际图像文件。
  • 编辑资产时的一个重要经验法则是:如果在运行 PEVtool Images2TGA 后,仍然存在任何 .texture 文件,请再次运行它以确保,然后在 提交 资产之前删除 .texture 文件。


在最古老的做法中,一个始终需要生成资产中的网格的引用标记是“asset-filename”,根据种类值,它引用的是图像文件(纹理,两种类型)或网格文件(一个简单的物体骨架)。除了这两个构建块类型之外,甚至不需要资产的名称。然而,更复杂的种类需要更多定义

  1. Trainz 是一个国际产品这一事实要求国际化能力,这些能力很容易识别,因为它们都在基本标记“username”、“description”和后面加上连字符和两个字母的语言代码
  2. 在运行时菜单中可显示的物体需要图像,该标准模仿了商业 3ds Max 生成的建模世界中的做法,并将一个子文件夹合并进来以包含这样的asset-filename 加上
  3. 各种高级物体需要比将其他网格放在子文件夹中更灵活的数据连接性。
    1. 在第一个网格消耗了 asset-filename 槽位之后,如何指定辅助网格?事实上,asset-filename 被设想并实现为几个标准子文件夹的后缀
      1. 主网格       在火车车厢中,主要的(或组织)网格可以被视为底盘和结构框架。这很少可见,[注释 2]

}} 但类比是合理的,因为所有组织部件连接成一个整体的连接点都在资产的(asset-filename)根文件夹中。

      1. _body       以“_body”为后缀的文件夹被指定为保存主子网格。
    1. 主动画消耗了一个标记名称,阴影网格消耗了另一个标记名称。这种初始技术仍然会经常出现在新 Trainz 用户检查机车车辆时,即使子子文件夹也被用来保存子子网格,比如门和舱口,它们会随着动画一起打开和关闭,而这些动画显然不是主车动画网格集。
    2. 类似地,投射阴影的物体有一个用于阴影网格的子文件夹,最常见的名字是“shadow.im”。嗯,有创意,这些澳洲人!


 

模型中的 KIND

[edit | edit source]

Trainz 数字对象没有单一的数据模型,而是一系列广泛的资产要求,这些要求随着模型各部分种类繁多的变化而逐渐增长,从而导致一组数据,这些数据对内在变化和时间给予了不同的重视。请记住,最初的 Trainz 0.9 CDROM“Beta”版本是在 Y2K 运行之前发布的,当时有些人认为计算机世界即将崩溃,并将地球再次推回石器时代。啊,哈哈。虽然这变得很有趣,但正是那些令人担忧的日子,Auran 向世界各地众多业余爱好者群体发行了 Beta 版本以供评估。从本质上讲,该版本定义模型数据集的方式至今仍然存在。它经历了伸缩和蜕皮,进行了理发,偶尔还被晒黑,但核心...仍然稳定并且在添加的一些不同数据结构中可以识别,从而为功能、容量或灵活性带来更多便利。这些关键的改进功能以及 Trainz 社区在保持很大程度的向后兼容性的同时提出的驱动性要求,是许多用户尽管偶尔会对该产品感到厌烦的原因。

正在建设的定义

[edit | edit source]

早期的 Trainz 是一个实验,旨在探索是否存在市场利基。因此,虽然游戏公司 Auran 的设计师和软件工程师认为会存在这样一个市场,但没有人确定。结果证明,他们做了尽职调查,进行了研究,联系了许多铁路爱好者群体,并为他们在专有的 JET I 游戏引擎中建模需求制定了一个相当不错的规范。支持这一说法的证据是,自 Trainz 1.0 进入研究阶段至今已有二十多年,控制和选项、软件在测量员模块中的运行方式经历了最少的演变。

过时的标记

[edit | edit source]
大多数这些标记始于 原始 Trainz 版本
以下“标记列表”是“事实上的”,因为它们的“使用约定”先于上面列出的 TBS 标记的正式汇编,但不是使用它们的规范,实际上,也先于“TrainzBaseSpec”一词的创造(在 2008-2009 年的 TrainzOnline Wiki 中引入),或其在 N3V Wiki 页面 11:32, 2009 年 5 月 12 日的正式定义[1]



编辑注: 这些“TrainzBaseSpec 标记”在某些情况下实际上在 TB V2.7 中过时,并且在所有情况下,在 TS2009-SP0 之后以及它之后的N3V Games 版本中都过时 (尽管许多用户发现其中一些标记很有用,但这会给内容创建者带来时间损失,也不适合在 预处理操作 中忽略那些不再有用的标记),如果打开资产进行编辑并通过将 trainz-build 标记 提高到 V2.9 及更高版本 数据模型 来部分升级,就会产生错误(错误消息)。相反,通过将 TB 值保持在足够低的水平,可以无需删除这些标记(至少在 TS12 之前是如此)。
  • 资产可以本地升级到 V2.8 及之前版本,并且通常可以正常工作,即使在经历了几代数据模型元素的改进之后也是如此。通过这种方式,许多资产可以与 TRS2004 或 TRS2006 数据模型一起使用,同时又与 TS 版本的处理和渲染兼容。经验表明,在 trainz-build 2.6 (TRS2006-SP1) 中制作的没有警告和错误的旧资产通常可以在 TS09-TS12 中正常工作,无需进一步更改。例外情况是 TS09 解析中引入的程序员错误,直到 TS12 恢复了先前的现状才被修正:这些版本中的单轨桥梁和隧道需要第二个(且不正确)参数来进行轨道偏移和轨道方向参数,以及引擎规范。
  • 例如,大多数 TRS 时代之前的模型数据资产(v1.0–v2.3)可以通过在 TS 版本中添加一个网格表来正常工作,以取代 TS 中忽略的“资产文件名”带来的效果。
  • 相反,通常情况下,带有 TB 版本 v2.9 及更高版本的 TS 版本资产可以通过了解这些标签的一些效果和用法,以及一些谨慎的修改来消除 texture.txt 修饰符行(例如,AlphaHint 需要注释掉等),从而使其与早期数据模型兼容。


  • asset-namenamename-XX - V1.3–v2.8 - 在历史上几乎所有场景、脊椎和路边资产中都能找到。在 Trainz 1.x--TRS2004 Trainz 时代,Asset-name 是资产在 Trainz 中的主要文件夹名称;在今天这样的资产中,通常会发现 asset-name 也用于那个早期 Trainz 时代的子文件夹系统,在火车车厢资产中会形成子文件夹名称“asset-name_art”、“asset-name_body”、“asset-name_shadow”,以及其他类型的其他子文件夹。

 

  • 'name' 和 'name-XX' 是较长的标签 usernameusername-XX 的早期形式,XX 代表非英语语言翻译的英语“name tag”(或现在的“username”标签)的 ISO 双字母后缀;“XX”的形式与 description-XX 一样,是“本地化”支持其他语言的友好值的一部分。
  • 如果存在,请在最古老的 Trainz 时代(v1.0-v2.4)资产中用 username 和 username-XX 替换,或者删除。
注意:用户名(英语)是 DLS 上的官方资产名称,不应该使用外语;它也取代并替换了“资产文件名”。

根据惯例,子文件夹名称将以用户名/资产名称字段开头,并使用_art、_body 和_shadow 作为正常命名约定的一部分。这可能是 3ds Maxgmax 的约定,它被延续到 Trainz 中,而 Trainz 与该图形开发软件有着历史联系。(Gmax 与 Trainz 版本 V0.9—v2.4 捆绑在一起)


 

  • category-era-nn — V1.3–v2.8 s.a. {tag: category-era-0, category-era-1, category-era-2, ...} —一个带有数字后缀的旧日期系统,在历史上几乎所有具有日期的资产中都有出现,直到 Trainz-build 2.4 引入了当前的 category-era 字符串数组将这些标签组合到一行中。虽然在 Surveyor 中无法直接访问,但在 TR06 和 CMP 之后,可以定义一个过滤器来选择一个日期范围,并使用该过滤器以及区域和类型在 Surveyor 中验证在 Surveyor 的放置和选择工具中可列出的资产。在 TS09 及其之后的版本中已弃用,TS09 使用更短的 category-era 字符串数组,在一行中而不是使用多个带有 “-nn” 后缀的标签-值对。
  • 字符串数组中的空格会导致错误;所有值必须以“s”结尾,并且必须包含四个数字,例如 1880s;1950s;2010s(这可能完全适合某些类型的女性服装,这些服装会流行起来,然后又会过时!)。目前无法定义范围,但用户社区已经提出了要求。
  • 用字符串数组类型的 category-era 标签 替换,标签中没有空格,日期代码之间用分号隔开;这些日期代码以完整的四位数年代数字加上“s”(小写 s)后缀的形式给出。

 

  • 类型 category-region-nn — V1.3–v2.8 — 在历史上几乎所有具有地理位置的资产中都有出现。这些标签已经被 category-region 标签中的由两个字母组成的枚举 ISO 国家代码的字符串数组 所取代。
  • 用字符串数组类型的 category-region 替换,标签中没有空格,两个字符的国家代码之间用分号隔开,这些代码在引用的标签部分中列出;这些代码以完整的两个大写字母组成,这些字母构成 枚举 代码,代码之间用“;”分隔符隔开,但在最后一个代码之前不使用分隔符,直接接在结束引号之前。
  • 字符串数组中的任何 空格(包括结尾引号之前的空格)都会导致读取错误和错误消息。

 

  • region — 在 TBS V1.3–v2.8 中作为一个内置过滤器和地图资产自定义本地化标识符(kuid)有效;现在,该标签唯一合法的用法是在 kind map(布局)资产中。

 

作为一种以前的过滤器修饰符,该标签在历史上几乎所有旧资产中都有出现,但它尤其在机车车辆、场景、样条资产、轨道类型(包括隧道和桥梁)以及具有一定程度本地化的路边资产中很常见。
  • 地图资产仍然保留关键字 Region,该关键字是在地图配置中定义的,具有相反的用法,它被定义为 kind region kuid 引用。因此,Region 在 Maps 中是必需的,并且自 TRS2012 以来,与标签类型一样,它在以前出现该标签的大量资产中是非法的。
  • 在 TRS2009 之后,所有将 region 标签指定为文本字符串的用法都已过时,因为在程序员看来,他们用 Pick List 取代了 Surveyor 工具中对“类型和区域”字符串值的粗略过滤分组选择器。这两个标签都具有一定的优缺点,而且这两个标签都可以追溯到 Trainz 0.9 Beta 版本。

  • type — V1.3–v2.8 — 一个以前的过滤器修饰符,在历史上几乎所有资产中都有出现,但尤其在机车车辆、场景、样条、轨道类型(包括隧道和桥梁)以及路边资产中很常见。Type 在 Trainz 0.9—TC3 版本中被用作 Surveyor 中的过滤器,它与 region 结合使用,可以显示资产分组,而不是被放置工具选择列表的全部列表所淹没。这两个标签都默认设置为“全部”,从而显示与 TS09 及其之后的版本中的工具所显示的相同的大列表。
  • 在 TRS2006 的衍生版本(即 TC3)之后,所有 type 标签都已过时,因为在程序员看来,他们用 TS09 Pick List 取代了 Surveyor 工具中“类型和区域”的粗略过滤分组选择器。

config.txt 文件中的区域标签

[edit | edit source]

区域标签,作为 Surveyor 中快速按分组标签过滤的一种实现方式,是 Trainz 的一部分,在 TS2009 及其之后的 Trainz 版本中不再是可接受的标签,除非是 kind map 资产(在那里它们仍然是 KUID 引用,而不是过滤器[note 3])。category-region 标签 由两个字母代码指定,仍然用于帮助 CM 和 Surveyor 模块进行排序。

现在,region 关键字的使用范围仅限于 kind map 配置文件,在那里它们被指定为对预定义的“食谱”区域设置的 KUID,这些设置会设置各种地理和时代特定的标准,例如在道路上自动生成的 Trainz Carz 列表,决定这些自动生成的 Trainz Carz 的密度和频率的车流量值,基础海拔高度,纬度,经度坐标以及其他可以合理地捆绑在一起的区域变量;这些关键字及其用途一直很稳定,在历史上和更新的 TS2009-TS2012+TANE 数据模型 中都一直使用。给路线赋予不同感觉的最快方法之一是指定另一个 kind region KUID,这样太阳角度就会发生变化,季节外观也会发生变化,地图上的汽车也会发生变化等等。



参考资料

[edit | edit source]
  1. Christoph Bergman,N3V Games 首席程序员,又名“Windwalkr”,KIND TrainzBaseSpec 历史 页面。


华夏公益教科书