Skip to content

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 映射到游戏中对应的系统。conditiononResolveCondition 使用这些键来评估游戏状态。由 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_flagplay_soundgive_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)