Interlude.fromJson constructor

Interlude.fromJson(
  1. 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,
  );
}