Initial commit

This commit is contained in:
alexpete
2021-03-05 11:26:34 -08:00
commit a10351f38d
27091 changed files with 5521199 additions and 0 deletions
@@ -0,0 +1,863 @@
<ObjectStream version="3">
<Class name="UiCanvasFileObject" version="2" type="{1F02632F-F113-49B1-85AD-8CD0FA78B8AA}">
<Class name="AZ::Entity" field="CanvasEntity" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}">
<Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="516564624427" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZStd::string" field="Name" value="UiCanvasEntity" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}">
<Class name="UiCanvasComponent" field="element" version="3" type="{50B8CF6C-B19A-4D86-AFE9-96EFB820D422}">
<Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}">
<Class name="AZ::u64" field="Id" value="1603609649560984289" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZ::u64" field="UniqueId" value="7264708555779884587" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
<Class name="EntityId" field="RootElement" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="507974689835" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="unsigned int" field="LastElement" value="41" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="Vector2" field="CanvasSize" value="1920.0000000 1080.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/>
<Class name="bool" field="IsSnapEnabled" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="int" field="DrawOrder" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
<Class name="bool" field="IsPixelAligned" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsTextPixelAligned" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="RenderToTexture" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="AZStd::string" field="RenderTargetName" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="bool" field="IsPosInputSupported" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsConsumingAllInput" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsMultiTouchSupported" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsNavigationSupported" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="EntityId" field="FirstHoverElement" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="4294967295" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="UiAnimationSystem" field="AnimSystem" version="1" type="{2592269B-EF74-4409-B29F-682DC0B45DAF}">
<Class name="AZStd::vector" field="Sequences" type="{9F8D44A9-9731-5314-885E-B958D4216073}">
<Class name="AZStd::intrusive_ptr" field="element" type="{E60FCB60-F631-5F86-A9CB-66FF429F3C0A}">
<Class name="CUiAnimSequence" field="element" version="1" type="{AA5AB4ED-CB98-4166-953E-0FE1EF7AC61F}">
<Class name="AZStd::string" field="Name" value="DefaultLevelLoadingAnimatedSequence" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="int" field="Flags" value="4" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
<Class name="Range" field="TimeRange" type="{515CF4CF-4992-4139-BDE5-42A887432B45}">
<Class name="float" field="Start" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="End" value="1.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
</Class>
<Class name="unsigned int" field="ID" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::vector" field="Nodes" type="{DB4B66E4-13A0-5CD5-8026-F02CA7DA76F8}">
<Class name="AZStd::intrusive_ptr" field="element" type="{FC373751-3E99-5791-B583-0635BDC4A193}">
<Class name="CUiAnimAzEntityNode" field="element" version="1" type="{1C6FAEE1-92E4-42ED-8EEB-3483C36A0B77}">
<Class name="CUiAnimNode" field="BaseClass1" version="1" type="{1ECF3B73-FCED-464D-82E8-CFAF31BB63DC}">
<Class name="int" field="ID" value="7" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
<Class name="int" field="Parent" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
<Class name="AZStd::string" field="Name" value="Square1 (37)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="int" field="Flags" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
<Class name="AZStd::vector" field="Tracks" type="{7016336A-3C8A-5EF3-961E-75D6F1F31434}">
<Class name="AZStd::intrusive_ptr" field="element" type="{B1FE9A95-C664-5DD7-A687-25A033E669DA}">
<Class name="TUiAnimSplineTrack&lt;Vec2 &gt;" field="element" version="2" type="{1E34E372-3A0E-5246-A4B2-70E75B5AA11F}">
<Class name="int" field="Flags" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
<Class name="Vec2" field="DefaultValue" type="{844131BA-9565-42F3-8482-6F65A6D5FC59}">
<Class name="float" field="x" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="y" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
</Class>
<Class name="CUiAnimParamType" field="ParamType" version="1" type="{3D4ADD98-DFDD-4984-AC59-E59C5D718CFC}">
<Class name="int" field="Type" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
</Class>
<Class name="UiAnimParamData" field="ParamData" version="1" type="{B2E9F22C-8DB5-40FA-9DF1-276E91BA8B95}">
<Class name="AZ::u64" field="ComponentId" value="17217584308910145132" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
<Class name="AZ::Uuid" field="TypeId" value="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="AZStd::string" field="Name" value="Alpha" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="AZStd::intrusive_ptr" field="Spline" type="{42769CDB-1ECF-5831-BCC4-FA01AF839F44}">
<Class name="UiSpline::TrackSplineInterpolator&lt;Vec2&gt;" field="element" version="1" type="{38F814D4-6041-4442-9704-9F68E996D55B}">
<Class name="BezierSplineVec2" field="BaseClass1" version="1" type="{EC8BA7BD-EF3B-453A-8017-CD1BF5B7C011}">
<Class name="TSplineBezierBasisVec2" field="BaseClass1" version="1" type="{B661D05E-B912-4BD9-B102-FA82938243A9}">
<Class name="AZStd::vector" field="Keys" type="{69C92A7F-B783-581F-ADD0-201DD7668EDE}">
<Class name="UiSpline::SplineKeyEx&lt;Vec2&gt;" field="element" version="1" type="{1AE37C63-D5C2-4E65-A08B-7020E7696233}">
<Class name="UiSpline::SplineKey&lt;Vec2&gt;" field="BaseClass1" version="1" type="{E2301E81-6BAF-4A17-886C-76F1A9C37118}">
<Class name="float" field="time" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="int" field="flags" value="73" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
<Class name="Vec2" field="value" type="{844131BA-9565-42F3-8482-6F65A6D5FC59}">
<Class name="float" field="x" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="y" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
</Class>
<Class name="Vec2" field="ds" type="{844131BA-9565-42F3-8482-6F65A6D5FC59}">
<Class name="float" field="x" value="1.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="y" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
</Class>
<Class name="Vec2" field="dd" type="{844131BA-9565-42F3-8482-6F65A6D5FC59}">
<Class name="float" field="x" value="0.3331456" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="y" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
</Class>
</Class>
</Class>
<Class name="UiSpline::SplineKeyEx&lt;Vec2&gt;" field="element" version="1" type="{1AE37C63-D5C2-4E65-A08B-7020E7696233}">
<Class name="UiSpline::SplineKey&lt;Vec2&gt;" field="BaseClass1" version="1" type="{E2301E81-6BAF-4A17-886C-76F1A9C37118}">
<Class name="float" field="time" value="0.3331456" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="int" field="flags" value="65609" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
<Class name="Vec2" field="value" type="{844131BA-9565-42F3-8482-6F65A6D5FC59}">
<Class name="float" field="x" value="0.3331456" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="y" value="1.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
</Class>
<Class name="Vec2" field="ds" type="{844131BA-9565-42F3-8482-6F65A6D5FC59}">
<Class name="float" field="x" value="0.1660245" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="y" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
</Class>
<Class name="Vec2" field="dd" type="{844131BA-9565-42F3-8482-6F65A6D5FC59}">
<Class name="float" field="x" value="0.1660245" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="y" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
</Class>
</Class>
</Class>
</Class>
</Class>
</Class>
</Class>
</Class>
</Class>
</Class>
</Class>
</Class>
<Class name="EntityId" field="Entity" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="173010486358367" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
</Class>
<Class name="AZStd::intrusive_ptr" field="element" type="{FC373751-3E99-5791-B583-0635BDC4A193}">
<Class name="CUiAnimAzEntityNode" field="element" version="1" type="{1C6FAEE1-92E4-42ED-8EEB-3483C36A0B77}">
<Class name="CUiAnimNode" field="BaseClass1" version="1" type="{1ECF3B73-FCED-464D-82E8-CFAF31BB63DC}">
<Class name="int" field="ID" value="8" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
<Class name="int" field="Parent" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
<Class name="AZStd::string" field="Name" value="Square2 (38)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="int" field="Flags" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
<Class name="AZStd::vector" field="Tracks" type="{7016336A-3C8A-5EF3-961E-75D6F1F31434}">
<Class name="AZStd::intrusive_ptr" field="element" type="{B1FE9A95-C664-5DD7-A687-25A033E669DA}">
<Class name="TUiAnimSplineTrack&lt;Vec2 &gt;" field="element" version="2" type="{1E34E372-3A0E-5246-A4B2-70E75B5AA11F}">
<Class name="int" field="Flags" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
<Class name="Vec2" field="DefaultValue" type="{844131BA-9565-42F3-8482-6F65A6D5FC59}">
<Class name="float" field="x" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="y" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
</Class>
<Class name="CUiAnimParamType" field="ParamType" version="1" type="{3D4ADD98-DFDD-4984-AC59-E59C5D718CFC}">
<Class name="int" field="Type" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
</Class>
<Class name="UiAnimParamData" field="ParamData" version="1" type="{B2E9F22C-8DB5-40FA-9DF1-276E91BA8B95}">
<Class name="AZ::u64" field="ComponentId" value="17217584308910145132" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
<Class name="AZ::Uuid" field="TypeId" value="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="AZStd::string" field="Name" value="Alpha" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="AZStd::intrusive_ptr" field="Spline" type="{42769CDB-1ECF-5831-BCC4-FA01AF839F44}">
<Class name="UiSpline::TrackSplineInterpolator&lt;Vec2&gt;" field="element" version="1" type="{38F814D4-6041-4442-9704-9F68E996D55B}">
<Class name="BezierSplineVec2" field="BaseClass1" version="1" type="{EC8BA7BD-EF3B-453A-8017-CD1BF5B7C011}">
<Class name="TSplineBezierBasisVec2" field="BaseClass1" version="1" type="{B661D05E-B912-4BD9-B102-FA82938243A9}">
<Class name="AZStd::vector" field="Keys" type="{69C92A7F-B783-581F-ADD0-201DD7668EDE}">
<Class name="UiSpline::SplineKeyEx&lt;Vec2&gt;" field="element" version="1" type="{1AE37C63-D5C2-4E65-A08B-7020E7696233}">
<Class name="UiSpline::SplineKey&lt;Vec2&gt;" field="BaseClass1" version="1" type="{E2301E81-6BAF-4A17-886C-76F1A9C37118}">
<Class name="float" field="time" value="0.3329338" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="int" field="flags" value="73" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
<Class name="Vec2" field="value" type="{844131BA-9565-42F3-8482-6F65A6D5FC59}">
<Class name="float" field="x" value="0.3329338" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="y" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
</Class>
<Class name="Vec2" field="ds" type="{844131BA-9565-42F3-8482-6F65A6D5FC59}">
<Class name="float" field="x" value="0.0000085" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="y" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
</Class>
<Class name="Vec2" field="dd" type="{844131BA-9565-42F3-8482-6F65A6D5FC59}">
<Class name="float" field="x" value="0.3209393" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="y" value="0.0000531" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
</Class>
</Class>
</Class>
<Class name="UiSpline::SplineKeyEx&lt;Vec2&gt;" field="element" version="1" type="{1AE37C63-D5C2-4E65-A08B-7020E7696233}">
<Class name="UiSpline::SplineKey&lt;Vec2&gt;" field="BaseClass1" version="1" type="{E2301E81-6BAF-4A17-886C-76F1A9C37118}">
<Class name="float" field="time" value="0.6657760" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="int" field="flags" value="73" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
<Class name="Vec2" field="value" type="{844131BA-9565-42F3-8482-6F65A6D5FC59}">
<Class name="float" field="x" value="0.6657760" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="y" value="1.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
</Class>
<Class name="Vec2" field="ds" type="{844131BA-9565-42F3-8482-6F65A6D5FC59}">
<Class name="float" field="x" value="0.3209727" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="y" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
</Class>
<Class name="Vec2" field="dd" type="{844131BA-9565-42F3-8482-6F65A6D5FC59}">
<Class name="float" field="x" value="0.3320490" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="y" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
</Class>
</Class>
</Class>
</Class>
</Class>
</Class>
</Class>
</Class>
</Class>
</Class>
</Class>
</Class>
<Class name="EntityId" field="Entity" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="173019076292959" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
</Class>
<Class name="AZStd::intrusive_ptr" field="element" type="{FC373751-3E99-5791-B583-0635BDC4A193}">
<Class name="CUiAnimAzEntityNode" field="element" version="1" type="{1C6FAEE1-92E4-42ED-8EEB-3483C36A0B77}">
<Class name="CUiAnimNode" field="BaseClass1" version="1" type="{1ECF3B73-FCED-464D-82E8-CFAF31BB63DC}">
<Class name="int" field="ID" value="9" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
<Class name="int" field="Parent" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
<Class name="AZStd::string" field="Name" value="Square3 (41)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="int" field="Flags" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
<Class name="AZStd::vector" field="Tracks" type="{7016336A-3C8A-5EF3-961E-75D6F1F31434}">
<Class name="AZStd::intrusive_ptr" field="element" type="{B1FE9A95-C664-5DD7-A687-25A033E669DA}">
<Class name="TUiAnimSplineTrack&lt;Vec2 &gt;" field="element" version="2" type="{1E34E372-3A0E-5246-A4B2-70E75B5AA11F}">
<Class name="int" field="Flags" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
<Class name="Vec2" field="DefaultValue" type="{844131BA-9565-42F3-8482-6F65A6D5FC59}">
<Class name="float" field="x" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="y" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
</Class>
<Class name="CUiAnimParamType" field="ParamType" version="1" type="{3D4ADD98-DFDD-4984-AC59-E59C5D718CFC}">
<Class name="int" field="Type" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
</Class>
<Class name="UiAnimParamData" field="ParamData" version="1" type="{B2E9F22C-8DB5-40FA-9DF1-276E91BA8B95}">
<Class name="AZ::u64" field="ComponentId" value="17217584308910145132" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
<Class name="AZ::Uuid" field="TypeId" value="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="AZStd::string" field="Name" value="Alpha" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="AZStd::intrusive_ptr" field="Spline" type="{42769CDB-1ECF-5831-BCC4-FA01AF839F44}">
<Class name="UiSpline::TrackSplineInterpolator&lt;Vec2&gt;" field="element" version="1" type="{38F814D4-6041-4442-9704-9F68E996D55B}">
<Class name="BezierSplineVec2" field="BaseClass1" version="1" type="{EC8BA7BD-EF3B-453A-8017-CD1BF5B7C011}">
<Class name="TSplineBezierBasisVec2" field="BaseClass1" version="1" type="{B661D05E-B912-4BD9-B102-FA82938243A9}">
<Class name="AZStd::vector" field="Keys" type="{69C92A7F-B783-581F-ADD0-201DD7668EDE}">
<Class name="UiSpline::SplineKeyEx&lt;Vec2&gt;" field="element" version="1" type="{1AE37C63-D5C2-4E65-A08B-7020E7696233}">
<Class name="UiSpline::SplineKey&lt;Vec2&gt;" field="BaseClass1" version="1" type="{E2301E81-6BAF-4A17-886C-76F1A9C37118}">
<Class name="float" field="time" value="0.6661883" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="int" field="flags" value="73" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
<Class name="Vec2" field="value" type="{844131BA-9565-42F3-8482-6F65A6D5FC59}">
<Class name="float" field="x" value="0.6661883" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="y" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
</Class>
<Class name="Vec2" field="ds" type="{844131BA-9565-42F3-8482-6F65A6D5FC59}">
<Class name="float" field="x" value="1.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="y" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
</Class>
<Class name="Vec2" field="dd" type="{844131BA-9565-42F3-8482-6F65A6D5FC59}">
<Class name="float" field="x" value="0.2427107" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="y" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
</Class>
</Class>
</Class>
<Class name="UiSpline::SplineKeyEx&lt;Vec2&gt;" field="element" version="1" type="{1AE37C63-D5C2-4E65-A08B-7020E7696233}">
<Class name="UiSpline::SplineKey&lt;Vec2&gt;" field="BaseClass1" version="1" type="{E2301E81-6BAF-4A17-886C-76F1A9C37118}">
<Class name="float" field="time" value="1.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="int" field="flags" value="73" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
<Class name="Vec2" field="value" type="{844131BA-9565-42F3-8482-6F65A6D5FC59}">
<Class name="float" field="x" value="1.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="y" value="1.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
</Class>
<Class name="Vec2" field="ds" type="{844131BA-9565-42F3-8482-6F65A6D5FC59}">
<Class name="float" field="x" value="0.2427107" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="y" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
</Class>
<Class name="Vec2" field="dd" type="{844131BA-9565-42F3-8482-6F65A6D5FC59}">
<Class name="float" field="x" value="0.5395796" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="y" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
</Class>
</Class>
</Class>
</Class>
</Class>
</Class>
</Class>
</Class>
</Class>
</Class>
</Class>
</Class>
<Class name="EntityId" field="Entity" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="173044846096735" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
</Class>
</Class>
</Class>
</Class>
</Class>
</Class>
<Class name="AnimationData" field="AnimationData" version="1" type="{FDC58CF7-8109-48F2-8D5D-BCBAF774ABB7}">
<Class name="AZStd::string" field="SerializeString" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="EntityId" field="TooltipDisplayElement" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="4294967295" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="float" field="SnapDistance" value="10.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="SnapRotationDegrees" value="10.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="AZStd::vector" field="HorizontalGuides" type="{6106BF95-5ACD-5071-8D0E-4F846C2138AD}"/>
<Class name="AZStd::vector" field="VerticalGuides" type="{6106BF95-5ACD-5071-8D0E-4F846C2138AD}"/>
<Class name="Color" field="GuideColor" value="0.2500000 1.0000000 0.2500000 1.0000000" type="{7894072A-9050-4F0F-901B-34B1A0D29417}"/>
<Class name="bool" field="GuidesLocked" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="AZStd::vector" field="TextureAtlases" type="{9FFE44E4-7695-5AA0-8E4B-33276E0E6306}"/>
</Class>
</Class>
<Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
</Class>
<Class name="AZ::Entity" field="RootSliceEntity" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}">
<Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="490321321981" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZStd::string" field="Name" value="490321321981" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}">
<Class name="SliceComponent" field="element" version="3" type="{AFD304E4-1773-47C8-855A-8B622398934F}">
<Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}">
<Class name="AZ::u64" field="Id" value="3726922815403722117" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZStd::vector" field="Entities" type="{21786AF0-2606-5B9A-86EB-0892E2820E6C}">
<Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}">
<Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="507974689835" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZStd::string" field="Name" value="_root" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}">
<Class name="EditorOnlyEntityComponent" field="element" type="{22A16F1D-6D49-422D-AAE9-91AE45B5D3E7}">
<Class name="EditorComponentBase" field="BaseClass1" version="1" type="{D5346BD4-7F20-444E-B370-327ACD03D4A0}">
<Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}">
<Class name="AZ::u64" field="Id" value="629177948652120557" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
<Class name="bool" field="IsEditorOnly" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
</Class>
<Class name="UiTransform2dComponent" field="element" version="2" type="{2751A5A5-3291-4A4D-9FC0-9CB0EB8D1DE6}">
<Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}">
<Class name="AZ::u64" field="Id" value="17222958138602552608" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="Anchors" field="Anchors" type="{65D4346C-FB16-4CB0-9BDC-1185B122C4A9}">
<Class name="float" field="left" value="0.5000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="top" value="0.5000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="right" value="0.5000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="bottom" value="0.5000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
</Class>
<Class name="Offsets" field="Offsets" type="{F681BA9D-245C-4630-B20E-05DD752FAD57}">
<Class name="float" field="left" value="-50.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="top" value="-50.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="right" value="50.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="bottom" value="50.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
</Class>
<Class name="Vector2" field="Pivot" value="0.5000000 0.5000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/>
<Class name="float" field="Rotation" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="Vector2" field="Scale" value="1.0000000 1.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/>
<Class name="bool" field="ScaleToDevice" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
</Class>
<Class name="UiElementComponent" field="element" version="3" type="{4A97D63E-CE7A-45B6-AAE4-102DB4334688}">
<Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}">
<Class name="AZ::u64" field="Id" value="536397889561444175" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="unsigned int" field="Id" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="bool" field="IsEnabled" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsVisibleInEditor" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsSelectableInEditor" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsSelectedInEditor" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsExpandedInEditor" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="AZStd::vector" field="ChildEntityIdOrder" type="{0DE523D9-AEAE-5FC4-9D40-967A2E2B8A62}">
<Class name="ChildEntityIdOrderEntry" field="element" version="1" type="{D6F3CC55-6C7C-4D64-818F-FA3378EC8DA2}">
<Class name="EntityId" field="ChildEntityId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="503679722539" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZ::u64" field="SortIndex" value="0" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="ChildEntityIdOrderEntry" field="element" version="1" type="{D6F3CC55-6C7C-4D64-818F-FA3378EC8DA2}">
<Class name="EntityId" field="ChildEntityId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="499384755243" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZ::u64" field="SortIndex" value="1" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
</Class>
</Class>
<Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
</Class>
</Class>
<Class name="AZStd::list" field="Prefabs" type="{DAD45EB6-5853-5645-B762-3A37F8775E12}">
<Class name="SliceReference" field="element" version="2" type="{F181B80D-44F0-4093-BB0D-C638A9A734BE}">
<Class name="AZStd::unordered_set" field="Instances" type="{989A5786-8D1B-525B-8DE3-6C70A775EA1C}">
<Class name="SliceInstance" field="element" version="3" type="{E6F11FB3-E9BF-43BA-BD78-2A19F51D0ED3}">
<Class name="AZ::Uuid" field="Id" value="{C9C61F98-46FC-449C-BA53-08214DEEADFC}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="AZStd::unordered_map" field="EntityIdMap" type="{D33569A9-EFFC-566C-8CCC-74D6E086A1B0}">
<Class name="AZStd::pair" field="element" type="{30DDE93C-E899-5AB9-856D-FC456D054EDB}">
<Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="303524160664" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="EntityId" field="value2" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="173049141064031" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
<Class name="AZStd::pair" field="element" type="{30DDE93C-E899-5AB9-856D-FC456D054EDB}">
<Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="17165417810190062216" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="EntityId" field="value2" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="173044846096735" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
</Class>
<Class name="DataPatch" field="DataPatch" type="{3A8D5EC9-D70E-41CB-879C-DEF6A6D6ED03}">
<Class name="AZ::Uuid" field="m_targetClassId" value="{05038EF7-9EF7-40D8-A29B-503D85B85AF8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="AZStd::unordered_map" field="m_patch" type="{CF3B3C65-49C0-5199-B671-E75347EB25C2}">
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D000000001475CAB400000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D420000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D00000000A4725F8900000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D408000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE00000000906FD4D4980B9D8C506739BF00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031C43DA906B7DEF4CA89790854106D3F983000000290000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D00000000CA1FD91E00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93DC08000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE000000006CBEEDCEB425F1EE6A39E0D000000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D0000000068E7677A00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D41C000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD49B93DD35000000001475CAB400000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD4F479AF9C00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="0000000003393D80F623C85C474190D0E4E66164E6BF08000000003F0000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EE067E235E00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031F03AAAB3F5C475A669EBCD5FA4DB353C9537175617265330000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD49B93DD350000000068E7677A00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
</Class>
</Class>
<Class name="DataFlagsPerEntity" field="DataFlags" version="1" type="{57FE7B9E-B2AF-4F6F-9F8D-87F671E91C99}">
<Class name="AZStd::unordered_map" field="EntityToDataFlags" type="{CAB9E1F5-761E-54B8-916E-E7FB597E5EDE}"/>
</Class>
</Class>
<Class name="SliceInstance" field="element" version="3" type="{E6F11FB3-E9BF-43BA-BD78-2A19F51D0ED3}">
<Class name="AZ::Uuid" field="Id" value="{AF73D062-8BDF-4F24-8940-EB3AFAE1E446}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="AZStd::unordered_map" field="EntityIdMap" type="{D33569A9-EFFC-566C-8CCC-74D6E086A1B0}">
<Class name="AZStd::pair" field="element" type="{30DDE93C-E899-5AB9-856D-FC456D054EDB}">
<Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="17165417810190062216" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="EntityId" field="value2" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="173036256162143" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
<Class name="AZStd::pair" field="element" type="{30DDE93C-E899-5AB9-856D-FC456D054EDB}">
<Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="303524160664" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="EntityId" field="value2" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="173040551129439" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
</Class>
<Class name="DataPatch" field="DataPatch" type="{3A8D5EC9-D70E-41CB-879C-DEF6A6D6ED03}">
<Class name="AZ::Uuid" field="m_targetClassId" value="{05038EF7-9EF7-40D8-A29B-503D85B85AF8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="AZStd::unordered_map" field="m_patch" type="{CF3B3C65-49C0-5199-B671-E75347EB25C2}">
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE00000000906FD4D4980B9D8C8E4D8598000000005FF194245C9D0000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000038801D6F3CC556C7C4D64818FFA3378EC8DA2C87550A438016383F1D3BB274E6BA49A6409B2059EAA79BF396750D659793347CD4FC8B91163F3E2B0993A0800009D5C2494F15F0000798BF94760D659793347CD4FC8B91163F3E2B0993A080000000000000001000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D000000001475CAB400000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D41A000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D00000000A4725F8900000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D413000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE00000000906FD4D4980B9D8C506739BF00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031C43DA906B7DEF4CA89790854106D3F983000000280000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D00000000CA1FD91E00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D404000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE000000006CBEEDCEB425F1EE6A39E0D000000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D0000000068E7677A00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93DC14000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="6055D5B600000000982473AB46000000FDF548EE000000007A3194BEB95FEE3B" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="000000000388026EA1E03D68B2466D97F783998C8C27F0C8D492573501D5346BD47F20444EB370327ACD03D4A048D4925735EDFCB2CFF75D43BEB26BF35821B2924779BF396750D659793347CD4FC8B91163F3E2B0993A083BEE5FB9BE94317A000000489EDE095CBE163120C1ED5F69A650DC2528A8FF94000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD49B93DD35000000001475CAB400000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D3F8000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD4F479AF9C00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="0000000003393D80F623C85C474190D0E4E66164E6BF083F8000003F0000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE00000000906FD4D4980B9D8C8E4D8598000000005FF194245A9D0000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000038801D6F3CC556C7C4D64818FFA3378EC8DA2C87550A438016383F1D3BB274E6BA49A6409B2059EAA79BF396750D659793347CD4FC8B91163F3E2B0993A0800009D5A2494F15F0000798BF94760D659793347CD4FC8B91163F3E2B0993A080000000000000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE00000000906FD4D4980B9D8C8E4D8598000000005FF19424629D0000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000038801D6F3CC556C7C4D64818FFA3378EC8DA2C87550A438016383F1D3BB274E6BA49A6409B2059EAA79BF396750D659793347CD4FC8B91163F3E2B0993A0800009D622494F15F0000798BF94760D659793347CD4FC8B91163F3E2B0993A080000000000000002000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EE067E235E00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000033903AAAB3F5C475A669EBCD5FA4DB353C908456C6C69707365730000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD49B93DD350000000068E7677A00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D3F8000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="6055D5B600000000982473AB460000004894D49600000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="000000000319A0CA880CAFE443CB926C59AC48496112010000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
</Class>
</Class>
<Class name="DataFlagsPerEntity" field="DataFlags" version="1" type="{57FE7B9E-B2AF-4F6F-9F8D-87F671E91C99}">
<Class name="AZStd::unordered_map" field="EntityToDataFlags" type="{CAB9E1F5-761E-54B8-916E-E7FB597E5EDE}"/>
</Class>
</Class>
<Class name="SliceInstance" field="element" version="3" type="{E6F11FB3-E9BF-43BA-BD78-2A19F51D0ED3}">
<Class name="AZ::Uuid" field="Id" value="{CC680656-DAA9-4068-B289-B5992B34F837}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="AZStd::unordered_map" field="EntityIdMap" type="{D33569A9-EFFC-566C-8CCC-74D6E086A1B0}">
<Class name="AZStd::pair" field="element" type="{30DDE93C-E899-5AB9-856D-FC456D054EDB}">
<Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="303524160664" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="EntityId" field="value2" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="173023371260255" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
<Class name="AZStd::pair" field="element" type="{30DDE93C-E899-5AB9-856D-FC456D054EDB}">
<Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="17165417810190062216" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="EntityId" field="value2" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="173019076292959" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
</Class>
<Class name="DataPatch" field="DataPatch" type="{3A8D5EC9-D70E-41CB-879C-DEF6A6D6ED03}">
<Class name="AZ::Uuid" field="m_targetClassId" value="{05038EF7-9EF7-40D8-A29B-503D85B85AF8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="AZStd::unordered_map" field="m_patch" type="{CF3B3C65-49C0-5199-B671-E75347EB25C2}">
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D000000001475CAB400000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D41A000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D00000000A4725F8900000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D408000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE00000000906FD4D4980B9D8C506739BF00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031C43DA906B7DEF4CA89790854106D3F983000000260000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D00000000CA1FD91E00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93DC08000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE000000006CBEEDCEB425F1EE6A39E0D000000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D311110A90000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D0000000068E7677A00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D414000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD49B93DD35000000001475CAB400000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD4F479AF9C00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="0000000003393D80F623C85C474190D0E4E66164E6BF08000000003F0000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EE067E235E00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031F03AAAB3F5C475A669EBCD5FA4DB353C9537175617265320000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD49B93DD350000000068E7677A00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
</Class>
</Class>
<Class name="DataFlagsPerEntity" field="DataFlags" version="1" type="{57FE7B9E-B2AF-4F6F-9F8D-87F671E91C99}">
<Class name="AZStd::unordered_map" field="EntityToDataFlags" type="{CAB9E1F5-761E-54B8-916E-E7FB597E5EDE}"/>
</Class>
</Class>
<Class name="SliceInstance" field="element" version="3" type="{E6F11FB3-E9BF-43BA-BD78-2A19F51D0ED3}">
<Class name="AZ::Uuid" field="Id" value="{2BCF7DBB-A523-43C9-B7FC-F0B4E1DC2FB2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="AZStd::unordered_map" field="EntityIdMap" type="{D33569A9-EFFC-566C-8CCC-74D6E086A1B0}">
<Class name="AZStd::pair" field="element" type="{30DDE93C-E899-5AB9-856D-FC456D054EDB}">
<Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="303524160664" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="EntityId" field="value2" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="493265449557" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
<Class name="AZStd::pair" field="element" type="{30DDE93C-E899-5AB9-856D-FC456D054EDB}">
<Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="17165417810190062216" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="EntityId" field="value2" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="503679722539" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
</Class>
<Class name="DataPatch" field="DataPatch" type="{3A8D5EC9-D70E-41CB-879C-DEF6A6D6ED03}">
<Class name="AZ::Uuid" field="m_targetClassId" value="{05038EF7-9EF7-40D8-A29B-503D85B85AF8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="AZStd::unordered_map" field="m_patch" type="{CF3B3C65-49C0-5199-B671-E75347EB25C2}">
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D000000001475CAB400000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D00000000A4725F8900000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D0000000068E7677A00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD49B93DD3500000000A4725F8900000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D3F8000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD49B93DD35000000001475CAB400000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D3F8000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EE067E235E00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031F03AAAB3F5C475A669EBCD5FA4DB353C94F7665726C61790000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD49B93DD3500000000CA1FD91E00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D00000000CA1FD91E00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD49B93DD350000000068E7677A00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE000000006CBEEDCEB425F1EEE948566600000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="0000000003397894072A90504F0F901B34B1A0D29417100000000000000000000000003F8000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="6055D5B600000000982473AB46000000FDF548EE00000000D1B5C3A7D2E73C2EC695DCB5000000000000000000000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
</Class>
</Class>
<Class name="DataFlagsPerEntity" field="DataFlags" version="1" type="{57FE7B9E-B2AF-4F6F-9F8D-87F671E91C99}">
<Class name="AZStd::unordered_map" field="EntityToDataFlags" type="{CAB9E1F5-761E-54B8-916E-E7FB597E5EDE}"/>
</Class>
</Class>
<Class name="SliceInstance" field="element" version="3" type="{E6F11FB3-E9BF-43BA-BD78-2A19F51D0ED3}">
<Class name="AZ::Uuid" field="Id" value="{D690C81D-F3DE-4DDB-A71B-A57767049165}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="AZStd::unordered_map" field="EntityIdMap" type="{D33569A9-EFFC-566C-8CCC-74D6E086A1B0}">
<Class name="AZStd::pair" field="element" type="{30DDE93C-E899-5AB9-856D-FC456D054EDB}">
<Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="17165417810190062216" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="EntityId" field="value2" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="173010486358367" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
<Class name="AZStd::pair" field="element" type="{30DDE93C-E899-5AB9-856D-FC456D054EDB}">
<Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="303524160664" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="EntityId" field="value2" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="173014781325663" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
</Class>
<Class name="DataPatch" field="DataPatch" type="{3A8D5EC9-D70E-41CB-879C-DEF6A6D6ED03}">
<Class name="AZ::Uuid" field="m_targetClassId" value="{05038EF7-9EF7-40D8-A29B-503D85B85AF8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="AZStd::unordered_map" field="m_patch" type="{CF3B3C65-49C0-5199-B671-E75347EB25C2}">
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D000000001475CAB400000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D410000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D00000000A4725F8900000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D408000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE00000000906FD4D4980B9D8C506739BF00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031C43DA906B7DEF4CA89790854106D3F983000000250000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="6055D5B600000000982473AB46000000FDF548EE0000000060018B2C38047F9C" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="000000000388026EA1E03D68B2466D97F783998C8C27F0C8D492573501D5346BD47F20444EB370327ACD03D4A048D4925735EDFCB2CFF75D43BEB26BF35821B2924779BF396750D659793347CD4FC8B91163F3E2B0993A089C7F04382C8B0160000000489EDE095CBE163120C1ED5F69A650DC2528A8FF94000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D00000000CA1FD91E00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93DC08000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE000000006CBEEDCEB425F1EE6A39E0D000000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D0000000068E7677A00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD49B93DD35000000001475CAB400000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD4F479AF9C00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="0000000003393D80F623C85C474190D0E4E66164E6BF08000000003F0000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EE067E235E00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031F03AAAB3F5C475A669EBCD5FA4DB353C9537175617265310000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD49B93DD350000000068E7677A00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="6055D5B600000000982473AB460000004894D49600000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="000000000319A0CA880CAFE443CB926C59AC48496112010000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
</Class>
</Class>
<Class name="DataFlagsPerEntity" field="DataFlags" version="1" type="{57FE7B9E-B2AF-4F6F-9F8D-87F671E91C99}">
<Class name="AZStd::unordered_map" field="EntityToDataFlags" type="{CAB9E1F5-761E-54B8-916E-E7FB597E5EDE}"/>
</Class>
</Class>
</Class>
<Class name="Asset" field="Asset" value="id={90D127FB-8BDA-5614-A8D1-C9093693C33D}:1,type={C62C7A87-9C09-4148-A985-12F2C99C0A45},hint={ui/slices/library/image.slice}" version="1" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/>
</Class>
<Class name="SliceReference" field="element" version="2" type="{F181B80D-44F0-4093-BB0D-C638A9A734BE}">
<Class name="AZStd::unordered_set" field="Instances" type="{989A5786-8D1B-525B-8DE3-6C70A775EA1C}">
<Class name="SliceInstance" field="element" version="3" type="{E6F11FB3-E9BF-43BA-BD78-2A19F51D0ED3}">
<Class name="AZ::Uuid" field="Id" value="{4B4394FA-83B6-4B59-981A-441299E0C15B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="AZStd::unordered_map" field="EntityIdMap" type="{D33569A9-EFFC-566C-8CCC-74D6E086A1B0}">
<Class name="AZStd::pair" field="element" type="{30DDE93C-E899-5AB9-856D-FC456D054EDB}">
<Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="505568969844" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="EntityId" field="value2" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="1440888608533" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
<Class name="AZStd::pair" field="element" type="{30DDE93C-E899-5AB9-856D-FC456D054EDB}">
<Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="17165234896122860168" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="EntityId" field="value2" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="499384755243" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
</Class>
<Class name="DataPatch" field="DataPatch" type="{3A8D5EC9-D70E-41CB-879C-DEF6A6D6ED03}">
<Class name="AZ::Uuid" field="m_targetClassId" value="{05038EF7-9EF7-40D8-A29B-503D85B85AF8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="AZStd::unordered_map" field="m_patch" type="{CF3B3C65-49C0-5199-B671-E75347EB25C2}">
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55312A37EEFDF548EE0000000055C5CE3C46E5952AE948566600000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="0000000003397894072A90504F0F901B34B1A0D29417103F8000003F8000003F8000003F8000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55312A37EEFDF548EE00000000AAF2759DDC7365AE1517849D00000000A4725F8900000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D420C00000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55312A37EEFDF548EE00000000AAF2759DDC7365AE1517849D000000001475CAB400000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D42F000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55312A37EEFDF548EE00000000AAF2759DDC7365AE1517849D00000000CA1FD91E00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93DC20C00000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55312A37EEFDF548EE000000001A95685107F56D698E4D8598000000005FF19424609D0000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000038801D6F3CC556C7C4D64818FFA3378EC8DA2C87550A438016383F1D3BB274E6BA49A6409B2059EAA79BF396750D659793347CD4FC8B91163F3E2B0993A0800009D602494F15F0000798BF94760D659793347CD4FC8B91163F3E2B0993A080000000000000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55312A37EEFDF548EE000000001A95685107F56D69506739BF00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031C43DA906B7DEF4CA89790854106D3F983000000030000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55312A37EEFDF548EE00000000AAF2759DDC7365AE1517849D0000000068E7677A00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93DC2F000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55312A37EEFDF548EE0000000055C5CE3C46E5952A6FFDDE4400000000355792D4000000007951352C00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000033903AAAB3F5C475A669EBCD5FA4DB353C93475692F666F6E74732F6C797368696E656578616D706C65732F6E6F746F73616E732F6E6F746F73616E732D626F6C642E666F6E740000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55312A37EEFDF548EE0000000055C5CE3C46E5952AC7A78B3B00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000033903AAAB3F5C475A669EBCD5FA4DB353C90D4C4F4144494E47204C4556454C0000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
</Class>
</Class>
<Class name="DataFlagsPerEntity" field="DataFlags" version="1" type="{57FE7B9E-B2AF-4F6F-9F8D-87F671E91C99}">
<Class name="AZStd::unordered_map" field="EntityToDataFlags" type="{CAB9E1F5-761E-54B8-916E-E7FB597E5EDE}"/>
</Class>
</Class>
</Class>
<Class name="Asset" field="Asset" value="id={A08D4A26-B122-5155-9C36-4A2E8CBEA40D}:1,type={C62C7A87-9C09-4148-A985-12F2C99C0A45},hint={ui/slices/library/text.slice}" version="1" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/>
</Class>
</Class>
<Class name="bool" field="IsDynamic" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="AZ::Entity" field="MetadataEntity" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}">
<Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="494616289277" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZStd::string" field="Name" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}">
<Class name="SliceMetadataInfoComponent" field="element" version="1" type="{25EE4D75-8A17-4449-81F4-E561005BAABD}">
<Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}">
<Class name="AZ::u64" field="Id" value="16892350864321405468" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZStd::unordered_set" field="AssociatedIds" type="{6C8F8E52-AB4A-5C1F-8E56-9AC390290B94}"/>
<Class name="EntityId" field="ParentId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="4294967295" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZStd::unordered_set" field="ChildrenIds" type="{6C8F8E52-AB4A-5C1F-8E56-9AC390290B94}"/>
<Class name="bool" field="PersistenceFlag" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
</Class>
</Class>
<Class name="bool" field="IsDependencyReady" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
</Class>
<Class name="DataFlagsPerEntity" field="DataFlagsForNewEntities" version="1" type="{57FE7B9E-B2AF-4F6F-9F8D-87F671E91C99}">
<Class name="AZStd::unordered_map" field="EntityToDataFlags" type="{CAB9E1F5-761E-54B8-916E-E7FB597E5EDE}"/>
</Class>
</Class>
</Class>
<Class name="bool" field="IsDependencyReady" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
</Class>
</Class>
</ObjectStream>
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,307 @@
<ObjectStream version="3">
<Class name="UiCanvasFileObject" version="2" type="{1F02632F-F113-49B1-85AD-8CD0FA78B8AA}">
<Class name="AZ::Entity" field="CanvasEntity" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}">
<Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="486026354685" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZStd::string" field="Name" value="UiCanvasEntity" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}">
<Class name="UiCanvasComponent" field="element" version="3" type="{50B8CF6C-B19A-4D86-AFE9-96EFB820D422}">
<Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}">
<Class name="AZ::u64" field="Id" value="1603609649560984289" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZ::u64" field="UniqueId" value="7264708555779884587" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
<Class name="EntityId" field="RootElement" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="498911256573" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="unsigned int" field="LastElement" value="23" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="Vector2" field="CanvasSize" value="1920.0000000 1080.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/>
<Class name="bool" field="IsSnapEnabled" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="int" field="DrawOrder" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
<Class name="bool" field="IsPixelAligned" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsTextPixelAligned" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="RenderToTexture" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="AZStd::string" field="RenderTargetName" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="bool" field="IsPosInputSupported" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsConsumingAllInput" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsMultiTouchSupported" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsNavigationSupported" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="EntityId" field="FirstHoverElement" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="4294967295" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="UiAnimationSystem" field="AnimSystem" version="1" type="{2592269B-EF74-4409-B29F-682DC0B45DAF}">
<Class name="AZStd::vector" field="Sequences" type="{9F8D44A9-9731-5314-885E-B958D4216073}"/>
</Class>
<Class name="AnimationData" field="AnimationData" version="1" type="{FDC58CF7-8109-48F2-8D5D-BCBAF774ABB7}">
<Class name="AZStd::string" field="SerializeString" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="EntityId" field="TooltipDisplayElement" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="4294967295" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="float" field="SnapDistance" value="10.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="SnapRotationDegrees" value="10.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="AZStd::vector" field="HorizontalGuides" type="{6106BF95-5ACD-5071-8D0E-4F846C2138AD}"/>
<Class name="AZStd::vector" field="VerticalGuides" type="{6106BF95-5ACD-5071-8D0E-4F846C2138AD}"/>
<Class name="Color" field="GuideColor" value="0.2500000 1.0000000 0.2500000 1.0000000" type="{7894072A-9050-4F0F-901B-34B1A0D29417}"/>
<Class name="bool" field="GuidesLocked" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="AZStd::vector" field="TextureAtlases" type="{9FFE44E4-7695-5AA0-8E4B-33276E0E6306}"/>
</Class>
</Class>
<Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
</Class>
<Class name="AZ::Entity" field="RootSliceEntity" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}">
<Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="490321321981" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZStd::string" field="Name" value="490321321981" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}">
<Class name="SliceComponent" field="element" version="3" type="{AFD304E4-1773-47C8-855A-8B622398934F}">
<Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}">
<Class name="AZ::u64" field="Id" value="3726922815403722117" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZStd::vector" field="Entities" type="{21786AF0-2606-5B9A-86EB-0892E2820E6C}">
<Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}">
<Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="498911256573" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZStd::string" field="Name" value="_root" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}">
<Class name="EditorOnlyEntityComponent" field="element" type="{22A16F1D-6D49-422D-AAE9-91AE45B5D3E7}">
<Class name="EditorComponentBase" field="BaseClass1" version="1" type="{D5346BD4-7F20-444E-B370-327ACD03D4A0}">
<Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}">
<Class name="AZ::u64" field="Id" value="6865974663242096465" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
<Class name="bool" field="IsEditorOnly" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
</Class>
<Class name="UiTransform2dComponent" field="element" version="2" type="{2751A5A5-3291-4A4D-9FC0-9CB0EB8D1DE6}">
<Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}">
<Class name="AZ::u64" field="Id" value="17222958138602552608" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="Anchors" field="Anchors" type="{65D4346C-FB16-4CB0-9BDC-1185B122C4A9}">
<Class name="float" field="left" value="0.5000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="top" value="0.5000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="right" value="0.5000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="bottom" value="0.5000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
</Class>
<Class name="Offsets" field="Offsets" type="{F681BA9D-245C-4630-B20E-05DD752FAD57}">
<Class name="float" field="left" value="-50.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="top" value="-50.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="right" value="50.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="bottom" value="50.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
</Class>
<Class name="Vector2" field="Pivot" value="0.5000000 0.5000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/>
<Class name="float" field="Rotation" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="Vector2" field="Scale" value="1.0000000 1.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/>
<Class name="bool" field="ScaleToDevice" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
</Class>
<Class name="UiElementComponent" field="element" version="3" type="{4A97D63E-CE7A-45B6-AAE4-102DB4334688}">
<Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}">
<Class name="AZ::u64" field="Id" value="536397889561444175" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="unsigned int" field="Id" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="bool" field="IsEnabled" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsVisibleInEditor" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsSelectableInEditor" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsSelectedInEditor" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsExpandedInEditor" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="AZStd::vector" field="ChildEntityIdOrder" type="{0DE523D9-AEAE-5FC4-9D40-967A2E2B8A62}">
<Class name="ChildEntityIdOrderEntry" field="element" version="1" type="{D6F3CC55-6C7C-4D64-818F-FA3378EC8DA2}">
<Class name="EntityId" field="ChildEntityId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="740791203474" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZ::u64" field="SortIndex" value="0" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
</Class>
</Class>
<Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
</Class>
</Class>
<Class name="AZStd::list" field="Prefabs" type="{DAD45EB6-5853-5645-B762-3A37F8775E12}">
<Class name="SliceReference" field="element" version="2" type="{F181B80D-44F0-4093-BB0D-C638A9A734BE}">
<Class name="AZStd::unordered_set" field="Instances" type="{989A5786-8D1B-525B-8DE3-6C70A775EA1C}">
<Class name="SliceInstance" field="element" version="3" type="{E6F11FB3-E9BF-43BA-BD78-2A19F51D0ED3}">
<Class name="AZ::Uuid" field="Id" value="{C5E2C16B-B261-4A51-8FFE-4FB708870FD2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="AZStd::unordered_map" field="EntityIdMap" type="{D33569A9-EFFC-566C-8CCC-74D6E086A1B0}">
<Class name="AZStd::pair" field="element" type="{30DDE93C-E899-5AB9-856D-FC456D054EDB}">
<Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="300860693116" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="EntityId" field="value2" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="178331285950963" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
<Class name="AZStd::pair" field="element" type="{30DDE93C-E899-5AB9-856D-FC456D054EDB}">
<Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="318040562300" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="EntityId" field="value2" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="178326990983667" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
<Class name="AZStd::pair" field="element" type="{30DDE93C-E899-5AB9-856D-FC456D054EDB}">
<Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="17165428100931703432" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="EntityId" field="value2" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="740791203474" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
<Class name="AZStd::pair" field="element" type="{30DDE93C-E899-5AB9-856D-FC456D054EDB}">
<Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="313745595004" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="EntityId" field="value2" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="178322696016371" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
</Class>
<Class name="DataPatch" field="DataPatch" type="{3A8D5EC9-D70E-41CB-879C-DEF6A6D6ED03}">
<Class name="AZ::Uuid" field="m_targetClassId" value="{05038EF7-9EF7-40D8-A29B-503D85B85AF8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="AZStd::unordered_map" field="m_patch" type="{CF3B3C65-49C0-5199-B671-E75347EB25C2}">
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55E9D937EEFDF548EE00000000680A66C3D6B68879355792D4000000008C482AFD000000000000000000000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="6055D5B6000000007CDAB10C4A000000FDF548EE00000000D8D301B39ED247A9C695DCB5000000000000000000000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55E9D937EEFDF548EE0000000014DF03983275CBD41517849D00000000A4725F8900000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D42A000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55E9D937EEFDF548EE0000000014DF03983275CBD4F479AF9C00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="0000000003393D80F623C85C474190D0E4E66164E6BF083F800000000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55E9D937EEFDF548EE00000000680A66C3D6B68879355792D4000000008C482AFD000000000200000000000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55E9D937EEFDF548EE0000000014DF03983275CBD41517849D00000000CA1FD91E00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D800000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55E9D937EEFDF548EE00000000680A66C3D6B68879355792D4000000008C482AFD000000000100000000000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55E9D937EEFDF548EE00000000680A66C3D6B68879BCF9B22E00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000033903AAAB3F5C475A669EBCD5FA4DB353C9144F6E5061757365427574746F6E436C69636B65640000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55E9D937EEFDF548EE000000006CBEEDCEB425F1EE1AE97D1500000000355792D4000000007951352C00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000033903AAAB3F5C475A669EBCD5FA4DB353C92475692F74657874757265732F64656661756C745F70617573655F627574746F6E2E6464730000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55E9D937EE067E235E00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000033903AAAB3F5C475A669EBCD5FA4DB353C90B5061757365427574746F6E0000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A554DDB37EE" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55E9D937EEFDF548EE0000000014DF03983275CBD41517849D0000000068E7677A00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93DC2A000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55E9D937EEFDF548EE00000000906FD4D4980B9D8C8E4D85980000000088D28A554DDB37EE" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55E9D937EEFDF548EE000000006CBEEDCEB425F1EEE948566600000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="0000000003397894072A90504F0F901B34B1A0D29417103F8000003F8000003F8000003F8000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55E9D937EEFDF548EE0000000014DF03983275CBD49B93DD3500000000A4725F8900000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D3D4CCCCD0000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55E9D937EEFDF548EE0000000014DF03983275CBD41517849D000000001475CAB400000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55E9D937EEFDF548EE0000000014DF03983275CBD49635FAF600000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="000000000319A0CA880CAFE443CB926C59AC48496112010000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55E9D937EEFDF548EE00000000906FD4D4980B9D8C506739BF00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031C43DA906B7DEF4CA89790854106D3F983000000160000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55E9D937EEFDF548EE0000000014DF03983275CBD49B93DD3500000000CA1FD91E00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D3D4CCCCD0000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55E9D937EEFDF548EE00000000680A66C3D6B68879355792D400000000CB4F8FD700000000BADC4F8200000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031C72039442EB384D42A1ADCB68F7E0EEF6000000020000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55E9D937EEFDF548EE00000000680A66C3D6B68879355792D400000000E92AAB93000000000000000000000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55E9D937EEFDF548EE0000000014DF03983275CBD49B93DD350000000068E7677A00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D3F7333330000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55E9D937EEFDF548EE0000000014DF03983275CBD49B93DD35000000001475CAB400000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D3F7333330000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55E9D937EEFDF548EE00000000680A66C3D6B68879355792D4000000000EC5E040000000000000000000000000E948566600000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="0000000003397894072A90504F0F901B34B1A0D29417103EFEFEFF3EFEFEFF3EFEFEFF3F8000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55E9D937EEFDF548EE000000006CBEEDCEB425F1EE809E5F9900000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031C72039442EB384D42A1ADCB68F7E0EEF6000000050000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
</Class>
</Class>
<Class name="DataFlagsPerEntity" field="DataFlags" version="1" type="{57FE7B9E-B2AF-4F6F-9F8D-87F671E91C99}">
<Class name="AZStd::unordered_map" field="EntityToDataFlags" type="{CAB9E1F5-761E-54B8-916E-E7FB597E5EDE}"/>
</Class>
</Class>
</Class>
<Class name="Asset" field="Asset" value="id={A2D6A29A-58DC-57D2-9F11-532BB838EFBE}:1,type={C62C7A87-9C09-4148-A985-12F2C99C0A45},hint={ui/slices/library/button.slice}" version="1" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/>
</Class>
</Class>
<Class name="bool" field="IsDynamic" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="AZ::Entity" field="MetadataEntity" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}">
<Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="494616289277" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZStd::string" field="Name" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}">
<Class name="SliceMetadataInfoComponent" field="element" version="1" type="{25EE4D75-8A17-4449-81F4-E561005BAABD}">
<Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}">
<Class name="AZ::u64" field="Id" value="16892350864321405468" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZStd::unordered_set" field="AssociatedIds" type="{6C8F8E52-AB4A-5C1F-8E56-9AC390290B94}"/>
<Class name="EntityId" field="ParentId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="4294967295" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZStd::unordered_set" field="ChildrenIds" type="{6C8F8E52-AB4A-5C1F-8E56-9AC390290B94}"/>
<Class name="bool" field="PersistenceFlag" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
</Class>
</Class>
<Class name="bool" field="IsDependencyReady" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
</Class>
<Class name="DataFlagsPerEntity" field="DataFlagsForNewEntities" version="1" type="{57FE7B9E-B2AF-4F6F-9F8D-87F671E91C99}">
<Class name="AZStd::unordered_map" field="EntityToDataFlags" type="{CAB9E1F5-761E-54B8-916E-E7FB597E5EDE}"/>
</Class>
</Class>
</Class>
<Class name="bool" field="IsDependencyReady" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
</Class>
</Class>
</ObjectStream>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,481 @@
<ObjectStream version="3">
<Class name="UiCanvasFileObject" version="2" type="{1F02632F-F113-49B1-85AD-8CD0FA78B8AA}">
<Class name="AZ::Entity" field="CanvasEntity" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}">
<Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="689269331733" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZStd::string" field="Name" value="UiCanvasEntity" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}">
<Class name="UiCanvasComponent" field="element" version="3" type="{50B8CF6C-B19A-4D86-AFE9-96EFB820D422}">
<Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}">
<Class name="AZ::u64" field="Id" value="1603609649560984289" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZ::u64" field="UniqueId" value="7264708555779884587" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
<Class name="EntityId" field="RootElement" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="680679397141" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="unsigned int" field="LastElement" value="34" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="Vector2" field="CanvasSize" value="1920.0000000 1080.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/>
<Class name="bool" field="IsSnapEnabled" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="int" field="DrawOrder" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
<Class name="bool" field="IsPixelAligned" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsTextPixelAligned" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="RenderToTexture" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="AZStd::string" field="RenderTargetName" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="bool" field="IsPosInputSupported" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsConsumingAllInput" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsMultiTouchSupported" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsNavigationSupported" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="EntityId" field="FirstHoverElement" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="4294967295" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="UiAnimationSystem" field="AnimSystem" version="1" type="{2592269B-EF74-4409-B29F-682DC0B45DAF}">
<Class name="AZStd::vector" field="Sequences" type="{9F8D44A9-9731-5314-885E-B958D4216073}"/>
</Class>
<Class name="AnimationData" field="AnimationData" version="1" type="{FDC58CF7-8109-48F2-8D5D-BCBAF774ABB7}">
<Class name="AZStd::string" field="SerializeString" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="EntityId" field="TooltipDisplayElement" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="4294967295" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="float" field="SnapDistance" value="10.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="SnapRotationDegrees" value="10.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="AZStd::vector" field="HorizontalGuides" type="{6106BF95-5ACD-5071-8D0E-4F846C2138AD}"/>
<Class name="AZStd::vector" field="VerticalGuides" type="{6106BF95-5ACD-5071-8D0E-4F846C2138AD}"/>
<Class name="Color" field="GuideColor" value="0.2500000 1.0000000 0.2500000 1.0000000" type="{7894072A-9050-4F0F-901B-34B1A0D29417}"/>
<Class name="bool" field="GuidesLocked" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="AZStd::vector" field="TextureAtlases" type="{9FFE44E4-7695-5AA0-8E4B-33276E0E6306}"/>
</Class>
</Class>
<Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
</Class>
<Class name="AZ::Entity" field="RootSliceEntity" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}">
<Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="490321321981" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZStd::string" field="Name" value="490321321981" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}">
<Class name="SliceComponent" field="element" version="3" type="{AFD304E4-1773-47C8-855A-8B622398934F}">
<Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}">
<Class name="AZ::u64" field="Id" value="3726922815403722117" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZStd::vector" field="Entities" type="{21786AF0-2606-5B9A-86EB-0892E2820E6C}">
<Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}">
<Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="680679397141" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZStd::string" field="Name" value="_root" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}">
<Class name="EditorOnlyEntityComponent" field="element" type="{22A16F1D-6D49-422D-AAE9-91AE45B5D3E7}">
<Class name="EditorComponentBase" field="BaseClass1" version="1" type="{D5346BD4-7F20-444E-B370-327ACD03D4A0}">
<Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}">
<Class name="AZ::u64" field="Id" value="629177948652120557" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
<Class name="bool" field="IsEditorOnly" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
</Class>
<Class name="UiTransform2dComponent" field="element" version="2" type="{2751A5A5-3291-4A4D-9FC0-9CB0EB8D1DE6}">
<Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}">
<Class name="AZ::u64" field="Id" value="17222958138602552608" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="Anchors" field="Anchors" type="{65D4346C-FB16-4CB0-9BDC-1185B122C4A9}">
<Class name="float" field="left" value="0.5000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="top" value="0.5000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="right" value="0.5000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="bottom" value="0.5000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
</Class>
<Class name="Offsets" field="Offsets" type="{F681BA9D-245C-4630-B20E-05DD752FAD57}">
<Class name="float" field="left" value="-50.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="top" value="-50.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="right" value="50.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="float" field="bottom" value="50.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
</Class>
<Class name="Vector2" field="Pivot" value="0.5000000 0.5000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/>
<Class name="float" field="Rotation" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
<Class name="Vector2" field="Scale" value="1.0000000 1.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/>
<Class name="bool" field="ScaleToDevice" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
</Class>
<Class name="UiElementComponent" field="element" version="3" type="{4A97D63E-CE7A-45B6-AAE4-102DB4334688}">
<Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}">
<Class name="AZ::u64" field="Id" value="536397889561444175" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="unsigned int" field="Id" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="bool" field="IsEnabled" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsVisibleInEditor" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsSelectableInEditor" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsSelectedInEditor" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsExpandedInEditor" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="AZStd::vector" field="ChildEntityIdOrder" type="{0DE523D9-AEAE-5FC4-9D40-967A2E2B8A62}">
<Class name="ChildEntityIdOrderEntry" field="element" version="1" type="{D6F3CC55-6C7C-4D64-818F-FA3378EC8DA2}">
<Class name="EntityId" field="ChildEntityId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="676384429845" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZ::u64" field="SortIndex" value="0" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="ChildEntityIdOrderEntry" field="element" version="1" type="{D6F3CC55-6C7C-4D64-818F-FA3378EC8DA2}">
<Class name="EntityId" field="ChildEntityId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="47798639890931" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZ::u64" field="SortIndex" value="1" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
</Class>
</Class>
<Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
</Class>
</Class>
<Class name="AZStd::list" field="Prefabs" type="{DAD45EB6-5853-5645-B762-3A37F8775E12}">
<Class name="SliceReference" field="element" version="2" type="{F181B80D-44F0-4093-BB0D-C638A9A734BE}">
<Class name="AZStd::unordered_set" field="Instances" type="{989A5786-8D1B-525B-8DE3-6C70A775EA1C}">
<Class name="SliceInstance" field="element" version="3" type="{E6F11FB3-E9BF-43BA-BD78-2A19F51D0ED3}">
<Class name="AZ::Uuid" field="Id" value="{2BCF7DBB-A523-43C9-B7FC-F0B4E1DC2FB2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="AZStd::unordered_map" field="EntityIdMap" type="{D33569A9-EFFC-566C-8CCC-74D6E086A1B0}">
<Class name="AZStd::pair" field="element" type="{30DDE93C-E899-5AB9-856D-FC456D054EDB}">
<Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="303524160664" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="EntityId" field="value2" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="493265449557" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
<Class name="AZStd::pair" field="element" type="{30DDE93C-E899-5AB9-856D-FC456D054EDB}">
<Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="17165417810190062216" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="EntityId" field="value2" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="676384429845" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
</Class>
<Class name="DataPatch" field="DataPatch" type="{3A8D5EC9-D70E-41CB-879C-DEF6A6D6ED03}">
<Class name="AZ::Uuid" field="m_targetClassId" value="{05038EF7-9EF7-40D8-A29B-503D85B85AF8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="AZStd::unordered_map" field="m_patch" type="{CF3B3C65-49C0-5199-B671-E75347EB25C2}">
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D000000001475CAB400000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D00000000A4725F8900000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D0000000068E7677A00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD49B93DD3500000000A4725F8900000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D3F8000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD49B93DD35000000001475CAB400000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D3F8000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EE067E235E00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031F03AAAB3F5C475A669EBCD5FA4DB353C94F7665726C61790000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD49B93DD3500000000CA1FD91E00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D00000000CA1FD91E00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD49B93DD350000000068E7677A00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE000000006CBEEDCEB425F1EEE948566600000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="0000000003397894072A90504F0F901B34B1A0D29417100000000000000000000000003F8000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="6055D5B600000000982473AB46000000FDF548EE00000000D1B5C3A7D2E73C2EC695DCB5000000000000000000000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
</Class>
</Class>
<Class name="DataFlagsPerEntity" field="DataFlags" version="1" type="{57FE7B9E-B2AF-4F6F-9F8D-87F671E91C99}">
<Class name="AZStd::unordered_map" field="EntityToDataFlags" type="{CAB9E1F5-761E-54B8-916E-E7FB597E5EDE}"/>
</Class>
</Class>
<Class name="SliceInstance" field="element" version="3" type="{E6F11FB3-E9BF-43BA-BD78-2A19F51D0ED3}">
<Class name="AZ::Uuid" field="Id" value="{EDB743E6-379B-405C-A0AF-8669AB71BBA7}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="AZStd::unordered_map" field="EntityIdMap" type="{D33569A9-EFFC-566C-8CCC-74D6E086A1B0}">
<Class name="AZStd::pair" field="element" type="{30DDE93C-E899-5AB9-856D-FC456D054EDB}">
<Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="303524160664" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="EntityId" field="value2" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="1419413772053" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
<Class name="AZStd::pair" field="element" type="{30DDE93C-E899-5AB9-856D-FC456D054EDB}">
<Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="17165417810190062216" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="EntityId" field="value2" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="1393643968277" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
</Class>
<Class name="DataPatch" field="DataPatch" type="{3A8D5EC9-D70E-41CB-879C-DEF6A6D6ED03}">
<Class name="AZ::Uuid" field="m_targetClassId" value="{05038EF7-9EF7-40D8-A29B-503D85B85AF8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="AZStd::unordered_map" field="m_patch" type="{CF3B3C65-49C0-5199-B671-E75347EB25C2}">
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD4F479AF9C00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="0000000003393D80F623C85C474190D0E4E66164E6BF083F000000000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE000000006CBEEDCEB425F1EE809E5F9900000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031C72039442EB384D42A1ADCB68F7E0EEF6000000020000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D000000001475CAB400000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D4392C0000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D00000000A4725F8900000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D43C400000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE00000000906FD4D4980B9D8C506739BF00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031C43DA906B7DEF4CA89790854106D3F983000000210000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D0000000068E7677A00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93DC392C0000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE000000006CBEEDCEB425F1EE1AE97D1500000000355792D4000000007951352C00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000033903AAAB3F5C475A669EBCD5FA4DB353C91C75692F74657874757265732F696D675F6C796265617665722E6464730000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD49B93DD3500000000A4725F8900000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD49B93DD3500000000CA1FD91E00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D00000000CA1FD91E00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D800000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
</Class>
</Class>
<Class name="DataFlagsPerEntity" field="DataFlags" version="1" type="{57FE7B9E-B2AF-4F6F-9F8D-87F671E91C99}">
<Class name="AZStd::unordered_map" field="EntityToDataFlags" type="{CAB9E1F5-761E-54B8-916E-E7FB597E5EDE}"/>
</Class>
</Class>
<Class name="SliceInstance" field="element" version="3" type="{E6F11FB3-E9BF-43BA-BD78-2A19F51D0ED3}">
<Class name="AZ::Uuid" field="Id" value="{7B838250-7B0C-47D6-9F89-ECFE289355CA}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="AZStd::unordered_map" field="EntityIdMap" type="{D33569A9-EFFC-566C-8CCC-74D6E086A1B0}">
<Class name="AZStd::pair" field="element" type="{30DDE93C-E899-5AB9-856D-FC456D054EDB}">
<Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="17165417810190062216" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="EntityId" field="value2" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="47798639890931" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
<Class name="AZStd::pair" field="element" type="{30DDE93C-E899-5AB9-856D-FC456D054EDB}">
<Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="303524160664" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="EntityId" field="value2" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="47802934858227" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
</Class>
<Class name="DataPatch" field="DataPatch" type="{3A8D5EC9-D70E-41CB-879C-DEF6A6D6ED03}">
<Class name="AZ::Uuid" field="m_targetClassId" value="{05038EF7-9EF7-40D8-A29B-503D85B85AF8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="AZStd::unordered_map" field="m_patch" type="{CF3B3C65-49C0-5199-B671-E75347EB25C2}">
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EE067E235E00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031E03AAAB3F5C475A669EBCD5FA4DB353C94C61796F75740000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE00000000906FD4D4980B9D8C8E4D8598000000001557A77B9C000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000038801D6F3CC556C7C4D64818FFA3378EC8DA2C87550A438016383F1D3BB274E6BA49A6409B2059EAA79BF396750D659793347CD4FC8B91163F3E2B0993A080000009C7BA757150000798BF94760D659793347CD4FC8B91163F3E2B0993A080000000000000001000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="6055D5B600000000982473AB460000004894D49600000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="000000000319A0CA880CAFE443CB926C59AC48496112010000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD49635FAF600000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="000000000319A0CA880CAFE443CB926C59AC48496112010000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D000000001475CAB400000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D43AF00000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D00000000A4725F8900000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D437A00000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE00000000906FD4D4980B9D8C506739BF00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031C43DA906B7DEF4CA89790854106D3F983000000220000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D00000000CA1FD91E00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93DC37A00000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE000000006CBEEDCEB425F1EE6A39E0D000000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE0000000014DF03983275CBD41517849D0000000068E7677A00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93DC3AF00000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A558DD037EEFDF548EE00000000906FD4D4980B9D8C8E4D8598000000001557A77B44010000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000038801D6F3CC556C7C4D64818FFA3378EC8DA2C87550A438016383F1D3BB274E6BA49A6409B2059EAA79BF396750D659793347CD4FC8B91163F3E2B0993A08000001447BA757150000798BF94760D659793347CD4FC8B91163F3E2B0993A080000000000000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="6055D5B600000000982473AB46000000FDF548EE00000000EDCA3231404D737F" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="000000000388026EA1E03D68B2466D97F783998C8C27F0C8D492573501D5346BD47F20444EB370327ACD03D4A048D4925735EDFCB2CFF75D43BEB26BF35821B2924779BF396750D659793347CD4FC8B91163F3E2B0993A087F734D403132CAED000000489EDE095CBE163120C1ED5F69A650DC2528A8FF94000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
</Class>
</Class>
<Class name="DataFlagsPerEntity" field="DataFlags" version="1" type="{57FE7B9E-B2AF-4F6F-9F8D-87F671E91C99}">
<Class name="AZStd::unordered_map" field="EntityToDataFlags" type="{CAB9E1F5-761E-54B8-916E-E7FB597E5EDE}"/>
</Class>
</Class>
</Class>
<Class name="Asset" field="Asset" value="id={90D127FB-8BDA-5614-A8D1-C9093693C33D}:1,type={C62C7A87-9C09-4148-A985-12F2C99C0A45},hint={ui/slices/library/image.slice}" version="1" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/>
</Class>
<Class name="SliceReference" field="element" version="2" type="{F181B80D-44F0-4093-BB0D-C638A9A734BE}">
<Class name="AZStd::unordered_set" field="Instances" type="{989A5786-8D1B-525B-8DE3-6C70A775EA1C}">
<Class name="SliceInstance" field="element" version="3" type="{E6F11FB3-E9BF-43BA-BD78-2A19F51D0ED3}">
<Class name="AZ::Uuid" field="Id" value="{4B4394FA-83B6-4B59-981A-441299E0C15B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="AZStd::unordered_map" field="EntityIdMap" type="{D33569A9-EFFC-566C-8CCC-74D6E086A1B0}">
<Class name="AZStd::pair" field="element" type="{30DDE93C-E899-5AB9-856D-FC456D054EDB}">
<Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="505568969844" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="EntityId" field="value2" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="1410823837461" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
<Class name="AZStd::pair" field="element" type="{30DDE93C-E899-5AB9-856D-FC456D054EDB}">
<Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="17165234896122860168" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="EntityId" field="value2" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="672089462549" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
</Class>
</Class>
<Class name="DataPatch" field="DataPatch" type="{3A8D5EC9-D70E-41CB-879C-DEF6A6D6ED03}">
<Class name="AZ::Uuid" field="m_targetClassId" value="{05038EF7-9EF7-40D8-A29B-503D85B85AF8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="AZStd::unordered_map" field="m_patch" type="{CF3B3C65-49C0-5199-B671-E75347EB25C2}">
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55312A37EEFDF548EE00000000AAF2759DDC7365AEF479AF9C00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="0000000003393D80F623C85C474190D0E4E66164E6BF083F0000003F8000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55312A37EEFDF548EE0000000055C5CE3C46E5952A18D3468500000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D3F8000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55312A37EEFDF548EE00000000AAF2759DDC7365AE1517849D000000001475CAB400000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55312A37EEFDF548EE0000000055C5CE3C46E5952A0A9970E600000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D422000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55312A37EEFDF548EE00000000AAF2759DDC7365AE1517849D0000000068E7677A00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55312A37EEFDF548EE0000000055C5CE3C46E5952A6FFDDE4400000000355792D4000000007951352C00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000033903AAAB3F5C475A669EBCD5FA4DB353C93475692F666F6E74732F6C797368696E656578616D706C65732F6E6F746F73616E732F6E6F746F73616E732D626F6C642E666F6E740000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55312A37EEFDF548EE0000000055C5CE3C46E5952AC7A78B3B00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000033903AAAB3F5C475A669EBCD5FA4DB353C920505245535320414E59204B4559204F5220425554544F4E20544F2053544152540000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55312A37EEFDF548EE00000000AAF2759DDC7365AE9B93DD35000000001475CAB400000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D3F8000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55312A37EEFDF548EE00000000AAF2759DDC7365AE9B93DD3500000000A4725F8900000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D3F8000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55312A37EEFDF548EE00000000AAF2759DDC7365AE1517849D00000000CA1FD91E00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93DC24800000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55312A37EEFDF548EE000000001A95685107F56D69506739BF00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031C43DA906B7DEF4CA89790854106D3F983000000030000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55312A37EEFDF548EE00000000AAF2759DDC7365AE9B93DD3500000000CA1FD91E00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D3F8000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55312A37EEFDF548EE00000000AAF2759DDC7365AE1517849D00000000A4725F8900000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55312A37EEFDF548EE00000000AAF2759DDC7365AE9B93DD350000000068E7677A00000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="00000000031CEA2C3E90AFBE44D4A90DFAAF79BAF93D000000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
<Class name="AZStd::pair" field="element" type="{07DEDB71-0585-5BE6-83FF-1C9029B9E5DB}">
<Class name="AddressType" field="value1" value="E564EC500000000088D28A55312A37EEFDF548EE0000000055C5CE3C46E5952AE948566600000000" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
<Class name="ByteStream" field="value2" value="0000000003397894072A90504F0F901B34B1A0D29417103F8000003F8000003F8000003F8000000000" type="{ADFD596B-7177-5519-9752-BC418FE42963}"/>
</Class>
</Class>
</Class>
<Class name="DataFlagsPerEntity" field="DataFlags" version="1" type="{57FE7B9E-B2AF-4F6F-9F8D-87F671E91C99}">
<Class name="AZStd::unordered_map" field="EntityToDataFlags" type="{CAB9E1F5-761E-54B8-916E-E7FB597E5EDE}"/>
</Class>
</Class>
</Class>
<Class name="Asset" field="Asset" value="id={A08D4A26-B122-5155-9C36-4A2E8CBEA40D}:1,type={C62C7A87-9C09-4148-A985-12F2C99C0A45},hint={ui/slices/library/text.slice}" version="1" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/>
</Class>
</Class>
<Class name="bool" field="IsDynamic" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="AZ::Entity" field="MetadataEntity" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}">
<Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="494616289277" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZStd::string" field="Name" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}">
<Class name="SliceMetadataInfoComponent" field="element" version="1" type="{25EE4D75-8A17-4449-81F4-E561005BAABD}">
<Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}">
<Class name="AZ::u64" field="Id" value="16892350864321405468" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZStd::unordered_set" field="AssociatedIds" type="{6C8F8E52-AB4A-5C1F-8E56-9AC390290B94}"/>
<Class name="EntityId" field="ParentId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}">
<Class name="AZ::u64" field="id" value="4294967295" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class>
<Class name="AZStd::unordered_set" field="ChildrenIds" type="{6C8F8E52-AB4A-5C1F-8E56-9AC390290B94}"/>
<Class name="bool" field="PersistenceFlag" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
</Class>
</Class>
<Class name="bool" field="IsDependencyReady" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
</Class>
<Class name="DataFlagsPerEntity" field="DataFlagsForNewEntities" version="1" type="{57FE7B9E-B2AF-4F6F-9F8D-87F671E91C99}">
<Class name="AZStd::unordered_map" field="EntityToDataFlags" type="{CAB9E1F5-761E-54B8-916E-E7FB597E5EDE}"/>
</Class>
</Class>
</Class>
<Class name="bool" field="IsDependencyReady" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
<Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/>
</Class>
</Class>
</ObjectStream>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a76c3c57b65b73e9679198e148dd1b520f549e5489028452654da86d1679f7ad
size 47816
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f4a879930fa8cf9223aff8253964f9350b630e0938b26af36883a06253a6fabb
size 923846
@@ -0,0 +1,61 @@
<ObjectStream version="3">
<Class name="AZStd::vector" type="{82FC5264-88D0-57CD-9307-FC52E4DAD550}">
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{18D52813-BC0F-5607-ADE9-8157E00C00EF}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
</Class>
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="ui/canvases/defaultlevelloadingscreen.uicanvas" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{D392CCAF-F591-52DD-979C-CD1598F4D9CC}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
</Class>
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="ui/canvases/defaultpausemenuscreen.uicanvas" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{175E81A3-0DB0-526E-AFDB-53D3814490DE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
</Class>
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="ui/canvases/defaultpausebuttonfortouchscreens.uicanvas" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{D1D50062-283E-5E89-BBA0-BE9A260E76AF}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
</Class>
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="ui/canvases/defaultsignedinusersoverlay.uicanvas" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{544CAA3F-F27B-5525-B946-E649B7187265}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
</Class>
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="ui/canvases/defaultmainmenuscreen.uicanvas" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{B2F3CA1A-7797-5442-A09C-76DABC5EBF48}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
</Class>
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="ui/canvases/defaultoptionsmenuscreen.uicanvas" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{8AD4BAA2-F3CC-5BAB-A985-533CDFBC3133}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
</Class>
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="ui/canvases/defaultprimaryuserselectionscreen.uicanvas" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
</Class>
</ObjectStream>
+12
View File
@@ -0,0 +1,12 @@
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
add_subdirectory(Code)
+48
View File
@@ -0,0 +1,48 @@
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
ly_get_list_relative_pal_filename(include_pal_dir ${CMAKE_CURRENT_LIST_DIR}/Include/Platform/${PAL_PLATFORM_NAME})
ly_add_target(
NAME GameStateSamples.Headers HEADERONLY
NAMESPACE Gem
FILES_CMAKE
gamestatesamples_headers_files.cmake
INCLUDE_DIRECTORIES
INTERFACE
Include
${include_pal_dir}
BUILD_DEPENDENCIES
INTERFACE
Gem::GameState
Gem::LocalUser
Gem::SaveData.Static
Gem::MessagePopup.Static
Legacy::CryCommon
)
ly_add_target(
NAME GameStateSamples ${PAL_TRAIT_MONOLITHIC_DRIVEN_MODULE_TYPE}
NAMESPACE Gem
OUTPUT_NAME Gem.GameStateSamples.76db0b1bcff84224a92cbceb373f4a85.v0.1.0
FILES_CMAKE
gamestatesamples_shared_files.cmake
${include_pal_dir}/platform_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake
INCLUDE_DIRECTORIES
PRIVATE
Source
BUILD_DEPENDENCIES
PRIVATE
AZ::AzCore
AZ::AzFramework
Gem::LmbrCentral
Gem::GameStateSamples.Headers
)
@@ -0,0 +1,221 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#include <AzCore/EBus/EBus.h>
#include <AzCore/Memory/SystemAllocator.h>
#include <AzCore/Serialization/SerializeContext.h>
#include <AzCore/std/smart_ptr/shared_ptr.h>
#include <LmbrCentral/Audio/AudioSystemComponentBus.h>
////////////////////////////////////////////////////////////////////////////////////////////////////
namespace GameStateSamples
{
////////////////////////////////////////////////////////////////////////////////////////////////
//! Game options that can be modified via the options menu and saved to persistent storage.
class GameOptions final
{
public:
////////////////////////////////////////////////////////////////////////////////////////////
//! Name of the game options save data file.
static constexpr const char* SaveDataBufferName = "GameOptions";
////////////////////////////////////////////////////////////////////////////////////////////
//! Default value for the specified game option.
///@{
static constexpr float DefaultAmbientVolume = 100.0f;
static constexpr float DefaultEffectsVolume = 100.0f;
static constexpr float DefaultMainVolume = 100.0f;
static constexpr float DefaultMusicVolume = 100.0f;
///@}
////////////////////////////////////////////////////////////////////////////////////////////
// Allocator
AZ_CLASS_ALLOCATOR(GameOptions, AZ::SystemAllocator, 0);
////////////////////////////////////////////////////////////////////////////////////////////
// Type Info
AZ_RTTI(GameOptions, "{DC3C8011-7E2B-458F-8C95-FC1A06C9D8F4}");
////////////////////////////////////////////////////////////////////////////////////////////
// Reflection
static void Reflect(AZ::SerializeContext& sc);
////////////////////////////////////////////////////////////////////////////////////////////
//! Called when loaded from persistent data.
void OnLoadedFromPersistentData();
////////////////////////////////////////////////////////////////////////////////////////////
//! Effects volume accessor function.
///@{
float GetAmbientVolume() const;
void SetAmbientVolume(float ambientVolume);
void ApplyAmbientVolume();
///@}
////////////////////////////////////////////////////////////////////////////////////////////
//! Effects volume accessor function.
///@{
float GetEffectsVolume() const;
void SetEffectsVolume(float effectsVolume);
void ApplyEffectsVolume();
///@}
////////////////////////////////////////////////////////////////////////////////////////////
//! Main volume accessor function.
///@{
float GetMainVolume() const;
void SetMainVolume(float mainVolume);
void ApplyMainVolume();
///@}
////////////////////////////////////////////////////////////////////////////////////////////
//! Music volume accessor function.
///@{
float GetMusicVolume() const;
void SetMusicVolume(float musicVolume);
void ApplyMusicVolume();
///@}
private:
////////////////////////////////////////////////////////////////////////////////////////////
// Variables
float m_ambientVolume = DefaultAmbientVolume; //!< The current ambient volume.
float m_effectsVolume = DefaultEffectsVolume; //!< The current effects volume.
float m_mainVolume = DefaultMainVolume; //!< The current main volume.
float m_musicVolume = DefaultMusicVolume; //!< The current music volume.
};
////////////////////////////////////////////////////////////////////////////////////////////////
//! EBus interface used to submit requests related to game options.
class GameOptionRequests : public AZ::EBusTraits
{
public:
////////////////////////////////////////////////////////////////////////////////////////////
//! EBus Trait: requests can only be sent to and addressed by a single instance (singleton)
///@{
static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single;
///@}
////////////////////////////////////////////////////////////////////////////////////////////
//! Retrieve the game options.
virtual AZStd::shared_ptr<GameOptions> GetGameOptions() = 0;
};
using GameOptionRequestBus = AZ::EBus<GameOptionRequests>;
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameOptions::Reflect(AZ::SerializeContext& sc)
{
sc.Class<GameOptions>()
->Version(1)
->Field("ambientVolume", &GameOptions::m_ambientVolume)
->Field("effectsVolume", &GameOptions::m_effectsVolume)
->Field("mainVolume", &GameOptions::m_mainVolume)
->Field("musicVolume", &GameOptions::m_musicVolume)
;
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameOptions::OnLoadedFromPersistentData()
{
ApplyAmbientVolume();
ApplyEffectsVolume();
ApplyMainVolume();
ApplyMusicVolume();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline float GameOptions::GetAmbientVolume() const
{
return m_ambientVolume;
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameOptions::SetAmbientVolume(float ambientVolume)
{
m_ambientVolume = ambientVolume;
ApplyAmbientVolume();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameOptions::ApplyAmbientVolume()
{
LmbrCentral::AudioSystemComponentRequestBus::Broadcast(&LmbrCentral::AudioSystemComponentRequests::GlobalSetAudioRtpc,
"AmbientVolume",
m_ambientVolume);
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline float GameOptions::GetEffectsVolume() const
{
return m_effectsVolume;
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameOptions::SetEffectsVolume(float effectsVolume)
{
m_effectsVolume = effectsVolume;
ApplyEffectsVolume();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameOptions::ApplyEffectsVolume()
{
LmbrCentral::AudioSystemComponentRequestBus::Broadcast(&LmbrCentral::AudioSystemComponentRequests::GlobalSetAudioRtpc,
"EffectsVolume",
m_effectsVolume);
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline float GameOptions::GetMainVolume() const
{
return m_mainVolume;
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameOptions::SetMainVolume(float mainVolume)
{
m_mainVolume = mainVolume;
ApplyMainVolume();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameOptions::ApplyMainVolume()
{
LmbrCentral::AudioSystemComponentRequestBus::Broadcast(&LmbrCentral::AudioSystemComponentRequests::GlobalSetAudioRtpc,
"MainVolume",
m_mainVolume);
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline float GameOptions::GetMusicVolume() const
{
return m_musicVolume;
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameOptions::SetMusicVolume(float musicVolume)
{
m_musicVolume = musicVolume;
ApplyMusicVolume();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameOptions::ApplyMusicVolume()
{
LmbrCentral::AudioSystemComponentRequestBus::Broadcast(&LmbrCentral::AudioSystemComponentRequests::GlobalSetAudioRtpc,
"MusicVolume",
m_musicVolume);
}
} // namespace GameState
@@ -0,0 +1,59 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#include <GameState/GameState.h>
#include <ISystem.h>
////////////////////////////////////////////////////////////////////////////////////////////////////
namespace GameStateSamples
{
////////////////////////////////////////////////////////////////////////////////////////////////
//! Game state that is active while a level is loading.
class GameStateLevelLoading : public GameState::IGameState
, public ISystemEventListener
{
public:
////////////////////////////////////////////////////////////////////////////////////////////
// Allocator
AZ_CLASS_ALLOCATOR(GameStateLevelLoading, AZ::SystemAllocator, 0);
////////////////////////////////////////////////////////////////////////////////////////////
// Type Info
AZ_RTTI(GameStateLevelLoading, "{3ABD903B-4E9D-4BFB-A080-4795253F420C}", IGameState);
////////////////////////////////////////////////////////////////////////////////////////////
//! Default constructor
GameStateLevelLoading() = default;
////////////////////////////////////////////////////////////////////////////////////////////
//! Default destructor
~GameStateLevelLoading() override = default;
protected:
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnEnter
void OnEnter() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnExit
void OnExit() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref ISystemEventListener::OnSystemEvent
void OnSystemEvent(ESystemEvent event, UINT_PTR wparam, UINT_PTR lparam) override;
};
} // namespace GameStateSamples
// Include the implementation inline so the class can be instantiated outside of the gem.
#include <GameStateSamples/GameStateLevelLoading.inl>
@@ -0,0 +1,62 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <GameState/GameStateRequestBus.h>
#include <GameStateSamples/GameStateLevelLoading.h>
#include <GameStateSamples/GameStateLevelRunning.h>
#include <IConsole.h>
////////////////////////////////////////////////////////////////////////////////////////////////////
namespace GameStateSamples
{
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLevelLoading::OnEnter()
{
ISystem* iSystem = GetISystem();
if (iSystem)
{
iSystem->GetISystemEventDispatcher()->RegisterListener(this);
}
IConsole* iConsole = iSystem ? iSystem->GetIConsole() : nullptr;
if (iConsole)
{
iConsole->GetCVar("level_load_screen_uicanvas_path")->Set("@assets@/ui/canvases/defaultlevelloadingscreen.uicanvas");
iConsole->GetCVar("level_load_screen_sequence_to_auto_play")->Set("DefaultLevelLoadingAnimatedSequence");
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLevelLoading::OnExit()
{
if (ISystem* iSystem = GetISystem())
{
iSystem->GetISystemEventDispatcher()->RemoveListener(this);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLevelLoading::OnSystemEvent(ESystemEvent event, UINT_PTR, UINT_PTR)
{
if (event == ESYSTEM_EVENT_LEVEL_LOAD_END)
{
// Replace the level loading game state with the level running game state
AZ_Assert(GameState::GameStateRequests::IsActiveGameStateOfType<GameStateLevelLoading>(),
"The active game state is not of type GameStateLevelLoading");
AZ_Assert(!GameState::GameStateRequests::DoesStackContainGameStateOfType<GameStateLevelRunning>(),
"The game state stack already contains an instance of GameStateLevelRunning");
AZStd::shared_ptr<GameState::IGameState> gameStateLevelRunning = GameState::GameStateRequests::CreateNewOverridableGameStateOfType<GameStateLevelRunning>();
GameState::GameStateRequestBus::Broadcast(&GameState::GameStateRequests::ReplaceActiveGameState, gameStateLevelRunning);
}
}
}
@@ -0,0 +1,92 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#include <GameState/GameState.h>
#include <AzFramework/Input/Events/InputChannelEventListener.h>
////////////////////////////////////////////////////////////////////////////////////////////////////
namespace GameStateSamples
{
////////////////////////////////////////////////////////////////////////////////////////////////
//! Game state that is active while gameplay is paused.
class GameStateLevelPaused : public GameState::IGameState
, public AzFramework::InputChannelEventListener
{
public:
////////////////////////////////////////////////////////////////////////////////////////////
// Allocator
AZ_CLASS_ALLOCATOR(GameStateLevelPaused, AZ::SystemAllocator, 0);
////////////////////////////////////////////////////////////////////////////////////////////
// Type Info
AZ_RTTI(GameStateLevelPaused, "{6CAA4810-AA67-4A96-BB23-3EFA4BCCBF12}", IGameState);
////////////////////////////////////////////////////////////////////////////////////////////
//! Default constructor
GameStateLevelPaused() = default;
////////////////////////////////////////////////////////////////////////////////////////////
//! Default destructor
~GameStateLevelPaused() override = default;
protected:
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnPushed
void OnPushed() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnPopped
void OnPopped() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnEnter
void OnEnter() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnExit
void OnExit() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref AzFramework::InputChannelEventListener::GetPriority
AZ::s32 GetPriority() const override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref AzFramework::InputChannelEventListener::OnInputChannelEventFiltered
bool OnInputChannelEventFiltered(const AzFramework::InputChannel & inputChannel) override;
////////////////////////////////////////////////////////////////////////////////////////////
//! Convenience functions to load and unload the pause menu UI canvas.
///@{
virtual void LoadPauseMenuCanvas();
virtual void UnloadPauseMenuCanvas();
virtual void SetPauseMenuCanvasDrawOrder();
virtual const char* GetPauseMenuCanvasAssetPath();
///@}
////////////////////////////////////////////////////////////////////////////////////////////
//! Convenience functions to pause and unpause the game.
///@{
virtual void PauseGame();
virtual void UnpauseGame();
///@}
protected:
////////////////////////////////////////////////////////////////////////////////////////////
// Variables
AZ::EntityId m_pauseMenuCanvasEntityId; //!< Id of the UI canvas being displayed
};
} // namespace GameStateSamples
// Include the implementation inline so the class can be instantiated outside of the gem.
#include <GameStateSamples/GameStateLevelPaused.inl>
@@ -0,0 +1,203 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <GameState/GameStateRequestBus.h>
#include <GameStateSamples/GameStateLevelPaused.h>
#include <GameStateSamples/GameStateMainMenu.h>
#include <GameStateSamples/GameStateOptionsMenu.h>
#include <AzFramework/Input/Devices/Gamepad/InputDeviceGamepad.h>
#include <AzFramework/Input/Devices/Keyboard/InputDeviceKeyboard.h>
#include <LyShine/Bus/UiButtonBus.h>
#include <LyShine/Bus/UiCanvasBus.h>
#include <LyShine/Bus/UiCanvasManagerBus.h>
#include <LyShine/Bus/UiCursorBus.h>
////////////////////////////////////////////////////////////////////////////////////////////////////
namespace GameStateSamples
{
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLevelPaused::OnPushed()
{
LoadPauseMenuCanvas();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLevelPaused::OnPopped()
{
UnloadPauseMenuCanvas();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLevelPaused::OnEnter()
{
InputChannelEventListener::Connect();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLevelPaused::OnExit()
{
InputChannelEventListener::Disconnect();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline AZ::s32 GameStateLevelPaused::GetPriority() const
{
// Make unpausing the game precedence over any UI that might be showing
return AzFramework::InputChannelEventListener::GetPriorityUI() + 1;
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline bool GameStateLevelPaused::OnInputChannelEventFiltered(const AzFramework::InputChannel & inputChannel)
{
if (inputChannel.IsStateEnded() &&
(inputChannel.GetInputChannelId() == AzFramework::InputDeviceGamepad::Button::Start ||
inputChannel.GetInputChannelId() == AzFramework::InputDeviceKeyboard::Key::Escape))
{
AZ_Assert(GameState::GameStateRequests::IsActiveGameStateOfType<GameStateLevelPaused>(),
"The active game state is not an instance of GameStateLevelPaused");
GameState::GameStateRequestBus::Broadcast(&GameState::GameStateRequests::PopActiveGameState);
return true; // Consume this input
}
return false; // Don't consume other input
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLevelPaused::LoadPauseMenuCanvas()
{
// Load the UI canvas
const char* uiCanvasAssetPath = GetPauseMenuCanvasAssetPath();
UiCanvasManagerBus::BroadcastResult(m_pauseMenuCanvasEntityId,
&UiCanvasManagerInterface::LoadCanvas,
uiCanvasAssetPath);
if (!m_pauseMenuCanvasEntityId.IsValid())
{
AZ_Warning("GameStateLevelPaused", false, "Could not load %s", uiCanvasAssetPath);
return;
}
// Display the pause menu
UiCanvasBus::Event(m_pauseMenuCanvasEntityId, &UiCanvasInterface::SetEnabled, true);
SetPauseMenuCanvasDrawOrder();
// Display the UI cursor
UiCursorBus::Broadcast(&UiCursorInterface::IncrementVisibleCounter);
// Setup the 'Resume' button to return to the level running state
AZ::EntityId resumeButtonElementId;
UiCanvasBus::EventResult(resumeButtonElementId,
m_pauseMenuCanvasEntityId,
&UiCanvasInterface::FindElementEntityIdByName,
"ResumeButton");
UiButtonBus::Event(resumeButtonElementId,
&UiButtonInterface::SetOnClickCallback,
[]([[maybe_unused]] AZ::EntityId clickedEntityId, [[maybe_unused]] AZ::Vector2 point)
{
AZ_Assert(GameState::GameStateRequests::IsActiveGameStateOfType<GameStateLevelPaused>(),
"The active game state is not an instance of GameStateLevelPaused");
GameState::GameStateRequestBus::Broadcast(&GameState::GameStateRequests::PopActiveGameState);
});
// Setup the 'Options' button to open the options menu
AZ::EntityId optionsButtonElementId;
UiCanvasBus::EventResult(optionsButtonElementId,
m_pauseMenuCanvasEntityId,
&UiCanvasInterface::FindElementEntityIdByName,
"OptionsButton");
UiButtonBus::Event(optionsButtonElementId,
&UiButtonInterface::SetOnClickCallback,
[]([[maybe_unused]] AZ::EntityId clickedEntityId, [[maybe_unused]] AZ::Vector2 point)
{
AZ_Assert(GameState::GameStateRequests::IsActiveGameStateOfType<GameStateLevelPaused>(),
"The active game state is not an instance of GameStateLevelPaused");
GameState::GameStateRequests::CreateAndPushNewOverridableGameStateOfType<GameStateOptionsMenu>();
});
// Setup the 'Return to Main Menu' button to return to the main menu state
AZ::EntityId returnToMainMenuButtonElementId;
UiCanvasBus::EventResult(returnToMainMenuButtonElementId,
m_pauseMenuCanvasEntityId,
&UiCanvasInterface::FindElementEntityIdByName,
"ReturnToMainMenuButton");
const bool enableReturnToMainMenuButton = GameState::GameStateRequests::DoesStackContainGameStateOfType<GameStateMainMenu>();
UiElementBus::Event(returnToMainMenuButtonElementId, &UiElementInterface::SetIsEnabled, enableReturnToMainMenuButton);
if (enableReturnToMainMenuButton)
{
UiButtonBus::Event(returnToMainMenuButtonElementId,
&UiButtonInterface::SetOnClickCallback,
[]([[maybe_unused]] AZ::EntityId clickedEntityId, [[maybe_unused]] AZ::Vector2 point)
{
AZ_Assert(GameState::GameStateRequests::IsActiveGameStateOfType<GameStateLevelPaused>(),
"The active game state is not an instance of GameStateLevelPaused");
GameState::GameStateRequests::PopActiveGameStateUntilOfType<GameStateMainMenu>();
});
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLevelPaused::UnloadPauseMenuCanvas()
{
if (m_pauseMenuCanvasEntityId.IsValid())
{
// Hide the UI cursor
UiCursorBus::Broadcast(&UiCursorInterface::DecrementVisibleCounter);
// Unload the pause menu
UiCanvasManagerBus::Broadcast(&UiCanvasManagerInterface::UnloadCanvas,
m_pauseMenuCanvasEntityId);
m_pauseMenuCanvasEntityId.SetInvalid();
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLevelPaused::SetPauseMenuCanvasDrawOrder()
{
// Loaded canvases are already stored sorted by draw order...
UiCanvasManagerInterface::CanvasEntityList canvases;
UiCanvasManagerBus::BroadcastResult(canvases, &UiCanvasManagerInterface::GetLoadedCanvases);
// ...so get the draw order of the top-most displayed UI canvas...
int highestDrawOrder = 0;
UiCanvasBus::EventResult(highestDrawOrder, canvases.back(), &UiCanvasInterface::GetDrawOrder);
// ...and increment it by one unless it's already set to int max...
if (highestDrawOrder != std::numeric_limits<int>::max())
{
++highestDrawOrder;
}
// ...ensuring the pause menu gets displayed on top of all other loaded canvases,
// with the exception of 'special' ones like message popups or the loading screen
// that use a draw order of int max.
UiCanvasBus::Event(m_pauseMenuCanvasEntityId, &UiCanvasInterface::SetDrawOrder, highestDrawOrder);
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline const char* GameStateLevelPaused::GetPauseMenuCanvasAssetPath()
{
return "@assets@/ui/canvases/defaultpausemenuscreen.uicanvas";
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLevelPaused::PauseGame()
{
// We need a way to pause the game.
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLevelPaused::UnpauseGame()
{
// We need a way to un-pause the game.
}
}
@@ -0,0 +1,102 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#include <GameState/GameState.h>
#include <AzFramework/API/ApplicationAPI.h>
#include <AzFramework/Input/Events/InputChannelEventListener.h>
#include <ISystem.h>
////////////////////////////////////////////////////////////////////////////////////////////////////
namespace GameStateSamples
{
////////////////////////////////////////////////////////////////////////////////////////////////
//! Game state that is active while the game is running.
class GameStateLevelRunning : public GameState::IGameState
, public AzFramework::InputChannelEventListener
, public AzFramework::ApplicationLifecycleEvents::Bus::Handler
, public ISystemEventListener
{
public:
////////////////////////////////////////////////////////////////////////////////////////////
// Allocator
AZ_CLASS_ALLOCATOR(GameStateLevelRunning, AZ::SystemAllocator, 0);
////////////////////////////////////////////////////////////////////////////////////////////
// Type Info
AZ_RTTI(GameStateLevelRunning, "{93501205-D39D-4E91-B93C-1E16EFAEEB43}", IGameState);
////////////////////////////////////////////////////////////////////////////////////////////
//! Default constructor
GameStateLevelRunning() = default;
////////////////////////////////////////////////////////////////////////////////////////////
//! Default destructor
~GameStateLevelRunning() override = default;
protected:
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnPushed
void OnPushed() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnPopped
void OnPopped() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnEnter
void OnEnter() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnExit
void OnExit() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref AzFramework::InputChannelEventListener::GetPriority
AZ::s32 GetPriority() const override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref AzFramework::InputChannelEventListener::OnInputChannelEventFiltered
bool OnInputChannelEventFiltered(const AzFramework::InputChannel & inputChannel) override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref AzFramework::ApplicationLifecycleEvents::OnApplicationConstrained
void OnApplicationConstrained(AzFramework::ApplicationLifecycleEvents::Event /*lastEvent*/) override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref ISystemEventListener::OnSystemEvent
void OnSystemEvent(ESystemEvent event, UINT_PTR wparam, UINT_PTR lparam) override;
////////////////////////////////////////////////////////////////////////////////////////////
//! Convenience function to push the default level paused game state.
//! Override if you wish to push a different level paused game state.
virtual void PushLevelPausedGameState();
////////////////////////////////////////////////////////////////////////////////////////////
//! Convenience functions to load and unload the pause button UI canvas.
///@{
virtual void LoadPauseButtonCanvas();
virtual void UnloadPauseButtonCanvas();
virtual const char* GetPauseButtonCanvasAssetPath();
///@}
protected:
////////////////////////////////////////////////////////////////////////////////////////////
// Variables
AZ::EntityId m_pauseButtonCanvasEntityId; //!< Id of the UI canvas being displayed
};
} // namespace GameStateSamples
// Include the implementation inline so the class can be instantiated outside of the gem.
#include <GameStateSamples/GameStateLevelRunning.inl>
@@ -0,0 +1,220 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <GameState/GameStateRequestBus.h>
#include <GameStateSamples/GameStateLevelRunning.h>
#include <GameStateSamples/GameStateLevelLoading.h>
#include <GameStateSamples/GameStateLevelPaused.h>
#include <GameStateSamples/GameStateSamples_Traits_Platform.h>
#include <AzFramework/Input/Buses/Requests/InputTextEntryRequestBus.h>
#include <AzFramework/Input/Devices/Gamepad/InputDeviceGamepad.h>
#include <AzFramework/Input/Devices/Keyboard/InputDeviceKeyboard.h>
#include <AzFramework/Input/Devices/Touch/InputDeviceTouch.h>
#include <AzFramework/Input/Devices/VirtualKeyboard/InputDeviceVirtualKeyboard.h>
#include <LyShine/Bus/UiButtonBus.h>
#include <LyShine/Bus/UiCanvasBus.h>
#include <LyShine/Bus/UiCanvasManagerBus.h>
#include <ILevelSystem.h>
#include <I3DEngine.h>
#include <ISystem.h>
#include <IConsole.h>
////////////////////////////////////////////////////////////////////////////////////////////////////
namespace GameStateSamples
{
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLevelRunning::OnPushed()
{
// Load the pause button if there's a touch input device connected
const AzFramework::InputDevice* inputDeviceTouch = nullptr;
AzFramework::InputDeviceRequestBus::EventResult(inputDeviceTouch,
AzFramework::InputDeviceTouch::Id,
&AzFramework::InputDeviceRequests::GetInputDevice);
if (inputDeviceTouch && inputDeviceTouch->IsConnected())
{
LoadPauseButtonCanvas();
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLevelRunning::OnPopped()
{
UnloadPauseButtonCanvas();
ISystem* iSystem = GetISystem();
ILevelSystem* levelSystem = iSystem ? iSystem->GetILevelSystem() : nullptr;
if (levelSystem && !iSystem->GetGlobalEnvironment()->IsEditor())
{
// Unload the currently loaded level
levelSystem->UnLoadLevel();
if (iSystem->GetI3DEngine())
{
iSystem->GetI3DEngine()->LoadEmptyLevel();
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLevelRunning::OnEnter()
{
InputChannelEventListener::Connect();
AzFramework::ApplicationLifecycleEvents::Bus::Handler::BusConnect();
if (ISystem* iSystem = GetISystem())
{
iSystem->GetISystemEventDispatcher()->RegisterListener(this);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLevelRunning::OnExit()
{
if (ISystem* iSystem = GetISystem())
{
iSystem->GetISystemEventDispatcher()->RemoveListener(this);
}
AzFramework::ApplicationLifecycleEvents::Bus::Handler::BusDisconnect();
InputChannelEventListener::Disconnect();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline AZ::s32 GameStateLevelRunning::GetPriority() const
{
// Make pausing the game precedence over any UI that might be showing
return AzFramework::InputChannelEventListener::GetPriorityUI() + 1;
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline bool GameStateLevelRunning::OnInputChannelEventFiltered(const AzFramework::InputChannel & inputChannel)
{
if (inputChannel.IsStateEnded() &&
(inputChannel.GetInputChannelId() == AzFramework::InputDeviceGamepad::Button::Start ||
inputChannel.GetInputChannelId() == AzFramework::InputDeviceKeyboard::Key::Escape))
{
PushLevelPausedGameState();
return true; // Consume this input
}
return false; // Don't consume other input
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLevelRunning::OnApplicationConstrained(AzFramework::ApplicationLifecycleEvents::Event /*lastEvent*/)
{
bool pauseOnApplicationConstrained = false;
#if AZ_TRAIT_GAMESTATESAMPLES_PAUSE_ON_APPLICATION_CONSTRAINED
pauseOnApplicationConstrained = true;
#else
pauseOnApplicationConstrained = false;
#endif // AZ_TRAIT_GAMESTATESAMPLES_PAUSE_ON_APPLICATION_CONSTRAINED
ISystem* iSystem = GetISystem();
IConsole* iConsole = iSystem ? iSystem->GetIConsole() : nullptr;
if (iConsole && iConsole->GetCVar("sys_pauseOnApplicationConstrained"))
{
switch (iConsole->GetCVar("sys_pauseOnApplicationConstrained")->GetIVal())
{
case 0: { pauseOnApplicationConstrained = false; } break;
case 1: { pauseOnApplicationConstrained = true; } break;
default: break; // Use the default value that was set above
}
}
// Do not pause if the application was constrained because the virtual keyboard was shown
bool hasTextEntryStarted = false;
AzFramework::InputTextEntryRequestBus::EventResult(hasTextEntryStarted,
AzFramework::InputDeviceVirtualKeyboard::Id,
&AzFramework::InputTextEntryRequests::HasTextEntryStarted);
if (pauseOnApplicationConstrained && !hasTextEntryStarted)
{
PushLevelPausedGameState();
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLevelRunning::OnSystemEvent(ESystemEvent event, UINT_PTR, UINT_PTR)
{
// If the user happens to initiate a level load outside the context of these game states,
// for example via executing the 'map' command from the debug console or in autoexec.cfg,
// this will also be detected by checking for the ESYSTEM_EVENT_LEVEL_LOAD_PREPARE event.
if (event == ESYSTEM_EVENT_LEVEL_LOAD_PREPARE)
{
// Replace the level running game state with the level loading game state
AZ_Assert(GameState::GameStateRequests::IsActiveGameStateOfType<GameStateLevelRunning>(),
"The active game state is not of type GameStateLevelRunning");
AZ_Assert(!GameState::GameStateRequests::DoesStackContainGameStateOfType<GameStateLevelLoading>(),
"The game state stack already contains an instance of GameStateLevelLoading");
AZStd::shared_ptr<GameState::IGameState> gameStateLevelLoading = GameState::GameStateRequests::CreateNewOverridableGameStateOfType<GameStateLevelLoading>();
GameState::GameStateRequestBus::Broadcast(&GameState::GameStateRequests::ReplaceActiveGameState, gameStateLevelLoading);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLevelRunning::PushLevelPausedGameState()
{
AZ_Assert(!GameState::GameStateRequests::DoesStackContainGameStateOfType<GameStateLevelPaused>(),
"The game state stack already contains an instance of GameStateLevelPaused");
GameState::GameStateRequests::CreateAndPushNewOverridableGameStateOfType<GameStateLevelPaused>();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLevelRunning::LoadPauseButtonCanvas()
{
// Load the UI canvas
const char* uiCanvasAssetPath = GetPauseButtonCanvasAssetPath();
UiCanvasManagerBus::BroadcastResult(m_pauseButtonCanvasEntityId,
&UiCanvasManagerInterface::LoadCanvas,
uiCanvasAssetPath);
if (!m_pauseButtonCanvasEntityId.IsValid())
{
AZ_Warning("GameStateLevelRunning", false, "Could not load %s", uiCanvasAssetPath);
return;
}
// Display the pause HUD
UiCanvasBus::Event(m_pauseButtonCanvasEntityId, &UiCanvasInterface::SetEnabled, true);
// Setup the 'Pause' button to push the level paused state
AZ::EntityId pauseButtonElementId;
UiCanvasBus::EventResult(pauseButtonElementId,
m_pauseButtonCanvasEntityId,
&UiCanvasInterface::FindElementEntityIdByName,
"PauseButton");
auto OnPauseButtonClicked = [this]([[maybe_unused]] AZ::EntityId clickedEntityId, [[maybe_unused]] AZ::Vector2 point)
{
PushLevelPausedGameState();
};
UiButtonBus::Event(pauseButtonElementId, &UiButtonInterface::SetOnClickCallback, OnPauseButtonClicked);
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLevelRunning::UnloadPauseButtonCanvas()
{
if (m_pauseButtonCanvasEntityId.IsValid())
{
// Unload the pause menu
UiCanvasManagerBus::Broadcast(&UiCanvasManagerInterface::UnloadCanvas,
m_pauseButtonCanvasEntityId);
m_pauseButtonCanvasEntityId.SetInvalid();
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline const char* GameStateLevelRunning::GetPauseButtonCanvasAssetPath()
{
return "@assets@/ui/canvases/defaultpausebuttonfortouchscreens.uicanvas";
}
}
@@ -0,0 +1,138 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#include <GameState/GameState.h>
#include <LocalUser/LocalUserNotificationBus.h>
#include <AzFramework/API/ApplicationAPI.h>
#include <AzFramework/Input/Buses/Notifications/InputDeviceNotificationBus.h>
#include <AzFramework/Input/Events/InputChannelEventListener.h>
////////////////////////////////////////////////////////////////////////////////////////////////////
namespace GameStateSamples
{
////////////////////////////////////////////////////////////////////////////////////////////////
//! Game state that acts a lobby by assigning local user ids into local player slots as needed.
class GameStateLocalUserLobby : public GameState::IGameState
, public AzFramework::InputChannelEventListener
, public AzFramework::InputDeviceNotificationBus::Handler
, public AzFramework::ApplicationLifecycleEvents::Bus::Handler
, public LocalUser::LocalUserNotificationBus::Handler
{
public:
////////////////////////////////////////////////////////////////////////////////////////////
// Allocator
AZ_CLASS_ALLOCATOR(GameStateLocalUserLobby, AZ::SystemAllocator, 0);
////////////////////////////////////////////////////////////////////////////////////////////
// Type Info
AZ_RTTI(GameStateLocalUserLobby, "{E6D54EAF-F826-4EEE-91CD-60A052DA55E4}", IGameState);
////////////////////////////////////////////////////////////////////////////////////////////
//! Default constructor
GameStateLocalUserLobby() = default;
////////////////////////////////////////////////////////////////////////////////////////////
//! Default destructor
~GameStateLocalUserLobby() override = default;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnPushed
void OnPushed() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnPopped
void OnPopped() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnEnter
void OnEnter() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnExit
void OnExit() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnUpdate
void OnUpdate() override;
protected:
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref AzFramework::InputChannelEventListener::GetPriority
AZ::s32 GetPriority() const override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref AzFramework::InputChannelEventListener::OnInputChannelEventFiltered
bool OnInputChannelEventFiltered(const AzFramework::InputChannel & inputChannel) override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref AzFramework::InputDeviceNotifications::OnInputDeviceConnectedEvent
void OnInputDeviceConnectedEvent(const AzFramework::InputDevice& inputDevice) override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref AzFramework::InputDeviceNotifications::OnInputDeviceDisconnectedEvent
void OnInputDeviceDisconnectedEvent(const AzFramework::InputDevice& inputDevice) override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref AzFramework::ApplicationLifecycleEvents::OnApplicationUnconstrained
void OnApplicationUnconstrained(AzFramework::ApplicationLifecycleEvents::Event /*lastEvent*/) override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref LocalUser::LocalUserNotifications::OnLocalUserIdAssignedToLocalPlayerSlot
void OnLocalUserIdAssignedToLocalPlayerSlot(AzFramework::LocalUserId localUserId,
AZ::u32 newLocalPlayerSlot,
AZ::u32 previousLocalPlayerSlot) override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref LocalUser::LocalUserNotifications::OnLocalUserIdRemovedFromLocalPlayerSlot
void OnLocalUserIdRemovedFromLocalPlayerSlot(AzFramework::LocalUserId localUserId,
AZ::u32 localPlayerSlot) override;
////////////////////////////////////////////////////////////////////////////////////////////
//! Convenience functions to load and unload the signed in user overlay UI canvas.
///@{
virtual void LoadSignedInUserOverlayCanvas();
virtual void UnloadSignedInUserOverlayCanvas();
virtual const char* GetSignedInUserOverlayCanvasAssetPath();
///@}
protected:
void RefreshLocalPlayerSlotAssignments();
bool IsLocalUserSignedIn(AzFramework::LocalUserId localUserId) const;
bool IsLocalUserAssociatedWithConnectedInputDevice(AzFramework::LocalUserId localUserId) const;
void RefreshAllGamepadLightBarColors();
void RefreshGamepadLightBarColor(AzFramework::LocalUserId localUserId, AZ::u32 localPlayerSlot);
void RefreshGamepadLightBarColor(const AzFramework::InputDeviceId& inputDeviceId, AZ::u32 localPlayerSlot);
void RefreshAllSignedInUserOverlays();
void RefreshSignedInUserOverlay(AZ::u32 localPlayerSlot);
void SetSignedInUserOverlayEnabled(AZ::u32 localPlayerSlot,
bool enabled);
void SetSignedInUserOverlayNameText(AZ::u32 localPlayerSlot,
const AZStd::string& localUserName);
AZ::EntityId GetUiElementIdForLocalPlayerSlot(const char* elementName,
AZ::u32 localPlayerSlot) const;
protected:
////////////////////////////////////////////////////////////////////////////////////////////
// Variables
AZ::EntityId m_signedInUsersOverlayCanvasEntityId;
bool m_shouldRefreshLevelListDisplay = false;
};
} // namespace GameStateSamples
// Include the implementation inline so the class can be instantiated outside of the gem.
#include <GameStateSamples/GameStateLocalUserLobby.inl>
@@ -0,0 +1,519 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <GameState/GameStateRequestBus.h>
#include <GameStateSamples/GameStateLocalUserLobby.h>
#include <LyShine/Bus/UiCanvasBus.h>
#include <LyShine/Bus/UiCanvasManagerBus.h>
#include <LyShine/Bus/UiElementBus.h>
#include <LyShine/Bus/UiTextBus.h>
#include <LocalUser/LocalUserRequestBus.h>
#include <AzFramework/Input/Buses/Requests/InputDeviceRequestBus.h>
#include <AzFramework/Input/Buses/Requests/InputLightBarRequestBus.h>
#include <AzFramework/Input/Devices/Gamepad/InputDeviceGamepad.h>
#include <AzFramework/Input/Utils/IsAnyKeyOrButton.h>
#include <AzCore/std/sort.h>
////////////////////////////////////////////////////////////////////////////////////////////////////
namespace GameStateSamples
{
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLocalUserLobby::OnPushed()
{
// We could load the UI canvas here and keep it cached until OnPopped is called in order to
// speed up re-entering this game state, but doing so would consume memory for the lifetime
// of the process that is only needed while this state is active (which is not very often).
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLocalUserLobby::OnPopped()
{
// See comment above in OnPushed
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLocalUserLobby::OnEnter()
{
AzFramework::ApplicationLifecycleEvents::Bus::Handler::BusConnect();
AzFramework::InputDeviceNotificationBus::Handler::BusConnect();
LocalUser::LocalUserNotificationBus::Handler::BusConnect();
InputChannelEventListener::Connect();
RefreshLocalPlayerSlotAssignments();
LoadSignedInUserOverlayCanvas();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLocalUserLobby::OnExit()
{
UnloadSignedInUserOverlayCanvas();
InputChannelEventListener::Disconnect();
LocalUser::LocalUserNotificationBus::Handler::BusDisconnect();
AzFramework::InputDeviceNotificationBus::Handler::BusDisconnect();
AzFramework::ApplicationLifecycleEvents::Bus::Handler::BusDisconnect();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLocalUserLobby::OnUpdate()
{
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline AZ::s32 GameStateLocalUserLobby::GetPriority() const
{
return AzFramework::InputChannelEventListener::GetPriorityFirst();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline bool GameStateLocalUserLobby::OnInputChannelEventFiltered(const AzFramework::InputChannel & inputChannel)
{
if (inputChannel.IsStateBegan() && AzFramework::IsAnyKeyOrButton(inputChannel))
{
const AzFramework::LocalUserId localUserId = inputChannel.GetInputDevice().GetAssignedLocalUserId();
if (localUserId == AzFramework::LocalUserIdAny ||
localUserId == AzFramework::LocalUserIdNone)
{
// No local user is associated with this input device yet, so prompt for user sign-in
inputChannel.GetInputDevice().PromptLocalUserSignIn();
}
else
{
// Assign the local user to the first available slot (if they haven't already been assigned one)
AZ::u32 assignedSlot = LocalUser::LocalPlayerSlotNone;
LocalUser::LocalUserRequestBus::BroadcastResult(assignedSlot,
&LocalUser::LocalUserRequests::GetLocalPlayerSlotOccupiedByLocalUserId,
localUserId);
if (assignedSlot == LocalUser::LocalPlayerSlotNone)
{
// This call to AssignLocalUserIdToLocalPlayerSlot will trigger another to
// OnLocalUserIdAssignedToLocalPlayerSlot, which is where we update the UI.
LocalUser::LocalUserRequestBus::Broadcast(&LocalUser::LocalUserRequests::AssignLocalUserIdToLocalPlayerSlot,
localUserId,
LocalUser::LocalPlayerSlotAny);
}
}
}
// Don't consume the input
return false;
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLocalUserLobby::OnInputDeviceConnectedEvent(const AzFramework::InputDevice& inputDevice)
{
const AzFramework::LocalUserId localUserId = inputDevice.GetAssignedLocalUserId();
const AzFramework::LocalUserId primaryLocalUserId = LocalUser::LocalUserRequests::GetPrimaryLocalUserId();
if (localUserId == AzFramework::LocalUserIdNone ||
localUserId == primaryLocalUserId)
{
// The connected controller does not belong to any user, or it belongs to the primary
// user which is handled in GameStatePrimaryControllerDisconnected
return;
}
// A secondary controller was connected, so assign the associated local
// user id to a free local player slot. Note that we only do this while
// in GameStateLocalUserLobby, not during gameplay, as we do not want to
// assign a local user id to a local player slot mid-game. To account
// for the case where a controller/user connects during gameplay (and
// does not disconnect by the time we return to the main menu) we call
// RefreshLocalPlayerSlotAssignments from GameStateLocalUserLobby::OnEnter.
//
// This call to AssignLocalUserIdToLocalPlayerSlot will trigger another to
// OnLocalUserIdAssignedToLocalPlayerSlot, which is where we update the UI.
LocalUser::LocalUserRequestBus::Broadcast(&LocalUser::LocalUserRequests::AssignLocalUserIdToLocalPlayerSlot,
localUserId,
LocalUser::LocalPlayerSlotAny);
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLocalUserLobby::OnInputDeviceDisconnectedEvent(const AzFramework::InputDevice& inputDevice)
{
const AzFramework::LocalUserId localUserId = inputDevice.GetAssignedLocalUserId();
const AzFramework::LocalUserId primaryLocalUserId = LocalUser::LocalUserRequests::GetPrimaryLocalUserId();
if (localUserId == AzFramework::LocalUserIdNone ||
localUserId == primaryLocalUserId)
{
// The disconnected controller does not belong to any user, or it belongs to the primary
// user which is handled in GameStatePrimaryUserMonitor::OnInputDeviceDisconnectedEvent
return;
}
// A secondary controller was disconnected, so remove the associated local
// user id from their local player slot. Note that we only do this while in
// GameStateLocalUserLobby, not during gameplay, as we don't want to remove a
// local user id from a local player slot mid-game. To account for the case
// where a user disconnects during gameplay (and does not re-connect by the
// time we exit to the main menu) we call RefreshLocalPlayerSlotAssignments
// from GameStateLocalUserLobby::OnEnter
//
// This call to RemoveLocalUserIdFromLocalPlayerSlot will trigger another to
// OnLocalUserIdRemovedFromLocalPlayerSlot, which is where we update the UI.
LocalUser::LocalUserRequestBus::Broadcast(&LocalUser::LocalUserRequests::RemoveLocalUserIdFromLocalPlayerSlot,
localUserId);
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLocalUserLobby::OnApplicationUnconstrained(AzFramework::ApplicationLifecycleEvents::Event /*lastEvent*/)
{
RefreshLocalPlayerSlotAssignments();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLocalUserLobby::OnLocalUserIdAssignedToLocalPlayerSlot(AzFramework::LocalUserId localUserId,
AZ::u32 newLocalPlayerSlot,
AZ::u32 previousLocalPlayerSlot)
{
RefreshSignedInUserOverlay(newLocalPlayerSlot);
RefreshSignedInUserOverlay(previousLocalPlayerSlot);
RefreshGamepadLightBarColor(localUserId, newLocalPlayerSlot);
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLocalUserLobby::OnLocalUserIdRemovedFromLocalPlayerSlot(AzFramework::LocalUserId localUserId,
AZ::u32 localPlayerSlot)
{
RefreshSignedInUserOverlay(localPlayerSlot);
RefreshGamepadLightBarColor(localUserId, LocalUser::LocalPlayerSlotNone);
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLocalUserLobby::LoadSignedInUserOverlayCanvas()
{
// Load the UI canvas
const char* uiCanvasAssetPath = GetSignedInUserOverlayCanvasAssetPath();
UiCanvasManagerBus::BroadcastResult(m_signedInUsersOverlayCanvasEntityId,
&UiCanvasManagerInterface::LoadCanvas,
uiCanvasAssetPath);
if (!m_signedInUsersOverlayCanvasEntityId.IsValid())
{
AZ_Warning("GameStateLocalUserLobby", false, "Could not load %s", uiCanvasAssetPath);
return;
}
// Display the overlay, set it to draw over the top of the main menu,
// and set it to stay loaded when a level unloads
UiCanvasBus::Event(m_signedInUsersOverlayCanvasEntityId, &UiCanvasInterface::SetEnabled, true);
UiCanvasBus::Event(m_signedInUsersOverlayCanvasEntityId, &UiCanvasInterface::SetDrawOrder, 10);
UiCanvasBus::Event(m_signedInUsersOverlayCanvasEntityId, &UiCanvasInterface::SetKeepLoadedOnLevelUnload, true);
RefreshAllSignedInUserOverlays();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLocalUserLobby::UnloadSignedInUserOverlayCanvas()
{
if (m_signedInUsersOverlayCanvasEntityId.IsValid())
{
// Unload the overlay
UiCanvasManagerBus::Broadcast(&UiCanvasManagerInterface::UnloadCanvas,
m_signedInUsersOverlayCanvasEntityId);
m_signedInUsersOverlayCanvasEntityId.SetInvalid();
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline const char* GameStateLocalUserLobby::GetSignedInUserOverlayCanvasAssetPath()
{
return "@assets@/ui/canvases/defaultsignedinusersoverlay.uicanvas";
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLocalUserLobby::RefreshLocalPlayerSlotAssignments()
{
// Check whether local users that have been assigned to a local player slot
// are still signed in and associated with a connected input device. If not,
// remove them from the local player slot so that it becomes free for other
// players to join. Note that we ignore the primary user here, as that is a
// speacial case we handle at all times in LyPlatformServicesSystemComponent
for (AZ::u32 i = LocalUser::LocalPlayerSlotPrimary + 1; i < LocalUser::LocalPlayerSlotMax; ++i)
{
const AzFramework::LocalUserId localUserId = LocalUser::LocalUserRequests::GetLocalUserIdAt(i);
if (localUserId == AzFramework::LocalUserIdNone)
{
// No local user assigned to this slot
continue;
}
const bool isLocalUserSignedIn = IsLocalUserSignedIn(localUserId);
if (!isLocalUserSignedIn)
{
// The local user is no longer signed in, remove them from their local player slot
LocalUser::LocalUserRequestBus::Broadcast(&LocalUser::LocalUserRequests::RemoveLocalUserIdFromLocalPlayerSlot,
localUserId);
continue;
}
const bool isAssignedToConnectedInputDevice = IsLocalUserAssociatedWithConnectedInputDevice(localUserId);
if (!isAssignedToConnectedInputDevice)
{
// The local user is no longer associated with a connected input device, remove them from their local player slot
LocalUser::LocalUserRequestBus::Broadcast(&LocalUser::LocalUserRequests::RemoveLocalUserIdFromLocalPlayerSlot,
localUserId);
continue;
}
// The local user is still signed in and associated with a connected input device
}
// Get all connected controllers...
AZStd::vector<const AzFramework::InputDevice*> gamepadInputDevices;
AzFramework::InputDeviceRequests::InputDeviceByIdMap inputDevicesById;
AzFramework::InputDeviceRequestBus::Broadcast(&AzFramework::InputDeviceRequests::GetInputDevicesById,
inputDevicesById);
for (const auto& inputDeviceById : inputDevicesById)
{
const AzFramework::InputDevice* inputDevice = inputDeviceById.second;
if (inputDevice &&
inputDevice->IsConnected() &&
AzFramework::InputDeviceGamepad::IsGamepadDevice(inputDeviceById.first))
{
// The input device is a connected gamepad
gamepadInputDevices.push_back(inputDevice);
}
}
// ...sort them by index and then go through to check whether they have been
// assigned a local user id. If so, auto-assign their local user id into the
// first available local player slot (unless they've already been assigned).
AZStd::sort(gamepadInputDevices.begin(), gamepadInputDevices.end(),
[](const AzFramework::InputDevice* lhs, const AzFramework::InputDevice* rhs)
{
return lhs->GetInputDeviceId() < rhs->GetInputDeviceId();
});
for (const AzFramework::InputDevice* gamepadDevice : gamepadInputDevices)
{
const AzFramework::LocalUserId localUserId = gamepadDevice->GetAssignedLocalUserId();
if (localUserId == AzFramework::LocalUserIdAny ||
localUserId == AzFramework::LocalUserIdNone ||
!IsLocalUserSignedIn(localUserId))
{
// The input device has no associated local user id,
// or is associated with a user that's not signed in.
continue;
}
// Assign the local user id to a local player slot.
// If it is already assigned this will do nothing.
LocalUser::LocalUserRequestBus::Broadcast(&LocalUser::LocalUserRequests::AssignLocalUserIdToLocalPlayerSlot,
localUserId,
LocalUser::LocalPlayerSlotAny);
}
// Lastly, iterate over all the local player slots again and 'collapse' them
// so that we aren't left with any gaps. For example, if after all the above
// we are left with user A in local player slot 0 and user B in local player
// slot 3, the following will result in user B being moved down into slot 1.
// Note again that we ignore the primary user here, which is a speacial case
// handled in LyPlatformServicesSystemComponent so that it'll never be empty.
for (AZ::u32 i = LocalUser::LocalPlayerSlotPrimary + 1; i < LocalUser::LocalPlayerSlotMax; ++i)
{
AzFramework::LocalUserId localUserId = LocalUser::LocalUserRequests::GetLocalUserIdAt(i);
if (localUserId == AzFramework::LocalUserIdNone)
{
// No local user assigned to this slot, look for the next occupied slot...
AZ::u32 j = i + 1;
for (; j < LocalUser::LocalPlayerSlotMax; ++j)
{
localUserId = LocalUser::LocalUserRequests::GetLocalUserIdAt(j);
if (localUserId != AzFramework::LocalUserIdNone)
{
// ...and move that local user down into the unnocupied slot.
LocalUser::LocalUserRequestBus::Broadcast(&LocalUser::LocalUserRequests::AssignLocalUserIdToLocalPlayerSlot,
localUserId,
i);
break;
}
}
if (j == LocalUser::LocalPlayerSlotMax)
{
// There are no more occupied slots, no need to continue.
break;
}
}
}
// After all this, refresh the gamepad light bar colors (if they exist)
RefreshAllGamepadLightBarColors();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline bool GameStateLocalUserLobby::IsLocalUserSignedIn(AzFramework::LocalUserId localUserId) const
{
bool isLocalUserSignedIn = false;
LocalUser::LocalUserRequestBus::BroadcastResult(isLocalUserSignedIn,
&LocalUser::LocalUserRequests::IsLocalUserSignedIn,
localUserId);
return isLocalUserSignedIn;
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline bool GameStateLocalUserLobby::IsLocalUserAssociatedWithConnectedInputDevice(AzFramework::LocalUserId localUserId) const
{
AzFramework::InputDeviceRequests::InputDeviceByIdMap inputDevicesById;
AzFramework::InputDeviceRequestBus::Broadcast(&AzFramework::InputDeviceRequests::GetInputDevicesByIdWithAssignedLocalUserId,
inputDevicesById,
localUserId);
for (const auto& inputDeviceById : inputDevicesById)
{
if (inputDeviceById.second && inputDeviceById.second->IsConnected())
{
return true;
}
}
return false;
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLocalUserLobby::RefreshAllGamepadLightBarColors()
{
AzFramework::InputDeviceRequests::InputDeviceByIdMap inputDevicesById;
AzFramework::InputDeviceRequestBus::Broadcast(&AzFramework::InputDeviceRequests::GetInputDevicesById,
inputDevicesById);
for (const auto& inputDeviceById : inputDevicesById)
{
const AzFramework::InputDevice* inputDevice = inputDeviceById.second;
if (inputDevice && AzFramework::InputDeviceGamepad::IsGamepadDevice(inputDeviceById.first))
{
AZ::u32 localPlayerSlot = LocalUser::LocalPlayerSlotNone;
LocalUser::LocalUserRequestBus::BroadcastResult(localPlayerSlot,
&LocalUser::LocalUserRequests::GetLocalPlayerSlotOccupiedByLocalUserId,
inputDevice->GetAssignedLocalUserId());
RefreshGamepadLightBarColor(inputDeviceById.first, localPlayerSlot);
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLocalUserLobby::RefreshGamepadLightBarColor(AzFramework::LocalUserId localUserId,
AZ::u32 localPlayerSlot)
{
AzFramework::InputDeviceRequests::InputDeviceByIdMap inputDevicesById;
AzFramework::InputDeviceRequestBus::Broadcast(&AzFramework::InputDeviceRequests::GetInputDevicesByIdWithAssignedLocalUserId,
inputDevicesById,
localUserId);
for (const auto& inputDeviceById : inputDevicesById)
{
if (inputDeviceById.second && AzFramework::InputDeviceGamepad::IsGamepadDevice(inputDeviceById.first))
{
RefreshGamepadLightBarColor(inputDeviceById.first, localPlayerSlot);
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLocalUserLobby::RefreshGamepadLightBarColor(const AzFramework::InputDeviceId& inputDeviceId,
AZ::u32 localPlayerSlot)
{
// Colors with a low saturation (< 75%) tend to get washed out and look mostly white.
static const AZ::Color s_gamepadLightBarColorsByLocalPlayerSlot[LocalUser::LocalPlayerSlotMax]
{
AZ::Color((AZ::u8)0, (AZ::u8)0, (AZ::u8)255, (AZ::u8)255), // Blue
AZ::Color((AZ::u8)255, (AZ::u8)0, (AZ::u8)0, (AZ::u8)255), // Red
AZ::Color((AZ::u8)0, (AZ::u8)255, (AZ::u8)0, (AZ::u8)255), // Green
#if defined(AZ_PLATFORM_PROVO)
AZ::Color((AZ::u8)255, (AZ::u8)0, (AZ::u8)127, (AZ::u8)255)// Pink
#else
AZ::Color((AZ::u8)127, (AZ::u8)255, (AZ::u8)0, (AZ::u8)255)// Yellow
#endif
};
static const AZ::Color s_gamepadLightBarColorNoLocalPlayerSlot = AZ::Color::CreateOne(); // White
const AZ::Color& lightBarColor = localPlayerSlot < LocalUser::LocalPlayerSlotMax ?
s_gamepadLightBarColorsByLocalPlayerSlot[localPlayerSlot] :
s_gamepadLightBarColorNoLocalPlayerSlot;
AzFramework::InputLightBarRequestBus::Event(inputDeviceId,
&AzFramework::InputLightBarRequests::SetLightBarColor,
lightBarColor);
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLocalUserLobby::RefreshAllSignedInUserOverlays()
{
for (AZ::u32 localPlayerSlot = 0; localPlayerSlot < LocalUser::LocalPlayerSlotMax; ++localPlayerSlot)
{
RefreshSignedInUserOverlay(localPlayerSlot);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLocalUserLobby::RefreshSignedInUserOverlay(AZ::u32 localPlayerSlot)
{
if (!m_signedInUsersOverlayCanvasEntityId.IsValid())
{
return;
}
const AzFramework::LocalUserId localUserId = LocalUser::LocalUserRequests::GetLocalUserIdAt(localPlayerSlot);
if (localUserId == AzFramework::LocalUserIdNone)
{
SetSignedInUserOverlayEnabled(localPlayerSlot, false);
return;
}
const bool isLocalUserSignedIn = IsLocalUserSignedIn(localUserId);
if (!isLocalUserSignedIn)
{
SetSignedInUserOverlayEnabled(localPlayerSlot, false);
return;
}
AZStd::string localUserName;
LocalUser::LocalUserRequestBus::BroadcastResult(localUserName,
&LocalUser::LocalUserRequests::GetLocalUserName,
localUserId);
SetSignedInUserOverlayEnabled(localPlayerSlot, true);
SetSignedInUserOverlayNameText(localPlayerSlot, localUserName);
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLocalUserLobby::SetSignedInUserOverlayEnabled(AZ::u32 localPlayerSlot,
bool enabled)
{
AZ::EntityId userElementName = GetUiElementIdForLocalPlayerSlot("User", localPlayerSlot);
if (userElementName.IsValid())
{
UiElementBus::Event(userElementName, &UiElementInterface::SetIsEnabled, enabled);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateLocalUserLobby::SetSignedInUserOverlayNameText(AZ::u32 localPlayerSlot,
const AZStd::string& localUserName)
{
AZ::EntityId userNameTextElementName = GetUiElementIdForLocalPlayerSlot("UserName", localPlayerSlot);
if (userNameTextElementName.IsValid())
{
UiTextBus::Event(userNameTextElementName, &UiTextInterface::SetText, localUserName);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline AZ::EntityId GameStateLocalUserLobby::GetUiElementIdForLocalPlayerSlot(const char* elementName,
AZ::u32 localPlayerSlot) const
{
char elementNameForSlot[16];
azsnprintf(elementNameForSlot, 16, "%s%d", elementName, localPlayerSlot);
AZ::EntityId elementId;
UiCanvasBus::EventResult(elementId,
m_signedInUsersOverlayCanvasEntityId,
&UiCanvasInterface::FindElementEntityIdByName,
elementNameForSlot);
return elementId;
}
}
@@ -0,0 +1,97 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#include <GameState/GameState.h>
#include <GameStateSamples/GameStateLocalUserLobby.h>
#include <AzCore/std/smart_ptr/unique_ptr.h>
#include <ISystem.h>
////////////////////////////////////////////////////////////////////////////////////////////////////
namespace GameStateSamples
{
////////////////////////////////////////////////////////////////////////////////////////////////
//! Game state that is active while displaying the main game menu (or another front-end menu).
class GameStateMainMenu : public GameState::IGameState
, public ISystemEventListener
{
public:
////////////////////////////////////////////////////////////////////////////////////////////
// Allocator
AZ_CLASS_ALLOCATOR(GameStateMainMenu, AZ::SystemAllocator, 0);
////////////////////////////////////////////////////////////////////////////////////////////
// Type Info
AZ_RTTI(GameStateMainMenu, "{53EB59EC-77F1-4C8E-AC5F-B2A94F15AF31}", IGameState);
////////////////////////////////////////////////////////////////////////////////////////////
//! Default constructor
GameStateMainMenu() = default;
////////////////////////////////////////////////////////////////////////////////////////////
//! Default destructor
~GameStateMainMenu() override = default;
protected:
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnPushed
void OnPushed() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnPopped
void OnPopped() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnEnter
void OnEnter() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnExit
void OnExit() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnUpdate
void OnUpdate() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref ISystemEventListener::OnSystemEvent
void OnSystemEvent(ESystemEvent event, UINT_PTR wparam, UINT_PTR lparam) override;
////////////////////////////////////////////////////////////////////////////////////////////
//! Convenience functions to load and unload the main game menu UI canvas.
///@{
virtual void LoadMainMenuCanvas();
virtual void UnloadMainMenuCanvas();
virtual const char* GetMainMenuCanvasAssetPath();
///@}
////////////////////////////////////////////////////////////////////////////////////////////
//! Refresh the list of levels displayed in the main menu.
virtual void RefreshLevelListDisplay();
////////////////////////////////////////////////////////////////////////////////////////////
//! Load options from persistent storage, which is done upon first entry into the main menu.
virtual void LoadGameOptionsFromPersistentStorage();
protected:
////////////////////////////////////////////////////////////////////////////////////////////
// Variables
AZStd::unique_ptr<GameStateLocalUserLobby> m_localUserLobbySubState;
AZ::EntityId m_mainMenuCanvasEntityId;
bool m_shouldRefreshLevelListDisplay = false;
};
} // namespace GameStateSamples
// Include the implementation inline so the class can be instantiated outside of the gem.
#include <GameStateSamples/GameStateMainMenu.inl>
@@ -0,0 +1,333 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <GameState/GameStateRequestBus.h>
#include <GameStateSamples/GameStateMainMenu.h>
#include <GameStateSamples/GameStateOptionsMenu.h>
#include <GameStateSamples/GameStateLevelLoading.h>
#include <GameStateSamples/GameStatePrimaryUserSelection.h>
#include <GameStateSamples/GameStateSamples_Traits_Platform.h>
#include <LocalUser/LocalUserRequestBus.h>
#include <LyShine/Bus/UiButtonBus.h>
#include <LyShine/Bus/UiCanvasBus.h>
#include <LyShine/Bus/UiCanvasManagerBus.h>
#include <LyShine/Bus/UiCursorBus.h>
#include <LyShine/Bus/UiDynamicLayoutBus.h>
#include <LyShine/Bus/UiElementBus.h>
#include <SaveData/SaveDataRequestBus.h>
#include <ILevelSystem.h>
////////////////////////////////////////////////////////////////////////////////////////////////////
namespace GameStateSamples
{
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateMainMenu::OnPushed()
{
// We could load the UI canvas here and keep it cached until OnPopped is called in order to
// speed up re-entering this game state, but doing so would consume memory for the lifetime
// of the process that is only needed while this state is active (which is not very often).
bool createLocalUserLobbySubState = false;
#if AZ_TRAIT_GAMESTATESAMPLES_LOCAL_USER_LOBBY_ENABLED
createLocalUserLobbySubState = true;
#else
createLocalUserLobbySubState = false;
#endif // AZ_TRAIT_GAMESTATESAMPLES_LOCAL_USER_LOBBY_ENABLED
ISystem* iSystem = GetISystem();
IConsole* iConsole = iSystem ? iSystem->GetIConsole() : nullptr;
if (iConsole && iConsole->GetCVar("sys_localUserLobbyEnabled"))
{
switch (iConsole->GetCVar("sys_localUserLobbyEnabled")->GetIVal())
{
case 0: { createLocalUserLobbySubState = false; } break;
case 1: { createLocalUserLobbySubState = true; } break;
default: break; // Use the default value that was set above
}
}
if (createLocalUserLobbySubState)
{
m_localUserLobbySubState.reset(aznew GameStateLocalUserLobby());
m_localUserLobbySubState->OnPushed();
}
LoadGameOptionsFromPersistentStorage();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateMainMenu::OnPopped()
{
// See comment above in OnPushed
if (m_localUserLobbySubState)
{
m_localUserLobbySubState->OnPopped();
m_localUserLobbySubState.reset();
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateMainMenu::OnEnter()
{
LoadMainMenuCanvas();
if (m_localUserLobbySubState)
{
m_localUserLobbySubState->OnEnter();
}
if (ISystem* iSystem = GetISystem())
{
iSystem->GetISystemEventDispatcher()->RegisterListener(this);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateMainMenu::OnExit()
{
if (ISystem* iSystem = GetISystem())
{
iSystem->GetISystemEventDispatcher()->RemoveListener(this);
}
if (m_localUserLobbySubState)
{
m_localUserLobbySubState->OnExit();
}
UnloadMainMenuCanvas();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateMainMenu::OnUpdate()
{
// This should be called directly from LoadMainMenuCanvas (or right after it from OnEnter),
// but at that point in our convoluted startup sequence the level system doesn't exist yet.
if (m_shouldRefreshLevelListDisplay)
{
m_shouldRefreshLevelListDisplay = false;
RefreshLevelListDisplay();
}
if (m_localUserLobbySubState)
{
m_localUserLobbySubState->OnUpdate();
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void OnLevelButtonClicked(AZ::EntityId entityId, AZ::Vector2)
{
// Load the selected level
AZStd::string levelName;
UiButtonBus::EventResult(levelName, entityId, &UiButtonInterface::GetOnClickActionName);
ISystem* iSystem = GetISystem();
IConsole* iConsole = iSystem ? iSystem->GetIConsole() : nullptr;
ILevelSystem* levelSystem = iSystem ? iSystem->GetILevelSystem() : nullptr;
if (levelSystem && !levelName.empty() && iConsole)
{
// This command gets delayed by one frame, so we check for the
// actual level load start in GameStateMainMenu::OnSystemEvent
AZStd::string mapCommand = "map " + levelName;
iConsole->ExecuteString(mapCommand.c_str());
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void OnOptionsButtonClicked([[maybe_unused]] AZ::EntityId entityId, AZ::Vector2)
{
AZ_Assert(GameState::GameStateRequests::IsActiveGameStateOfType<GameStateMainMenu>(),
"The active game state is not an instance of GameStateMainMenu");
GameState::GameStateRequests::CreateAndPushNewOverridableGameStateOfType<GameStateOptionsMenu>();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void OnBackButtonClicked([[maybe_unused]] AZ::EntityId entityId, AZ::Vector2)
{
AZ_Assert(GameState::GameStateRequests::DoesStackContainGameStateOfType<GameStatePrimaryUserSelection>(),
"The game state stack doesn't contain an instance of GameStatePrimaryUserSelection");
GameState::GameStateRequests::PopActiveGameStateUntilOfType<GameStatePrimaryUserSelection>();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateMainMenu::OnSystemEvent(ESystemEvent event, UINT_PTR, UINT_PTR)
{
// If the user happens to initiate a level load outside the context of these game states,
// for example via executing the 'map' command from the debug console or in autoexec.cfg,
// this will also be detected by checking for the ESYSTEM_EVENT_LEVEL_LOAD_PREPARE event.
if (event == ESYSTEM_EVENT_LEVEL_LOAD_PREPARE)
{
// Push the level loading game state
AZ_Assert(!GameState::GameStateRequests::DoesStackContainGameStateOfType<GameStateLevelLoading>(),
"The game state stack already contains an instance of GameStateLevelLoading");
GameState::GameStateRequests::CreateAndPushNewOverridableGameStateOfType<GameStateLevelLoading>();
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateMainMenu::LoadMainMenuCanvas()
{
// Load the UI canvas
const char* uiCanvasAssetPath = GetMainMenuCanvasAssetPath();
UiCanvasManagerBus::BroadcastResult(m_mainMenuCanvasEntityId,
&UiCanvasManagerInterface::LoadCanvas,
uiCanvasAssetPath);
if (!m_mainMenuCanvasEntityId.IsValid())
{
AZ_Warning("GameStateMainMenu", false, "Could not load %s", uiCanvasAssetPath);
return;
}
// Display the main menu and set it to stay loaded when a level unloads
UiCanvasBus::Event(m_mainMenuCanvasEntityId, &UiCanvasInterface::SetEnabled, true);
UiCanvasBus::Event(m_mainMenuCanvasEntityId, &UiCanvasInterface::SetKeepLoadedOnLevelUnload, true);
// Display the UI cursor
UiCursorBus::Broadcast(&UiCursorInterface::IncrementVisibleCounter);
// Setup the 'Options' button to open the options menu
AZ::EntityId optionsButtonElementId;
UiCanvasBus::EventResult(optionsButtonElementId,
m_mainMenuCanvasEntityId,
&UiCanvasInterface::FindElementEntityIdByName,
"OptionsButton");
UiButtonBus::Event(optionsButtonElementId, &UiButtonInterface::SetOnClickCallback, OnOptionsButtonClicked);
// Setup the 'Back' button to return to the primary user selection screen
AZ::EntityId backButtonElementId;
UiCanvasBus::EventResult(backButtonElementId,
m_mainMenuCanvasEntityId,
&UiCanvasInterface::FindElementEntityIdByName,
"BackButton");
const bool enableBackButton = GameState::GameStateRequests::DoesStackContainGameStateOfType<GameStatePrimaryUserSelection>();
UiElementBus::Event(backButtonElementId, &UiElementInterface::SetIsEnabled, enableBackButton);
if (enableBackButton)
{
UiButtonBus::Event(backButtonElementId, &UiButtonInterface::SetOnClickCallback, OnBackButtonClicked);
}
else
{
// Use the wide version of the 'Options' button.
UiElementBus::Event(optionsButtonElementId, &UiElementInterface::SetIsEnabled, false);
UiCanvasBus::EventResult(optionsButtonElementId,
m_mainMenuCanvasEntityId,
&UiCanvasInterface::FindElementEntityIdByName,
"OptionsButtonWide");
UiElementBus::Event(optionsButtonElementId, &UiElementInterface::SetIsEnabled, true);
UiButtonBus::Event(optionsButtonElementId, &UiButtonInterface::SetOnClickCallback, OnOptionsButtonClicked);
}
// RefreshLevelListDisplay() should be called directly here (or right after it from OnEnter),
// but at this point in our messed up startup sequence the level system doesn't exist yet.
m_shouldRefreshLevelListDisplay = true;
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateMainMenu::UnloadMainMenuCanvas()
{
m_shouldRefreshLevelListDisplay = false;
if (m_mainMenuCanvasEntityId.IsValid())
{
// Hide the UI cursor
UiCursorBus::Broadcast(&UiCursorInterface::DecrementVisibleCounter);
// Unload the main menu
UiCanvasManagerBus::Broadcast(&UiCanvasManagerInterface::UnloadCanvas,
m_mainMenuCanvasEntityId);
m_mainMenuCanvasEntityId.SetInvalid();
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline const char* GameStateMainMenu::GetMainMenuCanvasAssetPath()
{
return "@assets@/ui/canvases/defaultmainmenuscreen.uicanvas";
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateMainMenu::RefreshLevelListDisplay()
{
// Get the dynamic layout UI element
AZ::EntityId dynamicLayoutElementId;
UiCanvasBus::EventResult(dynamicLayoutElementId,
m_mainMenuCanvasEntityId,
&UiCanvasInterface::FindElementEntityIdByName,
"DynamicColumn");
if (dynamicLayoutElementId.IsValid())
{
// Refresh the dynamic layout UI element with the list of levels in the project
ISystem* iSystem = GetISystem();
ILevelSystem* levelSystem = iSystem ? iSystem->GetILevelSystem() : nullptr;
const int numLevels = levelSystem ? levelSystem->GetLevelCount() : 0;
UiDynamicLayoutBus::Event(dynamicLayoutElementId, &UiDynamicLayoutInterface::SetNumChildElements, numLevels);
for (int i = 0; i < numLevels; ++i)
{
// Get the level name (strip folder names from the path)
const char* levelPath = levelSystem->GetLevelInfo(i)->GetName();
const int levelPathLength = strlen(levelPath);
const char* levelName = levelPath;
for (int j = 0; j < levelPathLength; ++j)
{
if ((levelPath[j] == '\\' || levelPath[j] == '/') && j + 1 < levelPathLength)
{
levelName = levelPath + j + 1;
}
}
// Get the button element id
AZ::EntityId buttonElementId;
UiElementBus::EventResult(buttonElementId,
dynamicLayoutElementId,
&UiElementInterface::GetChildEntityId,
i);
// Get the text element id
AZ::EntityId textElementId;
UiElementBus::EventResult(textElementId,
buttonElementId,
&UiElementInterface::FindChildEntityIdByName,
"Text");
// Set the name, on-click callback, and on-click action name for each button
UiTextBus::Event(textElementId, &UiTextInterface::SetText, levelName);
UiButtonBus::Event(buttonElementId, &UiButtonInterface::SetOnClickCallback, OnLevelButtonClicked);
UiButtonBus::Event(buttonElementId, &UiButtonInterface::SetOnClickActionName, levelName);
if (i == 0)
{
// Force the first level to be selected
UiCanvasBus::Event(m_mainMenuCanvasEntityId, &UiCanvasInterface::ForceHoverInteractable, buttonElementId);
}
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateMainMenu::LoadGameOptionsFromPersistentStorage()
{
SaveData::SaveDataRequests::SaveOrLoadObjectParams<GameOptions> loadObjectParams;
GameOptionRequestBus::BroadcastResult(loadObjectParams.serializableObject,
&GameOptionRequests::GetGameOptions);
loadObjectParams.dataBufferName = GameOptions::SaveDataBufferName;
loadObjectParams.localUserId = LocalUser::LocalUserRequests::GetPrimaryLocalUserId();
loadObjectParams.callback = [](const SaveData::SaveDataRequests::SaveOrLoadObjectParams<GameOptions>& params,
[[maybe_unused]] SaveData::SaveDataNotifications::Result result)
{
params.serializableObject->OnLoadedFromPersistentData();
};
SaveData::SaveDataRequests::LoadObject(loadObjectParams);
}
}
@@ -0,0 +1,82 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#include <GameState/GameState.h>
#include <GameStateSamples/GameOptionRequestBus.h>
////////////////////////////////////////////////////////////////////////////////////////////////////
namespace GameStateSamples
{
////////////////////////////////////////////////////////////////////////////////////////////////
//! Game state that is active while displaying the game's options menu.
class GameStateOptionsMenu : public GameState::IGameState
{
public:
////////////////////////////////////////////////////////////////////////////////////////////
// Allocator
AZ_CLASS_ALLOCATOR(GameStateOptionsMenu, AZ::SystemAllocator, 0);
////////////////////////////////////////////////////////////////////////////////////////////
// Type Info
AZ_RTTI(GameStateOptionsMenu, "{2441BA71-8AD2-47A1-92BB-478ED74ACE63}", IGameState);
////////////////////////////////////////////////////////////////////////////////////////////
//! Default constructor
GameStateOptionsMenu() = default;
////////////////////////////////////////////////////////////////////////////////////////////
//! Default destructor
~GameStateOptionsMenu() override = default;
protected:
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnPushed
void OnPushed() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnPopped
void OnPopped() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnEnter
void OnEnter() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnExit
void OnExit() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! Convenience functions to load, unload, and refresh the options menu UI canvas.
///@{
virtual void LoadOptionsMenuCanvas();
virtual void UnloadOptionsMenuCanvas();
virtual void RefreshOptionsMenuCanvas();
virtual void SetOptionsMenuCanvasDrawOrder();
virtual const char* GetOptionsMenuCanvasAssetPath();
///@}
////////////////////////////////////////////////////////////////////////////////////////////
//! Save game options to persistent storage, which is done upon exiting the options menu.
virtual void SaveGameOptionsToPersistentStorage();
protected:
////////////////////////////////////////////////////////////////////////////////////////////
// Variables
AZStd::shared_ptr<GameOptions> m_gameOptions; //!< The game options object
AZ::EntityId m_optionsMenuCanvasEntityId; //!< Id of the UI canvas being displayed
};
} // namespace GameStateSamples
// Include the implementation inline so the class can be instantiated outside of the gem.
#include <GameStateSamples/GameStateOptionsMenu.inl>
@@ -0,0 +1,234 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <GameState/GameStateRequestBus.h>
#include <GameStateSamples/GameStateOptionsMenu.h>
#include <LocalUser/LocalUserRequestBus.h>
#include <SaveData/SaveDataRequestBus.h>
#include <LyShine/Bus/UiButtonBus.h>
#include <LyShine/Bus/UiCanvasBus.h>
#include <LyShine/Bus/UiCanvasManagerBus.h>
#include <LyShine/Bus/UiCursorBus.h>
#include <LyShine/Bus/UiSliderBus.h>
////////////////////////////////////////////////////////////////////////////////////////////////////
namespace GameStateSamples
{
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateOptionsMenu::OnPushed()
{
LoadOptionsMenuCanvas();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateOptionsMenu::OnPopped()
{
UnloadOptionsMenuCanvas();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateOptionsMenu::OnEnter()
{
GameOptionRequestBus::BroadcastResult(m_gameOptions, &GameOptionRequests::GetGameOptions);
RefreshOptionsMenuCanvas();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateOptionsMenu::OnExit()
{
SaveGameOptionsToPersistentStorage();
m_gameOptions.reset();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateOptionsMenu::LoadOptionsMenuCanvas()
{
// Load the UI canvas
const char* uiCanvasAssetPath = GetOptionsMenuCanvasAssetPath();
UiCanvasManagerBus::BroadcastResult(m_optionsMenuCanvasEntityId,
&UiCanvasManagerInterface::LoadCanvas,
uiCanvasAssetPath);
if (!m_optionsMenuCanvasEntityId.IsValid())
{
AZ_Warning("GameStateOptionsMenu", false, "Could not load %s", uiCanvasAssetPath);
return;
}
// Display the options menu
UiCanvasBus::Event(m_optionsMenuCanvasEntityId, &UiCanvasInterface::SetEnabled, true);
SetOptionsMenuCanvasDrawOrder();
// Display the UI cursor
UiCursorBus::Broadcast(&UiCursorInterface::IncrementVisibleCounter);
// Setup the 'Back' button to return to the previous menu (either the main menu or the pause menu)
AZ::EntityId backButtonElementId;
UiCanvasBus::EventResult(backButtonElementId,
m_optionsMenuCanvasEntityId,
&UiCanvasInterface::FindElementEntityIdByName,
"BackButton");
UiButtonBus::Event(backButtonElementId,
&UiButtonInterface::SetOnClickCallback,
[]([[maybe_unused]] AZ::EntityId clickedEntityId, [[maybe_unused]] AZ::Vector2 point)
{
AZ_Assert(GameState::GameStateRequests::IsActiveGameStateOfType<GameStateOptionsMenu>(),
"The active game state is not an instance of GameStateOptionsMenu");
GameState::GameStateRequestBus::Broadcast(&GameState::GameStateRequests::PopActiveGameState);
});
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateOptionsMenu::UnloadOptionsMenuCanvas()
{
if (m_optionsMenuCanvasEntityId.IsValid())
{
// Hide the UI cursor
UiCursorBus::Broadcast(&UiCursorInterface::DecrementVisibleCounter);
// Unload the pause menu
UiCanvasManagerBus::Broadcast(&UiCanvasManagerInterface::UnloadCanvas,
m_optionsMenuCanvasEntityId);
m_optionsMenuCanvasEntityId.SetInvalid();
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateOptionsMenu::RefreshOptionsMenuCanvas()
{
if (!m_gameOptions)
{
return;
}
// Refresh the ambient volume slider
AZ::EntityId ambientVolumeSliderElementId;
UiCanvasBus::EventResult(ambientVolumeSliderElementId,
m_optionsMenuCanvasEntityId,
&UiCanvasInterface::FindElementEntityIdByName,
"AmbientVolumeSlider");
UiSliderBus::Event(ambientVolumeSliderElementId,
&UiSliderInterface::SetValue,
m_gameOptions->GetAmbientVolume());
auto setAmbientVolume = [gameOptions = m_gameOptions]([[maybe_unused]] AZ::EntityId entityId, float value)
{
gameOptions->SetAmbientVolume(value);
};
UiSliderBus::Event(ambientVolumeSliderElementId,
&UiSliderInterface::SetValueChangingCallback,
setAmbientVolume);
UiSliderBus::Event(ambientVolumeSliderElementId,
&UiSliderInterface::SetValueChangedCallback,
setAmbientVolume);
// Refresh the effects volume slider
AZ::EntityId effectsVolumeSliderElementId;
UiCanvasBus::EventResult(effectsVolumeSliderElementId,
m_optionsMenuCanvasEntityId,
&UiCanvasInterface::FindElementEntityIdByName,
"EffectsVolumeSlider");
UiSliderBus::Event(effectsVolumeSliderElementId,
&UiSliderInterface::SetValue,
m_gameOptions->GetEffectsVolume());
auto setEffectsVolume = [gameOptions = m_gameOptions]([[maybe_unused]] AZ::EntityId entityId, float value)
{
gameOptions->SetEffectsVolume(value);
};
UiSliderBus::Event(effectsVolumeSliderElementId,
&UiSliderInterface::SetValueChangingCallback,
setEffectsVolume);
UiSliderBus::Event(effectsVolumeSliderElementId,
&UiSliderInterface::SetValueChangedCallback,
setEffectsVolume);
// Refresh the main volume slider
AZ::EntityId mainVolumeSliderElementId;
UiCanvasBus::EventResult(mainVolumeSliderElementId,
m_optionsMenuCanvasEntityId,
&UiCanvasInterface::FindElementEntityIdByName,
"MainVolumeSlider");
UiSliderBus::Event(mainVolumeSliderElementId,
&UiSliderInterface::SetValue,
m_gameOptions->GetMainVolume());
auto setMainVolume = [gameOptions = m_gameOptions]([[maybe_unused]] AZ::EntityId entityId, float value)
{
gameOptions->SetMainVolume(value);
};
UiSliderBus::Event(mainVolumeSliderElementId,
&UiSliderInterface::SetValueChangingCallback,
setMainVolume);
UiSliderBus::Event(mainVolumeSliderElementId,
&UiSliderInterface::SetValueChangedCallback,
setMainVolume);
// Refresh the music volume slider
AZ::EntityId musicVolumeSliderElementId;
UiCanvasBus::EventResult(musicVolumeSliderElementId,
m_optionsMenuCanvasEntityId,
&UiCanvasInterface::FindElementEntityIdByName,
"MusicVolumeSlider");
UiSliderBus::Event(musicVolumeSliderElementId,
&UiSliderInterface::SetValue,
m_gameOptions->GetMusicVolume());
auto setMusicVolume = [gameOptions = m_gameOptions]([[maybe_unused]] AZ::EntityId entityId, float value)
{
gameOptions->SetMusicVolume(value);
};
UiSliderBus::Event(musicVolumeSliderElementId,
&UiSliderInterface::SetValueChangingCallback,
setMusicVolume);
UiSliderBus::Event(musicVolumeSliderElementId,
&UiSliderInterface::SetValueChangedCallback,
setMusicVolume);
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateOptionsMenu::SetOptionsMenuCanvasDrawOrder()
{
// Loaded canvases are already stored sorted by draw order...
UiCanvasManagerInterface::CanvasEntityList canvases;
UiCanvasManagerBus::BroadcastResult(canvases, &UiCanvasManagerInterface::GetLoadedCanvases);
// ...so get the draw order of the top-most displayed UI canvas...
int highestDrawOrder = 0;
UiCanvasBus::EventResult(highestDrawOrder, canvases.back(), &UiCanvasInterface::GetDrawOrder);
// ...and increment it by one unless it's already set to int max...
if (highestDrawOrder != std::numeric_limits<int>::max())
{
++highestDrawOrder;
}
// ...ensuring the pause menu gets displayed on top of all other loaded canvases,
// with the exception of 'special' ones like message popups or the loading screen
// that use a draw order of int max.
UiCanvasBus::Event(m_optionsMenuCanvasEntityId, &UiCanvasInterface::SetDrawOrder, highestDrawOrder);
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline const char* GameStateOptionsMenu::GetOptionsMenuCanvasAssetPath()
{
return "@assets@/ui/canvases/defaultoptionsmenuscreen.uicanvas";
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStateOptionsMenu::SaveGameOptionsToPersistentStorage()
{
SaveData::SaveDataRequests::SaveOrLoadObjectParams<GameOptions> saveObjectParams;
saveObjectParams.serializableObject = m_gameOptions;
saveObjectParams.dataBufferName = GameOptions::SaveDataBufferName;
saveObjectParams.localUserId = LocalUser::LocalUserRequests::GetPrimaryLocalUserId();
SaveData::SaveDataRequests::SaveObject(saveObjectParams);
}
}
@@ -0,0 +1,81 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#include <GameState/GameState.h>
#include <AzFramework/Input/Events/InputChannelEventListener.h>
#include <AzFramework/Input/Buses/Notifications/InputDeviceNotificationBus.h>
////////////////////////////////////////////////////////////////////////////////////////////////////
namespace GameStateSamples
{
////////////////////////////////////////////////////////////////////////////////////////////////
//! Game state that is active while the primary user's controller is disconnected.
class GameStatePrimaryControllerDisconnected : public GameState::IGameState
, public AzFramework::InputChannelEventListener
, public AzFramework::InputDeviceNotificationBus::Handler
{
public:
////////////////////////////////////////////////////////////////////////////////////////////
// Allocator
AZ_CLASS_ALLOCATOR(GameStatePrimaryControllerDisconnected, AZ::SystemAllocator, 0);
////////////////////////////////////////////////////////////////////////////////////////////
// Type Info
AZ_RTTI(GameStatePrimaryControllerDisconnected, "{47FCBC7A-49CB-4FEB-842A-C730CCB19940}", IGameState);
////////////////////////////////////////////////////////////////////////////////////////////
//! Default constructor
GameStatePrimaryControllerDisconnected() = default;
////////////////////////////////////////////////////////////////////////////////////////////
//! Default destructor
~GameStatePrimaryControllerDisconnected() override = default;
protected:
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnEnter
void OnEnter() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnExit
void OnExit() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref AzFramework::InputChannelEventListener::GetPriority
AZ::s32 GetPriority() const override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref AzFramework::InputChannelEventListener::OnInputChannelEventFiltered
bool OnInputChannelEventFiltered(const AzFramework::InputChannel & inputChannel) override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref AzFramework::InputDeviceNotifications::OnInputDeviceConnectedEvent
void OnInputDeviceConnectedEvent(const AzFramework::InputDevice& inputDevice) override;
////////////////////////////////////////////////////////////////////////////////////////////
//! Convenience functions to show/hide the primary controller disconnected popup.
///@{
virtual void ShowPrimaryControllerDisconnectedPopup();
virtual void HidePrimaryControllerDisconnectedPopup();
///@}
private:
////////////////////////////////////////////////////////////////////////////////////////////
// Variables
AZ::u32 m_primaryControllerDisconnectedPopupId = 0; //!< Id of the popup being displayed
};
} // namespace GameStateSamples
// Include the implementation inline so the class can be instantiated outside of the gem.
#include <GameStateSamples/GameStatePrimaryControllerDisconnected.inl>
@@ -0,0 +1,118 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <GameState/GameStateRequestBus.h>
#include <GameStateSamples/GameStatePrimaryControllerDisconnected.h>
#include <GameStateSamples/GameStateSamples_Traits_Platform.h>
#include <MessagePopup/MessagePopupBus.h>
#include <LocalUser/LocalUserRequestBus.h>
#include <AzFramework/Input/Utils/IsAnyKeyOrButton.h>
#include <ILocalizationManager.h>
////////////////////////////////////////////////////////////////////////////////////////////////////
namespace GameStateSamples
{
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryControllerDisconnected::OnEnter()
{
ShowPrimaryControllerDisconnectedPopup();
AzFramework::InputChannelEventListener::Connect();
AzFramework::InputDeviceNotificationBus::Handler::BusConnect();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryControllerDisconnected::OnExit()
{
AzFramework::InputDeviceNotificationBus::Handler::BusDisconnect();
AzFramework::InputChannelEventListener::Disconnect();
HidePrimaryControllerDisconnectedPopup();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline AZ::s32 GameStatePrimaryControllerDisconnected::GetPriority() const
{
// Re-connecting the primary user's controller takes precedence over everything else
return AzFramework::InputChannelEventListener::GetPriorityFirst();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline bool GameStatePrimaryControllerDisconnected::OnInputChannelEventFiltered(const AzFramework::InputChannel & inputChannel)
{
if (inputChannel.IsStateEnded() &&
AzFramework::IsAnyKeyOrButton(inputChannel))
{
const AzFramework::LocalUserId primaryLocalUserId = LocalUser::LocalUserRequests::GetPrimaryLocalUserId();
if (primaryLocalUserId == inputChannel.GetInputDevice().GetAssignedLocalUserId())
{
AZ_Assert(GameState::GameStateRequests::IsActiveGameStateOfType<GameStatePrimaryControllerDisconnected>(),
"The active game state is not an instance of GameStatePrimaryControllerDisconnected");
GameState::GameStateRequestBus::Broadcast(&GameState::GameStateRequests::PopActiveGameState);
}
}
return true; // Consume all input while this game state is active
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryControllerDisconnected::OnInputDeviceConnectedEvent(const AzFramework::InputDevice& inputDevice)
{
const AzFramework::LocalUserId primaryLocalUserId = LocalUser::LocalUserRequests::GetPrimaryLocalUserId();
if (primaryLocalUserId == inputDevice.GetAssignedLocalUserId())
{
AZ_Assert(GameState::GameStateRequests::IsActiveGameStateOfType<GameStatePrimaryControllerDisconnected>(),
"The active game state is not an instance of GameStatePrimaryControllerDisconnected");
GameState::GameStateRequestBus::Broadcast(&GameState::GameStateRequests::PopActiveGameState);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryControllerDisconnected::ShowPrimaryControllerDisconnectedPopup()
{
if (m_primaryControllerDisconnectedPopupId != 0)
{
// We're already displaying the message popup
return;
}
string localizedMessage;
const char* localizationKey = AZ_TRAIT_GAMESTATESAMPLES_PRIMARY_CONTROLLER_DISCONNECTED_LOC_KEY;
bool wasLocalized = false;
LocalizationManagerRequestBus::BroadcastResult(wasLocalized,
&LocalizationManagerRequestBus::Events::LocalizeString_ch,
localizationKey,
localizedMessage,
false);
const char* popupMessage = wasLocalized && localizedMessage != localizationKey ?
localizedMessage.c_str() :
AZ_TRAIT_GAMESTATESAMPLES_PRIMARY_CONTROLLER_DISCONNECTED_DEFAULT_MESSAGE;
MessagePopup::MessagePopupRequestBus::BroadcastResult(m_primaryControllerDisconnectedPopupId,
&MessagePopup::MessagePopupRequests::ShowPopup,
popupMessage,
MessagePopup::EPopupButtons_NoButtons);
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryControllerDisconnected::HidePrimaryControllerDisconnectedPopup()
{
if (m_primaryControllerDisconnectedPopupId != 0)
{
MessagePopup::MessagePopupRequestBus::Broadcast(&MessagePopup::MessagePopupRequests::HidePopup,
m_primaryControllerDisconnectedPopupId, 0);
m_primaryControllerDisconnectedPopupId = 0;
}
}
}
@@ -0,0 +1,111 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#include <GameState/GameState.h>
#include <GameState/GameStateNotificationBus.h>
#include <LocalUser/LocalUserNotificationBus.h>
#include <AzFramework/API/ApplicationAPI.h>
#include <AzFramework/Input/Buses/Notifications/InputDeviceNotificationBus.h>
////////////////////////////////////////////////////////////////////////////////////////////////////
namespace GameStateSamples
{
////////////////////////////////////////////////////////////////////////////////////////////////
//! Game state that is pushed after determining the primary user (GameStatePrimaryUserSelection)
//! that monitors for events related to the primary user we must respond to (eg. user sign-out).
//! This state will almost never be active, so it won't receive updates, but will rather sit in
//! the stack monitoring for events and respond them by pushing (or popping) other game states.
class GameStatePrimaryUserMonitor : public GameState::IGameState
, public GameState::GameStateNotificationBus::Handler
, public AzFramework::InputDeviceNotificationBus::Handler
, public AzFramework::ApplicationLifecycleEvents::Bus::Handler
, public LocalUser::LocalUserNotificationBus::Handler
{
public:
////////////////////////////////////////////////////////////////////////////////////////////
// Allocator
AZ_CLASS_ALLOCATOR(GameStatePrimaryUserMonitor, AZ::SystemAllocator, 0);
////////////////////////////////////////////////////////////////////////////////////////////
// Type Info
AZ_RTTI(GameStatePrimaryUserMonitor, "{2B7DB914-DEEC-4A2F-B178-9AD953D70FE0}", IGameState);
////////////////////////////////////////////////////////////////////////////////////////////
//! Default constructor
GameStatePrimaryUserMonitor() = default;
////////////////////////////////////////////////////////////////////////////////////////////
//! Default destructor
~GameStatePrimaryUserMonitor() override = default;
protected:
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnPushed
void OnPushed() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnPopped
void OnPopped() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameStateNotifications::OnActiveGameStateChanged
void OnActiveGameStateChanged(AZStd::shared_ptr<IGameState> oldGameState,
AZStd::shared_ptr<IGameState> newGameState) override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref AzFramework::InputDeviceNotifications::OnInputDeviceConnectedEvent
void OnInputDeviceConnectedEvent(const AzFramework::InputDevice& inputDevice) override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref AzFramework::InputDeviceNotifications::OnInputDeviceDisconnectedEvent
void OnInputDeviceDisconnectedEvent(const AzFramework::InputDevice& inputDevice) override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref AzFramework::ApplicationLifecycleEvents::OnApplicationUnconstrained
void OnApplicationUnconstrained(AzFramework::ApplicationLifecycleEvents::Event /*lastEvent*/) override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref LocalUser::LocalUserNotifications::OnLocalUserSignedIn
void OnLocalUserSignedIn(AzFramework::LocalUserId localUserId) override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref LocalUser::LocalUserNotifications::OnLocalUserSignedOut
void OnLocalUserSignedOut(AzFramework::LocalUserId localUserId) override;
////////////////////////////////////////////////////////////////////////////////////////////
//! Convenience function to push the default primary controller disconnected game state.
//! Override if you wish to push a different primary controller disconnected game state.
virtual void PushPrimaryControllerDisconnectedGameState();
////////////////////////////////////////////////////////////////////////////////////////////
//! Convenience function to push the default primary user signed out game state.
//! Override if you wish to push a different primary user signed out game state.
virtual void PushPrimaryUserSignedOutGameState();
////////////////////////////////////////////////////////////////////////////////////////////
//! Convenience function to push the default level paused game state (if it is needed).
//! Override if you wish to push a different level paused game state.
virtual void TryPushLevelPausedGameState();
private:
////////////////////////////////////////////////////////////////////////////////////////////
// Variables
bool m_primaryControllerDisconnectedWhileLevelLoading = false;
bool m_primaryUserSignedOutWhileLevelLoading = false;
};
} // namespace GameStateSamples
// Include the implementation inline so the class can be instantiated outside of the gem.
#include <GameStateSamples/GameStatePrimaryUserMonitor.inl>
@@ -0,0 +1,228 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <GameState/GameStateRequestBus.h>
#include <GameStateSamples/GameStateLevelLoading.h>
#include <GameStateSamples/GameStateLevelPaused.h>
#include <GameStateSamples/GameStateLevelRunning.h>
#include <GameStateSamples/GameStatePrimaryControllerDisconnected.h>
#include <GameStateSamples/GameStatePrimaryUserMonitor.h>
#include <GameStateSamples/GameStatePrimaryUserSignedOut.h>
#include <LocalUser/LocalUserRequestBus.h>
////////////////////////////////////////////////////////////////////////////////////////////////////
namespace GameStateSamples
{
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryUserMonitor::OnPushed()
{
m_primaryControllerDisconnectedWhileLevelLoading = false;
m_primaryUserSignedOutWhileLevelLoading = false;
GameState::GameStateNotificationBus::Handler::BusConnect();
AzFramework::InputDeviceNotificationBus::Handler::BusConnect();
AzFramework::ApplicationLifecycleEvents::Bus::Handler::BusConnect();
LocalUser::LocalUserNotificationBus::Handler::BusConnect();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryUserMonitor::OnPopped()
{
LocalUser::LocalUserNotificationBus::Handler::BusDisconnect();
AzFramework::ApplicationLifecycleEvents::Bus::Handler::BusDisconnect();
AzFramework::InputDeviceNotificationBus::Handler::BusDisconnect();
GameState::GameStateNotificationBus::Handler::BusDisconnect();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryUserMonitor::OnActiveGameStateChanged(AZStd::shared_ptr<IGameState> oldGameState,
AZStd::shared_ptr<IGameState> newGameState)
{
if (m_primaryUserSignedOutWhileLevelLoading &&
azrtti_istypeof<GameStateLevelLoading>(oldGameState.get()))
{
// The primary user signed out while a level was loading,
// we had to wait until the level finished loading before
// transitioning to the primary user signed out game state.
m_primaryUserSignedOutWhileLevelLoading = false;
m_primaryControllerDisconnectedWhileLevelLoading = false;
PushPrimaryUserSignedOutGameState();
return;
}
if (m_primaryControllerDisconnectedWhileLevelLoading &&
azrtti_istypeof<GameStateLevelLoading>(oldGameState.get()))
{
// The controller disconnected while a level was loading,
// we had to wait until the level finished loading before
// transitioning to the controller disconnected game state.
m_primaryControllerDisconnectedWhileLevelLoading = false;
PushPrimaryControllerDisconnectedGameState();
return;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryUserMonitor::OnInputDeviceConnectedEvent(const AzFramework::InputDevice& inputDevice)
{
const AzFramework::LocalUserId primaryLocalUserId = LocalUser::LocalUserRequests::GetPrimaryLocalUserId();
if (m_primaryControllerDisconnectedWhileLevelLoading &&
primaryLocalUserId == inputDevice.GetAssignedLocalUserId())
{
// The controller disconnected while a level was loading,
// but was reconnected before the level finished loading.
m_primaryControllerDisconnectedWhileLevelLoading = false;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryUserMonitor::OnInputDeviceDisconnectedEvent(const AzFramework::InputDevice& inputDevice)
{
const AzFramework::LocalUserId primaryLocalUserId = LocalUser::LocalUserRequests::GetPrimaryLocalUserId();
if (primaryLocalUserId != inputDevice.GetAssignedLocalUserId() ||
primaryLocalUserId == AzFramework::LocalUserIdNone)
{
// The disconnected controller does not belong to the primary user,
// or the primary user has not yet been set.
return;
}
if (GameState::GameStateRequests::IsActiveGameStateOfType<GameStateLevelLoading>())
{
// The controller disconnected while a level is loading;
// we have to wait until the level has finished loading.
m_primaryControllerDisconnectedWhileLevelLoading = true;
return;
}
PushPrimaryControllerDisconnectedGameState();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryUserMonitor::OnApplicationUnconstrained(AzFramework::ApplicationLifecycleEvents::Event /*lastEvent*/)
{
const AzFramework::LocalUserId primaryLocalUserId = LocalUser::LocalUserRequests::GetPrimaryLocalUserId();
if (primaryLocalUserId == AzFramework::LocalUserIdNone)
{
// The primary user has yet to be set
m_primaryUserSignedOutWhileLevelLoading = false;
return;
}
bool isPrimaryLocalUserSignedIn = false;
LocalUser::LocalUserRequestBus::BroadcastResult(isPrimaryLocalUserSignedIn,
&LocalUser::LocalUserRequests::IsLocalUserSignedIn,
primaryLocalUserId);
if (isPrimaryLocalUserSignedIn)
{
// The primary user is still signed in
m_primaryUserSignedOutWhileLevelLoading = false;
return;
}
if (GameState::GameStateRequests::IsActiveGameStateOfType<GameStateLevelLoading>())
{
// The primary user signed out while a level is loading;
// we have to wait until the level has finished loading.
m_primaryUserSignedOutWhileLevelLoading = true;
return;
}
PushPrimaryUserSignedOutGameState();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryUserMonitor::OnLocalUserSignedIn(AzFramework::LocalUserId localUserId)
{
const AzFramework::LocalUserId primaryLocalUserId = LocalUser::LocalUserRequests::GetPrimaryLocalUserId();
if (m_primaryUserSignedOutWhileLevelLoading &&
primaryLocalUserId == localUserId)
{
// The primary user signed out while a level was loading,
// but signed in again before the level finished loading.
m_primaryUserSignedOutWhileLevelLoading = false;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryUserMonitor::OnLocalUserSignedOut(AzFramework::LocalUserId localUserId)
{
const AzFramework::LocalUserId primaryLocalUserId = LocalUser::LocalUserRequests::GetPrimaryLocalUserId();
if (primaryLocalUserId != localUserId ||
primaryLocalUserId == AzFramework::LocalUserIdNone)
{
// The user that signed out is not the primary user,
// or the primary user has not yet been set.
return;
}
if (GameState::GameStateRequests::IsActiveGameStateOfType<GameStateLevelLoading>())
{
// The primary user signed out while a level is loading;
// we have to wait until the level has finished loading.
m_primaryUserSignedOutWhileLevelLoading = true;
return;
}
PushPrimaryUserSignedOutGameState();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryUserMonitor::PushPrimaryControllerDisconnectedGameState()
{
if (GameState::GameStateRequests::DoesStackContainGameStateOfType<GameStatePrimaryControllerDisconnected>() ||
GameState::GameStateRequests::DoesStackContainGameStateOfType<GameStatePrimaryUserSignedOut>())
{
// The controller disconnection has already been detected,
// or the primary user signed out (which takes precedence).
return;
}
// Ensure the game is paused if needed before pushing the controller disconnected game state
TryPushLevelPausedGameState();
GameState::GameStateRequests::CreateAndPushNewOverridableGameStateOfType<GameStatePrimaryControllerDisconnected>();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryUserMonitor::PushPrimaryUserSignedOutGameState()
{
if (GameState::GameStateRequests::DoesStackContainGameStateOfType<GameStatePrimaryUserSignedOut>())
{
// The primary user sign out has already been detected
return;
}
if (GameState::GameStateRequests::IsActiveGameStateOfType<GameStatePrimaryControllerDisconnected>())
{
// The primary user signing out takes precedence over their controller being disconnected
GameState::GameStateRequestBus::Broadcast(&GameState::GameStateRequests::PopActiveGameState);
}
// Ensure the game is paused if needed before pushing the primary user signed out game state
TryPushLevelPausedGameState();
GameState::GameStateRequests::CreateAndPushNewOverridableGameStateOfType<GameStatePrimaryUserSignedOut>();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryUserMonitor::TryPushLevelPausedGameState()
{
if (GameState::GameStateRequests::DoesStackContainGameStateOfType<GameStateLevelPaused>() ||
!GameState::GameStateRequests::DoesStackContainGameStateOfType<GameStateLevelRunning>())
{
// The game has already been paused or is not actively running yet
return;
}
GameState::GameStateRequests::CreateAndPushNewOverridableGameStateOfType<GameStateLevelPaused>();
}
}
@@ -0,0 +1,102 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#include <GameState/GameState.h>
#include <AzFramework/Input/Events/InputChannelEventListener.h>
////////////////////////////////////////////////////////////////////////////////////////////////////
namespace GameStateSamples
{
////////////////////////////////////////////////////////////////////////////////////////////////
//! Game state that is active while waiting to determine who the primary user is.
class GameStatePrimaryUserSelection : public GameState::IGameState
, public AzFramework::InputChannelEventListener
{
public:
////////////////////////////////////////////////////////////////////////////////////////////
// Allocator
AZ_CLASS_ALLOCATOR(GameStatePrimaryUserSelection, AZ::SystemAllocator, 0);
////////////////////////////////////////////////////////////////////////////////////////////
// Type Info
AZ_RTTI(GameStatePrimaryUserSelection, "{953A3CBD-92BD-4B9A-9FD2-C1DC6E9A8BF8}", IGameState);
////////////////////////////////////////////////////////////////////////////////////////////
//! Default constructor
GameStatePrimaryUserSelection() = default;
////////////////////////////////////////////////////////////////////////////////////////////
//! Default destructor
~GameStatePrimaryUserSelection() override = default;
protected:
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnPushed
void OnPushed() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnPopped
void OnPopped() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnEnter
void OnEnter() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnExit
void OnExit() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref AzFramework::InputChannelEventListener::GetPriority
AZ::s32 GetPriority() const override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref AzFramework::InputChannelEventListener::OnInputChannelEventFiltered
//! Used to detect the press of a button / key that will identify the primary user. If you
//! override this class and wish to detect the primary user through another means, or want
//! the UI displayed to process input, you should override this function to do nothing and
//! handle setting the primary user yourself, before transitioning to the next game state.
bool OnInputChannelEventFiltered(const AzFramework::InputChannel & inputChannel) override;
////////////////////////////////////////////////////////////////////////////////////////////
//! Convenience function to set the primary local user and transition to the next game state
//! \param[in] localUserId The local user id to set as the primary user
virtual void SetPrimaryLocalUser(AzFramework::LocalUserId localUserId);
////////////////////////////////////////////////////////////////////////////////////////////
//! Convenience function to push the default primary user monitor game state.
//! Override if you wish to push a different primary user monitor game state.
virtual void PushPrimaryUserMonitorGameState();
////////////////////////////////////////////////////////////////////////////////////////////
//! Convenience function to push the default main menu game state.
//! Override if you wish to push a different main menu game state.
virtual void PushMainMenuGameState();
////////////////////////////////////////////////////////////////////////////////////////////
//! Convenience functions to load and unload the primary user selection UI canvas.
///@{
virtual void LoadPrimaryUserSelectionCanvas();
virtual void UnloadPrimaryUserSelectionCanvas();
virtual const char* GetPrimaryUserSelectionCanvasAssetPath();
protected:
////////////////////////////////////////////////////////////////////////////////////////////
// Variables
AZ::EntityId m_primaryUserSelectionCanvasEntityId; //!< Id of the UI canvas being displayed
};
} // namespace GameStateSamples
// Include the implementation inline so the class can be instantiated outside of the gem.
#include <GameStateSamples/GameStatePrimaryUserSelection.inl>
@@ -0,0 +1,177 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <GameState/GameStateRequestBus.h>
#include <GameStateSamples/GameStateMainMenu.h>
#include <GameStateSamples/GameStatePrimaryUserSelection.h>
#include <GameStateSamples/GameStatePrimaryUserMonitor.h>
#include <LyShine/Bus/UiCanvasBus.h>
#include <LyShine/Bus/UiCanvasManagerBus.h>
#include <LocalUser/LocalUserRequestBus.h>
#include <AzFramework/Input/Utils/IsAnyKeyOrButton.h>
////////////////////////////////////////////////////////////////////////////////////////////////////
namespace GameStateSamples
{
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryUserSelection::OnPushed()
{
// We could load the UI canvas here and keep it cached until OnPopped is called in order to
// speed up re-entering this game state, but doing so would consume memory for the lifetime
// of the process that is only needed while this state is active (which is not very often).
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryUserSelection::OnPopped()
{
// See comment above in OnPushed
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryUserSelection::OnEnter()
{
// In case we are returning to this game state from another (rather than for the first time)
LocalUser::LocalUserRequestBus::Broadcast(&LocalUser::LocalUserRequests::ClearAllLocalUserIdToLocalPlayerSlotAssignments);
UiCanvasManagerBus::Broadcast(&UiCanvasManagerInterface::SetLocalUserIdInputFilterForAllCanvases, AzFramework::LocalUserIdAny);
// Load and display the UI canvas
LoadPrimaryUserSelectionCanvas();
// Start listening for input in order to determine the primary user
InputChannelEventListener::Connect();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryUserSelection::OnExit()
{
// Stop listening for input
InputChannelEventListener::Disconnect();
// Hide and unload the UI canvas
UnloadPrimaryUserSelectionCanvas();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline AZ::s32 GameStatePrimaryUserSelection::GetPriority() const
{
// Take precedence over all other input in order to detect the press of a button or key that
// will identify the primary user. If you override this class and wish to detect the primary
// user through another means or want the UI displayed to process input, you should override
// GameStatePrimaryUserSelection::OnInputChannelEventFiltered to do nothing.
return AzFramework::InputChannelEventListener::GetPriorityFirst();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline bool GameStatePrimaryUserSelection::OnInputChannelEventFiltered(const AzFramework::InputChannel & inputChannel)
{
if (inputChannel.IsStateEnded() && AzFramework::IsAnyKeyOrButton(inputChannel))
{
const AzFramework::LocalUserId localUserId = inputChannel.GetInputDevice().GetAssignedLocalUserId();
if (localUserId == AzFramework::LocalUserIdAny ||
localUserId == AzFramework::LocalUserIdNone)
{
// No local user is associated with this input device yet, so prompt for user sign-in
inputChannel.GetInputDevice().PromptLocalUserSignIn();
}
else
{
SetPrimaryLocalUser(localUserId);
PushPrimaryUserMonitorGameState();
PushMainMenuGameState();
}
}
// Consume the input regardless because nothing else should be able to
// process it while we're waiting to determine who the primary user is.
return true;
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryUserSelection::SetPrimaryLocalUser(AzFramework::LocalUserId localUserId)
{
AZ::u32 assignedSlot = LocalUser::LocalPlayerSlotNone;
LocalUser::LocalUserRequestBus::BroadcastResult(assignedSlot,
&LocalUser::LocalUserRequests::AssignLocalUserIdToLocalPlayerSlot,
localUserId,
LocalUser::LocalPlayerSlotPrimary);
AZ_Assert(assignedSlot == LocalUser::LocalPlayerSlotPrimary,
"Could not assign local user id %u to the primary local player slot", localUserId);
// Make it so only the primary user can interact with the UI
UiCanvasManagerBus::Broadcast(&UiCanvasManagerInterface::SetLocalUserIdInputFilterForAllCanvases, localUserId);
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryUserSelection::PushPrimaryUserMonitorGameState()
{
// Push the game state that monitors for events related to the primary user we must respond to
if (GameState::GameStateRequests::DoesStackContainGameStateOfType<GameStatePrimaryUserMonitor>())
{
AZ_Assert(false, "The game state stack already contains an instance of GameStatePrimaryUserMonitor");
return;
}
GameState::GameStateRequests::CreateAndPushNewOverridableGameStateOfType<GameStatePrimaryUserMonitor>();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryUserSelection::PushMainMenuGameState()
{
// Push the game menu game state
if (GameState::GameStateRequests::DoesStackContainGameStateOfType<GameStateMainMenu>())
{
AZ_Assert(false, "The game state stack already contains an instance of GameStateMainMenu");
return;
}
GameState::GameStateRequests::CreateAndPushNewOverridableGameStateOfType<GameStateMainMenu>();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryUserSelection::LoadPrimaryUserSelectionCanvas()
{
// Load the UI canvas
const char* uiCanvasAssetPath = GetPrimaryUserSelectionCanvasAssetPath();
UiCanvasManagerBus::BroadcastResult(m_primaryUserSelectionCanvasEntityId,
&UiCanvasManagerInterface::LoadCanvas,
uiCanvasAssetPath);
if (!m_primaryUserSelectionCanvasEntityId.IsValid())
{
AZ_Warning("GameStatePrimaryUserSelection", false, "Could not load %s", uiCanvasAssetPath);
return;
}
// Display the canvas and set it to stay loaded when a level unloads
UiCanvasBus::Event(m_primaryUserSelectionCanvasEntityId, &UiCanvasInterface::SetEnabled, true);
UiCanvasBus::Event(m_primaryUserSelectionCanvasEntityId, &UiCanvasInterface::SetKeepLoadedOnLevelUnload, true);
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryUserSelection::UnloadPrimaryUserSelectionCanvas()
{
if (m_primaryUserSelectionCanvasEntityId.IsValid())
{
// Unload the main menu
UiCanvasManagerBus::Broadcast(&UiCanvasManagerInterface::UnloadCanvas,
m_primaryUserSelectionCanvasEntityId);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline const char* GameStatePrimaryUserSelection::GetPrimaryUserSelectionCanvasAssetPath()
{
return "@assets@/ui/canvases/defaultprimaryuserselectionscreen.uicanvas";
}
}
@@ -0,0 +1,82 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#include <GameState/GameState.h>
#include <LocalUser/LocalUserNotificationBus.h>
#include <AzFramework/Input/Events/InputChannelEventListener.h>
////////////////////////////////////////////////////////////////////////////////////////////////////
namespace GameStateSamples
{
////////////////////////////////////////////////////////////////////////////////////////////////
//! Game state that is active while the primary user is signed out.
class GameStatePrimaryUserSignedOut : public GameState::IGameState
, public AzFramework::InputChannelEventListener
, public LocalUser::LocalUserNotificationBus::Handler
{
public:
////////////////////////////////////////////////////////////////////////////////////////////
// Allocator
AZ_CLASS_ALLOCATOR(GameStatePrimaryUserSignedOut, AZ::SystemAllocator, 0);
////////////////////////////////////////////////////////////////////////////////////////////
// Type Info
AZ_RTTI(GameStatePrimaryUserSignedOut, "{5750DA57-349F-4401-B133-977C68ED70A3}", IGameState);
////////////////////////////////////////////////////////////////////////////////////////////
//! Default constructor
GameStatePrimaryUserSignedOut() = default;
////////////////////////////////////////////////////////////////////////////////////////////
//! Default destructor
~GameStatePrimaryUserSignedOut() override = default;
protected:
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnEnter
void OnEnter() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref GameState::GameState::OnExit
void OnExit() override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref AzFramework::InputChannelEventListener::GetPriority
AZ::s32 GetPriority() const override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref AzFramework::InputChannelEventListener::OnInputChannelEventFiltered
bool OnInputChannelEventFiltered(const AzFramework::InputChannel & inputChannel) override;
////////////////////////////////////////////////////////////////////////////////////////////
//! \ref LocalUser::LocalUserNotifications::OnLocalUserSignedIn
void OnLocalUserSignedIn(AzFramework::LocalUserId localUserId) override;
////////////////////////////////////////////////////////////////////////////////////////////
//! Convenience functions to show/hide the primary user signed out popup.
///@{
virtual void ShowPrimaryUserSignedOutPopup();
virtual void HidePrimaryUserSignedOutPopup();
///@}
private:
////////////////////////////////////////////////////////////////////////////////////////////
// Variables
AZ::u32 m_primaryUserSignedOutPopupId = 0; //!< Id of the popup being displayed
};
} // namespace GameStateSamples
// Include the implementation inline so the class can be instantiated outside of the gem.
#include <GameStateSamples/GameStatePrimaryUserSignedOut.inl>
@@ -0,0 +1,133 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <GameState/GameStateRequestBus.h>
#include <GameStateSamples/GameStatePrimaryUserSignedOut.h>
#include <GameStateSamples/GameStatePrimaryUserSelection.h>
#include <MessagePopup/MessagePopupBus.h>
#include <LocalUser/LocalUserRequestBus.h>
#include <AzFramework/Input/Utils/IsAnyKeyOrButton.h>
#include <ILocalizationManager.h>
////////////////////////////////////////////////////////////////////////////////////////////////////
namespace GameStateSamples
{
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryUserSignedOut::OnEnter()
{
ShowPrimaryUserSignedOutPopup();
AzFramework::InputChannelEventListener::Connect();
LocalUser::LocalUserNotificationBus::Handler::BusConnect();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryUserSignedOut::OnExit()
{
LocalUser::LocalUserNotificationBus::Handler::BusDisconnect();
AzFramework::InputChannelEventListener::Disconnect();
HidePrimaryUserSignedOutPopup();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline AZ::s32 GameStatePrimaryUserSignedOut::GetPriority() const
{
// Re-establishing a primary user takes precedence over everything else
return AzFramework::InputChannelEventListener::GetPriorityFirst();
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline bool GameStatePrimaryUserSignedOut::OnInputChannelEventFiltered(const AzFramework::InputChannel & inputChannel)
{
if (inputChannel.IsStateEnded() &&
AzFramework::IsAnyKeyOrButton(inputChannel))
{
const AzFramework::LocalUserId assignedLocalUserId = inputChannel.GetInputDevice().GetAssignedLocalUserId();
const AzFramework::LocalUserId primaryLocalUserId = LocalUser::LocalUserRequests::GetPrimaryLocalUserId();
if (assignedLocalUserId == primaryLocalUserId)
{
// We received input from the primary user, so just pop this state
AZ_Assert(GameState::GameStateRequests::IsActiveGameStateOfType<GameStatePrimaryUserSignedOut>(),
"The active game state is not an instance of GameStatePrimaryUserSignedOut");
GameState::GameStateRequestBus::Broadcast(&GameState::GameStateRequests::PopActiveGameState);
}
else if (assignedLocalUserId == AzFramework::LocalUserIdAny ||
assignedLocalUserId == AzFramework::LocalUserIdNone)
{
// We received input from a device that is not associated with a user, so prompt for user sign-in
inputChannel.GetInputDevice().PromptLocalUserSignIn();
}
else
{
// We received input from a different user confirming we want to select a new one
AZ_Assert(GameState::GameStateRequests::IsActiveGameStateOfType<GameStatePrimaryUserSignedOut>(),
"The active game state is not an instance of GameStatePrimaryUserSignedOut");
GameState::GameStateRequests::PopActiveGameStateUntilOfType<GameStatePrimaryUserSelection>();
}
}
return true; // Consume all input while this game state is active
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryUserSignedOut::OnLocalUserSignedIn(AzFramework::LocalUserId localUserId)
{
const AzFramework::LocalUserId primaryLocalUserId = LocalUser::LocalUserRequests::GetPrimaryLocalUserId();
if (primaryLocalUserId == localUserId)
{
// The primary user signed back in
AZ_Assert(GameState::GameStateRequests::IsActiveGameStateOfType<GameStatePrimaryUserSignedOut>(),
"The active game state is not an instance of GameStatePrimaryUserSignedOut");
GameState::GameStateRequestBus::Broadcast(&GameState::GameStateRequests::PopActiveGameState);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryUserSignedOut::ShowPrimaryUserSignedOutPopup()
{
if (m_primaryUserSignedOutPopupId != 0)
{
// We're already displaying the message popup
return;
}
string localizedMessage;
const char* localizationKey = "@PRIMARY_CONTROLLER_DISCONNECTED_LOC_KEY";
bool wasLocalized = false;
LocalizationManagerRequestBus::BroadcastResult(wasLocalized,
&LocalizationManagerRequestBus::Events::LocalizeString_ch,
localizationKey,
localizedMessage,
false);
const char* popupMessage = wasLocalized && localizedMessage != localizationKey ?
localizedMessage.c_str() :
"Primary profile signed out.\n\nEither sign in again with the same profile, or press any button while signed into a different profile to return to the main menu.\n\n(any unsaved progress will be lost)";
MessagePopup::MessagePopupRequestBus::BroadcastResult(m_primaryUserSignedOutPopupId,
&MessagePopup::MessagePopupRequests::ShowPopup,
popupMessage,
MessagePopup::EPopupButtons_NoButtons);
}
////////////////////////////////////////////////////////////////////////////////////////////////
inline void GameStatePrimaryUserSignedOut::HidePrimaryUserSignedOutPopup()
{
if (m_primaryUserSignedOutPopupId != 0)
{
MessagePopup::MessagePopupRequestBus::Broadcast(&MessagePopup::MessagePopupRequests::HidePopup,
m_primaryUserSignedOutPopupId, 0);
m_primaryUserSignedOutPopupId = 0;
}
}
}
@@ -0,0 +1,18 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#define AZ_TRAIT_GAMESTATESAMPLES_LOCAL_USER_LOBBY_ENABLED 0
#define AZ_TRAIT_GAMESTATESAMPLES_PAUSE_ON_APPLICATION_CONSTRAINED 0
#define AZ_TRAIT_GAMESTATESAMPLES_PRIMARY_CONTROLLER_DISCONNECTED_DEFAULT_MESSAGE "Primary profile's controller disconnected\n\nPlease reconnect"
#define AZ_TRAIT_GAMESTATESAMPLES_PRIMARY_CONTROLLER_DISCONNECTED_LOC_KEY "@PRIMARY_CONTROLLER_DISCONNECTED_LOC_KEY"
#define AZ_TRAIT_GAMESTATESAMPLES_PRIMARY_USER_SELECTION_ENABLED 0
@@ -0,0 +1,14 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#include <GameStateSamples/GameStateSamples_Traits_Android.h>
@@ -0,0 +1,15 @@
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
set(FILES
GameStateSamples/GameStateSamples_Traits_Platform.h
GameStateSamples/GameStateSamples_Traits_Android.h
)
@@ -0,0 +1,18 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#define AZ_TRAIT_GAMESTATESAMPLES_LOCAL_USER_LOBBY_ENABLED 0
#define AZ_TRAIT_GAMESTATESAMPLES_PAUSE_ON_APPLICATION_CONSTRAINED 0
#define AZ_TRAIT_GAMESTATESAMPLES_PRIMARY_CONTROLLER_DISCONNECTED_DEFAULT_MESSAGE "Primary profile's controller disconnected\n\nPlease reconnect"
#define AZ_TRAIT_GAMESTATESAMPLES_PRIMARY_CONTROLLER_DISCONNECTED_LOC_KEY "@PRIMARY_CONTROLLER_DISCONNECTED_LOC_KEY"
#define AZ_TRAIT_GAMESTATESAMPLES_PRIMARY_USER_SELECTION_ENABLED 0
@@ -0,0 +1,14 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#include <GameStateSamples/GameStateSamples_Traits_Linux.h>
@@ -0,0 +1,15 @@
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
set(FILES
GameStateSamples/GameStateSamples_Traits_Platform.h
GameStateSamples/GameStateSamples_Traits_Linux.h
)
@@ -0,0 +1,18 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#define AZ_TRAIT_GAMESTATESAMPLES_LOCAL_USER_LOBBY_ENABLED 0
#define AZ_TRAIT_GAMESTATESAMPLES_PAUSE_ON_APPLICATION_CONSTRAINED 0
#define AZ_TRAIT_GAMESTATESAMPLES_PRIMARY_CONTROLLER_DISCONNECTED_DEFAULT_MESSAGE "Primary profile's controller disconnected\n\nPlease reconnect"
#define AZ_TRAIT_GAMESTATESAMPLES_PRIMARY_CONTROLLER_DISCONNECTED_LOC_KEY "@PRIMARY_CONTROLLER_DISCONNECTED_LOC_KEY"
#define AZ_TRAIT_GAMESTATESAMPLES_PRIMARY_USER_SELECTION_ENABLED 0
@@ -0,0 +1,14 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#include <GameStateSamples/GameStateSamples_Traits_Mac.h>
@@ -0,0 +1,15 @@
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
set(FILES
GameStateSamples/GameStateSamples_Traits_Platform.h
GameStateSamples/GameStateSamples_Traits_Mac.h
)
@@ -0,0 +1,14 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#include <GameStateSamples/GameStateSamples_Traits_Windows.h>
@@ -0,0 +1,18 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#define AZ_TRAIT_GAMESTATESAMPLES_LOCAL_USER_LOBBY_ENABLED 0
#define AZ_TRAIT_GAMESTATESAMPLES_PAUSE_ON_APPLICATION_CONSTRAINED 0
#define AZ_TRAIT_GAMESTATESAMPLES_PRIMARY_CONTROLLER_DISCONNECTED_DEFAULT_MESSAGE "Primary profile's controller disconnected\n\nPlease reconnect"
#define AZ_TRAIT_GAMESTATESAMPLES_PRIMARY_CONTROLLER_DISCONNECTED_LOC_KEY "@PRIMARY_CONTROLLER_DISCONNECTED_LOC_KEY"
#define AZ_TRAIT_GAMESTATESAMPLES_PRIMARY_USER_SELECTION_ENABLED 0
@@ -0,0 +1,15 @@
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
set(FILES
GameStateSamples/GameStateSamples_Traits_Platform.h
GameStateSamples/GameStateSamples_Traits_Windows.h
)
@@ -0,0 +1,14 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#include <GameStateSamples/GameStateSamples_Traits_iOS.h>
@@ -0,0 +1,18 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#define AZ_TRAIT_GAMESTATESAMPLES_LOCAL_USER_LOBBY_ENABLED 0
#define AZ_TRAIT_GAMESTATESAMPLES_PAUSE_ON_APPLICATION_CONSTRAINED 0
#define AZ_TRAIT_GAMESTATESAMPLES_PRIMARY_CONTROLLER_DISCONNECTED_DEFAULT_MESSAGE "Primary profile's controller disconnected\n\nPlease reconnect"
#define AZ_TRAIT_GAMESTATESAMPLES_PRIMARY_CONTROLLER_DISCONNECTED_LOC_KEY "@PRIMARY_CONTROLLER_DISCONNECTED_LOC_KEY"
#define AZ_TRAIT_GAMESTATESAMPLES_PRIMARY_USER_SELECTION_ENABLED 0
@@ -0,0 +1,15 @@
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
set(FILES
GameStateSamples/GameStateSamples_Traits_Platform.h
GameStateSamples/GameStateSamples_Traits_iOS.h
)
@@ -0,0 +1,195 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <AzCore/Component/ComponentApplicationBus.h>
#include <AzCore/Memory/SystemAllocator.h>
#include <AzCore/Module/Module.h>
#include <AzCore/std/smart_ptr/make_shared.h>
#include <GameStateSamples/GameOptionRequestBus.h>
#include <GameStateSamples/GameStateLevelRunning.h>
#include <GameStateSamples/GameStateMainMenu.h>
#include <GameStateSamples/GameStatePrimaryUserSelection.h>
#include <GameStateSamples/GameStateSamples_Traits_Platform.h>
#include <IConsole.h>
#include <IGem.h>
namespace GameStateSamples
{
using namespace GameState;
////////////////////////////////////////////////////////////////////////////////////////////////
//! This Gem provides a set of sample game states that can be overridden (or replaced entirely)
//! in order to customize the functionality as needed for your game. To circumvent this default
//! set of game states, push a custom game state before GameStateModule::OnCrySystemInitialized
//! is called, or just don't enable this Gem for your project (only the GameState Gem is needed
//! if you plan on creating entirely custom game states). The flow of the sample game states in
//! this Gem is roughly as follows:
//!
//! GameStatePrimaryUserSelection
//! |
//! V
//! GameStatePrimaryUserMonitor____
//! | |
//! V |
//! GameStateMainMenu |
//! | |
//! V |
//! GameStateLevelLoading |
//! | |
//! V |
//! GameStateLevelRunning |
//! | |
//! V |
//! GameStateLevelPaused |
//! |
//! GameStatePrimaryUserSignedOut<--|
//! |
//! PrimaryControllerDisconnected<--|
//!
class GameStateSamplesModule
: public CryHooksModule
, public GameOptionRequestBus::Handler
{
public:
AZ_RTTI(GameStateSamplesModule, "{FC206260-D188-45A5-8B23-1D7A1DA6E82F}", AZ::Module);
AZ_CLASS_ALLOCATOR(GameStateSamplesModule, AZ::SystemAllocator, 0);
GameStateSamplesModule()
: CryHooksModule()
{
m_gameOptions = AZStd::make_shared<GameOptions>();
AZ::SerializeContext* serializeContext = nullptr;
AZ::ComponentApplicationBus::BroadcastResult(serializeContext,
&AZ::ComponentApplicationRequests::GetSerializeContext);
if (serializeContext)
{
m_gameOptions->Reflect(*serializeContext);
}
GameOptionRequestBus::Handler::BusConnect();
}
~GameStateSamplesModule()
{
GameOptionRequestBus::Handler::BusDisconnect();
m_gameOptions.reset();
}
protected:
void OnCrySystemInitialized(ISystem& system, const SSystemInitParams& systemInitParams)
{
CryHooksModule::OnCrySystemInitialized(system, systemInitParams);
REGISTER_INT("sys_primaryUserSelectionEnabled", 2, VF_NULL,
"Controls whether the game forces selection of a primary user at startup.\n"
"0 : Skip selection of a primary user at startup on all platform.\n"
"1 : Force selection of a primary user at startup on all platforms.\n"
"2 : Force selection of a primary user at startup on console platforms (default).\n");
REGISTER_INT("sys_pauseOnApplicationConstrained", 2, VF_NULL,
"Controls whether the game should pause when the application is constrained.\n"
"0 : Don't pause the game when the application is constrained on any platform.\n"
"1 : Pause the game when the application is constrained on all platforms.\n"
"2 : Pause the game when the application is constrained on console platforms (default).\n");
REGISTER_INT("sys_localUserLobbyEnabled", 2, VF_NULL,
"Controls whether the local user lobby should be enabled.\n"
"0 : Don't enable the local user lobby on any platform.\n"
"1 : Enable the local user lobby on all platforms.\n"
"2 : Enable the local user lobby on console platforms (default).\n");
if (gEnv && gEnv->IsEditor())
{
// Don't push any game states when running in the editor
return;
}
AZStd::shared_ptr<IGameState> activeGameState;
GameStateRequestBus::BroadcastResult(activeGameState, &GameStateRequests::GetActiveGameState);
if (activeGameState)
{
// The game has pushed a custom initial game state
return;
}
bool primaryUserSelectionEnabled = false;
#if AZ_TRAIT_GAMESTATESAMPLES_PRIMARY_USER_SELECTION_ENABLED
primaryUserSelectionEnabled = true;
#else
primaryUserSelectionEnabled = false;
#endif // AZ_TRAIT_GAMESTATESAMPLES_PRIMARY_USER_SELECTION_ENABLED
if (gEnv && gEnv->pConsole && gEnv->pConsole->GetCVar("sys_primaryUserSelectionEnabled"))
{
switch (gEnv->pConsole->GetCVar("sys_primaryUserSelectionEnabled")->GetIVal())
{
case 0: { primaryUserSelectionEnabled = false; } break;
case 1: { primaryUserSelectionEnabled = true; } break;
default: break; // Use the default value that was set above
}
}
if (primaryUserSelectionEnabled)
{
GameStateRequests::CreateAndPushNewOverridableGameStateOfType<GameStatePrimaryUserSelection>();
}
else
{
GameStateRequests::CreateAndPushNewOverridableGameStateOfType<GameStateMainMenu>();
}
}
void OnSystemEvent(ESystemEvent systemEvent, UINT_PTR wparam, UINT_PTR /*lparam*/) override
{
// This logic is a little confusing, but we need to check for both...
// ...the END of a switch INTO game mode...
if (systemEvent == ESYSTEM_EVENT_GAME_MODE_SWITCH_END && wparam)
{
OnEditorGameModeEntered();
}
// ...and the START of a switch OUT OF game mode.
else if (systemEvent == ESYSTEM_EVENT_GAME_MODE_SWITCH_START && !wparam)
{
OnEditorGameModeExiting();
}
}
AZStd::shared_ptr<GameOptions> GetGameOptions() override
{
return m_gameOptions;
}
private:
void OnEditorGameModeEntered()
{
AZStd::shared_ptr<IGameState> activeGameState;
GameStateRequestBus::BroadcastResult(activeGameState, &GameStateRequests::GetActiveGameState);
AZ_Assert(!activeGameState, "OnEditorGameModeStart: The game state stack is not empty.");
// After entering game mode from the editor, transition straight into the level running state
GameStateRequests::CreateAndPushNewOverridableGameStateOfType<GameStateLevelRunning>();
}
void OnEditorGameModeExiting()
{
// Before exiting game mode from the editor, clear all active game states
GameStateRequestBus::Broadcast(&GameStateRequests::PopAllGameStates);
}
private:
AZStd::shared_ptr<GameOptions> m_gameOptions;
};
}
// DO NOT MODIFY THIS LINE UNLESS YOU RENAME THE GEM
// The first parameter should be GemName_GemIdLower
// The second should be the fully qualified name of the class above
AZ_DECLARE_MODULE_CLASS(Gem_GameStateSamples, GameStateSamples::GameStateSamplesModule)
@@ -0,0 +1,34 @@
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
set(FILES
Include/GameStateSamples/GameOptionRequestBus.h
Include/GameStateSamples/GameStateLevelLoading.h
Include/GameStateSamples/GameStateLevelLoading.inl
Include/GameStateSamples/GameStateLevelPaused.h
Include/GameStateSamples/GameStateLevelPaused.inl
Include/GameStateSamples/GameStateLevelRunning.h
Include/GameStateSamples/GameStateLevelRunning.inl
Include/GameStateSamples/GameStateLocalUserLobby.h
Include/GameStateSamples/GameStateLocalUserLobby.inl
Include/GameStateSamples/GameStateMainMenu.h
Include/GameStateSamples/GameStateMainMenu.inl
Include/GameStateSamples/GameStateOptionsMenu.h
Include/GameStateSamples/GameStateOptionsMenu.inl
Include/GameStateSamples/GameStatePrimaryControllerDisconnected.h
Include/GameStateSamples/GameStatePrimaryControllerDisconnected.inl
Include/GameStateSamples/GameStatePrimaryUserMonitor.h
Include/GameStateSamples/GameStatePrimaryUserMonitor.inl
Include/GameStateSamples/GameStatePrimaryUserSelection.h
Include/GameStateSamples/GameStatePrimaryUserSelection.inl
Include/GameStateSamples/GameStatePrimaryUserSignedOut.h
Include/GameStateSamples/GameStatePrimaryUserSignedOut.inl
)
@@ -0,0 +1,14 @@
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
set(FILES
Source/GameStateSamplesModule.cpp
)
+48
View File
@@ -0,0 +1,48 @@
{
"Dependencies":
[
{
"Uuid" : "1a557ac19dc34f5697fe03f30be5b6e4",
"VersionConstraints" : [">=0.1.0"],
"_comment" : "GameState"
},
{
"Uuid" : "ff06785f7145416b9d46fde39098cb0c",
"VersionConstraints" : [">=0.1.0"],
"_comment" : "LmbrCentral"
},
{
"Uuid" : "93ccb44a96b142f7942a3fb6b9ca36e1",
"VersionConstraints" : [">=0.1.0"],
"_comment" : "LocalUser"
},
{
"Uuid" : "c7935ecf5e8047fe8ca947b34b11cadb",
"VersionConstraints" : [">=0.1.0"],
"_comment" : "LyShineExamples"
},
{
"Uuid" : "89225422672547deaca9e7a22b883973",
"VersionConstraints" : [">=0.1.0"],
"_comment" : "MessagePopup"
},
{
"Uuid" : "d96ab03f53d14c9e83f9b4528c8576d7",
"VersionConstraints" : [">=0.1.0"],
"_comment" : "SaveData"
}
],
"GemFormatVersion": 4,
"Uuid": "76db0b1bcff84224a92cbceb373f4a85",
"Name": "GameStateSamples",
"DisplayName": "GameStateSamples",
"Version": "0.1.0",
"Summary": "Provides a set of sample game states (built on top of the generic GameState Gem), including primary user selection, main menu, level loading, level running, and level paused.",
"Tags": ["Game State", "Main Menu", "Level Loading", "Pause Menu", "Primary User", "Local Multiplayer", "Local Co-op", "Split Screen"],
"IconPath": "preview.png",
"Modules": [
{
"Type": "GameModule"
}
]
}
+3
View File
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:786eccaaae40e73e1a1885305891d4be7e031f021a54204e56c231f7b95a2962
size 1263