Interlude.fromJson constructor
Interlude.fromJson(
- Map<String, dynamic> json
)
Implementation
factory Interlude.fromJson(Map<String, dynamic> json) {
Map<String, Character> characters = {};
Map<String, String> backgrounds = {};
Map<String, SceneInterface> scenes = {};
//read character define from json
const characterDefineKey = [
"characters",
"char",
"char_define",
"c",
"char_list"
];
for (var key in characterDefineKey) {
if (json.containsKey(key)) {
for (var char in json[key]) {
if (char['type'] == 'narrator') {
characters[char['id']] = Narrator(id: char['id']);
} else if (char['type'] == 'default') {
characters[char['id']] = DefaultCharacter.fromJson(char);
} else if (char['type'] == 'spine') {
characters[char['id']] = SpineCharacter.fromJson(char);
}
}
}
}
//read background define from json
const backgroundDefineKey = [
"backgrounds",
"bg",
"bg_define",
"b",
"bg_list"
];
for (var key in backgroundDefineKey) {
if (json.containsKey(key)) {
for (var bg in json[key]) {
// if path is remote url
if (bg['path'].startsWith('http')) {
backgrounds[bg['id']] = bg['path'];
} else {
backgrounds[bg['id']] = bg['path'];
}
}
}
}
// read scenes from json
const scenesDefine = [
"scenes",
"s",
"scene",
"scene_define",
];
for (var key in scenesDefine) {
if (json.containsKey(key)) {
for (var scene in json[key]) {
if (scene['behaviors'] == null || scene['text'] != null) {
final List<String> text = scene['text'].cast<String>();
final cutscene = CutScene(
image: backgrounds[scene['image']]!,
text: text,
next: scene["next"],
id: scene['id']);
scenes[scene['id']] = cutscene;
} else {
List<Behavior> behaviors = [];
for (var behavior in scene['behaviors']) {
behaviors.add(Behavior(
type: behavior['type'] == 'speak'
? BehaviorType.speak
: BehaviorType.listen,
character: characters[behavior['character']]!,
dialog: behavior['dialog'],
position: behavior['position'] == null
? null
: Position.values.byName(behavior['position']),
state: behavior['state'],
));
}
scenes[scene['id']] = Scene(
id: scene['id'],
image: backgrounds[scene['background']]!,
behaviors: behaviors,
next: scene['next'],
);
}
}
}
}
return Interlude(
characters: characters,
backgrounds: backgrounds,
scenes: scenes,
);
}