diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000000..32222eb436
Binary files /dev/null and b/.DS_Store differ
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000000..dfe0770424
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,2 @@
+# Auto detect text files and perform LF normalization
+* text=auto
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000000..0a8642fac0
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,10 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
+# Zeppelin ignored files
+/ZeppelinRemoteNotebooks/
diff --git a/.idea/.name b/.idea/.name
new file mode 100644
index 0000000000..d4425f47d6
--- /dev/null
+++ b/.idea/.name
@@ -0,0 +1 @@
+typewriter
\ No newline at end of file
diff --git a/.idea/TypeWriter.iml b/.idea/TypeWriter.iml
new file mode 100644
index 0000000000..f673f6e5b5
--- /dev/null
+++ b/.idea/TypeWriter.iml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/aws.xml b/.idea/aws.xml
new file mode 100644
index 0000000000..b63b642cfb
--- /dev/null
+++ b/.idea/aws.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000000..b589d56e9f
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
new file mode 100644
index 0000000000..794497c244
--- /dev/null
+++ b/.idea/gradle.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
new file mode 100644
index 0000000000..e0164d61f5
--- /dev/null
+++ b/.idea/jarRepositories.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml
new file mode 100644
index 0000000000..b1077fbd06
--- /dev/null
+++ b/.idea/kotlinc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Dart_SDK.xml b/.idea/libraries/Dart_SDK.xml
new file mode 100644
index 0000000000..b6e698558e
--- /dev/null
+++ b/.idea/libraries/Dart_SDK.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000000..0a3a73e474
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules/typewriter.main.iml b/.idea/modules/typewriter.main.iml
new file mode 100644
index 0000000000..a591bfe101
--- /dev/null
+++ b/.idea/modules/typewriter.main.iml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ SPIGOT
+ ADVENTURE
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules/typewriter.test.iml b/.idea/modules/typewriter.test.iml
new file mode 100644
index 0000000000..c462275926
--- /dev/null
+++ b/.idea/modules/typewriter.test.iml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+ ADVENTURE
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/saveactions_settings.xml b/.idea/saveactions_settings.xml
new file mode 100644
index 0000000000..6374d41f1b
--- /dev/null
+++ b/.idea/saveactions_settings.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000000..7ea160197d
--- /dev/null
+++ b/README.md
@@ -0,0 +1,3 @@
+# Typewriter
+This is a minecraft implementation from the video of [Aarthificial](https://youtu.be/1LlF5p5Od6A).
+
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000000..24476c5d1e
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1,44 @@
+# Miscellaneous
+*.class
+*.log
+*.pyc
+*.swp
+.DS_Store
+.atom/
+.buildlog/
+.history
+.svn/
+migrate_working_dir/
+
+# IntelliJ related
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# The .vscode folder contains launch configuration and tasks you configure in
+# VS Code which you may wish to be included in version control, so this line
+# is commented out by default.
+#.vscode/
+
+# Flutter/Dart/Pub related
+**/doc/api/
+**/ios/Flutter/.last_build_id
+.dart_tool/
+.flutter-plugins
+.flutter-plugins-dependencies
+.packages
+.pub-cache/
+.pub/
+/build/
+
+# Symbolication related
+app.*.symbols
+
+# Obfuscation related
+app.*.map.json
+
+# Android Studio will place build artifacts here
+/android/app/debug
+/android/app/profile
+/android/app/release
diff --git a/app/.metadata b/app/.metadata
new file mode 100644
index 0000000000..31b763f97f
--- /dev/null
+++ b/app/.metadata
@@ -0,0 +1,45 @@
+# This file tracks properties of this Flutter project.
+# Used by Flutter tool to assess capabilities and perform upgrades etc.
+#
+# This file should be version controlled.
+
+version:
+ revision: ffccd96b62ee8cec7740dab303538c5fc26ac543
+ channel: stable
+
+project_type: app
+
+# Tracks metadata for the flutter migrate command
+migration:
+ platforms:
+ - platform: root
+ create_revision: ffccd96b62ee8cec7740dab303538c5fc26ac543
+ base_revision: ffccd96b62ee8cec7740dab303538c5fc26ac543
+ - platform: android
+ create_revision: ffccd96b62ee8cec7740dab303538c5fc26ac543
+ base_revision: ffccd96b62ee8cec7740dab303538c5fc26ac543
+ - platform: ios
+ create_revision: ffccd96b62ee8cec7740dab303538c5fc26ac543
+ base_revision: ffccd96b62ee8cec7740dab303538c5fc26ac543
+ - platform: linux
+ create_revision: ffccd96b62ee8cec7740dab303538c5fc26ac543
+ base_revision: ffccd96b62ee8cec7740dab303538c5fc26ac543
+ - platform: macos
+ create_revision: ffccd96b62ee8cec7740dab303538c5fc26ac543
+ base_revision: ffccd96b62ee8cec7740dab303538c5fc26ac543
+ - platform: web
+ create_revision: ffccd96b62ee8cec7740dab303538c5fc26ac543
+ base_revision: ffccd96b62ee8cec7740dab303538c5fc26ac543
+ - platform: windows
+ create_revision: ffccd96b62ee8cec7740dab303538c5fc26ac543
+ base_revision: ffccd96b62ee8cec7740dab303538c5fc26ac543
+
+ # User provided section
+
+ # List of Local paths (relative to this file) that should be
+ # ignored by the migrate tool.
+ #
+ # Files that are not part of the templates will be ignored by default.
+ unmanaged_files:
+ - 'lib/main.dart'
+ - 'ios/Runner.xcodeproj/project.pbxproj'
diff --git a/app/README.md b/app/README.md
new file mode 100644
index 0000000000..47806012ba
--- /dev/null
+++ b/app/README.md
@@ -0,0 +1,16 @@
+# typewriter
+
+Visual quest configuration
+
+## Getting Started
+
+This project is a starting point for a Flutter application.
+
+A few resources to get you started if this is your first Flutter project:
+
+- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
+- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
+
+For help getting started with Flutter development, view the
+[online documentation](https://docs.flutter.dev/), which offers tutorials,
+samples, guidance on mobile development, and a full API reference.
diff --git a/app/analysis_options.yaml b/app/analysis_options.yaml
new file mode 100644
index 0000000000..9d6223417b
--- /dev/null
+++ b/app/analysis_options.yaml
@@ -0,0 +1,10 @@
+include: package:flutter_lints/flutter.yaml
+
+linter:
+ rules:
+ # avoid_print: false # Uncomment to disable the `avoid_print` rule
+ # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
+
+analyzer:
+ errors:
+ invalid_annotation_target: ignore
\ No newline at end of file
diff --git a/app/android/.gitignore b/app/android/.gitignore
new file mode 100644
index 0000000000..6f568019d3
--- /dev/null
+++ b/app/android/.gitignore
@@ -0,0 +1,13 @@
+gradle-wrapper.jar
+/.gradle
+/captures/
+/gradlew
+/gradlew.bat
+/local.properties
+GeneratedPluginRegistrant.java
+
+# Remember to never publicly share your keystore.
+# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
+key.properties
+**/*.keystore
+**/*.jks
diff --git a/app/android/app/build.gradle b/app/android/app/build.gradle
new file mode 100644
index 0000000000..a855a73dd1
--- /dev/null
+++ b/app/android/app/build.gradle
@@ -0,0 +1,71 @@
+def localProperties = new Properties()
+def localPropertiesFile = rootProject.file('local.properties')
+if (localPropertiesFile.exists()) {
+ localPropertiesFile.withReader('UTF-8') { reader ->
+ localProperties.load(reader)
+ }
+}
+
+def flutterRoot = localProperties.getProperty('flutter.sdk')
+if (flutterRoot == null) {
+ throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
+}
+
+def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
+if (flutterVersionCode == null) {
+ flutterVersionCode = '1'
+}
+
+def flutterVersionName = localProperties.getProperty('flutter.versionName')
+if (flutterVersionName == null) {
+ flutterVersionName = '1.0'
+}
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
+
+android {
+ compileSdkVersion flutter.compileSdkVersion
+ ndkVersion flutter.ndkVersion
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+
+ kotlinOptions {
+ jvmTarget = '1.8'
+ }
+
+ sourceSets {
+ main.java.srcDirs += 'src/main/kotlin'
+ }
+
+ defaultConfig {
+ // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
+ applicationId "me.gabber235.typewriter"
+ // You can update the following values to match your application needs.
+ // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration.
+ minSdkVersion flutter.minSdkVersion
+ targetSdkVersion flutter.targetSdkVersion
+ versionCode flutterVersionCode.toInteger()
+ versionName flutterVersionName
+ }
+
+ buildTypes {
+ release {
+ // TODO: Add your own signing config for the release build.
+ // Signing with the debug keys for now, so `flutter run --release` works.
+ signingConfig signingConfigs.debug
+ }
+ }
+}
+
+flutter {
+ source '../..'
+}
+
+dependencies {
+ implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+}
diff --git a/app/android/app/src/debug/AndroidManifest.xml b/app/android/app/src/debug/AndroidManifest.xml
new file mode 100644
index 0000000000..8d4c68d1e2
--- /dev/null
+++ b/app/android/app/src/debug/AndroidManifest.xml
@@ -0,0 +1,8 @@
+
+
+
+
diff --git a/app/android/app/src/main/AndroidManifest.xml b/app/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..e9f1e2596c
--- /dev/null
+++ b/app/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/android/app/src/main/ic_launcher-playstore.png b/app/android/app/src/main/ic_launcher-playstore.png
new file mode 100644
index 0000000000..e8e819dc83
Binary files /dev/null and b/app/android/app/src/main/ic_launcher-playstore.png differ
diff --git a/app/android/app/src/main/kotlin/me/gabber235/typewriter/MainActivity.kt b/app/android/app/src/main/kotlin/me/gabber235/typewriter/MainActivity.kt
new file mode 100644
index 0000000000..7ca43edbde
--- /dev/null
+++ b/app/android/app/src/main/kotlin/me/gabber235/typewriter/MainActivity.kt
@@ -0,0 +1,6 @@
+package me.gabber235.typewriter
+
+import io.flutter.embedding.android.FlutterActivity
+
+class MainActivity: FlutterActivity() {
+}
diff --git a/app/android/app/src/main/res/drawable-v21/launch_background.xml b/app/android/app/src/main/res/drawable-v21/launch_background.xml
new file mode 100644
index 0000000000..f74085f3f6
--- /dev/null
+++ b/app/android/app/src/main/res/drawable-v21/launch_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/app/android/app/src/main/res/drawable/launch_background.xml b/app/android/app/src/main/res/drawable/launch_background.xml
new file mode 100644
index 0000000000..304732f884
--- /dev/null
+++ b/app/android/app/src/main/res/drawable/launch_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..ceb2f382d2
Binary files /dev/null and b/app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..9930741e91
Binary files /dev/null and b/app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..af2dc105b1
Binary files /dev/null and b/app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..385a94d05b
Binary files /dev/null and b/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..38b66a6a42
Binary files /dev/null and b/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/app/android/app/src/main/res/values-night/styles.xml b/app/android/app/src/main/res/values-night/styles.xml
new file mode 100644
index 0000000000..06952be745
--- /dev/null
+++ b/app/android/app/src/main/res/values-night/styles.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/app/android/app/src/main/res/values/styles.xml b/app/android/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000000..cb1ef88056
--- /dev/null
+++ b/app/android/app/src/main/res/values/styles.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/app/android/app/src/profile/AndroidManifest.xml b/app/android/app/src/profile/AndroidManifest.xml
new file mode 100644
index 0000000000..8d4c68d1e2
--- /dev/null
+++ b/app/android/app/src/profile/AndroidManifest.xml
@@ -0,0 +1,8 @@
+
+
+
+
diff --git a/app/android/build.gradle b/app/android/build.gradle
new file mode 100644
index 0000000000..83ae220041
--- /dev/null
+++ b/app/android/build.gradle
@@ -0,0 +1,31 @@
+buildscript {
+ ext.kotlin_version = '1.6.10'
+ repositories {
+ google()
+ mavenCentral()
+ }
+
+ dependencies {
+ classpath 'com.android.tools.build:gradle:7.1.2'
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+rootProject.buildDir = '../build'
+subprojects {
+ project.buildDir = "${rootProject.buildDir}/${project.name}"
+}
+subprojects {
+ project.evaluationDependsOn(':app')
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
diff --git a/app/android/gradle.properties b/app/android/gradle.properties
new file mode 100644
index 0000000000..94adc3a3f9
--- /dev/null
+++ b/app/android/gradle.properties
@@ -0,0 +1,3 @@
+org.gradle.jvmargs=-Xmx1536M
+android.useAndroidX=true
+android.enableJetifier=true
diff --git a/app/android/gradle/wrapper/gradle-wrapper.properties b/app/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000..cb24abda10
--- /dev/null
+++ b/app/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip
diff --git a/app/android/settings.gradle b/app/android/settings.gradle
new file mode 100644
index 0000000000..44e62bcf06
--- /dev/null
+++ b/app/android/settings.gradle
@@ -0,0 +1,11 @@
+include ':app'
+
+def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
+def properties = new Properties()
+
+assert localPropertiesFile.exists()
+localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
+
+def flutterSdkPath = properties.getProperty("flutter.sdk")
+assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
+apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
diff --git a/app/assets/Typewriter.png b/app/assets/Typewriter.png
new file mode 100644
index 0000000000..b8d9144e8a
Binary files /dev/null and b/app/assets/Typewriter.png differ
diff --git a/app/assets/game_character.riv b/app/assets/game_character.riv
new file mode 100644
index 0000000000..30b68f4e90
Binary files /dev/null and b/app/assets/game_character.riv differ
diff --git a/app/ios/.gitignore b/app/ios/.gitignore
new file mode 100644
index 0000000000..7a7f9873ad
--- /dev/null
+++ b/app/ios/.gitignore
@@ -0,0 +1,34 @@
+**/dgph
+*.mode1v3
+*.mode2v3
+*.moved-aside
+*.pbxuser
+*.perspectivev3
+**/*sync/
+.sconsign.dblite
+.tags*
+**/.vagrant/
+**/DerivedData/
+Icon?
+**/Pods/
+**/.symlinks/
+profile
+xcuserdata
+**/.generated/
+Flutter/App.framework
+Flutter/Flutter.framework
+Flutter/Flutter.podspec
+Flutter/Generated.xcconfig
+Flutter/ephemeral/
+Flutter/app.flx
+Flutter/app.zip
+Flutter/flutter_assets/
+Flutter/flutter_export_environment.sh
+ServiceDefinitions.json
+Runner/GeneratedPluginRegistrant.*
+
+# Exceptions to above rules.
+!default.mode1v3
+!default.mode2v3
+!default.pbxuser
+!default.perspectivev3
diff --git a/app/ios/Flutter/AppFrameworkInfo.plist b/app/ios/Flutter/AppFrameworkInfo.plist
new file mode 100644
index 0000000000..9625e105df
--- /dev/null
+++ b/app/ios/Flutter/AppFrameworkInfo.plist
@@ -0,0 +1,26 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ App
+ CFBundleIdentifier
+ io.flutter.flutter.app
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ App
+ CFBundlePackageType
+ FMWK
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1.0
+ MinimumOSVersion
+ 11.0
+
+
diff --git a/app/ios/Flutter/Debug.xcconfig b/app/ios/Flutter/Debug.xcconfig
new file mode 100644
index 0000000000..ec97fc6f30
--- /dev/null
+++ b/app/ios/Flutter/Debug.xcconfig
@@ -0,0 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
+#include "Generated.xcconfig"
diff --git a/app/ios/Flutter/Release.xcconfig b/app/ios/Flutter/Release.xcconfig
new file mode 100644
index 0000000000..c4855bfe20
--- /dev/null
+++ b/app/ios/Flutter/Release.xcconfig
@@ -0,0 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
+#include "Generated.xcconfig"
diff --git a/app/ios/Podfile b/app/ios/Podfile
new file mode 100644
index 0000000000..88359b225f
--- /dev/null
+++ b/app/ios/Podfile
@@ -0,0 +1,41 @@
+# Uncomment this line to define a global platform for your project
+# platform :ios, '11.0'
+
+# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
+ENV['COCOAPODS_DISABLE_STATS'] = 'true'
+
+project 'Runner', {
+ 'Debug' => :debug,
+ 'Profile' => :release,
+ 'Release' => :release,
+}
+
+def flutter_root
+ generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
+ unless File.exist?(generated_xcode_build_settings_path)
+ raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
+ end
+
+ File.foreach(generated_xcode_build_settings_path) do |line|
+ matches = line.match(/FLUTTER_ROOT\=(.*)/)
+ return matches[1].strip if matches
+ end
+ raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
+end
+
+require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
+
+flutter_ios_podfile_setup
+
+target 'Runner' do
+ use_frameworks!
+ use_modular_headers!
+
+ flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
+end
+
+post_install do |installer|
+ installer.pods_project.targets.each do |target|
+ flutter_additional_ios_build_settings(target)
+ end
+end
diff --git a/app/ios/Runner.xcodeproj/project.pbxproj b/app/ios/Runner.xcodeproj/project.pbxproj
new file mode 100644
index 0000000000..3ee1075090
--- /dev/null
+++ b/app/ios/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,484 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 50;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
+ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
+ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
+ 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
+ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ );
+ name = "Embed Frameworks";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
+ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
+ 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
+ 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
+ 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
+ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
+ 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 97C146EB1CF9000F007C117D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 9740EEB11CF90186004384FC /* Flutter */ = {
+ isa = PBXGroup;
+ children = (
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */,
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */,
+ );
+ name = Flutter;
+ sourceTree = "";
+ };
+ 97C146E51CF9000F007C117D = {
+ isa = PBXGroup;
+ children = (
+ 9740EEB11CF90186004384FC /* Flutter */,
+ 97C146F01CF9000F007C117D /* Runner */,
+ 97C146EF1CF9000F007C117D /* Products */,
+ );
+ sourceTree = "";
+ };
+ 97C146EF1CF9000F007C117D /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146EE1CF9000F007C117D /* Runner.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 97C146F01CF9000F007C117D /* Runner */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146FA1CF9000F007C117D /* Main.storyboard */,
+ 97C146FD1CF9000F007C117D /* Assets.xcassets */,
+ 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
+ 97C147021CF9000F007C117D /* Info.plist */,
+ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
+ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
+ 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
+ 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
+ );
+ path = Runner;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 97C146ED1CF9000F007C117D /* Runner */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
+ buildPhases = (
+ 9740EEB61CF901F6004384FC /* Run Script */,
+ 97C146EA1CF9000F007C117D /* Sources */,
+ 97C146EB1CF9000F007C117D /* Frameworks */,
+ 97C146EC1CF9000F007C117D /* Resources */,
+ 9705A1C41CF9048500538489 /* Embed Frameworks */,
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = Runner;
+ productName = Runner;
+ productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 97C146E61CF9000F007C117D /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 1300;
+ ORGANIZATIONNAME = "";
+ TargetAttributes = {
+ 97C146ED1CF9000F007C117D = {
+ CreatedOnToolsVersion = 7.3.1;
+ LastSwiftMigration = 1100;
+ };
+ };
+ };
+ buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 97C146E51CF9000F007C117D;
+ productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 97C146ED1CF9000F007C117D /* Runner */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 97C146EC1CF9000F007C117D /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
+ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
+ 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
+ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Thin Binary";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
+ };
+ 9740EEB61CF901F6004384FC /* Run Script */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Script";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 97C146EA1CF9000F007C117D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 97C146FB1CF9000F007C117D /* Base */,
+ );
+ name = Main.storyboard;
+ sourceTree = "";
+ };
+ 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 97C147001CF9000F007C117D /* Base */,
+ );
+ name = LaunchScreen.storyboard;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 249021D3217E4FDB00AE95B9 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SUPPORTED_PLATFORMS = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Profile;
+ };
+ 249021D4217E4FDB00AE95B9 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ DEVELOPMENT_TEAM = GJXU9JWN83;
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = me.gabber235.typewriter;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Profile;
+ };
+ 97C147031CF9000F007C117D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 97C147041CF9000F007C117D /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SUPPORTED_PLATFORMS = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ 97C147061CF9000F007C117D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ DEVELOPMENT_TEAM = GJXU9JWN83;
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = me.gabber235.typewriter;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Debug;
+ };
+ 97C147071CF9000F007C117D /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ DEVELOPMENT_TEAM = GJXU9JWN83;
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = me.gabber235.typewriter;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 97C147031CF9000F007C117D /* Debug */,
+ 97C147041CF9000F007C117D /* Release */,
+ 249021D3217E4FDB00AE95B9 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 97C147061CF9000F007C117D /* Debug */,
+ 97C147071CF9000F007C117D /* Release */,
+ 249021D4217E4FDB00AE95B9 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 97C146E61CF9000F007C117D /* Project object */;
+}
\ No newline at end of file
diff --git a/app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000000..919434a625
--- /dev/null
+++ b/app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000000..18d981003d
--- /dev/null
+++ b/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 0000000000..f9b0d7c5ea
--- /dev/null
+++ b/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
new file mode 100644
index 0000000000..c87d15a335
--- /dev/null
+++ b/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/ios/Runner.xcworkspace/contents.xcworkspacedata b/app/ios/Runner.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000000..1d526a16ed
--- /dev/null
+++ b/app/ios/Runner.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/app/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/app/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000000..18d981003d
--- /dev/null
+++ b/app/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 0000000000..f9b0d7c5ea
--- /dev/null
+++ b/app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/app/ios/Runner/AppDelegate.swift b/app/ios/Runner/AppDelegate.swift
new file mode 100644
index 0000000000..70693e4a8c
--- /dev/null
+++ b/app/ios/Runner/AppDelegate.swift
@@ -0,0 +1,13 @@
+import UIKit
+import Flutter
+
+@UIApplicationMain
+@objc class AppDelegate: FlutterAppDelegate {
+ override func application(
+ _ application: UIApplication,
+ didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
+ ) -> Bool {
+ GeneratedPluginRegistrant.register(with: self)
+ return super.application(application, didFinishLaunchingWithOptions: launchOptions)
+ }
+}
diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000000..eabd8512d0
--- /dev/null
+++ b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,122 @@
+{
+ "images": [
+ {
+ "filename": "Icon-App-20x20@2x.png",
+ "idiom": "iphone",
+ "scale": "2x",
+ "size": "20x20"
+ },
+ {
+ "filename": "Icon-App-20x20@3x.png",
+ "idiom": "iphone",
+ "scale": "3x",
+ "size": "20x20"
+ },
+ {
+ "filename": "Icon-App-29x29@1x.png",
+ "idiom": "iphone",
+ "scale": "1x",
+ "size": "29x29"
+ },
+ {
+ "filename": "Icon-App-29x29@2x.png",
+ "idiom": "iphone",
+ "scale": "2x",
+ "size": "29x29"
+ },
+ {
+ "filename": "Icon-App-29x29@3x.png",
+ "idiom": "iphone",
+ "scale": "3x",
+ "size": "29x29"
+ },
+ {
+ "filename": "Icon-App-40x40@2x.png",
+ "idiom": "iphone",
+ "scale": "2x",
+ "size": "40x40"
+ },
+ {
+ "filename": "Icon-App-40x40@3x.png",
+ "idiom": "iphone",
+ "scale": "3x",
+ "size": "40x40"
+ },
+ {
+ "filename": "Icon-App-60x60@2x.png",
+ "idiom": "iphone",
+ "scale": "2x",
+ "size": "60x60"
+ },
+ {
+ "filename": "Icon-App-60x60@3x.png",
+ "idiom": "iphone",
+ "scale": "3x",
+ "size": "60x60"
+ },
+ {
+ "filename": "Icon-App-20x20@1x.png",
+ "idiom": "ipad",
+ "scale": "1x",
+ "size": "20x20"
+ },
+ {
+ "filename": "Icon-App-20x20@2x.png",
+ "idiom": "ipad",
+ "scale": "2x",
+ "size": "20x20"
+ },
+ {
+ "filename": "Icon-App-29x29@1x.png",
+ "idiom": "ipad",
+ "scale": "1x",
+ "size": "29x29"
+ },
+ {
+ "filename": "Icon-App-29x29@2x.png",
+ "idiom": "ipad",
+ "scale": "2x",
+ "size": "29x29"
+ },
+ {
+ "filename": "Icon-App-40x40@1x.png",
+ "idiom": "ipad",
+ "scale": "1x",
+ "size": "40x40"
+ },
+ {
+ "filename": "Icon-App-40x40@2x.png",
+ "idiom": "ipad",
+ "scale": "2x",
+ "size": "40x40"
+ },
+ {
+ "filename": "Icon-App-76x76@1x.png",
+ "idiom": "ipad",
+ "scale": "1x",
+ "size": "76x76"
+ },
+ {
+ "filename": "Icon-App-76x76@2x.png",
+ "idiom": "ipad",
+ "scale": "2x",
+ "size": "76x76"
+ },
+ {
+ "filename": "Icon-App-83.5x83.5@2x.png",
+ "idiom": "ipad",
+ "scale": "2x",
+ "size": "83.5x83.5"
+ },
+ {
+ "filename": "Icon-App-1024x1024@1x.png",
+ "idiom": "ios-marketing",
+ "scale": "1x",
+ "size": "1024x1024"
+ }
+ ],
+ "info": {
+ "author": "icons_launcher",
+ "version": 1
+ }
+}
\ No newline at end of file
diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
new file mode 100644
index 0000000000..e05aff6a6c
Binary files /dev/null and b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ
diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
new file mode 100644
index 0000000000..cbff50749a
Binary files /dev/null and b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ
diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
new file mode 100644
index 0000000000..7717ee0b84
Binary files /dev/null and b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ
diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
new file mode 100644
index 0000000000..42c3485531
Binary files /dev/null and b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ
diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
new file mode 100644
index 0000000000..a1ebbc4061
Binary files /dev/null and b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ
diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
new file mode 100644
index 0000000000..e258c2f3f8
Binary files /dev/null and b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ
diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
new file mode 100644
index 0000000000..925da9f4b3
Binary files /dev/null and b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ
diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
new file mode 100644
index 0000000000..7717ee0b84
Binary files /dev/null and b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ
diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
new file mode 100644
index 0000000000..736065cc7a
Binary files /dev/null and b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ
diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
new file mode 100644
index 0000000000..601e281797
Binary files /dev/null and b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ
diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png
new file mode 100644
index 0000000000..718899b7cd
Binary files /dev/null and b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png differ
diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png
new file mode 100644
index 0000000000..fc3b70d4b4
Binary files /dev/null and b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png differ
diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png
new file mode 100644
index 0000000000..2295cfe30f
Binary files /dev/null and b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png differ
diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png
new file mode 100644
index 0000000000..236d4a83a1
Binary files /dev/null and b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png differ
diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
new file mode 100644
index 0000000000..601e281797
Binary files /dev/null and b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ
diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
new file mode 100644
index 0000000000..d6c92d1c89
Binary files /dev/null and b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ
diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png
new file mode 100644
index 0000000000..ceb2f382d2
Binary files /dev/null and b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png differ
diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png
new file mode 100644
index 0000000000..385a94d05b
Binary files /dev/null and b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png differ
diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
new file mode 100644
index 0000000000..0bd7e647b5
Binary files /dev/null and b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ
diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
new file mode 100644
index 0000000000..dc9dd7d368
Binary files /dev/null and b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ
diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
new file mode 100644
index 0000000000..2043d1f770
Binary files /dev/null and b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ
diff --git a/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
new file mode 100644
index 0000000000..0bedcf2fd4
--- /dev/null
+++ b/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
new file mode 100644
index 0000000000..9da19eacad
Binary files /dev/null and b/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ
diff --git a/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
new file mode 100644
index 0000000000..9da19eacad
Binary files /dev/null and b/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ
diff --git a/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
new file mode 100644
index 0000000000..9da19eacad
Binary files /dev/null and b/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ
diff --git a/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
new file mode 100644
index 0000000000..89c2725b70
--- /dev/null
+++ b/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
@@ -0,0 +1,5 @@
+# Launch Screen Assets
+
+You can customize the launch screen with your own desired assets by replacing the image files in this directory.
+
+You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
\ No newline at end of file
diff --git a/app/ios/Runner/Base.lproj/LaunchScreen.storyboard b/app/ios/Runner/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 0000000000..f2e259c7c9
--- /dev/null
+++ b/app/ios/Runner/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/ios/Runner/Base.lproj/Main.storyboard b/app/ios/Runner/Base.lproj/Main.storyboard
new file mode 100644
index 0000000000..f3c28516fb
--- /dev/null
+++ b/app/ios/Runner/Base.lproj/Main.storyboard
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/ios/Runner/Info.plist b/app/ios/Runner/Info.plist
new file mode 100644
index 0000000000..9f4166c717
--- /dev/null
+++ b/app/ios/Runner/Info.plist
@@ -0,0 +1,51 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ Typewriter
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ Typewriter
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ LSRequiresIPhoneOS
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIViewControllerBasedStatusBarAppearance
+
+ CADisableMinimumFrameDurationOnPhone
+
+ UIApplicationSupportsIndirectInputEvents
+
+
+
diff --git a/app/ios/Runner/Runner-Bridging-Header.h b/app/ios/Runner/Runner-Bridging-Header.h
new file mode 100644
index 0000000000..308a2a560b
--- /dev/null
+++ b/app/ios/Runner/Runner-Bridging-Header.h
@@ -0,0 +1 @@
+#import "GeneratedPluginRegistrant.h"
diff --git a/app/lib/main.dart b/app/lib/main.dart
new file mode 100644
index 0000000000..3eb01b5bd0
--- /dev/null
+++ b/app/lib/main.dart
@@ -0,0 +1,63 @@
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:typewriter/pages/graph.dart';
+
+void main() {
+ runApp(const ProviderScope(child: TypeWriterApp()));
+}
+
+class TypeWriterApp extends StatelessWidget {
+ const TypeWriterApp({Key? key}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return MaterialApp(
+ title: 'TypeWriter',
+ theme: _buildTheme(Brightness.light),
+ darkTheme: _buildTheme(Brightness.dark),
+ debugShowCheckedModeBanner: false,
+ home: const Scaffold(
+ body: PageGraph(),
+ ),
+ );
+ }
+
+ ThemeData _buildTheme(Brightness brightness) {
+ var baseTheme = ThemeData(brightness: brightness);
+
+ return baseTheme.copyWith(
+ textTheme: GoogleFonts.jetBrainsMonoTextTheme(baseTheme.textTheme),
+ inputDecorationTheme: InputDecorationTheme(
+ contentPadding: const EdgeInsets.only(left: 8),
+ border: OutlineInputBorder(
+ borderRadius: BorderRadius.circular(8),
+ borderSide: BorderSide.none,
+ ),
+ fillColor: brightness == Brightness.light
+ ? Colors.black.withOpacity(0.05)
+ : Colors.white.withOpacity(0.05),
+ filled: true,
+ ),
+ );
+ }
+}
+
+extension BuildContextExtension on BuildContext {
+ bool get isDark => Theme.of(this).brightness == Brightness.dark;
+}
+
+extension StringExtension on String {
+ String get capitalize {
+ if (isEmpty) {
+ return this;
+ }
+ return "${this[0].toUpperCase()}${substring(1)}";
+ }
+}
+
+extension ObjectExtension on Object? {
+ T? cast() {
+ return this is T ? this as T : null;
+ }
+}
diff --git a/app/lib/models/page.dart b/app/lib/models/page.dart
new file mode 100644
index 0000000000..3565dfafeb
--- /dev/null
+++ b/app/lib/models/page.dart
@@ -0,0 +1,401 @@
+import 'dart:convert';
+
+import 'package:collection/collection.dart';
+import 'package:flutter/material.dart';
+import 'package:freezed_annotation/freezed_annotation.dart';
+import 'package:graphview/GraphView.dart';
+import 'package:typewriter/main.dart';
+
+part 'page.freezed.dart';
+
+part 'page.g.dart';
+
+PageModel pageModelFromJson(String str) => PageModel.fromJson(json.decode(str));
+
+String pageModelToJson(PageModel data) => json.encode(data.toJson());
+
+@freezed
+class PageModel with _$PageModel {
+ const factory PageModel({
+ @Default([]) List facts,
+ @Default([]) List events,
+ @Default([]) List dialogue,
+ }) = _PageModel;
+
+ factory PageModel.fromJson(Map json) =>
+ _$PageModelFromJson(json);
+}
+
+@freezed
+class Fact with _$Fact {
+ const factory Fact({
+ required String id,
+ required String name,
+ @Default(FactLifetime.permanent) FactLifetime lifetime,
+ @Default("") String data,
+ }) = _Fact;
+
+ factory Fact.fromJson(Map json) => _$FactFromJson(json);
+}
+
+enum FactLifetime {
+ permanent("Saved permanently, it never gets removed"),
+ cron("Saved until a specified date, like (0 0 * * 1)"),
+ timed("Saved for a specified duration, like 20 minutes"),
+ server("Saved until the shutdown of a server"),
+ session("Saved until a player logouts of the server"),
+ ;
+
+ final String description;
+
+ const FactLifetime(this.description);
+}
+
+abstract class Entry {
+ String get name;
+
+ String get id;
+
+ List get triggers;
+}
+
+abstract class RuleEntry extends Entry {
+ List get triggeredBy;
+
+ List get criteria;
+
+ List get modifiers;
+}
+
+@Freezed(unionKey: "type", unionValueCase: FreezedUnionCase.snake)
+class Event with _$Event implements Entry {
+ const factory Event({
+ required String name,
+ required String id,
+ @Default([]) List triggers,
+ }) = _Event;
+
+ @FreezedUnionValue("npc_interact")
+ const factory Event.npc({
+ required String name,
+ required String id,
+ @Default("") String identifier,
+ @Default([]) List triggers,
+ }) = NpcEvent;
+
+ factory Event.fromJson(Map json) => _$EventFromJson(json);
+}
+
+@Freezed(unionKey: "type", unionValueCase: FreezedUnionCase.snake)
+class Dialogue with _$Dialogue implements RuleEntry {
+ const factory Dialogue({
+ required String name,
+ required String id,
+ @Default([]) @JsonKey(name: "triggered_by") List triggeredBy,
+ @Default([]) List triggers,
+ required String speaker,
+ required String text,
+ @Default([]) List criteria,
+ @Default([]) List modifiers,
+ }) = _Dialogue;
+
+ const factory Dialogue.spoken({
+ required String name,
+ required String id,
+ @Default([]) @JsonKey(name: "triggered_by") List triggeredBy,
+ @Default([]) List triggers,
+ required String speaker,
+ required String text,
+ @Default([]) List criteria,
+ @Default([]) List modifiers,
+ @Default(40) int duration,
+ }) = SpokenDialogue;
+
+ const factory Dialogue.option({
+ required String name,
+ required String id,
+ @Default([]) @JsonKey(name: "triggered_by") List triggeredBy,
+ @Default([]) List triggers,
+ required String speaker,
+ required String text,
+ @Default([]) List criteria,
+ @Default([]) List modifiers,
+ @Default([]) List options,
+ }) = OptionDialogue;
+
+ factory Dialogue.fromJson(Map json) =>
+ _$DialogueFromJson(json);
+}
+
+@freezed
+class Criterion with _$Criterion {
+ const factory Criterion({
+ required String fact,
+ required String operator,
+ required int value,
+ }) = _Criterion;
+
+ factory Criterion.fromJson(Map json) =>
+ _$CriterionFromJson(json);
+}
+
+@freezed
+class Option with _$Option {
+ const factory Option({
+ required String text,
+ @Default([]) List triggers,
+ @Default([]) List criteria,
+ @Default([]) List modifiers,
+ }) = _Option;
+
+ factory Option.fromJson(Map json) => _$OptionFromJson(json);
+}
+
+extension FactExtension on Fact {
+ String get formattedName {
+ return name
+ .split(".")
+ .map((e) => e.capitalize)
+ .join(" | ")
+ .split("_")
+ .map((e) => e.capitalize)
+ .join(" ");
+ }
+}
+
+extension LifetimeExtension on FactLifetime {
+ String get formattedName {
+ return name.split(".").last.capitalize;
+ }
+}
+
+extension EntryExtension on Entry {
+ bool get isEvent => this is Event;
+
+ bool get isDialogue => this is Dialogue;
+
+ Event? get asEvent => this is Event ? this as Event : null;
+
+ Dialogue? get asDialogue => this is Dialogue ? this as Dialogue : null;
+
+ String get formattedName {
+ return name
+ .split(".")
+ .map((e) => e.capitalize)
+ .join(" | ")
+ .split("_")
+ .map((e) => e.capitalize)
+ .join(" ");
+ }
+
+ Color textColor(BuildContext context) {
+ return color(Theme.of(context).brightness == Brightness.light);
+ }
+
+ Color backgroundColor(BuildContext context) {
+ return color(Theme.of(context).brightness == Brightness.dark);
+ }
+
+ Color color(bool dark) {
+ return asEvent?.color(dark) ?? asDialogue?.color(dark) ?? Colors.grey;
+ }
+}
+
+extension EventExtension on Event {
+ Color color(bool dark) {
+ if (dark) {
+ return Colors.amberAccent.shade700;
+ } else {
+ return Colors.amberAccent.shade100;
+ }
+ }
+
+ String get type {
+ if (this is NpcEvent) {
+ return "npc_interact";
+ } else {
+ return "event";
+ }
+ }
+}
+
+extension DialogueExtension on Dialogue {
+ Color color(bool dark) {
+ if (this is SpokenDialogue) {
+ if (dark) {
+ return Colors.blue.shade600;
+ } else {
+ return Colors.blue.shade100;
+ }
+ } else if (this is OptionDialogue) {
+ if (dark) {
+ return Colors.green.shade500;
+ } else {
+ return Colors.green.shade100;
+ }
+ } else {
+ return Colors.grey;
+ }
+ }
+
+ String get type {
+ if (this is SpokenDialogue) {
+ return "spoken";
+ } else if (this is OptionDialogue) {
+ return "option";
+ } else {
+ return "dialogue";
+ }
+ }
+}
+
+extension PageModelExtension on PageModel {
+ List get entries => [...dialogue, ...events];
+
+ List get rules => dialogue;
+
+ Entry? getEntry(String id) {
+ final rule = dialogue.firstWhereOrNull((e) => e.id == id);
+ if (rule != null) {
+ return rule;
+ }
+ final event = events.firstWhereOrNull((e) => e.id == id);
+ if (event != null) {
+ return event;
+ }
+ return null;
+ }
+
+ Graph toGraph() {
+ final graph = Graph();
+
+ for (final entry in entries) {
+ final node = Node.Id(entry.id);
+ graph.addNode(node);
+ }
+
+ // Create edges
+ for (final entry in entries) {
+ for (final trigger in entry.triggers) {
+ rules
+ .where((rule) => rule.triggeredBy.contains(trigger))
+ .forEach((rule) {
+ final color = entry.isEvent
+ ? Colors.amberAccent.shade700
+ : entry.isDialogue
+ ? Colors.blue
+ : Colors.grey;
+
+ graph.addEdge(Node.Id(entry.id), Node.Id(rule.id),
+ paint: Paint()..color = color);
+ });
+ }
+ }
+
+ for (final dialogue in dialogue.whereType()) {
+ for (final trigger in dialogue.options.expand((o) => o.triggers)) {
+ rules.where((rule) => rule.triggeredBy.contains(trigger)).forEach((r) {
+ graph.addEdge(Node.Id(dialogue.id), Node.Id(r.id),
+ paint: Paint()..color = Colors.green);
+ });
+ }
+ }
+
+ return graph;
+ }
+
+ String? validate() {
+ // Check if all entries have unique ids
+ final ids = entries.map((e) => e.id).toSet();
+ if (ids.length != entries.length) {
+ return "All entries must have unique ids";
+ }
+ // Check if all entries names are not blank
+ if (entries.any((e) => e.name.trim().isEmpty)) {
+ return "All entries must have a name";
+ }
+
+ // Check if all rules have at least one triggered_by
+ if (dialogue.any((e) => e.triggeredBy.isEmpty)) {
+ return "All rules must have at least one triggered_by, ${dialogue.firstWhere((e) => e.triggeredBy.isEmpty).name} does not";
+ }
+
+ // All NpcEvents must have a valid npc identifier
+ if (events.any((e) => e is NpcEvent && e.identifier.isEmpty)) {
+ return "All NpcEvents must have a valid npc identifier, ${events.firstWhere((e) => e is NpcEvent && e.identifier.isEmpty).name} does not";
+ }
+
+ // All dialogue must have a valid text
+ if (dialogue.any((e) => e.text.isEmpty)) {
+ return "All SpokenDialogues must have a valid text, ${dialogue.firstWhere((e) => e.text.isEmpty).name} does not";
+ }
+ // All SpokenDialogues must have a valid speaker
+ if (dialogue.any((e) => e is SpokenDialogue && e.speaker.isEmpty)) {
+ return "All SpokenDialogues must have a valid speaker, ${dialogue.firstWhere((e) => e is SpokenDialogue && e.speaker.isEmpty).name} does not";
+ }
+ // All SpokenDialogues must have a valid duration
+ if (dialogue.any((e) => e is SpokenDialogue && e.duration <= 0)) {
+ return "All SpokenDialogues must have a duration > 0, ${dialogue.firstWhere((e) => e is SpokenDialogue && e.duration <= 0).name} does not";
+ }
+ // All OptionDialogues must have a valid speaker
+ if (dialogue.any((e) => e is OptionDialogue && e.speaker.isEmpty)) {
+ return "All OptionDialogues must have a valid speaker, ${dialogue.firstWhere((e) => e is OptionDialogue && e.speaker.isEmpty).name} does not";
+ }
+ // All OptionDialogues must have at least one option
+ if (dialogue.any((e) => e is OptionDialogue && e.options.isEmpty)) {
+ return "All OptionDialogues must have at least one option, ${dialogue.firstWhere((e) => e is OptionDialogue && e.options.isEmpty).name} does not";
+ }
+ // All OptionDialogues options must have a valid text
+ if (dialogue.any(
+ (e) => e is OptionDialogue && e.options.any((o) => o.text.isEmpty))) {
+ return "All OptionDialogues options must have a valid text, ${dialogue.firstWhere((e) => e is OptionDialogue && e.options.any((o) => o.text.isEmpty)).name} does not";
+ }
+
+ // All Facts must have a valid name
+ if (facts.any((e) => e.name.isEmpty)) {
+ return "All Facts must have a valid name, ${facts.firstWhere((e) => e.name.isEmpty).name} does not";
+ }
+
+ String? checkCriterion(Criterion criterion) {
+ // Check if the criterion has a existing fact
+ if (facts.firstWhereOrNull((f) => f.id == criterion.fact) == null) {
+ return "Criterion ${criterion.fact} does not have a valid fact";
+ }
+ return null;
+ }
+
+ // Check for all rules if the criteria and modifiers are valid
+ for (final rule in rules) {
+ for (final criterion in rule.criteria) {
+ final error = checkCriterion(criterion);
+ if (error != null) {
+ return error;
+ }
+ }
+ for (final modification in rule.modifiers) {
+ final error = checkCriterion(modification);
+ if (error != null) {
+ return error;
+ }
+ }
+ }
+
+ // Check that all rules are triggered by an entry or option
+ for (final rule in rules) {
+ if (entries
+ .where((e) => rule.triggeredBy.any((t) => e.triggers.contains(t)))
+ .isEmpty &&
+ dialogue
+ .where((e) =>
+ e is OptionDialogue &&
+ e.options
+ .expand((o) => o.triggers)
+ .any((t) => rule.triggeredBy.contains(t)))
+ .isEmpty) {
+ return "Rule ${rule.name} is triggered by ${rule.triggeredBy} which is not triggered by any entry or option";
+ }
+ }
+
+ return null;
+ }
+}
diff --git a/app/lib/models/page.freezed.dart b/app/lib/models/page.freezed.dart
new file mode 100644
index 0000000000..21a4e035b9
--- /dev/null
+++ b/app/lib/models/page.freezed.dart
@@ -0,0 +1,2701 @@
+// coverage:ignore-file
+// GENERATED CODE - DO NOT MODIFY BY HAND
+// ignore_for_file: type=lint
+// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
+
+part of 'page.dart';
+
+// **************************************************************************
+// FreezedGenerator
+// **************************************************************************
+
+T _$identity(T value) => value;
+
+final _privateConstructorUsedError = UnsupportedError(
+ 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#custom-getters-and-methods');
+
+PageModel _$PageModelFromJson(Map json) {
+ return _PageModel.fromJson(json);
+}
+
+/// @nodoc
+mixin _$PageModel {
+ List get facts => throw _privateConstructorUsedError;
+ List get events => throw _privateConstructorUsedError;
+ List get dialogue => throw _privateConstructorUsedError;
+
+ Map toJson() => throw _privateConstructorUsedError;
+ @JsonKey(ignore: true)
+ $PageModelCopyWith get copyWith =>
+ throw _privateConstructorUsedError;
+}
+
+/// @nodoc
+abstract class $PageModelCopyWith<$Res> {
+ factory $PageModelCopyWith(PageModel value, $Res Function(PageModel) then) =
+ _$PageModelCopyWithImpl<$Res>;
+ $Res call({List facts, List events, List dialogue});
+}
+
+/// @nodoc
+class _$PageModelCopyWithImpl<$Res> implements $PageModelCopyWith<$Res> {
+ _$PageModelCopyWithImpl(this._value, this._then);
+
+ final PageModel _value;
+ // ignore: unused_field
+ final $Res Function(PageModel) _then;
+
+ @override
+ $Res call({
+ Object? facts = freezed,
+ Object? events = freezed,
+ Object? dialogue = freezed,
+ }) {
+ return _then(_value.copyWith(
+ facts: facts == freezed
+ ? _value.facts
+ : facts // ignore: cast_nullable_to_non_nullable
+ as List,
+ events: events == freezed
+ ? _value.events
+ : events // ignore: cast_nullable_to_non_nullable
+ as List,
+ dialogue: dialogue == freezed
+ ? _value.dialogue
+ : dialogue // ignore: cast_nullable_to_non_nullable
+ as List,
+ ));
+ }
+}
+
+/// @nodoc
+abstract class _$$_PageModelCopyWith<$Res> implements $PageModelCopyWith<$Res> {
+ factory _$$_PageModelCopyWith(
+ _$_PageModel value, $Res Function(_$_PageModel) then) =
+ __$$_PageModelCopyWithImpl<$Res>;
+ @override
+ $Res call({List facts, List events, List dialogue});
+}
+
+/// @nodoc
+class __$$_PageModelCopyWithImpl<$Res> extends _$PageModelCopyWithImpl<$Res>
+ implements _$$_PageModelCopyWith<$Res> {
+ __$$_PageModelCopyWithImpl(
+ _$_PageModel _value, $Res Function(_$_PageModel) _then)
+ : super(_value, (v) => _then(v as _$_PageModel));
+
+ @override
+ _$_PageModel get _value => super._value as _$_PageModel;
+
+ @override
+ $Res call({
+ Object? facts = freezed,
+ Object? events = freezed,
+ Object? dialogue = freezed,
+ }) {
+ return _then(_$_PageModel(
+ facts: facts == freezed
+ ? _value._facts
+ : facts // ignore: cast_nullable_to_non_nullable
+ as List,
+ events: events == freezed
+ ? _value._events
+ : events // ignore: cast_nullable_to_non_nullable
+ as List,
+ dialogue: dialogue == freezed
+ ? _value._dialogue
+ : dialogue // ignore: cast_nullable_to_non_nullable
+ as List,
+ ));
+ }
+}
+
+/// @nodoc
+@JsonSerializable()
+class _$_PageModel implements _PageModel {
+ const _$_PageModel(
+ {final List facts = const [],
+ final List events = const [],
+ final List dialogue = const []})
+ : _facts = facts,
+ _events = events,
+ _dialogue = dialogue;
+
+ factory _$_PageModel.fromJson(Map json) =>
+ _$$_PageModelFromJson(json);
+
+ final List _facts;
+ @override
+ @JsonKey()
+ List get facts {
+ // ignore: implicit_dynamic_type
+ return EqualUnmodifiableListView(_facts);
+ }
+
+ final List _events;
+ @override
+ @JsonKey()
+ List get events {
+ // ignore: implicit_dynamic_type
+ return EqualUnmodifiableListView(_events);
+ }
+
+ final List _dialogue;
+ @override
+ @JsonKey()
+ List get dialogue {
+ // ignore: implicit_dynamic_type
+ return EqualUnmodifiableListView(_dialogue);
+ }
+
+ @override
+ String toString() {
+ return 'PageModel(facts: $facts, events: $events, dialogue: $dialogue)';
+ }
+
+ @override
+ bool operator ==(dynamic other) {
+ return identical(this, other) ||
+ (other.runtimeType == runtimeType &&
+ other is _$_PageModel &&
+ const DeepCollectionEquality().equals(other._facts, _facts) &&
+ const DeepCollectionEquality().equals(other._events, _events) &&
+ const DeepCollectionEquality().equals(other._dialogue, _dialogue));
+ }
+
+ @JsonKey(ignore: true)
+ @override
+ int get hashCode => Object.hash(
+ runtimeType,
+ const DeepCollectionEquality().hash(_facts),
+ const DeepCollectionEquality().hash(_events),
+ const DeepCollectionEquality().hash(_dialogue));
+
+ @JsonKey(ignore: true)
+ @override
+ _$$_PageModelCopyWith<_$_PageModel> get copyWith =>
+ __$$_PageModelCopyWithImpl<_$_PageModel>(this, _$identity);
+
+ @override
+ Map toJson() {
+ return _$$_PageModelToJson(
+ this,
+ );
+ }
+}
+
+abstract class _PageModel implements PageModel {
+ const factory _PageModel(
+ {final List facts,
+ final List events,
+ final List dialogue}) = _$_PageModel;
+
+ factory _PageModel.fromJson(Map json) =
+ _$_PageModel.fromJson;
+
+ @override
+ List get facts;
+ @override
+ List get events;
+ @override
+ List get dialogue;
+ @override
+ @JsonKey(ignore: true)
+ _$$_PageModelCopyWith<_$_PageModel> get copyWith =>
+ throw _privateConstructorUsedError;
+}
+
+Fact _$FactFromJson(Map json) {
+ return _Fact.fromJson(json);
+}
+
+/// @nodoc
+mixin _$Fact {
+ String get id => throw _privateConstructorUsedError;
+ String get name => throw _privateConstructorUsedError;
+ FactLifetime get lifetime => throw _privateConstructorUsedError;
+ String get data => throw _privateConstructorUsedError;
+
+ Map toJson() => throw _privateConstructorUsedError;
+ @JsonKey(ignore: true)
+ $FactCopyWith get copyWith => throw _privateConstructorUsedError;
+}
+
+/// @nodoc
+abstract class $FactCopyWith<$Res> {
+ factory $FactCopyWith(Fact value, $Res Function(Fact) then) =
+ _$FactCopyWithImpl<$Res>;
+ $Res call({String id, String name, FactLifetime lifetime, String data});
+}
+
+/// @nodoc
+class _$FactCopyWithImpl<$Res> implements $FactCopyWith<$Res> {
+ _$FactCopyWithImpl(this._value, this._then);
+
+ final Fact _value;
+ // ignore: unused_field
+ final $Res Function(Fact) _then;
+
+ @override
+ $Res call({
+ Object? id = freezed,
+ Object? name = freezed,
+ Object? lifetime = freezed,
+ Object? data = freezed,
+ }) {
+ return _then(_value.copyWith(
+ id: id == freezed
+ ? _value.id
+ : id // ignore: cast_nullable_to_non_nullable
+ as String,
+ name: name == freezed
+ ? _value.name
+ : name // ignore: cast_nullable_to_non_nullable
+ as String,
+ lifetime: lifetime == freezed
+ ? _value.lifetime
+ : lifetime // ignore: cast_nullable_to_non_nullable
+ as FactLifetime,
+ data: data == freezed
+ ? _value.data
+ : data // ignore: cast_nullable_to_non_nullable
+ as String,
+ ));
+ }
+}
+
+/// @nodoc
+abstract class _$$_FactCopyWith<$Res> implements $FactCopyWith<$Res> {
+ factory _$$_FactCopyWith(_$_Fact value, $Res Function(_$_Fact) then) =
+ __$$_FactCopyWithImpl<$Res>;
+ @override
+ $Res call({String id, String name, FactLifetime lifetime, String data});
+}
+
+/// @nodoc
+class __$$_FactCopyWithImpl<$Res> extends _$FactCopyWithImpl<$Res>
+ implements _$$_FactCopyWith<$Res> {
+ __$$_FactCopyWithImpl(_$_Fact _value, $Res Function(_$_Fact) _then)
+ : super(_value, (v) => _then(v as _$_Fact));
+
+ @override
+ _$_Fact get _value => super._value as _$_Fact;
+
+ @override
+ $Res call({
+ Object? id = freezed,
+ Object? name = freezed,
+ Object? lifetime = freezed,
+ Object? data = freezed,
+ }) {
+ return _then(_$_Fact(
+ id: id == freezed
+ ? _value.id
+ : id // ignore: cast_nullable_to_non_nullable
+ as String,
+ name: name == freezed
+ ? _value.name
+ : name // ignore: cast_nullable_to_non_nullable
+ as String,
+ lifetime: lifetime == freezed
+ ? _value.lifetime
+ : lifetime // ignore: cast_nullable_to_non_nullable
+ as FactLifetime,
+ data: data == freezed
+ ? _value.data
+ : data // ignore: cast_nullable_to_non_nullable
+ as String,
+ ));
+ }
+}
+
+/// @nodoc
+@JsonSerializable()
+class _$_Fact implements _Fact {
+ const _$_Fact(
+ {required this.id,
+ required this.name,
+ this.lifetime = FactLifetime.permanent,
+ this.data = ""});
+
+ factory _$_Fact.fromJson(Map json) => _$$_FactFromJson(json);
+
+ @override
+ final String id;
+ @override
+ final String name;
+ @override
+ @JsonKey()
+ final FactLifetime lifetime;
+ @override
+ @JsonKey()
+ final String data;
+
+ @override
+ String toString() {
+ return 'Fact(id: $id, name: $name, lifetime: $lifetime, data: $data)';
+ }
+
+ @override
+ bool operator ==(dynamic other) {
+ return identical(this, other) ||
+ (other.runtimeType == runtimeType &&
+ other is _$_Fact &&
+ const DeepCollectionEquality().equals(other.id, id) &&
+ const DeepCollectionEquality().equals(other.name, name) &&
+ const DeepCollectionEquality().equals(other.lifetime, lifetime) &&
+ const DeepCollectionEquality().equals(other.data, data));
+ }
+
+ @JsonKey(ignore: true)
+ @override
+ int get hashCode => Object.hash(
+ runtimeType,
+ const DeepCollectionEquality().hash(id),
+ const DeepCollectionEquality().hash(name),
+ const DeepCollectionEquality().hash(lifetime),
+ const DeepCollectionEquality().hash(data));
+
+ @JsonKey(ignore: true)
+ @override
+ _$$_FactCopyWith<_$_Fact> get copyWith =>
+ __$$_FactCopyWithImpl<_$_Fact>(this, _$identity);
+
+ @override
+ Map toJson() {
+ return _$$_FactToJson(
+ this,
+ );
+ }
+}
+
+abstract class _Fact implements Fact {
+ const factory _Fact(
+ {required final String id,
+ required final String name,
+ final FactLifetime lifetime,
+ final String data}) = _$_Fact;
+
+ factory _Fact.fromJson(Map json) = _$_Fact.fromJson;
+
+ @override
+ String get id;
+ @override
+ String get name;
+ @override
+ FactLifetime get lifetime;
+ @override
+ String get data;
+ @override
+ @JsonKey(ignore: true)
+ _$$_FactCopyWith<_$_Fact> get copyWith => throw _privateConstructorUsedError;
+}
+
+Event _$EventFromJson(Map json) {
+ switch (json['type']) {
+ case 'default':
+ return _Event.fromJson(json);
+ case 'npc_interact':
+ return NpcEvent.fromJson(json);
+
+ default:
+ throw CheckedFromJsonException(
+ json, 'type', 'Event', 'Invalid union type "${json['type']}"!');
+ }
+}
+
+/// @nodoc
+mixin _$Event {
+ String get name => throw _privateConstructorUsedError;
+ String get id => throw _privateConstructorUsedError;
+ List get triggers => throw _privateConstructorUsedError;
+ @optionalTypeArgs
+ TResult when(
+ TResult Function(String name, String id, List triggers) $default, {
+ required TResult Function(
+ String name, String id, String identifier, List triggers)
+ npc,
+ }) =>
+ throw _privateConstructorUsedError;
+ @optionalTypeArgs
+ TResult? whenOrNull(
+ TResult Function(String name, String id, List triggers)? $default, {
+ TResult Function(
+ String name, String id, String identifier, List triggers)?
+ npc,
+ }) =>
+ throw _privateConstructorUsedError;
+ @optionalTypeArgs
+ TResult maybeWhen(
+ TResult Function(String name, String id, List triggers)? $default, {
+ TResult Function(
+ String name, String id, String identifier, List triggers)?
+ npc,
+ required TResult orElse(),
+ }) =>
+ throw _privateConstructorUsedError;
+ @optionalTypeArgs
+ TResult map(
+ TResult Function(_Event value) $default, {
+ required TResult Function(NpcEvent value) npc,
+ }) =>
+ throw _privateConstructorUsedError;
+ @optionalTypeArgs
+ TResult? mapOrNull(
+ TResult Function(_Event value)? $default, {
+ TResult Function(NpcEvent value)? npc,
+ }) =>
+ throw _privateConstructorUsedError;
+ @optionalTypeArgs
+ TResult maybeMap(
+ TResult Function(_Event value)? $default, {
+ TResult Function(NpcEvent value)? npc,
+ required TResult orElse(),
+ }) =>
+ throw _privateConstructorUsedError;
+ Map toJson() => throw _privateConstructorUsedError;
+ @JsonKey(ignore: true)
+ $EventCopyWith get copyWith => throw _privateConstructorUsedError;
+}
+
+/// @nodoc
+abstract class $EventCopyWith<$Res> {
+ factory $EventCopyWith(Event value, $Res Function(Event) then) =
+ _$EventCopyWithImpl<$Res>;
+ $Res call({String name, String id, List triggers});
+}
+
+/// @nodoc
+class _$EventCopyWithImpl<$Res> implements $EventCopyWith<$Res> {
+ _$EventCopyWithImpl(this._value, this._then);
+
+ final Event _value;
+ // ignore: unused_field
+ final $Res Function(Event) _then;
+
+ @override
+ $Res call({
+ Object? name = freezed,
+ Object? id = freezed,
+ Object? triggers = freezed,
+ }) {
+ return _then(_value.copyWith(
+ name: name == freezed
+ ? _value.name
+ : name // ignore: cast_nullable_to_non_nullable
+ as String,
+ id: id == freezed
+ ? _value.id
+ : id // ignore: cast_nullable_to_non_nullable
+ as String,
+ triggers: triggers == freezed
+ ? _value.triggers
+ : triggers // ignore: cast_nullable_to_non_nullable
+ as List,
+ ));
+ }
+}
+
+/// @nodoc
+abstract class _$$_EventCopyWith<$Res> implements $EventCopyWith<$Res> {
+ factory _$$_EventCopyWith(_$_Event value, $Res Function(_$_Event) then) =
+ __$$_EventCopyWithImpl<$Res>;
+ @override
+ $Res call({String name, String id, List triggers});
+}
+
+/// @nodoc
+class __$$_EventCopyWithImpl<$Res> extends _$EventCopyWithImpl<$Res>
+ implements _$$_EventCopyWith<$Res> {
+ __$$_EventCopyWithImpl(_$_Event _value, $Res Function(_$_Event) _then)
+ : super(_value, (v) => _then(v as _$_Event));
+
+ @override
+ _$_Event get _value => super._value as _$_Event;
+
+ @override
+ $Res call({
+ Object? name = freezed,
+ Object? id = freezed,
+ Object? triggers = freezed,
+ }) {
+ return _then(_$_Event(
+ name: name == freezed
+ ? _value.name
+ : name // ignore: cast_nullable_to_non_nullable
+ as String,
+ id: id == freezed
+ ? _value.id
+ : id // ignore: cast_nullable_to_non_nullable
+ as String,
+ triggers: triggers == freezed
+ ? _value._triggers
+ : triggers // ignore: cast_nullable_to_non_nullable
+ as List,
+ ));
+ }
+}
+
+/// @nodoc
+@JsonSerializable()
+class _$_Event implements _Event {
+ const _$_Event(
+ {required this.name,
+ required this.id,
+ final List triggers = const [],
+ final String? $type})
+ : _triggers = triggers,
+ $type = $type ?? 'default';
+
+ factory _$_Event.fromJson(Map json) =>
+ _$$_EventFromJson(json);
+
+ @override
+ final String name;
+ @override
+ final String id;
+ final List _triggers;
+ @override
+ @JsonKey()
+ List get triggers {
+ // ignore: implicit_dynamic_type
+ return EqualUnmodifiableListView(_triggers);
+ }
+
+ @JsonKey(name: 'type')
+ final String $type;
+
+ @override
+ String toString() {
+ return 'Event(name: $name, id: $id, triggers: $triggers)';
+ }
+
+ @override
+ bool operator ==(dynamic other) {
+ return identical(this, other) ||
+ (other.runtimeType == runtimeType &&
+ other is _$_Event &&
+ const DeepCollectionEquality().equals(other.name, name) &&
+ const DeepCollectionEquality().equals(other.id, id) &&
+ const DeepCollectionEquality().equals(other._triggers, _triggers));
+ }
+
+ @JsonKey(ignore: true)
+ @override
+ int get hashCode => Object.hash(
+ runtimeType,
+ const DeepCollectionEquality().hash(name),
+ const DeepCollectionEquality().hash(id),
+ const DeepCollectionEquality().hash(_triggers));
+
+ @JsonKey(ignore: true)
+ @override
+ _$$_EventCopyWith<_$_Event> get copyWith =>
+ __$$_EventCopyWithImpl<_$_Event>(this, _$identity);
+
+ @override
+ @optionalTypeArgs
+ TResult when(
+ TResult Function(String name, String id, List triggers) $default, {
+ required TResult Function(
+ String name, String id, String identifier, List triggers)
+ npc,
+ }) {
+ return $default(name, id, triggers);
+ }
+
+ @override
+ @optionalTypeArgs
+ TResult? whenOrNull(
+ TResult Function(String name, String id, List triggers)? $default, {
+ TResult Function(
+ String name, String id, String identifier, List triggers)?
+ npc,
+ }) {
+ return $default?.call(name, id, triggers);
+ }
+
+ @override
+ @optionalTypeArgs
+ TResult maybeWhen(
+ TResult Function(String name, String id, List triggers)? $default, {
+ TResult Function(
+ String name, String id, String identifier, List triggers)?
+ npc,
+ required TResult orElse(),
+ }) {
+ if ($default != null) {
+ return $default(name, id, triggers);
+ }
+ return orElse();
+ }
+
+ @override
+ @optionalTypeArgs
+ TResult map(
+ TResult Function(_Event value) $default, {
+ required TResult Function(NpcEvent value) npc,
+ }) {
+ return $default(this);
+ }
+
+ @override
+ @optionalTypeArgs
+ TResult? mapOrNull(
+ TResult Function(_Event value)? $default, {
+ TResult Function(NpcEvent value)? npc,
+ }) {
+ return $default?.call(this);
+ }
+
+ @override
+ @optionalTypeArgs
+ TResult maybeMap(
+ TResult Function(_Event value)? $default, {
+ TResult Function(NpcEvent value)? npc,
+ required TResult orElse(),
+ }) {
+ if ($default != null) {
+ return $default(this);
+ }
+ return orElse();
+ }
+
+ @override
+ Map toJson() {
+ return _$$_EventToJson(
+ this,
+ );
+ }
+}
+
+abstract class _Event implements Event {
+ const factory _Event(
+ {required final String name,
+ required final String id,
+ final List triggers}) = _$_Event;
+
+ factory _Event.fromJson(Map json) = _$_Event.fromJson;
+
+ @override
+ String get name;
+ @override
+ String get id;
+ @override
+ List get triggers;
+ @override
+ @JsonKey(ignore: true)
+ _$$_EventCopyWith<_$_Event> get copyWith =>
+ throw _privateConstructorUsedError;
+}
+
+/// @nodoc
+abstract class _$$NpcEventCopyWith<$Res> implements $EventCopyWith<$Res> {
+ factory _$$NpcEventCopyWith(
+ _$NpcEvent value, $Res Function(_$NpcEvent) then) =
+ __$$NpcEventCopyWithImpl<$Res>;
+ @override
+ $Res call({String name, String id, String identifier, List triggers});
+}
+
+/// @nodoc
+class __$$NpcEventCopyWithImpl<$Res> extends _$EventCopyWithImpl<$Res>
+ implements _$$NpcEventCopyWith<$Res> {
+ __$$NpcEventCopyWithImpl(_$NpcEvent _value, $Res Function(_$NpcEvent) _then)
+ : super(_value, (v) => _then(v as _$NpcEvent));
+
+ @override
+ _$NpcEvent get _value => super._value as _$NpcEvent;
+
+ @override
+ $Res call({
+ Object? name = freezed,
+ Object? id = freezed,
+ Object? identifier = freezed,
+ Object? triggers = freezed,
+ }) {
+ return _then(_$NpcEvent(
+ name: name == freezed
+ ? _value.name
+ : name // ignore: cast_nullable_to_non_nullable
+ as String,
+ id: id == freezed
+ ? _value.id
+ : id // ignore: cast_nullable_to_non_nullable
+ as String,
+ identifier: identifier == freezed
+ ? _value.identifier
+ : identifier // ignore: cast_nullable_to_non_nullable
+ as String,
+ triggers: triggers == freezed
+ ? _value._triggers
+ : triggers // ignore: cast_nullable_to_non_nullable
+ as List,
+ ));
+ }
+}
+
+/// @nodoc
+@JsonSerializable()
+class _$NpcEvent implements NpcEvent {
+ const _$NpcEvent(
+ {required this.name,
+ required this.id,
+ this.identifier = "",
+ final List triggers = const [],
+ final String? $type})
+ : _triggers = triggers,
+ $type = $type ?? 'npc_interact';
+
+ factory _$NpcEvent.fromJson(Map json) =>
+ _$$NpcEventFromJson(json);
+
+ @override
+ final String name;
+ @override
+ final String id;
+ @override
+ @JsonKey()
+ final String identifier;
+ final List _triggers;
+ @override
+ @JsonKey()
+ List get triggers {
+ // ignore: implicit_dynamic_type
+ return EqualUnmodifiableListView(_triggers);
+ }
+
+ @JsonKey(name: 'type')
+ final String $type;
+
+ @override
+ String toString() {
+ return 'Event.npc(name: $name, id: $id, identifier: $identifier, triggers: $triggers)';
+ }
+
+ @override
+ bool operator ==(dynamic other) {
+ return identical(this, other) ||
+ (other.runtimeType == runtimeType &&
+ other is _$NpcEvent &&
+ const DeepCollectionEquality().equals(other.name, name) &&
+ const DeepCollectionEquality().equals(other.id, id) &&
+ const DeepCollectionEquality()
+ .equals(other.identifier, identifier) &&
+ const DeepCollectionEquality().equals(other._triggers, _triggers));
+ }
+
+ @JsonKey(ignore: true)
+ @override
+ int get hashCode => Object.hash(
+ runtimeType,
+ const DeepCollectionEquality().hash(name),
+ const DeepCollectionEquality().hash(id),
+ const DeepCollectionEquality().hash(identifier),
+ const DeepCollectionEquality().hash(_triggers));
+
+ @JsonKey(ignore: true)
+ @override
+ _$$NpcEventCopyWith<_$NpcEvent> get copyWith =>
+ __$$NpcEventCopyWithImpl<_$NpcEvent>(this, _$identity);
+
+ @override
+ @optionalTypeArgs
+ TResult when(
+ TResult Function(String name, String id, List triggers) $default, {
+ required TResult Function(
+ String name, String id, String identifier, List triggers)
+ npc,
+ }) {
+ return npc(name, id, identifier, triggers);
+ }
+
+ @override
+ @optionalTypeArgs
+ TResult? whenOrNull(
+ TResult Function(String name, String id, List triggers)? $default, {
+ TResult Function(
+ String name, String id, String identifier, List triggers)?
+ npc,
+ }) {
+ return npc?.call(name, id, identifier, triggers);
+ }
+
+ @override
+ @optionalTypeArgs
+ TResult maybeWhen(
+ TResult Function(String name, String id, List triggers)? $default, {
+ TResult Function(
+ String name, String id, String identifier, List triggers)?
+ npc,
+ required TResult orElse(),
+ }) {
+ if (npc != null) {
+ return npc(name, id, identifier, triggers);
+ }
+ return orElse();
+ }
+
+ @override
+ @optionalTypeArgs
+ TResult map(
+ TResult Function(_Event value) $default, {
+ required TResult Function(NpcEvent value) npc,
+ }) {
+ return npc(this);
+ }
+
+ @override
+ @optionalTypeArgs
+ TResult? mapOrNull(
+ TResult Function(_Event value)? $default, {
+ TResult Function(NpcEvent value)? npc,
+ }) {
+ return npc?.call(this);
+ }
+
+ @override
+ @optionalTypeArgs
+ TResult maybeMap(
+ TResult Function(_Event value)? $default, {
+ TResult Function(NpcEvent value)? npc,
+ required TResult orElse(),
+ }) {
+ if (npc != null) {
+ return npc(this);
+ }
+ return orElse();
+ }
+
+ @override
+ Map toJson() {
+ return _$$NpcEventToJson(
+ this,
+ );
+ }
+}
+
+abstract class NpcEvent implements Event {
+ const factory NpcEvent(
+ {required final String name,
+ required final String id,
+ final String identifier,
+ final List triggers}) = _$NpcEvent;
+
+ factory NpcEvent.fromJson(Map json) = _$NpcEvent.fromJson;
+
+ @override
+ String get name;
+ @override
+ String get id;
+ String get identifier;
+ @override
+ List get triggers;
+ @override
+ @JsonKey(ignore: true)
+ _$$NpcEventCopyWith<_$NpcEvent> get copyWith =>
+ throw _privateConstructorUsedError;
+}
+
+Dialogue _$DialogueFromJson(Map json) {
+ switch (json['type']) {
+ case 'default':
+ return _Dialogue.fromJson(json);
+ case 'spoken':
+ return SpokenDialogue.fromJson(json);
+ case 'option':
+ return OptionDialogue.fromJson(json);
+
+ default:
+ throw CheckedFromJsonException(
+ json, 'type', 'Dialogue', 'Invalid union type "${json['type']}"!');
+ }
+}
+
+/// @nodoc
+mixin _$Dialogue {
+ String get name => throw _privateConstructorUsedError;
+ String get id => throw _privateConstructorUsedError;
+ @JsonKey(name: "triggered_by")
+ List get triggeredBy => throw _privateConstructorUsedError;
+ List get triggers => throw _privateConstructorUsedError;
+ String get speaker => throw _privateConstructorUsedError;
+ String get text => throw _privateConstructorUsedError;
+ List get criteria => throw _privateConstructorUsedError;
+ List get modifiers => throw _privateConstructorUsedError;
+ @optionalTypeArgs
+ TResult when(
+ TResult Function(
+ String name,
+ String id,
+ @JsonKey(name: "triggered_by") List triggeredBy,
+ List triggers,
+ String speaker,
+ String text,
+ List criteria,
+ List modifiers)
+ $default, {
+ required TResult Function(
+ String name,
+ String id,
+ @JsonKey(name: "triggered_by") List triggeredBy,
+ List triggers,
+ String speaker,
+ String text,
+ List criteria,
+ List modifiers,
+ int duration)
+ spoken,
+ required TResult Function(
+ String name,
+ String id,
+ @JsonKey(name: "triggered_by") List triggeredBy,
+ List triggers,
+ String speaker,
+ String text,
+ List criteria,
+ List modifiers,
+ List options)
+ option,
+ }) =>
+ throw _privateConstructorUsedError;
+ @optionalTypeArgs
+ TResult? whenOrNull(
+ TResult Function(
+ String name,
+ String id,
+ @JsonKey(name: "triggered_by") List triggeredBy,
+ List triggers,
+ String speaker,
+ String text,
+ List criteria,
+ List modifiers)?
+ $default, {
+ TResult Function(
+ String name,
+ String id,
+ @JsonKey(name: "triggered_by") List triggeredBy,
+ List triggers,
+ String speaker,
+ String text,
+ List criteria,
+ List modifiers,
+ int duration)?
+ spoken,
+ TResult Function(
+ String name,
+ String id,
+ @JsonKey(name: "triggered_by") List triggeredBy,
+ List triggers,
+ String speaker,
+ String text,
+ List criteria,
+ List modifiers,
+ List options)?
+ option,
+ }) =>
+ throw _privateConstructorUsedError;
+ @optionalTypeArgs
+ TResult maybeWhen(
+ TResult Function(
+ String name,
+ String id,
+ @JsonKey(name: "triggered_by") List triggeredBy,
+ List triggers,
+ String speaker,
+ String text,
+ List criteria,
+ List modifiers)?
+ $default, {
+ TResult Function(
+ String name,
+ String id,
+ @JsonKey(name: "triggered_by") List triggeredBy,
+ List triggers,
+ String speaker,
+ String text,
+ List criteria,
+ List modifiers,
+ int duration)?
+ spoken,
+ TResult Function(
+ String name,
+ String id,
+ @JsonKey(name: "triggered_by") List triggeredBy,
+ List triggers,
+ String speaker,
+ String text,
+ List criteria,
+ List modifiers,
+ List options)?
+ option,
+ required TResult orElse(),
+ }) =>
+ throw _privateConstructorUsedError;
+ @optionalTypeArgs
+ TResult map(
+ TResult Function(_Dialogue value) $default, {
+ required TResult Function(SpokenDialogue value) spoken,
+ required TResult Function(OptionDialogue value) option,
+ }) =>
+ throw _privateConstructorUsedError;
+ @optionalTypeArgs
+ TResult? mapOrNull(
+ TResult Function(_Dialogue value)? $default, {
+ TResult Function(SpokenDialogue value)? spoken,
+ TResult Function(OptionDialogue value)? option,
+ }) =>
+ throw _privateConstructorUsedError;
+ @optionalTypeArgs
+ TResult maybeMap(
+ TResult Function(_Dialogue value)? $default, {
+ TResult Function(SpokenDialogue value)? spoken,
+ TResult Function(OptionDialogue value)? option,
+ required TResult orElse(),
+ }) =>
+ throw _privateConstructorUsedError;
+ Map toJson() => throw _privateConstructorUsedError;
+ @JsonKey(ignore: true)
+ $DialogueCopyWith get copyWith =>
+ throw _privateConstructorUsedError;
+}
+
+/// @nodoc
+abstract class $DialogueCopyWith<$Res> {
+ factory $DialogueCopyWith(Dialogue value, $Res Function(Dialogue) then) =
+ _$DialogueCopyWithImpl<$Res>;
+ $Res call(
+ {String name,
+ String id,
+ @JsonKey(name: "triggered_by") List triggeredBy,
+ List triggers,
+ String speaker,
+ String text,
+ List criteria,
+ List modifiers});
+}
+
+/// @nodoc
+class _$DialogueCopyWithImpl<$Res> implements $DialogueCopyWith<$Res> {
+ _$DialogueCopyWithImpl(this._value, this._then);
+
+ final Dialogue _value;
+ // ignore: unused_field
+ final $Res Function(Dialogue) _then;
+
+ @override
+ $Res call({
+ Object? name = freezed,
+ Object? id = freezed,
+ Object? triggeredBy = freezed,
+ Object? triggers = freezed,
+ Object? speaker = freezed,
+ Object? text = freezed,
+ Object? criteria = freezed,
+ Object? modifiers = freezed,
+ }) {
+ return _then(_value.copyWith(
+ name: name == freezed
+ ? _value.name
+ : name // ignore: cast_nullable_to_non_nullable
+ as String,
+ id: id == freezed
+ ? _value.id
+ : id // ignore: cast_nullable_to_non_nullable
+ as String,
+ triggeredBy: triggeredBy == freezed
+ ? _value.triggeredBy
+ : triggeredBy // ignore: cast_nullable_to_non_nullable
+ as List,
+ triggers: triggers == freezed
+ ? _value.triggers
+ : triggers // ignore: cast_nullable_to_non_nullable
+ as List,
+ speaker: speaker == freezed
+ ? _value.speaker
+ : speaker // ignore: cast_nullable_to_non_nullable
+ as String,
+ text: text == freezed
+ ? _value.text
+ : text // ignore: cast_nullable_to_non_nullable
+ as String,
+ criteria: criteria == freezed
+ ? _value.criteria
+ : criteria // ignore: cast_nullable_to_non_nullable
+ as List,
+ modifiers: modifiers == freezed
+ ? _value.modifiers
+ : modifiers // ignore: cast_nullable_to_non_nullable
+ as List,
+ ));
+ }
+}
+
+/// @nodoc
+abstract class _$$_DialogueCopyWith<$Res> implements $DialogueCopyWith<$Res> {
+ factory _$$_DialogueCopyWith(
+ _$_Dialogue value, $Res Function(_$_Dialogue) then) =
+ __$$_DialogueCopyWithImpl<$Res>;
+ @override
+ $Res call(
+ {String name,
+ String id,
+ @JsonKey(name: "triggered_by") List triggeredBy,
+ List triggers,
+ String speaker,
+ String text,
+ List criteria,
+ List modifiers});
+}
+
+/// @nodoc
+class __$$_DialogueCopyWithImpl<$Res> extends _$DialogueCopyWithImpl<$Res>
+ implements _$$_DialogueCopyWith<$Res> {
+ __$$_DialogueCopyWithImpl(
+ _$_Dialogue _value, $Res Function(_$_Dialogue) _then)
+ : super(_value, (v) => _then(v as _$_Dialogue));
+
+ @override
+ _$_Dialogue get _value => super._value as _$_Dialogue;
+
+ @override
+ $Res call({
+ Object? name = freezed,
+ Object? id = freezed,
+ Object? triggeredBy = freezed,
+ Object? triggers = freezed,
+ Object? speaker = freezed,
+ Object? text = freezed,
+ Object? criteria = freezed,
+ Object? modifiers = freezed,
+ }) {
+ return _then(_$_Dialogue(
+ name: name == freezed
+ ? _value.name
+ : name // ignore: cast_nullable_to_non_nullable
+ as String,
+ id: id == freezed
+ ? _value.id
+ : id // ignore: cast_nullable_to_non_nullable
+ as String,
+ triggeredBy: triggeredBy == freezed
+ ? _value._triggeredBy
+ : triggeredBy // ignore: cast_nullable_to_non_nullable
+ as List,
+ triggers: triggers == freezed
+ ? _value._triggers
+ : triggers // ignore: cast_nullable_to_non_nullable
+ as List,
+ speaker: speaker == freezed
+ ? _value.speaker
+ : speaker // ignore: cast_nullable_to_non_nullable
+ as String,
+ text: text == freezed
+ ? _value.text
+ : text // ignore: cast_nullable_to_non_nullable
+ as String,
+ criteria: criteria == freezed
+ ? _value._criteria
+ : criteria // ignore: cast_nullable_to_non_nullable
+ as List,
+ modifiers: modifiers == freezed
+ ? _value._modifiers
+ : modifiers // ignore: cast_nullable_to_non_nullable
+ as List,
+ ));
+ }
+}
+
+/// @nodoc
+@JsonSerializable()
+class _$_Dialogue implements _Dialogue {
+ const _$_Dialogue(
+ {required this.name,
+ required this.id,
+ @JsonKey(name: "triggered_by") final List triggeredBy = const [],
+ final List triggers = const [],
+ required this.speaker,
+ required this.text,
+ final List criteria = const [],
+ final List modifiers = const [],
+ final String? $type})
+ : _triggeredBy = triggeredBy,
+ _triggers = triggers,
+ _criteria = criteria,
+ _modifiers = modifiers,
+ $type = $type ?? 'default';
+
+ factory _$_Dialogue.fromJson(Map json) =>
+ _$$_DialogueFromJson(json);
+
+ @override
+ final String name;
+ @override
+ final String id;
+ final List _triggeredBy;
+ @override
+ @JsonKey(name: "triggered_by")
+ List get triggeredBy {
+ // ignore: implicit_dynamic_type
+ return EqualUnmodifiableListView(_triggeredBy);
+ }
+
+ final List _triggers;
+ @override
+ @JsonKey()
+ List get triggers {
+ // ignore: implicit_dynamic_type
+ return EqualUnmodifiableListView(_triggers);
+ }
+
+ @override
+ final String speaker;
+ @override
+ final String text;
+ final List _criteria;
+ @override
+ @JsonKey()
+ List get criteria {
+ // ignore: implicit_dynamic_type
+ return EqualUnmodifiableListView(_criteria);
+ }
+
+ final List _modifiers;
+ @override
+ @JsonKey()
+ List get modifiers {
+ // ignore: implicit_dynamic_type
+ return EqualUnmodifiableListView(_modifiers);
+ }
+
+ @JsonKey(name: 'type')
+ final String $type;
+
+ @override
+ String toString() {
+ return 'Dialogue(name: $name, id: $id, triggeredBy: $triggeredBy, triggers: $triggers, speaker: $speaker, text: $text, criteria: $criteria, modifiers: $modifiers)';
+ }
+
+ @override
+ bool operator ==(dynamic other) {
+ return identical(this, other) ||
+ (other.runtimeType == runtimeType &&
+ other is _$_Dialogue &&
+ const DeepCollectionEquality().equals(other.name, name) &&
+ const DeepCollectionEquality().equals(other.id, id) &&
+ const DeepCollectionEquality()
+ .equals(other._triggeredBy, _triggeredBy) &&
+ const DeepCollectionEquality().equals(other._triggers, _triggers) &&
+ const DeepCollectionEquality().equals(other.speaker, speaker) &&
+ const DeepCollectionEquality().equals(other.text, text) &&
+ const DeepCollectionEquality().equals(other._criteria, _criteria) &&
+ const DeepCollectionEquality()
+ .equals(other._modifiers, _modifiers));
+ }
+
+ @JsonKey(ignore: true)
+ @override
+ int get hashCode => Object.hash(
+ runtimeType,
+ const DeepCollectionEquality().hash(name),
+ const DeepCollectionEquality().hash(id),
+ const DeepCollectionEquality().hash(_triggeredBy),
+ const DeepCollectionEquality().hash(_triggers),
+ const DeepCollectionEquality().hash(speaker),
+ const DeepCollectionEquality().hash(text),
+ const DeepCollectionEquality().hash(_criteria),
+ const DeepCollectionEquality().hash(_modifiers));
+
+ @JsonKey(ignore: true)
+ @override
+ _$$_DialogueCopyWith<_$_Dialogue> get copyWith =>
+ __$$_DialogueCopyWithImpl<_$_Dialogue>(this, _$identity);
+
+ @override
+ @optionalTypeArgs
+ TResult when(
+ TResult Function(
+ String name,
+ String id,
+ @JsonKey(name: "triggered_by") List triggeredBy,
+ List triggers,
+ String speaker,
+ String text,
+ List criteria,
+ List modifiers)
+ $default, {
+ required TResult Function(
+ String name,
+ String id,
+ @JsonKey(name: "triggered_by") List triggeredBy,
+ List triggers,
+ String speaker,
+ String text,
+ List criteria,
+ List modifiers,
+ int duration)
+ spoken,
+ required TResult Function(
+ String name,
+ String id,
+ @JsonKey(name: "triggered_by") List triggeredBy,
+ List triggers,
+ String speaker,
+ String text,
+ List criteria,
+ List modifiers,
+ List options)
+ option,
+ }) {
+ return $default(
+ name, id, triggeredBy, triggers, speaker, text, criteria, modifiers);
+ }
+
+ @override
+ @optionalTypeArgs
+ TResult? whenOrNull(
+ TResult Function(
+ String name,
+ String id,
+ @JsonKey(name: "triggered_by") List