diff --git a/.vsconfig b/.vsconfig
new file mode 100644
index 0000000..f019fd0
--- /dev/null
+++ b/.vsconfig
@@ -0,0 +1,6 @@
+{
+ "version": "1.0",
+ "components": [
+ "Microsoft.VisualStudio.Workload.ManagedGame"
+ ]
+}
diff --git a/Assets/Audio.meta b/Assets/Audio.meta
new file mode 100644
index 0000000..b8f9702
--- /dev/null
+++ b/Assets/Audio.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: eed53f0ba2c1e68449dedbb12f650e43
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Audio/Clips.meta b/Assets/Audio/Clips.meta
new file mode 100644
index 0000000..6d7ea75
--- /dev/null
+++ b/Assets/Audio/Clips.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: fb21226c032e76542b00dd19f80bff59
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Audio/Clips/Generated.meta b/Assets/Audio/Clips/Generated.meta
new file mode 100644
index 0000000..4f2f07c
--- /dev/null
+++ b/Assets/Audio/Clips/Generated.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 6fbc57475f270d340a03038b56ff2386
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Audio/Clips/Generated/boost_collected.wav b/Assets/Audio/Clips/Generated/boost_collected.wav
new file mode 100644
index 0000000..a90c592
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/boost_collected.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:64b06ff9e91b6fabe5cab20191c9770dd222cc851e300794d7b14408ec10c324
+size 21212
diff --git a/Assets/Audio/Clips/Generated/boost_collected.wav.meta b/Assets/Audio/Clips/Generated/boost_collected.wav.meta
new file mode 100644
index 0000000..9049c56
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/boost_collected.wav.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: e3dc6a0fbf543b64388f7b60615f4145
+AudioImporter:
+ externalObjects: {}
+ serializedVersion: 8
+ defaultSettings:
+ serializedVersion: 2
+ loadType: 0
+ sampleRateSetting: 0
+ sampleRateOverride: 44100
+ compressionFormat: 1
+ quality: 1
+ conversionMode: 0
+ preloadAudioData: 0
+ platformSettingOverrides: {}
+ forceToMono: 0
+ normalize: 1
+ loadInBackground: 0
+ ambisonic: 0
+ 3D: 1
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Audio/Clips/Generated/coin_collected.wav b/Assets/Audio/Clips/Generated/coin_collected.wav
new file mode 100644
index 0000000..796b43b
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/coin_collected.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1eaf93e852dfa575a953caccb81d49fb82d774e11a482396312adf1a1052f764
+size 12392
diff --git a/Assets/Audio/Clips/Generated/coin_collected.wav.meta b/Assets/Audio/Clips/Generated/coin_collected.wav.meta
new file mode 100644
index 0000000..b04ebe0
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/coin_collected.wav.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: 2be8148962585984fa7c7f14ae577839
+AudioImporter:
+ externalObjects: {}
+ serializedVersion: 8
+ defaultSettings:
+ serializedVersion: 2
+ loadType: 0
+ sampleRateSetting: 0
+ sampleRateOverride: 44100
+ compressionFormat: 1
+ quality: 1
+ conversionMode: 0
+ preloadAudioData: 0
+ platformSettingOverrides: {}
+ forceToMono: 0
+ normalize: 1
+ loadInBackground: 0
+ ambisonic: 0
+ 3D: 1
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Audio/Clips/Generated/continue_accepted.wav b/Assets/Audio/Clips/Generated/continue_accepted.wav
new file mode 100644
index 0000000..e14ff48
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/continue_accepted.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fb69e656652739354ddc4906fa3d277875ca9e53ddded5a6c02f7885f6c889ac
+size 22976
diff --git a/Assets/Audio/Clips/Generated/continue_accepted.wav.meta b/Assets/Audio/Clips/Generated/continue_accepted.wav.meta
new file mode 100644
index 0000000..7354bab
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/continue_accepted.wav.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: ae1b48318c83bfa40a0c1050ad79b3c3
+AudioImporter:
+ externalObjects: {}
+ serializedVersion: 8
+ defaultSettings:
+ serializedVersion: 2
+ loadType: 0
+ sampleRateSetting: 0
+ sampleRateOverride: 44100
+ compressionFormat: 1
+ quality: 1
+ conversionMode: 0
+ preloadAudioData: 0
+ platformSettingOverrides: {}
+ forceToMono: 0
+ normalize: 1
+ loadInBackground: 0
+ ambisonic: 0
+ 3D: 1
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Audio/Clips/Generated/game_over.wav b/Assets/Audio/Clips/Generated/game_over.wav
new file mode 100644
index 0000000..aae3c32
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/game_over.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ee93c48f084cae6bd92705a3438111ffca5701e4eb3ee0f001fa88f9b427cc5c
+size 61782
diff --git a/Assets/Audio/Clips/Generated/game_over.wav.meta b/Assets/Audio/Clips/Generated/game_over.wav.meta
new file mode 100644
index 0000000..533b8b1
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/game_over.wav.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: b435a43950545be458c5fdca99fbe35d
+AudioImporter:
+ externalObjects: {}
+ serializedVersion: 8
+ defaultSettings:
+ serializedVersion: 2
+ loadType: 0
+ sampleRateSetting: 0
+ sampleRateOverride: 44100
+ compressionFormat: 1
+ quality: 1
+ conversionMode: 0
+ preloadAudioData: 0
+ platformSettingOverrides: {}
+ forceToMono: 0
+ normalize: 1
+ loadInBackground: 0
+ ambisonic: 0
+ 3D: 1
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Audio/Clips/Generated/game_start.wav b/Assets/Audio/Clips/Generated/game_start.wav
new file mode 100644
index 0000000..f359a75
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/game_start.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:733e2d4820fefc67c06adaa5881953f9a27dbffe419bcda7e79f08ad526be0b0
+size 33560
diff --git a/Assets/Audio/Clips/Generated/game_start.wav.meta b/Assets/Audio/Clips/Generated/game_start.wav.meta
new file mode 100644
index 0000000..f3cd4b9
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/game_start.wav.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: aa9657a7d0b5f7645bd09cef753a3241
+AudioImporter:
+ externalObjects: {}
+ serializedVersion: 8
+ defaultSettings:
+ serializedVersion: 2
+ loadType: 0
+ sampleRateSetting: 0
+ sampleRateOverride: 44100
+ compressionFormat: 1
+ quality: 1
+ conversionMode: 0
+ preloadAudioData: 0
+ platformSettingOverrides: {}
+ forceToMono: 0
+ normalize: 1
+ loadInBackground: 0
+ ambisonic: 0
+ 3D: 1
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Audio/Clips/Generated/jetpack_collected.wav b/Assets/Audio/Clips/Generated/jetpack_collected.wav
new file mode 100644
index 0000000..2f8cff4
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/jetpack_collected.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9897ecda881f7e20870b3883d99f7bbe6b76881d798dca0e17e5965bb2012ab7
+size 38852
diff --git a/Assets/Audio/Clips/Generated/jetpack_collected.wav.meta b/Assets/Audio/Clips/Generated/jetpack_collected.wav.meta
new file mode 100644
index 0000000..f3a1fe3
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/jetpack_collected.wav.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: 12bcd9f3a3e360441922c1b1d580bfd4
+AudioImporter:
+ externalObjects: {}
+ serializedVersion: 8
+ defaultSettings:
+ serializedVersion: 2
+ loadType: 0
+ sampleRateSetting: 0
+ sampleRateOverride: 44100
+ compressionFormat: 1
+ quality: 1
+ conversionMode: 0
+ preloadAudioData: 0
+ platformSettingOverrides: {}
+ forceToMono: 0
+ normalize: 1
+ loadInBackground: 0
+ ambisonic: 0
+ 3D: 1
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Audio/Clips/Generated/jump_pad_activated.wav b/Assets/Audio/Clips/Generated/jump_pad_activated.wav
new file mode 100644
index 0000000..22fff54
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/jump_pad_activated.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bd4ff6545863627f05c7d0d9313815680644e904dfa7bc8694f30a840d276d7e
+size 20330
diff --git a/Assets/Audio/Clips/Generated/jump_pad_activated.wav.meta b/Assets/Audio/Clips/Generated/jump_pad_activated.wav.meta
new file mode 100644
index 0000000..999884d
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/jump_pad_activated.wav.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: 0dd7ddaa5ac08f94ab2a8127bdadfd89
+AudioImporter:
+ externalObjects: {}
+ serializedVersion: 8
+ defaultSettings:
+ serializedVersion: 2
+ loadType: 0
+ sampleRateSetting: 0
+ sampleRateOverride: 44100
+ compressionFormat: 1
+ quality: 1
+ conversionMode: 0
+ preloadAudioData: 0
+ platformSettingOverrides: {}
+ forceToMono: 0
+ normalize: 1
+ loadInBackground: 0
+ ambisonic: 0
+ 3D: 1
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Audio/Clips/Generated/player_death.wav b/Assets/Audio/Clips/Generated/player_death.wav
new file mode 100644
index 0000000..c05643d
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/player_death.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:16738e70ef912ac2d3ba5ad8fbecc2f5c7692966ad344b1b5a6a8dfabc7fb808
+size 40616
diff --git a/Assets/Audio/Clips/Generated/player_death.wav.meta b/Assets/Audio/Clips/Generated/player_death.wav.meta
new file mode 100644
index 0000000..dd3c50a
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/player_death.wav.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: 803f2112075bf8f43b9932da0b6412f4
+AudioImporter:
+ externalObjects: {}
+ serializedVersion: 8
+ defaultSettings:
+ serializedVersion: 2
+ loadType: 0
+ sampleRateSetting: 0
+ sampleRateOverride: 44100
+ compressionFormat: 1
+ quality: 1
+ conversionMode: 0
+ preloadAudioData: 0
+ platformSettingOverrides: {}
+ forceToMono: 0
+ normalize: 1
+ loadInBackground: 0
+ ambisonic: 0
+ 3D: 1
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Audio/Clips/Generated/player_jump.wav b/Assets/Audio/Clips/Generated/player_jump.wav
new file mode 100644
index 0000000..468f136
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/player_jump.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c4e72cd0bf58ee28bf28a9bd7af51c665dc53a3c23040875196d0e8ac85b7e5f
+size 14156
diff --git a/Assets/Audio/Clips/Generated/player_jump.wav.meta b/Assets/Audio/Clips/Generated/player_jump.wav.meta
new file mode 100644
index 0000000..1d81350
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/player_jump.wav.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: 46c2c848c1ca5ee4ca5d65e2c53ac8cc
+AudioImporter:
+ externalObjects: {}
+ serializedVersion: 8
+ defaultSettings:
+ serializedVersion: 2
+ loadType: 0
+ sampleRateSetting: 0
+ sampleRateOverride: 44100
+ compressionFormat: 1
+ quality: 1
+ conversionMode: 0
+ preloadAudioData: 0
+ platformSettingOverrides: {}
+ forceToMono: 0
+ normalize: 1
+ loadInBackground: 0
+ ambisonic: 0
+ 3D: 1
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Audio/Clips/Generated/player_respawn.wav b/Assets/Audio/Clips/Generated/player_respawn.wav
new file mode 100644
index 0000000..4dd67a6
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/player_respawn.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e481dc41b8350945af31f4afcc0f25033d12701c2bac3ad69b049e56f28a977a
+size 19448
diff --git a/Assets/Audio/Clips/Generated/player_respawn.wav.meta b/Assets/Audio/Clips/Generated/player_respawn.wav.meta
new file mode 100644
index 0000000..8d7759b
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/player_respawn.wav.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: 172d2de1ca63ba742941ed67d82c7a7a
+AudioImporter:
+ externalObjects: {}
+ serializedVersion: 8
+ defaultSettings:
+ serializedVersion: 2
+ loadType: 0
+ sampleRateSetting: 0
+ sampleRateOverride: 44100
+ compressionFormat: 1
+ quality: 1
+ conversionMode: 0
+ preloadAudioData: 0
+ platformSettingOverrides: {}
+ forceToMono: 0
+ normalize: 1
+ loadInBackground: 0
+ ambisonic: 0
+ 3D: 1
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Audio/Clips/Generated/prize_physical_started.wav b/Assets/Audio/Clips/Generated/prize_physical_started.wav
new file mode 100644
index 0000000..4578b76
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/prize_physical_started.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6b1fb583ae353dcbb0ccaeab12734687d8a170e565daea519f3f374a03d9715c
+size 38852
diff --git a/Assets/Audio/Clips/Generated/prize_physical_started.wav.meta b/Assets/Audio/Clips/Generated/prize_physical_started.wav.meta
new file mode 100644
index 0000000..a17df09
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/prize_physical_started.wav.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: 7933b6e19ab8feb4ea4e905ee9e52c57
+AudioImporter:
+ externalObjects: {}
+ serializedVersion: 8
+ defaultSettings:
+ serializedVersion: 2
+ loadType: 0
+ sampleRateSetting: 0
+ sampleRateOverride: 44100
+ compressionFormat: 1
+ quality: 1
+ conversionMode: 0
+ preloadAudioData: 0
+ platformSettingOverrides: {}
+ forceToMono: 0
+ normalize: 1
+ loadInBackground: 0
+ ambisonic: 0
+ 3D: 1
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Audio/Clips/Generated/prize_qr_started.wav b/Assets/Audio/Clips/Generated/prize_qr_started.wav
new file mode 100644
index 0000000..e337cae
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/prize_qr_started.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:560d1d44f3ad60c5a750c41031de535604c3a59ad254baf52e98877e715ffbdf
+size 30032
diff --git a/Assets/Audio/Clips/Generated/prize_qr_started.wav.meta b/Assets/Audio/Clips/Generated/prize_qr_started.wav.meta
new file mode 100644
index 0000000..b0e537e
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/prize_qr_started.wav.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: fc76f32ac20220e4fa9947fdda16e80a
+AudioImporter:
+ externalObjects: {}
+ serializedVersion: 8
+ defaultSettings:
+ serializedVersion: 2
+ loadType: 0
+ sampleRateSetting: 0
+ sampleRateOverride: 44100
+ compressionFormat: 1
+ quality: 1
+ conversionMode: 0
+ preloadAudioData: 0
+ platformSettingOverrides: {}
+ forceToMono: 0
+ normalize: 1
+ loadInBackground: 0
+ ambisonic: 0
+ 3D: 1
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Audio/Clips/Generated/prize_started.wav b/Assets/Audio/Clips/Generated/prize_started.wav
new file mode 100644
index 0000000..59c00d5
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/prize_started.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a1df8225c5b879a8b9659980aa7b718d99d114b2a253b0549b0a2de7d02db418
+size 42380
diff --git a/Assets/Audio/Clips/Generated/prize_started.wav.meta b/Assets/Audio/Clips/Generated/prize_started.wav.meta
new file mode 100644
index 0000000..a8d70bc
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/prize_started.wav.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: a64959ada619fd148b353ac9ad0f276d
+AudioImporter:
+ externalObjects: {}
+ serializedVersion: 8
+ defaultSettings:
+ serializedVersion: 2
+ loadType: 0
+ sampleRateSetting: 0
+ sampleRateOverride: 44100
+ compressionFormat: 1
+ quality: 1
+ conversionMode: 0
+ preloadAudioData: 0
+ platformSettingOverrides: {}
+ forceToMono: 0
+ normalize: 1
+ loadInBackground: 0
+ ambisonic: 0
+ 3D: 1
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Audio/Clips/Generated/spring_activated.wav b/Assets/Audio/Clips/Generated/spring_activated.wav
new file mode 100644
index 0000000..0ebeb49
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/spring_activated.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:61ea37070196566c0913290ee1e10ba4b8320c5ad0f112e87c82bcc44680b363
+size 17684
diff --git a/Assets/Audio/Clips/Generated/spring_activated.wav.meta b/Assets/Audio/Clips/Generated/spring_activated.wav.meta
new file mode 100644
index 0000000..c518b56
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/spring_activated.wav.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: 62fd512b6d0ddd6409b156be1d682416
+AudioImporter:
+ externalObjects: {}
+ serializedVersion: 8
+ defaultSettings:
+ serializedVersion: 2
+ loadType: 0
+ sampleRateSetting: 0
+ sampleRateOverride: 44100
+ compressionFormat: 1
+ quality: 1
+ conversionMode: 0
+ preloadAudioData: 0
+ platformSettingOverrides: {}
+ forceToMono: 0
+ normalize: 1
+ loadInBackground: 0
+ ambisonic: 0
+ 3D: 1
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Audio/Clips/Generated/ui_back.wav b/Assets/Audio/Clips/Generated/ui_back.wav
new file mode 100644
index 0000000..c8fbf81
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/ui_back.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a26e954b1f78d69723f02384c689fd4bd6849973905984c9c4b653ea5cf30332
+size 14156
diff --git a/Assets/Audio/Clips/Generated/ui_back.wav.meta b/Assets/Audio/Clips/Generated/ui_back.wav.meta
new file mode 100644
index 0000000..beea755
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/ui_back.wav.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: 86f4e01db21734942bc827c352d1192d
+AudioImporter:
+ externalObjects: {}
+ serializedVersion: 8
+ defaultSettings:
+ serializedVersion: 2
+ loadType: 0
+ sampleRateSetting: 0
+ sampleRateOverride: 44100
+ compressionFormat: 1
+ quality: 1
+ conversionMode: 0
+ preloadAudioData: 0
+ platformSettingOverrides: {}
+ forceToMono: 0
+ normalize: 1
+ loadInBackground: 0
+ ambisonic: 0
+ 3D: 1
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Audio/Clips/Generated/ui_error.wav b/Assets/Audio/Clips/Generated/ui_error.wav
new file mode 100644
index 0000000..5fb8ca6
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/ui_error.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6e4450872ac5e73e812fbaadad62f702e9de6b02dbb91c030717c96d6fd13a1a
+size 17684
diff --git a/Assets/Audio/Clips/Generated/ui_error.wav.meta b/Assets/Audio/Clips/Generated/ui_error.wav.meta
new file mode 100644
index 0000000..0c83194
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/ui_error.wav.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: 83e35ed99b265944ca0af63349a93b39
+AudioImporter:
+ externalObjects: {}
+ serializedVersion: 8
+ defaultSettings:
+ serializedVersion: 2
+ loadType: 0
+ sampleRateSetting: 0
+ sampleRateOverride: 44100
+ compressionFormat: 1
+ quality: 1
+ conversionMode: 0
+ preloadAudioData: 0
+ platformSettingOverrides: {}
+ forceToMono: 0
+ normalize: 1
+ loadInBackground: 0
+ ambisonic: 0
+ 3D: 1
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Audio/Clips/Generated/ui_navigate.wav b/Assets/Audio/Clips/Generated/ui_navigate.wav
new file mode 100644
index 0000000..44b84c5
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/ui_navigate.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0bcfb72ae02da7b81c8a7691bb44407ba60257b450fccceb0633029b9cf37114
+size 6218
diff --git a/Assets/Audio/Clips/Generated/ui_navigate.wav.meta b/Assets/Audio/Clips/Generated/ui_navigate.wav.meta
new file mode 100644
index 0000000..ff32695
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/ui_navigate.wav.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: 2ad9b6d07a8e6214bbe919e2b5d94001
+AudioImporter:
+ externalObjects: {}
+ serializedVersion: 8
+ defaultSettings:
+ serializedVersion: 2
+ loadType: 0
+ sampleRateSetting: 0
+ sampleRateOverride: 44100
+ compressionFormat: 1
+ quality: 1
+ conversionMode: 0
+ preloadAudioData: 0
+ platformSettingOverrides: {}
+ forceToMono: 0
+ normalize: 1
+ loadInBackground: 0
+ ambisonic: 0
+ 3D: 1
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Audio/Clips/Generated/ui_submit.wav b/Assets/Audio/Clips/Generated/ui_submit.wav
new file mode 100644
index 0000000..8653e8f
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/ui_submit.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:811ce139f7311179c25d224fb2ae9c358689bae152c0170ed48ebc611f43f181
+size 12392
diff --git a/Assets/Audio/Clips/Generated/ui_submit.wav.meta b/Assets/Audio/Clips/Generated/ui_submit.wav.meta
new file mode 100644
index 0000000..cb2fd1f
--- /dev/null
+++ b/Assets/Audio/Clips/Generated/ui_submit.wav.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: b1c90ee21bc444d4fb49b39000584eb0
+AudioImporter:
+ externalObjects: {}
+ serializedVersion: 8
+ defaultSettings:
+ serializedVersion: 2
+ loadType: 0
+ sampleRateSetting: 0
+ sampleRateOverride: 44100
+ compressionFormat: 1
+ quality: 1
+ conversionMode: 0
+ preloadAudioData: 0
+ platformSettingOverrides: {}
+ forceToMono: 0
+ normalize: 1
+ loadInBackground: 0
+ ambisonic: 0
+ 3D: 1
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Audio/Mixers.meta b/Assets/Audio/Mixers.meta
new file mode 100644
index 0000000..449aab1
--- /dev/null
+++ b/Assets/Audio/Mixers.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 5c4ba769be157e5459cbd025fba52af8
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Audio/Mixers/GameAudioMixer.mixer b/Assets/Audio/Mixers/GameAudioMixer.mixer
new file mode 100644
index 0000000..583083b
--- /dev/null
+++ b/Assets/Audio/Mixers/GameAudioMixer.mixer
@@ -0,0 +1,239 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!243 &-7907471987795070158
+AudioMixerGroupController:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: Music
+ m_AudioMixer: {fileID: 24100000}
+ m_GroupID: 8478690b25035494dadd1a1f37938d91
+ m_Children: []
+ m_Volume: aa39af793ad8de04d9f403c40e43e817
+ m_Pitch: c45e8002f72def04481db4ff819acc9a
+ m_Send: 00000000000000000000000000000000
+ m_Effects:
+ - {fileID: -7255383930698867984}
+ m_UserColorIndex: 0
+ m_Mute: 0
+ m_Solo: 0
+ m_BypassEffects: 0
+--- !u!244 &-7255383930698867984
+AudioMixerEffectController:
+ m_ObjectHideFlags: 3
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ m_EffectID: 31fee717867cc184ab21248945934c3e
+ m_EffectName: Attenuation
+ m_MixLevel: f4aa0afb53ea6884788105384f945d47
+ m_Parameters: []
+ m_SendTarget: {fileID: 0}
+ m_EnableWetMix: 0
+ m_Bypass: 0
+--- !u!243 &-7217844520931084221
+AudioMixerGroupController:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: Ambience
+ m_AudioMixer: {fileID: 24100000}
+ m_GroupID: bddd63f5c1b0be248ba048ea7c6f1235
+ m_Children: []
+ m_Volume: d7867c4ffc8e799428e2e0c9af0b1ac5
+ m_Pitch: 6f6b834778cb0594ab565bf947a26e14
+ m_Send: 00000000000000000000000000000000
+ m_Effects:
+ - {fileID: -1657385023915166172}
+ m_UserColorIndex: 0
+ m_Mute: 0
+ m_Solo: 0
+ m_BypassEffects: 0
+--- !u!243 &-5027576678584524412
+AudioMixerGroupController:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: UI
+ m_AudioMixer: {fileID: 24100000}
+ m_GroupID: 7fef6e1290001664dac7c593c8fc4894
+ m_Children: []
+ m_Volume: aca784eab31d24748b2b0fe22dea3fed
+ m_Pitch: da9fb75066720f944882a49da33cb982
+ m_Send: 00000000000000000000000000000000
+ m_Effects:
+ - {fileID: -3875845403683988259}
+ m_UserColorIndex: 0
+ m_Mute: 0
+ m_Solo: 0
+ m_BypassEffects: 0
+--- !u!244 &-3875845403683988259
+AudioMixerEffectController:
+ m_ObjectHideFlags: 3
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ m_EffectID: a2b60d3b173401f42aa3813ce9325975
+ m_EffectName: Attenuation
+ m_MixLevel: b100fc3403333fe4e824f99f7d43251c
+ m_Parameters: []
+ m_SendTarget: {fileID: 0}
+ m_EnableWetMix: 0
+ m_Bypass: 0
+--- !u!244 &-1657385023915166172
+AudioMixerEffectController:
+ m_ObjectHideFlags: 3
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ m_EffectID: 7a2cc57f6b3027f45bfcee777547a1a0
+ m_EffectName: Attenuation
+ m_MixLevel: 3ff9d85e58f77d44ba098848fd3b82bb
+ m_Parameters: []
+ m_SendTarget: {fileID: 0}
+ m_EnableWetMix: 0
+ m_Bypass: 0
+--- !u!243 &-769777606815116712
+AudioMixerGroupController:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: SFX
+ m_AudioMixer: {fileID: 24100000}
+ m_GroupID: 313fac706123ef544a6e182b9f0e9852
+ m_Children:
+ - {fileID: -5027576678584524412}
+ - {fileID: 4708169676529525986}
+ - {fileID: -7217844520931084221}
+ m_Volume: 189b6be1a4bf3164a90885b0f24a7a48
+ m_Pitch: 7d10388a6c8809c4e893e924af2e1665
+ m_Send: 00000000000000000000000000000000
+ m_Effects:
+ - {fileID: 1593934803790896400}
+ m_UserColorIndex: 0
+ m_Mute: 0
+ m_Solo: 0
+ m_BypassEffects: 0
+--- !u!241 &24100000
+AudioMixerController:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: GameAudioMixer
+ m_OutputGroup: {fileID: 0}
+ m_MasterGroup: {fileID: 24300002}
+ m_Snapshots:
+ - {fileID: 24500006}
+ m_StartSnapshot: {fileID: 24500006}
+ m_SuspendThreshold: -80
+ m_EnableSuspend: 1
+ m_UpdateMode: 0
+ m_ExposedParameters:
+ - guid: aa39af793ad8de04d9f403c40e43e817
+ name: MusicVolume
+ - guid: 189b6be1a4bf3164a90885b0f24a7a48
+ name: SoundsVolume
+ m_AudioMixerGroupViews: []
+ m_CurrentViewIndex: 0
+ m_TargetSnapshot: {fileID: 24500006}
+--- !u!243 &24300002
+AudioMixerGroupController:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: Master
+ m_AudioMixer: {fileID: 24100000}
+ m_GroupID: 5164b58c69786c341b1a5415bbcc6718
+ m_Children:
+ - {fileID: -7907471987795070158}
+ - {fileID: -769777606815116712}
+ m_Volume: 75328ceaf129d1e46b7dfbbe32410621
+ m_Pitch: 9b6ccf985505b244a8acf7fb6c85c3fa
+ m_Send: 00000000000000000000000000000000
+ m_Effects:
+ - {fileID: 24400004}
+ m_UserColorIndex: 0
+ m_Mute: 0
+ m_Solo: 0
+ m_BypassEffects: 0
+--- !u!244 &24400004
+AudioMixerEffectController:
+ m_ObjectHideFlags: 3
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ m_EffectID: 84ea623bc73ae90428944b4de74a2e83
+ m_EffectName: Attenuation
+ m_MixLevel: 939f982fdeffab44bb2a2b72ec9d2c6c
+ m_Parameters: []
+ m_SendTarget: {fileID: 0}
+ m_EnableWetMix: 0
+ m_Bypass: 0
+--- !u!245 &24500006
+AudioMixerSnapshotController:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: Snapshot
+ m_AudioMixer: {fileID: 24100000}
+ m_SnapshotID: 821b11805a7efdc4c96a7bff86a68c27
+ m_FloatValues: {}
+ m_TransitionOverrides: {}
+--- !u!244 &1593934803790896400
+AudioMixerEffectController:
+ m_ObjectHideFlags: 3
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ m_EffectID: c209efae5caeed4458c5d5a3d401df6a
+ m_EffectName: Attenuation
+ m_MixLevel: e020ce8f83e400f47b0f6d66c7d28aa5
+ m_Parameters: []
+ m_SendTarget: {fileID: 0}
+ m_EnableWetMix: 0
+ m_Bypass: 0
+--- !u!243 &4708169676529525986
+AudioMixerGroupController:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: Gameplay
+ m_AudioMixer: {fileID: 24100000}
+ m_GroupID: 35db7625f6672cb44a6ccabc6e36b6c4
+ m_Children: []
+ m_Volume: a0733b1657650f34999e40422b4f3337
+ m_Pitch: 353d935a6495994459ef5353bdd7a653
+ m_Send: 00000000000000000000000000000000
+ m_Effects:
+ - {fileID: 5794045651671756300}
+ m_UserColorIndex: 0
+ m_Mute: 0
+ m_Solo: 0
+ m_BypassEffects: 0
+--- !u!244 &5794045651671756300
+AudioMixerEffectController:
+ m_ObjectHideFlags: 3
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ m_EffectID: f679916613bceda4e8dba76c12a09560
+ m_EffectName: Attenuation
+ m_MixLevel: 6498f8e6b1021c54fa348a85bc317c90
+ m_Parameters: []
+ m_SendTarget: {fileID: 0}
+ m_EnableWetMix: 0
+ m_Bypass: 0
diff --git a/Assets/Audio/Mixers/GameAudioMixer.mixer.meta b/Assets/Audio/Mixers/GameAudioMixer.mixer.meta
new file mode 100644
index 0000000..0cf0988
--- /dev/null
+++ b/Assets/Audio/Mixers/GameAudioMixer.mixer.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e7f5dba03b1fe564095aec623e122722
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 24100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Audio/Settings.meta b/Assets/Audio/Settings.meta
new file mode 100644
index 0000000..66f4c18
--- /dev/null
+++ b/Assets/Audio/Settings.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 80a5ce93b0e34814f975a52114815918
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Audio/Settings/GameAudioSettings.asset b/Assets/Audio/Settings/GameAudioSettings.asset
new file mode 100644
index 0000000..88db2c6
--- /dev/null
+++ b/Assets/Audio/Settings/GameAudioSettings.asset
@@ -0,0 +1,242 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d6b6fabd3acfe76448ca16ffafdbe9f5, type: 3}
+ m_Name: GameAudioSettings
+ m_EditorClassIdentifier: DanroJump.Runtime::DanroJump.Audio.GameAudioSettings
+ mixer: {fileID: 24100000, guid: e7f5dba03b1fe564095aec623e122722, type: 2}
+ musicGroup: {fileID: -7907471987795070158, guid: e7f5dba03b1fe564095aec623e122722, type: 2}
+ sfxGroup: {fileID: -769777606815116712, guid: e7f5dba03b1fe564095aec623e122722, type: 2}
+ uiGroup: {fileID: -5027576678584524412, guid: e7f5dba03b1fe564095aec623e122722, type: 2}
+ gameplayGroup: {fileID: 4708169676529525986, guid: e7f5dba03b1fe564095aec623e122722, type: 2}
+ ambienceGroup: {fileID: -7217844520931084221, guid: e7f5dba03b1fe564095aec623e122722, type: 2}
+ musicLoop: {fileID: 0}
+ musicLoopVolume: 1
+ playMusicOnInitialize: 1
+ defaultMusicCue: 0
+ musicTracks: []
+ eventBindings:
+ - eventId: 0
+ channel: 1
+ outputGroupOverride: {fileID: 0}
+ clips:
+ - {fileID: 8300000, guid: 2ad9b6d07a8e6214bbe919e2b5d94001, type: 3}
+ volume: 0.55
+ pitchRange: {x: 0.96, y: 1.04}
+ spatial: 0
+ - eventId: 1
+ channel: 1
+ outputGroupOverride: {fileID: 0}
+ clips:
+ - {fileID: 8300000, guid: b1c90ee21bc444d4fb49b39000584eb0, type: 3}
+ volume: 0.65
+ pitchRange: {x: 0.96, y: 1.04}
+ spatial: 0
+ - eventId: 2
+ channel: 1
+ outputGroupOverride: {fileID: 0}
+ clips:
+ - {fileID: 8300000, guid: 86f4e01db21734942bc827c352d1192d, type: 3}
+ volume: 0.55
+ pitchRange: {x: 0.96, y: 1.04}
+ spatial: 0
+ - eventId: 3
+ channel: 1
+ outputGroupOverride: {fileID: 0}
+ clips:
+ - {fileID: 8300000, guid: 83e35ed99b265944ca0af63349a93b39, type: 3}
+ volume: 0.7
+ pitchRange: {x: 0.96, y: 1.04}
+ spatial: 0
+ - eventId: 10
+ channel: 1
+ outputGroupOverride: {fileID: 0}
+ clips:
+ - {fileID: 8300000, guid: aa9657a7d0b5f7645bd09cef753a3241, type: 3}
+ volume: 0.75
+ pitchRange: {x: 0.96, y: 1.04}
+ spatial: 0
+ - eventId: 20
+ channel: 2
+ outputGroupOverride: {fileID: 0}
+ clips:
+ - {fileID: 8300000, guid: 46c2c848c1ca5ee4ca5d65e2c53ac8cc, type: 3}
+ volume: 0.45
+ pitchRange: {x: 0.96, y: 1.04}
+ spatial: 1
+ - eventId: 21
+ channel: 2
+ outputGroupOverride: {fileID: 0}
+ clips:
+ - {fileID: 8300000, guid: 803f2112075bf8f43b9932da0b6412f4, type: 3}
+ volume: 0.75
+ pitchRange: {x: 0.96, y: 1.04}
+ spatial: 1
+ - eventId: 22
+ channel: 2
+ outputGroupOverride: {fileID: 0}
+ clips:
+ - {fileID: 8300000, guid: 172d2de1ca63ba742941ed67d82c7a7a, type: 3}
+ volume: 0.55
+ pitchRange: {x: 0.96, y: 1.04}
+ spatial: 1
+ - eventId: 23
+ channel: 2
+ outputGroupOverride: {fileID: 0}
+ clips:
+ - {fileID: 8300000, guid: b435a43950545be458c5fdca99fbe35d, type: 3}
+ volume: 0.8
+ pitchRange: {x: 0.96, y: 1.04}
+ spatial: 0
+ - eventId: 24
+ channel: 1
+ outputGroupOverride: {fileID: 0}
+ clips:
+ - {fileID: 8300000, guid: ae1b48318c83bfa40a0c1050ad79b3c3, type: 3}
+ volume: 0.65
+ pitchRange: {x: 0.96, y: 1.04}
+ spatial: 0
+ - eventId: 25
+ channel: 2
+ outputGroupOverride: {fileID: 0}
+ clips:
+ - {fileID: 8300000, guid: 46c2c848c1ca5ee4ca5d65e2c53ac8cc, type: 3}
+ volume: 0.35
+ pitchRange: {x: 0.96, y: 1.04}
+ spatial: 1
+ - eventId: 26
+ channel: 2
+ outputGroupOverride: {fileID: 0}
+ clips:
+ - {fileID: 8300000, guid: 803f2112075bf8f43b9932da0b6412f4, type: 3}
+ volume: 0.65
+ pitchRange: {x: 0.96, y: 1.04}
+ spatial: 1
+ - eventId: 27
+ channel: 2
+ outputGroupOverride: {fileID: 0}
+ clips:
+ - {fileID: 8300000, guid: e3dc6a0fbf543b64388f7b60615f4145, type: 3}
+ volume: 0.65
+ pitchRange: {x: 0.96, y: 1.04}
+ spatial: 1
+ - eventId: 28
+ channel: 2
+ outputGroupOverride: {fileID: 0}
+ clips:
+ - {fileID: 8300000, guid: 86f4e01db21734942bc827c352d1192d, type: 3}
+ volume: 0.35
+ pitchRange: {x: 0.96, y: 1.04}
+ spatial: 1
+ - eventId: 30
+ channel: 2
+ outputGroupOverride: {fileID: 0}
+ clips:
+ - {fileID: 8300000, guid: 2be8148962585984fa7c7f14ae577839, type: 3}
+ volume: 0.55
+ pitchRange: {x: 0.96, y: 1.04}
+ spatial: 1
+ - eventId: 31
+ channel: 2
+ outputGroupOverride: {fileID: 0}
+ clips:
+ - {fileID: 8300000, guid: e3dc6a0fbf543b64388f7b60615f4145, type: 3}
+ volume: 0.7
+ pitchRange: {x: 0.96, y: 1.04}
+ spatial: 1
+ - eventId: 32
+ channel: 2
+ outputGroupOverride: {fileID: 0}
+ clips:
+ - {fileID: 8300000, guid: 62fd512b6d0ddd6409b156be1d682416, type: 3}
+ volume: 0.65
+ pitchRange: {x: 0.96, y: 1.04}
+ spatial: 1
+ - eventId: 33
+ channel: 2
+ outputGroupOverride: {fileID: 0}
+ clips:
+ - {fileID: 8300000, guid: 0dd7ddaa5ac08f94ab2a8127bdadfd89, type: 3}
+ volume: 0.7
+ pitchRange: {x: 0.96, y: 1.04}
+ spatial: 1
+ - eventId: 34
+ channel: 2
+ outputGroupOverride: {fileID: 0}
+ clips:
+ - {fileID: 8300000, guid: 12bcd9f3a3e360441922c1b1d580bfd4, type: 3}
+ volume: 0.75
+ pitchRange: {x: 0.96, y: 1.04}
+ spatial: 1
+ - eventId: 40
+ channel: 1
+ outputGroupOverride: {fileID: 0}
+ clips:
+ - {fileID: 8300000, guid: a64959ada619fd148b353ac9ad0f276d, type: 3}
+ volume: 0.55
+ pitchRange: {x: 0.96, y: 1.04}
+ spatial: 0
+ - eventId: 41
+ channel: 1
+ outputGroupOverride: {fileID: 0}
+ clips:
+ - {fileID: 8300000, guid: fc76f32ac20220e4fa9947fdda16e80a, type: 3}
+ volume: 0.55
+ pitchRange: {x: 0.96, y: 1.04}
+ spatial: 0
+ - eventId: 42
+ channel: 1
+ outputGroupOverride: {fileID: 0}
+ clips:
+ - {fileID: 8300000, guid: 7933b6e19ab8feb4ea4e905ee9e52c57, type: 3}
+ volume: 0.55
+ pitchRange: {x: 0.96, y: 1.04}
+ spatial: 0
+ - eventId: 50
+ channel: 2
+ outputGroupOverride: {fileID: 0}
+ clips:
+ - {fileID: 8300000, guid: e3dc6a0fbf543b64388f7b60615f4145, type: 3}
+ volume: 0.4
+ pitchRange: {x: 0.96, y: 1.04}
+ spatial: 1
+ - eventId: 51
+ channel: 2
+ outputGroupOverride: {fileID: 0}
+ clips:
+ - {fileID: 8300000, guid: 46c2c848c1ca5ee4ca5d65e2c53ac8cc, type: 3}
+ volume: 0.25
+ pitchRange: {x: 0.96, y: 1.04}
+ spatial: 1
+ - eventId: 52
+ channel: 2
+ outputGroupOverride: {fileID: 0}
+ clips:
+ - {fileID: 8300000, guid: 83e35ed99b265944ca0af63349a93b39, type: 3}
+ volume: 0.65
+ pitchRange: {x: 0.96, y: 1.04}
+ spatial: 1
+ - eventId: 53
+ channel: 2
+ outputGroupOverride: {fileID: 0}
+ clips:
+ - {fileID: 8300000, guid: e3dc6a0fbf543b64388f7b60615f4145, type: 3}
+ volume: 0.65
+ pitchRange: {x: 0.96, y: 1.04}
+ spatial: 1
+ - eventId: 54
+ channel: 2
+ outputGroupOverride: {fileID: 0}
+ clips:
+ - {fileID: 8300000, guid: 2be8148962585984fa7c7f14ae577839, type: 3}
+ volume: 0.65
+ pitchRange: {x: 0.96, y: 1.04}
+ spatial: 1
diff --git a/Assets/Audio/Settings/GameAudioSettings.asset.meta b/Assets/Audio/Settings/GameAudioSettings.asset.meta
new file mode 100644
index 0000000..6def250
--- /dev/null
+++ b/Assets/Audio/Settings/GameAudioSettings.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b8788b5bf4f92e94f83f651bb5a0a6ee
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Resources/ProjectContext.prefab b/Assets/Resources/ProjectContext.prefab
index e5e18c8..59043d4 100644
--- a/Assets/Resources/ProjectContext.prefab
+++ b/Assets/Resources/ProjectContext.prefab
@@ -80,6 +80,7 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Settings.ServiceSettingsInstaller
databaseAddress: settings/service-settings-database
fallbackDatabase: {fileID: 0}
+ audioSettings: {fileID: 11400000, guid: b8788b5bf4f92e94f83f651bb5a0a6ee, type: 2}
fileName: service-settings.json
loadImmediately: 1
bindActionsInScene: 1
@@ -98,3 +99,10 @@ MonoBehaviour:
enabledOnStartup: 1
enabledChannels: -1
enabledOutputs: 3
+ fileLoggingEnabled: 0
+ fileLoggingUsePersistentDataPath: 1
+ fileLoggingDirectory: Logs
+ fileLoggingFileName: debug.log
+ fileLoggingAppendToFile: 1
+ fileLoggingWriteSessionHeader: 1
+ fileLoggingFlushEveryEntries: 1
diff --git a/Assets/Screenshots/continue_overlay_play_render.png b/Assets/Screenshots/continue_overlay_play_render.png
new file mode 100644
index 0000000..3318c65
Binary files /dev/null and b/Assets/Screenshots/continue_overlay_play_render.png differ
diff --git a/Assets/Screenshots/continue_overlay_play_render.png.meta b/Assets/Screenshots/continue_overlay_play_render.png.meta
new file mode 100644
index 0000000..ab78cf1
--- /dev/null
+++ b/Assets/Screenshots/continue_overlay_play_render.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: a1db019a8b1afa84fbc695420ae41753
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: 1174531882397755370
+ second: continue_overlay_play_render_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: continue_overlay_play_render_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 698
+ height: 1241
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: ae760bb2686cc4010800000000000000
+ internalID: 1174531882397755370
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ continue_overlay_play_render_0: 1174531882397755370
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/continue_overlay_ui_render-1.png b/Assets/Screenshots/continue_overlay_ui_render-1.png
new file mode 100644
index 0000000..ee7dd56
Binary files /dev/null and b/Assets/Screenshots/continue_overlay_ui_render-1.png differ
diff --git a/Assets/Screenshots/continue_overlay_ui_render-1.png.meta b/Assets/Screenshots/continue_overlay_ui_render-1.png.meta
new file mode 100644
index 0000000..a02a014
--- /dev/null
+++ b/Assets/Screenshots/continue_overlay_ui_render-1.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: 46d6362d7998346438ffe1175fee8b21
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: 132306147487455866
+ second: continue_overlay_ui_render-1_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: continue_overlay_ui_render-1_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 1920
+ height: 1080
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: a7a179a7dbb06d100800000000000000
+ internalID: 132306147487455866
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ continue_overlay_ui_render-1_0: 132306147487455866
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/continue_overlay_ui_render.png b/Assets/Screenshots/continue_overlay_ui_render.png
new file mode 100644
index 0000000..ee7dd56
Binary files /dev/null and b/Assets/Screenshots/continue_overlay_ui_render.png differ
diff --git a/Assets/Screenshots/continue_overlay_ui_render.png.meta b/Assets/Screenshots/continue_overlay_ui_render.png.meta
new file mode 100644
index 0000000..4fea908
--- /dev/null
+++ b/Assets/Screenshots/continue_overlay_ui_render.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: d8a7553b675e16740a64046d55d988cd
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: -7500016530885226919
+ second: continue_overlay_ui_render_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: continue_overlay_ui_render_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 1920
+ height: 1080
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: 95e4703b3b69ae790800000000000000
+ internalID: -7500016530885226919
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ continue_overlay_ui_render_0: -7500016530885226919
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/death_gameover_panel_timer_fixed.png b/Assets/Screenshots/death_gameover_panel_timer_fixed.png
new file mode 100644
index 0000000..7da5782
Binary files /dev/null and b/Assets/Screenshots/death_gameover_panel_timer_fixed.png differ
diff --git a/Assets/Screenshots/death_gameover_panel_timer_fixed.png.meta b/Assets/Screenshots/death_gameover_panel_timer_fixed.png.meta
new file mode 100644
index 0000000..a4230fe
--- /dev/null
+++ b/Assets/Screenshots/death_gameover_panel_timer_fixed.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: 78312e5c3ec479542a05974c0f62cb71
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: 1025458847261830504
+ second: death_gameover_panel_timer_fixed_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: death_gameover_panel_timer_fixed_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 698
+ height: 1241
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: 86da2d273692b3e00800000000000000
+ internalID: 1025458847261830504
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ death_gameover_panel_timer_fixed_0: 1025458847261830504
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/gameover_panel_after_death_fixed.png b/Assets/Screenshots/gameover_panel_after_death_fixed.png
new file mode 100644
index 0000000..c00fa82
Binary files /dev/null and b/Assets/Screenshots/gameover_panel_after_death_fixed.png differ
diff --git a/Assets/Screenshots/gameover_panel_after_death_fixed.png.meta b/Assets/Screenshots/gameover_panel_after_death_fixed.png.meta
new file mode 100644
index 0000000..d133847
--- /dev/null
+++ b/Assets/Screenshots/gameover_panel_after_death_fixed.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: 0ad0cf0dc99dfc94ea665eff8b2553d4
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: -2156163554073836210
+ second: gameover_panel_after_death_fixed_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: gameover_panel_after_death_fixed_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 698
+ height: 1241
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: e4509c1eba4c312e0800000000000000
+ internalID: -2156163554073836210
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ gameover_panel_after_death_fixed_0: -2156163554073836210
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/gameover_panel_direct_death_fixed.png b/Assets/Screenshots/gameover_panel_direct_death_fixed.png
new file mode 100644
index 0000000..7da5782
Binary files /dev/null and b/Assets/Screenshots/gameover_panel_direct_death_fixed.png differ
diff --git a/Assets/Screenshots/gameover_panel_direct_death_fixed.png.meta b/Assets/Screenshots/gameover_panel_direct_death_fixed.png.meta
new file mode 100644
index 0000000..ef6dda1
--- /dev/null
+++ b/Assets/Screenshots/gameover_panel_direct_death_fixed.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: 3d032536e43e00c44b6aee9928ca88a0
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: 633741089748541556
+ second: gameover_panel_direct_death_fixed_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: gameover_panel_direct_death_fixed_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 698
+ height: 1241
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: 470e706d9208bc800800000000000000
+ internalID: 633741089748541556
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ gameover_panel_direct_death_fixed_0: 633741089748541556
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/gameplay_continue_overlay_sprite_redesign.png b/Assets/Screenshots/gameplay_continue_overlay_sprite_redesign.png
new file mode 100644
index 0000000..c911e8e
Binary files /dev/null and b/Assets/Screenshots/gameplay_continue_overlay_sprite_redesign.png differ
diff --git a/Assets/Screenshots/gameplay_continue_overlay_sprite_redesign.png.meta b/Assets/Screenshots/gameplay_continue_overlay_sprite_redesign.png.meta
new file mode 100644
index 0000000..d909719
--- /dev/null
+++ b/Assets/Screenshots/gameplay_continue_overlay_sprite_redesign.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: cc820f96ca5d8f041b091da567a0998c
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: 853499033846909977
+ second: gameplay_continue_overlay_sprite_redesign_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: gameplay_continue_overlay_sprite_redesign_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 698
+ height: 1241
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: 91c859869dc38db00800000000000000
+ internalID: 853499033846909977
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ gameplay_continue_overlay_sprite_redesign_0: 853499033846909977
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/gameplay_continue_overlay_sprite_redesign_final.png b/Assets/Screenshots/gameplay_continue_overlay_sprite_redesign_final.png
new file mode 100644
index 0000000..614b247
Binary files /dev/null and b/Assets/Screenshots/gameplay_continue_overlay_sprite_redesign_final.png differ
diff --git a/Assets/Screenshots/gameplay_continue_overlay_sprite_redesign_final.png.meta b/Assets/Screenshots/gameplay_continue_overlay_sprite_redesign_final.png.meta
new file mode 100644
index 0000000..dd55d35
--- /dev/null
+++ b/Assets/Screenshots/gameplay_continue_overlay_sprite_redesign_final.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: 2585386bafde7bf4f8453d97f6fb3b00
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: 33494475652622720
+ second: gameplay_continue_overlay_sprite_redesign_final_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: gameplay_continue_overlay_sprite_redesign_final_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 698
+ height: 1241
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: 08966335c0ff67000800000000000000
+ internalID: 33494475652622720
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ gameplay_continue_overlay_sprite_redesign_final_0: 33494475652622720
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/gameplay_continue_overlay_sprite_redesign_fixed.png b/Assets/Screenshots/gameplay_continue_overlay_sprite_redesign_fixed.png
new file mode 100644
index 0000000..d584419
Binary files /dev/null and b/Assets/Screenshots/gameplay_continue_overlay_sprite_redesign_fixed.png differ
diff --git a/Assets/Screenshots/gameplay_continue_overlay_sprite_redesign_fixed.png.meta b/Assets/Screenshots/gameplay_continue_overlay_sprite_redesign_fixed.png.meta
new file mode 100644
index 0000000..58b1b3a
--- /dev/null
+++ b/Assets/Screenshots/gameplay_continue_overlay_sprite_redesign_fixed.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: 864368987c4120e41bf351224662fa26
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: -983061616352849355
+ second: gameplay_continue_overlay_sprite_redesign_fixed_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: gameplay_continue_overlay_sprite_redesign_fixed_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 698
+ height: 1241
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: 53297fc1ba67b52f0800000000000000
+ internalID: -983061616352849355
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ gameplay_continue_overlay_sprite_redesign_fixed_0: -983061616352849355
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/gameplay_dev_stats_panel_visible.png b/Assets/Screenshots/gameplay_dev_stats_panel_visible.png
new file mode 100644
index 0000000..d74691e
Binary files /dev/null and b/Assets/Screenshots/gameplay_dev_stats_panel_visible.png differ
diff --git a/Assets/Screenshots/gameplay_dev_stats_panel_visible.png.meta b/Assets/Screenshots/gameplay_dev_stats_panel_visible.png.meta
new file mode 100644
index 0000000..8a5b091
--- /dev/null
+++ b/Assets/Screenshots/gameplay_dev_stats_panel_visible.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: 36bd8985aca579d4d81c6fad8cf7c7f0
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: 2788602301444786866
+ second: gameplay_dev_stats_panel_visible_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: gameplay_dev_stats_panel_visible_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 698
+ height: 1241
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: 2ba047db40b13b620800000000000000
+ internalID: 2788602301444786866
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ gameplay_dev_stats_panel_visible_0: 2788602301444786866
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/gameplay_hud_sprite_redesign.png b/Assets/Screenshots/gameplay_hud_sprite_redesign.png
new file mode 100644
index 0000000..5eaf824
Binary files /dev/null and b/Assets/Screenshots/gameplay_hud_sprite_redesign.png differ
diff --git a/Assets/Screenshots/gameplay_hud_sprite_redesign.png.meta b/Assets/Screenshots/gameplay_hud_sprite_redesign.png.meta
new file mode 100644
index 0000000..47f98c0
--- /dev/null
+++ b/Assets/Screenshots/gameplay_hud_sprite_redesign.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: fd38b2f350042a3419d9110e33ddcdd2
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: 8449785252589798085
+ second: gameplay_hud_sprite_redesign_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: gameplay_hud_sprite_redesign_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 698
+ height: 1241
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: 5c203f81beaa34570800000000000000
+ internalID: 8449785252589798085
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ gameplay_hud_sprite_redesign_0: 8449785252589798085
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/gameplay_hud_sprite_redesign_large.png b/Assets/Screenshots/gameplay_hud_sprite_redesign_large.png
new file mode 100644
index 0000000..ec151ec
Binary files /dev/null and b/Assets/Screenshots/gameplay_hud_sprite_redesign_large.png differ
diff --git a/Assets/Screenshots/gameplay_hud_sprite_redesign_large.png.meta b/Assets/Screenshots/gameplay_hud_sprite_redesign_large.png.meta
new file mode 100644
index 0000000..3cd7d21
--- /dev/null
+++ b/Assets/Screenshots/gameplay_hud_sprite_redesign_large.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: 61664431408b7154bb6150cb65427e16
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: -5962762728378039441
+ second: gameplay_hud_sprite_redesign_large_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: gameplay_hud_sprite_redesign_large_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 698
+ height: 1241
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: f63861ff3e2004da0800000000000000
+ internalID: -5962762728378039441
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ gameplay_hud_sprite_redesign_large_0: -5962762728378039441
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/gameplay_prize_overlay_sprite_redesign.png b/Assets/Screenshots/gameplay_prize_overlay_sprite_redesign.png
new file mode 100644
index 0000000..17bb192
Binary files /dev/null and b/Assets/Screenshots/gameplay_prize_overlay_sprite_redesign.png differ
diff --git a/Assets/Screenshots/gameplay_prize_overlay_sprite_redesign.png.meta b/Assets/Screenshots/gameplay_prize_overlay_sprite_redesign.png.meta
new file mode 100644
index 0000000..57f27e2
--- /dev/null
+++ b/Assets/Screenshots/gameplay_prize_overlay_sprite_redesign.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: 00cd739dbb71ca348a0075136b2ec601
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: -6222900476458118949
+ second: gameplay_prize_overlay_sprite_redesign_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: gameplay_prize_overlay_sprite_redesign_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 698
+ height: 1241
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: bd0da1cacf0d3a9a0800000000000000
+ internalID: -6222900476458118949
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ gameplay_prize_overlay_sprite_redesign_0: -6222900476458118949
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/main_menu_playmode.png b/Assets/Screenshots/main_menu_playmode.png
new file mode 100644
index 0000000..7da5782
Binary files /dev/null and b/Assets/Screenshots/main_menu_playmode.png differ
diff --git a/Assets/Screenshots/main_menu_playmode.png.meta b/Assets/Screenshots/main_menu_playmode.png.meta
new file mode 100644
index 0000000..1c20351
--- /dev/null
+++ b/Assets/Screenshots/main_menu_playmode.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: be02a77699f5d0c47a4fa5f0eab307a0
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: -1921745591981713898
+ second: main_menu_playmode_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: main_menu_playmode_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 698
+ height: 1241
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: 616d141e0969455e0800000000000000
+ internalID: -1921745591981713898
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ main_menu_playmode_0: -1921745591981713898
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/main_menu_scene.png b/Assets/Screenshots/main_menu_scene.png
new file mode 100644
index 0000000..520c818
Binary files /dev/null and b/Assets/Screenshots/main_menu_scene.png differ
diff --git a/Assets/Screenshots/main_menu_scene.png.meta b/Assets/Screenshots/main_menu_scene.png.meta
new file mode 100644
index 0000000..088ae54
--- /dev/null
+++ b/Assets/Screenshots/main_menu_scene.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: f7aea4ad20e7b69429f15bf29b7d74b5
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: 4699180996166801269
+ second: main_menu_scene_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: main_menu_scene_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 1087
+ height: 1241
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: 577d9cbf738d63140800000000000000
+ internalID: 4699180996166801269
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ main_menu_scene_0: 4699180996166801269
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/prize-modal-focus-play-smoke.png b/Assets/Screenshots/prize-modal-focus-play-smoke.png
new file mode 100644
index 0000000..b7599b1
Binary files /dev/null and b/Assets/Screenshots/prize-modal-focus-play-smoke.png differ
diff --git a/Assets/Screenshots/prize-modal-focus-play-smoke.png.meta b/Assets/Screenshots/prize-modal-focus-play-smoke.png.meta
new file mode 100644
index 0000000..e9676d8
--- /dev/null
+++ b/Assets/Screenshots/prize-modal-focus-play-smoke.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: 7b1a86bea9a710347a33ca94b4e623b3
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: -6758097801378009398
+ second: prize-modal-focus-play-smoke_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: prize-modal-focus-play-smoke_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 698
+ height: 1241
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: acee3870bd96632a0800000000000000
+ internalID: -6758097801378009398
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ prize-modal-focus-play-smoke_0: -6758097801378009398
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/prize-modal-focus-smoke-1.png b/Assets/Screenshots/prize-modal-focus-smoke-1.png
new file mode 100644
index 0000000..ee7dd56
Binary files /dev/null and b/Assets/Screenshots/prize-modal-focus-smoke-1.png differ
diff --git a/Assets/Screenshots/prize-modal-focus-smoke-1.png.meta b/Assets/Screenshots/prize-modal-focus-smoke-1.png.meta
new file mode 100644
index 0000000..6a1f526
--- /dev/null
+++ b/Assets/Screenshots/prize-modal-focus-smoke-1.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: a50ab562a12ea3e4cbe2e5fbf7a028f5
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: 6513244024659437999
+ second: prize-modal-focus-smoke-1_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: prize-modal-focus-smoke-1_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 1920
+ height: 1080
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: fa9e2498ee0b36a50800000000000000
+ internalID: 6513244024659437999
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ prize-modal-focus-smoke-1_0: 6513244024659437999
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/prize-modal-focus-smoke.png b/Assets/Screenshots/prize-modal-focus-smoke.png
new file mode 100644
index 0000000..ee7dd56
Binary files /dev/null and b/Assets/Screenshots/prize-modal-focus-smoke.png differ
diff --git a/Assets/Screenshots/prize-modal-focus-smoke.png.meta b/Assets/Screenshots/prize-modal-focus-smoke.png.meta
new file mode 100644
index 0000000..fce0a86
--- /dev/null
+++ b/Assets/Screenshots/prize-modal-focus-smoke.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: a1da950fb02b2a341b91d376fa082fa4
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: -4295433110507755987
+ second: prize-modal-focus-smoke_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: prize-modal-focus-smoke_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 1920
+ height: 1080
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: d26ebbb185e8364c0800000000000000
+ internalID: -4295433110507755987
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ prize-modal-focus-smoke_0: -4295433110507755987
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/prize_overlay_play_render.png b/Assets/Screenshots/prize_overlay_play_render.png
new file mode 100644
index 0000000..8c4b28a
Binary files /dev/null and b/Assets/Screenshots/prize_overlay_play_render.png differ
diff --git a/Assets/Screenshots/prize_overlay_play_render.png.meta b/Assets/Screenshots/prize_overlay_play_render.png.meta
new file mode 100644
index 0000000..74344d5
--- /dev/null
+++ b/Assets/Screenshots/prize_overlay_play_render.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: c834887d1d4ad974f89b821228349558
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: -8578960766550793857
+ second: prize_overlay_play_render_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: prize_overlay_play_render_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 698
+ height: 1241
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: f712ab7d2a861f880800000000000000
+ internalID: -8578960766550793857
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ prize_overlay_play_render_0: -8578960766550793857
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/screenshot-20260611-134506.png b/Assets/Screenshots/screenshot-20260611-134506.png
new file mode 100644
index 0000000..03b9370
Binary files /dev/null and b/Assets/Screenshots/screenshot-20260611-134506.png differ
diff --git a/Assets/Screenshots/screenshot-20260611-134506.png.meta b/Assets/Screenshots/screenshot-20260611-134506.png.meta
new file mode 100644
index 0000000..037b7ea
--- /dev/null
+++ b/Assets/Screenshots/screenshot-20260611-134506.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: be6031a8fbc6728418c8ccd0a0eedfa5
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: 3209825577113534537
+ second: screenshot-20260611-134506_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: screenshot-20260611-134506_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 698
+ height: 1241
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: 940c0d22b579b8c20800000000000000
+ internalID: 3209825577113534537
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ screenshot-20260611-134506_0: 3209825577113534537
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/screenshot-20260611-142933.png b/Assets/Screenshots/screenshot-20260611-142933.png
new file mode 100644
index 0000000..2d2ff22
Binary files /dev/null and b/Assets/Screenshots/screenshot-20260611-142933.png differ
diff --git a/Assets/Screenshots/screenshot-20260611-142933.png.meta b/Assets/Screenshots/screenshot-20260611-142933.png.meta
new file mode 100644
index 0000000..5a8b2f1
--- /dev/null
+++ b/Assets/Screenshots/screenshot-20260611-142933.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: ac4b947bebcabc44dbf27e18fff0d1ef
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: -254849939547654045
+ second: screenshot-20260611-142933_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: screenshot-20260611-142933_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 698
+ height: 1241
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: 3687b3a8457967cf0800000000000000
+ internalID: -254849939547654045
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ screenshot-20260611-142933_0: -254849939547654045
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/screenshot-20260611-143026.png b/Assets/Screenshots/screenshot-20260611-143026.png
new file mode 100644
index 0000000..df25bb1
Binary files /dev/null and b/Assets/Screenshots/screenshot-20260611-143026.png differ
diff --git a/Assets/Screenshots/screenshot-20260611-143026.png.meta b/Assets/Screenshots/screenshot-20260611-143026.png.meta
new file mode 100644
index 0000000..d796592
--- /dev/null
+++ b/Assets/Screenshots/screenshot-20260611-143026.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: f7b8677baeeb9a74383640e37cffb8a9
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: -1218041822826240822
+ second: screenshot-20260611-143026_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: screenshot-20260611-143026_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 698
+ height: 1241
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: ac46fd46a65a81fe0800000000000000
+ internalID: -1218041822826240822
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ screenshot-20260611-143026_0: -1218041822826240822
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/service_info_modal_check.png b/Assets/Screenshots/service_info_modal_check.png
new file mode 100644
index 0000000..d452949
Binary files /dev/null and b/Assets/Screenshots/service_info_modal_check.png differ
diff --git a/Assets/Screenshots/service_info_modal_check.png.meta b/Assets/Screenshots/service_info_modal_check.png.meta
new file mode 100644
index 0000000..5053711
--- /dev/null
+++ b/Assets/Screenshots/service_info_modal_check.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: bd3b3bf1deed7c5478ce2ccc759f030a
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: -2432049245201484790
+ second: service_info_modal_check_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: service_info_modal_check_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 698
+ height: 1241
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: a043287d810af3ed0800000000000000
+ internalID: -2432049245201484790
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ service_info_modal_check_0: -2432049245201484790
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/service_info_modal_ui_render-1.png b/Assets/Screenshots/service_info_modal_ui_render-1.png
new file mode 100644
index 0000000..69abde1
Binary files /dev/null and b/Assets/Screenshots/service_info_modal_ui_render-1.png differ
diff --git a/Assets/Screenshots/service_info_modal_ui_render-1.png.meta b/Assets/Screenshots/service_info_modal_ui_render-1.png.meta
new file mode 100644
index 0000000..95438c6
--- /dev/null
+++ b/Assets/Screenshots/service_info_modal_ui_render-1.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: bf10d741d9186a54d8edc1abc94295ba
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: 4369281559604011672
+ second: service_info_modal_ui_render-1_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: service_info_modal_ui_render-1_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 1920
+ height: 1080
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: 892acd3dd6ec2ac30800000000000000
+ internalID: 4369281559604011672
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ service_info_modal_ui_render-1_0: 4369281559604011672
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/service_info_modal_ui_render-2.png b/Assets/Screenshots/service_info_modal_ui_render-2.png
new file mode 100644
index 0000000..69abde1
Binary files /dev/null and b/Assets/Screenshots/service_info_modal_ui_render-2.png differ
diff --git a/Assets/Screenshots/service_info_modal_ui_render-2.png.meta b/Assets/Screenshots/service_info_modal_ui_render-2.png.meta
new file mode 100644
index 0000000..8b9c3e9
--- /dev/null
+++ b/Assets/Screenshots/service_info_modal_ui_render-2.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: 38875bb98f22de74a9561ae56bbb2851
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: -2906643133530269855
+ second: service_info_modal_ui_render-2_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: service_info_modal_ui_render-2_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 1920
+ height: 1080
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: 1679919587789a7d0800000000000000
+ internalID: -2906643133530269855
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ service_info_modal_ui_render-2_0: -2906643133530269855
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/service_info_modal_ui_render.png b/Assets/Screenshots/service_info_modal_ui_render.png
new file mode 100644
index 0000000..ee7dd56
Binary files /dev/null and b/Assets/Screenshots/service_info_modal_ui_render.png differ
diff --git a/Assets/Screenshots/service_info_modal_ui_render.png.meta b/Assets/Screenshots/service_info_modal_ui_render.png.meta
new file mode 100644
index 0000000..09383aa
--- /dev/null
+++ b/Assets/Screenshots/service_info_modal_ui_render.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: 82a5808f7422db9448377a9870e68984
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: -3732279464272664121
+ second: service_info_modal_ui_render_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: service_info_modal_ui_render_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 1920
+ height: 1080
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: 7c9ea890a97443cc0800000000000000
+ internalID: -3732279464272664121
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ service_info_modal_ui_render_0: -3732279464272664121
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/service_text_input_discrete_right_no_skip.png b/Assets/Screenshots/service_text_input_discrete_right_no_skip.png
new file mode 100644
index 0000000..2989c4e
Binary files /dev/null and b/Assets/Screenshots/service_text_input_discrete_right_no_skip.png differ
diff --git a/Assets/Screenshots/service_text_input_discrete_right_no_skip.png.meta b/Assets/Screenshots/service_text_input_discrete_right_no_skip.png.meta
new file mode 100644
index 0000000..1f1ff13
--- /dev/null
+++ b/Assets/Screenshots/service_text_input_discrete_right_no_skip.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: a115ccd7fb8cdff42a7e38cc74dd9c86
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: -4662236230716878853
+ second: service_text_input_discrete_right_no_skip_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: service_text_input_discrete_right_no_skip_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 698
+ height: 1241
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: bff0a2989d86c4fb0800000000000000
+ internalID: -4662236230716878853
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ service_text_input_discrete_right_no_skip_0: -4662236230716878853
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/service_text_input_discrete_right_no_skip_2.png b/Assets/Screenshots/service_text_input_discrete_right_no_skip_2.png
new file mode 100644
index 0000000..905f0a2
Binary files /dev/null and b/Assets/Screenshots/service_text_input_discrete_right_no_skip_2.png differ
diff --git a/Assets/Screenshots/service_text_input_discrete_right_no_skip_2.png.meta b/Assets/Screenshots/service_text_input_discrete_right_no_skip_2.png.meta
new file mode 100644
index 0000000..5cdc4aa
--- /dev/null
+++ b/Assets/Screenshots/service_text_input_discrete_right_no_skip_2.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: 5fdc9925931973343bee78c42a7784ec
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: 6397094884569126916
+ second: service_text_input_discrete_right_no_skip_2_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: service_text_input_discrete_right_no_skip_2_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 698
+ height: 1241
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: 408163d77eb07c850800000000000000
+ internalID: 6397094884569126916
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ service_text_input_discrete_right_no_skip_2_0: 6397094884569126916
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/service_text_input_discrete_right_no_skip_final.png b/Assets/Screenshots/service_text_input_discrete_right_no_skip_final.png
new file mode 100644
index 0000000..905f0a2
Binary files /dev/null and b/Assets/Screenshots/service_text_input_discrete_right_no_skip_final.png differ
diff --git a/Assets/Screenshots/service_text_input_discrete_right_no_skip_final.png.meta b/Assets/Screenshots/service_text_input_discrete_right_no_skip_final.png.meta
new file mode 100644
index 0000000..0a1a9b5
--- /dev/null
+++ b/Assets/Screenshots/service_text_input_discrete_right_no_skip_final.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: 1fbac32213e7e424b97e1e2ddf086501
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: 449799378185761471
+ second: service_text_input_discrete_right_no_skip_final_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: service_text_input_discrete_right_no_skip_final_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 698
+ height: 1241
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: fb234fcb6220e3600800000000000000
+ internalID: 449799378185761471
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ service_text_input_discrete_right_no_skip_final_0: 449799378185761471
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/service_text_input_loop_navigation_keyboard_ok.png b/Assets/Screenshots/service_text_input_loop_navigation_keyboard_ok.png
new file mode 100644
index 0000000..78ba255
Binary files /dev/null and b/Assets/Screenshots/service_text_input_loop_navigation_keyboard_ok.png differ
diff --git a/Assets/Screenshots/service_text_input_loop_navigation_keyboard_ok.png.meta b/Assets/Screenshots/service_text_input_loop_navigation_keyboard_ok.png.meta
new file mode 100644
index 0000000..b3b437d
--- /dev/null
+++ b/Assets/Screenshots/service_text_input_loop_navigation_keyboard_ok.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: c51fbbfba9ccc424b9762d4f7c52dd8a
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: -6953413858631157431
+ second: service_text_input_loop_navigation_keyboard_ok_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: service_text_input_loop_navigation_keyboard_ok_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 698
+ height: 1241
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: 949f204bfe2808f90800000000000000
+ internalID: -6953413858631157431
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ service_text_input_loop_navigation_keyboard_ok_0: -6953413858631157431
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/service_text_input_modal_playmode.png b/Assets/Screenshots/service_text_input_modal_playmode.png
new file mode 100644
index 0000000..d452949
Binary files /dev/null and b/Assets/Screenshots/service_text_input_modal_playmode.png differ
diff --git a/Assets/Screenshots/service_text_input_modal_playmode.png.meta b/Assets/Screenshots/service_text_input_modal_playmode.png.meta
new file mode 100644
index 0000000..f8c2f71
--- /dev/null
+++ b/Assets/Screenshots/service_text_input_modal_playmode.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: 4909b719fe7038240a147ec457e9255f
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: 5617729613151109227
+ second: service_text_input_modal_playmode_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: service_text_input_modal_playmode_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 698
+ height: 1241
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: b608014b15f26fd40800000000000000
+ internalID: 5617729613151109227
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ service_text_input_modal_playmode_0: 5617729613151109227
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/service_text_input_modal_screen_capture.png b/Assets/Screenshots/service_text_input_modal_screen_capture.png
new file mode 100644
index 0000000..589876b
Binary files /dev/null and b/Assets/Screenshots/service_text_input_modal_screen_capture.png differ
diff --git a/Assets/Screenshots/service_text_input_modal_screen_capture.png.meta b/Assets/Screenshots/service_text_input_modal_screen_capture.png.meta
new file mode 100644
index 0000000..de269ec
--- /dev/null
+++ b/Assets/Screenshots/service_text_input_modal_screen_capture.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: 6cd5d57803ae284499a4c38521d034fb
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: -3566058241931444512
+ second: service_text_input_modal_screen_capture_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: service_text_input_modal_screen_capture_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 698
+ height: 1241
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: 0ee72593ce0d28ec0800000000000000
+ internalID: -3566058241931444512
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ service_text_input_modal_screen_capture_0: -3566058241931444512
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/service_text_input_modal_screen_capture_2.png b/Assets/Screenshots/service_text_input_modal_screen_capture_2.png
new file mode 100644
index 0000000..589876b
Binary files /dev/null and b/Assets/Screenshots/service_text_input_modal_screen_capture_2.png differ
diff --git a/Assets/Screenshots/service_text_input_modal_screen_capture_2.png.meta b/Assets/Screenshots/service_text_input_modal_screen_capture_2.png.meta
new file mode 100644
index 0000000..b12208f
--- /dev/null
+++ b/Assets/Screenshots/service_text_input_modal_screen_capture_2.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: 2ff60000aea7ebb43b26e6b1ac011553
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: -3654473533539601013
+ second: service_text_input_modal_screen_capture_2_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: service_text_input_modal_screen_capture_2_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 698
+ height: 1241
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: b853e48fea3b84dc0800000000000000
+ internalID: -3654473533539601013
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ service_text_input_modal_screen_capture_2_0: -3654473533539601013
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/service_text_input_modal_screen_capture_fixed.png b/Assets/Screenshots/service_text_input_modal_screen_capture_fixed.png
new file mode 100644
index 0000000..eb18b9e
Binary files /dev/null and b/Assets/Screenshots/service_text_input_modal_screen_capture_fixed.png differ
diff --git a/Assets/Screenshots/service_text_input_modal_screen_capture_fixed.png.meta b/Assets/Screenshots/service_text_input_modal_screen_capture_fixed.png.meta
new file mode 100644
index 0000000..5d13f48
--- /dev/null
+++ b/Assets/Screenshots/service_text_input_modal_screen_capture_fixed.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: 9165e1113a8fc3e40b3d6baba6b8eee3
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: 1819211929203260450
+ second: service_text_input_modal_screen_capture_fixed_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: service_text_input_modal_screen_capture_fixed_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 698
+ height: 1241
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: 22c305b6c932f3910800000000000000
+ internalID: 1819211929203260450
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ service_text_input_modal_screen_capture_fixed_0: 1819211929203260450
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Screenshots/service_text_input_no_skip_fixed.png b/Assets/Screenshots/service_text_input_no_skip_fixed.png
new file mode 100644
index 0000000..eb18b9e
Binary files /dev/null and b/Assets/Screenshots/service_text_input_no_skip_fixed.png differ
diff --git a/Assets/Screenshots/service_text_input_no_skip_fixed.png.meta b/Assets/Screenshots/service_text_input_no_skip_fixed.png.meta
new file mode 100644
index 0000000..7639d16
--- /dev/null
+++ b/Assets/Screenshots/service_text_input_no_skip_fixed.png.meta
@@ -0,0 +1,169 @@
+fileFormatVersion: 2
+guid: cdbe6809598c1ec408a438fefec6995e
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: -7147554741299236450
+ second: service_text_input_no_skip_fixed_0
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 2
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: WindowsStoreApps
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: service_text_input_no_skip_fixed_0
+ rect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 698
+ height: 1241
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ customData:
+ outline: []
+ physicsShape: []
+ tessellationDetail: -1
+ bones: []
+ spriteID: e91333805d8cecc90800000000000000
+ internalID: -7147554741299236450
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable:
+ service_text_input_no_skip_fixed_0: -7147554741299236450
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/ScriptableObjects/Gameplay/MainAudioSettings.asset b/Assets/ScriptableObjects/Gameplay/MainAudioSettings.asset
new file mode 100644
index 0000000..d64aa06
--- /dev/null
+++ b/Assets/ScriptableObjects/Gameplay/MainAudioSettings.asset
@@ -0,0 +1,26 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d6b6fabd3acfe76448ca16ffafdbe9f5, type: 3}
+ m_Name: MainAudioSettings
+ m_EditorClassIdentifier: DanroJump.Runtime::DanroJump.Audio.GameAudioSettings
+ mixer: {fileID: 0}
+ musicGroup: {fileID: 0}
+ sfxGroup: {fileID: 0}
+ uiGroup: {fileID: 0}
+ gameplayGroup: {fileID: 0}
+ ambienceGroup: {fileID: 0}
+ musicLoop: {fileID: 0}
+ musicLoopVolume: 1
+ playMusicOnInitialize: 1
+ defaultMusicCue: 0
+ musicTracks: []
+ eventBindings: []
diff --git a/Assets/ScriptableObjects/Gameplay/MainAudioSettings.asset.meta b/Assets/ScriptableObjects/Gameplay/MainAudioSettings.asset.meta
new file mode 100644
index 0000000..235644d
--- /dev/null
+++ b/Assets/ScriptableObjects/Gameplay/MainAudioSettings.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: bf7ca407d43a63a4aa7bbee33da26d0f
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Runtime/Audio.meta b/Assets/Scripts/Runtime/Audio.meta
new file mode 100644
index 0000000..b83844b
--- /dev/null
+++ b/Assets/Scripts/Runtime/Audio.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 4093aa3e2d70b94449e8774d6dda6a03
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Runtime/Audio/GameAudioChannel.cs b/Assets/Scripts/Runtime/Audio/GameAudioChannel.cs
new file mode 100644
index 0000000..a22a634
--- /dev/null
+++ b/Assets/Scripts/Runtime/Audio/GameAudioChannel.cs
@@ -0,0 +1,14 @@
+namespace DanroJump.Audio
+{
+ ///
+ /// Логический канал звука, который выбирает AudioSource и mixer group.
+ ///
+ public enum GameAudioChannel
+ {
+ Sfx = 0,
+ Ui = 1,
+ Gameplay = 2,
+ Music = 3,
+ Ambience = 4
+ }
+}
diff --git a/Assets/Scripts/Runtime/Audio/GameAudioChannel.cs.meta b/Assets/Scripts/Runtime/Audio/GameAudioChannel.cs.meta
new file mode 100644
index 0000000..14c57b3
--- /dev/null
+++ b/Assets/Scripts/Runtime/Audio/GameAudioChannel.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 6f7f0071e6f86de4eaa9c40e67d28a58
\ No newline at end of file
diff --git a/Assets/Scripts/Runtime/Audio/GameAudioClipBinding.cs b/Assets/Scripts/Runtime/Audio/GameAudioClipBinding.cs
new file mode 100644
index 0000000..26c1ae9
--- /dev/null
+++ b/Assets/Scripts/Runtime/Audio/GameAudioClipBinding.cs
@@ -0,0 +1,76 @@
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.Audio;
+
+namespace DanroJump.Audio
+{
+ ///
+ /// Описывает набор клипов и параметры воспроизведения для одного игрового события.
+ ///
+ [Serializable]
+ public sealed class GameAudioClipBinding
+ {
+ [SerializeField] private GameAudioEvent eventId;
+ [SerializeField] private GameAudioChannel channel = GameAudioChannel.Sfx;
+ [SerializeField] private AudioMixerGroup outputGroupOverride;
+ [SerializeField] private AudioClip[] clips = Array.Empty();
+ [SerializeField] [Range(0f, 1f)] private float volume = 1f;
+ [SerializeField] private Vector2 pitchRange = Vector2.one;
+ [SerializeField] private bool spatial;
+
+ public GameAudioEvent EventId => eventId;
+
+ public GameAudioChannel Channel => channel;
+
+ public AudioMixerGroup OutputGroupOverride => outputGroupOverride;
+
+ public IReadOnlyList Clips => clips;
+
+ public float Volume => Mathf.Clamp01(volume);
+
+ public bool Spatial => spatial;
+
+ public bool HasClip => clips != null && clips.Length > 0 && clips[0] != null;
+
+ public float RandomPitch => Mathf.Clamp(
+ UnityEngine.Random.Range(Mathf.Min(pitchRange.x, pitchRange.y), Mathf.Max(pitchRange.x, pitchRange.y)),
+ 0.05f,
+ 3f);
+
+ public AudioClip GetRandomClip()
+ {
+ if (clips == null || clips.Length == 0)
+ {
+ return null;
+ }
+
+ var firstValidClip = default(AudioClip);
+ for (var index = 0; index < clips.Length; index++)
+ {
+ if (clips[index] == null)
+ {
+ continue;
+ }
+
+ firstValidClip ??= clips[index];
+ }
+
+ if (firstValidClip == null)
+ {
+ return null;
+ }
+
+ for (var attempt = 0; attempt < clips.Length; attempt++)
+ {
+ var clip = clips[UnityEngine.Random.Range(0, clips.Length)];
+ if (clip != null)
+ {
+ return clip;
+ }
+ }
+
+ return firstValidClip;
+ }
+ }
+}
diff --git a/Assets/Scripts/Runtime/Audio/GameAudioClipBinding.cs.meta b/Assets/Scripts/Runtime/Audio/GameAudioClipBinding.cs.meta
new file mode 100644
index 0000000..ba7e952
--- /dev/null
+++ b/Assets/Scripts/Runtime/Audio/GameAudioClipBinding.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 4fdf3e3937b5969408862175d507c30d
\ No newline at end of file
diff --git a/Assets/Scripts/Runtime/Audio/GameAudioEmitter.cs b/Assets/Scripts/Runtime/Audio/GameAudioEmitter.cs
new file mode 100644
index 0000000..4e037e6
--- /dev/null
+++ b/Assets/Scripts/Runtime/Audio/GameAudioEmitter.cs
@@ -0,0 +1,62 @@
+using System;
+using UnityEngine;
+using Zenject;
+
+namespace DanroJump.Audio
+{
+ ///
+ /// Универсальный мост от prefab/Animation Event к централизованной аудиосистеме.
+ ///
+ [DisallowMultipleComponent]
+ [AddComponentMenu("Audio/Game Audio Emitter")]
+ public sealed class GameAudioEmitter : MonoBehaviour
+ {
+ [SerializeField] private bool playAtTransform = true;
+
+ private IGameAudioService audioService;
+
+ [Inject]
+ public void Construct([InjectOptional] IGameAudioService injectedAudioService = null)
+ {
+ audioService = injectedAudioService;
+ }
+
+ public void Play(GameAudioEvent eventId)
+ {
+ if (playAtTransform)
+ {
+ audioService?.Play(eventId, transform.position);
+ return;
+ }
+
+ audioService?.Play(eventId);
+ }
+
+ public void PlayGlobal(GameAudioEvent eventId)
+ {
+ audioService?.Play(eventId);
+ }
+
+ public void PlayByName(string eventName)
+ {
+ if (string.IsNullOrWhiteSpace(eventName) ||
+ !Enum.TryParse(eventName, true, out GameAudioEvent eventId))
+ {
+ return;
+ }
+
+ Play(eventId);
+ }
+
+ public void PlayGlobalByName(string eventName)
+ {
+ if (string.IsNullOrWhiteSpace(eventName) ||
+ !Enum.TryParse(eventName, true, out GameAudioEvent eventId))
+ {
+ return;
+ }
+
+ PlayGlobal(eventId);
+ }
+ }
+}
diff --git a/Assets/Scripts/Runtime/Audio/GameAudioEmitter.cs.meta b/Assets/Scripts/Runtime/Audio/GameAudioEmitter.cs.meta
new file mode 100644
index 0000000..d4bf65e
--- /dev/null
+++ b/Assets/Scripts/Runtime/Audio/GameAudioEmitter.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 9b03db1b37c64e5fba8ba9742bfceac3
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Runtime/Audio/GameAudioEvent.cs b/Assets/Scripts/Runtime/Audio/GameAudioEvent.cs
new file mode 100644
index 0000000..e4836ba
--- /dev/null
+++ b/Assets/Scripts/Runtime/Audio/GameAudioEvent.cs
@@ -0,0 +1,36 @@
+namespace DanroJump.Audio
+{
+ ///
+ /// Канонические события, для которых можно назначать клипы в GameAudioSettings.
+ ///
+ public enum GameAudioEvent
+ {
+ UiNavigate = 0,
+ UiSubmit = 1,
+ UiBack = 2,
+ UiError = 3,
+ GameStart = 10,
+ PlayerJump = 20,
+ PlayerDeath = 21,
+ PlayerRespawn = 22,
+ GameOver = 23,
+ ContinueAccepted = 24,
+ PlayerLand = 25,
+ PlayerHurt = 26,
+ PlayerBoostStarted = 27,
+ PlayerBoostEnded = 28,
+ CoinCollected = 30,
+ BoostCollected = 31,
+ SpringActivated = 32,
+ JumpPadActivated = 33,
+ JetpackCollected = 34,
+ PrizeStarted = 40,
+ PrizeQrStarted = 41,
+ PrizePhysicalStarted = 42,
+ EnemySpawned = 50,
+ EnemyMoved = 51,
+ EnemyAttack = 52,
+ EnemyHit = 53,
+ EnemyDefeated = 54
+ }
+}
diff --git a/Assets/Scripts/Runtime/Audio/GameAudioEvent.cs.meta b/Assets/Scripts/Runtime/Audio/GameAudioEvent.cs.meta
new file mode 100644
index 0000000..8db6539
--- /dev/null
+++ b/Assets/Scripts/Runtime/Audio/GameAudioEvent.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 5f34bfc02f3100e4d8e650f3bebae100
\ No newline at end of file
diff --git a/Assets/Scripts/Runtime/Audio/GameAudioService.cs b/Assets/Scripts/Runtime/Audio/GameAudioService.cs
new file mode 100644
index 0000000..fbcb656
--- /dev/null
+++ b/Assets/Scripts/Runtime/Audio/GameAudioService.cs
@@ -0,0 +1,358 @@
+using System;
+using System.Collections.Generic;
+using DanroJump.Settings;
+using UnityEngine;
+using UnityEngine.Audio;
+using Zenject;
+using Object = UnityEngine.Object;
+
+namespace DanroJump.Audio
+{
+ ///
+ /// Централизованный проигрыватель звуков: применяет service-volume, routes events в mixer groups и держит источники звука.
+ ///
+ public sealed class GameAudioService : IGameAudioService, IInitializable, IDisposable
+ {
+ public const string MusicVolumeParameter = "MusicVolume";
+ public const string SoundsVolumeParameter = "SoundsVolume";
+ public const float MutedDecibels = -80f;
+ private const int SpatialSourcePoolSize = 8;
+
+ private readonly GameAudioSettings settings;
+ private readonly IReadOnlyServiceSettings serviceSettings;
+ private readonly List spatialSources = new();
+ private GameObject root;
+ private AudioSource musicSource;
+ private AudioSource uiSource;
+ private AudioSource gameplaySource;
+ private int nextSpatialSourceIndex;
+ private GameMusicCue? currentMusicCue;
+ private bool subscribedToSettings;
+
+ public GameAudioService(
+ [InjectOptional] GameAudioSettings settings = null,
+ [InjectOptional] IReadOnlyServiceSettings serviceSettings = null)
+ {
+ this.settings = settings;
+ this.serviceSettings = serviceSettings;
+ }
+
+ public bool IsReady => HasPlayableConfiguration();
+
+ public bool IsMusicPlaying => musicSource != null && musicSource.isPlaying;
+
+ public GameMusicCue? CurrentMusicCue => currentMusicCue;
+
+ public void Initialize()
+ {
+ if (!IsReady)
+ {
+ Debug.LogWarning($"{nameof(GameAudioService)} has no complete playable audio configuration.");
+ }
+
+ EnsureSources();
+ SubscribeToSettings();
+ ApplyServiceVolumes();
+ if (settings == null || settings.PlayMusicOnInitialize)
+ {
+ StartMusic();
+ }
+ }
+
+ public void Dispose()
+ {
+ UnsubscribeFromSettings();
+
+ if (root != null)
+ {
+ if (Application.isPlaying)
+ {
+ Object.Destroy(root);
+ }
+ else
+ {
+ Object.DestroyImmediate(root);
+ }
+
+ root = null;
+ }
+ }
+
+ public void Play(GameAudioEvent eventId)
+ {
+ PlayInternal(eventId, null);
+ }
+
+ public void Play(GameAudioEvent eventId, Vector3 worldPosition)
+ {
+ PlayInternal(eventId, worldPosition);
+ }
+
+ public void StartMusic()
+ {
+ if (settings == null)
+ {
+ return;
+ }
+
+ if (settings.TryGetDefaultMusicTrack(out var track))
+ {
+ currentMusicCue = track.Cue;
+ PlayMusicTrack(track);
+ return;
+ }
+
+ StartLegacyMusicLoop();
+ }
+
+ public void PlayMusic(GameMusicCue cue)
+ {
+ if (settings == null || !settings.TryGetMusicTrack(cue, out var track))
+ {
+ return;
+ }
+
+ currentMusicCue = cue;
+ PlayMusicTrack(track);
+ }
+
+ public void StopMusic()
+ {
+ if (musicSource != null)
+ {
+ musicSource.Stop();
+ musicSource.clip = null;
+ currentMusicCue = null;
+ }
+ }
+
+ public void ApplyServiceVolumes()
+ {
+ if (settings?.Mixer == null)
+ {
+ return;
+ }
+
+ var musicVolume = serviceSettings != null ? serviceSettings.GetFloat(ServiceSettingsKeys.MusicVolume) : 1f;
+ var soundsVolume = serviceSettings != null ? serviceSettings.GetFloat(ServiceSettingsKeys.SoundsVolume) : 1f;
+ settings.Mixer.SetFloat(MusicVolumeParameter, LinearToDecibels(musicVolume));
+ settings.Mixer.SetFloat(SoundsVolumeParameter, LinearToDecibels(soundsVolume));
+ }
+
+ public static float LinearToDecibels(float value)
+ {
+ var clamped = Mathf.Clamp01(value);
+ return clamped <= 0.0001f ? MutedDecibels : Mathf.Log10(clamped) * 20f;
+ }
+
+ private void StartLegacyMusicLoop()
+ {
+ if (settings == null || settings.MusicLoop == null)
+ {
+ return;
+ }
+
+ EnsureSources();
+ musicSource.clip = settings.MusicLoop;
+ musicSource.loop = true;
+ musicSource.volume = settings.MusicLoopVolume;
+ musicSource.pitch = 1f;
+ musicSource.outputAudioMixerGroup = settings.MusicGroup;
+ currentMusicCue = null;
+
+ if (!musicSource.isPlaying)
+ {
+ musicSource.Play();
+ }
+ }
+
+ private void PlayMusicTrack(GameMusicTrack track)
+ {
+ if (track == null || track.Clip == null)
+ {
+ return;
+ }
+
+ EnsureSources();
+ if (musicSource.isPlaying && musicSource.clip == track.Clip)
+ {
+ musicSource.volume = track.Volume;
+ musicSource.loop = track.Loop;
+ musicSource.outputAudioMixerGroup = track.OutputGroupOverride != null
+ ? track.OutputGroupOverride
+ : settings.MusicGroup;
+ return;
+ }
+
+ musicSource.Stop();
+ musicSource.clip = track.Clip;
+ musicSource.loop = track.Loop;
+ musicSource.volume = track.Volume;
+ musicSource.pitch = 1f;
+ musicSource.outputAudioMixerGroup = track.OutputGroupOverride != null
+ ? track.OutputGroupOverride
+ : settings.MusicGroup;
+ musicSource.Play();
+ }
+
+ private void PlayInternal(GameAudioEvent eventId, Vector3? worldPosition)
+ {
+ if (settings == null || !settings.TryGetBinding(eventId, out var binding))
+ {
+ return;
+ }
+
+ var clip = binding.GetRandomClip();
+ if (clip == null)
+ {
+ return;
+ }
+
+ EnsureSources();
+ var source = ResolveSource(binding, worldPosition);
+ source.outputAudioMixerGroup = binding.OutputGroupOverride != null
+ ? binding.OutputGroupOverride
+ : settings.ResolveGroup(binding.Channel);
+ source.pitch = binding.RandomPitch;
+ source.spatialBlend = binding.Spatial || worldPosition.HasValue ? 1f : 0f;
+
+ if (worldPosition.HasValue)
+ {
+ source.transform.position = worldPosition.Value;
+ }
+
+ source.PlayOneShot(clip, binding.Volume);
+ }
+
+ private AudioSource ResolveSource(GameAudioClipBinding binding, Vector3? worldPosition)
+ {
+ if (binding.Spatial || worldPosition.HasValue)
+ {
+ return ResolveSpatialSource();
+ }
+
+ return binding.Channel switch
+ {
+ GameAudioChannel.Music => musicSource,
+ GameAudioChannel.Ui => uiSource,
+ _ => gameplaySource
+ };
+ }
+
+ private void EnsureSources()
+ {
+ if (root != null)
+ {
+ return;
+ }
+
+ root = new GameObject("Game Audio Service");
+ if (Application.isPlaying)
+ {
+ Object.DontDestroyOnLoad(root);
+ }
+
+ musicSource = CreateSource("Music", GameAudioChannel.Music);
+ uiSource = CreateSource("UI", GameAudioChannel.Ui);
+ gameplaySource = CreateSource("Gameplay", GameAudioChannel.Gameplay);
+ for (var index = 0; index < SpatialSourcePoolSize; index++)
+ {
+ var spatialSource = CreateSource($"Spatial {index + 1}", GameAudioChannel.Gameplay);
+ spatialSource.spatialBlend = 1f;
+ spatialSources.Add(spatialSource);
+ }
+ }
+
+ private AudioSource ResolveSpatialSource()
+ {
+ if (spatialSources.Count == 0)
+ {
+ return gameplaySource;
+ }
+
+ var source = spatialSources[nextSpatialSourceIndex % spatialSources.Count];
+ nextSpatialSourceIndex = (nextSpatialSourceIndex + 1) % spatialSources.Count;
+ return source;
+ }
+
+ private AudioSource CreateSource(string sourceName, GameAudioChannel channel)
+ {
+ var sourceObject = new GameObject(sourceName);
+ sourceObject.transform.SetParent(root.transform, false);
+ var source = sourceObject.AddComponent();
+ source.playOnAwake = false;
+ source.loop = false;
+ source.outputAudioMixerGroup = settings != null ? settings.ResolveGroup(channel) : null;
+ return source;
+ }
+
+ private bool HasPlayableConfiguration()
+ {
+ if (settings == null ||
+ settings.Mixer == null ||
+ settings.MusicGroup == null ||
+ settings.ResolveGroup(GameAudioChannel.Sfx) == null ||
+ settings.ResolveGroup(GameAudioChannel.Ui) == null ||
+ settings.ResolveGroup(GameAudioChannel.Gameplay) == null ||
+ settings.ResolveGroup(GameAudioChannel.Ambience) == null)
+ {
+ return false;
+ }
+
+ var bindings = settings.EventBindings;
+ if (bindings == null)
+ {
+ return false;
+ }
+
+ for (var index = 0; index < bindings.Count; index++)
+ {
+ if (bindings[index] != null && bindings[index].HasClip)
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private void SubscribeToSettings()
+ {
+ if (subscribedToSettings || serviceSettings == null)
+ {
+ return;
+ }
+
+ serviceSettings.SettingsLoaded += HandleSettingsLoaded;
+ serviceSettings.SettingChanged += HandleSettingChanged;
+ subscribedToSettings = true;
+ }
+
+ private void UnsubscribeFromSettings()
+ {
+ if (!subscribedToSettings || serviceSettings == null)
+ {
+ subscribedToSettings = false;
+ return;
+ }
+
+ serviceSettings.SettingsLoaded -= HandleSettingsLoaded;
+ serviceSettings.SettingChanged -= HandleSettingChanged;
+ subscribedToSettings = false;
+ }
+
+ private void HandleSettingsLoaded()
+ {
+ ApplyServiceVolumes();
+ }
+
+ private void HandleSettingChanged(string key, ServiceSettingValue value)
+ {
+ if (string.Equals(key, ServiceSettingsKeys.MusicVolume, StringComparison.Ordinal) ||
+ string.Equals(key, ServiceSettingsKeys.SoundsVolume, StringComparison.Ordinal))
+ {
+ ApplyServiceVolumes();
+ }
+ }
+ }
+}
diff --git a/Assets/Scripts/Runtime/Audio/GameAudioService.cs.meta b/Assets/Scripts/Runtime/Audio/GameAudioService.cs.meta
new file mode 100644
index 0000000..bf91a3c
--- /dev/null
+++ b/Assets/Scripts/Runtime/Audio/GameAudioService.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 772f929cc95083c4dbc06288a2a550b4
\ No newline at end of file
diff --git a/Assets/Scripts/Runtime/Audio/GameAudioSettings.cs b/Assets/Scripts/Runtime/Audio/GameAudioSettings.cs
new file mode 100644
index 0000000..320a018
--- /dev/null
+++ b/Assets/Scripts/Runtime/Audio/GameAudioSettings.cs
@@ -0,0 +1,121 @@
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.Audio;
+
+namespace DanroJump.Audio
+{
+ ///
+ /// Настройки звуковой подсистемы: микшер, группы каналов, музыка и таблица событий.
+ ///
+ [CreateAssetMenu(menuName = "Danro Jump/Audio/Game Audio Settings", fileName = "GameAudioSettings")]
+ public sealed class GameAudioSettings : ScriptableObject
+ {
+ [Header("Mixer")]
+ [SerializeField] private AudioMixer mixer;
+ [SerializeField] private AudioMixerGroup musicGroup;
+ [SerializeField] private AudioMixerGroup sfxGroup;
+ [SerializeField] private AudioMixerGroup uiGroup;
+ [SerializeField] private AudioMixerGroup gameplayGroup;
+ [SerializeField] private AudioMixerGroup ambienceGroup;
+
+ [Header("Music")]
+ [SerializeField] private AudioClip musicLoop;
+ [SerializeField] [Range(0f, 1f)] private float musicLoopVolume = 1f;
+ [SerializeField] private bool playMusicOnInitialize = true;
+ [SerializeField] private GameMusicCue defaultMusicCue = GameMusicCue.Menu;
+ [SerializeField] private List musicTracks = new();
+
+ [Header("Events")]
+ [SerializeField] private List eventBindings = new();
+
+ public AudioMixer Mixer => mixer;
+
+ public AudioMixerGroup MusicGroup => musicGroup;
+
+ public AudioClip MusicLoop => musicLoop;
+
+ public float MusicLoopVolume => Mathf.Clamp01(musicLoopVolume);
+
+ public bool PlayMusicOnInitialize => playMusicOnInitialize;
+
+ public GameMusicCue DefaultMusicCue => defaultMusicCue;
+
+ public IReadOnlyList MusicTracks => musicTracks;
+
+ public IReadOnlyList EventBindings => eventBindings;
+
+ public bool TryGetBinding(GameAudioEvent eventId, out GameAudioClipBinding binding)
+ {
+ if (eventBindings != null)
+ {
+ for (var index = 0; index < eventBindings.Count; index++)
+ {
+ var candidate = eventBindings[index];
+ if (candidate != null && candidate.EventId == eventId)
+ {
+ binding = candidate;
+ return true;
+ }
+ }
+ }
+
+ binding = null;
+ return false;
+ }
+
+ public bool TryGetMusicTrack(GameMusicCue cue, out GameMusicTrack track)
+ {
+ if (musicTracks != null)
+ {
+ for (var index = 0; index < musicTracks.Count; index++)
+ {
+ var candidate = musicTracks[index];
+ if (candidate != null && candidate.Cue == cue && candidate.HasClip)
+ {
+ track = candidate;
+ return true;
+ }
+ }
+ }
+
+ track = null;
+ return false;
+ }
+
+ public bool TryGetDefaultMusicTrack(out GameMusicTrack track)
+ {
+ if (TryGetMusicTrack(defaultMusicCue, out track))
+ {
+ return true;
+ }
+
+ if (musicTracks != null)
+ {
+ for (var index = 0; index < musicTracks.Count; index++)
+ {
+ var candidate = musicTracks[index];
+ if (candidate != null && candidate.HasClip)
+ {
+ track = candidate;
+ return true;
+ }
+ }
+ }
+
+ track = null;
+ return false;
+ }
+
+ public AudioMixerGroup ResolveGroup(GameAudioChannel channel)
+ {
+ return channel switch
+ {
+ GameAudioChannel.Music => musicGroup,
+ GameAudioChannel.Ui => uiGroup != null ? uiGroup : sfxGroup,
+ GameAudioChannel.Gameplay => gameplayGroup != null ? gameplayGroup : sfxGroup,
+ GameAudioChannel.Ambience => ambienceGroup != null ? ambienceGroup : sfxGroup,
+ _ => sfxGroup
+ };
+ }
+ }
+}
diff --git a/Assets/Scripts/Runtime/Audio/GameAudioSettings.cs.meta b/Assets/Scripts/Runtime/Audio/GameAudioSettings.cs.meta
new file mode 100644
index 0000000..282847e
--- /dev/null
+++ b/Assets/Scripts/Runtime/Audio/GameAudioSettings.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: d6b6fabd3acfe76448ca16ffafdbe9f5
\ No newline at end of file
diff --git a/Assets/Scripts/Runtime/Audio/GameMusicCue.cs b/Assets/Scripts/Runtime/Audio/GameMusicCue.cs
new file mode 100644
index 0000000..ba00ac7
--- /dev/null
+++ b/Assets/Scripts/Runtime/Audio/GameMusicCue.cs
@@ -0,0 +1,14 @@
+namespace DanroJump.Audio
+{
+ ///
+ /// Канонические музыкальные состояния, к которым можно привязывать loop-треки в GameAudioSettings.
+ ///
+ public enum GameMusicCue
+ {
+ Menu = 0,
+ Gameplay = 1,
+ Prize = 2,
+ GameOver = 3,
+ Attract = 4
+ }
+}
diff --git a/Assets/Scripts/Runtime/Audio/GameMusicCue.cs.meta b/Assets/Scripts/Runtime/Audio/GameMusicCue.cs.meta
new file mode 100644
index 0000000..cebaf76
--- /dev/null
+++ b/Assets/Scripts/Runtime/Audio/GameMusicCue.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 029836faa1a740aaa64361ce35f3040e
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Runtime/Audio/GameMusicTrack.cs b/Assets/Scripts/Runtime/Audio/GameMusicTrack.cs
new file mode 100644
index 0000000..16b0dd6
--- /dev/null
+++ b/Assets/Scripts/Runtime/Audio/GameMusicTrack.cs
@@ -0,0 +1,31 @@
+using System;
+using UnityEngine;
+using UnityEngine.Audio;
+
+namespace DanroJump.Audio
+{
+ ///
+ /// Описывает музыкальный трек для конкретного состояния игры.
+ ///
+ [Serializable]
+ public sealed class GameMusicTrack
+ {
+ [SerializeField] private GameMusicCue cue;
+ [SerializeField] private AudioClip clip;
+ [SerializeField] private AudioMixerGroup outputGroupOverride;
+ [SerializeField] [Range(0f, 1f)] private float volume = 1f;
+ [SerializeField] private bool loop = true;
+
+ public GameMusicCue Cue => cue;
+
+ public AudioClip Clip => clip;
+
+ public AudioMixerGroup OutputGroupOverride => outputGroupOverride;
+
+ public float Volume => Mathf.Clamp01(volume);
+
+ public bool Loop => loop;
+
+ public bool HasClip => clip != null;
+ }
+}
diff --git a/Assets/Scripts/Runtime/Audio/GameMusicTrack.cs.meta b/Assets/Scripts/Runtime/Audio/GameMusicTrack.cs.meta
new file mode 100644
index 0000000..bab02c7
--- /dev/null
+++ b/Assets/Scripts/Runtime/Audio/GameMusicTrack.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 4144cd65469a499f895a549f611049ab
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Runtime/Audio/IGameAudioService.cs b/Assets/Scripts/Runtime/Audio/IGameAudioService.cs
new file mode 100644
index 0000000..af0b877
--- /dev/null
+++ b/Assets/Scripts/Runtime/Audio/IGameAudioService.cs
@@ -0,0 +1,28 @@
+using UnityEngine;
+
+namespace DanroJump.Audio
+{
+ ///
+ /// Runtime API для проигрывания музыки и событийных звуков игры.
+ ///
+ public interface IGameAudioService
+ {
+ bool IsReady { get; }
+
+ bool IsMusicPlaying { get; }
+
+ GameMusicCue? CurrentMusicCue { get; }
+
+ void Play(GameAudioEvent eventId);
+
+ void Play(GameAudioEvent eventId, Vector3 worldPosition);
+
+ void StartMusic();
+
+ void PlayMusic(GameMusicCue cue);
+
+ void StopMusic();
+
+ void ApplyServiceVolumes();
+ }
+}
diff --git a/Assets/Scripts/Runtime/Audio/IGameAudioService.cs.meta b/Assets/Scripts/Runtime/Audio/IGameAudioService.cs.meta
new file mode 100644
index 0000000..7831c8e
--- /dev/null
+++ b/Assets/Scripts/Runtime/Audio/IGameAudioService.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 3e907280b1802b442ac21a7c1d7c9461
\ No newline at end of file
diff --git a/Assets/Scripts/Runtime/Bootstrap/BootstrapEntryPoint.cs b/Assets/Scripts/Runtime/Bootstrap/BootstrapEntryPoint.cs
index 639be29..bb93b4c 100644
--- a/Assets/Scripts/Runtime/Bootstrap/BootstrapEntryPoint.cs
+++ b/Assets/Scripts/Runtime/Bootstrap/BootstrapEntryPoint.cs
@@ -172,7 +172,8 @@ namespace DanroJump.Bootstrap
private void ApplyBuildAspectResolution()
{
Vector2Int resolution = CalculateTargetResolution();
- Screen.SetResolution(resolution.x, resolution.y, buildFullScreenMode);
+ FullScreenMode mode = Debug.isDebugBuild ? buildFullScreenMode : FullScreenMode.FullScreenWindow;
+ Screen.SetResolution(resolution.x, resolution.y, mode);
}
///
diff --git a/Assets/Scripts/Runtime/Gameplay/Collectibles/BounceBoostCollectible.cs b/Assets/Scripts/Runtime/Gameplay/Collectibles/BounceBoostCollectible.cs
index 3481c58..ca2f7a4 100644
--- a/Assets/Scripts/Runtime/Gameplay/Collectibles/BounceBoostCollectible.cs
+++ b/Assets/Scripts/Runtime/Gameplay/Collectibles/BounceBoostCollectible.cs
@@ -1,4 +1,5 @@
using UnityEngine;
+using DanroJump.Audio;
namespace DanroJump.Gameplay
{
@@ -11,14 +12,18 @@ namespace DanroJump.Gameplay
[SerializeField] [Min(0)] private int scoreValue = 5;
private GameplaySession session;
+ private IGameAudioService audioService;
///
/// Получает игровую сессию для начисления очков.
///
[Zenject.Inject]
- public void Construct(GameplaySession injectedSession)
+ public void Construct(
+ GameplaySession injectedSession,
+ [Zenject.InjectOptional] IGameAudioService injectedAudioService = null)
{
session = injectedSession;
+ audioService = injectedAudioService;
}
///
@@ -26,6 +31,7 @@ namespace DanroJump.Gameplay
///
protected override void OnCollected(JumpPlayerController player)
{
+ audioService?.Play(GameAudioEvent.BoostCollected, transform.position);
player.BounceWithEnemyPassThrough(bounceVelocity);
session?.AddScore(scoreValue);
}
diff --git a/Assets/Scripts/Runtime/Gameplay/Collectibles/CoinCollectible.cs b/Assets/Scripts/Runtime/Gameplay/Collectibles/CoinCollectible.cs
index 4585a15..dc1361f 100644
--- a/Assets/Scripts/Runtime/Gameplay/Collectibles/CoinCollectible.cs
+++ b/Assets/Scripts/Runtime/Gameplay/Collectibles/CoinCollectible.cs
@@ -1,4 +1,5 @@
using UnityEngine;
+using DanroJump.Audio;
namespace DanroJump.Gameplay
{
@@ -11,14 +12,18 @@ namespace DanroJump.Gameplay
[SerializeField] [Min(0)] private int scoreValue = 1;
private GameplaySession session;
+ private IGameAudioService audioService;
///
/// Получает игровую сессию для записи награды.
///
[Zenject.Inject]
- public void Construct(GameplaySession injectedSession)
+ public void Construct(
+ GameplaySession injectedSession,
+ [Zenject.InjectOptional] IGameAudioService injectedAudioService = null)
{
session = injectedSession;
+ audioService = injectedAudioService;
}
///
@@ -26,6 +31,7 @@ namespace DanroJump.Gameplay
///
protected override void OnCollected(JumpPlayerController player)
{
+ audioService?.Play(GameAudioEvent.CoinCollected, transform.position);
session?.AddCoins(coinValue);
session?.AddScore(scoreValue);
}
diff --git a/Assets/Scripts/Runtime/Gameplay/Enemies/EnemyBase.cs b/Assets/Scripts/Runtime/Gameplay/Enemies/EnemyBase.cs
index 9439ec4..a819481 100644
--- a/Assets/Scripts/Runtime/Gameplay/Enemies/EnemyBase.cs
+++ b/Assets/Scripts/Runtime/Gameplay/Enemies/EnemyBase.cs
@@ -1,5 +1,6 @@
using UnityEngine;
using UnityEngine.U2D.Animation;
+using DanroJump.Audio;
namespace DanroJump.Gameplay
{
@@ -15,6 +16,7 @@ namespace DanroJump.Gameplay
[SerializeField] [Range(0f, 1f)] private float stompMinimumHeightFactor = 0.55f;
private GameplaySession session;
+ private IGameAudioService audioService;
private Collider2D enemyCollider;
private SpriteSkin[] spriteSkins;
private Renderer[] visualRenderers;
@@ -45,9 +47,12 @@ namespace DanroJump.Gameplay
/// Получает игровую сессию для начисления очков за stomp.
///
[Zenject.Inject]
- public void Construct(GameplaySession injectedSession)
+ public void Construct(
+ GameplaySession injectedSession,
+ [Zenject.InjectOptional] IGameAudioService injectedAudioService = null)
{
session = injectedSession;
+ audioService = injectedAudioService;
}
///
@@ -95,6 +100,7 @@ namespace DanroJump.Gameplay
public virtual void ActivateEnemy()
{
IsActive = true;
+ audioService?.Play(GameAudioEvent.EnemySpawned, transform.position);
}
///
@@ -135,6 +141,7 @@ namespace DanroJump.Gameplay
return;
}
+ audioService?.Play(GameAudioEvent.EnemyAttack, transform.position);
player.Kill();
}
@@ -145,6 +152,7 @@ namespace DanroJump.Gameplay
{
session?.AddScore(stompScore);
player.Bounce(player.AutoJumpVelocity);
+ audioService?.Play(GameAudioEvent.EnemyDefeated, transform.position);
DeactivateEnemy();
gameObject.SetActive(false);
}
diff --git a/Assets/Scripts/Runtime/Gameplay/Equipment/JetpackEquipment.cs b/Assets/Scripts/Runtime/Gameplay/Equipment/JetpackEquipment.cs
index a89f98b..e170f35 100644
--- a/Assets/Scripts/Runtime/Gameplay/Equipment/JetpackEquipment.cs
+++ b/Assets/Scripts/Runtime/Gameplay/Equipment/JetpackEquipment.cs
@@ -1,5 +1,6 @@
using System.Threading;
using Cysharp.Threading.Tasks;
+using DanroJump.Audio;
using DanroJump.Runtime.Gameplay.Equipment;
using UnityEngine;
using UnityEngine.VFX;
@@ -28,11 +29,18 @@ namespace DanroJump.Gameplay
private readonly System.Collections.Generic.List colliders = new();
private readonly System.Collections.Generic.List spriteRenderers = new();
private Rigidbody2D pickupBody;
+ private IGameAudioService audioService;
private bool isCollected;
private bool isAttachedToPlayer;
private CancellationTokenSource lifetimeCancellation;
private CancellationTokenSource destroyWhenOutsideCameraCancellation;
+ [Zenject.Inject]
+ public void Construct([Zenject.InjectOptional] IGameAudioService injectedAudioService = null)
+ {
+ audioService = injectedAudioService;
+ }
+
///
/// Сбрасывает состояние подбора при повторном спавне оборудования.
///
@@ -76,6 +84,7 @@ namespace DanroJump.Gameplay
return false;
}
+ audioService?.Play(GameAudioEvent.JetpackCollected, transform.position);
var attachment = player.GetComponent();
if (attachment == null)
{
diff --git a/Assets/Scripts/Runtime/Gameplay/Equipment/JumpPad.cs b/Assets/Scripts/Runtime/Gameplay/Equipment/JumpPad.cs
index af9d03f..4851c34 100644
--- a/Assets/Scripts/Runtime/Gameplay/Equipment/JumpPad.cs
+++ b/Assets/Scripts/Runtime/Gameplay/Equipment/JumpPad.cs
@@ -1,6 +1,7 @@
using System;
using System.Threading;
using Cysharp.Threading.Tasks;
+using DanroJump.Audio;
using UnityEngine;
namespace DanroJump.Gameplay
@@ -23,6 +24,7 @@ namespace DanroJump.Gameplay
[SerializeField] [Min(0f)] private float recoverDuration = 0.14f;
private Collider2D jumpPadCollider;
+ private IGameAudioService audioService;
private CancellationTokenSource stretchCancellation;
private Vector3 visualBaseScale = Vector3.one;
private float lastActivationTime = -1f;
@@ -33,6 +35,12 @@ namespace DanroJump.Gameplay
///
public float JumpHeightMultiplier => jumpHeightMultiplier;
+ [Zenject.Inject]
+ public void Construct([Zenject.InjectOptional] IGameAudioService injectedAudioService = null)
+ {
+ audioService = injectedAudioService;
+ }
+
///
/// Подготавливает trigger-коллайдер и визуальную часть пружины.
///
@@ -102,6 +110,7 @@ namespace DanroJump.Gameplay
}
NotifyPlatformLandingHandlers(player);
+ audioService?.Play(GameAudioEvent.JumpPadActivated, transform.position);
player.BounceWithEnemyPassThrough(CalculateBoostVelocity(player));
lastActivationTime = Time.time;
PlayStretchAnimation();
diff --git a/Assets/Scripts/Runtime/Gameplay/Equipment/SpringEquipment.cs b/Assets/Scripts/Runtime/Gameplay/Equipment/SpringEquipment.cs
index 12a9739..cb11cc8 100644
--- a/Assets/Scripts/Runtime/Gameplay/Equipment/SpringEquipment.cs
+++ b/Assets/Scripts/Runtime/Gameplay/Equipment/SpringEquipment.cs
@@ -1,4 +1,5 @@
using UnityEngine;
+using DanroJump.Audio;
namespace DanroJump.Gameplay
{
@@ -13,6 +14,7 @@ namespace DanroJump.Gameplay
[SerializeField] private float activationCooldown = 0.08f;
private Collider2D springCollider;
+ private IGameAudioService audioService;
private float lastActivationTime = -1f;
///
@@ -20,6 +22,12 @@ namespace DanroJump.Gameplay
///
public float BounceVelocity => bounceVelocity;
+ [Zenject.Inject]
+ public void Construct([Zenject.InjectOptional] IGameAudioService injectedAudioService = null)
+ {
+ audioService = injectedAudioService;
+ }
+
///
/// Сбрасывает cooldown и кэширует trigger-коллайдер.
///
@@ -53,6 +61,7 @@ namespace DanroJump.Gameplay
}
NotifyPlatformLandingHandlers(player);
+ audioService?.Play(GameAudioEvent.SpringActivated, transform.position);
player.BounceWithEnemyPassThrough(bounceVelocity);
lastActivationTime = Time.time;
return true;
diff --git a/Assets/Scripts/Runtime/Gameplay/GameplaySession.cs b/Assets/Scripts/Runtime/Gameplay/GameplaySession.cs
index b2c33fc..2f34828 100644
--- a/Assets/Scripts/Runtime/Gameplay/GameplaySession.cs
+++ b/Assets/Scripts/Runtime/Gameplay/GameplaySession.cs
@@ -1,4 +1,5 @@
using System;
+using DanroJump.Audio;
using DanroJump.Hardware.Com;
using DanroJump.Prizes;
using DanroJump.SceneFlow;
@@ -23,10 +24,13 @@ namespace DanroJump.Gameplay
private readonly ISceneFlowService sceneFlow;
private readonly IPrizeFlowService prizeFlow;
private readonly IComCreditWallet creditWallet;
+ private readonly IGameAudioService audioService;
private readonly int startingLives;
private int baseScore;
private float savedRecordHeight;
+ public string SessionId { get; private set; } = CreateSessionId();
+
///
/// Итоговые очки текущего забега: игровые начисления плюс бонус за максимальную высоту.
///
@@ -100,13 +104,15 @@ namespace DanroJump.Gameplay
[Zenject.InjectOptional] IReadOnlyServiceSettings serviceSettings = null,
[Zenject.InjectOptional] ISceneFlowService sceneFlow = null,
[Zenject.InjectOptional] IPrizeFlowService prizeFlow = null,
- [Zenject.InjectOptional] IComCreditWallet creditWallet = null)
+ [Zenject.InjectOptional] IComCreditWallet creditWallet = null,
+ [Zenject.InjectOptional] IGameAudioService audioService = null)
{
this.player = player;
this.serviceSettings = serviceSettings;
this.sceneFlow = sceneFlow;
this.prizeFlow = prizeFlow;
this.creditWallet = creditWallet;
+ this.audioService = audioService;
startingLives = ResolveStartingLives();
RemainingLives = startingLives;
State = GameplaySessionState.Running;
@@ -153,6 +159,7 @@ namespace DanroJump.Gameplay
public void ResetSession()
{
SaveRecordIfNeeded();
+ SessionId = CreateSessionId();
baseScore = 0;
Coins = 0;
DeathCount = 0;
@@ -175,6 +182,7 @@ namespace DanroJump.Gameplay
return false;
}
+ audioService?.Play(GameAudioEvent.ContinueAccepted);
sceneFlow?.CancelGameOverReturn();
RemainingLives = ContinueGameLives;
State = GameplaySessionState.Respawning;
@@ -214,11 +222,14 @@ namespace DanroJump.Gameplay
///
private void HandlePlayerDied(JumpPlayerController _)
{
+ audioService?.Play(GameAudioEvent.PlayerDeath);
DeathCount++;
RemainingLives = Mathf.Max(0, RemainingLives - 1);
State = RemainingLives > 0 ? GameplaySessionState.Respawning : GameplaySessionState.GameOver;
if (State == GameplaySessionState.GameOver)
{
+ audioService?.Play(GameAudioEvent.GameOver);
+ audioService?.PlayMusic(GameMusicCue.GameOver);
player?.BlockPendingRespawn();
var prizeResult = prizeFlow?.StartPrizeFlow(this) ?? default;
if (!prizeResult.HasPrize)
@@ -243,6 +254,8 @@ namespace DanroJump.Gameplay
if (State != GameplaySessionState.GameOver)
{
State = GameplaySessionState.Running;
+ audioService?.Play(GameAudioEvent.PlayerRespawn);
+ audioService?.PlayMusic(GameMusicCue.Gameplay);
}
Changed?.Invoke();
@@ -332,6 +345,11 @@ namespace DanroJump.Gameplay
sceneFlow.ReturnToMainMenuAfterGameOver(delay);
}
+
+ private static string CreateSessionId()
+ {
+ return Guid.NewGuid().ToString("N");
+ }
}
///
diff --git a/Assets/Scripts/Runtime/Gameplay/JumpPlayerController.cs b/Assets/Scripts/Runtime/Gameplay/JumpPlayerController.cs
index 571732d..f5f3da1 100644
--- a/Assets/Scripts/Runtime/Gameplay/JumpPlayerController.cs
+++ b/Assets/Scripts/Runtime/Gameplay/JumpPlayerController.cs
@@ -1,6 +1,7 @@
using System.Collections.Generic;
using System.Threading;
using Cysharp.Threading.Tasks;
+using DanroJump.Audio;
using UnityEngine;
using Zenject;
#if ENABLE_INPUT_SYSTEM
@@ -51,6 +52,7 @@ namespace DanroJump.Gameplay
private Rigidbody2D body;
private Collider2D playerCollider;
private Camera gameplayCamera;
+ private IGameAudioService audioService;
private Vector3 startPosition;
private Vector3 visualRootInitialScale;
private Quaternion visualRootInitialRotation;
@@ -187,9 +189,10 @@ namespace DanroJump.Gameplay
/// Получает gameplay-камеру через SceneContext.
///
[Inject]
- public void Construct(Camera injectedGameplayCamera)
+ public void Construct(Camera injectedGameplayCamera, [InjectOptional] IGameAudioService injectedAudioService = null)
{
gameplayCamera = injectedGameplayCamera;
+ audioService = injectedAudioService;
}
///
@@ -394,6 +397,7 @@ namespace DanroJump.Gameplay
{
body.linearVelocity = new Vector2(body.linearVelocity.x, Mathf.Max(body.linearVelocity.y, velocity));
jumpAnimationPulseUntil = Time.time + jumpAnimationPulseDuration;
+ audioService?.Play(GameAudioEvent.PlayerJump, transform.position);
}
///
@@ -1354,6 +1358,8 @@ namespace DanroJump.Gameplay
respawnBlocked = false;
respawnAtTime = -1f;
body.linearVelocity = Vector2.zero;
+ ResetMoveSpeedMultiplier();
+ ResetHeightLift();
EndEnemyPassThrough();
PlayDeathAnimation();
Died?.Invoke(this);
diff --git a/Assets/Scripts/Runtime/Prizes/IPrizeSessionStateRepository.cs b/Assets/Scripts/Runtime/Prizes/IPrizeSessionStateRepository.cs
new file mode 100644
index 0000000..80e30c1
--- /dev/null
+++ b/Assets/Scripts/Runtime/Prizes/IPrizeSessionStateRepository.cs
@@ -0,0 +1,11 @@
+namespace DanroJump.Prizes
+{
+ ///
+ /// Читает и сохраняет snapshot призовых сессий для восстановления после перезапуска.
+ ///
+ public interface IPrizeSessionStateRepository
+ {
+ bool TryLoad(out PrizeSessionStateSnapshot snapshot);
+ bool Save(PrizeSessionStateSnapshot snapshot);
+ }
+}
diff --git a/Assets/Scripts/Runtime/Prizes/IPrizeSessionStateRepository.cs.meta b/Assets/Scripts/Runtime/Prizes/IPrizeSessionStateRepository.cs.meta
new file mode 100644
index 0000000..2883d8f
--- /dev/null
+++ b/Assets/Scripts/Runtime/Prizes/IPrizeSessionStateRepository.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: ff5409f6efa1e4d46a3ffcf7b0451e18
\ No newline at end of file
diff --git a/Assets/Scripts/Runtime/Prizes/IPrizeSessionStateService.cs b/Assets/Scripts/Runtime/Prizes/IPrizeSessionStateService.cs
new file mode 100644
index 0000000..087ee1c
--- /dev/null
+++ b/Assets/Scripts/Runtime/Prizes/IPrizeSessionStateService.cs
@@ -0,0 +1,38 @@
+using System;
+using System.Collections.Generic;
+
+namespace DanroJump.Prizes
+{
+ ///
+ /// Хранит текущую призовую выдачу, историю решений и блокирует повторную выдачу одной сессии.
+ ///
+ public interface IPrizeSessionStateService
+ {
+ event Action Changed;
+
+ PrizeSessionRecord ActiveSession { get; }
+ IReadOnlyList History { get; }
+ int StartedCount { get; }
+ int CompletedCount { get; }
+ int FailedCount { get; }
+ int DuplicateBlockedCount { get; }
+
+ int TotalGamesPlayed { get; }
+ int TotalScore { get; }
+ int TotalCoins { get; }
+ int QrShows { get; }
+ int PhysicalDispenses { get; }
+ int PhysicalDispenseFailures { get; }
+ int ComErrors { get; }
+
+ bool TryBeginSession(PrizeFlowResult result, out PrizeSessionRecord record);
+ bool MarkActiveSessionShown();
+ bool CompleteActiveSession(string note = null);
+ bool FailActiveSession(string reason);
+ void RecordGameplaySession(int score, int coins);
+ void RecordQrShow();
+ void RecordComError();
+ void RecordPhysicalDispense(bool success);
+ string BuildSummary();
+ }
+}
diff --git a/Assets/Scripts/Runtime/Prizes/IPrizeSessionStateService.cs.meta b/Assets/Scripts/Runtime/Prizes/IPrizeSessionStateService.cs.meta
new file mode 100644
index 0000000..aa366bf
--- /dev/null
+++ b/Assets/Scripts/Runtime/Prizes/IPrizeSessionStateService.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: b966947b3723e6941bb7148caed3824e
\ No newline at end of file
diff --git a/Assets/Scripts/Runtime/Prizes/JsonPrizeSessionStateRepository.cs b/Assets/Scripts/Runtime/Prizes/JsonPrizeSessionStateRepository.cs
new file mode 100644
index 0000000..3881839
--- /dev/null
+++ b/Assets/Scripts/Runtime/Prizes/JsonPrizeSessionStateRepository.cs
@@ -0,0 +1,268 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using UnityEngine;
+
+namespace DanroJump.Prizes
+{
+ ///
+ /// JSON-хранилище snapshot призовых сессий в Application.persistentDataPath.
+ ///
+ public sealed class JsonPrizeSessionStateRepository : IPrizeSessionStateRepository
+ {
+ private const string DefaultFileName = "prize-session-state.json";
+
+ public JsonPrizeSessionStateRepository(string fileName)
+ {
+ var safeFileName = GetSafeFileName(fileName);
+ Path = System.IO.Path.Combine(Application.persistentDataPath, safeFileName);
+ }
+
+ public string Path { get; }
+
+ private bool Exists => File.Exists(Path);
+
+ public bool TryLoad(out PrizeSessionStateSnapshot snapshot)
+ {
+ snapshot = null;
+ if (!Exists)
+ {
+ return false;
+ }
+
+ try
+ {
+ var json = File.ReadAllText(Path);
+ var data = JsonUtility.FromJson(json);
+ if (data == null)
+ {
+ return false;
+ }
+
+ var history = new List();
+ if (data.history != null)
+ {
+ foreach (var entry in data.history)
+ {
+ if (entry == null || string.IsNullOrWhiteSpace(entry.sessionId))
+ {
+ continue;
+ }
+
+ var result = new PrizeFlowResult(
+ entry.rewardKind,
+ entry.score,
+ entry.coins,
+ entry.height,
+ entry.resultSessionId);
+ history.Add(new PrizeSessionRecord(
+ entry.sessionId,
+ result,
+ entry.status,
+ FromUtcTicks(entry.startedAtUtcTicks),
+ FromUtcTicks(entry.updatedAtUtcTicks),
+ entry.note));
+ }
+ }
+
+ snapshot = new PrizeSessionStateSnapshot(
+ history,
+ data.issuedSessionIds ?? new List(),
+ data.activeSessionId,
+ data.startedCount,
+ data.completedCount,
+ data.failedCount,
+ data.duplicateBlockedCount,
+ data.fallbackSessionCounter,
+ data.totalGamesPlayed,
+ data.totalScore,
+ data.totalCoins,
+ data.qrShows,
+ data.physicalDispenses,
+ data.physicalDispenseFailures,
+ data.comErrors);
+ return true;
+ }
+ catch (Exception exception)
+ {
+ Debug.LogWarning($"[{nameof(JsonPrizeSessionStateRepository)}] Failed to load prize sessions from '{Path}': {exception.Message}");
+ return false;
+ }
+ }
+
+ public bool Save(PrizeSessionStateSnapshot snapshot)
+ {
+ if (snapshot == null)
+ {
+ Debug.LogWarning($"[{nameof(JsonPrizeSessionStateRepository)}] Snapshot is null. Save skipped.");
+ return false;
+ }
+
+ try
+ {
+ var directory = System.IO.Path.GetDirectoryName(Path);
+ if (!string.IsNullOrWhiteSpace(directory))
+ {
+ Directory.CreateDirectory(directory);
+ }
+
+ var data = new PrizeSessionStateSaveData
+ {
+ activeSessionId = snapshot.ActiveSessionId ?? string.Empty,
+ startedCount = snapshot.StartedCount,
+ completedCount = snapshot.CompletedCount,
+ failedCount = snapshot.FailedCount,
+ duplicateBlockedCount = snapshot.DuplicateBlockedCount,
+ fallbackSessionCounter = snapshot.FallbackSessionCounter,
+ totalGamesPlayed = snapshot.TotalGamesPlayed,
+ totalScore = snapshot.TotalScore,
+ totalCoins = snapshot.TotalCoins,
+ qrShows = snapshot.QrShows,
+ physicalDispenses = snapshot.PhysicalDispenses,
+ physicalDispenseFailures = snapshot.PhysicalDispenseFailures,
+ comErrors = snapshot.ComErrors
+ };
+
+ foreach (var sessionId in snapshot.IssuedSessionIds)
+ {
+ if (!string.IsNullOrWhiteSpace(sessionId))
+ {
+ data.issuedSessionIds.Add(sessionId);
+ }
+ }
+
+ foreach (var record in snapshot.History)
+ {
+ if (record == null || string.IsNullOrWhiteSpace(record.SessionId))
+ {
+ continue;
+ }
+
+ data.history.Add(new PrizeSessionStateSaveData.Entry
+ {
+ sessionId = record.SessionId,
+ rewardKind = record.Result.RewardKind,
+ score = record.Result.Score,
+ coins = record.Result.Coins,
+ height = record.Result.Height,
+ resultSessionId = record.Result.SessionId,
+ status = record.Status,
+ startedAtUtcTicks = record.StartedAtUtc.Ticks,
+ updatedAtUtcTicks = record.UpdatedAtUtc.Ticks,
+ note = record.Note ?? string.Empty
+ });
+ }
+
+ WriteAllTextSafely(Path, JsonUtility.ToJson(data, true));
+ return true;
+ }
+ catch (Exception exception)
+ {
+ Debug.LogWarning($"[{nameof(JsonPrizeSessionStateRepository)}] Failed to save prize sessions to '{Path}': {exception.Message}");
+ return false;
+ }
+ }
+
+ private static DateTime FromUtcTicks(long ticks)
+ {
+ if (ticks <= 0)
+ {
+ return DateTime.UtcNow;
+ }
+
+ try
+ {
+ return new DateTime(ticks, DateTimeKind.Utc);
+ }
+ catch (ArgumentOutOfRangeException)
+ {
+ return DateTime.UtcNow;
+ }
+ }
+
+ private static void WriteAllTextSafely(string path, string contents)
+ {
+ var tempPath = path + ".tmp";
+ var backupPath = path + ".bak";
+
+ try
+ {
+ File.WriteAllText(tempPath, contents);
+
+ if (File.Exists(path))
+ {
+ File.Replace(tempPath, path, backupPath, true);
+ return;
+ }
+
+ File.Move(tempPath, path);
+ }
+ finally
+ {
+ if (File.Exists(tempPath))
+ {
+ File.Delete(tempPath);
+ }
+ }
+ }
+
+ private static string GetSafeFileName(string fileName)
+ {
+ var requestedFileName = string.IsNullOrWhiteSpace(fileName) ? DefaultFileName : fileName.Trim();
+ var safeFileName = System.IO.Path.GetFileName(requestedFileName);
+
+ if (string.IsNullOrWhiteSpace(safeFileName) ||
+ safeFileName == "." ||
+ safeFileName == ".." ||
+ safeFileName.IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) >= 0)
+ {
+ Debug.LogWarning(
+ $"[{nameof(JsonPrizeSessionStateRepository)}] Unsafe file name '{fileName}' was replaced with '{DefaultFileName}'.");
+ return DefaultFileName;
+ }
+
+ if (!string.Equals(requestedFileName, safeFileName, StringComparison.Ordinal))
+ {
+ Debug.LogWarning(
+ $"[{nameof(JsonPrizeSessionStateRepository)}] Prize session path '{fileName}' was reduced to safe file name '{safeFileName}'.");
+ }
+
+ return safeFileName;
+ }
+
+ [Serializable]
+ private sealed class PrizeSessionStateSaveData
+ {
+ public string activeSessionId = string.Empty;
+ public int startedCount;
+ public int completedCount;
+ public int failedCount;
+ public int duplicateBlockedCount;
+ public int fallbackSessionCounter;
+ public int totalGamesPlayed;
+ public int totalScore;
+ public int totalCoins;
+ public int qrShows;
+ public int physicalDispenses;
+ public int physicalDispenseFailures;
+ public int comErrors;
+ public List issuedSessionIds = new();
+ public List history = new();
+
+ [Serializable]
+ public sealed class Entry
+ {
+ public string sessionId = string.Empty;
+ public PrizeRewardKind rewardKind;
+ public int score;
+ public int coins;
+ public float height;
+ public string resultSessionId = string.Empty;
+ public PrizeSessionStatus status;
+ public long startedAtUtcTicks;
+ public long updatedAtUtcTicks;
+ public string note = string.Empty;
+ }
+ }
+ }
+}
diff --git a/Assets/Scripts/Runtime/Prizes/JsonPrizeSessionStateRepository.cs.meta b/Assets/Scripts/Runtime/Prizes/JsonPrizeSessionStateRepository.cs.meta
new file mode 100644
index 0000000..89e3a21
--- /dev/null
+++ b/Assets/Scripts/Runtime/Prizes/JsonPrizeSessionStateRepository.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 74dc024d89162894a98020a107edb45a
\ No newline at end of file
diff --git a/Assets/Scripts/Runtime/Prizes/PrizeFlowResult.cs b/Assets/Scripts/Runtime/Prizes/PrizeFlowResult.cs
index eb89daf..7c0d9fb 100644
--- a/Assets/Scripts/Runtime/Prizes/PrizeFlowResult.cs
+++ b/Assets/Scripts/Runtime/Prizes/PrizeFlowResult.cs
@@ -5,18 +5,20 @@ namespace DanroJump.Prizes
///
public readonly struct PrizeFlowResult
{
- public PrizeFlowResult(PrizeRewardKind rewardKind, int score, int coins, float height)
+ public PrizeFlowResult(PrizeRewardKind rewardKind, int score, int coins, float height, string sessionId = null)
{
RewardKind = rewardKind;
Score = score;
Coins = coins;
Height = height;
+ SessionId = sessionId ?? string.Empty;
}
public PrizeRewardKind RewardKind { get; }
public int Score { get; }
public int Coins { get; }
public float Height { get; }
+ public string SessionId { get; }
public bool HasPrize => RewardKind != PrizeRewardKind.None;
}
}
diff --git a/Assets/Scripts/Runtime/Prizes/PrizeFlowService.cs b/Assets/Scripts/Runtime/Prizes/PrizeFlowService.cs
index a68db84..b06c800 100644
--- a/Assets/Scripts/Runtime/Prizes/PrizeFlowService.cs
+++ b/Assets/Scripts/Runtime/Prizes/PrizeFlowService.cs
@@ -11,10 +11,14 @@ namespace DanroJump.Prizes
public sealed class PrizeFlowService : IPrizeFlowService
{
private readonly IReadOnlyServiceSettings settings;
+ private readonly IPrizeSessionStateService sessionState;
- public PrizeFlowService([Zenject.InjectOptional] IReadOnlyServiceSettings settings = null)
+ public PrizeFlowService(
+ [Zenject.InjectOptional] IReadOnlyServiceSettings settings = null,
+ [Zenject.InjectOptional] IPrizeSessionStateService sessionState = null)
{
this.settings = settings;
+ this.sessionState = sessionState;
}
public event Action PrizeFlowStarted;
@@ -29,12 +33,25 @@ namespace DanroJump.Prizes
rewardKind,
score,
session?.Coins ?? 0,
- session?.MaxRunHeight ?? 0f);
+ session?.MaxRunHeight ?? 0f,
+ session?.SessionId);
}
public PrizeFlowResult StartPrizeFlow(GameplaySession session)
{
+ if (session != null && sessionState != null)
+ {
+ sessionState.RecordGameplaySession(session.Score, session.Coins);
+ }
+
LastResult = EvaluateCompletedSession(session);
+ if (LastResult.HasPrize && sessionState != null &&
+ !sessionState.TryBeginSession(LastResult, out _))
+ {
+ LastResult = default;
+ return LastResult;
+ }
+
PrizeFlowStarted?.Invoke(LastResult);
return LastResult;
}
diff --git a/Assets/Scripts/Runtime/Prizes/PrizeSessionRecord.cs b/Assets/Scripts/Runtime/Prizes/PrizeSessionRecord.cs
new file mode 100644
index 0000000..62509c9
--- /dev/null
+++ b/Assets/Scripts/Runtime/Prizes/PrizeSessionRecord.cs
@@ -0,0 +1,50 @@
+using System;
+
+namespace DanroJump.Prizes
+{
+ ///
+ /// Запись истории решения о призе и его выдачи.
+ ///
+ public sealed class PrizeSessionRecord
+ {
+ public PrizeSessionRecord(
+ string sessionId,
+ PrizeFlowResult result,
+ PrizeSessionStatus status,
+ DateTime startedAtUtc,
+ DateTime? updatedAtUtc,
+ string note = null)
+ {
+ SessionId = sessionId ?? string.Empty;
+ Result = result;
+ Status = status;
+ StartedAtUtc = startedAtUtc;
+ UpdatedAtUtc = updatedAtUtc ?? startedAtUtc;
+ Note = note ?? string.Empty;
+ }
+
+ public PrizeSessionRecord(
+ string sessionId,
+ PrizeFlowResult result,
+ PrizeSessionStatus status,
+ DateTime startedAtUtc,
+ string note = null)
+ : this(sessionId, result, status, startedAtUtc, null, note)
+ {
+ }
+
+ public string SessionId { get; }
+ public PrizeFlowResult Result { get; }
+ public PrizeSessionStatus Status { get; private set; }
+ public DateTime StartedAtUtc { get; }
+ public DateTime UpdatedAtUtc { get; private set; }
+ public string Note { get; private set; }
+
+ public void SetStatus(PrizeSessionStatus status, DateTime updatedAtUtc, string note = null)
+ {
+ Status = status;
+ UpdatedAtUtc = updatedAtUtc;
+ Note = note ?? string.Empty;
+ }
+ }
+}
diff --git a/Assets/Scripts/Runtime/Prizes/PrizeSessionRecord.cs.meta b/Assets/Scripts/Runtime/Prizes/PrizeSessionRecord.cs.meta
new file mode 100644
index 0000000..ee2eedb
--- /dev/null
+++ b/Assets/Scripts/Runtime/Prizes/PrizeSessionRecord.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 43a84f6fb5124b648818a77bb2629ec1
\ No newline at end of file
diff --git a/Assets/Scripts/Runtime/Prizes/PrizeSessionStateService.cs b/Assets/Scripts/Runtime/Prizes/PrizeSessionStateService.cs
new file mode 100644
index 0000000..7aa8167
--- /dev/null
+++ b/Assets/Scripts/Runtime/Prizes/PrizeSessionStateService.cs
@@ -0,0 +1,324 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using DanroJump.Hardware.Com;
+
+namespace DanroJump.Prizes
+{
+ ///
+ /// In-memory журнал призовых решений для сервисной статистики и защиты от повторной выдачи.
+ ///
+ public sealed class PrizeSessionStateService : IPrizeSessionStateService
+ {
+ private const string RecoveryFailureNote = "Сессия восстановлена после перезапуска до завершения выдачи.";
+
+ private readonly List history = new();
+ private readonly HashSet issuedSessionIds = new(StringComparer.Ordinal);
+ private readonly IPrizeSessionStateRepository repository;
+ private int fallbackSessionCounter;
+
+ public PrizeSessionStateService(
+ [Zenject.InjectOptional] IPrizeSessionStateRepository repository = null,
+ [Zenject.InjectOptional] IComSystem comSystem = null)
+ {
+ this.repository = repository;
+ RestoreState();
+ if (comSystem != null)
+ {
+ comSystem.DeviceDisconnected.AddListener(HandleDeviceDisconnected);
+ }
+ }
+
+ private void HandleDeviceDisconnected(string deviceId)
+ {
+ RecordComError();
+ }
+
+ public event Action Changed;
+
+ public PrizeSessionRecord ActiveSession { get; private set; }
+ public IReadOnlyList History => history;
+ public int StartedCount { get; private set; }
+ public int CompletedCount { get; private set; }
+ public int FailedCount { get; private set; }
+ public int DuplicateBlockedCount { get; private set; }
+
+ public int TotalGamesPlayed { get; private set; }
+ public int TotalScore { get; private set; }
+ public int TotalCoins { get; private set; }
+ public int QrShows { get; private set; }
+ public int PhysicalDispenses { get; private set; }
+ public int PhysicalDispenseFailures { get; private set; }
+ public int ComErrors { get; private set; }
+
+ public bool TryBeginSession(PrizeFlowResult result, out PrizeSessionRecord record)
+ {
+ record = null;
+ if (!result.HasPrize)
+ {
+ return false;
+ }
+
+ var sessionId = ResolveSessionId(result);
+ if (ActiveSession != null)
+ {
+ DuplicateBlockedCount++;
+ record = new PrizeSessionRecord(
+ sessionId,
+ result,
+ PrizeSessionStatus.DuplicateBlocked,
+ DateTime.UtcNow,
+ "Новая выдача заблокирована: предыдущая призовая сессия ещё активна.");
+ history.Add(record);
+ PersistState();
+ Changed?.Invoke();
+ return false;
+ }
+
+ if (issuedSessionIds.Contains(sessionId))
+ {
+ DuplicateBlockedCount++;
+ record = new PrizeSessionRecord(
+ sessionId,
+ result,
+ PrizeSessionStatus.DuplicateBlocked,
+ DateTime.UtcNow,
+ "Повторная выдача этой игровой сессии заблокирована.");
+ history.Add(record);
+ PersistState();
+ Changed?.Invoke();
+ return false;
+ }
+
+ issuedSessionIds.Add(sessionId);
+ record = new PrizeSessionRecord(sessionId, result, PrizeSessionStatus.Pending, DateTime.UtcNow);
+ ActiveSession = record;
+ history.Add(record);
+ StartedCount++;
+ PersistState();
+ Changed?.Invoke();
+ return true;
+ }
+
+ public bool MarkActiveSessionShown()
+ {
+ return SetActiveStatus(PrizeSessionStatus.Shown, null, countTerminal: false);
+ }
+
+ public bool CompleteActiveSession(string note = null)
+ {
+ return SetActiveStatus(PrizeSessionStatus.Completed, note, countTerminal: true);
+ }
+
+ public bool FailActiveSession(string reason)
+ {
+ return SetActiveStatus(PrizeSessionStatus.Failed, reason, countTerminal: true);
+ }
+
+ public string BuildSummary()
+ {
+ var activeText = ActiveSession == null
+ ? "Активной выдачи нет."
+ : $"Активная выдача: {FormatReward(ActiveSession.Result.RewardKind)}, статус {FormatStatus(ActiveSession.Status)}, очки {ActiveSession.Result.Score}.";
+ var last = history.LastOrDefault();
+ var lastText = last == null
+ ? "История пуста."
+ : $"Последняя запись: {FormatReward(last.Result.RewardKind)}, {FormatStatus(last.Status)}, очки {last.Result.Score}.";
+
+ return $"Игр: {TotalGamesPlayed}. Очков всего: {TotalScore}. Монет всего: {TotalCoins}. QR показов: {QrShows}. Физич. выдач: {PhysicalDispenses} (ошибок: {PhysicalDispenseFailures}). COM-ошибок: {ComErrors}. Призовые сессии: начато {StartedCount}, завершено {CompletedCount}, ошибок {FailedCount}, повторов заблокировано {DuplicateBlockedCount}. {activeText} {lastText}";
+ }
+
+ public void RecordGameplaySession(int score, int coins)
+ {
+ TotalGamesPlayed++;
+ TotalScore += score;
+ TotalCoins += coins;
+ PersistState();
+ Changed?.Invoke();
+ }
+
+ public void RecordQrShow()
+ {
+ QrShows++;
+ PersistState();
+ Changed?.Invoke();
+ }
+
+ public void RecordComError()
+ {
+ ComErrors++;
+ PersistState();
+ Changed?.Invoke();
+ }
+
+ public void RecordPhysicalDispense(bool success)
+ {
+ if (success)
+ {
+ PhysicalDispenses++;
+ }
+ else
+ {
+ PhysicalDispenseFailures++;
+ }
+ PersistState();
+ Changed?.Invoke();
+ }
+
+ private bool SetActiveStatus(PrizeSessionStatus status, string note, bool countTerminal)
+ {
+ if (ActiveSession == null)
+ {
+ return false;
+ }
+
+ ActiveSession.SetStatus(status, DateTime.UtcNow, note);
+ if (countTerminal)
+ {
+ if (status == PrizeSessionStatus.Completed)
+ {
+ CompletedCount++;
+ }
+ else if (status == PrizeSessionStatus.Failed)
+ {
+ FailedCount++;
+ }
+
+ ActiveSession = null;
+ }
+
+ PersistState();
+ Changed?.Invoke();
+ return true;
+ }
+
+ private void RestoreState()
+ {
+ if (repository == null || !repository.TryLoad(out var snapshot) || snapshot == null)
+ {
+ return;
+ }
+
+ history.Clear();
+ issuedSessionIds.Clear();
+
+ foreach (var record in snapshot.History)
+ {
+ if (record != null)
+ {
+ history.Add(record);
+ }
+ }
+
+ foreach (var sessionId in snapshot.IssuedSessionIds)
+ {
+ if (!string.IsNullOrWhiteSpace(sessionId))
+ {
+ issuedSessionIds.Add(sessionId);
+ }
+ }
+
+ StartedCount = snapshot.StartedCount;
+ CompletedCount = snapshot.CompletedCount;
+ FailedCount = snapshot.FailedCount;
+ DuplicateBlockedCount = snapshot.DuplicateBlockedCount;
+ fallbackSessionCounter = snapshot.FallbackSessionCounter;
+ TotalGamesPlayed = snapshot.TotalGamesPlayed;
+ TotalScore = snapshot.TotalScore;
+ TotalCoins = snapshot.TotalCoins;
+ QrShows = snapshot.QrShows;
+ PhysicalDispenses = snapshot.PhysicalDispenses;
+ PhysicalDispenseFailures = snapshot.PhysicalDispenseFailures;
+ ComErrors = snapshot.ComErrors;
+ ActiveSession = null;
+
+ var restoredActive = FindHistoryRecord(snapshot.ActiveSessionId);
+ if (restoredActive != null &&
+ (restoredActive.Status == PrizeSessionStatus.Pending || restoredActive.Status == PrizeSessionStatus.Shown))
+ {
+ restoredActive.SetStatus(
+ PrizeSessionStatus.Failed,
+ DateTime.UtcNow,
+ AppendRecoveryNote(restoredActive.Note));
+ FailedCount++;
+ PersistState();
+ }
+ }
+
+ private void PersistState()
+ {
+ repository?.Save(CreateSnapshot());
+ }
+
+ private PrizeSessionStateSnapshot CreateSnapshot()
+ {
+ return new PrizeSessionStateSnapshot(
+ history.ToArray(),
+ issuedSessionIds.ToArray(),
+ ActiveSession?.SessionId,
+ StartedCount,
+ CompletedCount,
+ FailedCount,
+ DuplicateBlockedCount,
+ fallbackSessionCounter,
+ TotalGamesPlayed,
+ TotalScore,
+ TotalCoins,
+ QrShows,
+ PhysicalDispenses,
+ PhysicalDispenseFailures,
+ ComErrors);
+ }
+
+ private PrizeSessionRecord FindHistoryRecord(string sessionId)
+ {
+ return string.IsNullOrWhiteSpace(sessionId)
+ ? null
+ : history.LastOrDefault(record => string.Equals(record.SessionId, sessionId, StringComparison.Ordinal));
+ }
+
+ private static string AppendRecoveryNote(string existingNote)
+ {
+ return string.IsNullOrWhiteSpace(existingNote)
+ ? RecoveryFailureNote
+ : existingNote + " " + RecoveryFailureNote;
+ }
+
+ private string ResolveSessionId(PrizeFlowResult result)
+ {
+ if (!string.IsNullOrWhiteSpace(result.SessionId))
+ {
+ return result.SessionId;
+ }
+
+ fallbackSessionCounter++;
+ return $"prize-session-{fallbackSessionCounter}";
+ }
+
+ private static string FormatReward(PrizeRewardKind rewardKind)
+ {
+ return rewardKind switch
+ {
+ PrizeRewardKind.QRCode => "QR",
+ PrizeRewardKind.Hopper => "хоппер",
+ PrizeRewardKind.PrizeStand => "витрина",
+ PrizeRewardKind.Big => "большой приз",
+ PrizeRewardKind.Small => "малый приз",
+ _ => "нет приза",
+ };
+ }
+
+ private static string FormatStatus(PrizeSessionStatus status)
+ {
+ return status switch
+ {
+ PrizeSessionStatus.Pending => "ожидает показа",
+ PrizeSessionStatus.Shown => "показана",
+ PrizeSessionStatus.Completed => "завершена",
+ PrizeSessionStatus.Failed => "ошибка",
+ PrizeSessionStatus.DuplicateBlocked => "повтор заблокирован",
+ _ => status.ToString(),
+ };
+ }
+ }
+}
diff --git a/Assets/Scripts/Runtime/Prizes/PrizeSessionStateService.cs.meta b/Assets/Scripts/Runtime/Prizes/PrizeSessionStateService.cs.meta
new file mode 100644
index 0000000..477a48b
--- /dev/null
+++ b/Assets/Scripts/Runtime/Prizes/PrizeSessionStateService.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 4327d0c1972bb964f92e569e0085aef1
\ No newline at end of file
diff --git a/Assets/Scripts/Runtime/Prizes/PrizeSessionStateSnapshot.cs b/Assets/Scripts/Runtime/Prizes/PrizeSessionStateSnapshot.cs
new file mode 100644
index 0000000..a7305d7
--- /dev/null
+++ b/Assets/Scripts/Runtime/Prizes/PrizeSessionStateSnapshot.cs
@@ -0,0 +1,62 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace DanroJump.Prizes
+{
+ ///
+ /// Снимок призового состояния для persistent recovery между перезапусками.
+ ///
+ public sealed class PrizeSessionStateSnapshot
+ {
+ public PrizeSessionStateSnapshot(
+ IReadOnlyList history,
+ IReadOnlyCollection issuedSessionIds,
+ string activeSessionId,
+ int startedCount,
+ int completedCount,
+ int failedCount,
+ int duplicateBlockedCount,
+ int fallbackSessionCounter,
+ int totalGamesPlayed = 0,
+ int totalScore = 0,
+ int totalCoins = 0,
+ int qrShows = 0,
+ int physicalDispenses = 0,
+ int physicalDispenseFailures = 0,
+ int comErrors = 0)
+ {
+ History = history?.Where(static record => record != null).ToArray() ?? Array.Empty();
+ IssuedSessionIds = issuedSessionIds?.Where(static sessionId => !string.IsNullOrWhiteSpace(sessionId)).ToArray() ?? Array.Empty();
+ ActiveSessionId = activeSessionId ?? string.Empty;
+ StartedCount = Math.Max(0, startedCount);
+ CompletedCount = Math.Max(0, completedCount);
+ FailedCount = Math.Max(0, failedCount);
+ DuplicateBlockedCount = Math.Max(0, duplicateBlockedCount);
+ FallbackSessionCounter = Math.Max(0, fallbackSessionCounter);
+ TotalGamesPlayed = Math.Max(0, totalGamesPlayed);
+ TotalScore = Math.Max(0, totalScore);
+ TotalCoins = Math.Max(0, totalCoins);
+ QrShows = Math.Max(0, qrShows);
+ PhysicalDispenses = Math.Max(0, physicalDispenses);
+ PhysicalDispenseFailures = Math.Max(0, physicalDispenseFailures);
+ ComErrors = Math.Max(0, comErrors);
+ }
+
+ public IReadOnlyList History { get; }
+ public IReadOnlyCollection IssuedSessionIds { get; }
+ public string ActiveSessionId { get; }
+ public int StartedCount { get; }
+ public int CompletedCount { get; }
+ public int FailedCount { get; }
+ public int DuplicateBlockedCount { get; }
+ public int FallbackSessionCounter { get; }
+ public int TotalGamesPlayed { get; }
+ public int TotalScore { get; }
+ public int TotalCoins { get; }
+ public int QrShows { get; }
+ public int PhysicalDispenses { get; }
+ public int PhysicalDispenseFailures { get; }
+ public int ComErrors { get; }
+ }
+}
diff --git a/Assets/Scripts/Runtime/Prizes/PrizeSessionStateSnapshot.cs.meta b/Assets/Scripts/Runtime/Prizes/PrizeSessionStateSnapshot.cs.meta
new file mode 100644
index 0000000..49c034b
--- /dev/null
+++ b/Assets/Scripts/Runtime/Prizes/PrizeSessionStateSnapshot.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 1d4f2407a8e65f04dbf3c4e14c2ec343
\ No newline at end of file
diff --git a/Assets/Scripts/Runtime/Prizes/PrizeSessionStatus.cs b/Assets/Scripts/Runtime/Prizes/PrizeSessionStatus.cs
new file mode 100644
index 0000000..32eaed1
--- /dev/null
+++ b/Assets/Scripts/Runtime/Prizes/PrizeSessionStatus.cs
@@ -0,0 +1,14 @@
+namespace DanroJump.Prizes
+{
+ ///
+ /// Состояние runtime-выдачи приза.
+ ///
+ public enum PrizeSessionStatus
+ {
+ Pending = 0,
+ Shown = 1,
+ Completed = 2,
+ Failed = 3,
+ DuplicateBlocked = 4,
+ }
+}
diff --git a/Assets/Scripts/Runtime/Prizes/PrizeSessionStatus.cs.meta b/Assets/Scripts/Runtime/Prizes/PrizeSessionStatus.cs.meta
new file mode 100644
index 0000000..850d210
--- /dev/null
+++ b/Assets/Scripts/Runtime/Prizes/PrizeSessionStatus.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: a03f2129d3badbc43ba9ea4186bc5f27
\ No newline at end of file
diff --git a/Assets/Scripts/Runtime/Prizes/Qr/PrizeQrService.cs b/Assets/Scripts/Runtime/Prizes/Qr/PrizeQrService.cs
index 122c835..3a832b9 100644
--- a/Assets/Scripts/Runtime/Prizes/Qr/PrizeQrService.cs
+++ b/Assets/Scripts/Runtime/Prizes/Qr/PrizeQrService.cs
@@ -40,13 +40,16 @@ namespace DanroJump.Prizes.Qr
return false;
}
- var texture = textureRenderer.Render(matrix);
+ var texture = textureRenderer.Render(
+ matrix,
+ darkColor: QrPrizeTierPalette.GetQrColor(payload.Tier));
ticket = new PrizeQrTicket(
payload.Url,
payload.OriginalPhone,
payload.PhoneDigits,
payload.Message,
- texture);
+ texture,
+ payload.Tier);
error = string.Empty;
return true;
}
diff --git a/Assets/Scripts/Runtime/Prizes/Qr/PrizeQrTicket.cs b/Assets/Scripts/Runtime/Prizes/Qr/PrizeQrTicket.cs
index f25f57c..11f127d 100644
--- a/Assets/Scripts/Runtime/Prizes/Qr/PrizeQrTicket.cs
+++ b/Assets/Scripts/Runtime/Prizes/Qr/PrizeQrTicket.cs
@@ -12,13 +12,15 @@ namespace DanroJump.Prizes.Qr
string originalPhone,
string phoneDigits,
string message,
- Texture2D texture)
+ Texture2D texture,
+ QrPrizeTier tier)
{
TelegramUrl = telegramUrl ?? string.Empty;
OriginalPhone = originalPhone ?? string.Empty;
PhoneDigits = phoneDigits ?? string.Empty;
Message = message ?? string.Empty;
Texture = texture;
+ Tier = tier;
}
public string TelegramUrl { get; }
@@ -26,5 +28,6 @@ namespace DanroJump.Prizes.Qr
public string PhoneDigits { get; }
public string Message { get; }
public Texture2D Texture { get; }
+ public QrPrizeTier Tier { get; }
}
}
diff --git a/Assets/Scripts/Runtime/Prizes/Qr/QrCodeTextureRenderer.cs b/Assets/Scripts/Runtime/Prizes/Qr/QrCodeTextureRenderer.cs
index d4cfb83..2c33933 100644
--- a/Assets/Scripts/Runtime/Prizes/Qr/QrCodeTextureRenderer.cs
+++ b/Assets/Scripts/Runtime/Prizes/Qr/QrCodeTextureRenderer.cs
@@ -10,11 +10,17 @@ namespace DanroJump.Prizes.Qr
private const int DefaultPixelsPerModule = 8;
private const int QuietZoneModules = 4;
- public Texture2D Render(QrCodeMatrix matrix, int pixelsPerModule = DefaultPixelsPerModule)
+ public Texture2D Render(
+ QrCodeMatrix matrix,
+ int pixelsPerModule = DefaultPixelsPerModule,
+ Color? darkColor = null,
+ Color? lightColor = null)
{
var modulePixels = Mathf.Max(1, pixelsPerModule);
var moduleCount = matrix != null ? matrix.Size + QuietZoneModules * 2 : QuietZoneModules * 2 + 1;
var textureSize = moduleCount * modulePixels;
+ var darkModuleColor = darkColor ?? Color.black;
+ var lightModuleColor = lightColor ?? Color.white;
var texture = new Texture2D(textureSize, textureSize, TextureFormat.RGBA32, false)
{
filterMode = FilterMode.Point,
@@ -28,7 +34,7 @@ namespace DanroJump.Prizes.Qr
var moduleX = x / modulePixels - QuietZoneModules;
var moduleY = y / modulePixels - QuietZoneModules;
var dark = matrix != null && matrix.GetModule(moduleX, moduleY);
- texture.SetPixel(x, textureSize - 1 - y, dark ? Color.black : Color.white);
+ texture.SetPixel(x, textureSize - 1 - y, dark ? darkModuleColor : lightModuleColor);
}
}
diff --git a/Assets/Scripts/Runtime/Prizes/Qr/QrPrizeTextSettings.cs b/Assets/Scripts/Runtime/Prizes/Qr/QrPrizeTextSettings.cs
new file mode 100644
index 0000000..683f6c8
--- /dev/null
+++ b/Assets/Scripts/Runtime/Prizes/Qr/QrPrizeTextSettings.cs
@@ -0,0 +1,144 @@
+using DanroJump.Settings;
+
+namespace DanroJump.Prizes.Qr
+{
+ ///
+ /// Читает короткие тексты QR-призов по рангам из сервисных настроек.
+ ///
+ public static class QrPrizeTextSettings
+ {
+ public const int MaxPrizeTextLength = 12;
+
+ private static readonly QrPrizeTier[] PreferredTiers =
+ {
+ QrPrizeTier.Gold,
+ QrPrizeTier.Silver,
+ QrPrizeTier.Bronze
+ };
+
+ public static string GetSettingKey(QrPrizeTier tier)
+ {
+ return tier switch
+ {
+ QrPrizeTier.Bronze => ServiceSettingsKeys.QrPrizeTextBronze,
+ QrPrizeTier.Silver => ServiceSettingsKeys.QrPrizeTextSilver,
+ QrPrizeTier.Gold => ServiceSettingsKeys.QrPrizeTextGold,
+ _ => string.Empty
+ };
+ }
+
+ public static string GetDisplayName(QrPrizeTier tier)
+ {
+ return tier switch
+ {
+ QrPrizeTier.Bronze => "Бронзовый",
+ QrPrizeTier.Silver => "Серебряный",
+ QrPrizeTier.Gold => "Золотой",
+ _ => "Не задан"
+ };
+ }
+
+ public static string GetPrizeText(IReadOnlyServiceSettings settings, QrPrizeTier tier)
+ {
+ var key = GetSettingKey(tier);
+ return string.IsNullOrWhiteSpace(key)
+ ? string.Empty
+ : NormalizePrizeText(settings?.GetString(key));
+ }
+
+ public static string GetPreferredPrizeText(IReadOnlyServiceSettings settings)
+ {
+ foreach (var tier in PreferredTiers)
+ {
+ var text = GetPrizeText(settings, tier);
+ if (!string.IsNullOrWhiteSpace(text))
+ {
+ return text;
+ }
+ }
+
+ return string.Empty;
+ }
+
+ public static string GetPrizeTextForResult(IReadOnlyServiceSettings settings, PrizeFlowResult result, out QrPrizeTier tier)
+ {
+ tier = ResolveTier(settings, result);
+ if (tier != QrPrizeTier.None)
+ {
+ var tierText = GetPrizeText(settings, tier);
+ if (!string.IsNullOrWhiteSpace(tierText))
+ {
+ return tierText;
+ }
+ }
+
+ return GetPreferredPrizeText(settings);
+ }
+
+ public static QrPrizeTier ResolveTier(IReadOnlyServiceSettings settings, PrizeFlowResult result)
+ {
+ if (result.RewardKind != PrizeRewardKind.QRCode)
+ {
+ return QrPrizeTier.None;
+ }
+
+ return ResolveTier(settings, result.Score);
+ }
+
+ public static QrPrizeTier ResolveTier(IReadOnlyServiceSettings settings, int score)
+ {
+ var sanitizedScore = score < 0 ? 0 : score;
+ var levels = PrizeLevelTable.FromJson(settings?.GetString(ServiceSettingsKeys.PrizeLevels));
+ var qrLevelIndex = -1;
+
+ for (var index = 0; index < levels.Levels.Count; index++)
+ {
+ var level = levels.Levels[index];
+ if (level.RewardKind != PrizeRewardKind.QRCode)
+ {
+ continue;
+ }
+
+ if (level.Score > sanitizedScore)
+ {
+ break;
+ }
+
+ qrLevelIndex++;
+ }
+
+ if (qrLevelIndex >= 0)
+ {
+ return qrLevelIndex switch
+ {
+ 0 => QrPrizeTier.Bronze,
+ 1 => QrPrizeTier.Silver,
+ _ => QrPrizeTier.Gold
+ };
+ }
+
+ foreach (var tier in PreferredTiers)
+ {
+ if (!string.IsNullOrWhiteSpace(GetPrizeText(settings, tier)))
+ {
+ return tier;
+ }
+ }
+
+ return QrPrizeTier.None;
+ }
+
+ public static string NormalizePrizeText(string text)
+ {
+ if (string.IsNullOrWhiteSpace(text))
+ {
+ return string.Empty;
+ }
+
+ var normalized = text.Trim();
+ return normalized.Length <= MaxPrizeTextLength
+ ? normalized
+ : normalized.Substring(0, MaxPrizeTextLength);
+ }
+ }
+}
diff --git a/Assets/Scripts/Runtime/Prizes/Qr/QrPrizeTextSettings.cs.meta b/Assets/Scripts/Runtime/Prizes/Qr/QrPrizeTextSettings.cs.meta
new file mode 100644
index 0000000..17cb59b
--- /dev/null
+++ b/Assets/Scripts/Runtime/Prizes/Qr/QrPrizeTextSettings.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: cd7cd5b3fed54a71b2a7f586a33f22ca
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Runtime/Prizes/Qr/QrPrizeTier.cs b/Assets/Scripts/Runtime/Prizes/Qr/QrPrizeTier.cs
new file mode 100644
index 0000000..bd5d31a
--- /dev/null
+++ b/Assets/Scripts/Runtime/Prizes/Qr/QrPrizeTier.cs
@@ -0,0 +1,13 @@
+namespace DanroJump.Prizes.Qr
+{
+ ///
+ /// Ранг QR-приза, повторяющий legacy-градацию: бронзовый, серебряный, золотой.
+ ///
+ public enum QrPrizeTier
+ {
+ None = 0,
+ Bronze = 1,
+ Silver = 2,
+ Gold = 3
+ }
+}
diff --git a/Assets/Scripts/Runtime/Prizes/Qr/QrPrizeTier.cs.meta b/Assets/Scripts/Runtime/Prizes/Qr/QrPrizeTier.cs.meta
new file mode 100644
index 0000000..5323847
--- /dev/null
+++ b/Assets/Scripts/Runtime/Prizes/Qr/QrPrizeTier.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 179f01781a9d46e4a0918603c979d2e1
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Runtime/Prizes/Qr/QrPrizeTierPalette.cs b/Assets/Scripts/Runtime/Prizes/Qr/QrPrizeTierPalette.cs
new file mode 100644
index 0000000..7ca26f1
--- /dev/null
+++ b/Assets/Scripts/Runtime/Prizes/Qr/QrPrizeTierPalette.cs
@@ -0,0 +1,25 @@
+using UnityEngine;
+
+namespace DanroJump.Prizes.Qr
+{
+ ///
+ /// Палитра цветов для рангов QR-приза.
+ ///
+ public static class QrPrizeTierPalette
+ {
+ private static readonly Color32 BronzeQrColor = new(134, 84, 38, 255);
+ private static readonly Color32 SilverQrColor = new(88, 102, 120, 255);
+ private static readonly Color32 GoldQrColor = new(160, 124, 24, 255);
+
+ public static Color GetQrColor(QrPrizeTier tier)
+ {
+ return tier switch
+ {
+ QrPrizeTier.Bronze => BronzeQrColor,
+ QrPrizeTier.Silver => SilverQrColor,
+ QrPrizeTier.Gold => GoldQrColor,
+ _ => Color.black
+ };
+ }
+ }
+}
diff --git a/Assets/Scripts/Runtime/Prizes/Qr/QrPrizeTierPalette.cs.meta b/Assets/Scripts/Runtime/Prizes/Qr/QrPrizeTierPalette.cs.meta
new file mode 100644
index 0000000..e1c4a9d
--- /dev/null
+++ b/Assets/Scripts/Runtime/Prizes/Qr/QrPrizeTierPalette.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 3219ccdcf7847c943ad01dc27e9ac181
\ No newline at end of file
diff --git a/Assets/Scripts/Runtime/Prizes/Qr/TelegramPrizeQrPayloadBuilder.cs b/Assets/Scripts/Runtime/Prizes/Qr/TelegramPrizeQrPayloadBuilder.cs
index 76f9f3e..f0f4894 100644
--- a/Assets/Scripts/Runtime/Prizes/Qr/TelegramPrizeQrPayloadBuilder.cs
+++ b/Assets/Scripts/Runtime/Prizes/Qr/TelegramPrizeQrPayloadBuilder.cs
@@ -6,12 +6,14 @@ using DanroJump.Settings;
namespace DanroJump.Prizes.Qr
{
///
- /// Собирает Telegram t.me URL для QR-приза из сервисного телефона и шаблона сообщения.
+ /// Собирает Telegram t.me URL для QR-приза из сервисного телефона и короткого текста приза.
///
public sealed class TelegramPrizeQrPayloadBuilder
{
public const string DefaultMessageTemplate =
- "QR prize Danro Jump. Score: {score}. Height: {height} m.";
+ "{0}";
+
+ private const string DefaultPrizeText = "QR-приз";
public bool TryBuild(
PrizeFlowResult result,
@@ -28,16 +30,16 @@ namespace DanroJump.Prizes.Qr
return false;
}
- var template = settings?.GetString(ServiceSettingsKeys.QrMessageTemplate);
- if (string.IsNullOrWhiteSpace(template))
+ var prizeText = QrPrizeTextSettings.GetPrizeTextForResult(settings, result, out var tier);
+ if (string.IsNullOrWhiteSpace(prizeText))
{
- template = DefaultMessageTemplate;
+ prizeText = DefaultPrizeText;
}
- var message = FormatMessageTemplate(template, result, phone);
+ var message = FormatMessageTemplate(DefaultMessageTemplate, result, phone, prizeText);
var encodedMessage = Uri.EscapeDataString(message);
var url = $"https://t.me/+{phoneDigits}?text={encodedMessage}";
- payload = new TelegramPrizeQrPayload(url, phone, phoneDigits, message);
+ payload = new TelegramPrizeQrPayload(url, phone, phoneDigits, message, tier);
error = string.Empty;
return true;
}
@@ -61,9 +63,21 @@ namespace DanroJump.Prizes.Qr
return builder.ToString();
}
- public static string FormatMessageTemplate(string template, PrizeFlowResult result, string phone)
+ public static string FormatMessageTemplate(
+ string template,
+ PrizeFlowResult result,
+ string phone,
+ string prizeText = null)
{
+ var normalizedPrizeText = QrPrizeTextSettings.NormalizePrizeText(prizeText);
+ if (!string.IsNullOrEmpty(normalizedPrizeText) && (string.IsNullOrWhiteSpace(template) || template == "{0}"))
+ {
+ return normalizedPrizeText;
+ }
+
return (template ?? string.Empty)
+ .Replace("{0}", normalizedPrizeText)
+ .Replace("{prize}", normalizedPrizeText)
.Replace("{score}", result.Score.ToString(CultureInfo.InvariantCulture))
.Replace("{coins}", result.Coins.ToString(CultureInfo.InvariantCulture))
.Replace("{height}", result.Height.ToString("0", CultureInfo.InvariantCulture))
@@ -74,17 +88,19 @@ namespace DanroJump.Prizes.Qr
public readonly struct TelegramPrizeQrPayload
{
- public TelegramPrizeQrPayload(string url, string originalPhone, string phoneDigits, string message)
+ public TelegramPrizeQrPayload(string url, string originalPhone, string phoneDigits, string message, QrPrizeTier tier)
{
Url = url ?? string.Empty;
OriginalPhone = originalPhone ?? string.Empty;
PhoneDigits = phoneDigits ?? string.Empty;
Message = message ?? string.Empty;
+ Tier = tier;
}
public string Url { get; }
public string OriginalPhone { get; }
public string PhoneDigits { get; }
public string Message { get; }
+ public QrPrizeTier Tier { get; }
}
}
diff --git a/Assets/Scripts/Runtime/Settings/Core/ServiceSettingsActionRouter.cs b/Assets/Scripts/Runtime/Settings/Core/ServiceSettingsActionRouter.cs
index 68813e0..aad3afa 100644
--- a/Assets/Scripts/Runtime/Settings/Core/ServiceSettingsActionRouter.cs
+++ b/Assets/Scripts/Runtime/Settings/Core/ServiceSettingsActionRouter.cs
@@ -1,7 +1,4 @@
-using System;
-using System.Linq;
using DanroJump.Prizes;
-using DanroJump.Prizes.Qr;
namespace DanroJump.Settings
{
@@ -12,7 +9,8 @@ namespace DanroJump.Settings
{
public static ServiceSettingsActionResult Execute(
ServiceSettingDefinition definition,
- IReadOnlyServiceSettings settings)
+ IReadOnlyServiceSettings settings,
+ IPrizeSessionStateService prizeSessionState = null)
{
if (definition == null)
{
@@ -23,7 +21,9 @@ namespace DanroJump.Settings
return definition.Key switch
{
- ServiceSettingsKeys.StatisticsButton => BuildStatistics(settings),
+ ServiceSettingsKeys.StatisticsButton => ServiceSettingsStatisticsSummaryBuilder.Build(
+ settings,
+ prizeSessionState),
ServiceSettingsKeys.PhoneNumberButton => OpenSettingEditor(
"Номер телефона",
"Открыто служебное окно номера телефона для QR-призов.",
@@ -46,12 +46,12 @@ namespace DanroJump.Settings
"Проверка hopper/выдачи"),
ServiceSettingsKeys.LevelsPrizesButton => ServiceSettingsActionResult.Success(
"Настройки призов",
- BuildPrizeSummary(settings),
+ ServiceSettingsPrizeSummaryBuilder.Build(settings),
ServiceSettingsKeys.PrizeLevels),
ServiceSettingsKeys.QrSettingsButton => ServiceSettingsActionResult.Success(
"Настройки QR",
- BuildQrSummary(settings),
- "QR-выдача"),
+ ServiceSettingsQrSummaryBuilder.Build(settings),
+ ServiceSettingsKeys.QrPrizeTextSettings),
ServiceSettingsKeys.StandSettingsButton => ServiceSettingsActionResult.Success(
"Настройки витрины",
"Открыт раздел призовой витрины. Следующий шаг - подключить статусы ячеек и команды тестовой выдачи.",
@@ -64,69 +64,10 @@ namespace DanroJump.Settings
};
}
- private static ServiceSettingsActionResult BuildStatistics(IReadOnlyServiceSettings settings)
- {
- var snapshot = settings?.Snapshot();
- var totalSettings = snapshot?.Count ?? 0;
- var visibleDefinitions = settings?.Database?.Entries.Count(entry => entry.ShownInServiceMenu) ?? 0;
- var startCost = settings != null ? Math.Max(0, settings.GetInt(ServiceSettingsKeys.StartGameCost)) : 0;
- var freePlay = settings != null && settings.GetBool(ServiceSettingsKeys.FreePlay);
- var priceText = freePlay ? "free play" : $"{startCost}";
-
- return ServiceSettingsActionResult.Success(
- "Статистика",
- $"Настроек загружено: {totalSettings}. Видимых пунктов: {visibleDefinitions}. Стоимость старта: {priceText}.",
- "Статистика");
- }
-
private static ServiceSettingsActionResult OpenSettingEditor(string title, string status, string settingKey)
{
return ServiceSettingsActionResult.Success(title, status, settingKey);
}
-
- private static string BuildPrizeSummary(IReadOnlyServiceSettings settings)
- {
- if (settings == null)
- {
- return "Раздел призов открыт. Сервис настроек пока недоступен.";
- }
-
- var smallPrize = settings.GetBool(ServiceSettingsKeys.GiveSmallPrize) ? "включён" : "выключен";
- var bigPrize = settings.GetBool(ServiceSettingsKeys.GiveBigPrize) ? "включён" : "выключен";
- var levels = PrizeLevelTable.FromJson(settings.GetString(ServiceSettingsKeys.PrizeLevels));
- if (levels.Count > 0)
- {
- return $"Раздел призов открыт. Настроено уровней: {levels.Count}.";
- }
-
- return $"Раздел призов открыт. Таблица уровней пустая. Legacy: малый приз {smallPrize}, большой приз {bigPrize}.";
- }
-
- private static string BuildQrSummary(IReadOnlyServiceSettings settings)
- {
- if (settings == null)
- {
- return "Раздел QR открыт. Сервис настроек пока недоступен.";
- }
-
- var showQrErrors = settings.GetBool(ServiceSettingsKeys.ShowPrizeError) ? "показывать" : "скрывать";
- var phone = settings.GetString(ServiceSettingsKeys.PrizePhoneNumber);
- var phoneDigits = TelegramPrizeQrPayloadBuilder.NormalizePhoneDigits(phone);
- var phoneText = string.IsNullOrWhiteSpace(phone) ? "не задан" : phone;
- var template = settings.GetString(ServiceSettingsKeys.QrMessageTemplate);
- var templateText = string.IsNullOrWhiteSpace(template) ? "стандартный" : "настроен";
- var messageTemplate = string.IsNullOrWhiteSpace(template)
- ? TelegramPrizeQrPayloadBuilder.DefaultMessageTemplate
- : template;
- var preview = TelegramPrizeQrPayloadBuilder.FormatMessageTemplate(
- messageTemplate,
- new PrizeFlowResult(PrizeRewardKind.QRCode, 100, 0, 50f),
- phone);
- var qrState = string.IsNullOrWhiteSpace(phoneDigits)
- ? "QR не готов: не задан телефон."
- : "QR готов к показу.";
- return $"Раздел QR открыт. {qrState} Ошибки QR: {showQrErrors}. Телефон: {phoneText}. Шаблон сообщения: {templateText}. Пример сообщения: {preview}";
- }
}
public readonly struct ServiceSettingsActionResult
diff --git a/Assets/Scripts/Runtime/Settings/Core/ServiceSettingsPrizeSummaryBuilder.cs b/Assets/Scripts/Runtime/Settings/Core/ServiceSettingsPrizeSummaryBuilder.cs
new file mode 100644
index 0000000..62cc37a
--- /dev/null
+++ b/Assets/Scripts/Runtime/Settings/Core/ServiceSettingsPrizeSummaryBuilder.cs
@@ -0,0 +1,28 @@
+using DanroJump.Prizes;
+
+namespace DanroJump.Settings
+{
+ ///
+ /// Формирует операторскую сводку призовых уровней и legacy-флагов.
+ ///
+ internal static class ServiceSettingsPrizeSummaryBuilder
+ {
+ public static string Build(IReadOnlyServiceSettings settings)
+ {
+ if (settings == null)
+ {
+ return "Раздел призов открыт. Сервис настроек пока недоступен.";
+ }
+
+ var smallPrize = settings.GetBool(ServiceSettingsKeys.GiveSmallPrize) ? "включён" : "выключен";
+ var bigPrize = settings.GetBool(ServiceSettingsKeys.GiveBigPrize) ? "включён" : "выключен";
+ var levels = PrizeLevelTable.FromJson(settings.GetString(ServiceSettingsKeys.PrizeLevels));
+ if (levels.Count > 0)
+ {
+ return $"Раздел призов открыт. Настроено уровней: {levels.Count}.";
+ }
+
+ return $"Раздел призов открыт. Таблица уровней пустая. Legacy: малый приз {smallPrize}, большой приз {bigPrize}.";
+ }
+ }
+}
diff --git a/Assets/Scripts/Runtime/Settings/Core/ServiceSettingsPrizeSummaryBuilder.cs.meta b/Assets/Scripts/Runtime/Settings/Core/ServiceSettingsPrizeSummaryBuilder.cs.meta
new file mode 100644
index 0000000..b4dfb93
--- /dev/null
+++ b/Assets/Scripts/Runtime/Settings/Core/ServiceSettingsPrizeSummaryBuilder.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: d1f90e7c9a6308043a154b1766d39762
\ No newline at end of file
diff --git a/Assets/Scripts/Runtime/Settings/Core/ServiceSettingsQrSummaryBuilder.cs b/Assets/Scripts/Runtime/Settings/Core/ServiceSettingsQrSummaryBuilder.cs
new file mode 100644
index 0000000..a01e99a
--- /dev/null
+++ b/Assets/Scripts/Runtime/Settings/Core/ServiceSettingsQrSummaryBuilder.cs
@@ -0,0 +1,37 @@
+using DanroJump.Prizes.Qr;
+
+namespace DanroJump.Settings
+{
+ ///
+ /// Формирует операторскую сводку QR-выдачи и коротких текстов призов.
+ ///
+ internal static class ServiceSettingsQrSummaryBuilder
+ {
+ public static string Build(IReadOnlyServiceSettings settings)
+ {
+ if (settings == null)
+ {
+ return "Раздел QR открыт. Сервис настроек пока недоступен.";
+ }
+
+ var showQrErrors = settings.GetBool(ServiceSettingsKeys.ShowPrizeError) ? "показывать" : "скрывать";
+ var phone = settings.GetString(ServiceSettingsKeys.PrizePhoneNumber);
+ var phoneDigits = TelegramPrizeQrPayloadBuilder.NormalizePhoneDigits(phone);
+ var phoneText = string.IsNullOrWhiteSpace(phone) ? "не задан" : phone;
+ var bronze = FormatTierText(settings, QrPrizeTier.Bronze);
+ var silver = FormatTierText(settings, QrPrizeTier.Silver);
+ var gold = FormatTierText(settings, QrPrizeTier.Gold);
+ var qrState = string.IsNullOrWhiteSpace(phoneDigits)
+ ? "QR не готов: не задан телефон."
+ : "QR готов к показу.";
+
+ return $"Раздел QR открыт. {qrState} Ошибки QR: {showQrErrors}. Телефон: {phoneText}. Тексты призов: Бронзовый: {bronze}; Серебряный: {silver}; Золотой: {gold}.";
+ }
+
+ private static string FormatTierText(IReadOnlyServiceSettings settings, QrPrizeTier tier)
+ {
+ var text = QrPrizeTextSettings.GetPrizeText(settings, tier);
+ return string.IsNullOrWhiteSpace(text) ? "<пусто>" : text;
+ }
+ }
+}
diff --git a/Assets/Scripts/Runtime/Settings/Core/ServiceSettingsQrSummaryBuilder.cs.meta b/Assets/Scripts/Runtime/Settings/Core/ServiceSettingsQrSummaryBuilder.cs.meta
new file mode 100644
index 0000000..dfa9662
--- /dev/null
+++ b/Assets/Scripts/Runtime/Settings/Core/ServiceSettingsQrSummaryBuilder.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: a284bbb4b62382f4ea5f6f2638ed16fc
\ No newline at end of file
diff --git a/Assets/Scripts/Runtime/Settings/Core/ServiceSettingsStatisticsSummaryBuilder.cs b/Assets/Scripts/Runtime/Settings/Core/ServiceSettingsStatisticsSummaryBuilder.cs
new file mode 100644
index 0000000..3f688d0
--- /dev/null
+++ b/Assets/Scripts/Runtime/Settings/Core/ServiceSettingsStatisticsSummaryBuilder.cs
@@ -0,0 +1,80 @@
+using System;
+using System.Linq;
+using DanroJump.Prizes;
+
+namespace DanroJump.Settings
+{
+ ///
+ /// Собирает текст сервисной статистики без знания о маршрутизации кнопок.
+ ///
+ internal static class ServiceSettingsStatisticsSummaryBuilder
+ {
+ public static ServiceSettingsActionResult Build(
+ IReadOnlyServiceSettings settings,
+ IPrizeSessionStateService prizeSessionState)
+ {
+ var snapshot = settings?.Snapshot();
+ var totalSettings = snapshot?.Count ?? 0;
+ var visibleDefinitions = settings?.Database?.Entries.Count(entry => entry.ShownInServiceMenu) ?? 0;
+ var startCost = settings != null ? Math.Max(0, settings.GetInt(ServiceSettingsKeys.StartGameCost)) : 0;
+ var freePlay = settings != null && settings.GetBool(ServiceSettingsKeys.FreePlay);
+ var priceText = freePlay ? "free play" : $"{startCost}";
+
+ var prizeSummary = string.Empty;
+ if (prizeSessionState != null)
+ {
+ var historyList = prizeSessionState.History;
+ var recentHistory = historyList != null && historyList.Count > 0
+ ? string.Join("\n", historyList.Skip(Math.Max(0, historyList.Count - 5)).Select(record =>
+ $"- [{record.StartedAtUtc:yyyy-MM-dd HH:mm:ss}] {FormatReward(record.Result.RewardKind)} ({record.Result.Score}очк) -> {FormatStatus(record.Status)}{(string.IsNullOrWhiteSpace(record.Note) ? "" : ": " + record.Note)}"))
+ : "История призов пуста.";
+
+ prizeSummary = $"\n\n--- Эксплуатационная статистика ---\n" +
+ $"Всего сыграно игр: {prizeSessionState.TotalGamesPlayed}\n" +
+ $"Набрано очков всего: {prizeSessionState.TotalScore}\n" +
+ $"Собрано монет всего: {prizeSessionState.TotalCoins}\n" +
+ $"Показов QR-кодов: {prizeSessionState.QrShows}\n" +
+ $"Успешных физ. выдач: {prizeSessionState.PhysicalDispenses}\n" +
+ $"Сбоев физ. выдач: {prizeSessionState.PhysicalDispenseFailures}\n" +
+ $"Сбоев связи по COM: {prizeSessionState.ComErrors}\n" +
+ $"Призовые сессии: начато {prizeSessionState.StartedCount}, завершено {prizeSessionState.CompletedCount}, сбоев {prizeSessionState.FailedCount}, повторов заблокировано {prizeSessionState.DuplicateBlockedCount}\n" +
+ $"\n--- Последние Призовые сессии (до 5) ---\n{recentHistory}";
+ }
+ else
+ {
+ prizeSummary = "\nПризовая история недоступна в текущем контексте.";
+ }
+
+ return ServiceSettingsActionResult.Success(
+ "Статистика",
+ $"Настроек загружено: {totalSettings}. Видимых пунктов: {visibleDefinitions}. Стоимость старта: {priceText}.{prizeSummary}",
+ "Статистика");
+ }
+
+ private static string FormatReward(PrizeRewardKind rewardKind)
+ {
+ return rewardKind switch
+ {
+ PrizeRewardKind.QRCode => "QR",
+ PrizeRewardKind.Hopper => "Хоппер",
+ PrizeRewardKind.PrizeStand => "Витрина",
+ PrizeRewardKind.Big => "Большой приз",
+ PrizeRewardKind.Small => "Малый приз",
+ _ => "Нет приза",
+ };
+ }
+
+ private static string FormatStatus(PrizeSessionStatus status)
+ {
+ return status switch
+ {
+ PrizeSessionStatus.Pending => "ожидает показа",
+ PrizeSessionStatus.Shown => "показана",
+ PrizeSessionStatus.Completed => "завершена",
+ PrizeSessionStatus.Failed => "ошибка",
+ PrizeSessionStatus.DuplicateBlocked => "повтор заблокирован",
+ _ => status.ToString(),
+ };
+ }
+ }
+}
diff --git a/Assets/Scripts/Runtime/Settings/Core/ServiceSettingsStatisticsSummaryBuilder.cs.meta b/Assets/Scripts/Runtime/Settings/Core/ServiceSettingsStatisticsSummaryBuilder.cs.meta
new file mode 100644
index 0000000..a276a7b
--- /dev/null
+++ b/Assets/Scripts/Runtime/Settings/Core/ServiceSettingsStatisticsSummaryBuilder.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: bc4b0676c7f7c5c4aa5d07c69bfacbb0
\ No newline at end of file
diff --git a/Assets/Scripts/Runtime/Settings/Installers/ServiceSettingsInstaller.cs b/Assets/Scripts/Runtime/Settings/Installers/ServiceSettingsInstaller.cs
index cd57e22..787e58a 100644
--- a/Assets/Scripts/Runtime/Settings/Installers/ServiceSettingsInstaller.cs
+++ b/Assets/Scripts/Runtime/Settings/Installers/ServiceSettingsInstaller.cs
@@ -1,5 +1,7 @@
using UnityEngine;
using Zenject;
+using DanroJump.Audio;
+using DanroJump.Prizes;
using DanroJump.SceneFlow;
namespace DanroJump.Settings
@@ -11,7 +13,9 @@ namespace DanroJump.Settings
{
[SerializeField] private string databaseAddress = ServiceSettingsAddressKeys.Database;
[SerializeField] private ServiceSettingsDatabase fallbackDatabase;
+ [SerializeField] private GameAudioSettings audioSettings;
[SerializeField] private string fileName = "service-settings.json";
+ [SerializeField] private string prizeSessionStateFileName = "prize-session-state.json";
[SerializeField] private bool loadImmediately = true;
[SerializeField] private bool bindActionsInScene = true;
@@ -32,6 +36,7 @@ namespace DanroJump.Settings
}
var repository = new JsonServiceSettingsRepository(fileName);
+ var prizeSessionRepository = new JsonPrizeSessionStateRepository(prizeSessionStateFileName);
var service = new ServiceSettingsService(database, repository);
if (loadImmediately)
@@ -45,7 +50,15 @@ namespace DanroJump.Settings
Container.Bind().FromInstance(repository).AsSingle();
Container.Bind().FromInstance(service).AsSingle();
Container.Bind().FromInstance(service).AsSingle();
+ Container.Bind().FromInstance(prizeSessionRepository).AsSingle();
+ Container.BindInterfacesAndSelfTo().AsSingle();
Container.BindInterfacesAndSelfTo().AsSingle();
+ if (audioSettings != null)
+ {
+ Container.BindInstance(audioSettings).AsSingle();
+ }
+
+ Container.BindInterfacesAndSelfTo().AsSingle().NonLazy();
Container.BindInterfacesTo().AsSingle().WithArguments(bindActionsInScene).NonLazy();
}
}
diff --git a/Assets/Scripts/Runtime/Settings/Keys/ServiceSettingsKeys.cs b/Assets/Scripts/Runtime/Settings/Keys/ServiceSettingsKeys.cs
index def1aa9..3eac570 100644
--- a/Assets/Scripts/Runtime/Settings/Keys/ServiceSettingsKeys.cs
+++ b/Assets/Scripts/Runtime/Settings/Keys/ServiceSettingsKeys.cs
@@ -24,6 +24,10 @@ namespace DanroJump.Settings
public const string ShowPrizeError = "prizes.showPrizeError";
public const string PrizePhoneNumber = "prizes.phoneNumber";
public const string QrMessageTemplate = "prizes.qrMessageTemplate";
+ public const string QrPrizeTextBronze = "prizes.qrTextBronze";
+ public const string QrPrizeTextSilver = "prizes.qrTextSilver";
+ public const string QrPrizeTextGold = "prizes.qrTextGold";
+ public const string QrPrizeTextSettings = "prizes.qrTextSettings";
public const string BigPrize = "prizes.bigPrize";
public const string PrizeLevels = "prizes.levels";
diff --git a/Assets/Scripts/Runtime/UI/ArcadeInput/ArcadeStringInputState.cs b/Assets/Scripts/Runtime/UI/ArcadeInput/ArcadeStringInputState.cs
index ffca863..d291e06 100644
--- a/Assets/Scripts/Runtime/UI/ArcadeInput/ArcadeStringInputState.cs
+++ b/Assets/Scripts/Runtime/UI/ArcadeInput/ArcadeStringInputState.cs
@@ -10,6 +10,7 @@ namespace DanroJump.UI.ArcadeInput
{
public const string PhoneSymbols = " +0123456789()-";
public const string ShortTextSymbols = " 0123456789+-.,:/()ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя";
+ public const string TemplateSymbols = ShortTextSymbols + "{}_!?@#%&=*\"'";
public ArcadeStringInputProfile(string allowedSymbols, int maxLength)
{
@@ -35,6 +36,11 @@ namespace DanroJump.UI.ArcadeInput
return new ArcadeStringInputProfile(ShortTextSymbols, maxLength);
}
+ public static ArcadeStringInputProfile Template(int maxLength = 96)
+ {
+ return new ArcadeStringInputProfile(TemplateSymbols, maxLength);
+ }
+
private static string NormalizeSymbols(string symbols)
{
if (string.IsNullOrEmpty(symbols))
diff --git a/Assets/Scripts/Runtime/UI/Gameplay/GameplayHudController.cs b/Assets/Scripts/Runtime/UI/Gameplay/GameplayHudController.cs
index d839ad9..efd5285 100644
--- a/Assets/Scripts/Runtime/UI/Gameplay/GameplayHudController.cs
+++ b/Assets/Scripts/Runtime/UI/Gameplay/GameplayHudController.cs
@@ -1,6 +1,9 @@
+using System;
using System.Threading;
using Cysharp.Threading.Tasks;
+using DanroJump.Audio;
using DanroJump.Gameplay;
+using DanroJump.Hardware.Com;
using DanroJump.Prizes;
using DanroJump.Prizes.Qr;
using DanroJump.SceneFlow;
@@ -31,9 +34,12 @@ namespace DanroJump.UI.Gameplay
private UIDocument document;
private GameplaySession session;
private IPrizeFlowService prizeFlow;
+ private IPrizeSessionStateService prizeSessionState;
private IPrizeQrService prizeQrService;
private ISceneFlowService sceneFlow;
private IReadOnlyServiceSettings serviceSettings;
+ private IGameAudioService audioService;
+ private IComSystem comSystem;
private PrizeResultOverlayWindow prizeResultOverlay;
private ContinueGameOverlayWindow continueGameOverlay;
private VisualElement prizeOverlayRoot;
@@ -47,6 +53,8 @@ namespace DanroJump.UI.Gameplay
private Label deathsLabel;
private Label stateLabel;
private CancellationTokenSource refreshCancellation;
+ private CancellationTokenSource qrTimeoutCancellation;
+ private CancellationTokenSource physicalDispenseCancellation;
private bool isSubscribedToSession;
private bool isSubscribedToPrizeFlow;
@@ -57,14 +65,20 @@ namespace DanroJump.UI.Gameplay
public void Construct(
GameplaySession injectedSession,
[InjectOptional] IPrizeFlowService injectedPrizeFlow = null,
+ [InjectOptional] IPrizeSessionStateService injectedPrizeSessionState = null,
[InjectOptional] IPrizeQrService injectedPrizeQrService = null,
[InjectOptional] ISceneFlowService injectedSceneFlow = null,
- [InjectOptional] IReadOnlyServiceSettings injectedServiceSettings = null)
+ [InjectOptional] IReadOnlyServiceSettings injectedServiceSettings = null,
+ [InjectOptional] IGameAudioService injectedAudioService = null,
+ [InjectOptional] IComSystem injectedComSystem = null)
{
prizeFlow = injectedPrizeFlow;
+ prizeSessionState = injectedPrizeSessionState;
prizeQrService = injectedPrizeQrService;
sceneFlow = injectedSceneFlow;
serviceSettings = injectedServiceSettings;
+ audioService = injectedAudioService;
+ comSystem = injectedComSystem;
SetSession(injectedSession);
SubscribeToPrizeFlow();
}
@@ -108,6 +122,20 @@ namespace DanroJump.UI.Gameplay
refreshCancellation = null;
}
+ if (qrTimeoutCancellation != null)
+ {
+ qrTimeoutCancellation.Cancel();
+ qrTimeoutCancellation.Dispose();
+ qrTimeoutCancellation = null;
+ }
+
+ if (physicalDispenseCancellation != null)
+ {
+ physicalDispenseCancellation.Cancel();
+ physicalDispenseCancellation.Dispose();
+ physicalDispenseCancellation = null;
+ }
+
UnsubscribeFromSession();
UnsubscribeFromPrizeFlow();
prizeResultOverlay?.Dispose();
@@ -354,6 +382,11 @@ namespace DanroJump.UI.Gameplay
return;
}
+ audioService?.Play(result.RewardKind == PrizeRewardKind.QRCode
+ ? GameAudioEvent.PrizeQrStarted
+ : GameAudioEvent.PrizePhysicalStarted);
+ audioService?.Play(GameAudioEvent.PrizeStarted);
+ audioService?.PlayMusic(GameMusicCue.Prize);
EnsureDocument();
BindPrizeOverlay();
@@ -362,6 +395,12 @@ namespace DanroJump.UI.Gameplay
if (result.RewardKind == PrizeRewardKind.QRCode && prizeQrService != null)
{
prizeQrService.TryCreateTicket(result, out qrTicket, out qrError);
+ if (qrTicket == null)
+ {
+ prizeSessionState?.FailActiveSession(string.IsNullOrWhiteSpace(qrError)
+ ? "Не удалось подготовить QR-приз."
+ : qrError);
+ }
}
prizeResultOverlay?.SetResult(
@@ -371,10 +410,50 @@ namespace DanroJump.UI.Gameplay
qrTicket,
qrError);
prizeResultOverlay?.Open();
+ if (qrTicket != null || result.RewardKind != PrizeRewardKind.QRCode)
+ {
+ prizeSessionState?.MarkActiveSessionShown();
+ }
+
+ if (result.RewardKind == PrizeRewardKind.QRCode)
+ {
+ prizeSessionState?.RecordQrShow();
+ if (qrTimeoutCancellation != null)
+ {
+ qrTimeoutCancellation.Cancel();
+ qrTimeoutCancellation.Dispose();
+ }
+ qrTimeoutCancellation = new CancellationTokenSource();
+ StartQrTimeoutAsync(qrTimeoutCancellation.Token).Forget(Debug.LogException);
+ }
+ else if (result.RewardKind == PrizeRewardKind.Hopper || result.RewardKind == PrizeRewardKind.PrizeStand)
+ {
+ if (physicalDispenseCancellation != null)
+ {
+ physicalDispenseCancellation.Cancel();
+ physicalDispenseCancellation.Dispose();
+ }
+ physicalDispenseCancellation = new CancellationTokenSource();
+ DispensePhysicalPrizeAsync(result, physicalDispenseCancellation.Token).Forget(Debug.LogException);
+ }
}
private void HandlePrizeReturnRequested()
{
+ audioService?.Play(GameAudioEvent.UiBack);
+ if (qrTimeoutCancellation != null)
+ {
+ qrTimeoutCancellation.Cancel();
+ qrTimeoutCancellation.Dispose();
+ qrTimeoutCancellation = null;
+ }
+ if (physicalDispenseCancellation != null)
+ {
+ physicalDispenseCancellation.Cancel();
+ physicalDispenseCancellation.Dispose();
+ physicalDispenseCancellation = null;
+ }
+ prizeSessionState?.CompleteActiveSession("Оператор закрыл экран выдачи приза.");
prizeResultOverlay?.Close();
sceneFlow?.OpenMainMenu();
}
@@ -419,17 +498,153 @@ namespace DanroJump.UI.Gameplay
{
if (session != null && session.TryContinueGame())
{
+ audioService?.Play(GameAudioEvent.UiSubmit);
continueGameOverlay?.Close();
return;
}
+ audioService?.Play(GameAudioEvent.UiError);
continueGameOverlay?.SetUnavailable();
}
private void HandleContinueMenuRequested()
{
+ audioService?.Play(GameAudioEvent.UiBack);
continueGameOverlay?.Close();
sceneFlow?.OpenMainMenu();
}
+
+ private async UniTask StartQrTimeoutAsync(CancellationToken token)
+ {
+ var timeoutSeconds = 30;
+ if (serviceSettings != null)
+ {
+ var val = serviceSettings.GetInt(ServiceSettingsKeys.InactivityTimeout);
+ if (val > 0)
+ {
+ timeoutSeconds = val;
+ }
+ }
+
+ try
+ {
+ await UniTask.Delay(TimeSpan.FromSeconds(timeoutSeconds), cancellationToken: token);
+ if (prizeSessionState != null)
+ {
+ prizeSessionState.CompleteActiveSession("QR-код закрыт автоматически по таймауту неактивности.");
+ }
+ prizeResultOverlay?.Close();
+ sceneFlow?.OpenMainMenu();
+ }
+ catch (OperationCanceledException)
+ {
+ }
+ }
+
+ private async UniTask DispensePhysicalPrizeAsync(PrizeFlowResult result, CancellationToken token)
+ {
+ if (prizeSessionState == null)
+ {
+ return;
+ }
+
+ try
+ {
+ if (comSystem == null || !comSystem.IsRunning)
+ {
+ var err = "Ошибка: COM-система не запущена.";
+ prizeResultOverlay?.SetSubtitle(err);
+ prizeSessionState.RecordPhysicalDispense(false);
+ prizeSessionState.FailActiveSession(err);
+ return;
+ }
+
+ prizeResultOverlay?.SetSubtitle("Выдача приза...");
+ var success = false;
+ var detailMessage = string.Empty;
+
+ if (result.RewardKind == PrizeRewardKind.Hopper)
+ {
+ success = await DispenseHopperAsync(comSystem, token);
+ detailMessage = success
+ ? "Капсула выдана успешно!"
+ : "Ошибка выдачи: датчик хоппера не сработал за 10 секунд.";
+ }
+ else if (result.RewardKind == PrizeRewardKind.PrizeStand)
+ {
+ var readyBoxes = await comSystem.GetReadyPrizeBoxesAsync(token);
+ if (readyBoxes == null || readyBoxes.Length == 0)
+ {
+ success = false;
+ detailMessage = "Ошибка выдачи: нет доступных ячеек на витрине.";
+ }
+ else
+ {
+ var boxNumber = readyBoxes[0];
+ prizeResultOverlay?.SetSubtitle($"Открытие ячейки {boxNumber}...");
+ var openResult = await comSystem.OpenPrizeBoxAsync(boxNumber, token);
+ success = openResult.IsSuccess;
+ detailMessage = success
+ ? $"Ячейка {boxNumber} открыта!"
+ : $"Ошибка открытия ячейки {boxNumber}: {openResult.Message}";
+ }
+ }
+
+ prizeResultOverlay?.SetSubtitle(detailMessage);
+ prizeSessionState.RecordPhysicalDispense(success);
+ if (success)
+ {
+ prizeSessionState.CompleteActiveSession(detailMessage);
+ }
+ else
+ {
+ prizeSessionState.FailActiveSession(detailMessage);
+ }
+ }
+ catch (OperationCanceledException)
+ {
+ prizeResultOverlay?.SetSubtitle("Выдача приза отменена.");
+ prizeSessionState.RecordPhysicalDispense(false);
+ prizeSessionState.FailActiveSession("Выдача приза отменена.");
+ }
+ catch (Exception ex)
+ {
+ var err = $"Внутренняя ошибка выдачи: {ex.Message}";
+ prizeResultOverlay?.SetSubtitle(err);
+ prizeSessionState.RecordPhysicalDispense(false);
+ prizeSessionState.FailActiveSession(err);
+ }
+ }
+
+ private async UniTask DispenseHopperAsync(IComSystem com, CancellationToken token)
+ {
+ if (com == null)
+ {
+ return false;
+ }
+
+ if (!com.SendToMain("301"))
+ {
+ return false;
+ }
+
+ var tcs = new UniTaskCompletionSource();
+ UnityEngine.Events.UnityAction onTriggered = () => tcs.TrySetResult();
+ com.HopperSensorTriggered.AddListener(onTriggered);
+
+ try
+ {
+ await UniTask.WhenAny(
+ tcs.Task,
+ UniTask.Delay(TimeSpan.FromSeconds(10), cancellationToken: token)
+ );
+ return tcs.Task.Status == UniTaskStatus.Succeeded;
+ }
+ finally
+ {
+ com.HopperSensorTriggered.RemoveListener(onTriggered);
+ com.SendToMain("300");
+ }
+ }
}
}
diff --git a/Assets/Scripts/Runtime/UI/Gameplay/PrizeResultOverlayWindow.cs b/Assets/Scripts/Runtime/UI/Gameplay/PrizeResultOverlayWindow.cs
index bf6bbc3..b32b307 100644
--- a/Assets/Scripts/Runtime/UI/Gameplay/PrizeResultOverlayWindow.cs
+++ b/Assets/Scripts/Runtime/UI/Gameplay/PrizeResultOverlayWindow.cs
@@ -64,6 +64,11 @@ namespace DanroJump.UI.Gameplay
RefreshQrBlock(result, qrTicket, qrError);
}
+ public void SetSubtitle(string text)
+ {
+ SetLabel(subtitleLabel, text);
+ }
+
public void Open()
{
if (root == null)
diff --git a/Assets/Scripts/Runtime/UI/MainMenu/MainMenuController.cs b/Assets/Scripts/Runtime/UI/MainMenu/MainMenuController.cs
index 4dd7fe2..17a48a6 100644
--- a/Assets/Scripts/Runtime/UI/MainMenu/MainMenuController.cs
+++ b/Assets/Scripts/Runtime/UI/MainMenu/MainMenuController.cs
@@ -1,9 +1,11 @@
using System.Collections.Generic;
using System.Threading;
using Cysharp.Threading.Tasks;
+using DanroJump.Audio;
using DanroJump.Bootstrap;
using DanroJump.Hardware.Com;
using DanroJump.Prizes;
+using DanroJump.Prizes.Qr;
using DanroJump.SceneFlow;
using DanroJump.Settings;
using DanroJump.UI.ArcadeInput;
@@ -57,6 +59,7 @@ namespace DanroJump.UI.MainMenu
private SettingsModalWindow settingsModal;
private ServiceInfoModalWindow serviceInfoModal;
private ServiceTextInputModalWindow serviceTextInputModal;
+ private QrCodeSettingsModalWindow qrCodeSettingsModal;
private PrizeLevelsModalWindow prizeLevelsModal;
private PrizeLevelAddModalWindow prizeLevelAddModal;
private readonly List
private void OpenSettings()
{
+ audioService?.Play(GameAudioEvent.UiSubmit);
ResolveServiceSettingsIfNeeded();
if (settingsModal != null && settingsModal.Root != null)
@@ -933,6 +1032,7 @@ namespace DanroJump.UI.MainMenu
///
private void QuitApplication()
{
+ audioService?.Play(GameAudioEvent.UiBack);
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#else
diff --git a/Assets/Scripts/Runtime/UI/MainMenu/QrCodeSettingsModalWindow.cs b/Assets/Scripts/Runtime/UI/MainMenu/QrCodeSettingsModalWindow.cs
new file mode 100644
index 0000000..1e70164
--- /dev/null
+++ b/Assets/Scripts/Runtime/UI/MainMenu/QrCodeSettingsModalWindow.cs
@@ -0,0 +1,197 @@
+using System;
+using DanroJump.Prizes.Qr;
+using DanroJump.Settings;
+using DanroJump.UI.Modals;
+using UnityEngine;
+using UnityEngine.UIElements;
+
+namespace DanroJump.UI.MainMenu
+{
+ ///
+ /// Сервисная модалка настройки короткого текста QR-приза по рангам.
+ ///
+ public sealed class QrCodeSettingsModalWindow : ModalWindowBase, IDisposable
+ {
+ private static readonly QrPrizeTier[] EditableTiers =
+ {
+ QrPrizeTier.Bronze,
+ QrPrizeTier.Silver,
+ QrPrizeTier.Gold
+ };
+
+ private readonly Label tierLabel;
+ private readonly Label prizeTextLabel;
+ private readonly Label statusLabel;
+ private readonly Button previousTierButton;
+ private readonly Button nextTierButton;
+ private readonly Button editTextButton;
+ private readonly Button closeButton;
+
+ private IServiceSettingsService settingsService;
+ private int tierIndex;
+
+ public QrCodeSettingsModalWindow(VisualElement root, IServiceSettingsService settingsService)
+ : base(root)
+ {
+ this.settingsService = settingsService;
+
+ tierLabel = root?.Q