diff --git a/iOS/MonsterCards.xcodeproj/project.pbxproj b/iOS/MonsterCards.xcodeproj/project.pbxproj index dac0873..4fe3ba8 100644 --- a/iOS/MonsterCards.xcodeproj/project.pbxproj +++ b/iOS/MonsterCards.xcodeproj/project.pbxproj @@ -22,6 +22,7 @@ E216B7B7260C5A9800FB205F /* ChallengeRatingViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = E216B7B6260C5A9800FB205F /* ChallengeRatingViewModel.swift */; }; E216B7BC260C691400FB205F /* EditChallengeRating.swift in Sources */ = {isa = PBXBuildFile; fileRef = E216B7BB260C691400FB205F /* EditChallengeRating.swift */; }; E216B7C1260C6B6000FB205F /* MCChallengeRatingPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = E216B7C0260C6B6000FB205F /* MCChallengeRatingPicker.swift */; }; + E216E465261FDA2E00FD9262 /* MonsterDocument.swift in Sources */ = {isa = PBXBuildFile; fileRef = E216E464261FDA2E00FD9262 /* MonsterDocument.swift */; }; E2182E6425B22F8A00DFAEF8 /* Monster+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2182E6225B22F8A00DFAEF8 /* Monster+CoreDataClass.swift */; }; E219247B261989B400C84E12 /* MonsterDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = E219247A261989B400C84E12 /* MonsterDTO.swift */; }; E2192480261989F700C84E12 /* SavingThrowDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = E219247F261989F700C84E12 /* SavingThrowDTO.swift */; }; @@ -102,6 +103,7 @@ E216B7B6260C5A9800FB205F /* ChallengeRatingViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChallengeRatingViewModel.swift; sourceTree = ""; }; E216B7BB260C691400FB205F /* EditChallengeRating.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditChallengeRating.swift; sourceTree = ""; }; E216B7C0260C6B6000FB205F /* MCChallengeRatingPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MCChallengeRatingPicker.swift; sourceTree = ""; }; + E216E464261FDA2E00FD9262 /* MonsterDocument.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MonsterDocument.swift; sourceTree = ""; }; E2182E6225B22F8A00DFAEF8 /* Monster+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Monster+CoreDataClass.swift"; sourceTree = ""; }; E219247A261989B400C84E12 /* MonsterDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MonsterDTO.swift; sourceTree = ""; }; E219247F261989F700C84E12 /* SavingThrowDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SavingThrowDTO.swift; sourceTree = ""; }; @@ -216,13 +218,13 @@ E2570FB725B1AC520055B23B /* MonsterCards */ = { isa = PBXGroup; children = ( - E2570FC625B1AC550055B23B /* Info.plist */, - E2570FB825B1AC520055B23B /* MonsterCardsApp.swift */, - E2570FC125B1AC550055B23B /* Persistence.swift */, E2570FBC25B1AC550055B23B /* Assets.xcassets */, E2D473FB25B5328800CB36D7 /* Helpers */, + E2570FC625B1AC550055B23B /* Info.plist */, E257101225B1B2790055B23B /* Models */, E2570FC325B1AC550055B23B /* MonsterCards.xcdatamodeld */, + E2570FB825B1AC520055B23B /* MonsterCardsApp.swift */, + E2570FC125B1AC550055B23B /* Persistence.swift */, E2570FBE25B1AC550055B23B /* Preview Content */, E2570FEB25B1ADA90055B23B /* Views */, ); @@ -301,6 +303,7 @@ E219249326198A8200C84E12 /* LanguageDTO.swift */, E216B790260C1FE800FB205F /* LanguageViewModel.swift */, E2182E6225B22F8A00DFAEF8 /* Monster+CoreDataClass.swift */, + E216E464261FDA2E00FD9262 /* MonsterDocument.swift */, E219247A261989B400C84E12 /* MonsterDTO.swift */, E20209FA25D8E19100EFE733 /* MonsterViewModel.swift */, E219247F261989F700C84E12 /* SavingThrowDTO.swift */, @@ -497,6 +500,7 @@ E219248F26198A6A00C84E12 /* DamageTypeDTO.swift in Sources */, E20209F425D8E04300EFE733 /* ProficiencyType.swift in Sources */, E2CB0DC526086E5F00142591 /* SizeType.swift in Sources */, + E216E465261FDA2E00FD9262 /* MonsterDocument.swift in Sources */, E254F906260D0818009295A5 /* AbilityViewModel.swift in Sources */, E2570FFA25B1AE020055B23B /* Collections.swift in Sources */, E24ACE5B2607F0F2009BF703 /* EditSpeed.swift in Sources */, diff --git a/iOS/MonsterCards/Models/LanguageDTO.swift b/iOS/MonsterCards/Models/LanguageDTO.swift index 906b881..46f3d38 100644 --- a/iOS/MonsterCards/Models/LanguageDTO.swift +++ b/iOS/MonsterCards/Models/LanguageDTO.swift @@ -17,7 +17,7 @@ private enum LanguageDTOCodingKeys: String, CodingKey { case speaks = "speaks" } -extension LanguageDTO: Decodable { +extension LanguageDTO: Codable { init(from decoder: Decoder) throws { @@ -25,9 +25,6 @@ extension LanguageDTO: Decodable { self.name = (try? container.decode(String.self, forKey: .name)) ?? "" self.speaks = (try? container.decode(Bool.self, forKey: .speaks)) ?? false } -} - -extension LanguageDTO: Encodable { func encode(to encoder: Encoder) throws { diff --git a/iOS/MonsterCards/Models/MonsterDTO.swift b/iOS/MonsterCards/Models/MonsterDTO.swift index ec598c3..13f6399 100644 --- a/iOS/MonsterCards/Models/MonsterDTO.swift +++ b/iOS/MonsterCards/Models/MonsterDTO.swift @@ -69,6 +69,70 @@ struct MonsterDTO { var doubleColumns: Bool var separationPoint: Int var damage: [DamageTypeDTO] // TODO: figure this out + + init() { + self.abilities = [] + self.actions = [] + self.alignment = "" + self.armorName = "" + self.blind = false + self.blindsight = 0 + self.burrowSpeed = 0 + self.chaPoints = 0 + self.climbSpeed = 0 + self.conPoints = 0 + self.conditions = [] + self.cr = "" + self.customCr = "" + self.customHP = false + self.customProf = 0 + self.customSpeed = false + self.damage = [] + self.damageTypes = [] + self.darkvision = 0 + self.dexPoints = 0 + self.doubleColumns = false + self.flySpeed = 0 + self.hitDice = 0 + self.hover = false + self.hpText = "" + self.intPoints = 0 + self.isLair = false + self.isLegendary = false + self.isRegional = false + self.lairs = [] + self.languages = [] + self.legendaries = [] + self.lairDescription = "" + self.legendaryDescription = "" + self.lairDescriptionEnd = "" + self.name = "" + self.natArmorBonus = 0 + self.otherArmorDesc = "" + self.reactions = [] + self.regionals = [] + self.regionalDescription = "" + self.regionalDescriptionEnd = "" + self.size = "" + self.speed = 0 + self.skills = [] + self.sthrows = [] + self.strPoints = 0 + self.swimSpeed = 0 + self.speedDesc = "" + self.shortName = "" + self.specialDamage = [] + self.shieldBonus = 0 + self.separationPoint = 0 + self.type = "" + self.tag = "" + self.telepathy = 0 + self.truesight = 0 + self.tremorsense = 0 + self.understandsBut = "" + self.wisPoints = 0 + } + } enum MonsterDTOCodingKeys: String, CodingKey { @@ -135,7 +199,7 @@ enum MonsterDTOCodingKeys: String, CodingKey { case damage = "damage" } -extension MonsterDTO: Decodable { +extension MonsterDTO: Codable { init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: MonsterDTOCodingKeys.self) self.name = (try? container.decode(String.self, forKey: .name)) ?? "Imported Monster" @@ -207,9 +271,6 @@ extension MonsterDTO: Decodable { self.damageTypes = (try? container.decode([DamageTypeDTO].self, forKey: .damageTypes)) ?? [] self.languages = (try? container.decode([LanguageDTO].self, forKey: .languages)) ?? [] } -} - -extension MonsterDTO: Encodable { func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: MonsterDTOCodingKeys.self) @@ -266,7 +327,7 @@ extension MonsterDTO: Encodable { try container.encode(self.isRegional, forKey: .isRegional) try container.encode(self.regionalDescription, forKey: .regionalDescription) try container.encode(self.regionalDescriptionEnd, forKey: .regionalDescriptionEnd) -// try container.encode(self.properties, forKey: .properties) + try container.encode([] as [TraitDTO], forKey: .properties) try container.encode(self.lairs, forKey: .lairs) try container.encode(self.regionals, forKey: .regionals) try container.encode(self.specialDamage, forKey: .specialDamage) diff --git a/iOS/MonsterCards/Models/MonsterDocument.swift b/iOS/MonsterCards/Models/MonsterDocument.swift new file mode 100644 index 0000000..c073217 --- /dev/null +++ b/iOS/MonsterCards/Models/MonsterDocument.swift @@ -0,0 +1,37 @@ +// +// Document.swift +// MonsterCards +// +// Created by Tom Hicks on 4/7/21. +// + +import UIKit +import SceneKit + +class MonsterDocument: UIDocument { + + var monsterDTO: MonsterDTO? + var error: Error? + + override func contents(forType typeName: String) throws -> Any { + let encoder = JSONEncoder() + do { + let data = try encoder.encode(monsterDTO) + return data + } catch { + return Data() + } + } + + override func load(fromContents contents: Any, ofType typeName: String?) throws { + let decoder = JSONDecoder() + do { + let data = contents as! Data + monsterDTO = try decoder.decode(MonsterDTO.self, from: data) + } catch { + monsterDTO = MonsterDTO() + } + } + +} + diff --git a/iOS/MonsterCards/Models/SavingThrowDTO.swift b/iOS/MonsterCards/Models/SavingThrowDTO.swift index 6851f3f..553e82f 100644 --- a/iOS/MonsterCards/Models/SavingThrowDTO.swift +++ b/iOS/MonsterCards/Models/SavingThrowDTO.swift @@ -17,7 +17,7 @@ private enum SavingThrowDTOCodingKeys: String, CodingKey { case order = "order" } -extension SavingThrowDTO: Decodable { +extension SavingThrowDTO: Codable { init(from decoder: Decoder) throws { @@ -25,9 +25,6 @@ extension SavingThrowDTO: Decodable { self.name = (try? container.decode(String.self, forKey: .name)) ?? "" self.order = (try? container.decode(Int.self, forKey: .order)) ?? 0 } -} - -extension SavingThrowDTO: Encodable { func encode(to encoder: Encoder) throws { diff --git a/iOS/MonsterCards/Models/SkillDTO.swift b/iOS/MonsterCards/Models/SkillDTO.swift index e547d7f..f9f5b6a 100644 --- a/iOS/MonsterCards/Models/SkillDTO.swift +++ b/iOS/MonsterCards/Models/SkillDTO.swift @@ -19,7 +19,7 @@ private enum SkillDTOCodingKeys: String, CodingKey { case note = "note" } -extension SkillDTO: Decodable { +extension SkillDTO: Codable { init(from decoder: Decoder) throws { @@ -28,9 +28,6 @@ extension SkillDTO: Decodable { self.note = (try? container.decode(String.self, forKey: .note)) ?? "" self.stat = (try? container.decode(String.self, forKey: .stat)) ?? "" } -} - -extension SkillDTO: Encodable { func encode(to encoder: Encoder) throws { diff --git a/iOS/MonsterCards/Models/TraitDTO.swift b/iOS/MonsterCards/Models/TraitDTO.swift index 933eed4..e722719 100644 --- a/iOS/MonsterCards/Models/TraitDTO.swift +++ b/iOS/MonsterCards/Models/TraitDTO.swift @@ -19,7 +19,7 @@ private enum TraitDTOCodingKeys: String, CodingKey { case desc = "desc" } -extension TraitDTO: Decodable { +extension TraitDTO: Codable { init(from decoder: Decoder) throws { @@ -28,9 +28,6 @@ extension TraitDTO: Decodable { self.note = (try? container.decode(String.self, forKey: .note)) ?? "" self.desc = (try? container.decode(String.self, forKey: .desc)) ?? "" } -} - -extension TraitDTO: Encodable { func encode(to encoder: Encoder) throws {