├── .DS_Store ├── .gitignore ├── Images ├── image1.png ├── image2.png └── image3.png ├── LICENSE ├── Packages ├── .DS_Store ├── DesignSystem │ ├── .gitignore │ ├── Package.swift │ ├── README.md │ ├── Sources │ │ └── DesignSystem │ │ │ ├── Color.swift │ │ │ ├── DesignSystem.swift │ │ │ ├── Font.swift │ │ │ └── Resources │ │ │ ├── AvQest.ttf │ │ │ └── Colors.xcassets │ │ │ ├── Contents.json │ │ │ ├── magic.colorset │ │ │ └── Contents.json │ │ │ ├── rare.colorset │ │ │ └── Contents.json │ │ │ ├── runic.colorset │ │ │ └── Contents.json │ │ │ ├── set.colorset │ │ │ └── Contents.json │ │ │ └── unic.colorset │ │ │ └── Contents.json │ └── Tests │ │ └── DesignSystemTests │ │ └── DesignSystemTests.swift ├── RunesData │ ├── .gitignore │ ├── Package.swift │ ├── README.md │ ├── Sources │ │ └── RunesData │ │ │ ├── Activities │ │ │ └── RunewordActivity.swift │ │ │ ├── JSON │ │ │ ├── cube-recipes.json │ │ │ ├── runes.json │ │ │ ├── runewords-description.json │ │ │ └── runewords.json │ │ │ ├── Model │ │ │ ├── CubeRecipe.swift │ │ │ ├── ItemBase.swift │ │ │ ├── Rune.swift │ │ │ └── Runeword.swift │ │ │ └── RunesData.swift │ └── Tests │ │ └── RunesDataTests │ │ └── RunesDataTests.swift └── Stash │ ├── .gitignore │ ├── .swiftpm │ └── xcode │ │ └── package.xcworkspace │ │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ ├── Package.swift │ ├── README.md │ ├── Sources │ └── Stash │ │ └── Stash.swift │ └── Tests │ └── StashTests │ └── StashTests.swift ├── Readme.md ├── RunewordsApp.xcodeproj ├── project.pbxproj └── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── RunewordsApp ├── .DS_Store ├── App │ ├── AppTabView.swift │ ├── Routeur.swift │ └── RunewordsApp.swift ├── Assets.xcassets │ ├── .DS_Store │ ├── AccentColor.colorset │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ ├── AppIcon.png │ │ └── Contents.json │ ├── Contents.json │ └── Runes │ │ ├── Contents.json │ │ ├── amn.imageset │ │ ├── Contents.json │ │ └── amn.png │ │ ├── ber.imageset │ │ ├── Contents.json │ │ └── ber.png │ │ ├── cham.imageset │ │ ├── Contents.json │ │ └── cham.png │ │ ├── dol.imageset │ │ ├── Contents.json │ │ └── dol.png │ │ ├── el.imageset │ │ ├── Contents.json │ │ └── el.png │ │ ├── eld.imageset │ │ ├── Contents.json │ │ └── eld.png │ │ ├── eth.imageset │ │ ├── Contents.json │ │ └── eth.png │ │ ├── fal.imageset │ │ ├── Contents.json │ │ └── fal.png │ │ ├── gul.imageset │ │ ├── Contents.json │ │ └── gul.png │ │ ├── hel.imageset │ │ ├── Contents.json │ │ └── hel.png │ │ ├── io.imageset │ │ ├── Contents.json │ │ └── io.png │ │ ├── ist.imageset │ │ ├── Contents.json │ │ └── ist.png │ │ ├── ith.imageset │ │ ├── Contents.json │ │ └── ith.png │ │ ├── jah.imageset │ │ ├── Contents.json │ │ └── jah.png │ │ ├── ko.imageset │ │ ├── Contents.json │ │ └── ko.png │ │ ├── lem.imageset │ │ ├── Contents.json │ │ └── lem.png │ │ ├── lo.imageset │ │ ├── Contents.json │ │ └── lo.png │ │ ├── lum.imageset │ │ ├── Contents.json │ │ └── lum.png │ │ ├── mal.imageset │ │ ├── Contents.json │ │ └── mal.png │ │ ├── nef.imageset │ │ ├── Contents.json │ │ └── nef.png │ │ ├── ohm.imageset │ │ ├── Contents.json │ │ └── ohm.png │ │ ├── ort.imageset │ │ ├── Contents.json │ │ └── ort.png │ │ ├── pul.imageset │ │ ├── Contents.json │ │ └── pul.png │ │ ├── ral.imageset │ │ ├── Contents.json │ │ └── ral.png │ │ ├── shael.imageset │ │ ├── Contents.json │ │ └── shael.png │ │ ├── sol.imageset │ │ ├── Contents.json │ │ └── sol.png │ │ ├── sur.imageset │ │ ├── Contents.json │ │ └── sur.png │ │ ├── tal.imageset │ │ ├── Contents.json │ │ └── tal.png │ │ ├── thul.imageset │ │ ├── Contents.json │ │ └── thul.png │ │ ├── tir.imageset │ │ ├── Contents.json │ │ └── tir.png │ │ ├── um.imageset │ │ ├── Contents.json │ │ └── um.png │ │ ├── vex.imageset │ │ ├── Contents.json │ │ └── vex.png │ │ └── zod.imageset │ │ ├── Contents.json │ │ └── zod.png ├── Info.plist ├── More │ ├── CubeRecipesListView.swift │ └── MoreView.swift ├── Preview Content │ └── Preview Assets.xcassets │ │ └── Contents.json ├── Runes │ ├── RuneDetailView.swift │ ├── RuneRowView.swift │ └── RunesView.swift ├── Runewords │ ├── RunesStackView.swift │ ├── RunewordDetailView.swift │ ├── RunewordRowView.swift │ └── RunewordsListView.swift └── Stash │ └── StashView.swift └── RunewordsWidget ├── Assets.xcassets ├── AccentColor.colorset │ └── Contents.json ├── AppIcon.appiconset │ └── Contents.json ├── Contents.json ├── Runes │ ├── Contents.json │ ├── amn.imageset │ │ ├── Contents.json │ │ └── amn.png │ ├── ber.imageset │ │ ├── Contents.json │ │ └── ber.png │ ├── cham.imageset │ │ ├── Contents.json │ │ └── cham.png │ ├── dol.imageset │ │ ├── Contents.json │ │ └── dol.png │ ├── el.imageset │ │ ├── Contents.json │ │ └── el.png │ ├── eld.imageset │ │ ├── Contents.json │ │ └── eld.png │ ├── eth.imageset │ │ ├── Contents.json │ │ └── eth.png │ ├── fal.imageset │ │ ├── Contents.json │ │ └── fal.png │ ├── gul.imageset │ │ ├── Contents.json │ │ └── gul.png │ ├── hel.imageset │ │ ├── Contents.json │ │ └── hel.png │ ├── io.imageset │ │ ├── Contents.json │ │ └── io.png │ ├── ist.imageset │ │ ├── Contents.json │ │ └── ist.png │ ├── ith.imageset │ │ ├── Contents.json │ │ └── ith.png │ ├── jah.imageset │ │ ├── Contents.json │ │ └── jah.png │ ├── ko.imageset │ │ ├── Contents.json │ │ └── ko.png │ ├── lem.imageset │ │ ├── Contents.json │ │ └── lem.png │ ├── lo.imageset │ │ ├── Contents.json │ │ └── lo.png │ ├── lum.imageset │ │ ├── Contents.json │ │ └── lum.png │ ├── mal.imageset │ │ ├── Contents.json │ │ └── mal.png │ ├── nef.imageset │ │ ├── Contents.json │ │ └── nef.png │ ├── ohm.imageset │ │ ├── Contents.json │ │ └── ohm.png │ ├── ort.imageset │ │ ├── Contents.json │ │ └── ort.png │ ├── pul.imageset │ │ ├── Contents.json │ │ └── pul.png │ ├── ral.imageset │ │ ├── Contents.json │ │ └── ral.png │ ├── shael.imageset │ │ ├── Contents.json │ │ └── shael.png │ ├── sol.imageset │ │ ├── Contents.json │ │ └── sol.png │ ├── sur.imageset │ │ ├── Contents.json │ │ └── sur.png │ ├── tal.imageset │ │ ├── Contents.json │ │ └── tal.png │ ├── thul.imageset │ │ ├── Contents.json │ │ └── thul.png │ ├── tir.imageset │ │ ├── Contents.json │ │ └── tir.png │ ├── um.imageset │ │ ├── Contents.json │ │ └── um.png │ ├── vex.imageset │ │ ├── Contents.json │ │ └── vex.png │ └── zod.imageset │ │ ├── Contents.json │ │ └── zod.png ├── WidgetBackground.colorset │ └── Contents.json └── cube.imageset │ ├── Contents.json │ └── Image.png ├── Info.plist └── RunewordsWidget.swift /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/.DS_Store -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## User settings 6 | xcuserdata/ 7 | 8 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) 9 | *.xcscmblueprint 10 | *.xccheckout 11 | 12 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) 13 | build/ 14 | DerivedData/ 15 | *.moved-aside 16 | *.pbxuser 17 | !default.pbxuser 18 | *.mode1v3 19 | !default.mode1v3 20 | *.mode2v3 21 | !default.mode2v3 22 | *.perspectivev3 23 | !default.perspectivev3 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | 28 | ## App packaging 29 | *.ipa 30 | *.dSYM.zip 31 | *.dSYM 32 | 33 | ## Playgrounds 34 | timeline.xctimeline 35 | playground.xcworkspace 36 | 37 | # Swift Package Manager 38 | # 39 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 40 | # Packages/ 41 | # Package.pins 42 | # Package.resolved 43 | # *.xcodeproj 44 | # 45 | # Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata 46 | # hence it is not needed unless you have added a package configuration file to your project 47 | # .swiftpm 48 | 49 | .build/ 50 | 51 | # CocoaPods 52 | # 53 | # We recommend against adding the Pods directory to your .gitignore. However 54 | # you should judge for yourself, the pros and cons are mentioned at: 55 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 56 | # 57 | # Pods/ 58 | # 59 | # Add this line if you want to avoid checking in source code from the Xcode workspace 60 | # *.xcworkspace 61 | 62 | # Carthage 63 | # 64 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 65 | # Carthage/Checkouts 66 | 67 | Carthage/Build/ 68 | 69 | # Accio dependency management 70 | Dependencies/ 71 | .accio/ 72 | 73 | # fastlane 74 | # 75 | # It is recommended to not store the screenshots in the git repo. 76 | # Instead, use fastlane to re-generate the screenshots whenever they are needed. 77 | # For more information about the recommended setup visit: 78 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 79 | 80 | fastlane/report.xml 81 | fastlane/Preview.html 82 | fastlane/screenshots/**/*.png 83 | fastlane/test_output 84 | 85 | # Code Injection 86 | # 87 | # After new code Injection tools there's a generated folder /iOSInjectionProject 88 | # https://github.com/johnno1962/injectionforxcode 89 | 90 | iOSInjectionProject/ 91 | .DS_Store 92 | -------------------------------------------------------------------------------- /Images/image1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/Images/image1.png -------------------------------------------------------------------------------- /Images/image2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/Images/image2.png -------------------------------------------------------------------------------- /Images/image3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/Images/image3.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /Packages/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/Packages/.DS_Store -------------------------------------------------------------------------------- /Packages/DesignSystem/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /.build 3 | /Packages 4 | /*.xcodeproj 5 | xcuserdata/ 6 | DerivedData/ 7 | .swiftpm/config/registries.json 8 | .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata 9 | .netrc 10 | -------------------------------------------------------------------------------- /Packages/DesignSystem/Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version: 5.7 2 | // The swift-tools-version declares the minimum version of Swift required to build this package. 3 | 4 | import PackageDescription 5 | 6 | let package = Package( 7 | name: "DesignSystem", 8 | platforms: [ 9 | .iOS(.v16) 10 | ], 11 | products: [ 12 | .library( 13 | name: "DesignSystem", 14 | targets: ["DesignSystem"]), 15 | ], 16 | targets: [ 17 | .target( 18 | name: "DesignSystem", 19 | dependencies: [], 20 | resources: [.process("Resources")]), 21 | .testTarget( 22 | name: "DesignSystemTests", 23 | dependencies: ["DesignSystem"]), 24 | ] 25 | ) 26 | -------------------------------------------------------------------------------- /Packages/DesignSystem/README.md: -------------------------------------------------------------------------------- 1 | # DesignSystem 2 | 3 | A description of this package. 4 | -------------------------------------------------------------------------------- /Packages/DesignSystem/Sources/DesignSystem/Color.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | extension Color { 4 | public enum ItemsPalette: String, CaseIterable { 5 | case magic, rare, unic, set, runic 6 | } 7 | 8 | public static func itemsColor(color: ItemsPalette) -> Color { 9 | .init(color.rawValue, bundle: .module) 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Packages/DesignSystem/Sources/DesignSystem/DesignSystem.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import CoreGraphics 3 | import CoreText 4 | import UIKit 5 | 6 | public struct DesignSystem { 7 | public static func registerFonts() { 8 | AppFont.allCases.forEach { 9 | registerFont(bundle: .module, fontName: $0.rawValue, fontExtension: "ttf") 10 | } 11 | } 12 | 13 | public static func registerAppaerance() { 14 | UINavigationBar.appearance().largeTitleTextAttributes = [.font : UIFont.AVQestFont(size: 32)] 15 | UINavigationBar.appearance().titleTextAttributes = [.font : UIFont.AVQestFont(size: 20)] 16 | UITabBarItem.appearance().setTitleTextAttributes([.font: UIFont.AVQestFont(size: 14)], for: .normal) 17 | UIBarButtonItem.appearance().setTitleTextAttributes([.font: UIFont.AVQestFont(size: 17)], for: .normal) 18 | } 19 | 20 | fileprivate static func registerFont(bundle: Bundle, fontName: String, fontExtension: String) { 21 | guard let fontURL = bundle.url(forResource: fontName, withExtension: fontExtension), 22 | let fontDataProvider = CGDataProvider(url: fontURL as CFURL), 23 | let font = CGFont(fontDataProvider) else { 24 | fatalError("Couldn't create font from data") 25 | } 26 | 27 | var error: Unmanaged? 28 | 29 | CTFontManagerRegisterGraphicsFont(font, &error) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Packages/DesignSystem/Sources/DesignSystem/Font.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import SwiftUI 3 | 4 | public enum AppFont: String, CaseIterable { 5 | case AvQest 6 | } 7 | 8 | extension Font { 9 | public static func AVQestFont(textStyle: UIFont.TextStyle) -> Font { 10 | Font(UIFont.AVQestFont(size: UIFont.preferredFont(forTextStyle: textStyle).pointSize)) 11 | } 12 | } 13 | 14 | extension UIFont { 15 | public static func AVQestFont(size: CGFloat) -> UIFont { 16 | UIFont(name: AppFont.AvQest.rawValue, size: size)! 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Packages/DesignSystem/Sources/DesignSystem/Resources/AvQest.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/Packages/DesignSystem/Sources/DesignSystem/Resources/AvQest.ttf -------------------------------------------------------------------------------- /Packages/DesignSystem/Sources/DesignSystem/Resources/Colors.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Packages/DesignSystem/Sources/DesignSystem/Resources/Colors.xcassets/magic.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.749", 9 | "green" : "0.357", 10 | "red" : "0.361" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Packages/DesignSystem/Sources/DesignSystem/Resources/Colors.xcassets/rare.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.329", 9 | "green" : "0.714", 10 | "red" : "0.722" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Packages/DesignSystem/Sources/DesignSystem/Resources/Colors.xcassets/runic.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.000", 9 | "green" : "0.620", 10 | "red" : "0.867" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Packages/DesignSystem/Sources/DesignSystem/Resources/Colors.xcassets/set.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.024", 9 | "green" : "0.808", 10 | "red" : "0.114" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Packages/DesignSystem/Sources/DesignSystem/Resources/Colors.xcassets/unic.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.541", 9 | "green" : "0.761", 10 | "red" : "0.835" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Packages/DesignSystem/Tests/DesignSystemTests/DesignSystemTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | @testable import DesignSystem 3 | 4 | final class DesignSystemTests: XCTestCase { 5 | func testExample() throws { 6 | // This is an example of a functional test case. 7 | // Use XCTAssert and related functions to verify your tests produce the correct 8 | // results. 9 | XCTAssertEqual(DesignSystem().text, "Hello, World!") 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Packages/RunesData/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /.build 3 | /Packages 4 | /*.xcodeproj 5 | xcuserdata/ 6 | DerivedData/ 7 | .swiftpm/config/registries.json 8 | .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata 9 | .netrc 10 | -------------------------------------------------------------------------------- /Packages/RunesData/Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version: 5.7 2 | // The swift-tools-version declares the minimum version of Swift required to build this package. 3 | 4 | import PackageDescription 5 | 6 | let package = Package( 7 | name: "RunesData", 8 | platforms: [ 9 | .iOS(.v16) 10 | ], 11 | products: [ 12 | .library( 13 | name: "RunesData", 14 | targets: ["RunesData"]), 15 | ], 16 | targets: [ 17 | .target( 18 | name: "RunesData", 19 | dependencies: [], 20 | resources: [ 21 | .process("JSON/runes.json"), 22 | .process("JSON/runewords.json"), 23 | .process("JSON/runewords-description.json"), 24 | .process("JSON/cube-recipes.json"), 25 | ]), 26 | .testTarget( 27 | name: "RunesDataTests", 28 | dependencies: ["RunesData"]), 29 | ] 30 | ) 31 | -------------------------------------------------------------------------------- /Packages/RunesData/README.md: -------------------------------------------------------------------------------- 1 | # RunesData 2 | 3 | A description of this package. 4 | -------------------------------------------------------------------------------- /Packages/RunesData/Sources/RunesData/Activities/RunewordActivity.swift: -------------------------------------------------------------------------------- 1 | import ActivityKit 2 | 3 | @available(iOS 16.1, *) 4 | public struct RunewordActivityAttributes: ActivityAttributes { 5 | public struct ContentState: Codable, Hashable { 6 | public var runeword: Runeword 7 | 8 | public init(runeword: Runeword) { 9 | self.runeword = runeword 10 | } 11 | } 12 | 13 | public init() { } 14 | } 15 | 16 | @available(iOS 16.1, *) 17 | public class RunewordActivityManager { 18 | public static let shared = RunewordActivityManager() 19 | 20 | public var currentActivity: Activity? 21 | } 22 | -------------------------------------------------------------------------------- /Packages/RunesData/Sources/RunesData/JSON/runes.json: -------------------------------------------------------------------------------- 1 | [{ 2 | "name": "El", 3 | "tier": 1, 4 | "weapon": "+50 attack rating, +1 light", 5 | "armor": "+15 defense, +1 light", 6 | "shield": "+15 defense, +1 light", 7 | "countess": "normal and above", 8 | "hellforge": "normal", 9 | "treasure": "Act 2 Good and above", 10 | "cube": "Eld" 11 | }, { 12 | "name": "Eld", 13 | "tier": 1, 14 | "weapon": "+75% damage to undead, +50 attack rating vs. undead", 15 | "armor": "15% slower stamina drain", 16 | "shield": "+7% block chance", 17 | "countess": "normal and above", 18 | "hellforge": "normal", 19 | "treasure": "Act 2 Good and above", 20 | "cube": "Tir" 21 | }, { 22 | "name": "Tir", 23 | "tier": 1, 24 | "weapon": "+2 mana per kill", 25 | "armor": "+2 mana per kill", 26 | "shield": "+2 mana per kill", 27 | "countess": "normal and above", 28 | "hellforge": "normal", 29 | "treasure": "Act 2 Good and above", 30 | "cube": "Nef" 31 | }, { 32 | "name": "Nef", 33 | "tier": 1, 34 | "weapon": "knockback", 35 | "armor": "+30 defense vs. missiles", 36 | "shield": "+30 defense vs. missiles", 37 | "countess": "normal and above", 38 | "hellforge": "normal", 39 | "treasure": "Act 2 Good and above", 40 | "cube": "Eth" 41 | }, { 42 | "name": "Eth", 43 | "tier": 1, 44 | "weapon": "−25% target defense", 45 | "armor": "+15% mana regeneration", 46 | "shield": "+15% mana regeneration", 47 | "countess": "normal and above", 48 | "hellforge": "normal", 49 | "treasure": "Act 3 Good and above", 50 | "cube": "Ith" 51 | }, { 52 | "name": "Ith", 53 | "tier": 1, 54 | "weapon": "+9 maximum damage", 55 | "armor": "15% damage to mana", 56 | "shield": "15% damage to mana", 57 | "countess": "normal and above", 58 | "hellforge": "normal", 59 | "treasure": "Act 3 Good and above", 60 | "cube": "Tal" 61 | }, { 62 | "name": "Tal", 63 | "tier": 1, 64 | "weapon": "+75 poison damage over 5s", 65 | "armor": "30% poison resist", 66 | "shield": "30% poison resist", 67 | "countess": "normal and above", 68 | "hellforge": "normal", 69 | "treasure": "Act 3 Good and above", 70 | "cube": "Ral" 71 | }, { 72 | "name": "Ral", 73 | "tier": 1, 74 | "weapon": "+5–30 fire damage", 75 | "armor": "30% fire resist", 76 | "shield": "30% fire resistt", 77 | "countess": "normal and above", 78 | "hellforge": "normal", 79 | "treasure": "Act 3 Good and above", 80 | "cube": "Ort" 81 | }, { 82 | "name": "Ort", 83 | "tier": 1, 84 | "weapon": "+1–50 lightning damage", 85 | "armor": "30% lightning resist", 86 | "shield": "30% lightning resist", 87 | "countess": "nightmare and above", 88 | "hellforge": "normal", 89 | "treasure": "Act 4 Good and above", 90 | "cube": "Thul" 91 | }, { 92 | "name": "Thul", 93 | "tier": 1, 94 | "weapon": "+3–14 cold damage, 3s chill", 95 | "armor": "30% cold resist", 96 | "shield": "30% cold resist", 97 | "countess": "nightmare and above", 98 | "hellforge": "normal", 99 | "treasure": "Act 4 Good and above", 100 | "cube": "Amn" 101 | }, { 102 | "name": "Amn", 103 | "tier": 1, 104 | "weapon": "7% life leech", 105 | "armor": "14 damage returned", 106 | "shield": "14 damage returned", 107 | "countess": "nightmare and above", 108 | "hellforge": "normal", 109 | "treasure": "Act 4 Good and above", 110 | "cube": "Sol" 111 | }, { 112 | "name": "Sol", 113 | "tier": 2, 114 | "weapon": "+9 minimum damage", 115 | "armor": "damage reduced by 7", 116 | "shield": "damage reduced by 7", 117 | "countess": "nightmare and above", 118 | "hellforge": "nightmare", 119 | "treasure": "Act 4 Good and above", 120 | "cube": "Shael" 121 | }, { 122 | "name": "Shael", 123 | "tier": 2, 124 | "weapon": "20% increased attack speed", 125 | "armor": "20% faster hit recovery", 126 | "shield": "20% faster block rate", 127 | "countess": "nightmare and above", 128 | "hellforge": "nightmare", 129 | "treasure": "Act 5 Good and above", 130 | "cube": "Dol" 131 | }, { 132 | "name": "Dol", 133 | "tier": 2, 134 | "weapon": "hit causes flee +25%", 135 | "armor": "replenish life +7", 136 | "shield": "replenish life +7", 137 | "countess": "nightmare and above", 138 | "hellforge": "nightmare", 139 | "treasure": "Act 5 Good and above", 140 | "cube": "Hel" 141 | }, { 142 | "name": "Hel", 143 | "tier": 2, 144 | "weapon": "requirements −20%", 145 | "armor": "requirements −15%", 146 | "shield": "requirements −15%", 147 | "countess": "nightmare and above", 148 | "hellforge": "nightmare and hell", 149 | "treasure": "Act 1 (N) Good and above", 150 | "cube": "Io" 151 | }, { 152 | "name": "Io", 153 | "tier": 2, 154 | "weapon": "+10 vitality", 155 | "armor": "+10 vitality", 156 | "shield": "+10 vitality", 157 | "countess": "nightmare and above", 158 | "hellforge": "nightmare and hell", 159 | "treasure": "Act 1 (N) Good and above", 160 | "cube": "Lum" 161 | }, { 162 | "name": "Lum", 163 | "tier": 2, 164 | "weapon": "+10 energy", 165 | "armor": "+10 energy", 166 | "shield": "+10 energy", 167 | "countess": "hell", 168 | "hellforge": "nightmare and hell", 169 | "treasure": "Act 2 (N) Good and above", 170 | "cube": "Ko" 171 | }, { 172 | "name": "Ko", 173 | "tier": 2, 174 | "weapon": "+10 dexterity", 175 | "armor": "+10 dexterity", 176 | "shield": "+10 dexterity", 177 | "countess": "hell", 178 | "hellforge": "nightmare and hell", 179 | "treasure": "Act 2 (N) Good and above", 180 | "cube": "Fal" 181 | }, { 182 | "name": "Fal", 183 | "tier": 2, 184 | "weapon": "+10 strength", 185 | "armor": "+10 strength", 186 | "shield": "+10 strength", 187 | "countess": "hell", 188 | "hellforge": "nightmare and hell", 189 | "treasure": "Act 3 (N) Good and above", 190 | "cube": "Lem" 191 | }, { 192 | "name": "Lem", 193 | "tier": 2, 194 | "weapon": "75% extra gold", 195 | "armor": "75% extra gold", 196 | "shield": "75% extra gold", 197 | "countess": "hell", 198 | "hellforge": "nightmare and hell", 199 | "treasure": "Act 3 (N) Good and above", 200 | "cube": "Pul" 201 | }, { 202 | "name": "Pul", 203 | "tier": 2, 204 | "weapon": "+75% damage to demons, +100 attack rating vs. demons", 205 | "armor": "+30% defense", 206 | "shield": "+30% defense", 207 | "countess": "hell", 208 | "hellforge": "nightmare and hell", 209 | "treasure": "Act 4 (N) Good and above", 210 | "cube": "Um" 211 | }, { 212 | "name": "Um", 213 | "tier": 2, 214 | "weapon": "25% open wounds", 215 | "armor": "15% all resists", 216 | "shield": "15% all resists", 217 | "countess": "hell", 218 | "hellforge": "nightmare and hell", 219 | "treasure": "Act 4 (N) Good and above", 220 | "cube": "Mal" 221 | }, { 222 | "name": "Mal", 223 | "tier": 3, 224 | "weapon": "prevent monster heal", 225 | "armor": "magic damage reduced by 7", 226 | "shield": "magic damage reduced by 7", 227 | "countess": "hell", 228 | "hellforge": "hell", 229 | "treasure": "Act 5 (N) Good and above", 230 | "cube": "Ist" 231 | }, { 232 | "name": "Ist", 233 | "tier": 3, 234 | "weapon": "30% magic find", 235 | "armor": "25% magic find", 236 | "shield": "25% magic find", 237 | "countess": "hell", 238 | "hellforge": "hell", 239 | "treasure": "Act 5 (N) Good and above", 240 | "cube": "Gul" 241 | }, { 242 | "name": "Gul", 243 | "tier": 3, 244 | "weapon": "+20% AR", 245 | "armor": "5% maximum poison resist", 246 | "shield": "5% maximum poison resist", 247 | "countess": "no", 248 | "hellforge": "hell", 249 | "treasure": "Act 1 (H) Good and above", 250 | "cube": "Vex" 251 | }, { 252 | "name": "Vex", 253 | "tier": 3, 254 | "weapon": "7% mana leech", 255 | "armor": "5% maximum fire resist", 256 | "shield": "5% maximum fire resist", 257 | "countess": "no", 258 | "hellforge": "no", 259 | "treasure": "Act 1 (H) Good and above", 260 | "cube": "Ohm" 261 | }, { 262 | "name": "Ohm", 263 | "tier": 3, 264 | "weapon": "+50% enhanced damage", 265 | "armor": "5% maximum cold resist", 266 | "shield": "5% maximum cold resist", 267 | "countess": "no", 268 | "hellforge": "no", 269 | "treasure": "Act 2 (H) Good and above", 270 | "cube": "Lo" 271 | }, { 272 | "name": "Lo", 273 | "tier": 3, 274 | "weapon": "20% deadly strike", 275 | "armor": "5% maximum lightning resist", 276 | "shield": "5% maximum lightning resist", 277 | "countess": "no", 278 | "hellforge": "no", 279 | "treasure": "Act 2 (H) Good and above", 280 | "cube": "Sur" 281 | }, { 282 | "name": "Sur", 283 | "tier": 3, 284 | "weapon": "hit blinds target", 285 | "armor": "+5% mana", 286 | "shield": "+50 mana", 287 | "countess": "no", 288 | "hellforge": "no", 289 | "treasure": "Act 3 (H) Good and above", 290 | "cube": "Ber" 291 | }, { 292 | "name": "Ber", 293 | "tier": 3, 294 | "weapon": "20% crushing blow", 295 | "armor": "8% physical resist", 296 | "shield": "8% physical resist", 297 | "countess": "no", 298 | "hellforge": "no", 299 | "treasure": "Act 3 (H) Good and above", 300 | "cube": "Jah" 301 | }, { 302 | "name": "Jah", 303 | "tier": 3, 304 | "weapon": "ignore target defense", 305 | "armor": "+5% life", 306 | "shield": "+5% life", 307 | "countess": "no", 308 | "hellforge": "no", 309 | "treasure": "Act 4 (H) Good and above", 310 | "cube": "Cham" 311 | }, { 312 | "name": "Cham", 313 | "tier": 3, 314 | "weapon": "freeze target +3", 315 | "armor": "cannot be frozen", 316 | "shield": "cannot be frozen", 317 | "countess": "no", 318 | "hellforge": "no", 319 | "treasure": "Act 4 (H) Good and above", 320 | "cube": "Zod" 321 | }, { 322 | "name": "Zod", 323 | "tier": 3, 324 | "weapon": "indestructible", 325 | "armor": "indestructible", 326 | "shield": "indestructible", 327 | "countess": "no", 328 | "hellforge": "no", 329 | "treasure": "Act 5 (H) Good and above" 330 | }] 331 | -------------------------------------------------------------------------------- /Packages/RunesData/Sources/RunesData/JSON/runewords-description.json: -------------------------------------------------------------------------------- 1 | { 2 | "Ancient's Pledge":"\n+50% Enhanced Defense\nCold Resist +43%\nFire Resist +48%\nLightning Resist +48%\nPoison Resist +48%\n10% Damage Goes To Mana\n", 3 | "Black":"\n+120% Enhanced Damage\n40% Chance Of Crushing Blow\n+200 To Attack Rating\nAdds 3-14 Cold Damage - Cold Duration 3 Seconds\n+10 To Vitality\n15% Increased Attack Speed\nKnockback\nMagic Damage Reduced By 2\nLevel 4 Corpse Explosion (12 Charges)\n", 4 | "Fury":"\n+209% Enhanced Damage\n40% Increased Attack Speed\nPrevent Monster Heal\n66% Chance Of Open Wounds\n33% Deadly Strike\nIgnore Target's Defense\n-25% Target Defense\n20% Bonus To Attack Rating\n6% Life Stolen Per Hit\n+5 To Frenzy (Barbarian Only)\n", 5 | "Holy Thunder":"\n+60% Enhanced Damage\n-25% Target Defense\nAdds 5-30 Fire Damage\nAdds 21-110 Lightning Damage\n+75 Poison Damage Over 5 Seconds\n+10 To Maximum Damage\nLightning Resistance +60%\n+5 To Maximum Lightning Resistance\n+3 To Holy Shock (Paladin Only)\nLevel 7 Chain Lightning (60 Charges)\n", 6 | "Honor":"\n+160% Enhanced Damage\n+9 To Minimum Damage\n+9 To Maximum Damage\n25% Deadly Strike\n+250 To Attack Rating\n+1 to All Skills\n7% Life Stolen Per Hit\nReplenish Life +10\n+10 To Strength\n+1 To Light Radius\n+2 To Mana After Each Kill\n", 7 | "King's Grace":"\n+100% Enhanced Damage\n+100% Damage To Demons\n+50% Damage To Undead\nAdds 5-30 Fire Damage\nAdds 3-14 Cold Damage - 3 Second Duration\n+150 To Attack Rating\n+100 To Attack Rating Against Demons\n+100 To Attack Rating Against Undead\n7% Life Stolen Per Hit\n", 8 | "Leaf":"\nAdds 5-30 Fire Damage\n+3 To Fire Skills\n+3 To Fire Bolt (Sorceress Only)\n+3 To Inferno (Sorceress Only)\n+3 To Warmth (Sorceress Only)\n+2 To Mana After Each Kill\n+ (2 Per Character Level) +2-198 To Defense (Based On Character Level)\nCold Resist +33%\n", 9 | "Lionheart":"\n+20% Enhanced Damage\nRequirements -15%\n+25 To Strength\n+10 To Energy\n+20 To Vitality\n+15 To Dexterity\n+50 To Life\nAll Resistances +30\n", 10 | "Lore":"\n+1 To All Skill Levels\n+10 To Energy\n+2 To Mana After Each Kill\nLightning Resist +30%\nDamage Reduced By 7\n+2 To Light Radius\n", 11 | "Malice":"\n+33% Enhanced Damage\n+9 To Maximum Damage\n100% Chance Of Open Wounds\n-25% Target Defense\n-100 To Monster Defense Per Hit\nPrevent Monster Heal\n+50 To Attack Rating\nDrain Life -5\n", 12 | "Melody":"\n+50% Enhanced Damage\n+300% Damage To Undead\n+3 To Bow and Crossbow Skills (Amazon Only)\n+3 To Critical Strike (Amazon Only)\n+3 To Dodge (Amazon Only)\n+3 To Slow Missiles (Amazon Only)\n20% Increased Attack Speed\n+10 To Dexterity\nKnockback\n", 13 | "Memory":"\n+3 to Sorceress Skill Levels\n33% Faster Cast Rate\nIncrease Maximum Mana 20%\n+3 Energy Shield (Sorceress Only)\n+2 Static Field (Sorceress Only)\n+10 To Energy\n+10 To Vitality\n+9 To Minimum Damage\n-25% Target Defense\nMagic Damage Reduced By 7\n+50% Enhanced Defense\n", 14 | "Nadir":"\n+50% Enhanced Defense\n+10 Defense\n+30 Defense vs. Missile\nLevel 13 Cloak of Shadows (9 Charges)\n+2 To Mana After Each Kill\n+5 To Strength\n-33% Extra Gold From Monsters\n-3 To Light Radius\n", 15 | "Radiance":"\n+75% Enhanced Defense\n+30 Defense Vs. Missile\n+10 To Energy\n+10 To Vitality\n15% Damage Goes To Mana\nMagic Damage Reduced By 3\n+33 To Mana\nDamage Reduced By 7\n+5 To Light Radius\n", 16 | "Rhyme":"\n20% Increased Chance of Blocking\n40% Faster Block Rate\nAll Resistances +25\nRegenerate Mana 15%\nCannot Be Frozen\n50% Extra Gold From Monsters\n25% Better Chance Of Getting Magic Items\n", 17 | "Silence":"\n200% Enhanced Damage\n+75% Damage To Undead\nRequirements -20%\n20% Increased Attack Speed\n+50 To Attack Rating Against Undead\n+2 To All Skills\nAll Resistances +75\n20% Faster Hit Recovery\n11% Mana Stolen Per Hit\nHit Causes Monster To Flee 25%\nHit Blinds Target +33\n+2 To Mana After Each Kill\n30% Better Chance Of Getting Magic Items\n", 18 | "Smoke":"\n+75% Enhanced Defense\n+280 Defense Vs. Missile\nAll Resistances +50\n20% Faster Hit Recovery\nLevel 6 Weaken (18 Charges)\n+10 To Energy\n-1 To Light Radius\n", 19 | "Stealth":"\nMagic Damage Reduced By 3\n+6 To Dexterity\n+15 To Maximum Stamina\nPoison Resist +30%\nRegenerate Mana 15%\n25% Faster Run/Walk\n25% Faster Cast Rate\n25% Faster Hit Recovery\n", 20 | "Steel":"\n20% Enhanced Damage\n+3 To Minimum Damage\n+3 To Maximum Damage\n+50 To Attack Rating\n50% Chance Of Open Wounds\n25% Increased Attack Speed\n+2 To Mana After Each Kill\n+1 To Light Radius\n", 21 | "Strength":"\n35% Enhanced Damage\n25% Chance Of Crushing Blow\n7% Life Stolen Per Hit\n+2 To Mana After Each Kill\n+20 To Strength\n+10 To Vitality\n", 22 | "Venom":"\nHit Causes Monster To Flee 25%\nPrevent Monster Heal\nIgnore Target's Defense\n7% Mana Stolen Per Hit\nLevel 15 Poison Explosion (27 Charges)\nLevel 13 Poison Nova (11 Charges)\n+273 Poison Damage Over 6 seconds\n", 23 | "Wealth":"\n300% Extra Gold From Monsters\n100% Better Chance Of Getting Magic Items\n+2 To Mana After Each Kill\n+10 To Dexterity\n", 24 | "White":"\nHit Causes Monster To Flee 25%\n+10 To Vitality\n+3 To Poison And Bone Skills (Necromancer Only)\n+3 To Bone Armor (Necromancer Only)\n+2 To Bone Spear (Necromancer Only)\n+4 To Skeleton Mastery (Necromancer Only)\nMagic Damage Reduced By 4\n20% Faster Cast Rate\n+13 To Mana\n", 25 | "Zephyr":"\n+33% Enhanced Damage\n+66 To Attack Rating\nAdds 1-50 Lightning Damage\n-25% Target Defense\n+25 Defense\n25% Faster Run/Walk\n25% Increased Attack Speed\n7% Chance To Cast Level 1 Twister When Struck\n", 26 | "Beast":"\nLevel 9 Fanaticism Aura When Equipped\n+40% Increased Attack Speed\n+240-270% Enhanced Damage (varies)\n20% Chance of Crushing Blow\n25% Chance of Open Wounds\n+3 To Werebear\n+3 To Lycanthropy\nPrevent Monster Heal\n+25-40 To Strength (varies)\n+10 To Energy\n+2 To Mana After Each Kill\nLevel 13 Summon Grizzly (5 Charges)\n", 27 | "Bramble":"\nLevel 15-21 Thorns Aura When Equipped (varies)\n+50% Faster Hit Recovery\n+25-50% To Poison Skill Damage (varies)\n+300 Defense\nIncrease Maximum Mana 5%\nRegenerate Mana 15%\n+5% To Maximum Cold Resist\nFire Resist +30%\nPoison Resist +100%\n+13 Life After Each Kill\nLevel 13 Spirit of Barbs (33 Charges)\n", 28 | "Breath of the Dying":"\n50% Chance To Cast Level 20 Poison Nova When You Kill An Enemy\nIndestructible\n+60% Increased Attack Speed\n+350-400% Enhanced Damage (varies)\n+200% Damage To Undead\n-25% Target Defense\n+50 To Attack Rating\n+50 To Attack Rating Against Undead\n7% Mana Stolen Per Hit\n12-15% Life Stolen Per Hit (varies)\nPrevent Monster Heal\n+30 To All Attributes\n+1 To Light Radius\nRequirements -20%\n", 29 | "Call to Arms":"\n+1 To All Skills\n+40% Increased Attack Speed\n+250-290% Enhanced Damage (varies)\nAdds 5-30 Fire Damage\n7% Life Stolen Per Hit\n+2-6 To Battle Command (varies)*\n+1-6 To Battle Orders (varies)*\n+1-4 To Battle Cry (varies)*\nPrevent Monster Heal\nReplenish Life +12\n30% Better Chance of Getting Magic Items\n", 30 | "Chaos":"\n9% Chance To Cast Level 11 Frozen Orb On Striking\n11% Chance To Cast Level 9 Charged Bolt On Striking\n+35% Increased Attack Speed\n+290-340% Enhanced Damage (varies)\nAdds 216-471 Magic Damage\n25% Chance of Open Wounds\n+1 To Whirlwind\n+10 To Strength\n+15 Life After Each Demon Kill\n", 31 | "Chains of Honor":"\n+2 To All Skills\n+200% Damage To Demons\n+100% Damage To Undead\n8% Life Stolen Per Hit\n+70% Enhanced Defense\n+20 To Strength\nReplenish Life +7\nAll Resistances +65\nDamage Reduced By 8%\n25% Better Chance of Getting Magic Items\n", 32 | "Crescent Moon":"\n10% Chance To Cast Level 17 Chain Lightning On Striking\n7% Chance To Cast Level 13 Static Field On Striking\n+20% Increased Attack Speed\n+180-220% Enhanced Damage (varies)\nIgnore Target's Defense\n-35% To Enemy Lightning Resistance\n25% Chance of Open Wounds\n+9-11 Magic Absorb (varies)\n+2 To Mana After Each Kill\nLevel 18 Summon Spirit Wolf (30 Charges)\n", 33 | "Delirium":"\n1% Chance To Cast Level 50 Delirium* (morph) When Struck\n6% Chance To Cast Level 14 Mind Blast When Struck\n14% Chance To Cast Level 13 Terror When Struck\n11% Chance To Cast Level 18 Confuse On Striking\n+2 To All Skills\n+261 Defense\n+10 To Vitality\n50% Extra Gold From Monsters\n25% Better Chance of Getting Magic Items\nLevel 17 Attract (60 Charges)\n", 34 | "Doom":"\n5% Chance To Cast Level 18 Volcano On Striking\nLevel 12 Holy Freeze Aura When Equipped\n+2 To All Skills\n+45% Increased Attack Speed\n+330-370% Enhanced Damage (varies)\n-(40-60)% To Enemy Cold Resistance (varies)\n20% Deadly Strike\n25% Chance of Open Wounds\nPrevent Monster Heal\nFreezes Target +3\nRequirements -20%\n", 35 | "Duress":"\n+40% Faster Hit Recovery\n+10-20% Enhanced Damage (varies)\nAdds 37-133 Cold Damage 2 sec. Duration (Normal)\n15% Chance of Crushing Blow\n33% Chance of Open Wounds\n+150-200% Enhanced Defense (varies)\n-20% Slower Stamina Drain\nCold Resist +45%\nLightning Resist +15%\nFire Resist +15%\nPoison Resist +15%\n", 36 | "Enigma":"\n+2 To All Skills\n+45% Faster Run/Walk\n+1 To Teleport\n+750-775 Defense (varies)\n+ (0.75 Per Character Level) +0-74 To Strength (Based On Character Level)\nIncrease Maximum Life 5%\nDamage Reduced By 8%\n+14 Life After Each Kill\n15% Damage Taken Goes To Mana\n+ (1 Per Character Level) +1-99% Better Chance of Getting Magic Items (Based On Character Level)\n", 37 | "Eternity":"\nIndestructible\n+260-310% Enhanced Damage (varies)\n+9 To Minimum Damage\n7% Life Stolen Per Hit\n20% Chance of Crushing Blow\nHit Blinds Target\nSlows Target By 33%\nRegenerate Mana 16%\nReplenish Life +16\nCannot Be Frozen\n30% Better Chance Of Getting Magic Items\nLevel 8 Revive (88 Charges)\n", 38 | "Exile":"\n15% Chance To Cast Level 5 Life Tap On Striking\nLevel 13-16 Defiance Aura When Equipped (varies)\n+2 To Offensive Auras (Paladin Only)\n+30% Faster Block Rate\nFreezes Target\n+220-260% Enhanced Defense (varies)\nReplenish Life +7\n+5% To Maximum Cold Resist\n+5% To Maximum Fire Resist\n25% Better Chance Of Getting Magic Items\nRepairs 1 Durability in 4 Seconds\n", 39 | "Famine":"\n+30% Increased Attack Speed\n+320-370% Enhanced Damage (varies)\nIgnore Target's Defense\nAdds 180-200 Magic Damage\nAdds 50-200 Fire Damage\nAdds 51-250 Lightning Damage\nAdds 50-200 Cold Damage\n12% Life Stolen Per Hit\nPrevent Monster Heal\n+10 To Strength\n", 40 | "Gloom":"\n15% Chance To Cast Level 3 Dim Vision When Struck\n+10% Faster Hit Recovery\n+200-260% Enhanced Defense (varies)\n+10 To Strength\nAll Resistances +45\nHalf Freeze Duration\n5% Damage Taken Goes To Mana\n-3 To Light Radius\n", 41 | "Hand of Justice":"\n100% Chance To Cast Level 36 Blaze When You Level-Up\n100% Chance To Cast Level 48 Meteor When You Die\nLevel 16 Holy Fire Aura When Equipped\n+33% Increased Attack Speed\n+280-330% Enhanced Damage (varies)\nIgnore Target's Defense\n7% Life Stolen Per Hit\n-20% To Enemy Fire Resistance\n20% Deadly Strike\nHit Blinds Target\nFreezes Target +3\n", 42 | "Heart of the Oak":"\n+3 To All Skills\n+40% Faster Cast Rate\n+75% Damage To Demons\n+100 To Attack Rating Against Demons\nAdds 3-14 Cold Damage, 3 sec. Duration (Normal)\n7% Mana Stolen Per Hit\n+10 To Dexterity\nReplenish Life +20\nIncrease Maximum Mana 15%\nAll Resistances +30-40 (varies)\nLevel 4 Oak Sage (25 Charges)\nLevel 14 Raven (60 Charges)\n", 43 | "Kingslayer":"\n+30% Increased Attack Speed\n+230-270% Enhanced Damage (varies)\n-25% Target Defense\n20% Bonus To Attack Rating\n33% Chance of Crushing Blow\n50% Chance of Open Wounds\n+1 To Vengeance\nPrevent Monster Heal\n+10 To Strength\n40% Extra Gold From Monsters\n", 44 | "Passion":"\n+25% Increased Attack Speed\n+160-210% Enhanced Damage (varies)\n50-80% Bonus To Attack Rating (varies)\n+75% Damage To Undead\n+50 To Attack Rating Against Undead\nAdds 1-50 Lightning Damage\n+1 To Berserk\n+1 To Zeal\nHit Blinds Target +10\nHit Causes Monster To Flee 25%\n75% Extra Gold From Monsters\nLevel 3 Heart of Wolverine (12 Charges)\n", 45 | "Prudence":"\n+25% Faster Hit Recovery\n+140-170% Enhanced Defense (varies)\nAll Resistances +25-35 (varies)\nDamage Reduced by 3\nMagic Damage Reduced by 17\n+2 To Mana After Each Kill\n+1 To Light Radius\nRepairs Durability 1 In 4 Seconds\n", 46 | "Sanctuary":"\n+20% Faster Hit Recovery\n+20% Faster Block Rate\n20% Increased Chance of Blocking\n+130-160% Enhanced Defense (varies)\n+250 Defense vs. Missile\n+20 To Dexterity\nAll Resistances +50-70 (varies)\nMagic Damage Reduced By 7\nLevel 12 Slow Missiles (60 Charges)\n", 47 | "Splendor":"\n+1 To All Skills\n+10% Faster Cast Rate\n+20% Faster Block Rate\n+60-100% Enhanced Defense (varies)\n+10 To Energy\nRegenerate Mana 15%\n50% Extra Gold From Monsters\n20% Better Chance of Getting Magic Items\n+3 To Light Radius\n", 48 | "Stone":"\n+60% Faster Hit Recovery\n+250-290% Enhanced Defense (varies)\n+300 Defense Vs. Missile\n+16 To Strength\n+16 To Vitality\n+10 To Energy\nAll Resistances +15\nLevel 16 Molten Boulder (80 Charges)\nLevel 16 Clay Golem (16 Charges)\n", 49 | "Wind":"\n10% Chance To Cast Level 9 Tornado On Striking\n+20% Faster Run/Walk\n+40% Increased Attack Speed\n+15% Faster Hit Recovery\n+120-160% Enhanced Damage (varies)\n-50% Target Defense\n+50 To Attack Rating\nHit Blinds Target\n+1 To Light Radius\nLevel 13 Twister (127 Charges)\n", 50 | "Brand":"\n35% Chance To Cast Level 14 Amplify Damage When Struck\n100% Chance To Cast Level 18 Bone Spear On Striking\n+260-340% Enhanced Damage (varies)\nIgnore Target's Defense\n20% Bonus to Attack Rating\n+280-330% Damage To Demons (varies)\n\n20% Deadly Strike\nPrevent Monster Heal\nKnockback\nFires Explosive Arrows or Bolts (15)\n", 51 | "Death":"\n100% Chance To Cast Level 44 Chain Lightning When You Die\n25% Chance To Cast Level 18 Glacial Spike On Attack\nIndestructible\n+300-385% Enhanced Damage (varies)*\n20% Bonus To Attack Rating\n+50 To Attack Rating\nAdds 1-50 Lightning Damage\n7% Mana Stolen Per Hit\n50% Chance of Crushing Blow\n+(0.5 per Character Level) 0.5-49.5% Deadly Strike (Based on Character Level)\n+1 To Light Radius\nLevel 22 Blood Golem(15 Charges)\nRequirements -20%\n", 52 | "Destruction":"\n23% Chance To Cast Level 12 Volcano On Striking\n5% Chance To Cast Level 23 Molten Boulder On Striking\n100% Chance To Cast level 45 Meteor When You Die\n15% Chance To Cast Level 22 Nova On Attack\n+350% Enhanced Damage\nIgnore Target's Defense\nAdds 100-180 Magic Damage\n7% Mana Stolen Per Hit\n20% Chance Of Crushing Blow\n20% Deadly Strike\nPrevent Monster Heal\n+10 To Dexterity\n", 53 | "Dragon":"\n20% Chance to Cast Level 18 Venom When Struck\n12% Chance To Cast Level 15 Hydra On Striking\nLevel 14 Holy Fire Aura When Equipped\n+360 Defense\n+230 Defense Vs. Missile\n+3-5 To All Attributes (varies)\n+0.375-37.125 To Strength (Based on Character Level)\nIncrease Maximum Mana 5% (Armor Only)\n+50 To Mana (Shields Only)\n+5% To Maximum Lightning Resist\nDamage Reduced by 7\n", 54 | "Dream":"\n10% Chance To Cast Level 15 Confuse When Struck\nLevel 15 Holy Shock Aura When Equipped\n+20-30% Faster Hit Recovery (varies)\n+30% Enhanced Defense\n+150-220 Defense (varies)\n+10 To Vitality\nIncrease Maximum Life 5% (Helms Only)\n+50 To Life (Shields Only)\n+0.625-61.875 To Mana (Based On Character Level)\nAll Resistances +5-20 (varies)\n12-25% Better Chance of Getting Magic Items (varies)\n", 55 | "Edge":"\nLevel 15 Thorns Aura When Equipped\n+35% Increased Attack Speed\n+320-380% Damage To Demons (varies)\n+280% Damage To Undead\n+75 Poison Damage Over 5 Seconds\n7% Life Stolen Per Hit\nPrevent Monster Heal\n+5-10 To All Attributes (varies)\n+2 To Mana After Each Kill\nReduces All Vendor Prices 15%!!!\n", 56 | "Faith":"\nLevel 12-15 Fanaticism Aura When Equipped (varies)\n+1-2 To All Skills (varies)\n+330% Enhanced Damage\nIgnore Target's Defense\n300% Bonus To Attack Rating\n+75% Damage To Undead\n+50 To Attack Rating Against Undead\n+120 Fire Damage\nAll Resistances +15\n10% Reanimate As: Returned\n75% Extra Gold From Monsters\n", 57 | "Fortitude":"\n#### Weapons\n20% Chance To Cast Level 15 Chilling Armor when Struck\n+25% Faster Cast Rate\n+300% Enhanced Damage\n+9 To Minimum Damage\n+50 To Attack Rating\n20% Deadly Strike\nHit Causes Monster To Flee 25%\n+200% Enhanced Defense\n+X To Life (Based on Character Level)*\nAll Resistances +25-30 (varies)\n12% Damage Taken Goes To Mana\n+1 To Light Radius\n\n#### Body Armor\n20% Chance To Cast Level 15 Chilling Armor when Struck\n+25% Faster Cast Rate\n+300% Enhanced Damage\n+200% Enhanced Defense\n+15 Defense\n+X To Life (Based on Character Level)*\nReplenish Life +7\n+5% To Maximum Lightning Resist\nAll Resistances +25-30 (varies)\nDamage Reduced By 7\n12% Damage Taken Goes To Mana\n+1 To Light Radius\n", 58 | "Grief":"\n35% Chance To Cast Level 15 Venom On Striking\n+30-40% Increased Attack Speed (varies)\nDamage +340-400 (varies)\nIgnore Target's Defense\n-25% Target Defense\n+(1.875 per character level) 1.875-185.625% Damage To Demons (Based on Character Level) \nAdds 5-30 Fire Damage\n-20-25% To Enemy Poison Resistance (varies)\n20% Deadly Strike\nPrevent Monster Heal\n+2 To Mana After Each Kill\n+10-15 Life After Each Kill (varies)\n", 59 | "Harmony":"\nLevel 10 Vigor Aura When Equipped\n+200-275% Enhanced Damage (varies)\n+9 To Minimum Damage\n+9 To Maximum Damage\nAdds 55-160 Lightning Damage\nAdds 55-160 Fire Damage\nAdds 55-160 Cold Damage\n+2-6 To Valkyrie (varies)\n+10 To Dexterity\nRegenerate Mana 20%\n+2 To Mana After Each Kill\n+2 To Light Radius\nLevel 20 Revive (25 Charges)\n", 60 | "Ice":"\n100% Chance To Cast Level 40 Blizzard When You Level-up\n25% Chance To Cast Level 22 Frost Nova On Striking\nLevel 18 Holy Freeze Aura When Equipped\n+20% Increased Attack Speed\n+140-210% Enhanced Damage (varies)\nIgnore Target's Defense\n+25-30% To Cold Skill Damage (varies)\n-20% To Enemy Cold Resistance\n7% Life Stolen Per Hit\n20% Deadly Strike\n3.125-309.375 Extra Gold From Monsters (Based on Character Level)\n", 61 | "Infinity":"\n50% Chance To Cast Level 20 Chain Lightning When You Kill An Enemy\nLevel 12 Conviction Aura When Equipped\n+35% Faster Run/Walk\n+255-325% Enhanced Damage (varies)\n-(45-55)% To Enemy Lightning Resistance (varies)\n40% Chance of Crushing Blow\nPrevent Monster Heal\n0.5-49.5 To Vitality (Based on Character Level)\n30% Better Chance of Getting Magic Items\nLevel 21 Cyclone Armor (30 Charges)\n", 62 | "Insight":"\nLevel 12-17 Meditation Aura When Equipped (varies)\n+35% Faster Cast Rate\n+200-260% Enhanced Damage (varies)\n+9 To Minimum Damage\n180-250% Bonus to Attack Rating (varies)\nAdds 5-30 Fire Damage\n+75 Poison Damage Over 5 Seconds\n+1-6 To Critical Strike (varies)\n+5 To All Attributes\n+2 To Mana After Each Kill\n23% Better Chance of Getting Magic Items\n", 63 | "Last Wish":"\n6% Chance To Cast Level 11 Fade When Struck\n10% Chance To Cast Level 18 Life Tap On Striking\n20% Chance To Cast Level 20 Charged Bolt On Attack\nLevel 17 Might Aura When Equipped\n+330-375% Enhanced Damage (varies)\nIgnore Target's Defense\n60-70% Chance of Crushing Blow (varies)\nPrevent Monster Heal\nHit Blinds Target\n+(0.5 per character level) 0.5-49.5% Chance of Getting Magic Items (Based on Character Level) \n", 64 | "Lawbringer":"\n20% Chance To Cast Level 15 Decrepify On Striking\nLevel 16-18 Sanctuary Aura When Equipped (varies)\n-50% Target Defense\nAdds 150-210 Fire Damage\nAdds 130-180 Cold Damage\n7% Life Stolen Per Hit\nSlain Monsters Rest In Peace\n+200-250 Defense Vs. Missile (varies)\n+10 To Dexterity\n75% Extra Gold From Monsters\n", 65 | "Oath":"\n30% Chance To Cast Level 20 Bone Spirit On Striking\nIndestructible\n+50% Increased Attack Speed\n+210-340% Enhanced Damage (varies)\n+75% Damage To Demons\n+100 To Attack Rating Against Demons\nPrevent Monster Heal\n+10 To Energy\n+10-15 Magic Absorb (varies)\nLevel 16 Heart Of Wolverine (20 Charges)\nLevel 17 Iron Golem (14 Charges)\n", 66 | "Obedience":"\n30% Chance To Cast Level 21 Enchant When You Kill An Enemy\n40% Faster Hit Recovery\n+370% Enhanced Damage\n-25% Target Defense\nAdds 3-14 Cold Damage 3 Second Duration (Normal)\n-25% To Enemy Fire Resistance\n40% Chance of Crushing Blow\n+200-300 Defense (varies)\n+10 To Strength\n+10 To Dexterity\nAll Resistances +20-30 (varies)\nRequirements -20%\n", 67 | "Phoenix":"\n#### Weapons\n100% Chance To Cast level 40 Blaze When You Level-up\n40% Chance To Cast Level 22 Firestorm On Striking\nLevel 10-15 Redemption Aura When Equipped (varies)\n+350-400% Enhanced Damage (varies)\nIgnores Target's Defense\n14% Mana Stolen Per Hit\n-28% To Enemy Fire Resistance\n20% Deadly Strike\n+350-400 Defense Vs. Missile (varies)\n+15-21 Fire Absorb (varies)\n\n#### Shields\n100% Chance To Cast level 40 Blaze When You Level-up\n40% Chance To Cast Level 22 Firestorm On Striking\nLevel 10-15 Redemption Aura When Equipped (varies)\n+350-400 Defense Vs. Missile (varies)\n+350-400% Enhanced Damage (varies)\n-28% To Enemy Fire Resistance\n+50 To Life\n+5% To Maximum Lightning Resist\n+10% To Maximum Fire Resist\n+15-21 Fire Absorb (varies)\n", 68 | "Pride":"\n25% Chance To Cast Level 17 Fire Wall When Struck\nLevel 16-20 Concentration Aura When Equipped (varies)\n260-300% Bonus To Attack Rating (varies)\n+1-99% Damage To Demons (Based on Character Level)\nAdds 50-280 Lightning Damage\n20% Deadly Strike\nHit Blinds Target\nFreezes Target +3\n+10 To Vitality\nReplenish Life +8\n1.875-185.625% Extra Gold From Monsters (Based on Character Level)\n", 69 | "Rift":"\n20% Chance To Cast Level 16 Tornado On Striking\n16% Chance To Cast Level 21 Frozen Orb On Attack\n20% Bonus To Attack Rating\nAdds 160-250 Magic Damage\nAdds 60-180 Fire Damage\n+5-10 To All Stats (varies)\n+10 To Dexterity\n38% Damage Taken Goes To Mana\n75% Extra Gold From Monsters\nLevel 15 Iron Maiden (40 Charges)\nRequirements -20%\n", 70 | "Spirit":"\n#### Swords\n+2 To All Skills\n+25-35% Faster Cast Rate (varies)\n+55% Faster Hit Recovery\nAdds 1-50 Lightning Damage\nAdds 3-14 Cold Damage 3 Second Duration (Normal)\n+75 Poison Damage Over 5 Seconds\n7% Life Stolen Per Hit\n+250 Defense Vs. Missile\n+22 To Vitality\n+89-112 To Mana (varies)\n+3-8 Magic Absorb (varies)\n\n#### Shields\n+2 To All Skills\n+25-35% Faster Cast Rate (varies)\n+55% Faster Hit Recovery\n+250 Defense Vs. Missile\n+22 To Vitality\n+89-112 To Mana (varies)\nCold Resist +35%\nLightning Resist +35%\nPoison Resist +35%\n+3-8 Magic Absorb (varies)\nAttacker Takes Damage of 14\n", 71 | "Voice of Reason":"\n15% Chance To Cast Level 13 Frozen Orb On Striking\n18% Chance To Cast Level 20 Ice Blast On Striking\n+50 To Attack Rating\n+220-350% Damage To Demons\n+355-375% Damage To Undead (varies)\n+50 To Attack Rating Against Undead\nAdds 100-220 Cold Damage\n-24% To Enemy Cold Resistance\n+10 To Dexterity\nCannot Be Frozen\n75% Extra Gold From Monsters\n+1 To Light Radius\n", 72 | "Wrath":"\n30% Chance To Cast Level 1 Decrepify On Striking\n5% Chance To Cast Level 10 Life Tap On Striking\n+375% Damage To Demons\n+100 To Attack Rating Against Demons\n+250-300% Damage To Undead (varies)\nAdds 85-120 Magic Damage\nAdds 41-240 Lightning Damage\n20% Chance of Crushing Blow\nPrevent Monster Heal\n+10 To Energy\nCannot Be Frozen\n", 73 | "Bone":"\n15% Chance To Cast level 10 Bone Armor When Struck\n15% Chance To Cast level 10 Bone Spear On Striking\n+2 To Necromancer Skill Levels\n+100-150 To Mana (varies)\nAll Resistances +30\nDamage Reduced By 7\n", 74 | "Enlightenment":"\n5% Chance To Cast Level 15 Blaze When Struck\n5% Chance To Cast level 15 Fire Ball On Striking\n+2 To Sorceress Skill Levels\n+1 To Warmth\n+30% Enhanced Defense\nFire Resist +30%\nDamage Reduced By 7\n", 75 | "Myth":"\n3% Chance To Cast Level 1 Howl When Struck\n10% Chance To Cast Level 1 Taunt On Striking\n+2 To Barbarian Skill Levels\n+30 Defense Vs. Missile\nReplenish Life +10\nAttacker Takes Damage of 14\nRequirements -15%\n", 76 | "Peace":"\n4% Chance To Cast Level 5 Slow Missiles When Struck\n2% Chance To Cast level 15 Valkyrie On Striking\n+2 To Amazon Skill Levels\n+20% Faster Hit Recovery\n+2 To Critical Strike\nCold Resist +30%\nAttacker Takes Damage of 14\n", 77 | "Principle":"\n100% Chance To Cast Level 5 Holy Bolt On Striking\n+2 To Paladin Skill Levels\n15% Slower Stamina Drain\n+5% To Maximum Poison Resist\nFire Resist +30%\n", 78 | "Rain":"\n5% Chance To Cast Level 15 Cyclone Armor When Struck\n5% Chance To Cast Level 15 Twister On Striking\n+2 To Druid Skills\n+100-150 To Mana (varies)\nLightning Resist +30%\nMagic Damage Reduced By 7\n15% Damage Taken Goes to Mana\n", 79 | "Treachery":"\n5% Chance To Cast Level 15 Fade When Struck\n25% Chance To Cast level 15 Venom On Striking\n+2 To Assassin Skills\n+45% Increased Attack Speed\n+20% Faster Hit Recovery\nCold Resist +30%\n50% Extra Gold From Monsters\n", 80 | "Plague":"\n20% Chance to Cast level 12 Lower Resist when struck\n25% Chance to Cast level 15 Poison Nova on striking\nLevel 13-17 Cleansing Aura When Equipped (varies)\n+1-2 All Skills\n+20% Increased Attack Speed\n+220-320% Enhanced Damage (varies)\n-23% To Enemy Poison Resistance\n0.3% (0-29.7) Deadly Strike (Based on Character Level)\n+25% Chance of Open Wounds\nFreezes Target +3\n", 81 | "Pattern":"\n+30% Faster Block Rate\n+40-80% Enhanced Damage (varies)\n10% Bonus to Attack Rating\nAdds 17-62 Fire Damage\nAdds 1-50 Lightning Damage\nAdds 3-14 Cold Damage\n+75 Poison Damage Over 5 Seconds\n+6 to Strength\n+6 to Dexterity\nAll Resistances +15\n", 82 | "Unbending Will":"\n18% Chance to cast Level 18 Taunt on striking\n+3 To Combat Skills (Barbarian Only)\n+20-30% Increased Attack Speed (varies)\n+300-350% Enhanced Damage (varies)\n+9 To Maximum Damage\n+50 To Attack Rating\n+75% Damage to Undead\n+50 Attack Rating Against Undead\n8-10% Life Stolen Per Hit (varies)\nPrevent Monster Heal\n+10 To Strength\n+10 To Vitality\nDamage Reduced By 8\n+1 Light Radius\nRequirements -20%\n", 83 | "Wisdom":"\n+33% Piercing Attack\n+15-25% Bonus to Attack Rating (varies)\n4-8% Mana Stolen Per Hit (varies)\n+30% Enhanced Defense\n+10 Energy\n15% Slower Stamina Drain\nCannot Be Frozen\n+5 Mana After Each Kill\n15% Damage Taken Goes to Mana\n", 84 | "Obsession":"\nIndestructible\n24% Chance to cast level 10 Weaken when struck\n+4 To All Skills\n+65% Faster Cast Rate\n+60% Faster Hit Recovery\nKnockback\n+10 To Vitality\n+10 To Energy\nIncrease Maximum Life 15-25% (varies)\nRegenerate Mana 15-30% (varies)\nAll Resistances +60-70 (varies)\n75% Extra Gold from Monsters\n30% Better Chance of Getting Magic Items\n", 85 | "Flickering Flame":"\nLevel 4-8 Resist Fire Aura When Equipped (varies)\n+3 To Fire Skills\n-10-15% to Enemy Fire Resistance (varies)\n+30% Enhanced Defense\n+30 Defense Vs. Missile\n+50-75 To Mana (varies)\nHalf Freeze Duration\n+5% To Maximum Fire Resist\nPoison Length Reduced by 50%\n", 86 | "Mist":"\nLevel 8-12 Concentration Aura When Equipped (varies)\n+3 To All Skills\n20% Increased Attack Speed\n+100% Piercing Attack\n+325-375% Enhanced Damage (varies)\n+9 To Maximum Damage\n20% Bonus to Attack Rating\nAdds 3-14 Cold Damage\nFreeze Target +3\n+24 Vitality\nAll Resistances +40\n" 87 | } 88 | -------------------------------------------------------------------------------- /Packages/RunesData/Sources/RunesData/JSON/runewords.json: -------------------------------------------------------------------------------- 1 | [{ 2 | "title": "Ancient's Pledge", 3 | "runes": ["Ral", "Ort", "Tal"], 4 | "level": 21, 5 | "types": ["Shields"] 6 | }, 7 | { 8 | "title": "Black", 9 | "runes": ["Thul", "Io", "Nef"], 10 | "level": 35, 11 | "types": ["Clubs", "Hammers", "Maces"] 12 | }, 13 | { 14 | "title": "Fury", 15 | "runes": ["Jah", "Gul", "Eth"], 16 | "level": 65, 17 | "types": ["Melee Weapons"] 18 | }, 19 | { 20 | "title": "Holy Thunder", 21 | "runes": ["Eth", "Ral", "Ort", "Tal"], 22 | "level": 21, 23 | "types": ["Scepters"] 24 | }, 25 | { 26 | "title": "Honor", 27 | "runes": ["Amn", "El", "Ith", "Tir", "Sol"], 28 | "level": 27, 29 | "types": ["Melee Weapons"] 30 | }, 31 | { 32 | "title": "King's Grace", 33 | "runes": ["Amn", "Ral", "Thul"], 34 | "level": 25, 35 | "types": ["Swords", "Scepters"] 36 | }, 37 | { 38 | "title": "Leaf", 39 | "runes": ["Tir", "Ral"], 40 | "level": 19, 41 | "types": ["Staves"] 42 | }, 43 | { 44 | "title": "Lionheart", 45 | "runes": ["Hel", "Lum", "Fal"], 46 | "level": 41, 47 | "types": ["Body Armors"] 48 | }, 49 | { 50 | "title": "Lore", 51 | "runes": ["Ort", "Sol"], 52 | "level": 27, 53 | "types": ["Helms"] 54 | }, 55 | { 56 | "title": "Malice", 57 | "runes": ["Ith", "El", "Eth"], 58 | "level": 15, 59 | "types": ["Melee Weapons"] 60 | }, 61 | { 62 | "title": "Melody", 63 | "runes": ["Shael", "Ko", "Nef"], 64 | "level": 39, 65 | "types": ["Missile Weapons"] 66 | }, 67 | { 68 | "title": "Memory", 69 | "runes": ["Lum", "Io", "Sol", "Eth"], 70 | "level": 37, 71 | "types": ["Staves"] 72 | }, 73 | { 74 | "title": "Nadir", 75 | "runes": ["Nef", "Tir"], 76 | "level": 13, 77 | "types": ["Helms"] 78 | }, 79 | { 80 | "title": "Radiance", 81 | "runes": ["Nef", "Sol", "Ith"], 82 | "level": 27, 83 | "types": ["Helms"] 84 | }, 85 | { 86 | "title": "Rhyme", 87 | "runes": ["Shael", "Eth"], 88 | "level": 29, 89 | "types": ["Shields"] 90 | }, 91 | { 92 | "title": "Silence", 93 | "runes": ["Dol", "Eld", "Hel", "Ist", "Tir", "Vex"], 94 | "level": 55, 95 | "types": ["Weapons"] 96 | }, 97 | { 98 | "title": "Smoke", 99 | "runes": ["Nef", "Lum"], 100 | "level": 37, 101 | "types": ["Body Armors"] 102 | }, 103 | { 104 | "title": "Stealth", 105 | "runes": ["Tal", "Eth"], 106 | "level": 17, 107 | "types": ["Body Armors"] 108 | }, 109 | { 110 | "title": "Steel", 111 | "runes": ["Tir", "El"], 112 | "level": 13, 113 | "types": ["Swords", "Axes", "Maces"] 114 | }, 115 | { 116 | "title": "Strength", 117 | "runes": ["Amn", "Tir"], 118 | "level": 25, 119 | "types": ["Melee Weapons"] 120 | }, 121 | { 122 | "title": "Venom", 123 | "runes": ["Tal", "Dol", "Mal"], 124 | "level": 49, 125 | "types": ["Weapons"] 126 | }, 127 | { 128 | "title": "Wealth", 129 | "runes": ["Lem", "Ko", "Tir"], 130 | "level": 43, 131 | "types": ["Body Armors"] 132 | }, 133 | { 134 | "title": "White", 135 | "runes": ["Dol", "Io"], 136 | "level": 35, 137 | "types": ["Wands"] 138 | }, 139 | { 140 | "title": "Zephyr", 141 | "runes": ["Ort", "Eth"], 142 | "level": 21, 143 | "types": ["Missile Weapons"] 144 | }, 145 | { 146 | "title": "Beast", 147 | "runes": ["Ber", "Tir", "Um", "Mal", "Lum"], 148 | "level": 63, 149 | "types": ["Axes", "Scepters", "Hammers"] 150 | }, 151 | { 152 | "title": "Bramble", 153 | "runes": ["Ral", "Ohm", "Sur", "Eth"], 154 | "level": 61, 155 | "types": ["Body Armors"] 156 | }, 157 | { 158 | "title": "Breath of the Dying", 159 | "runes": ["Vex", "Hel", "El", "Eld", "Zod", "Eth"], 160 | "level": 69, 161 | "types": ["Weapons"] 162 | }, 163 | { 164 | "title": "Call to Arms", 165 | "runes": ["Amn", "Ral", "Mal", "Ist", "Ohm"], 166 | "level": 51, 167 | "types": ["Weapons"] 168 | }, 169 | { 170 | "title": "Chaos", 171 | "runes": ["Fal", "Ohm", "Um"], 172 | "level": 57, 173 | "types": ["Claws"] 174 | }, 175 | { 176 | "title": "Chains of Honor", 177 | "runes": ["Dol", "Um", "Ber", "Ist"], 178 | "level": 63, 179 | "types": ["Body Armors"] 180 | }, 181 | { 182 | "title": "Crescent Moon", 183 | "runes": ["Shael", "Um", "Tir"], 184 | "level": 47, 185 | "types": ["Axes", "Swords", "Polearms"] 186 | }, 187 | { 188 | "title": "Delirium", 189 | "runes": ["Lem", "Ist", "Io"], 190 | "level": 51, 191 | "types": ["Helms"] 192 | }, 193 | { 194 | "title": "Doom", 195 | "runes": ["Hel", "Ohm", "Um", "Lo", "Cham"], 196 | "level": 67, 197 | "types": ["Axes", "Polearms", "Hammers"] 198 | }, 199 | { 200 | "title": "Duress", 201 | "runes": ["Shael", "Um", "Thul"], 202 | "level": 47, 203 | "types": ["Body Armors"] 204 | }, 205 | { 206 | "title": "Enigma", 207 | "runes": ["Jah", "Ith", "Ber"], 208 | "level": 65, 209 | "types": ["Body Armors"] 210 | }, 211 | { 212 | "title": "Eternity", 213 | "runes": ["Amn", "Ber", "Ist", "Sol", "Sur"], 214 | "level": 63, 215 | "types": ["Melee Weapons"] 216 | }, 217 | { 218 | "title": "Exile", 219 | "runes": ["Vex", "Ohm", "Ist", "Dol"], 220 | "level": 57, 221 | "types": ["Paladin Shields"] 222 | }, 223 | { 224 | "title": "Famine", 225 | "runes": ["Fal", "Ohm", "Ort", "Jah"], 226 | "level": 65, 227 | "types": ["Axes", "Hammers"] 228 | }, 229 | { 230 | "title": "Gloom", 231 | "runes": ["Fal", "Um", "Pul"], 232 | "level": 47, 233 | "types": ["Body Armors"] 234 | }, 235 | { 236 | "title": "Hand of Justice", 237 | "runes": ["Sur", "Cham", "Amn", "Lo"], 238 | "level": 67, 239 | "types": ["Weapons"] 240 | }, 241 | { 242 | "title": "Heart of the Oak", 243 | "runes": ["Ko", "Vex", "Pul", "Thul"], 244 | "level": 55, 245 | "types": ["Staves", "Maces"] 246 | }, 247 | { 248 | "title": "Kingslayer", 249 | "runes": ["Mal", "Um", "Gul", "Fal"], 250 | "level": 53, 251 | "types": ["Swords", "Axes"] 252 | }, 253 | { 254 | "title": "Passion", 255 | "runes": ["Dol", "Ort", "Eld", "Lem"], 256 | "level": 43, 257 | "types": ["Weapons"] 258 | }, 259 | { 260 | "title": "Prudence", 261 | "runes": ["Mal", "Tir"], 262 | "level": 49, 263 | "types": ["Body Armors"] 264 | }, 265 | { 266 | "title": "Sanctuary", 267 | "runes": ["Ko", "Ko", "Mal"], 268 | "level": 49, 269 | "types": ["Shields"] 270 | }, 271 | { 272 | "title": "Splendor", 273 | "runes": ["Eth", "Lum"], 274 | "level": 37, 275 | "types": ["Shields"] 276 | }, 277 | { 278 | "title": "Stone", 279 | "runes": ["Shael", "Um", "Pul", "Lum"], 280 | "level": 47, 281 | "types": ["Body Armors"] 282 | }, 283 | { 284 | "title": "Wind", 285 | "runes": ["Sur", "El"], 286 | "level": 61, 287 | "types": ["Melee Weapons"] 288 | }, 289 | { 290 | "title": "Brand", 291 | "runes": ["Jah", "Lo", "Mal", "Gul"], 292 | "level": 65, 293 | "types": ["Missile Weapons"], 294 | "ladder": true 295 | }, 296 | { 297 | "title": "Death", 298 | "runes": ["Hel", "El", "Vex", "Ort", "Gul"], 299 | "level": 55, 300 | "types": ["Swords", "Axes"], 301 | "ladder": true 302 | }, 303 | { 304 | "title": "Destruction", 305 | "runes": ["Vex", "Lo", "Ber", "Jah", "Ko"], 306 | "level": 65, 307 | "types": ["Polearms", "Swords"], 308 | "ladder": true 309 | }, 310 | { 311 | "title": "Dragon", 312 | "runes": ["Sur", "Lo", "Sol"], 313 | "level": 61, 314 | "types": ["Body Armors", "Shields"], 315 | "ladder": true 316 | }, 317 | { 318 | "title": "Dream", 319 | "runes": ["Io", "Jah", "Pul"], 320 | "level": 65, 321 | "types": ["Helms", "Shields"], 322 | "ladder": true 323 | }, 324 | { 325 | "title": "Edge", 326 | "runes": ["Tir", "Tal", "Amn"], 327 | "level": 25, 328 | "types": ["Missile Weapons"], 329 | "ladder": true 330 | }, 331 | { 332 | "title": "Faith", 333 | "runes": ["Ohm", "Jah", "Lem", "Eld"], 334 | "level": 65, 335 | "types": ["Missile Weapons"], 336 | "ladder": true 337 | }, 338 | { 339 | "title": "Fortitude", 340 | "runes": ["El", "Sol", "Dol", "Lo"], 341 | "level": 59, 342 | "types": ["Weapons", "Body Armors"], 343 | "ladder": true 344 | }, 345 | { 346 | "title": "Grief", 347 | "runes": ["Eth", "Tir", "Lo", "Mal", "Ral"], 348 | "level": 59, 349 | "types": ["Swords", "Axes"], 350 | "ladder": true 351 | }, 352 | { 353 | "title": "Harmony", 354 | "runes": ["Tir", "Ith", "Sol", "Ko"], 355 | "level": 39, 356 | "types": ["Missile Weapons"], 357 | "ladder": true 358 | }, 359 | { 360 | "title": "Ice", 361 | "runes": ["Amn", "Shael", "Jah", "Lo"], 362 | "level": 65, 363 | "types": ["Missile Weapons"], 364 | "ladder": true 365 | }, 366 | { 367 | "title": "Infinity", 368 | "runes": ["Ber", "Mal", "Ber", "Ist"], 369 | "level": 63, 370 | "types": ["Polearms", "Spears"], 371 | "ladder": true 372 | }, 373 | { 374 | "title": "Insight", 375 | "runes": ["Ral", "Tir", "Tal", "Sol"], 376 | "level": 27, 377 | "types": ["Missile Weapons", "Polearms", "Staves"], 378 | "ladder": true 379 | }, 380 | { 381 | "title": "Last Wish", 382 | "runes": ["Jah", "Mal", "Jah", "Sur", "Jah", "Ber"], 383 | "level": 65, 384 | "types": ["Swords", "Hammers", "Axes"], 385 | "ladder": true 386 | }, 387 | { 388 | "title": "Lawbringer", 389 | "runes": ["Amn", "Lem", "Ko"], 390 | "level": 43, 391 | "types": ["Swords", "Hammers", "Scepters"], 392 | "ladder": true 393 | }, 394 | { 395 | "title": "Oath", 396 | "runes": ["Shael", "Pul", "Mal", "Lum"], 397 | "level": 49, 398 | "types": ["Swords", "Axes", "Maces"], 399 | "ladder": true 400 | }, 401 | { 402 | "title": "Obedience", 403 | "runes": ["Hel", "Ko", "Thul", "Eth", "Fal"], 404 | "level": 41, 405 | "types": ["Polearms", "Spears"], 406 | "ladder": true 407 | }, 408 | { 409 | "title": "Phoenix", 410 | "runes": ["Vex", "Vex", "Lo", "Jah"], 411 | "level": 65, 412 | "types": ["Weapons", "Shields"], 413 | "ladder": true 414 | }, 415 | { 416 | "title": "Pride", 417 | "runes": ["Cham", "Sur", "Io", "Lo"], 418 | "level": 67, 419 | "types": ["Polearms", "Spears"], 420 | "ladder": true 421 | }, 422 | { 423 | "title": "Rift", 424 | "runes": ["Hel", "Ko", "Lem", "Gul"], 425 | "level": 53, 426 | "types": ["Polearms", "Scepters"], 427 | "ladder": true 428 | }, 429 | { 430 | "title": "Spirit", 431 | "runes": ["Tal", "Thul", "Ort", "Amn"], 432 | "level": 30, 433 | "types": ["Swords", "Shields"], 434 | "ladder": true 435 | }, 436 | { 437 | "title": "Voice of Reason", 438 | "runes": ["Lem", "Ko", "El", "Eld"], 439 | "level": 43, 440 | "types": ["Swords", "Maces"], 441 | "ladder": true 442 | }, 443 | { 444 | "title": "Wrath", 445 | "runes": ["Pul", "Lum", "Ber", "Mal"], 446 | "level": 63, 447 | "types": ["Missile Weapons"], 448 | "ladder": true 449 | }, 450 | { 451 | "title": "Bone", 452 | "runes": ["Sol", "Um", "Um"], 453 | "level": 47, 454 | "types": ["Body Armors"] 455 | }, 456 | { 457 | "title": "Enlightenment", 458 | "runes": ["Pul", "Ral", "Sol"], 459 | "level": 45, 460 | "types": ["Body Armors"] 461 | }, 462 | { 463 | "title": "Myth", 464 | "runes": ["Hel", "Amn", "Nef"], 465 | "level": 25, 466 | "types": ["Body Armors"] 467 | }, 468 | { 469 | "title": "Peace", 470 | "runes": ["Shael", "Thul", "Amn"], 471 | "level": 29, 472 | "types": ["Body Armors"] 473 | }, 474 | { 475 | "title": "Principle", 476 | "runes": ["Ral", "Gul", "Eld"], 477 | "level": 53, 478 | "types": ["Body Armors"] 479 | }, 480 | { 481 | "title": "Rain", 482 | "runes": ["Ort", "Mal", "Ith"], 483 | "level": 49, 484 | "types": ["Body Armors"] 485 | }, 486 | { 487 | "title": "Treachery", 488 | "runes": ["Shael", "Thul", "Lem"], 489 | "level": 43, 490 | "types": ["Body Armors"] 491 | }, 492 | { 493 | "title": "Plague", 494 | "runes": ["Cham", "Shael", "Um"], 495 | "level": 67, 496 | "types": ["Swords", "Claws", "Daggers"], 497 | "ladder": true, 498 | "version": 2.4 499 | }, 500 | { 501 | "title": "Pattern", 502 | "runes": ["Tal", "Ort", "Thul"], 503 | "level": 23, 504 | "types": ["Claws"], 505 | "ladder": true, 506 | "version": 2.4 507 | }, 508 | { 509 | "title": "Unbending Will", 510 | "runes": ["Fal", "Io", "Ith", "Eld", "El", "Hel"], 511 | "level": 41, 512 | "types": ["Swords"], 513 | "ladder": true, 514 | "version": 2.4 515 | }, 516 | { 517 | "title": "Wisdom", 518 | "runes": ["Pul", "Ith", "Eld"], 519 | "level": 45, 520 | "types": ["Helms"], 521 | "ladder": true, 522 | "version": 2.4 523 | }, 524 | { 525 | "title": "Obsession", 526 | "runes": ["Zod", "Ist", "Lem", "Lum", "Io", "Nef"], 527 | "level": 69, 528 | "types": ["Staves"], 529 | "ladder": true, 530 | "version": 2.4 531 | }, 532 | { 533 | "title": "Flickering Flame", 534 | "runes": ["Nef", "Pul", "Vex"], 535 | "level": 55, 536 | "types": ["Helms"], 537 | "ladder": true, 538 | "version": 2.4 539 | }, 540 | { 541 | "title": "Mist", 542 | "runes": ["Cham", "Shael", "Gul", "Thul", "Ith"], 543 | "level": 67, 544 | "types": ["Missile Weapons"], 545 | "ladder": true, 546 | "version": 2.4 547 | } 548 | ] 549 | -------------------------------------------------------------------------------- /Packages/RunesData/Sources/RunesData/Model/CubeRecipe.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | public struct CubeRecipe: Identifiable, Hashable, Decodable { 4 | public var id: String { description } 5 | public let description: String 6 | public let enabled: Int? 7 | public let output: String 8 | 9 | public var formattedInput: String { 10 | String(description.split(separator: "->")[0]) 11 | } 12 | 13 | public var formattedOutput: String { 14 | var output = String(description.split(separator: "->")[1]) 15 | _ = output.removeFirst() 16 | return output 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Packages/RunesData/Sources/RunesData/Model/ItemBase.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | public struct ItemBase: Identifiable, Hashable { 4 | public var id: String { name } 5 | public let name: String 6 | 7 | public init(name: String) { 8 | self.name = name 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Packages/RunesData/Sources/RunesData/Model/Rune.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | public struct Rune: Codable, Identifiable, Hashable, Equatable { 4 | public var id: String { name } 5 | public let name: String 6 | public let tier: Int 7 | public let armor: String 8 | public let weapon: String 9 | public let shield: String 10 | public let countess: String 11 | public let hellforge: String 12 | public let treasure: String 13 | public let cube: String? 14 | } 15 | -------------------------------------------------------------------------------- /Packages/RunesData/Sources/RunesData/Model/Runeword.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | public struct Runeword: Codable, Identifiable, Hashable { 4 | public var id: String { title } 5 | public let title: String 6 | public let runes: [String] 7 | public let level: Int 8 | public let types: [String] 9 | public var description: String? 10 | } 11 | -------------------------------------------------------------------------------- /Packages/RunesData/Sources/RunesData/RunesData.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import SwiftUI 3 | 4 | public class RunesData: ObservableObject { 5 | public private(set) var runes: [Rune] = [] 6 | public private(set) var runewords: [Runeword] = [] 7 | public private(set) var itemBase: [ItemBase] = [] 8 | public private(set) var cubeRecipes: [CubeRecipe] = [] 9 | 10 | enum BundleError: Error { 11 | case fileNotFound 12 | } 13 | 14 | public init() { 15 | let decoder = JSONDecoder() 16 | 17 | self.runes = loadRunes(decoder: decoder) 18 | self.runewords = loadRunewords(decoder: decoder) 19 | self.cubeRecipes = loadCubeRecipes(decoder: decoder) 20 | self.itemBase = Array(Set(runewords.flatMap{ $0.types })).sorted().map{ .init(name: $0) } 21 | } 22 | 23 | public func runewordsFor(runes: [String]) -> [Runeword] { 24 | if runes.isEmpty { 25 | return [] 26 | } 27 | return runewords.filter({ Set($0.runes).isSuperset(of: runes) }) 28 | } 29 | 30 | public func allAvailableRuneworsFor(runes: [String]) -> [Runeword] { 31 | if runes.isEmpty { 32 | return [] 33 | } 34 | return runewords.filter({ Set($0.runes).isSubset(of: runes) }) 35 | } 36 | 37 | public func runewordsFor(itemsBase: [ItemBase]) -> [Runeword] { 38 | runewords.filter({ $0.types.contains(itemsBase.map{ $0.name }) }) 39 | } 40 | 41 | private func loadRunes(decoder: JSONDecoder) -> [Rune] { 42 | do { 43 | return try decoder.decode([Rune].self, from: try getJSONData(filename: "runes")) 44 | } catch { 45 | return [] 46 | } 47 | } 48 | 49 | private func loadRunewords(decoder: JSONDecoder) -> [Runeword] { 50 | do { 51 | let runewords = try decoder.decode([Runeword].self, from: try getJSONData(filename: "runewords")) 52 | let description = try decoder.decode([String: String].self, from: try getJSONData(filename: "runewords-description")) 53 | var finaleRunewords: [Runeword] = [] 54 | for var runeword in runewords { 55 | runeword.description = description[runeword.title] 56 | finaleRunewords.append(runeword) 57 | } 58 | return finaleRunewords 59 | } catch { 60 | return [] 61 | } 62 | } 63 | 64 | private func loadCubeRecipes(decoder: JSONDecoder) -> [CubeRecipe] { 65 | do { 66 | let recipes = try decoder.decode([String: CubeRecipe].self, 67 | from: try getJSONData(filename: "cube-recipes")) 68 | let sortedRecipes = recipes.sorted(by: { $0.0 < $1.0 }) 69 | return sortedRecipes.compactMap{ $0.value } 70 | } catch { 71 | return [] 72 | } 73 | } 74 | 75 | private func getJSONData(filename: String) throws -> Data { 76 | guard let path = Bundle.module.path(forResource: filename, ofType: "json") else { 77 | throw BundleError.fileNotFound 78 | } 79 | return try Data(contentsOf: URL(filePath: path)) 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /Packages/RunesData/Tests/RunesDataTests/RunesDataTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | @testable import RunesData 3 | 4 | final class RunesDataTests: XCTestCase { 5 | let data = RunesData() 6 | 7 | func testRunes() throws { 8 | XCTAssertEqual(data.runes.count, 33) 9 | XCTAssertEqual(data.runes.first?.name, "El") 10 | } 11 | 12 | func testRunesWords() throws { 13 | XCTAssertEqual(data.runewords.count, 85) 14 | XCTAssertEqual(data.runewords.first?.title, "Ancient's Pledge") 15 | XCTAssertEqual(data.runewords.first?.description?.utf8.count, 122) 16 | } 17 | 18 | func testRunewordsFilter() throws { 19 | XCTAssertEqual(data.runewordsFor(runes: ["Amn"]).count, 12) 20 | XCTAssertEqual(data.runewordsFor(runes: ["Ber", "Jah"]).count, 3) 21 | } 22 | 23 | func testItemBase() throws { 24 | XCTAssertEqual(data.itemBase.count, 19) 25 | XCTAssertEqual(data.itemBase.first!.name, "Axes") 26 | } 27 | 28 | func testItemBaseFilter() throws { 29 | XCTAssertEqual(data.runewordsFor(itemsBase: [.init(name: "Axes")]).count, 10) 30 | XCTAssertEqual(data.runewordsFor(itemsBase: [.init(name: "Axes")]).first!.title, "Steel") 31 | } 32 | 33 | func testCubeRecipes() throws { 34 | XCTAssertEqual(data.cubeRecipes.count, 155) 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Packages/Stash/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /.build 3 | /Packages 4 | /*.xcodeproj 5 | xcuserdata/ 6 | DerivedData/ 7 | .swiftpm/config/registries.json 8 | .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata 9 | .netrc 10 | -------------------------------------------------------------------------------- /Packages/Stash/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Packages/Stash/Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version: 5.7 2 | // The swift-tools-version declares the minimum version of Swift required to build this package. 3 | 4 | import PackageDescription 5 | 6 | let package = Package( 7 | name: "Stash", 8 | platforms: [ 9 | .iOS(.v16) 10 | ], 11 | products: [ 12 | .library( 13 | name: "Stash", 14 | targets: ["Stash"]), 15 | ], 16 | dependencies: [ 17 | .package(name: "RunesData", path: "./RunesData"), 18 | ], 19 | targets: [ 20 | .target( 21 | name: "Stash", 22 | dependencies: ["RunesData"]), 23 | .testTarget( 24 | name: "StashTests", 25 | dependencies: ["Stash"]), 26 | ] 27 | ) 28 | -------------------------------------------------------------------------------- /Packages/Stash/README.md: -------------------------------------------------------------------------------- 1 | # Stash 2 | 3 | A description of this package. 4 | -------------------------------------------------------------------------------- /Packages/Stash/Sources/Stash/Stash.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import RunesData 3 | 4 | public class Stash: ObservableObject { 5 | struct StashData: Codable { 6 | let runewords: [Runeword] 7 | let runes: [Rune] 8 | } 9 | 10 | @Published public var favoriteRunewords: [Runeword] = [] { 11 | didSet { 12 | saveData() 13 | } 14 | } 15 | 16 | @Published public var runes: [Rune] = [] { 17 | didSet { 18 | saveData() 19 | } 20 | } 21 | 22 | private let encoder = JSONEncoder() 23 | private let decoder = JSONDecoder() 24 | 25 | private var dataURL: URL { 26 | try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true) 27 | .appending(path: "stashData") 28 | } 29 | 30 | public init() { 31 | let data = loadData() 32 | self.favoriteRunewords = data.runewords 33 | self.runes = data.runes 34 | } 35 | 36 | public func isFavorite(runeword: Runeword) -> Bool { 37 | favoriteRunewords.contains(where: { $0.id == runeword.id }) 38 | } 39 | 40 | public func toggleFavorite(runeword: Runeword) { 41 | if isFavorite(runeword: runeword) { 42 | favoriteRunewords.removeAll(where: { $0.id == runeword.id }) 43 | } else { 44 | favoriteRunewords.append(runeword) 45 | } 46 | } 47 | 48 | public func isInStash(rune: Rune) -> Bool { 49 | runes.contains(where: { $0.id == rune.id }) 50 | } 51 | 52 | public func toggleRune(rune: Rune) { 53 | if isInStash(rune: rune) { 54 | runes.removeAll(where: { $0.id == rune.id }) 55 | } else { 56 | runes.append(rune) 57 | } 58 | } 59 | 60 | private func saveData() { 61 | DispatchQueue.global().sync { 62 | let stashData = StashData(runewords: favoriteRunewords, runes: runes) 63 | do { 64 | let data = try encoder.encode(stashData) 65 | try data.write(to: dataURL, options: .atomic) 66 | } catch { 67 | print(error) 68 | } 69 | } 70 | } 71 | 72 | private func loadData() -> StashData { 73 | do { 74 | let data = try Data(contentsOf: dataURL) 75 | return try decoder.decode(StashData.self, from: data) 76 | } catch { 77 | return .init(runewords: [], runes: []) 78 | } 79 | } 80 | 81 | func clearData() { 82 | try? FileManager.default.removeItem(at: dataURL) 83 | runes = [] 84 | favoriteRunewords = [] 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /Packages/Stash/Tests/StashTests/StashTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | @testable import Stash 3 | import RunesData 4 | 5 | final class StashTests: XCTestCase { 6 | override class func tearDown() { 7 | let stash = Stash() 8 | stash.clearData() 9 | } 10 | 11 | func testSaveRestoreClearData() { 12 | var stash = Stash() 13 | let data = RunesData() 14 | XCTAssertEqual(stash.runes.isEmpty, true) 15 | XCTAssertEqual(stash.favoriteRunewords.isEmpty, true) 16 | stash.favoriteRunewords.append(data.runewords.first!) 17 | stash.runes.append(data.runes.first!) 18 | stash = Stash() 19 | XCTAssertEqual(stash.runes.isEmpty, false) 20 | XCTAssertEqual(stash.favoriteRunewords.isEmpty, false) 21 | XCTAssertEqual(stash.runes.first, data.runes.first!) 22 | XCTAssertEqual(stash.favoriteRunewords.first, data.runewords.first!) 23 | stash.clearData() 24 | XCTAssertEqual(stash.runes.isEmpty, true) 25 | XCTAssertEqual(stash.favoriteRunewords.isEmpty, true) 26 | stash = Stash() 27 | XCTAssertEqual(stash.runes.isEmpty, true) 28 | XCTAssertEqual(stash.favoriteRunewords.isEmpty, true) 29 | } 30 | 31 | func testFavorite() { 32 | let stash = Stash() 33 | let data = RunesData() 34 | let runeword = data.runewords.first! 35 | XCTAssertEqual(stash.favoriteRunewords.isEmpty, true) 36 | stash.toggleFavorite(runeword: runeword) 37 | XCTAssertEqual(stash.isFavorite(runeword: runeword), true) 38 | stash.toggleFavorite(runeword: runeword) 39 | XCTAssertEqual(stash.isFavorite(runeword: runeword), false) 40 | } 41 | 42 | func testRunes() { 43 | let stash = Stash() 44 | let data = RunesData() 45 | let rune = data.runes.first! 46 | XCTAssertEqual(stash.runes.isEmpty, true) 47 | stash.toggleRune(rune: rune) 48 | XCTAssertEqual(stash.isInStash(rune: rune), true) 49 | stash.toggleRune(rune: rune) 50 | XCTAssertEqual(stash.isInStash(rune: rune), false) 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | # Runewords App 2 | 3 | This small SwiftUI app have two purposes: 4 | 5 | * Making a clean, fully SwiftUI app using all the latest iOS 16 / Xcode 14 features. 6 | * Browse, search, filter Diablo II Runes and Runeswords. 7 | 8 | While playing Diablo II I often need to do a lot of searching around the internet to see which runewords I can craft with my current runes. This app make it very simple to filter, search runewords by name, item base or runes. 9 | 10 | The Stash feature is still under the making. 11 | 12 | This project have no external dependencies and make no network calls. 13 | 14 | You'll need Xcode 14 latest beta to compile it. 15 | 16 | I've wrote an [article](https://dimillian.medium.com/introducing-runewordsapp-5dfd146a6963) that describe the project a bit better than this readme. 17 | 18 | ## Previews 19 | 20 | ![Screenshot](Images/image1.png?) 21 | ![Screenshot](Images/image2.png?) 22 | ![Screenshot](Images/image3.png?) 23 | -------------------------------------------------------------------------------- /RunewordsApp.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 56; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 9F2EB1E328C9E30000335548 /* MoreView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F2EB1E228C9E30000335548 /* MoreView.swift */; }; 11 | 9F2EB1E528C9E4C200335548 /* CubeRecipesListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F2EB1E428C9E4C200335548 /* CubeRecipesListView.swift */; }; 12 | 9F7B8CC128DC48E90004A2BF /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F7B8CC028DC48E90004A2BF /* WidgetKit.framework */; }; 13 | 9F7B8CC328DC48E90004A2BF /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F7B8CC228DC48E90004A2BF /* SwiftUI.framework */; }; 14 | 9F7B8CC628DC48E90004A2BF /* RunewordsWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F7B8CC528DC48E90004A2BF /* RunewordsWidget.swift */; }; 15 | 9F7B8CC828DC48EB0004A2BF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9F7B8CC728DC48EB0004A2BF /* Assets.xcassets */; }; 16 | 9F7B8CCC28DC48EB0004A2BF /* RunewordsWidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 9F7B8CBF28DC48E90004A2BF /* RunewordsWidgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 17 | 9F7B8CD228DC4E290004A2BF /* DesignSystem in Frameworks */ = {isa = PBXBuildFile; productRef = 9F7B8CD128DC4E290004A2BF /* DesignSystem */; }; 18 | 9F7B8CD428DC4E290004A2BF /* RunesData in Frameworks */ = {isa = PBXBuildFile; productRef = 9F7B8CD328DC4E290004A2BF /* RunesData */; }; 19 | 9F7B8CD628DC4E290004A2BF /* Stash in Frameworks */ = {isa = PBXBuildFile; productRef = 9F7B8CD528DC4E290004A2BF /* Stash */; }; 20 | 9F968F5C28C8794A0019D9F4 /* RuneRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F968F5B28C8794A0019D9F4 /* RuneRowView.swift */; }; 21 | 9FA71A2C28C71801003DF7E4 /* RunewordsApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FA71A2B28C71801003DF7E4 /* RunewordsApp.swift */; }; 22 | 9FA71A3028C71803003DF7E4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9FA71A2F28C71803003DF7E4 /* Assets.xcassets */; }; 23 | 9FA71A3328C71803003DF7E4 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9FA71A3228C71803003DF7E4 /* Preview Assets.xcassets */; }; 24 | 9FA71A3C28C72546003DF7E4 /* RunesData in Frameworks */ = {isa = PBXBuildFile; productRef = 9FA71A3B28C72546003DF7E4 /* RunesData */; }; 25 | 9FA71A3F28C73217003DF7E4 /* Stash in Frameworks */ = {isa = PBXBuildFile; productRef = 9FA71A3E28C73217003DF7E4 /* Stash */; }; 26 | 9FA71A4128C732B8003DF7E4 /* RunewordsListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FA71A4028C732B8003DF7E4 /* RunewordsListView.swift */; }; 27 | 9FA71A4428C73452003DF7E4 /* AppTabView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FA71A4328C73452003DF7E4 /* AppTabView.swift */; }; 28 | 9FA71A4628C73480003DF7E4 /* StashView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FA71A4528C73480003DF7E4 /* StashView.swift */; }; 29 | 9FA71A4828C7348F003DF7E4 /* RunesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FA71A4728C7348F003DF7E4 /* RunesView.swift */; }; 30 | 9FA71A4E28C73AAD003DF7E4 /* RuneDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FA71A4D28C73AAD003DF7E4 /* RuneDetailView.swift */; }; 31 | 9FA71A5028C73C13003DF7E4 /* Routeur.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FA71A4F28C73C13003DF7E4 /* Routeur.swift */; }; 32 | 9FA71A5628C73FAB003DF7E4 /* DesignSystem in Frameworks */ = {isa = PBXBuildFile; productRef = 9FA71A5528C73FAB003DF7E4 /* DesignSystem */; }; 33 | 9FA71A5828C744C9003DF7E4 /* RunewordRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FA71A5728C744C9003DF7E4 /* RunewordRowView.swift */; }; 34 | 9FA71A5A28C746BF003DF7E4 /* RunewordDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FA71A5928C746BF003DF7E4 /* RunewordDetailView.swift */; }; 35 | 9FA71A5C28C7539E003DF7E4 /* RunesStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FA71A5B28C7539E003DF7E4 /* RunesStackView.swift */; }; 36 | /* End PBXBuildFile section */ 37 | 38 | /* Begin PBXContainerItemProxy section */ 39 | 9F7B8CCA28DC48EB0004A2BF /* PBXContainerItemProxy */ = { 40 | isa = PBXContainerItemProxy; 41 | containerPortal = 9FA71A2028C71801003DF7E4 /* Project object */; 42 | proxyType = 1; 43 | remoteGlobalIDString = 9F7B8CBE28DC48E90004A2BF; 44 | remoteInfo = RunewordsWidgetExtension; 45 | }; 46 | /* End PBXContainerItemProxy section */ 47 | 48 | /* Begin PBXCopyFilesBuildPhase section */ 49 | 9F7B8CCD28DC48EB0004A2BF /* Embed Foundation Extensions */ = { 50 | isa = PBXCopyFilesBuildPhase; 51 | buildActionMask = 2147483647; 52 | dstPath = ""; 53 | dstSubfolderSpec = 13; 54 | files = ( 55 | 9F7B8CCC28DC48EB0004A2BF /* RunewordsWidgetExtension.appex in Embed Foundation Extensions */, 56 | ); 57 | name = "Embed Foundation Extensions"; 58 | runOnlyForDeploymentPostprocessing = 0; 59 | }; 60 | /* End PBXCopyFilesBuildPhase section */ 61 | 62 | /* Begin PBXFileReference section */ 63 | 9F2EB1E228C9E30000335548 /* MoreView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoreView.swift; sourceTree = ""; }; 64 | 9F2EB1E428C9E4C200335548 /* CubeRecipesListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CubeRecipesListView.swift; sourceTree = ""; }; 65 | 9F7B8CBF28DC48E90004A2BF /* RunewordsWidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = RunewordsWidgetExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 66 | 9F7B8CC028DC48E90004A2BF /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; }; 67 | 9F7B8CC228DC48E90004A2BF /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; }; 68 | 9F7B8CC528DC48E90004A2BF /* RunewordsWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunewordsWidget.swift; sourceTree = ""; }; 69 | 9F7B8CC728DC48EB0004A2BF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 70 | 9F7B8CC928DC48EB0004A2BF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 71 | 9F968F5B28C8794A0019D9F4 /* RuneRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RuneRowView.swift; sourceTree = ""; }; 72 | 9FA71A2828C71801003DF7E4 /* RunewordsApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RunewordsApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; 73 | 9FA71A2B28C71801003DF7E4 /* RunewordsApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunewordsApp.swift; sourceTree = ""; }; 74 | 9FA71A2F28C71803003DF7E4 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 75 | 9FA71A3228C71803003DF7E4 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 76 | 9FA71A3928C71E6E003DF7E4 /* RunesData */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = RunesData; path = Packages/RunesData; sourceTree = ""; }; 77 | 9FA71A3D28C7319A003DF7E4 /* Stash */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = Stash; path = Packages/Stash; sourceTree = ""; }; 78 | 9FA71A4028C732B8003DF7E4 /* RunewordsListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunewordsListView.swift; sourceTree = ""; }; 79 | 9FA71A4328C73452003DF7E4 /* AppTabView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppTabView.swift; sourceTree = ""; }; 80 | 9FA71A4528C73480003DF7E4 /* StashView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StashView.swift; sourceTree = ""; }; 81 | 9FA71A4728C7348F003DF7E4 /* RunesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunesView.swift; sourceTree = ""; }; 82 | 9FA71A4D28C73AAD003DF7E4 /* RuneDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RuneDetailView.swift; sourceTree = ""; }; 83 | 9FA71A4F28C73C13003DF7E4 /* Routeur.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Routeur.swift; sourceTree = ""; }; 84 | 9FA71A5328C73D96003DF7E4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 85 | 9FA71A5428C73E09003DF7E4 /* DesignSystem */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = DesignSystem; path = Packages/DesignSystem; sourceTree = ""; }; 86 | 9FA71A5728C744C9003DF7E4 /* RunewordRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunewordRowView.swift; sourceTree = ""; }; 87 | 9FA71A5928C746BF003DF7E4 /* RunewordDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunewordDetailView.swift; sourceTree = ""; }; 88 | 9FA71A5B28C7539E003DF7E4 /* RunesStackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunesStackView.swift; sourceTree = ""; }; 89 | /* End PBXFileReference section */ 90 | 91 | /* Begin PBXFrameworksBuildPhase section */ 92 | 9F7B8CBC28DC48E90004A2BF /* Frameworks */ = { 93 | isa = PBXFrameworksBuildPhase; 94 | buildActionMask = 2147483647; 95 | files = ( 96 | 9F7B8CD428DC4E290004A2BF /* RunesData in Frameworks */, 97 | 9F7B8CD228DC4E290004A2BF /* DesignSystem in Frameworks */, 98 | 9F7B8CC328DC48E90004A2BF /* SwiftUI.framework in Frameworks */, 99 | 9F7B8CC128DC48E90004A2BF /* WidgetKit.framework in Frameworks */, 100 | 9F7B8CD628DC4E290004A2BF /* Stash in Frameworks */, 101 | ); 102 | runOnlyForDeploymentPostprocessing = 0; 103 | }; 104 | 9FA71A2528C71801003DF7E4 /* Frameworks */ = { 105 | isa = PBXFrameworksBuildPhase; 106 | buildActionMask = 2147483647; 107 | files = ( 108 | 9FA71A5628C73FAB003DF7E4 /* DesignSystem in Frameworks */, 109 | 9FA71A3F28C73217003DF7E4 /* Stash in Frameworks */, 110 | 9FA71A3C28C72546003DF7E4 /* RunesData in Frameworks */, 111 | ); 112 | runOnlyForDeploymentPostprocessing = 0; 113 | }; 114 | /* End PBXFrameworksBuildPhase section */ 115 | 116 | /* Begin PBXGroup section */ 117 | 9F2EB1E128C9E2F300335548 /* More */ = { 118 | isa = PBXGroup; 119 | children = ( 120 | 9F2EB1E228C9E30000335548 /* MoreView.swift */, 121 | 9F2EB1E428C9E4C200335548 /* CubeRecipesListView.swift */, 122 | ); 123 | path = More; 124 | sourceTree = ""; 125 | }; 126 | 9F7B8CC428DC48E90004A2BF /* RunewordsWidget */ = { 127 | isa = PBXGroup; 128 | children = ( 129 | 9F7B8CC528DC48E90004A2BF /* RunewordsWidget.swift */, 130 | 9F7B8CC728DC48EB0004A2BF /* Assets.xcassets */, 131 | 9F7B8CC928DC48EB0004A2BF /* Info.plist */, 132 | ); 133 | path = RunewordsWidget; 134 | sourceTree = ""; 135 | }; 136 | 9FA71A1F28C71801003DF7E4 = { 137 | isa = PBXGroup; 138 | children = ( 139 | 9FA71A2A28C71801003DF7E4 /* RunewordsApp */, 140 | 9F7B8CC428DC48E90004A2BF /* RunewordsWidget */, 141 | 9FA71A5428C73E09003DF7E4 /* DesignSystem */, 142 | 9FA71A3928C71E6E003DF7E4 /* RunesData */, 143 | 9FA71A3D28C7319A003DF7E4 /* Stash */, 144 | 9FA71A2928C71801003DF7E4 /* Products */, 145 | 9FA71A3A28C72546003DF7E4 /* Frameworks */, 146 | ); 147 | sourceTree = ""; 148 | }; 149 | 9FA71A2928C71801003DF7E4 /* Products */ = { 150 | isa = PBXGroup; 151 | children = ( 152 | 9FA71A2828C71801003DF7E4 /* RunewordsApp.app */, 153 | 9F7B8CBF28DC48E90004A2BF /* RunewordsWidgetExtension.appex */, 154 | ); 155 | name = Products; 156 | sourceTree = ""; 157 | }; 158 | 9FA71A2A28C71801003DF7E4 /* RunewordsApp */ = { 159 | isa = PBXGroup; 160 | children = ( 161 | 9FA71A4A28C73540003DF7E4 /* App */, 162 | 9FA71A2F28C71803003DF7E4 /* Assets.xcassets */, 163 | 9FA71A5328C73D96003DF7E4 /* Info.plist */, 164 | 9F2EB1E128C9E2F300335548 /* More */, 165 | 9FA71A3128C71803003DF7E4 /* Preview Content */, 166 | 9FA71A4C28C73549003DF7E4 /* Runes */, 167 | 9FA71A4B28C73545003DF7E4 /* Runewords */, 168 | 9FA71A4928C7353C003DF7E4 /* Stash */, 169 | ); 170 | path = RunewordsApp; 171 | sourceTree = ""; 172 | }; 173 | 9FA71A3128C71803003DF7E4 /* Preview Content */ = { 174 | isa = PBXGroup; 175 | children = ( 176 | 9FA71A3228C71803003DF7E4 /* Preview Assets.xcassets */, 177 | ); 178 | path = "Preview Content"; 179 | sourceTree = ""; 180 | }; 181 | 9FA71A3A28C72546003DF7E4 /* Frameworks */ = { 182 | isa = PBXGroup; 183 | children = ( 184 | 9F7B8CC028DC48E90004A2BF /* WidgetKit.framework */, 185 | 9F7B8CC228DC48E90004A2BF /* SwiftUI.framework */, 186 | ); 187 | name = Frameworks; 188 | sourceTree = ""; 189 | }; 190 | 9FA71A4928C7353C003DF7E4 /* Stash */ = { 191 | isa = PBXGroup; 192 | children = ( 193 | 9FA71A4528C73480003DF7E4 /* StashView.swift */, 194 | ); 195 | path = Stash; 196 | sourceTree = ""; 197 | }; 198 | 9FA71A4A28C73540003DF7E4 /* App */ = { 199 | isa = PBXGroup; 200 | children = ( 201 | 9FA71A2B28C71801003DF7E4 /* RunewordsApp.swift */, 202 | 9FA71A4328C73452003DF7E4 /* AppTabView.swift */, 203 | 9FA71A4F28C73C13003DF7E4 /* Routeur.swift */, 204 | ); 205 | path = App; 206 | sourceTree = ""; 207 | }; 208 | 9FA71A4B28C73545003DF7E4 /* Runewords */ = { 209 | isa = PBXGroup; 210 | children = ( 211 | 9FA71A4028C732B8003DF7E4 /* RunewordsListView.swift */, 212 | 9FA71A5728C744C9003DF7E4 /* RunewordRowView.swift */, 213 | 9FA71A5928C746BF003DF7E4 /* RunewordDetailView.swift */, 214 | 9FA71A5B28C7539E003DF7E4 /* RunesStackView.swift */, 215 | ); 216 | path = Runewords; 217 | sourceTree = ""; 218 | }; 219 | 9FA71A4C28C73549003DF7E4 /* Runes */ = { 220 | isa = PBXGroup; 221 | children = ( 222 | 9FA71A4728C7348F003DF7E4 /* RunesView.swift */, 223 | 9FA71A4D28C73AAD003DF7E4 /* RuneDetailView.swift */, 224 | 9F968F5B28C8794A0019D9F4 /* RuneRowView.swift */, 225 | ); 226 | path = Runes; 227 | sourceTree = ""; 228 | }; 229 | /* End PBXGroup section */ 230 | 231 | /* Begin PBXNativeTarget section */ 232 | 9F7B8CBE28DC48E90004A2BF /* RunewordsWidgetExtension */ = { 233 | isa = PBXNativeTarget; 234 | buildConfigurationList = 9F7B8CD028DC48EB0004A2BF /* Build configuration list for PBXNativeTarget "RunewordsWidgetExtension" */; 235 | buildPhases = ( 236 | 9F7B8CBB28DC48E90004A2BF /* Sources */, 237 | 9F7B8CBC28DC48E90004A2BF /* Frameworks */, 238 | 9F7B8CBD28DC48E90004A2BF /* Resources */, 239 | ); 240 | buildRules = ( 241 | ); 242 | dependencies = ( 243 | ); 244 | name = RunewordsWidgetExtension; 245 | packageProductDependencies = ( 246 | 9F7B8CD128DC4E290004A2BF /* DesignSystem */, 247 | 9F7B8CD328DC4E290004A2BF /* RunesData */, 248 | 9F7B8CD528DC4E290004A2BF /* Stash */, 249 | ); 250 | productName = RunewordsWidgetExtension; 251 | productReference = 9F7B8CBF28DC48E90004A2BF /* RunewordsWidgetExtension.appex */; 252 | productType = "com.apple.product-type.app-extension"; 253 | }; 254 | 9FA71A2728C71801003DF7E4 /* RunewordsApp */ = { 255 | isa = PBXNativeTarget; 256 | buildConfigurationList = 9FA71A3628C71803003DF7E4 /* Build configuration list for PBXNativeTarget "RunewordsApp" */; 257 | buildPhases = ( 258 | 9FA71A2428C71801003DF7E4 /* Sources */, 259 | 9FA71A2528C71801003DF7E4 /* Frameworks */, 260 | 9FA71A2628C71801003DF7E4 /* Resources */, 261 | 9F7B8CCD28DC48EB0004A2BF /* Embed Foundation Extensions */, 262 | ); 263 | buildRules = ( 264 | ); 265 | dependencies = ( 266 | 9F7B8CCB28DC48EB0004A2BF /* PBXTargetDependency */, 267 | ); 268 | name = RunewordsApp; 269 | packageProductDependencies = ( 270 | 9FA71A3B28C72546003DF7E4 /* RunesData */, 271 | 9FA71A3E28C73217003DF7E4 /* Stash */, 272 | 9FA71A5528C73FAB003DF7E4 /* DesignSystem */, 273 | ); 274 | productName = RunewordsApp; 275 | productReference = 9FA71A2828C71801003DF7E4 /* RunewordsApp.app */; 276 | productType = "com.apple.product-type.application"; 277 | }; 278 | /* End PBXNativeTarget section */ 279 | 280 | /* Begin PBXProject section */ 281 | 9FA71A2028C71801003DF7E4 /* Project object */ = { 282 | isa = PBXProject; 283 | attributes = { 284 | BuildIndependentTargetsInParallel = 1; 285 | LastSwiftUpdateCheck = 1410; 286 | LastUpgradeCheck = 1400; 287 | TargetAttributes = { 288 | 9F7B8CBE28DC48E90004A2BF = { 289 | CreatedOnToolsVersion = 14.1; 290 | }; 291 | 9FA71A2728C71801003DF7E4 = { 292 | CreatedOnToolsVersion = 14.0; 293 | }; 294 | }; 295 | }; 296 | buildConfigurationList = 9FA71A2328C71801003DF7E4 /* Build configuration list for PBXProject "RunewordsApp" */; 297 | compatibilityVersion = "Xcode 14.0"; 298 | developmentRegion = en; 299 | hasScannedForEncodings = 0; 300 | knownRegions = ( 301 | en, 302 | Base, 303 | ); 304 | mainGroup = 9FA71A1F28C71801003DF7E4; 305 | productRefGroup = 9FA71A2928C71801003DF7E4 /* Products */; 306 | projectDirPath = ""; 307 | projectRoot = ""; 308 | targets = ( 309 | 9FA71A2728C71801003DF7E4 /* RunewordsApp */, 310 | 9F7B8CBE28DC48E90004A2BF /* RunewordsWidgetExtension */, 311 | ); 312 | }; 313 | /* End PBXProject section */ 314 | 315 | /* Begin PBXResourcesBuildPhase section */ 316 | 9F7B8CBD28DC48E90004A2BF /* Resources */ = { 317 | isa = PBXResourcesBuildPhase; 318 | buildActionMask = 2147483647; 319 | files = ( 320 | 9F7B8CC828DC48EB0004A2BF /* Assets.xcassets in Resources */, 321 | ); 322 | runOnlyForDeploymentPostprocessing = 0; 323 | }; 324 | 9FA71A2628C71801003DF7E4 /* Resources */ = { 325 | isa = PBXResourcesBuildPhase; 326 | buildActionMask = 2147483647; 327 | files = ( 328 | 9FA71A3328C71803003DF7E4 /* Preview Assets.xcassets in Resources */, 329 | 9FA71A3028C71803003DF7E4 /* Assets.xcassets in Resources */, 330 | ); 331 | runOnlyForDeploymentPostprocessing = 0; 332 | }; 333 | /* End PBXResourcesBuildPhase section */ 334 | 335 | /* Begin PBXSourcesBuildPhase section */ 336 | 9F7B8CBB28DC48E90004A2BF /* Sources */ = { 337 | isa = PBXSourcesBuildPhase; 338 | buildActionMask = 2147483647; 339 | files = ( 340 | 9F7B8CC628DC48E90004A2BF /* RunewordsWidget.swift in Sources */, 341 | ); 342 | runOnlyForDeploymentPostprocessing = 0; 343 | }; 344 | 9FA71A2428C71801003DF7E4 /* Sources */ = { 345 | isa = PBXSourcesBuildPhase; 346 | buildActionMask = 2147483647; 347 | files = ( 348 | 9F968F5C28C8794A0019D9F4 /* RuneRowView.swift in Sources */, 349 | 9FA71A5028C73C13003DF7E4 /* Routeur.swift in Sources */, 350 | 9FA71A4628C73480003DF7E4 /* StashView.swift in Sources */, 351 | 9F2EB1E528C9E4C200335548 /* CubeRecipesListView.swift in Sources */, 352 | 9FA71A5A28C746BF003DF7E4 /* RunewordDetailView.swift in Sources */, 353 | 9FA71A5828C744C9003DF7E4 /* RunewordRowView.swift in Sources */, 354 | 9FA71A4428C73452003DF7E4 /* AppTabView.swift in Sources */, 355 | 9FA71A2C28C71801003DF7E4 /* RunewordsApp.swift in Sources */, 356 | 9F2EB1E328C9E30000335548 /* MoreView.swift in Sources */, 357 | 9FA71A4828C7348F003DF7E4 /* RunesView.swift in Sources */, 358 | 9FA71A4E28C73AAD003DF7E4 /* RuneDetailView.swift in Sources */, 359 | 9FA71A5C28C7539E003DF7E4 /* RunesStackView.swift in Sources */, 360 | 9FA71A4128C732B8003DF7E4 /* RunewordsListView.swift in Sources */, 361 | ); 362 | runOnlyForDeploymentPostprocessing = 0; 363 | }; 364 | /* End PBXSourcesBuildPhase section */ 365 | 366 | /* Begin PBXTargetDependency section */ 367 | 9F7B8CCB28DC48EB0004A2BF /* PBXTargetDependency */ = { 368 | isa = PBXTargetDependency; 369 | target = 9F7B8CBE28DC48E90004A2BF /* RunewordsWidgetExtension */; 370 | targetProxy = 9F7B8CCA28DC48EB0004A2BF /* PBXContainerItemProxy */; 371 | }; 372 | /* End PBXTargetDependency section */ 373 | 374 | /* Begin XCBuildConfiguration section */ 375 | 9F7B8CCE28DC48EB0004A2BF /* Debug */ = { 376 | isa = XCBuildConfiguration; 377 | buildSettings = { 378 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 379 | ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; 380 | CODE_SIGN_STYLE = Automatic; 381 | CURRENT_PROJECT_VERSION = 1; 382 | DEVELOPMENT_TEAM = Z6P74P6T99; 383 | GENERATE_INFOPLIST_FILE = YES; 384 | INFOPLIST_FILE = RunewordsWidget/Info.plist; 385 | INFOPLIST_KEY_CFBundleDisplayName = RunewordsWidget; 386 | INFOPLIST_KEY_NSHumanReadableCopyright = ""; 387 | IPHONEOS_DEPLOYMENT_TARGET = 16.1; 388 | LD_RUNPATH_SEARCH_PATHS = ( 389 | "$(inherited)", 390 | "@executable_path/Frameworks", 391 | "@executable_path/../../Frameworks", 392 | ); 393 | MARKETING_VERSION = 1.0; 394 | PRODUCT_BUNDLE_IDENTIFIER = com.diablo.runewordapp.RunewordsWidget; 395 | PRODUCT_NAME = "$(TARGET_NAME)"; 396 | SKIP_INSTALL = YES; 397 | SWIFT_EMIT_LOC_STRINGS = YES; 398 | SWIFT_VERSION = 5.0; 399 | TARGETED_DEVICE_FAMILY = "1,2"; 400 | }; 401 | name = Debug; 402 | }; 403 | 9F7B8CCF28DC48EB0004A2BF /* Release */ = { 404 | isa = XCBuildConfiguration; 405 | buildSettings = { 406 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 407 | ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; 408 | CODE_SIGN_STYLE = Automatic; 409 | CURRENT_PROJECT_VERSION = 1; 410 | DEVELOPMENT_TEAM = Z6P74P6T99; 411 | GENERATE_INFOPLIST_FILE = YES; 412 | INFOPLIST_FILE = RunewordsWidget/Info.plist; 413 | INFOPLIST_KEY_CFBundleDisplayName = RunewordsWidget; 414 | INFOPLIST_KEY_NSHumanReadableCopyright = ""; 415 | IPHONEOS_DEPLOYMENT_TARGET = 16.1; 416 | LD_RUNPATH_SEARCH_PATHS = ( 417 | "$(inherited)", 418 | "@executable_path/Frameworks", 419 | "@executable_path/../../Frameworks", 420 | ); 421 | MARKETING_VERSION = 1.0; 422 | PRODUCT_BUNDLE_IDENTIFIER = com.diablo.runewordapp.RunewordsWidget; 423 | PRODUCT_NAME = "$(TARGET_NAME)"; 424 | SKIP_INSTALL = YES; 425 | SWIFT_EMIT_LOC_STRINGS = YES; 426 | SWIFT_VERSION = 5.0; 427 | TARGETED_DEVICE_FAMILY = "1,2"; 428 | }; 429 | name = Release; 430 | }; 431 | 9FA71A3428C71803003DF7E4 /* Debug */ = { 432 | isa = XCBuildConfiguration; 433 | buildSettings = { 434 | ALWAYS_SEARCH_USER_PATHS = NO; 435 | CLANG_ANALYZER_NONNULL = YES; 436 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 437 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 438 | CLANG_ENABLE_MODULES = YES; 439 | CLANG_ENABLE_OBJC_ARC = YES; 440 | CLANG_ENABLE_OBJC_WEAK = YES; 441 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 442 | CLANG_WARN_BOOL_CONVERSION = YES; 443 | CLANG_WARN_COMMA = YES; 444 | CLANG_WARN_CONSTANT_CONVERSION = YES; 445 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 446 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 447 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 448 | CLANG_WARN_EMPTY_BODY = YES; 449 | CLANG_WARN_ENUM_CONVERSION = YES; 450 | CLANG_WARN_INFINITE_RECURSION = YES; 451 | CLANG_WARN_INT_CONVERSION = YES; 452 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 453 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 454 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 455 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 456 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 457 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 458 | CLANG_WARN_STRICT_PROTOTYPES = YES; 459 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 460 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 461 | CLANG_WARN_UNREACHABLE_CODE = YES; 462 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 463 | COPY_PHASE_STRIP = NO; 464 | DEBUG_INFORMATION_FORMAT = dwarf; 465 | ENABLE_STRICT_OBJC_MSGSEND = YES; 466 | ENABLE_TESTABILITY = YES; 467 | GCC_C_LANGUAGE_STANDARD = gnu11; 468 | GCC_DYNAMIC_NO_PIC = NO; 469 | GCC_NO_COMMON_BLOCKS = YES; 470 | GCC_OPTIMIZATION_LEVEL = 0; 471 | GCC_PREPROCESSOR_DEFINITIONS = ( 472 | "DEBUG=1", 473 | "$(inherited)", 474 | ); 475 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 476 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 477 | GCC_WARN_UNDECLARED_SELECTOR = YES; 478 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 479 | GCC_WARN_UNUSED_FUNCTION = YES; 480 | GCC_WARN_UNUSED_VARIABLE = YES; 481 | IPHONEOS_DEPLOYMENT_TARGET = 16.0; 482 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 483 | MTL_FAST_MATH = YES; 484 | ONLY_ACTIVE_ARCH = YES; 485 | SDKROOT = iphoneos; 486 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 487 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 488 | }; 489 | name = Debug; 490 | }; 491 | 9FA71A3528C71803003DF7E4 /* Release */ = { 492 | isa = XCBuildConfiguration; 493 | buildSettings = { 494 | ALWAYS_SEARCH_USER_PATHS = NO; 495 | CLANG_ANALYZER_NONNULL = YES; 496 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 497 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 498 | CLANG_ENABLE_MODULES = YES; 499 | CLANG_ENABLE_OBJC_ARC = YES; 500 | CLANG_ENABLE_OBJC_WEAK = YES; 501 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 502 | CLANG_WARN_BOOL_CONVERSION = YES; 503 | CLANG_WARN_COMMA = YES; 504 | CLANG_WARN_CONSTANT_CONVERSION = YES; 505 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 506 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 507 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 508 | CLANG_WARN_EMPTY_BODY = YES; 509 | CLANG_WARN_ENUM_CONVERSION = YES; 510 | CLANG_WARN_INFINITE_RECURSION = YES; 511 | CLANG_WARN_INT_CONVERSION = YES; 512 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 513 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 514 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 515 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 516 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 517 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 518 | CLANG_WARN_STRICT_PROTOTYPES = YES; 519 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 520 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 521 | CLANG_WARN_UNREACHABLE_CODE = YES; 522 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 523 | COPY_PHASE_STRIP = NO; 524 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 525 | ENABLE_NS_ASSERTIONS = NO; 526 | ENABLE_STRICT_OBJC_MSGSEND = YES; 527 | GCC_C_LANGUAGE_STANDARD = gnu11; 528 | GCC_NO_COMMON_BLOCKS = YES; 529 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 530 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 531 | GCC_WARN_UNDECLARED_SELECTOR = YES; 532 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 533 | GCC_WARN_UNUSED_FUNCTION = YES; 534 | GCC_WARN_UNUSED_VARIABLE = YES; 535 | IPHONEOS_DEPLOYMENT_TARGET = 16.0; 536 | MTL_ENABLE_DEBUG_INFO = NO; 537 | MTL_FAST_MATH = YES; 538 | SDKROOT = iphoneos; 539 | SWIFT_COMPILATION_MODE = wholemodule; 540 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 541 | VALIDATE_PRODUCT = YES; 542 | }; 543 | name = Release; 544 | }; 545 | 9FA71A3728C71803003DF7E4 /* Debug */ = { 546 | isa = XCBuildConfiguration; 547 | buildSettings = { 548 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 549 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 550 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 551 | CODE_SIGN_STYLE = Automatic; 552 | CURRENT_PROJECT_VERSION = 1; 553 | DEVELOPMENT_ASSET_PATHS = "\"RunewordsApp/Preview Content\""; 554 | DEVELOPMENT_TEAM = Z6P74P6T99; 555 | ENABLE_PREVIEWS = YES; 556 | GENERATE_INFOPLIST_FILE = YES; 557 | INFOPLIST_FILE = RunewordsApp/Info.plist; 558 | INFOPLIST_KEY_NSSupportsLiveActivities = YES; 559 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; 560 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 561 | INFOPLIST_KEY_UILaunchScreen_Generation = YES; 562 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 563 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 564 | LD_RUNPATH_SEARCH_PATHS = ( 565 | "$(inherited)", 566 | "@executable_path/Frameworks", 567 | ); 568 | MARKETING_VERSION = 1.0; 569 | PRODUCT_BUNDLE_IDENTIFIER = com.diablo.runewordapp; 570 | PRODUCT_NAME = "$(TARGET_NAME)"; 571 | SWIFT_EMIT_LOC_STRINGS = YES; 572 | SWIFT_VERSION = 5.0; 573 | TARGETED_DEVICE_FAMILY = "1,2"; 574 | }; 575 | name = Debug; 576 | }; 577 | 9FA71A3828C71803003DF7E4 /* Release */ = { 578 | isa = XCBuildConfiguration; 579 | buildSettings = { 580 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 581 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 582 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 583 | CODE_SIGN_STYLE = Automatic; 584 | CURRENT_PROJECT_VERSION = 1; 585 | DEVELOPMENT_ASSET_PATHS = "\"RunewordsApp/Preview Content\""; 586 | DEVELOPMENT_TEAM = Z6P74P6T99; 587 | ENABLE_PREVIEWS = YES; 588 | GENERATE_INFOPLIST_FILE = YES; 589 | INFOPLIST_FILE = RunewordsApp/Info.plist; 590 | INFOPLIST_KEY_NSSupportsLiveActivities = YES; 591 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; 592 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 593 | INFOPLIST_KEY_UILaunchScreen_Generation = YES; 594 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 595 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 596 | LD_RUNPATH_SEARCH_PATHS = ( 597 | "$(inherited)", 598 | "@executable_path/Frameworks", 599 | ); 600 | MARKETING_VERSION = 1.0; 601 | PRODUCT_BUNDLE_IDENTIFIER = com.diablo.runewordapp; 602 | PRODUCT_NAME = "$(TARGET_NAME)"; 603 | SWIFT_EMIT_LOC_STRINGS = YES; 604 | SWIFT_VERSION = 5.0; 605 | TARGETED_DEVICE_FAMILY = "1,2"; 606 | }; 607 | name = Release; 608 | }; 609 | /* End XCBuildConfiguration section */ 610 | 611 | /* Begin XCConfigurationList section */ 612 | 9F7B8CD028DC48EB0004A2BF /* Build configuration list for PBXNativeTarget "RunewordsWidgetExtension" */ = { 613 | isa = XCConfigurationList; 614 | buildConfigurations = ( 615 | 9F7B8CCE28DC48EB0004A2BF /* Debug */, 616 | 9F7B8CCF28DC48EB0004A2BF /* Release */, 617 | ); 618 | defaultConfigurationIsVisible = 0; 619 | defaultConfigurationName = Release; 620 | }; 621 | 9FA71A2328C71801003DF7E4 /* Build configuration list for PBXProject "RunewordsApp" */ = { 622 | isa = XCConfigurationList; 623 | buildConfigurations = ( 624 | 9FA71A3428C71803003DF7E4 /* Debug */, 625 | 9FA71A3528C71803003DF7E4 /* Release */, 626 | ); 627 | defaultConfigurationIsVisible = 0; 628 | defaultConfigurationName = Release; 629 | }; 630 | 9FA71A3628C71803003DF7E4 /* Build configuration list for PBXNativeTarget "RunewordsApp" */ = { 631 | isa = XCConfigurationList; 632 | buildConfigurations = ( 633 | 9FA71A3728C71803003DF7E4 /* Debug */, 634 | 9FA71A3828C71803003DF7E4 /* Release */, 635 | ); 636 | defaultConfigurationIsVisible = 0; 637 | defaultConfigurationName = Release; 638 | }; 639 | /* End XCConfigurationList section */ 640 | 641 | /* Begin XCSwiftPackageProductDependency section */ 642 | 9F7B8CD128DC4E290004A2BF /* DesignSystem */ = { 643 | isa = XCSwiftPackageProductDependency; 644 | productName = DesignSystem; 645 | }; 646 | 9F7B8CD328DC4E290004A2BF /* RunesData */ = { 647 | isa = XCSwiftPackageProductDependency; 648 | productName = RunesData; 649 | }; 650 | 9F7B8CD528DC4E290004A2BF /* Stash */ = { 651 | isa = XCSwiftPackageProductDependency; 652 | productName = Stash; 653 | }; 654 | 9FA71A3B28C72546003DF7E4 /* RunesData */ = { 655 | isa = XCSwiftPackageProductDependency; 656 | productName = RunesData; 657 | }; 658 | 9FA71A3E28C73217003DF7E4 /* Stash */ = { 659 | isa = XCSwiftPackageProductDependency; 660 | productName = Stash; 661 | }; 662 | 9FA71A5528C73FAB003DF7E4 /* DesignSystem */ = { 663 | isa = XCSwiftPackageProductDependency; 664 | productName = DesignSystem; 665 | }; 666 | /* End XCSwiftPackageProductDependency section */ 667 | }; 668 | rootObject = 9FA71A2028C71801003DF7E4 /* Project object */; 669 | } 670 | -------------------------------------------------------------------------------- /RunewordsApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /RunewordsApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /RunewordsApp/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/.DS_Store -------------------------------------------------------------------------------- /RunewordsApp/App/AppTabView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import RunesData 3 | import DesignSystem 4 | 5 | struct AppTabView: View { 6 | var body: some View { 7 | TabView { 8 | NavigationStack { 9 | RunewordsListView() 10 | .withRouteur() 11 | } 12 | .tabItem { 13 | Label("Runewords", systemImage: "leaf") 14 | } 15 | 16 | NavigationStack { 17 | RunesView() 18 | .withRouteur() 19 | } 20 | .tabItem { 21 | Label("Runes", systemImage: "triangle") 22 | } 23 | 24 | NavigationStack { 25 | StashView() 26 | .withRouteur() 27 | } 28 | .tabItem { 29 | Label("Stash", systemImage: "folder") 30 | } 31 | 32 | NavigationStack { 33 | MoreView() 34 | .withRouteur() 35 | }.tabItem { 36 | Label("More", systemImage: "ellipsis") 37 | } 38 | } 39 | } 40 | } 41 | 42 | struct AppTabView_Previews: PreviewProvider { 43 | static var previews: some View { 44 | AppTabView() 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /RunewordsApp/App/Routeur.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import SwiftUI 3 | import RunesData 4 | 5 | extension View { 6 | func withRouteur() -> some View { 7 | self.navigationDestination(for: Rune.self) { rune in 8 | RuneDetailView(rune: rune) 9 | }.navigationDestination(for: Runeword.self) { runeword in 10 | RunewordDetailView(runeword: runeword) 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /RunewordsApp/App/RunewordsApp.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import RunesData 3 | import DesignSystem 4 | import Stash 5 | 6 | @main 7 | struct RunewordsApp: App { 8 | init() { 9 | DesignSystem.registerFonts() 10 | DesignSystem.registerAppaerance() 11 | } 12 | 13 | var body: some Scene { 14 | WindowGroup { 15 | AppTabView() 16 | .environmentObject(RunesData()) 17 | .environmentObject(Stash()) 18 | .preferredColorScheme(.dark) 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/.DS_Store -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.000", 9 | "green" : "0.620", 10 | "red" : "0.867" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/AppIcon.appiconset/AppIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/AppIcon.appiconset/AppIcon.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "AppIcon.png", 5 | "idiom" : "universal", 6 | "platform" : "ios", 7 | "size" : "1024x1024" 8 | } 9 | ], 10 | "info" : { 11 | "author" : "xcode", 12 | "version" : 1 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/amn.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "amn.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/amn.imageset/amn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/amn.imageset/amn.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/ber.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ber.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/ber.imageset/ber.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/ber.imageset/ber.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/cham.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "cham.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/cham.imageset/cham.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/cham.imageset/cham.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/dol.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "dol.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/dol.imageset/dol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/dol.imageset/dol.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/el.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "el.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/el.imageset/el.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/el.imageset/el.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/eld.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "eld.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/eld.imageset/eld.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/eld.imageset/eld.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/eth.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "eth.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/eth.imageset/eth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/eth.imageset/eth.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/fal.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "fal.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/fal.imageset/fal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/fal.imageset/fal.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/gul.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "gul.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/gul.imageset/gul.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/gul.imageset/gul.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/hel.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "hel.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/hel.imageset/hel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/hel.imageset/hel.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/io.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "io.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/io.imageset/io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/io.imageset/io.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/ist.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ist.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/ist.imageset/ist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/ist.imageset/ist.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/ith.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ith.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/ith.imageset/ith.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/ith.imageset/ith.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/jah.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "jah.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/jah.imageset/jah.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/jah.imageset/jah.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/ko.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ko.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/ko.imageset/ko.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/ko.imageset/ko.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/lem.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "lem.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/lem.imageset/lem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/lem.imageset/lem.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/lo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "lo.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/lo.imageset/lo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/lo.imageset/lo.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/lum.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "lum.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/lum.imageset/lum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/lum.imageset/lum.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/mal.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "mal.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/mal.imageset/mal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/mal.imageset/mal.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/nef.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "nef.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/nef.imageset/nef.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/nef.imageset/nef.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/ohm.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ohm.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/ohm.imageset/ohm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/ohm.imageset/ohm.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/ort.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ort.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/ort.imageset/ort.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/ort.imageset/ort.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/pul.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "pul.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/pul.imageset/pul.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/pul.imageset/pul.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/ral.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ral.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/ral.imageset/ral.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/ral.imageset/ral.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/shael.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "shael.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/shael.imageset/shael.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/shael.imageset/shael.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/sol.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "sol.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/sol.imageset/sol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/sol.imageset/sol.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/sur.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "sur.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/sur.imageset/sur.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/sur.imageset/sur.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/tal.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "tal.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/tal.imageset/tal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/tal.imageset/tal.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/thul.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "thul.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/thul.imageset/thul.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/thul.imageset/thul.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/tir.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "tir.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/tir.imageset/tir.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/tir.imageset/tir.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/um.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "um.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/um.imageset/um.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/um.imageset/um.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/vex.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "vex.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/vex.imageset/vex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/vex.imageset/vex.png -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/zod.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "zod.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Assets.xcassets/Runes/zod.imageset/zod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsApp/Assets.xcassets/Runes/zod.imageset/zod.png -------------------------------------------------------------------------------- /RunewordsApp/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ITSAppUsesNonExemptEncryption 6 | 7 | UIAppFonts 8 | 9 | AVQest 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /RunewordsApp/More/CubeRecipesListView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import RunesData 3 | import DesignSystem 4 | 5 | struct CubeRecipesListView: View { 6 | @EnvironmentObject private var data: RunesData 7 | 8 | @State private var search: String = "" 9 | 10 | var recipes: [CubeRecipe] { 11 | if !search.isEmpty { 12 | return data.cubeRecipes.filter{ $0.description.contains(search) } 13 | } 14 | return data.cubeRecipes 15 | } 16 | 17 | var body: some View { 18 | List(recipes) { recipe in 19 | VStack(alignment: .leading) { 20 | Text(recipe.formattedInput) 21 | Text(recipe.formattedOutput) 22 | .foregroundColor(.itemsColor(color: .rare)) 23 | } 24 | .font(.AVQestFont(textStyle: .callout)) 25 | } 26 | .searchable(text: $search, 27 | placement: .navigationBarDrawer(displayMode: .automatic)) 28 | .navigationTitle("Cube Recipes") 29 | } 30 | } 31 | 32 | struct CubeRecipesListView_Previews: PreviewProvider { 33 | static var previews: some View { 34 | CubeRecipesListView() 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /RunewordsApp/More/MoreView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import DesignSystem 3 | 4 | struct MoreView: View { 5 | var body: some View { 6 | Form { 7 | Section { 8 | NavigationLink(destination: CubeRecipesListView()) { 9 | Text("Cube recipes") 10 | } 11 | } 12 | 13 | Section { 14 | LabeledContent { 15 | Text("Thomas Ricouard") 16 | } label: { 17 | Text("Author") 18 | } 19 | LabeledContent { 20 | Link("@Dimillian", destination: URL(string: "https://twitter.com/dimillian")!) 21 | } label: { 22 | Text("Twitter") 23 | } 24 | LabeledContent { 25 | Link("Dimillian", destination: URL(string: "https://github.com/Dimillian?tab=repositories")!) 26 | } label: { 27 | Text("GitHub") 28 | } 29 | LabeledContent { 30 | Link("github/RunewordsApp", destination: URL(string: "https://github.com/Dimillian/RunewordsApp")!) 31 | } label: { 32 | Text("Source code") 33 | } 34 | LabeledContent { 35 | Link("blizzhackers/d2data", 36 | destination: URL(string: "https://github.com/blizzhackers/d2data/tree/master/json")!) 37 | } label: { 38 | Text("Datasource") 39 | } 40 | } header: { 41 | Text("About") 42 | } 43 | } 44 | .font(.AVQestFont(textStyle: .body)) 45 | .navigationTitle("More") 46 | } 47 | } 48 | 49 | struct MoreView_Previews: PreviewProvider { 50 | static var previews: some View { 51 | MoreView() 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /RunewordsApp/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /RunewordsApp/Runes/RuneDetailView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import RunesData 3 | import DesignSystem 4 | import Stash 5 | 6 | struct RuneDetailView: View { 7 | @EnvironmentObject private var data: RunesData 8 | @EnvironmentObject private var stash: Stash 9 | 10 | public let rune: Rune 11 | 12 | var body: some View { 13 | List { 14 | Section { 15 | LabeledContent { 16 | Image(rune.name.lowercased()) 17 | } label: { 18 | Text("Rune") 19 | } 20 | LabeledContent("Weapon", value: rune.weapon) 21 | LabeledContent("Armor", value: rune.armor) 22 | LabeledContent("Shield", value: rune.shield) 23 | } header: { 24 | Text("Information") 25 | } 26 | .font(.AVQestFont(textStyle: .body)) 27 | 28 | Section { 29 | LabeledContent("Countess extra drop?", value: rune.countess) 30 | LabeledContent("Hellforge drop?", value: rune.hellforge) 31 | LabeledContent("Treasure class", value: rune.treasure) 32 | } header: { 33 | Text("Drop") 34 | } 35 | .font(.AVQestFont(textStyle: .body)) 36 | 37 | Section { 38 | ForEach(data.runewordsFor(runes: [rune.name])) { runeword in 39 | NavigationLink(value: runeword) { 40 | RunewordRowView(runeword: runeword) 41 | } 42 | } 43 | } header: { 44 | Text("Runewords") 45 | } 46 | .font(.AVQestFont(textStyle: .body)) 47 | } 48 | .navigationTitle(rune.name) 49 | .toolbar { 50 | Button { 51 | stash.toggleRune(rune: rune) 52 | } label: { 53 | Image(systemName: stash.isInStash(rune: rune) ? "folder.fill" : "folder") 54 | } 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /RunewordsApp/Runes/RuneRowView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import RunesData 3 | 4 | struct RuneRowView: View { 5 | let rune: Rune 6 | 7 | var body: some View { 8 | VStack { 9 | Image(rune.name.lowercased()) 10 | Text(rune.name) 11 | .font(.AVQestFont(textStyle: .headline)) 12 | .foregroundColor(.white) 13 | } 14 | } 15 | } 16 | 17 | struct RuneRowView_Previews: PreviewProvider { 18 | static var previews: some View { 19 | RuneRowView(rune: RunesData().runes.first!) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsApp/Runes/RunesView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import RunesData 3 | import DesignSystem 4 | import Stash 5 | 6 | struct RunesView: View { 7 | @EnvironmentObject private var data: RunesData 8 | @EnvironmentObject private var stash: Stash 9 | 10 | @State private var isInCraftMode = false 11 | @State private var selectedRune: [Rune] = [] 12 | @State private var isRunewordsSheetPresented = false 13 | 14 | private var availableRunewords: [Runeword] { 15 | data.runewordsFor(runes: selectedRune.map{ $0.name }) 16 | } 17 | 18 | var body: some View { 19 | ZStack(alignment: .bottom) { 20 | ScrollView { 21 | LazyVGrid(columns: [GridItem(.adaptive(minimum: 80))], spacing: 20) { 22 | ForEach(data.runes) { rune in 23 | if isInCraftMode { 24 | makeCrafingModeRow(rune: rune) 25 | } else { 26 | makeStandardModeRow(rune: rune) 27 | } 28 | } 29 | } 30 | } 31 | .navigationTitle("Runes") 32 | .toolbar { 33 | Button { 34 | isInCraftMode.toggle() 35 | } label: { 36 | Text(isInCraftMode ? "Cancel" : "Craft") 37 | } 38 | } 39 | if isInCraftMode { 40 | runewordsAvailableView 41 | .padding(.bottom, 8) 42 | } 43 | } 44 | } 45 | 46 | @ViewBuilder 47 | private func makeCrafingModeRow(rune: Rune) -> some View { 48 | let isSelected = selectedRune.contains(where: { $0 == rune }) 49 | ZStack(alignment: .topLeading) { 50 | if isSelected { 51 | Image(systemName: "checkmark.circle.fill") 52 | .foregroundColor(Color.itemsColor(color: .set)) 53 | .offset(x: -16) 54 | } 55 | RuneRowView(rune: rune) 56 | .overlay( 57 | RoundedRectangle(cornerRadius: 16) 58 | .stroke(Color.itemsColor(color: isSelected ? .set : .runic), lineWidth: 2) 59 | .frame(width: 70, height: 70) 60 | ) 61 | .onTapGesture { 62 | withAnimation(.easeOut) { 63 | if isSelected { 64 | selectedRune.removeAll(where: { $0 == rune }) 65 | } else { 66 | selectedRune.append(rune) 67 | } 68 | } 69 | } 70 | } 71 | } 72 | 73 | private func makeStandardModeRow(rune: Rune) -> some View { 74 | NavigationLink(value: rune) { 75 | RuneRowView(rune: rune) 76 | } 77 | .contextMenu { 78 | Button { 79 | withAnimation(.easeIn) { 80 | isInCraftMode = true 81 | selectedRune.append(rune) 82 | } 83 | } label: { 84 | Text("Select for crafting") 85 | } 86 | 87 | Button { 88 | stash.toggleRune(rune: rune) 89 | } label: { 90 | if stash.isInStash(rune: rune) { 91 | Text("Remove from my stash") 92 | } else { 93 | Text("Add to my stash") 94 | } 95 | } 96 | } 97 | } 98 | 99 | private var runewordsAvailableView: some View { 100 | Button { 101 | isRunewordsSheetPresented = true 102 | } label: { 103 | Text("\(availableRunewords.count) possible Runewords") 104 | .font(.AVQestFont(textStyle: .callout)) 105 | .foregroundColor(.white) 106 | .padding(8) 107 | .background(Color.itemsColor(color: .magic)) 108 | .clipShape(Capsule()) 109 | } 110 | .sheet(isPresented: $isRunewordsSheetPresented) { 111 | List(availableRunewords) { runeword in 112 | RunewordRowView(runeword: runeword, displayMode: .large) 113 | } 114 | }.presentationDetents([.medium]) 115 | } 116 | } 117 | 118 | struct RunesView_Previews: PreviewProvider { 119 | static var previews: some View { 120 | RunesView() 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /RunewordsApp/Runewords/RunesStackView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import RunesData 3 | import DesignSystem 4 | 5 | struct RunesStackView: View { 6 | let runes: [String] 7 | 8 | @Binding var asImage: Bool 9 | 10 | var body: some View { 11 | HStack { 12 | ForEach(runes, id: \.self) { rune in 13 | if asImage { 14 | Image(rune.lowercased()) 15 | .resizable() 16 | .frame(width: 30, height: 30) 17 | } else { 18 | Text(rune) 19 | .font(.AVQestFont(textStyle: .title2)) 20 | } 21 | } 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /RunewordsApp/Runewords/RunewordDetailView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import RunesData 3 | import DesignSystem 4 | import Stash 5 | import ActivityKit 6 | 7 | struct RunewordDetailView: View { 8 | @EnvironmentObject private var stash: Stash 9 | 10 | @State private var runesAsImage = true 11 | 12 | let runeword: Runeword 13 | 14 | init(runeword: Runeword) { 15 | self.runeword = runeword 16 | 17 | if #available(iOS 16.1, *) { 18 | Task { 19 | RunewordActivityManager.shared.currentActivity = try? Activity.request(attributes: .init(), contentState: .init(runeword: runeword)) 20 | } 21 | } 22 | } 23 | 24 | var body: some View { 25 | List { 26 | Section { 27 | LabeledContent("Level", value: String(runeword.level)) 28 | LabeledContent { 29 | RunesStackView(runes: Array(runeword.runes), asImage: $runesAsImage) 30 | .onTapGesture { 31 | runesAsImage.toggle() 32 | } 33 | } label: { 34 | Text("Runes") 35 | } 36 | LabeledContent("Base", value: runeword.types.joined(separator: ",")) 37 | } header: { 38 | Text("Information") 39 | }.font(.AVQestFont(textStyle: .body)) 40 | 41 | Section { 42 | Text(runeword.description ?? "") 43 | .foregroundColor(.itemsColor(color: .magic)) 44 | } header: { 45 | Text("Description") 46 | } 47 | .font(.AVQestFont(textStyle: .body)) 48 | } 49 | .navigationTitle(runeword.title) 50 | .toolbar { 51 | ToolbarItem(placement: .navigationBarTrailing) { 52 | Button { 53 | stash.toggleFavorite(runeword: runeword) 54 | } label: { 55 | Image(systemName: stash.isFavorite(runeword: runeword) ? "star.fill" : "star") 56 | .tint(.itemsColor(color: .runic)) 57 | } 58 | 59 | } 60 | } 61 | .onDisappear { 62 | if #available(iOS 16.1, *) { 63 | Task { 64 | await RunewordActivityManager.shared.currentActivity?.end() 65 | } 66 | } 67 | } 68 | } 69 | } 70 | 71 | struct RunewordView_Previews: PreviewProvider { 72 | static var previews: some View { 73 | RunewordDetailView(runeword: RunesData().runewords.first!) 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /RunewordsApp/Runewords/RunewordRowView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import RunesData 3 | import DesignSystem 4 | import Stash 5 | 6 | struct RunewordRowView: View { 7 | @EnvironmentObject private var stash: Stash 8 | 9 | enum DisplayMode { 10 | case compact, large 11 | } 12 | 13 | let runeword: Runeword 14 | let displayMode: DisplayMode 15 | 16 | init(runeword: Runeword, displayMode: DisplayMode = .compact) { 17 | self.runeword = runeword 18 | self.displayMode = displayMode 19 | } 20 | 21 | var body: some View { 22 | VStack(alignment: .leading, spacing: 4) { 23 | runewordName 24 | RunesStackView(runes: Array(runeword.runes), asImage: .constant(true)) 25 | if displayMode == .large { 26 | largeModeView 27 | .font(.AVQestFont(textStyle: .body)) 28 | } 29 | } 30 | .contextMenu { 31 | Button { 32 | stash.toggleFavorite(runeword: runeword) 33 | } label: { 34 | if stash.isFavorite(runeword: runeword) { 35 | Text("Remove form favorite") 36 | } else { 37 | Text("Add to favorite") 38 | } 39 | } 40 | } 41 | } 42 | 43 | private var runewordName: some View { 44 | Text("\(runeword.title) (l:\(runeword.level))") 45 | .font(.AVQestFont(textStyle: .title3)) 46 | } 47 | 48 | @ViewBuilder 49 | private var largeModeView: some View { 50 | Text("Level: \(runeword.level)") 51 | Text("Base: \(runeword.types.joined(separator: ","))") 52 | Text(runeword.description ?? "") 53 | } 54 | } 55 | 56 | struct RunewordRowView_Previews: PreviewProvider { 57 | static var previews: some View { 58 | List { 59 | RunewordRowView(runeword: RunesData().runewords.first!) 60 | RunewordRowView(runeword: RunesData().runewords.first!) 61 | RunewordRowView(runeword: RunesData().runewords.first!) 62 | RunewordRowView(runeword: RunesData().runewords.first!) 63 | RunewordRowView(runeword: RunesData().runewords.first!) 64 | RunewordRowView(runeword: RunesData().runewords.first!) 65 | } 66 | .listStyle(.plain) 67 | .preferredColorScheme(.dark) 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /RunewordsApp/Runewords/RunewordsListView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import RunesData 3 | import Stash 4 | 5 | struct RunewordsListView: View { 6 | @EnvironmentObject private var data: RunesData 7 | 8 | @State private var itemBaseFilter: [ItemBase] = [] 9 | @State private var searchText: String = "" 10 | 11 | private var runewords: [Runeword] { 12 | var baseRunewords: [Runeword] 13 | if !itemBaseFilter.isEmpty { 14 | baseRunewords = data.runewordsFor(itemsBase: itemBaseFilter) 15 | } else { 16 | baseRunewords = data.runewords 17 | } 18 | if !searchText.isEmpty { 19 | baseRunewords = baseRunewords.filter{ $0.title.hasPrefix(searchText) } 20 | } 21 | return baseRunewords 22 | } 23 | 24 | var body: some View { 25 | List(runewords) { runeword in 26 | NavigationLink(value: runeword) { 27 | RunewordRowView(runeword: runeword) 28 | } 29 | } 30 | .listStyle(.plain) 31 | .navigationTitle("Runewords") 32 | .searchable(text: $searchText, 33 | tokens: $itemBaseFilter, 34 | placement: .navigationBarDrawer(displayMode: .always), 35 | prompt: "Search & Filter Runewords", 36 | token: { token in 37 | Text(token.name) 38 | }) 39 | .toolbar { 40 | ToolbarItem(placement: .navigationBarTrailing) { 41 | filterMenuView 42 | } 43 | } 44 | } 45 | 46 | private var filterMenuView: some View { 47 | Menu { 48 | ForEach(data.itemBase) { itemBase in 49 | Button { 50 | if !itemBaseFilter.contains(where: { $0.id == itemBase.id }) { 51 | itemBaseFilter.append(itemBase) 52 | } 53 | } label: { 54 | Text(itemBase.name) 55 | } 56 | } 57 | } label: { 58 | if !itemBaseFilter.isEmpty { 59 | Image(systemName: "line.3.horizontal.decrease.circle.fill") 60 | } else { 61 | Image(systemName: "line.3.horizontal.decrease.circle") 62 | } 63 | } 64 | } 65 | } 66 | 67 | struct RunewordsListView_Previews: PreviewProvider { 68 | static var previews: some View { 69 | RunewordsListView() 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /RunewordsApp/Stash/StashView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import DesignSystem 3 | import Stash 4 | import RunesData 5 | 6 | struct StashView: View { 7 | @EnvironmentObject private var data: RunesData 8 | @EnvironmentObject private var stash: Stash 9 | 10 | var availableRunewords: [Runeword] { 11 | data.allAvailableRuneworsFor(runes: stash.runes.map{ $0.id }) 12 | } 13 | 14 | var body: some View { 15 | List { 16 | runesSection 17 | availableRunewordsSection 18 | favoriteRunewordsSection 19 | } 20 | .listStyle(.insetGrouped) 21 | .navigationTitle("Stash") 22 | } 23 | 24 | private var runesSection: some View { 25 | Section("Runes") { 26 | if stash.runes.isEmpty { 27 | Text("Add runes to your stash from the Runes tab.") 28 | .font(.AVQestFont(textStyle: .title3)) 29 | } else { 30 | LazyVGrid(columns: [GridItem(.adaptive(minimum: 80))], spacing: 20) { 31 | ForEach(stash.runes) { rune in 32 | RuneRowView(rune: rune) 33 | } 34 | } 35 | } 36 | } 37 | .font(.AVQestFont(textStyle: .headline)) 38 | } 39 | 40 | private var availableRunewordsSection: some View { 41 | Section("Available Runewords") { 42 | if availableRunewords.isEmpty { 43 | Text("All possible runewords from your stahed runes will be displayed here.") 44 | .font(.AVQestFont(textStyle: .title3)) 45 | } else { 46 | ForEach(availableRunewords) { runeword in 47 | NavigationLink(value: runeword) { 48 | RunewordRowView(runeword: runeword) 49 | } 50 | } 51 | } 52 | } 53 | .font(.AVQestFont(textStyle: .headline)) 54 | } 55 | 56 | private var favoriteRunewordsSection: some View { 57 | Section("Favorite Runewords") { 58 | if stash.favoriteRunewords.isEmpty { 59 | Text("Add runewords to your favorite from the Runewords tab.") 60 | .font(.AVQestFont(textStyle: .title3)) 61 | } else { 62 | ForEach(stash.favoriteRunewords) { runeword in 63 | NavigationLink(value: runeword) { 64 | RunewordRowView(runeword: runeword) 65 | } 66 | } 67 | } 68 | } 69 | .font(.AVQestFont(textStyle: .headline)) 70 | } 71 | } 72 | 73 | struct StashView_Previews: PreviewProvider { 74 | static var previews: some View { 75 | StashView() 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "platform" : "ios", 6 | "size" : "1024x1024" 7 | } 8 | ], 9 | "info" : { 10 | "author" : "xcode", 11 | "version" : 1 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/amn.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "amn.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/amn.imageset/amn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/amn.imageset/amn.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/ber.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ber.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/ber.imageset/ber.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/ber.imageset/ber.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/cham.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "cham.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/cham.imageset/cham.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/cham.imageset/cham.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/dol.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "dol.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/dol.imageset/dol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/dol.imageset/dol.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/el.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "el.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/el.imageset/el.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/el.imageset/el.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/eld.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "eld.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/eld.imageset/eld.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/eld.imageset/eld.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/eth.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "eth.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/eth.imageset/eth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/eth.imageset/eth.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/fal.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "fal.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/fal.imageset/fal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/fal.imageset/fal.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/gul.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "gul.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/gul.imageset/gul.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/gul.imageset/gul.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/hel.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "hel.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/hel.imageset/hel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/hel.imageset/hel.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/io.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "io.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/io.imageset/io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/io.imageset/io.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/ist.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ist.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/ist.imageset/ist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/ist.imageset/ist.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/ith.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ith.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/ith.imageset/ith.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/ith.imageset/ith.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/jah.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "jah.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/jah.imageset/jah.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/jah.imageset/jah.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/ko.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ko.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/ko.imageset/ko.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/ko.imageset/ko.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/lem.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "lem.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/lem.imageset/lem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/lem.imageset/lem.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/lo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "lo.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/lo.imageset/lo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/lo.imageset/lo.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/lum.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "lum.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/lum.imageset/lum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/lum.imageset/lum.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/mal.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "mal.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/mal.imageset/mal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/mal.imageset/mal.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/nef.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "nef.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/nef.imageset/nef.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/nef.imageset/nef.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/ohm.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ohm.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/ohm.imageset/ohm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/ohm.imageset/ohm.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/ort.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ort.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/ort.imageset/ort.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/ort.imageset/ort.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/pul.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "pul.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/pul.imageset/pul.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/pul.imageset/pul.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/ral.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ral.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/ral.imageset/ral.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/ral.imageset/ral.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/shael.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "shael.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/shael.imageset/shael.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/shael.imageset/shael.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/sol.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "sol.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/sol.imageset/sol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/sol.imageset/sol.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/sur.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "sur.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/sur.imageset/sur.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/sur.imageset/sur.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/tal.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "tal.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/tal.imageset/tal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/tal.imageset/tal.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/thul.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "thul.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/thul.imageset/thul.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/thul.imageset/thul.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/tir.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "tir.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/tir.imageset/tir.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/tir.imageset/tir.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/um.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "um.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/um.imageset/um.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/um.imageset/um.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/vex.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "vex.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/vex.imageset/vex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/vex.imageset/vex.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/zod.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "zod.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/Runes/zod.imageset/zod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/Runes/zod.imageset/zod.png -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/WidgetBackground.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/cube.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Image.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /RunewordsWidget/Assets.xcassets/cube.imageset/Image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dimillian/RunewordsApp/f7b04ef0af3fcb527eba7ce516bfa42231a4bf39/RunewordsWidget/Assets.xcassets/cube.imageset/Image.png -------------------------------------------------------------------------------- /RunewordsWidget/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | NSExtension 6 | 7 | NSExtensionPointIdentifier 8 | com.apple.widgetkit-extension 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /RunewordsWidget/RunewordsWidget.swift: -------------------------------------------------------------------------------- 1 | import WidgetKit 2 | import SwiftUI 3 | import RunesData 4 | 5 | 6 | @main 7 | struct RunewordsWidget: Widget { 8 | var body: some WidgetConfiguration { 9 | ActivityConfiguration(for: RunewordActivityAttributes.self) { context in 10 | Text("Hello world") 11 | } dynamicIsland: { context in 12 | DynamicIsland { 13 | DynamicIslandExpandedRegion(.center) { 14 | HStack { 15 | ForEach(context.state.runeword.runes, id: \.self) { rune in 16 | Image(rune.lowercased()) 17 | .resizable() 18 | .frame(width: 25, height: 25) 19 | } 20 | } 21 | } 22 | DynamicIslandExpandedRegion(.bottom) { 23 | Text(context.state.runeword.title).font(.footnote) 24 | } 25 | DynamicIslandExpandedRegion(.leading) { 26 | Image("cube") 27 | .resizable() 28 | .frame(width: 25, height: 34) 29 | } 30 | DynamicIslandExpandedRegion(.trailing) { 31 | Text("Level: \(context.state.runeword.level)") 32 | } 33 | } compactLeading: { 34 | Image("cube") 35 | .resizable() 36 | } compactTrailing: { 37 | Image(context.state.runeword.runes.first?.lowercased() ?? "") 38 | } minimal: { 39 | Image("cube") 40 | .resizable() 41 | } 42 | } 43 | } 44 | } 45 | --------------------------------------------------------------------------------