import 'dart:collection'; import 'package:json_annotation/json_annotation.dart'; part 'warband_roaster.g.dart'; // flutter packages pub run build_runner build --delete-conflicting-outputs abstract class Unit { static List _splitListFromJson(String list) { if (list == null) { return new List(); } return list.split(new RegExp(r" *, *")); } static Stats _statsFromJson(String stats) { RegExp re = new RegExp( r"\s*M([0-9]+[dD]*[6]*)\s*,\s*WS([0-9]+)\s*,\s*BS([0-9]+)\s*,\s*S([0-9]+)\s*,\s*T([0-9]+)\s*,\s*W([0-9]+)\s*,\s*I([0-9]+)\s*,\s*A([0-9]+)\s*,\s*Ld([0-9]+)\s*,\s*Sv([0-9\-]+)\s*"); var matches = re.allMatches(stats).toList().first; return Stats( int.tryParse(matches.group(1)) ?? 0, int.tryParse(matches.group(2)) ?? 0, int.tryParse(matches.group(3)) ?? 0, int.tryParse(matches.group(4)) ?? 0, int.tryParse(matches.group(5)) ?? 0, int.tryParse(matches.group(6)) ?? 0, int.tryParse(matches.group(7)) ?? 0, int.tryParse(matches.group(8)) ?? 0, int.tryParse(matches.group(9)) ?? 0, int.tryParse(matches.group(10)) ?? 0); } } @JsonSerializable(nullable: true, anyMap: true, createToJson: false) class HenchmenGroup extends Unit { @JsonKey(name: 'group', fromJson: _henchmenHeaderFromJson) final HashMap header; @JsonKey(ignore: true) String name; @JsonKey(ignore: true) String type; @JsonKey(ignore: true) int number; @JsonKey(ignore: true) int experience; @JsonKey(fromJson: Unit._statsFromJson) final Stats stats; @JsonKey(fromJson: Unit._splitListFromJson) final List weapons; @JsonKey(fromJson: Unit._splitListFromJson) final List amour; HenchmenGroup(this.header, this.stats, this.weapons, this.amour) { this.name = this.header['name']; this.type = this.header['type']; this.number = int.tryParse(this.header['number']) ?? 1; this.experience = int.tryParse(this.header['experience']) ?? 0; } static HashMap _henchmenHeaderFromJson(String header) { HashMap h = new HashMap(); RegExp re = new RegExp(r"([^\(]+)\(([0-9]+)x?\s+([^\)]+)\)\s*\[([0-9]+)XP\]\s*"); var matches = re.allMatches(header).toList().first; h['name'] = matches.group(1); h['number'] = matches.group(2); h['type'] = matches.group(3); h['experience'] = matches.group(4); return h; } factory HenchmenGroup.fromJson(yaml) => _$HenchmenGroupFromJson(yaml); } @JsonSerializable(nullable: true, anyMap: true, createToJson: false) class Hero extends Unit { @JsonKey(name: 'hero', fromJson: _heroHeaderFromJson) final HashMap header; @JsonKey(ignore: true) String name; @JsonKey(ignore: true) String type; @JsonKey(ignore: true) int experience; @JsonKey(fromJson: Unit._statsFromJson) final Stats stats; @JsonKey(fromJson: Unit._splitListFromJson) final List skilllists; @JsonKey(fromJson: Unit._splitListFromJson) final List weapons; @JsonKey(fromJson: Unit._splitListFromJson) final List amour; @JsonKey(fromJson: Unit._splitListFromJson) final List rules; final int warbandaddition; Hero(this.stats, this.skilllists, this.weapons, this.amour, this.rules, this.warbandaddition, this.header) { this.name = this.header['name']; this.type = this.header['type']; this.experience = int.tryParse(this.header['experience']) ?? 0; } factory Hero.fromJson(yaml) => _$HeroFromJson(yaml); static HashMap _heroHeaderFromJson(String header) { HashMap h = new HashMap(); RegExp re = new RegExp(r"([^\(]+)\(([^\)]+)\)\s*\[([0-9]+)XP\]\s*"); var matches = re.allMatches(header).toList().first; h['name'] = matches.group(1); h['type'] = matches.group(2); h['experience'] = matches.group(3); return h; } } class Stats { final int movement; final int weaponSkill; final int ballisticSkill; final int strength; final int toughtness; final int wounds; final int initiative; final int attacks; final int leadership; final int save; Stats( this.movement, this.weaponSkill, this.ballisticSkill, this.strength, this.toughtness, this.wounds, this.initiative, this.attacks, this.leadership, this.save); } class Version { String gitHash; String date; String author; String message; Version(this.gitHash, this.date, this.author, this.message); } @JsonSerializable(nullable: true, anyMap: true, createToJson: false) class WarbandRoaster { /// Store the complete string of name and race. This will split up into the /// fields name and race. @JsonKey(name: 'warband', fromJson: _warbandNameAndRace) final HashMap nameAndRace; @JsonKey(ignore: true) String name; @JsonKey(ignore: true) String race; bool active; @JsonKey(name: 'campaign') final int campaignPoints; final String objective; final String alignment; final String achievments; final int gc; final int shards; final String equipment; final List heros; @JsonKey(name: 'henchmen') final List henchmenGroups; /// The players name is not defined in the yml file. This will be added later /// from the GitHubAdapter. @JsonKey(ignore: true) String playerName = 'Lonely Recluse'; @JsonKey(ignore: true) Version lastSyncVersion; @JsonKey(ignore: true) Version currentVersion; WarbandRoaster( this.nameAndRace, this.campaignPoints, this.objective, this.alignment, this.gc, this.shards, this.equipment, this.achievments, this.heros, this.henchmenGroups) { this.name = this.nameAndRace['name']; this.race = this.nameAndRace['race']; } static HashMap _warbandNameAndRace(String nameAndRace) { HashMap nr = new HashMap(); RegExp re = new RegExp(r"(.*) \((.*)\)"); var matches = re.allMatches(nameAndRace); nr['name'] = matches.toList().first.group(1).toString(); nr['race'] = matches.toList().first.group(2).toString(); return nr; } factory WarbandRoaster.fromJson(yaml) => _$WarbandRoasterFromJson(yaml); }