Narration with text and audio synced

dev-ali-supabase
Ali Sharoz 2 days ago
parent ff4bfa3e98
commit ff81229273

@ -276,3 +276,72 @@ MonoBehaviour:
- key: poweredby
english: Powered by CyberCompanion
arabic: "\u0628\u062F\u0639\u0645 \u0645\u0646 CyberCompanion"
- key: subtitle_Intro
english: "Welcome to the CyberCompanion phishing awareness game.\nIn this game,
you'll go through five real-life email challenges.\nYour mission is to carefully
review each email and decide if it\u2019s safe or a phishing attempt.\nStay
focused, and pay attention to fake links, urgent messages, and suspicious senders.\nLet\u2019s
begin the game. "
arabic: "\u0645\u0631\u062D\u064B\u0628\u0627 \u0628\u0643 \u0641\u064A \u0644\u0639\u0628\u0629
\u0627\u0644\u062A\u0648\u0639\u064A\u0629 \u0628\u0627\u0644\u062A\u0635\u0651\u064A\u062F
\u0627\u0627\u0644\u062D\u062A\u064A\u0627\u0644\u064A .\r\n. \u0641\u064A
\u0647\u0630\u0647 \u0627\u0644\u0644\u0639\u0628\u0629\u060C \u0633\u062A\u0648\u0627\u062C\u0647
\u062E\u0645\u0633 \u0631\u0633\u0627\u0626\u0644 \u0628\u0631\u064A\u062F
\u0625\u0644\u0643\u062A\u0631\u0648\u0646\u064A \u0648\u0627\u0642\u0639\u064A\u0629\n\n\u0645\u0647\u0645\u062A\u0643
\u0647\u064A \u0623\u0646 \u062A\u0631\u0627\u062C\u0639 \u0643\u0644 \u0631\u0633\u0627\u0644\u0629
\u0628\u062F\u0642\u0629 \u0648\u062A\u0642\u0631\u0631 \u0645\u0627 \u0625\u0630\u0627
\u0643\u0627\u0646\u062A \u0622\u0645\u0646\u0629 \u0623\u0648 \u062A\u0635\u0651\u064A\u062F
\u0627\u062D\u062A\u064A\u0627\u0644\u064A.\r\n\u0631\u0643\u0632 \u062C\u064A\u064B\u062F\u0627\u060C
\u0648\u0627\u0646\u062A\u0628\u0647 \u0644\u0644\u0631\u0648\u0627\u0628\u0637
\u0627\u0644\u0645\u0632\u064A\u0641\u0629\u060C \u0648\u0627\u0644\u0631\u0633\u0627\u0626\u0644
\u0627\u0644\u0639\u0627\u062C\u0644\u0629\u060C \u0648\u0627\u0644\u0645\u0631\u0633\u0644\u064A\u0646
\u0627\u0644\u0645\u0634\u0628\u0648\u0647\u064A\u0646.\r\n. \u0644\u0646\u0628\u062F\u0623
\u0627\u0644\u0644\u0639\u0628\u0629"
- key: subtitle_NewEmail
english: "You\u2019ve received a new email. Click to open your inbox."
arabic: "\u0648\u0635\u0644\u0643 \u0628\u0631\u064A\u062F \u0625\u0644\u0643\u062A\u0631\u0648\u0646\u064A
\u062C\u062F\u064A\u062F. \u0627\u0636\u063A\u0637 \u0644\u0641\u062A\u062D
\u0635\u0646\u062F\u0648\u0642 \u0627\u0644\u0648\u0627\u0631\u062F"
- key: subtitle_ScanEmail
english: "Before making your decision, scan the email for any signs of phishing.\r"
arabic: "\u0642\u0628\u0644 \u0627\u062A\u062E\u0627\u0630 \u0642\u0631\u0627\u0631\u0643\u060C
\u0627\u0641\u062D\u0635 \u0627\u0644\u0628\u0631\u064A\u062F \u0627\u0625\u0644\u0644\u0643\u062A\u0631\u0648\u0646\u064A
\u0627\r\n. \u0628\u062D\u062B \u0639\u0646 \u0623\u064A \u0639\u0627\u0644\u0645\u0627\u062A
\u062A\u0635\u0651\u064A\u062F\u0642\u0628\u0644 \u0627\u062A\u062E\u0627\u0630
\u0642\u0631\u0627\u0631\u0643\u060C \u0627\u0641\u062D\u0635 \u0627\u0644\u0628\u0631\u064A\u062F
\u0627\u0625\u0644\u0644\u0643\u062A\u0631\u0648\u0646\u064A \u0627\r\n. \u0628\u062D\u062B
\u0639\u0646 \u0623\u064A \u0639\u0627\u0644\u0645\u0627\u062A \u062A\u0635\u0651\u064A\u062F"
- key: subtitle_CorrectIgnoreChoice
english: Well done. That was the correct move.
arabic: "\u0623\u062D\u0633\u0646\u062A. \u0647\u0630\u0627 \u0643\u0627\u0646
\u0627\u0644\u062E\u064A\u0627\u0631 \u0627\u0644\u0635\u062D\u064A\u062D\r"
- key: subtitle_CorrectReportChoice
english: "Well done. That was the correct move \u2014 this email showed clear
signs of phishing."
arabic: "\u0623\u062D\u0633\u0646\u062A. \u0647\u0630\u0627 \u0643\u0627\u0646
\u0627\u0644\u062E\u064A\u0627\u0631 \u0627\u0644\u0635\u062D\u064A\u062D \u2014
\u0647\u0630\u0647 \u0627\u0644\u0631\u0633\u0627\u0644\u0629 \u0627\u062D\u062A\u0648\u062A
\u0639\u0644\u0649 \u0645\u0624\u0634\u0631\u0627\u062A \u0648\u0627\u0636\u062D\u0629
\u0644\u0644\u062A\u0635\u0651\u064A\u062F"
- key: subtitle_WrongIgnoreChoice
english: Be careful. That was a phishing attempt. Always report messages that
seem suspicious.
arabic: "\u0627\u0646\u062A\u0628\u0647. \u0647\u0630\u0647 \u0643\u0627\u0646\u062A
\u0645\u062D\u0627\u0648\u0644\u0629 \u062A\u0635\u0651\u064A\u062F \u0627\u062D\u062A\u064A\u0627\u0644\u064A.
\u0623\u0628\u0644\u063A \u062F\u0627\u0626 \u064B\u0645\u0627 \u0639\u0646
\u0627\u0644\u0631\u0633\u0627\u0626\u0644 \u0627\u0644\u062A\u064A \u062A\u0628\u062F\u0648
\u0645\u0634\u0628\u0648\u0647\u0629"
- key: subtitle_Feedback
english: "Let\u2019s now review your decisions and see how you handled each email
in the game"
arabic: "\u062F\u0639\u0646\u0627 \u0627\u0622\u0644\u0646 \u0646\u0631\u0627\u062C\u0639
\u0642\u0631\u0627\u0631\u0627\u062A\u0643 \u0648\u0646\u0631\u0649 \u0643\u064A\u0641
\u062A\u0639\u0627\u0645\u0644\u062A \u0645\u0639 \u0643\u0644 \u0631\u0633\u0627\u0644\u0629
\u062E\u0627\u0644\u0644 \u0627\u0644\u0644\u0639\u0628\u0629"
- key: subtitle_GameEnd
english: "You\u2019ve completed the game. You can restart and try to improve
your phishing awareness."
arabic: "\u0644\u0642\u062F \u0623\u0646\u0647\u064A\u062A \u0627\u0644\u0644\u0639\u0628\u0629.
\u064A\u0645\u0643\u0646\u0643 \u0627\u0644\u0628\u062F\u0621 \u0645\u0646
\u062C\u062F\u064A\u062F \u0644\u062A\u062D\u0633\u064A\u0646 \u0648\u0639\u064A\u0643
\u0628\u0627\u0644\u062A\u0635\u0651\u064A\u062F \u0627\u0627\u0644\u062D\u062A\u064A\u0627\u0644\u064A"

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 8afa079d5e303aa428add1cac3a985ad
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 03d45431f98b8fa4f9c6a2f0b1db06b2
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,23 @@
fileFormatVersion: 2
guid: fc224b7696bd2ee4d8f217fec0580a99
AudioImporter:
externalObjects: {}
serializedVersion: 7
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:

@ -0,0 +1,23 @@
fileFormatVersion: 2
guid: abe6bb7fd06f23246ac2445128a92f98
AudioImporter:
externalObjects: {}
serializedVersion: 7
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:

@ -0,0 +1,23 @@
fileFormatVersion: 2
guid: 75b92203316a9de4da1c6f2717433497
AudioImporter:
externalObjects: {}
serializedVersion: 7
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:

@ -0,0 +1,23 @@
fileFormatVersion: 2
guid: e74e88a881a91a64b87a3f697a4050fe
AudioImporter:
externalObjects: {}
serializedVersion: 7
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:

@ -0,0 +1,23 @@
fileFormatVersion: 2
guid: a5dc205d2d6c98f40951158b41fbc435
AudioImporter:
externalObjects: {}
serializedVersion: 7
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:

@ -0,0 +1,23 @@
fileFormatVersion: 2
guid: 1dfe48c3208e127468766fd94c645318
AudioImporter:
externalObjects: {}
serializedVersion: 7
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:

@ -0,0 +1,23 @@
fileFormatVersion: 2
guid: 9dda53581b05c0345865985ff5627742
AudioImporter:
externalObjects: {}
serializedVersion: 7
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:

@ -0,0 +1,23 @@
fileFormatVersion: 2
guid: 474f7b8196aa9814fa5a860fc36a5bcc
AudioImporter:
externalObjects: {}
serializedVersion: 7
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:

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 0c212be0488ac254cb88b0bcf1708502
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,23 @@
fileFormatVersion: 2
guid: 2cdb281e2b78b2a47afa4114cec4b20a
AudioImporter:
externalObjects: {}
serializedVersion: 7
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:

@ -0,0 +1,23 @@
fileFormatVersion: 2
guid: 77a79bea87e1eb449a67576ae1ff3a7e
AudioImporter:
externalObjects: {}
serializedVersion: 7
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:

@ -0,0 +1,23 @@
fileFormatVersion: 2
guid: b22307681eb671741be44e9fa973e97c
AudioImporter:
externalObjects: {}
serializedVersion: 7
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:

@ -0,0 +1,23 @@
fileFormatVersion: 2
guid: 50a7b65f0350d304ca4bfd578c6616ca
AudioImporter:
externalObjects: {}
serializedVersion: 7
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:

@ -0,0 +1,23 @@
fileFormatVersion: 2
guid: 4d1af21ca8eca46478ac1915ed07b334
AudioImporter:
externalObjects: {}
serializedVersion: 7
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:

@ -0,0 +1,23 @@
fileFormatVersion: 2
guid: dadffcc24576b8048b2e84fc24ee65fa
AudioImporter:
externalObjects: {}
serializedVersion: 7
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:

@ -0,0 +1,23 @@
fileFormatVersion: 2
guid: b0c38f1df5dabe7488e7d86ba95fbafc
AudioImporter:
externalObjects: {}
serializedVersion: 7
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:

@ -0,0 +1,23 @@
fileFormatVersion: 2
guid: 3b51d1fb67ccb94409abd6ec818f746c
AudioImporter:
externalObjects: {}
serializedVersion: 7
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:

@ -35330,7 +35330,7 @@ MonoBehaviour:
m_Calls:
- m_Target: {fileID: 1809986913}
m_TargetAssemblyTypeName: CharacterMovement, Assembly-CSharp
m_MethodName: AnimationStarter
m_MethodName: StartIntroduction
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}
@ -35351,7 +35351,7 @@ MonoBehaviour:
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 1
m_CallState: 2
m_CallState: 0
- m_Target: {fileID: 278513128}
m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine
m_MethodName: SetActive
@ -94342,6 +94342,61 @@ Transform:
m_CorrespondingSourceObject: {fileID: 4503812955185784, guid: 610fb923aa6001549b857ef2559384cd, type: 3}
m_PrefabInstance: {fileID: 897226859}
m_PrefabAsset: {fileID: 0}
--- !u!1 &1302817620
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1302817621}
- component: {fileID: 1302817622}
m_Layer: 0
m_Name: NarrationPlayer
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1302817621
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1302817620}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -1.2903728, y: 1.8165138, z: 3.0619671}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1302817622
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1302817620}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 43059c037128db14f94c2bbcb006a175, type: 3}
m_Name:
m_EditorClassIdentifier:
narrationDatabase:
- {fileID: 11400000, guid: 2579222cb10eb0841abf1a979aa5ca2b, type: 2}
- {fileID: 11400000, guid: 8672b916c33d499459775cbd43607ec3, type: 2}
- {fileID: 11400000, guid: b4dea7ac3e2f7cd438beb7490daeb427, type: 2}
- {fileID: 11400000, guid: c53d8d7b98e13f140bbc6e5491bfe267, type: 2}
- {fileID: 11400000, guid: a2b28ea1f5e5b8d4680dacac1950e587, type: 2}
- {fileID: 11400000, guid: 82b7736de5a8554469cfc9634fb5902d, type: 2}
- {fileID: 11400000, guid: fabe0620c57c63e449acddcbbc564ec8, type: 2}
- {fileID: 11400000, guid: a7edb7ce84901274e8d3da4f10158543, type: 2}
subtitleText: {fileID: 1874077070}
charDelay: 0.075
--- !u!1001 &1303496878
PrefabInstance:
m_ObjectHideFlags: 0
@ -120670,7 +120725,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
m_IsActive: 1
--- !u!224 &1663999321
RectTransform:
m_ObjectHideFlags: 0
@ -126230,7 +126285,7 @@ AudioSource:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1752641677}
m_Enabled: 1
m_Enabled: 0
serializedVersion: 4
OutputAudioMixerGroup: {fileID: 0}
m_audioClip: {fileID: 8300000, guid: fd67557d9d69fe54296b31207b805511, type: 3}
@ -133889,7 +133944,7 @@ RectTransform:
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: -40, y: -4}
m_SizeDelta: {x: -40, y: -3.9999995}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1874077070
MonoBehaviour:
@ -133911,10 +133966,10 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: New Text
m_text: Phishing Awareness Simulation!
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 1b7bc6f8d1e1a594ea77f76cabc9a9be, type: 2}
m_sharedMaterial: {fileID: 4094059608530178792, guid: 1b7bc6f8d1e1a594ea77f76cabc9a9be, type: 2}
m_fontAsset: {fileID: 11400000, guid: 12edf91a1789477408db5a46077c3e5b, type: 2}
m_sharedMaterial: {fileID: 3375452501589232566, guid: 12edf91a1789477408db5a46077c3e5b, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
@ -133938,13 +133993,13 @@ MonoBehaviour:
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 42.65
m_fontSize: 36
m_fontSizeBase: 36
m_fontWeight: 400
m_enableAutoSizing: 1
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_fontStyle: 1
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
@ -133956,7 +134011,7 @@ MonoBehaviour:
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_overflowMode: 5
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
@ -161937,3 +161992,4 @@ SceneRoots:
- {fileID: 292487263}
- {fileID: 459458787}
- {fileID: 1752641679}
- {fileID: 1302817621}

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 7aa6b00989b9bde47bf1a81b09e14e28
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,18 @@
%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: 3109a7b091e2da44b950dc4b24d3f495, type: 3}
m_Name: CorrectIgnoreChoice
m_EditorClassIdentifier:
narrationID: 4
englishClip: {fileID: 8300000, guid: 2cdb281e2b78b2a47afa4114cec4b20a, type: 3}
arabicClip: {fileID: 8300000, guid: fc224b7696bd2ee4d8f217fec0580a99, type: 3}
localizationKey: subtitle_CorrectIgnoreChoice

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: a2b28ea1f5e5b8d4680dacac1950e587
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,18 @@
%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: 3109a7b091e2da44b950dc4b24d3f495, type: 3}
m_Name: CorrectReportChoice
m_EditorClassIdentifier:
narrationID: 3
englishClip: {fileID: 8300000, guid: 77a79bea87e1eb449a67576ae1ff3a7e, type: 3}
arabicClip: {fileID: 8300000, guid: abe6bb7fd06f23246ac2445128a92f98, type: 3}
localizationKey: subtitle_CorrectReportChoice

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c53d8d7b98e13f140bbc6e5491bfe267
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,18 @@
%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: 3109a7b091e2da44b950dc4b24d3f495, type: 3}
m_Name: Feedback
m_EditorClassIdentifier:
narrationID: 6
englishClip: {fileID: 8300000, guid: b22307681eb671741be44e9fa973e97c, type: 3}
arabicClip: {fileID: 8300000, guid: 75b92203316a9de4da1c6f2717433497, type: 3}
localizationKey: subtitle_Feedback

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: fabe0620c57c63e449acddcbbc564ec8
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,18 @@
%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: 3109a7b091e2da44b950dc4b24d3f495, type: 3}
m_Name: GameEnd
m_EditorClassIdentifier:
narrationID: 7
englishClip: {fileID: 8300000, guid: 50a7b65f0350d304ca4bfd578c6616ca, type: 3}
arabicClip: {fileID: 8300000, guid: e74e88a881a91a64b87a3f697a4050fe, type: 3}
localizationKey: subtitle_GameEnd

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: a7edb7ce84901274e8d3da4f10158543
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,18 @@
%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: 3109a7b091e2da44b950dc4b24d3f495, type: 3}
m_Name: Intro
m_EditorClassIdentifier:
narrationID: 0
englishClip: {fileID: 8300000, guid: 4d1af21ca8eca46478ac1915ed07b334, type: 3}
arabicClip: {fileID: 8300000, guid: a5dc205d2d6c98f40951158b41fbc435, type: 3}
localizationKey: subtitle_Intro

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 2579222cb10eb0841abf1a979aa5ca2b
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,18 @@
%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: 3109a7b091e2da44b950dc4b24d3f495, type: 3}
m_Name: NewEmail
m_EditorClassIdentifier:
narrationID: 1
englishClip: {fileID: 8300000, guid: dadffcc24576b8048b2e84fc24ee65fa, type: 3}
arabicClip: {fileID: 8300000, guid: 1dfe48c3208e127468766fd94c645318, type: 3}
localizationKey: subtitle_NewEmail

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 8672b916c33d499459775cbd43607ec3
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,18 @@
%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: 3109a7b091e2da44b950dc4b24d3f495, type: 3}
m_Name: ScanEmail
m_EditorClassIdentifier:
narrationID: 2
englishClip: {fileID: 8300000, guid: b0c38f1df5dabe7488e7d86ba95fbafc, type: 3}
arabicClip: {fileID: 8300000, guid: 9dda53581b05c0345865985ff5627742, type: 3}
localizationKey: subtitle_ScanEmail

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: b4dea7ac3e2f7cd438beb7490daeb427
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,18 @@
%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: 3109a7b091e2da44b950dc4b24d3f495, type: 3}
m_Name: WrongIgnoreChoice
m_EditorClassIdentifier:
narrationID: 5
englishClip: {fileID: 8300000, guid: 3b51d1fb67ccb94409abd6ec818f746c, type: 3}
arabicClip: {fileID: 8300000, guid: 474f7b8196aa9814fa5a860fc36a5bcc, type: 3}
localizationKey: subtitle_WrongIgnoreChoice

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 82b7736de5a8554469cfc9634fb5902d
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

@ -29,6 +29,7 @@ public class CharacterMovement : MonoBehaviour
private Quaternion targetSitRotation;
bool isStarted = false;
public Button NewEmailObj;
void Start()
{
if (waypoints == null || waypoints.Length == 0)
@ -52,13 +53,21 @@ public class CharacterMovement : MonoBehaviour
animator.applyRootMotion = false;
}
public void StartIntroduction()
{
SupabaseEventLogger.Instance?.StartSession();
NarrationPlayer.Instance.PlayNarration(NarrationID.Intro, () =>
{
Debug.Log("Intro finished!");
AnimationStarter();
});
}
public void AnimationStarter()
{
cameraHeadBobbing.enabled = true;
animator.SetTrigger("StartWalking");
isStarted = true;
SupabaseEventLogger.Instance?.StartSession();
InstructionManager.Instance?.ShowScreenInstruction("mission_intro");
//InstructionManager.Instance?.ShowScreenInstruction("mission_intro");
}
void Update()
{
@ -133,6 +142,8 @@ public class CharacterMovement : MonoBehaviour
PlayAnimation("SitDown");
NewEmailObj.gameObject.SetActive(true);
SoundManager.Instance.PlayInboxDing();
NarrationPlayer.Instance.PlayNarration(NarrationID.NewEmail);
// Disable camera bobbing
if (cameraHeadBobbing != null)
cameraHeadBobbing.enabled = false;
@ -170,7 +181,7 @@ public class CharacterMovement : MonoBehaviour
.OnComplete(() =>
{
state = MovementState.Finished;
InstructionManager.Instance?.ShowScreenInstruction("click_to_open");
//InstructionManager.Instance?.ShowScreenInstruction("click_to_open");
NewEmailObj.enabled = true;
Debug.Log("Camera Movement Completed");
});

@ -128,10 +128,22 @@ public class EmailOpenPanel : MonoBehaviour
if (isCorrect)
{
SoundManager.Instance?.PlayCorrectAction();
InstructionManager.Instance?.ShowScreenInstruction("correct_choice", 3f);
if(action=="report")
{
NarrationPlayer.Instance.PlayNarration(NarrationID.CorrectReportChoice);
}
else if(action=="ignore")
{
NarrationPlayer.Instance.PlayNarration(NarrationID.CorrectIgnoreChoice);
}
//InstructionManager.Instance?.ShowScreenInstruction("correct_choice", 3f);
}
else
{
if(action=="ignore")
{
NarrationPlayer.Instance.PlayNarration(NarrationID.WrongIgnoreChoice);
}
SoundManager.Instance?.PlayPhishingAlert();
}

@ -58,10 +58,15 @@ public class EmailUIController : MonoBehaviour
string clean = body.Replace("\n", " ").Trim();
return clean.Length <= max ? clean : clean.Substring(0, max) + "...";
}
bool audioAlreadyDone = false;
public void OnClick()
{
InstructionManager.Instance.HideScreenInstruction();
if(!audioAlreadyDone)
{
audioAlreadyDone = true;
NarrationPlayer.Instance.PlayNarration(NarrationID.ScanEmail);
}
//InstructionManager.Instance.HideScreenInstruction();
SoundManager.Instance.PlayButtonClick();
GameObject panel = Instantiate(Resources.Load<GameObject>("EmailOpenPanel"), transform.root);
panel.transform.SetSiblingIndex(5);

@ -32,22 +32,22 @@ public class InstructionManager : MonoBehaviour
Instance = this;
mainCam = Camera.main;
if (instructionBG != null)
instructionBG.SetActive(false);
//if (instructionBG != null)
// instructionBG.SetActive(false);
if (speechBubbleObj != null)
speechBubbleObj.SetActive(false);
}
void LateUpdate()
{
// Reposition speech bubble to follow world target
if (speechBubbleObj != null && followTarget != null)
{
Vector3 screenPos = mainCam.WorldToScreenPoint(followTarget.position + offset);
speechBubbleObj.transform.position = screenPos;
}
}
//void LateUpdate()
//{
// // Reposition speech bubble to follow world target
// if (speechBubbleObj != null && followTarget != null)
// {
// Vector3 screenPos = mainCam.WorldToScreenPoint(followTarget.position + offset);
// speechBubbleObj.transform.position = screenPos;
// }
//}
// Show screen HUD instruction with localization key
public void ShowScreenInstruction(string key, float autoHideDelay = -1f)
@ -66,8 +66,8 @@ public class InstructionManager : MonoBehaviour
instructionBG.SetActive(true);
if (autoHideDelay > 0)
Invoke(nameof(HideScreenInstruction), autoHideDelay);
//if (autoHideDelay > 0)
// Invoke(nameof(HideScreenInstruction), autoHideDelay);
}
public void HideScreenInstruction()

@ -25,6 +25,8 @@ public class LanguageManager : MonoBehaviour
public TMP_FontAsset fontArabic;
public TextMeshProUGUI languageLabel;
public bool languageSetBool = false;
public bool IsArabic => currentLanguage == "Arabic";
public TMP_FontAsset GetCurrentFont()
{
return currentLanguage == "Arabic" ? fontArabic : fontEnglish;

@ -30,6 +30,7 @@ public class MiniQuizManager : MonoBehaviour
public void SubmitAnswer(int selectedIndex)
{
NarrationPlayer.Instance.PlayNarration(NarrationID.GameEnd);
restartButton.SetActive(true);
bool isArabic = LanguageManager.Instance != null &&
LanguageManager.Instance.currentLanguage == "Arabic";

@ -0,0 +1,14 @@
using UnityEngine;
[CreateAssetMenu(menuName = "Narration/NarrationData")]
public class NarrationData : ScriptableObject
{
public NarrationID narrationID;
[Header("Audio Clips")]
public AudioClip englishClip;
public AudioClip arabicClip;
[Header("Subtitle Key")]
public string localizationKey; // Key used in LanguageManager
}

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3109a7b091e2da44b950dc4b24d3f495
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,158 @@
using UnityEngine;
using TMPro;
using DG.Tweening;
using System.Collections.Generic;
using System.Collections;
public enum NarrationID
{
Intro,
NewEmail,
ScanEmail,
CorrectReportChoice,
CorrectIgnoreChoice,
WrongIgnoreChoice,
Feedback,
GameEnd
}
public class NarrationPlayer : MonoBehaviour
{
public static NarrationPlayer Instance { get; private set; }
[Header("Narration Assets")]
public List<NarrationData> narrationDatabase;
[Header("Subtitle Settings")]
public TextMeshProUGUI subtitleText;
public float charDelay = 0.03f;
private AudioSource audioSource;
private Tween typewriterTween;
private Dictionary<NarrationID, NarrationData> narrationMap;
private void Awake()
{
if (Instance != null && Instance != this)
{
Destroy(gameObject);
return;
}
Instance = this;
DontDestroyOnLoad(gameObject);
audioSource = gameObject.AddComponent<AudioSource>();
audioSource.playOnAwake = false;
narrationMap = new Dictionary<NarrationID, NarrationData>();
foreach (var data in narrationDatabase)
{
if (data != null && !narrationMap.ContainsKey(data.narrationID))
narrationMap[data.narrationID] = data;
}
}
public void PlayNarration(NarrationID id, System.Action onComplete = null)
{
if (!narrationMap.TryGetValue(id, out var narrationData))
{
Debug.LogWarning($"Narration not found for: {id}");
return;
}
bool isArabic = LanguageManager.Instance.IsArabic;
AudioClip clip = isArabic ? narrationData.arabicClip : narrationData.englishClip;
if (clip == null)
{
Debug.LogWarning($"Missing audio clip for {id} in language: {(isArabic ? "Arabic" : "English")}");
return;
}
if (audioSource.isPlaying)
audioSource.Stop();
audioSource.clip = clip;
audioSource.Play();
if (!string.IsNullOrEmpty(narrationData.localizationKey))
{
string rawSubtitle = LanguageManager.Instance.GetLocalizedText(narrationData.localizationKey);
string subtitle = isArabic
? ArabicFixerHelper.FixPreservingTags(rawSubtitle)
: rawSubtitle;
// TMP settings per language
subtitleText.font = LanguageManager.Instance.GetCurrentFont();
subtitleText.fontSize = isArabic ? 26 : 36;
// subtitleText.alignment = isArabic ? TextAlignmentOptions.Right : TextAlignmentOptions.Left;
subtitleText.overflowMode = TextOverflowModes.Page;
subtitleText.isRightToLeftText = false; // MUST be false with ArabicFixer
AppendSubtitle(subtitle, isArabic);
}
if (onComplete != null)
StartCoroutine(InvokeAfterNarration(clip.length, onComplete));
}
private void AppendSubtitle(string fullText, bool isArabic)
{
typewriterTween?.Kill();
subtitleText.text = "";
if (isArabic)
{
StartCoroutine(ShowArabicByPages(fullText));
return;
}
int totalLength = fullText.Length;
int currentIndex = 0;
typewriterTween = DOTween.To(() => currentIndex, x =>
{
currentIndex = x;
subtitleText.text = fullText.Substring(0, currentIndex);
subtitleText.ForceMeshUpdate();
subtitleText.pageToDisplay = subtitleText.textInfo.pageCount;
}, totalLength, totalLength * charDelay).SetEase(Ease.Linear);
}
private IEnumerator ShowArabicByPages(string fullText)
{
subtitleText.text = fullText;
subtitleText.ForceMeshUpdate();
int totalPages = subtitleText.textInfo.pageCount;
for (int i = 1; i <= totalPages; i++)
{
subtitleText.pageToDisplay = i;
yield return new WaitForSeconds(5f); // Adjust delay per page
}
}
private IEnumerator InvokeAfterNarration(float delay, System.Action callback)
{
yield return new WaitForSeconds(delay);
callback?.Invoke();
}
public void StopNarration()
{
if (audioSource.isPlaying)
audioSource.Stop();
typewriterTween?.Kill();
}
public void ClearSubtitles()
{
typewriterTween?.Kill();
subtitleText.text = "";
}
public bool IsPlaying => audioSource.isPlaying;
}

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 43059c037128db14f94c2bbcb006a175
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

@ -73,6 +73,7 @@ public class SceneOutcomeManager : MonoBehaviour
public void ProceedToDebrief()
{
NarrationPlayer.Instance.PlayNarration(NarrationID.Feedback);
StartCoroutine(MoveCameraToDebrief());
}

Binary file not shown.

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save