动画 · bei.pm

发布于 2015年11月19日·更新于 2025年02月13日·中文
此文本是通过OpenAI GPT-4o Mini 自动翻译的。

此页面所描述的文件格式基于对Dynamix, Inc.Sierra Entertainment知识产权的技术分析。
该知识产权现属于Activision Publishing, Inc. / Activision Blizzard, Inc.,目前由Microsoft Corp.持有。

这些信息是通过逆向工程数据分析收集的,目的是为了档案保存和与历史数据的互操作性。
没有使用任何专有或机密的规格。

该游戏目前可以在gog.com上以下载形式购买。

现在我们来到了Outpost 2数据格式中最高级别的学科:
动画。

动画列表以一个全球头部开始,该头部主要用于数据验证。 随后是具体的动画定义,这些定义分为3个层次:

  1. 动画
    动画是最高级别的实例;它表示单位、建筑或“粒子动画”(陨石撞击、天气、爆炸)在特定起始状态下的动画。

  2. 帧是动画中的单个图像。一段动画可以包含一个或多个帧。
  3. 子帧
    子帧是关于在帧的特定位置以特定条件绘制特定位图的信息。一个帧可以包含一个或多个子帧。

接下来是各个动画定义。

地址 x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF 字符
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
偏移量 数据类型 名称 解释
0x0000 uint(32) 动画数量

有多少个动画数据集

0x0004 uint(32) 帧数

总共有多少帧应该存在

0x0008 uint(32) 子帧数量

应该总共有多少个子帧

0x000c uint(32) 可选条目的数量

目前有多少个 "可选项"

动画

地址 x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF 字符
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
0x0010 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
0x0020 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
偏移量 数据类型 名称 解释
0x0000 uint(32) 未知 1

未知信息

0x0004 uint(32) 边界框:左侧

给出边界框的左侧起始位置(以像素为单位)。

0x0008 uint(32) 边界框:上方

指定边界框的上部起始位置(以像素为单位)。

0x000c uint(32) 边界框:宽度

指定边界框的宽度(以像素为单位)。

0x0010 uint(32) 边界框:高度

指定 边界框 的高度(以像素为单位)。

0x0014 uint(32) 偏移量:X

指定动画的水平中心点

0x0018 uint(32) 偏移量:Y

指定动画的垂直中心点

0x001c uint(32) 未知 2

未知信息

0x0020 uint(32) 帧数

指明此动画中包含多少个动画帧

0x0024 uint(32) 窗口数量

指明在绘制时应使用多少个窗口

最高层的数据,即动画,主要是管理数据 - 边界框 指的是在选择车辆/建筑物时标记的坐标,并同时指明哪个区域可以点击。

偏移量主要确定“零点”;即需要在游戏内部坐标上进行加或减的点。可以更加数学地说:这里的偏移量指定了坐标原点。

窗口与偏移量一样,每个窗口都有4个 uint(32) 值,表示可用于单个子帧的区域。除非位图特别指定,否则不应在窗口外绘制。

框架

地址 x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF 字符
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
偏移量 数据类型 名称 解释
0x0000 uint(8) 子框架数量和可选项 1, 2 的切换

该值包含:

  • 0x7F(位掩码):在此帧中使用的子帧数量
  • 0x80:有关可选项1和2是否存在的信息
0x0001 uint(8) 未知 1 和 可选 3, 4 的切换

此值包含:

  • 0x7F(位掩码):未知 - 我强烈怀疑这表示在下一个帧显示之前经过的游戏时钟数量
  • 0x80: 关于可选 3 和 4 是否存在的信息
0x0002 uint(8) 可选 1

未知

0x0003 uint(8) 可选 2

未知

0x0004 uint(8) 可选 3

未知

0x0005 uint(8) 可选 4

未知

副框架

地址 x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF 字符
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
偏移量 数据类型 名称 解释
0x0000 uint(16) 位图ID

指定要为此子框架使用的位图

0x0002 uint(8) 未知 1

尚不清楚 - 不过我强烈怀疑这与渲染优先级(Z层)有关。

0x0003 uint(8) 子框架ID

指明我们当前处于哪个子框架

0x0004 sint(16) 偏移 - 水平

指明子框架在框架内的位置,或者位图应水平移动多少像素

0x0006 sint(16) 偏移 - 垂直

指定子框架在框架内的位置,或者位图应垂直移动多少像素

这样我们就可以将单个帧以及完整的动画进行组合,下面以索引 500 的复杂动画为例进行演示。

动画 500

动画500展示了如何卸载一辆装载普通矿石的普利茅斯运输车。这是少数利用窗口功能的动画之一。

因此,完整的动画可以组合在一起。
遗憾的是,上方的装载舱门仍然存在问题,因为在图形类型信息中没有设置相应的位。

这里还有一些游戏中的其他美丽动画精灵:

动画500的渲染示例

动画500已完全组合

普利茅斯建筑工厂

伊甸空间港

伊甸医疗中心

SCAT

普利茅斯空间港

彩蛋:
圣诞老人

彩蛋:
丹的狗