Blueprint と Scene
Blueprint の構造
BlueprintExport は LSDE エディターから出力される JSON ファイルです。engine が必要とするすべてのデータを含んでいます。
interface BlueprintExport {
version: string;
exportDate: string;
projectName?: string;
primaryLanguage?: string;
locales: string[];
dictionaries?: Dictionary[];
signatures?: ActionSignature[];
scenes: BlueprintScene[];
}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; }
}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;
};# 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 は独立した対話シーケンスです — 会話、カットシーン、チュートリアル、ショップのやり取りなど。ゲームでは通常、スクリプトイベントによってトリガーされます:プレイヤーが NPC に話しかける、ゾーンに入る、アイテムを拾うなど。
各 scene は独自のエントリーブロック、独自のフロー、独自の状態を持ちます。複数の scene を並行して実行できます(例:メインダイアログとチュートリアルオーバーレイ)。scene は BlueprintScene インターフェースで定義されます:
interface BlueprintScene {
uuid: string;
label: string;
note?: string;
entryBlockId?: string;
date: string;
blocks: BlueprintBlock[];
connections: BlueprintConnection[];
}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; }
}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;
};# 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 インターフェースで定義されます:
interface BlueprintConnection {
id: string;
fromId: string;
toId: string;
fromPort: string;
toPort: string;
fromPortIndex?: number;
}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; }
}struct BlueprintConnection {
std::string id;
std::string fromId;
std::string toId;
std::string fromPort;
std::string toPort;
std::optional<int> fromPortIndex;
};# 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 インターフェースで定義されます:
interface Dictionary {
uuid: string;
id: string;
rows: DictionaryRow[];
}
interface DictionaryRow {
key: string;
}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; }
}struct LsdeDictionary {
std::string uuid;
std::string id;
std::vector<DictionaryRow> rows;
};
struct DictionaryRow {
std::string key;
};# Dictionary with keys:
# "uuid": String
# "id": String
# "rows": Array[{"key": String}]Action Signature
signature はゲームで利用可能なアクションタイプを記述します — set_flag、play_sound、give_item。開発者が LSDE エディターで宣言し、ナラティブデザイナーが型付きパラメーターでアクションシーケンスを構成できるようにします。ランタイムでは、signature の id を開発者が自分のシステムにマッピングします。ActionSignature インターフェースで定義されます:
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 }[];
}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; }
}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;
};# 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)