Blueprint 与 Scene
Blueprint 结构
BlueprintExport 是从 LSDE 编辑器导出的 JSON 文件。它包含 engine 所需的全部数据。
ts
interface BlueprintExport {
version: string;
exportDate: string;
projectName?: string;
primaryLanguage?: string;
locales: string[];
dictionaries?: Dictionary[];
signatures?: ActionSignature[];
scenes: BlueprintScene[];
}csharp
public class BlueprintExport {
public string Version { get; set; }
public string ExportDate { get; set; }
public string? ProjectName { get; set; }
public string? PrimaryLanguage { get; set; }
public List<string> Locales { get; set; }
public List<Dictionary>? Dictionaries { get; set; }
public List<ActionSignature>? Signatures { get; set; }
public List<BlueprintScene> Scenes { get; set; }
}cpp
struct BlueprintExport {
std::string version;
std::string exportDate;
std::optional<std::string> projectName;
std::optional<std::string> primaryLanguage;
std::vector<std::string> locales;
std::vector<LsdeDictionary> dictionaries;
std::vector<ActionSignature> signatures;
std::vector<BlueprintScene> scenes;
};gdscript
# Dictionary with keys:
# "version": String
# "exportDate": String
# "projectName": String (optional)
# "primaryLanguage": String (optional)
# "locales": Array[String]
# "dictionaries": Array[Dictionary] (optional)
# "signatures": Array[Dictionary] (optional)
# "scenes": Array[Dictionary]Scene
scene 是一个独立的对话序列 — 一段对话、一段过场动画、一个教程提示、一次商店交互。在游戏中,scene 通常由脚本事件触发:玩家与 NPC 对话、进入区域或拾取物品。
每个 scene 拥有自己的入口 block、独立的流程和独立的状态。多个 scene 可以并行运行(例如:主对话和教程覆盖层)。scene 由 BlueprintScene 接口定义:
ts
interface BlueprintScene {
uuid: string;
label: string;
note?: string;
entryBlockId?: string;
date: string;
blocks: BlueprintBlock[];
connections: BlueprintConnection[];
}csharp
public class BlueprintScene {
public string Uuid { get; set; }
public string Label { get; set; }
public string? Note { get; set; }
public string? EntryBlockId { get; set; }
public string Date { get; set; }
public List<BlueprintBlock> Blocks { get; set; }
public List<BlueprintConnection> Connections { get; set; }
}cpp
struct BlueprintScene {
std::string uuid;
std::string label;
std::optional<std::string> note;
std::optional<std::string> entryBlockId;
std::string date;
std::vector<BlueprintBlock> blocks;
std::vector<BlueprintConnection> connections;
};gdscript
# Dictionary with keys:
# "uuid": String
# "label": String
# "note": String (optional)
# "entryBlockId": String (optional)
# "date": String
# "blocks": Array[Dictionary]
# "connections": Array[Dictionary]Connection
Connection 是 block 之间的连线 — 定义哪个 block 通向哪个 block。在编辑器中可视化绘制,导出后变为源 → 目标的扁平列表,由 BlueprintConnection 接口定义:
ts
interface BlueprintConnection {
id: string;
fromId: string;
toId: string;
fromPort: string;
toPort: string;
fromPortIndex?: number;
}csharp
public class BlueprintConnection {
public string Id { get; set; }
public string FromId { get; set; }
public string ToId { get; set; }
public string FromPort { get; set; }
public string ToPort { get; set; }
public int? FromPortIndex { get; set; }
}cpp
struct BlueprintConnection {
std::string id;
std::string fromId;
std::string toId;
std::string fromPort;
std::string toPort;
std::optional<int> fromPortIndex;
};gdscript
# Dictionary with keys:
# "id": String
# "fromId": String
# "toId": String
# "fromPort": String
# "toPort": String
# "fromPortIndex": int (optional)通常不需要直接检查 connection — engine 会在内部处理路由。如有需要,可以通过 onValidateNextBlock 访问。
Dictionary
Dictionary 描述游戏的寄存器 — 开关、变量、背包等。开发者在 LSDE 编辑器中声明,向叙事设计师公开游戏中可用的变量。运行时,开发者将每个 dictionary 映射到游戏中对应的系统。condition 和 onResolveCondition 使用这些键来评估游戏状态。由 Dictionary 接口定义:
ts
interface Dictionary {
uuid: string;
id: string;
rows: DictionaryRow[];
}
interface DictionaryRow {
key: string;
}csharp
public class LsdeDictionary {
public string Uuid { get; set; }
public string Id { get; set; }
public List<DictionaryRow> Rows { get; set; }
}
public class DictionaryRow {
public string Key { get; set; }
}cpp
struct LsdeDictionary {
std::string uuid;
std::string id;
std::vector<DictionaryRow> rows;
};
struct DictionaryRow {
std::string key;
};gdscript
# Dictionary with keys:
# "uuid": String
# "id": String
# "rows": Array[{"key": String}]Action Signature
Signature 描述游戏中可用的动作类型 — set_flag、play_sound、give_item。开发者在 LSDE 编辑器中声明,让叙事设计师使用类型化参数组合动作序列。运行时,开发者将 signature 的 id 映射到自己的系统。由 ActionSignature 接口定义:
ts
interface ActionSignature {
uuid: string;
id: string;
params: SignatureParam[];
}
interface SignatureParam {
label?: string;
type: 'boolean' | 'string' | 'number' | 'enum' | 'dictionary';
dictionaryGroupUuid?: string;
enumOptions?: { id: string; label?: string }[];
}csharp
public class ActionSignature {
public string Uuid { get; set; }
public string Id { get; set; }
public List<SignatureParam> Params { get; set; }
}
public class SignatureParam {
public string? Label { get; set; }
public string Type { get; set; }
public string? DictionaryGroupUuid { get; set; }
public List<EnumOption>? EnumOptions { get; set; }
}cpp
struct ActionSignature {
std::string uuid;
std::string id;
std::vector<SignatureParam> params;
};
struct SignatureParam {
std::optional<std::string> label;
std::string type;
std::optional<std::string> dictionaryGroupUuid;
std::vector<EnumOption> enumOptions;
};gdscript
# ActionSignature Dictionary:
# "uuid": String
# "id": String
# "params": Array[SignatureParam]
#
# SignatureParam Dictionary:
# "label": String (optional)
# "type": "boolean" | "string" | "number" | "enum" | "dictionary"
# "dictionaryGroupUuid": String (optional)
# "enumOptions": Array[{"id": String, "label": String?}] (optional)