140def build_json(save, filename, meta=None, validate=False, data=None):
142 source = OrderedDict(
144 (
"filename", os.path.basename(filename)),
146 (
"game_title", cfg[
"title"]),
147 (
"support_tier", cfg[
"tier"]),
152 if cfg.get(
"coverage"):
153 source[
"support_tier_coverage"] = cfg[
"coverage"]
156 if save.version
is not None:
157 source[
"save_format_version"] = save.version
158 if save.patch
is not None:
159 source[
"game_patch"] = save.patch
164 if save.owner
is not None:
165 source[
"steam_account_id"] = save.owner[0]
166 source[
"steam_id64"] = save.owner[1]
167 if save.folder
is not None:
168 source[
"save_folder"] = save.folder
172 (
"$schema", SCHEMA_URL),
173 (
"schema_version", SCHEMA_VERSION),
174 (
"generated", datetime.now(timezone.utc).strftime(
"%Y-%m-%dT%H:%M:%SZ")),
175 (
"tool", OrderedDict([(
"name",
"sl2-analyzer"), (
"url", REPO_URL)])),
180 doc[
"environment"] = OrderedDict(meta)
181 doc[
"characters"] = [
183 i - cfg[
"slots"].start + 1,
185 run_validation(ch, save.game)
if validate
else None,
187 for i, ch
in save.characters
189 if validate
and data
is not None:
190 entries = parse_bnd4(data)
or []
191 doc[
"file_validation"] = run_file_validation(
192 save.game, entries, data, checksum_ok
character_json(slot_no, ch, report=None)
One character as a JSON object: its slot number, then every field the parse actually set.