表 Table
在SQLite数据库中,Civ6的游戏数据是以条目 Object的形式存放在各种表 Table中,每个条目的信息都存储在条目的属性 Property里,不同的表对表内条目的属性提出了不同的要求。
在Civ6的Assets/GamePlay/Data/Schema/01_GameplaySchema.sql
文件中定义了游戏的数据库的各种表,包括有建筑、文明、科技等等,这张表在制作Mod的时候需要经常查询。
以科技为例:
CREATE TABLE "Technologies" (
"TechnologyType" TEXT NOT NULL,
"Name" TEXT NOT NULL,
"Cost" INTEGER NOT NULL,
"Repeatable" BOOLEAN NOT NULL CHECK (Repeatable IN (0,1)) DEFAULT 0,
"EmbarkUnitType" TEXT,
"EmbarkAll" BOOLEAN NOT NULL CHECK (EmbarkAll IN (0,1)) DEFAULT 0,
"Description" TEXT,
"EraType" TEXT NOT NULL,
"Critical" BOOLEAN NOT NULL CHECK (Critical IN (0,1)) DEFAULT 0,
"BarbarianFree" BOOLEAN NOT NULL CHECK (BarbarianFree IN (0,1)) DEFAULT 0,
"UITreeRow" INTEGER DEFAULT 0,
"AdvisorType" TEXT,
PRIMARY KEY(TechnologyType),
FOREIGN KEY (EraType) REFERENCES Eras(EraType) ON DELETE SET DEFAULT ON UPDATE SET DEFAULT,
FOREIGN KEY (EmbarkUnitType) REFERENCES Units(UnitType) ON DELETE SET DEFAULT ON UPDATE SET DEFAULT,
FOREIGN KEY (TechnologyType) REFERENCES Types(Type) ON DELETE CASCADE ON UPDATE CASCADE);
它创建了一个名叫Technologies
的表,并定义了它的所有属性(以及属性的数据类型、满足条件、是否必须等等),包括Type、名称 Name、耗费 Cost、时代 EraType等等。并定义了它的主键 Primary Key,主键是一个条目的唯一标识符:一个主键对应一个表中的唯一一个条目,是不能同时存在两个条目,拥有相同的主键。
与之相对应的,在Technologies.xml
中,制陶是这么定义的:
<Technologies>
<Row TechnologyType="TECH_POTTERY" Name="LOC_TECH_POTTERY_NAME" Description="LOC_TECH_POTTERY_DESCRIPTION" Cost="25" AdvisorType="ADVISOR_GENERIC" EraType="ERA_ANCIENT" UITreeRow="0"/>
</Technologies>
Name和Description指名称和描述,它们都与语言设置有关,所以用LOC_*
的变量来代指。关于语言,在之后的章节会有提到。另外,它说明了制陶这项技术需要耗费25科技,它的建议类别是"通用",属于远古时期,在科技书中位于第0行。