diff --git a/Assets/Resources/Prefabs/Pal3.prefab b/Assets/Resources/Prefabs/Pal3.prefab index 34e03d444..bc717d80a 100644 --- a/Assets/Resources/Prefabs/Pal3.prefab +++ b/Assets/Resources/Prefabs/Pal3.prefab @@ -1165,6 +1165,140 @@ MonoBehaviour: m_EditorClassIdentifier: m_HorizontalFit: 2 m_VerticalFit: 0 +--- !u!1 &1792442932885571784 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4245985783789320137} + - component: {fileID: 7254318039037877255} + - component: {fileID: 1158269877521751333} + m_Layer: 5 + m_Name: TaskInfo + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4245985783789320137 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1792442932885571784} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 26898775255300359} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7254318039037877255 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1792442932885571784} + m_CullTransparentMesh: 1 +--- !u!114 &1158269877521751333 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1792442932885571784} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 9e1d886e63529bb4ca3c95ece3e3189c, type: 2} + m_sharedMaterial: {fileID: 2847917559404452115, guid: 9e1d886e63529bb4ca3c95ece3e3189c, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 20 + m_fontSizeBase: 20 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 4 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} --- !u!1 &1934532916208982931 GameObject: m_ObjectHideFlags: 0 @@ -2792,6 +2926,42 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: [] +--- !u!1 &5340890608913273276 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 26898775255300359} + m_Layer: 5 + m_Name: TaskInfoBar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &26898775255300359 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5340890608913273276} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4245985783789320137} + m_Father: {fileID: 5749901358741972170} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -35, y: -25} + m_SizeDelta: {x: 600, y: 100} + m_Pivot: {x: 1, y: 1} --- !u!1 &5675362535211298766 GameObject: m_ObjectHideFlags: 0 @@ -3481,6 +3651,7 @@ RectTransform: m_LocalScale: {x: 0, y: 0, z: 0} m_ConstrainProportionsScale: 0 m_Children: + - {fileID: 26898775255300359} - {fileID: 2546561680202900797} m_Father: {fileID: 8627381932629902483} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -3507,7 +3678,7 @@ Canvas: m_OverridePixelPerfect: 0 m_SortingBucketNormalizedSize: 0 m_VertexColorAlwaysGammaSpace: 0 - m_AdditionalShaderChannelsFlag: 7 + m_AdditionalShaderChannelsFlag: 31 m_UpdateRectTransformForStandalone: 0 m_SortingLayerID: 0 m_SortingOrder: 1001 @@ -3529,7 +3700,7 @@ MonoBehaviour: m_ScaleFactor: 1 m_ReferenceResolution: {x: 1920, y: 1080} m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0.3 + m_MatchWidthOrHeight: 0.75 m_PhysicalUnit: 3 m_FallbackScreenDPI: 96 m_DefaultSpriteDPI: 96 @@ -3904,8 +4075,8 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: e9d6f17a4e68481a9705f217be9b4156, type: 3} m_Name: m_EditorClassIdentifier: - maxThresholdRatio: 1.66667 - minThresholdRatio: 1.4 + maxThresholdRatio: 1.6 + minThresholdRatio: 1.3 minWidth: 800 midWidth: 950 maxWidth: 1100 @@ -3997,6 +4168,7 @@ MonoBehaviour: videoPlayer: {fileID: 4844794614659113022} noteCanvasGroup: {fileID: 6941303344842138483} noteText: {fileID: 7580806740173732748} + taskInfoText: {fileID: 1158269877521751333} dialogueCanvasGroup: {fileID: 4450587676581078315} dialogueBackgroundImage: {fileID: 3596785283706710040} dialogueAvatarImageLeft: {fileID: 2858011271090605436} diff --git a/Assets/Resources/Textures/VideoPlayerRenderTexture.renderTexture b/Assets/Resources/Textures/VideoPlayerRenderTexture.renderTexture index b916c8b50..efef8616a 100644 --- a/Assets/Resources/Textures/VideoPlayerRenderTexture.renderTexture +++ b/Assets/Resources/Textures/VideoPlayerRenderTexture.renderTexture @@ -26,6 +26,7 @@ RenderTexture: m_UseDynamicScale: 0 m_BindMS: 0 m_EnableCompatibleFormat: 1 + m_EnableRandomWrite: 0 m_TextureSettings: serializedVersion: 2 m_FilterMode: 1 diff --git a/Assets/Scripts/Core/DataReader/Txt.meta b/Assets/Scripts/Core/DataReader/Txt.meta new file mode 100644 index 000000000..dc121e0b4 --- /dev/null +++ b/Assets/Scripts/Core/DataReader/Txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2ca33290fbdf242478def97a7e148404 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Core/DataReader/Txt/TaskDefinitionFile.cs b/Assets/Scripts/Core/DataReader/Txt/TaskDefinitionFile.cs new file mode 100644 index 000000000..d22d0ded7 --- /dev/null +++ b/Assets/Scripts/Core/DataReader/Txt/TaskDefinitionFile.cs @@ -0,0 +1,30 @@ +// --------------------------------------------------------------------------------------------- +// Copyright (c) 2021-2023, Jiaqi Liu. All rights reserved. +// See LICENSE file in the project root for license information. +// --------------------------------------------------------------------------------------------- + +namespace Core.DataReader.Txt +{ + using System; + + public struct Task + { + public string TaskId; + public string TaskTitle; + public string TaskInfo; + public string TaskType; + public string IsLastOne; + + public bool IsMainTask => string.Equals(TaskType, "0", StringComparison.Ordinal); + } + + public sealed class TaskDefinitionFile + { + public Task[] Tasks { get; } + + public TaskDefinitionFile(Task[] tasks) + { + Tasks = tasks; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Core/DataReader/Txt/TaskDefinitionFile.cs.meta b/Assets/Scripts/Core/DataReader/Txt/TaskDefinitionFile.cs.meta new file mode 100644 index 000000000..305bf3592 --- /dev/null +++ b/Assets/Scripts/Core/DataReader/Txt/TaskDefinitionFile.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: baa56f2f5ee41324d8370e11aa5fef0e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Core/DataReader/Txt/TaskDefinitionFileReader.cs b/Assets/Scripts/Core/DataReader/Txt/TaskDefinitionFileReader.cs new file mode 100644 index 000000000..5a51caeed --- /dev/null +++ b/Assets/Scripts/Core/DataReader/Txt/TaskDefinitionFileReader.cs @@ -0,0 +1,68 @@ +// --------------------------------------------------------------------------------------------- +// Copyright (c) 2021-2023, Jiaqi Liu. All rights reserved. +// See LICENSE file in the project root for license information. +// --------------------------------------------------------------------------------------------- + +namespace Core.DataReader.Txt +{ + using System; + using System.Collections.Generic; + using System.Text; + + public sealed class TaskDefinitionFileReader : IFileReader + { + private readonly int _codepage; + + public TaskDefinitionFileReader(int codepage) + { + _codepage = codepage; + } + + public TaskDefinitionFile Read(IBinaryReader reader) + { + throw new NotImplementedException(); + } + + public TaskDefinitionFile Read(byte[] data) + { + var content = Encoding.GetEncoding(_codepage).GetString(data, 0, data.Length); + var tasks = new List(); + var taskLines = content.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); + var currentTask = new Task(); + + foreach (var taskLine in taskLines) + { + if (taskLine.TrimStart().StartsWith(";")) continue; + + var splitLine = taskLine.Split('$'); + var tag = splitLine[0].Trim(); + var value = splitLine.Length > 1 ? splitLine[1].Trim().Trim('$', '&') : string.Empty; + + switch (tag) + { + case "tname": + currentTask.TaskId = value; + break; + case "title": + currentTask.TaskTitle = value; + break; + case "info": + currentTask.TaskInfo = value; + break; + case "type": + currentTask.TaskType = value; + break; + case "last": + currentTask.IsLastOne = value; + break; + case "#": + tasks.Add(currentTask); + currentTask = new Task(); // reset task for next one + break; + } + } + + return new TaskDefinitionFile(tasks.ToArray()); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Core/DataReader/Txt/TaskDefinitionFileReader.cs.meta b/Assets/Scripts/Core/DataReader/Txt/TaskDefinitionFileReader.cs.meta new file mode 100644 index 000000000..bd3cc5f81 --- /dev/null +++ b/Assets/Scripts/Core/DataReader/Txt/TaskDefinitionFileReader.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f6b1475871d9bd14184e47ffe848780f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Pal3/Dev/DevCommands.cs b/Assets/Scripts/Pal3/Dev/DevCommands.cs index 73d99c181..1d5c7fbb4 100644 --- a/Assets/Scripts/Pal3/Dev/DevCommands.cs +++ b/Assets/Scripts/Pal3/Dev/DevCommands.cs @@ -705,6 +705,7 @@ PlayerEnableInput 1 ActorSetNavLayer -1 0 ActorSetTilePosition -1 190 20 TeamAddOrRemoveActor 0 1 + TaskOpen 077 CameraFadeIn"}, {"蜀山\n\n第一次回家", @" ScriptVarSetValue -32768 20800 @@ -715,6 +716,7 @@ PlayerEnableInput 1 ActorSetNavLayer -1 0 ActorSetTilePosition -1 91 114 TeamAddOrRemoveActor 0 1 + TaskOpen 083 CameraFadeIn"}, {"蜀山\n\n绿萝嶂", @" ScriptVarSetValue -32768 30101 @@ -730,6 +732,7 @@ PlayerEnableInput 1 ActorSetTilePosition -1 342 137 TeamAddOrRemoveActor 0 1 TeamAddOrRemoveActor 1 1 + TaskOpen 086 CameraFadeIn"}, {"地脉门户\n\n少阳三焦", @" ScriptVarSetValue -32768 40200 @@ -750,6 +753,7 @@ BigMapEnableRegion 1 2 BigMapEnableRegion 2 2 BigMapEnableRegion 4 2 BigMapEnableRegion 5 2 + TaskOpen 089 CameraFadeIn"}, {"第一次进入里蜀山", @" ScriptVarSetValue -32768 41100 @@ -772,6 +776,7 @@ BigMapEnableRegion 2 2 BigMapEnableRegion 4 2 BigMapEnableRegion 5 2 BigMapEnableRegion 6 1 + TaskOpen 092 CameraFadeIn"}, {"里蜀山外城南\n\n厥阴心包", @" ScriptVarSetValue -32768 50200 @@ -794,6 +799,7 @@ BigMapEnableRegion 2 2 BigMapEnableRegion 4 2 BigMapEnableRegion 5 2 BigMapEnableRegion 6 1 + TaskOpen 097 CameraFadeIn"}, {"厥阴心包\n\n胜州", @" ScriptVarSetValue -32768 50500 @@ -816,6 +822,7 @@ BigMapEnableRegion 2 2 BigMapEnableRegion 4 2 BigMapEnableRegion 5 2 BigMapEnableRegion 6 1 + TaskOpen 098 CameraFadeIn"}, {"蜀山\n\n深夜去经库", @" ScriptVarSetValue -32768 60500 @@ -840,6 +847,7 @@ BigMapEnableRegion 5 2 BigMapEnableRegion 6 1 BigMapEnableRegion 7 2 BigMapEnableRegion 8 2 + TaskOpen 107 CameraFadeIn"}, {"地脉门户大厅\n\n阳名百纳", @" ScriptVarSetValue -32768 70100 @@ -863,6 +871,7 @@ BigMapEnableRegion 5 2 BigMapEnableRegion 6 1 BigMapEnableRegion 7 2 BigMapEnableRegion 8 2 + TaskOpen 111 CameraFadeIn"}, {"血濡回魂\n\n初入京城", @" ScriptVarSetValue -32768 70700 @@ -886,6 +895,7 @@ BigMapEnableRegion 6 1 BigMapEnableRegion 7 2 BigMapEnableRegion 8 2 BigMapEnableRegion 9 1 + TaskOpen 112 CameraFadeIn"}, {"失散\n\n双溪", @" ScriptVarSetValue -32768 80100 @@ -912,6 +922,7 @@ BigMapEnableRegion 7 2 BigMapEnableRegion 8 2 BigMapEnableRegion 9 1 BigMapEnableRegion 10 2 + TaskOpen 120 CameraFadeIn"}, {"双溪\n\n里蜀山", @" ScriptVarSetValue -32768 80700 @@ -939,6 +950,7 @@ BigMapEnableRegion 7 2 BigMapEnableRegion 8 2 BigMapEnableRegion 9 1 BigMapEnableRegion 10 2 + TaskOpen 122 CameraFadeIn"}, {"里蜀山外城南\n\n太阴归尘", @" ScriptVarSetValue -32768 80700 @@ -966,6 +978,7 @@ BigMapEnableRegion 7 2 BigMapEnableRegion 8 2 BigMapEnableRegion 9 1 BigMapEnableRegion 10 2 + TaskOpen 123 CameraFadeIn"}, {"太阴归尘\n\n蜀山故道", @" ScriptVarSetValue -32768 90300 @@ -991,6 +1004,7 @@ BigMapEnableRegion 7 2 BigMapEnableRegion 8 2 BigMapEnableRegion 9 1 BigMapEnableRegion 10 2 + TaskOpen 127 CameraFadeIn"}, {"蜀山深夜\n\n养父常纪房间", @" ScriptVarSetValue -32768 100400 @@ -1018,6 +1032,7 @@ BigMapEnableRegion 8 2 BigMapEnableRegion 9 1 BigMapEnableRegion 10 2 BigMapEnableRegion 11 1 + TaskOpen 134 CameraFadeIn"}, {"无极阁找掌门去锁妖塔", @" ScriptVarSetValue -32768 100701 @@ -1046,6 +1061,7 @@ BigMapEnableRegion 9 1 BigMapEnableRegion 10 2 BigMapEnableRegion 11 1 CameraSetDefaultTransform 2 + TaskOpen 137 CameraFadeIn"}, {"新安当", @" ScriptVarSetValue -32768 101500 @@ -1075,6 +1091,7 @@ BigMapEnableRegion 10 2 BigMapEnableRegion 11 1 BigMapEnableRegion 12 1 BigMapEnableRegion 13 2 + TaskOpen 140 CameraFadeIn"}, {"地脉门户\n\n太阳华池", @" ScriptVarSetValue -32768 110200 @@ -1101,6 +1118,7 @@ BigMapEnableRegion 9 1 BigMapEnableRegion 10 2 BigMapEnableRegion 11 1 BigMapEnableRegion 13 2 + TaskOpen 144 CameraFadeIn"}, {"小秘屋会和", @" ScriptVarSetValue -32768 120300 @@ -1128,6 +1146,7 @@ BigMapEnableRegion 9 1 BigMapEnableRegion 10 2 BigMapEnableRegion 11 1 BigMapEnableRegion 13 2 + TaskOpen 147 CameraFadeIn"}, {"里蜀山\n\n魔界之门", @" ScriptVarSetValue -32768 120400 @@ -1156,6 +1175,7 @@ BigMapEnableRegion 9 1 BigMapEnableRegion 10 2 BigMapEnableRegion 11 1 BigMapEnableRegion 13 2 + TaskOpen 148 CameraFadeIn"}, {"里蜀山外城北\n\n少阴凝碧", @" ScriptVarSetValue -32768 130100 @@ -1184,6 +1204,7 @@ BigMapEnableRegion 9 1 BigMapEnableRegion 10 2 BigMapEnableRegion 11 1 BigMapEnableRegion 13 2 + TaskOpen 150 CameraFadeIn"}, {"施洞", @" ScriptVarSetValue -32768 140200 @@ -1213,6 +1234,7 @@ BigMapEnableRegion 9 1 BigMapEnableRegion 10 2 BigMapEnableRegion 11 1 BigMapEnableRegion 13 2 + TaskOpen 154 CameraFadeIn"}, {"出发去月光城", @" ScriptVarSetValue -32768 140400 @@ -1242,6 +1264,7 @@ BigMapEnableRegion 9 1 BigMapEnableRegion 10 2 BigMapEnableRegion 11 1 BigMapEnableRegion 13 2 + TaskOpen 155 CameraFadeIn"}, {"蜀山\n\n重回绿萝山", @" ScriptVarSetValue -32768 150300 @@ -1271,6 +1294,7 @@ BigMapEnableRegion 10 2 BigMapEnableRegion 11 1 BigMapEnableRegion 13 2 BigMapEnableRegion 14 2 + TaskOpen 160 CameraFadeIn"}, {"地脉门户\n\n少阳参天", @" ScriptVarSetValue -32768 150400 @@ -1299,6 +1323,7 @@ BigMapEnableRegion 10 2 BigMapEnableRegion 11 1 BigMapEnableRegion 13 2 BigMapEnableRegion 14 2 + TaskOpen 161 CameraFadeIn"}, {"回里蜀山秘密基地", @" ScriptVarSetValue -32768 160101 @@ -1328,6 +1353,7 @@ BigMapEnableRegion 10 2 BigMapEnableRegion 11 1 BigMapEnableRegion 13 2 BigMapEnableRegion 14 2 + TaskOpen 163 CameraFadeIn"}, {"里蜀山内城\n\n厥阴蔽日", @" ScriptVarSetValue -32768 170200 @@ -1358,6 +1384,7 @@ BigMapEnableRegion 10 2 BigMapEnableRegion 11 1 BigMapEnableRegion 13 2 BigMapEnableRegion 14 2 + TaskOpen 171 CameraFadeIn"}, {"地脉门户\n\n蜀山前山", @" ScriptVarSetValue -32768 171200 @@ -1386,6 +1413,7 @@ BigMapEnableRegion 10 2 BigMapEnableRegion 11 1 BigMapEnableRegion 13 2 BigMapEnableRegion 14 2 + TaskOpen 174 CameraFadeIn"}, {"花圃\n\n温慧最高好感", @" ScriptVarSetValue -32768 180600 @@ -1414,6 +1442,7 @@ BigMapEnableRegion 10 2 BigMapEnableRegion 11 1 BigMapEnableRegion 13 2 BigMapEnableRegion 14 2 + TaskOpen 180 FavorAdd 1 50 FavorAdd 2 10 CameraFadeIn"}, @@ -1444,6 +1473,7 @@ BigMapEnableRegion 10 2 BigMapEnableRegion 11 1 BigMapEnableRegion 13 2 BigMapEnableRegion 14 2 + TaskOpen 180 FavorAdd 1 10 FavorAdd 2 50 CameraFadeIn"}, diff --git a/Assets/Scripts/Pal3/Dev/MainMenu.cs b/Assets/Scripts/Pal3/Dev/MainMenu.cs index afac65239..500d2f476 100644 --- a/Assets/Scripts/Pal3/Dev/MainMenu.cs +++ b/Assets/Scripts/Pal3/Dev/MainMenu.cs @@ -779,6 +779,10 @@ private void StartNewGame() // Add main actor to the team _teamManager.AddActor(0); + #if PAL3A // Add initial task + CommandDispatcher.Instance.Dispatch(new TaskOpenCommand(TaskConstants.InitTaskId)); + #endif + _gameStateManager.GoToState(GameState.Cutscene); } diff --git a/Assets/Scripts/Pal3/GameResourceInitializer.cs b/Assets/Scripts/Pal3/GameResourceInitializer.cs index 86822ab58..f4a773fe6 100644 --- a/Assets/Scripts/Pal3/GameResourceInitializer.cs +++ b/Assets/Scripts/Pal3/GameResourceInitializer.cs @@ -27,6 +27,7 @@ namespace Pal3 using Core.DataReader.Pol; using Core.DataReader.Sce; using Core.DataReader.Scn; + using Core.DataReader.Txt; using Core.FileSystem; using Core.Services; using Data; @@ -176,6 +177,7 @@ private IEnumerator InitResourceAsync() ServiceLocator.Instance.Register>(new EffectDefinitionFileReader()); ServiceLocator.Instance.Register>(new SceFileReader(codepage)); ServiceLocator.Instance.Register>(new ScnFileReader(codepage)); + ServiceLocator.Instance.Register>(new TaskDefinitionFileReader(codepage)); // Init TextureLoaderFactory TextureLoaderFactory textureLoaderFactory = new (); diff --git a/Assets/Scripts/Pal3/GameSystem/TaskManager.cs b/Assets/Scripts/Pal3/GameSystem/TaskManager.cs new file mode 100644 index 000000000..d5c9deed8 --- /dev/null +++ b/Assets/Scripts/Pal3/GameSystem/TaskManager.cs @@ -0,0 +1,101 @@ +// --------------------------------------------------------------------------------------------- +// Copyright (c) 2021-2023, Jiaqi Liu. All rights reserved. +// See LICENSE file in the project root for license information. +// --------------------------------------------------------------------------------------------- + +#if PAL3A + +namespace Pal3.GameSystem +{ + using System; + using System.Collections.Generic; + using System.Linq; + using Command; + using Command.InternalCommands; + using Command.SceCommands; + using Core.DataReader.Txt; + using Core.Utils; + using Data; + using MetaData; + using TMPro; + + public sealed class TaskManager : + ICommandExecutor, + ICommandExecutor, + ICommandExecutor + { + private const string TASK_DEFINITION_FILE_NAME = "task.txt"; + + private readonly Dictionary _tasks = new(); + + private readonly HashSet _openedTasks = new (); + private readonly HashSet _completedTasks = new (); + + private readonly TextMeshProUGUI _taskInfoText; + + public TaskManager(GameResourceProvider resourceProvider, TextMeshProUGUI taskInfoText) + { + Requires.IsNotNull(resourceProvider, nameof(resourceProvider)); + + var taskDefinitionFile = resourceProvider.GetGameResourceFile( + FileConstants.DataScriptFolderVirtualPath + TASK_DEFINITION_FILE_NAME); + + Requires.IsNotNull(taskDefinitionFile, nameof(taskDefinitionFile)); + + _taskInfoText = Requires.IsNotNull(taskInfoText, nameof(taskInfoText)); + + foreach (Task task in taskDefinitionFile.Tasks) + { + _tasks[task.TaskId] = task; + } + + CommandExecutorRegistry.Instance.Register(this); + } + + public void Dispose() + { + CommandExecutorRegistry.Instance.UnRegister(this); + } + + public Task[] GetOpenedTasks() + { + return _openedTasks.Select(taskId => _tasks[taskId]).ToArray(); + } + + public Task[] GetCompletedTasks() + { + return _completedTasks.Select(taskId => _tasks[taskId]).ToArray(); + } + + public void Execute(TaskOpenCommand command) + { + // Special handling for completing the initial task + if (command.TaskId.Equals(TaskConstants.SecondTaskId, StringComparison.Ordinal)) + { + Execute(new TaskCompleteCommand(TaskConstants.InitTaskId)); + } + + _openedTasks.Add(command.TaskId); + + if (_tasks.TryGetValue(command.TaskId, out Task task) && task.IsMainTask) + { + _taskInfoText.text = task.TaskInfo; + } + } + + public void Execute(TaskCompleteCommand command) + { + _openedTasks.Remove(command.TaskId); + _completedTasks.Add(command.TaskId); + } + + public void Execute(ResetGameStateCommand command) + { + _openedTasks.Clear(); + _completedTasks.Clear(); + _taskInfoText.text = string.Empty; + } + } +} + +#endif \ No newline at end of file diff --git a/Assets/Scripts/Pal3/GameSystem/TaskManager.cs.meta b/Assets/Scripts/Pal3/GameSystem/TaskManager.cs.meta new file mode 100644 index 000000000..e48457747 --- /dev/null +++ b/Assets/Scripts/Pal3/GameSystem/TaskManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a555947dad8b1ce4f96cde86b0406577 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Pal3/MetaData/FileConstants.cs b/Assets/Scripts/Pal3/MetaData/FileConstants.cs index 961bdae1b..fcb2940df 100644 --- a/Assets/Scripts/Pal3/MetaData/FileConstants.cs +++ b/Assets/Scripts/Pal3/MetaData/FileConstants.cs @@ -39,6 +39,7 @@ public static class FileConstants private const string WEAPON_FOLDER_NAME = "weapon"; private const string BASE_DATA_FOLDER_NAME = "basedata"; private const string MUSIC_FOLDER_NAME = "music"; + private const string DATA_SCRIPT_FOLDER_NAME = "datascript"; private const string BASE_DATA_CPK_FILE_NAME = "basedata.cpk"; private const string MUSIC_CPK_FILE_NAME = "music.cpk"; @@ -113,6 +114,9 @@ public static string GetMovieCpkFileRelativePath(string movieCpkFileName) $"{BASE_DATA_CPK_FILE_NAME}{DirSeparator}{COMBAT_DATA_FOLDER_NAME}{DirSeparator}PAL3A_Softstar.gdb"; #endif + public static readonly string DataScriptFolderVirtualPath = + $"{BASE_DATA_CPK_FILE_NAME}{DirSeparator}{DATA_SCRIPT_FOLDER_NAME}{DirSeparator}"; + public static readonly string EffectFolderVirtualPath = $"{BASE_DATA_CPK_FILE_NAME}{DirSeparator}{EFFECT_FOLDER_NAME}{DirSeparator}"; diff --git a/Assets/Scripts/Pal3/MetaData/TaskConstants.cs b/Assets/Scripts/Pal3/MetaData/TaskConstants.cs new file mode 100644 index 000000000..792ee1a95 --- /dev/null +++ b/Assets/Scripts/Pal3/MetaData/TaskConstants.cs @@ -0,0 +1,17 @@ +// --------------------------------------------------------------------------------------------- +// Copyright (c) 2021-2023, Jiaqi Liu. All rights reserved. +// See LICENSE file in the project root for license information. +// --------------------------------------------------------------------------------------------- + +#if PAL3A + +namespace Pal3.MetaData +{ + public static class TaskConstants + { + public const string InitTaskId = "071"; + public const string SecondTaskId = "072"; + } +} + +#endif \ No newline at end of file diff --git a/Assets/Scripts/Pal3/MetaData/TaskConstants.cs.meta b/Assets/Scripts/Pal3/MetaData/TaskConstants.cs.meta new file mode 100644 index 000000000..0f19f3eb4 --- /dev/null +++ b/Assets/Scripts/Pal3/MetaData/TaskConstants.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 05fc02109213b6644afb26dce7ce7fc6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Pal3/Pal3.cs b/Assets/Scripts/Pal3/Pal3.cs index 67e1f6bb8..35df8dc60 100644 --- a/Assets/Scripts/Pal3/Pal3.cs +++ b/Assets/Scripts/Pal3/Pal3.cs @@ -63,6 +63,7 @@ public sealed class Pal3 : Singleton // Information [SerializeField] private CanvasGroup noteCanvasGroup; [SerializeField] private TextMeshProUGUI noteText; + [SerializeField] private TextMeshProUGUI taskInfoText; // Dialogue [SerializeField] private CanvasGroup dialogueCanvasGroup; @@ -141,8 +142,7 @@ public sealed class Pal3 : Singleton private CursorManager _cursorManager; private SaveManager _saveManager; - // Mini games - #if PAL3 + #if PAL3 // PAL3 specific components private AppraisalsMiniGame _appraisalsMiniGame; private SailingMiniGame _sailingMiniGame; private HideFightMiniGame _hideFightMiniGame; @@ -150,6 +150,8 @@ public sealed class Pal3 : Singleton private SkiMiniGame _skiMiniGame; private SwatAFlyMiniGame _swatAFlyMiniGame; private CaveExperienceMiniGame _caveExperienceMiniGame; + #elif PAL3A // PAL3A specific components + private TaskManager _taskManager; #endif // Dev tools @@ -207,6 +209,9 @@ private void OnEnable() ServiceLocator.Instance.Register(_swatAFlyMiniGame); _caveExperienceMiniGame = new CaveExperienceMiniGame(); ServiceLocator.Instance.Register(_caveExperienceMiniGame); + #elif PAL3A + _taskManager = new TaskManager(_gameResourceProvider, taskInfoText); + ServiceLocator.Instance.Register(_taskManager); #endif _videoManager = gameObject.AddComponent(); @@ -307,6 +312,9 @@ private void OnEnable() _bigMapManager, _scriptManager, _favorManager, + #if PAL3A + _taskManager, + #endif _cameraManager, _audioManager, _postProcessManager); @@ -407,6 +415,8 @@ private void OnDisable() _skiMiniGame.Dispose(); _swatAFlyMiniGame.Dispose(); _caveExperienceMiniGame.Dispose(); + #elif PAL3A + _taskManager.Dispose(); #endif Destroy(_videoManager); diff --git a/Assets/Scripts/Pal3/State/SaveManager.cs b/Assets/Scripts/Pal3/State/SaveManager.cs index 930fa6320..53dd02b44 100644 --- a/Assets/Scripts/Pal3/State/SaveManager.cs +++ b/Assets/Scripts/Pal3/State/SaveManager.cs @@ -16,6 +16,7 @@ namespace Pal3.State using Command.InternalCommands; using Command.SceCommands; using Core.DataReader.Scn; + using Core.DataReader.Txt; using Core.GameBox; using Core.Utils; using Effect.PostProcessing; @@ -53,6 +54,9 @@ public class SaveManager : IDisposable, private readonly BigMapManager _bigMapManager; private readonly ScriptManager _scriptManager; private readonly FavorManager _favorManager; + #if PAL3A + private readonly TaskManager _taskManager; + #endif private readonly CameraManager _cameraManager; private readonly AudioManager _audioManager; private readonly PostProcessManager _postProcessManager; @@ -67,6 +71,9 @@ public SaveManager(SceneManager sceneManager, BigMapManager bigMapManager, ScriptManager scriptManager, FavorManager favorManager, + #if PAL3A + TaskManager taskManager, + #endif CameraManager cameraManager, AudioManager audioManager, PostProcessManager postProcessManager) @@ -79,6 +86,9 @@ public SaveManager(SceneManager sceneManager, _bigMapManager = Requires.IsNotNull(bigMapManager, nameof(bigMapManager)); _scriptManager = Requires.IsNotNull(scriptManager, nameof(scriptManager)); _favorManager = Requires.IsNotNull(favorManager, nameof(favorManager)); + #if PAL3A + _taskManager = Requires.IsNotNull(taskManager, nameof(taskManager)); + #endif _cameraManager = Requires.IsNotNull(cameraManager, nameof(cameraManager)); _audioManager = Requires.IsNotNull(audioManager, nameof(audioManager)); _postProcessManager = Requires.IsNotNull(postProcessManager, nameof(postProcessManager)); @@ -343,6 +353,12 @@ public List ConvertCurrentGameStateToCommands(SaveLevel saveLevel) commands.Add(new ActorSetFacingCommand((int)PlayerActorId.HuaYing, (int)huaYingGameObject.transform.rotation.eulerAngles.y)); } + #elif PAL3A + // Save Task state + commands.AddRange(_taskManager.GetOpenedTasks(). + Select(openedTask => new TaskOpenCommand(openedTask.TaskId))); + commands.AddRange(_taskManager.GetCompletedTasks(). + Select(completedTask => new TaskCompleteCommand(completedTask.TaskId))); #endif // Good to have diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt index 0a60761e0..105db72a5 100644 --- a/ProjectSettings/ProjectVersion.txt +++ b/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 2022.3.5f1 -m_EditorVersionWithRevision: 2022.3.5f1 (9674261d40ee) +m_EditorVersion: 2022.3.6f1 +m_EditorVersionWithRevision: 2022.3.6f1 (b9e6e7e9fa2d)