diff --git a/Config/DefaultEditor.ini b/Config/DefaultEditor.ini index 8a83989..f1f862e 100644 --- a/Config/DefaultEditor.ini +++ b/Config/DefaultEditor.ini @@ -1,5 +1,5 @@ [UnrealEd.SimpleMap] -SimpleMapName=/Game/TopDown/Maps/TopDownExampleMap +SimpleMapName=/Game/Maps/TopDownExampleMap [EditoronlyBP] bAllowClassAndBlueprintPinMatching=true diff --git a/Config/DefaultEngine.ini b/Config/DefaultEngine.ini index c428b65..351c7d4 100644 --- a/Config/DefaultEngine.ini +++ b/Config/DefaultEngine.ini @@ -1,6 +1,6 @@ [/Script/EngineSettings.GameMapsSettings] -GameDefaultMap=/Game/TopDown/Maps/TopDownMap.TopDownMap -EditorStartupMap=/Game/TopDown/Maps/TopDownMap.TopDownMap +GameDefaultMap=/Game/Maps/TopDownMap.TopDownMap +EditorStartupMap=/Game/Maps/TopDownMap.TopDownMap GlobalDefaultGameMode="/Script/UTAD_UI.UTAD_UIGameMode" [/Script/Engine.RendererSettings] diff --git a/Content/Art/T_Damage_T1.uasset b/Content/Art/T_Damage_T1.uasset new file mode 100644 index 0000000..e59f325 --- /dev/null +++ b/Content/Art/T_Damage_T1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a0c413d8b8cbb1e4aa3491443a95032497670b691f1b7068339c42662879a78 +size 30831 diff --git a/Content/Art/T_Damage_T2.uasset b/Content/Art/T_Damage_T2.uasset new file mode 100644 index 0000000..70e3b85 --- /dev/null +++ b/Content/Art/T_Damage_T2.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b7c69514f14a0d60518f47876d3e7547bf23f5fb3e7fea6f793888b0ee648854 +size 34271 diff --git a/Content/Art/T_Damage_T3.uasset b/Content/Art/T_Damage_T3.uasset new file mode 100644 index 0000000..7a9cd59 --- /dev/null +++ b/Content/Art/T_Damage_T3.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b2594ef272b7ce362d3d66e647e7f38c7c7c8a7435678b4dcd6b5b17447e4d36 +size 38426 diff --git a/Content/Art/T_Health_T1.uasset b/Content/Art/T_Health_T1.uasset new file mode 100644 index 0000000..7f03352 --- /dev/null +++ b/Content/Art/T_Health_T1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:731e06424adde445c58c57eb0b56f342d7e73f020d500da9a74a9744d2592b61 +size 45614 diff --git a/Content/Art/T_Health_T2.uasset b/Content/Art/T_Health_T2.uasset new file mode 100644 index 0000000..4249040 --- /dev/null +++ b/Content/Art/T_Health_T2.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3ccb606c283c0359addc2e8aa7e6afa557e095bbc7cf5523aa0d8eed30eefeeb +size 46670 diff --git a/Content/Art/T_Health_T3.uasset b/Content/Art/T_Health_T3.uasset new file mode 100644 index 0000000..2829265 --- /dev/null +++ b/Content/Art/T_Health_T3.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b34ce4d201774d757c867a5641fe904ad750bc942a2370199c936f86cf0f4d6c +size 51983 diff --git a/Content/Art/T_NodeBackground.uasset b/Content/Art/T_NodeBackground.uasset new file mode 100644 index 0000000..ec18c28 --- /dev/null +++ b/Content/Art/T_NodeBackground.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8d4b47ba73868f5cd0937eb8443f70814ba1970dc6e9bb0cae7ae586589e3949 +size 21406 diff --git a/Content/Art/T_NodeBorder.uasset b/Content/Art/T_NodeBorder.uasset new file mode 100644 index 0000000..b7f7062 --- /dev/null +++ b/Content/Art/T_NodeBorder.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:028c673003002051e4481c40318c7ddd9f8d1269e69694c6b7be95ff9b1d4c24 +size 24609 diff --git a/Content/Art/T_Speed_T1.uasset b/Content/Art/T_Speed_T1.uasset new file mode 100644 index 0000000..77823a4 --- /dev/null +++ b/Content/Art/T_Speed_T1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b4cf5919d29ee6653c1cd12841f31f3f3df3606a4fedb4223614b77f5ede166 +size 54297 diff --git a/Content/Art/T_Speed_T2.uasset b/Content/Art/T_Speed_T2.uasset new file mode 100644 index 0000000..8704983 --- /dev/null +++ b/Content/Art/T_Speed_T2.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d8d996ce2c8b4edaafd2c16e3d871d3adddf00ccde5f767f110a9ef01c84eab +size 58975 diff --git a/Content/Art/T_Speed_T3.uasset b/Content/Art/T_Speed_T3.uasset new file mode 100644 index 0000000..fc157c6 --- /dev/null +++ b/Content/Art/T_Speed_T3.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f17a537945177856a8a1f66aa3c35528bc76b4d2d6cd5fce161e48f86218f89c +size 62988 diff --git a/Content/Blueprints/BP_MainCharacter.uasset b/Content/Blueprints/BP_MainCharacter.uasset new file mode 100644 index 0000000..a82a14e --- /dev/null +++ b/Content/Blueprints/BP_MainCharacter.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a1d6278617594fb29174d05902ae7d663b98a1bc5b6ec50affeac971c10dadb +size 29043 diff --git a/Content/Blueprints/BP_MainPlayerController.uasset b/Content/Blueprints/BP_MainPlayerController.uasset new file mode 100644 index 0000000..6349249 --- /dev/null +++ b/Content/Blueprints/BP_MainPlayerController.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e39e2619235b70ec969458e3e02ad066a9a38695e7e7bd51bb6819fa629401b +size 22101 diff --git a/Content/DT_SkillTree.uasset b/Content/DT_SkillTree.uasset new file mode 100644 index 0000000..cf7461d --- /dev/null +++ b/Content/DT_SkillTree.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:debfd603944ce4f85ef2d8bcb40cb34a2feeb5bfd01778cb95e2eb8a45096f55 +size 11528 diff --git a/Content/Input/Actions/IA_OpenSkillTree.uasset b/Content/Input/Actions/IA_OpenSkillTree.uasset new file mode 100644 index 0000000..b177428 --- /dev/null +++ b/Content/Input/Actions/IA_OpenSkillTree.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:839ae9c9a5ee0572c2458269aa4fc7db27f79339e8b6d66102b0fc4c95767030 +size 1766 diff --git a/Content/Input/Actions/IA_SetDestination_Click.uasset b/Content/Input/Actions/IA_SetDestination_Click.uasset new file mode 100644 index 0000000..5198f19 --- /dev/null +++ b/Content/Input/Actions/IA_SetDestination_Click.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:753f3723a5d99c15ef1a3e25d5cb03526d1aaa12acdcaab135a33e9a09fa8149 +size 1516 diff --git a/Content/Input/Actions/IA_SetDestination_Touch.uasset b/Content/Input/Actions/IA_SetDestination_Touch.uasset new file mode 100644 index 0000000..ba4c06a --- /dev/null +++ b/Content/Input/Actions/IA_SetDestination_Touch.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d690fd1c89f36c5d4bc5f4486a718756d678ac862a611a152ac1d471cceac712 +size 1516 diff --git a/Content/Input/IMC_Default.uasset b/Content/Input/IMC_Default.uasset new file mode 100644 index 0000000..c269342 --- /dev/null +++ b/Content/Input/IMC_Default.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:83dd03da390eaa8accb8ceffae206fbd91556ad8c826858c1bd50305ea6fe4aa +size 4210 diff --git a/Content/Maps/TopDownMap.umap b/Content/Maps/TopDownMap.umap new file mode 100644 index 0000000..2bbe796 --- /dev/null +++ b/Content/Maps/TopDownMap.umap @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b7a0f6b563a7f3405792d9b6a6d970830371722172fbe36c15d85a3d15000e2c +size 36878 diff --git a/Content/TopDown/Blueprints/BP_TopDownCharacter.uasset b/Content/TopDown/Blueprints/BP_TopDownCharacter.uasset deleted file mode 100644 index 3bd840e..0000000 --- a/Content/TopDown/Blueprints/BP_TopDownCharacter.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ef32382e6fd52750aab879b9119cfd20e3ccea79c9206e0b1c5c15ef5e4b0dc5 -size 27592 diff --git a/Content/TopDown/Blueprints/BP_TopDownPlayerController.uasset b/Content/TopDown/Blueprints/BP_TopDownPlayerController.uasset deleted file mode 100644 index b4387a2..0000000 --- a/Content/TopDown/Blueprints/BP_TopDownPlayerController.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:374816d5e29b8ba7f9dcf4fbe7005462ff7f6e5a357701cc204510ddf58899df -size 19841 diff --git a/Content/TopDown/Input/Actions/IA_SetDestination_Click.uasset b/Content/TopDown/Input/Actions/IA_SetDestination_Click.uasset deleted file mode 100644 index 38bda4b..0000000 --- a/Content/TopDown/Input/Actions/IA_SetDestination_Click.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d95ee2d091397c66aef549c3e4e00746a600858f2af3edc55254d74fa56136f -size 1436 diff --git a/Content/TopDown/Input/Actions/IA_SetDestination_Touch.uasset b/Content/TopDown/Input/Actions/IA_SetDestination_Touch.uasset deleted file mode 100644 index accde4c..0000000 --- a/Content/TopDown/Input/Actions/IA_SetDestination_Touch.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e540c5008986008cde80bb27becc74f9fe325b6dea5af85977e5c96173076b1d -size 1436 diff --git a/Content/TopDown/Input/IMC_Default.uasset b/Content/TopDown/Input/IMC_Default.uasset deleted file mode 100644 index 2088f49..0000000 --- a/Content/TopDown/Input/IMC_Default.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ccc2cdbeced88d31a01df20c67c059faa3874626d9814e59c210e8843becd364 -size 3099 diff --git a/Content/TopDown/Maps/TopDownMap.umap b/Content/TopDown/Maps/TopDownMap.umap deleted file mode 100644 index 4adc8fd..0000000 --- a/Content/TopDown/Maps/TopDownMap.umap +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:21f3c9b6a2ad12c7f47a8fba06c4f5bb9d7df535ed3ea03d6aee3cc4ebb7a2b6 -size 37280 diff --git a/Content/UI/WBP_MainHUD.uasset b/Content/UI/WBP_MainHUD.uasset new file mode 100644 index 0000000..bac51d0 --- /dev/null +++ b/Content/UI/WBP_MainHUD.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2b2a7e4b6cf88af84f8b49f588aacae62775b18f721728c1836e8e33c77059f9 +size 94063 diff --git a/Content/UI/WBP_SkillNode.uasset b/Content/UI/WBP_SkillNode.uasset new file mode 100644 index 0000000..f0332ff --- /dev/null +++ b/Content/UI/WBP_SkillNode.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fbae4dd9457a9da175c1dfd1447dd77e9c4631a9d78f82908d7104568f750b6d +size 283220 diff --git a/Content/UI/WBP_SkillTree.uasset b/Content/UI/WBP_SkillTree.uasset new file mode 100644 index 0000000..e9a4c3c --- /dev/null +++ b/Content/UI/WBP_SkillTree.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6e0c146fd7a416f8a3b0ac66ecaf1a061d87be97d55edcb410c1471c347f5bb +size 282145 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/0/2R/0W5U891LO60KU9AH1C3TE5.uasset b/Content/__ExternalActors__/Maps/TopDownMap/0/2R/0W5U891LO60KU9AH1C3TE5.uasset new file mode 100644 index 0000000..50bee76 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/0/2R/0W5U891LO60KU9AH1C3TE5.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c3238cc26879586b40efa8871cc7d237205568fba4b76b87085369cb1802d290 +size 4647 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/0/CJ/30W4Y6B464ZDBCK91TC5OF.uasset b/Content/__ExternalActors__/Maps/TopDownMap/0/CJ/30W4Y6B464ZDBCK91TC5OF.uasset new file mode 100644 index 0000000..bca8577 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/0/CJ/30W4Y6B464ZDBCK91TC5OF.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4d62fe913963a9883c10ea64103db7b9dc81b111a71f08c92ab089de5956edcd +size 4471 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/1/06/WQ699RL0IO0S53552LRDGK.uasset b/Content/__ExternalActors__/Maps/TopDownMap/1/06/WQ699RL0IO0S53552LRDGK.uasset new file mode 100644 index 0000000..73bf4de --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/1/06/WQ699RL0IO0S53552LRDGK.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c25120831fe9abe8f7ce04fe3778eeec3fab33b5e0d72121e0f278cd4de91a3a +size 4449 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/1/ER/0052Q73JIE2QUZ2PRYCN70.uasset b/Content/__ExternalActors__/Maps/TopDownMap/1/ER/0052Q73JIE2QUZ2PRYCN70.uasset new file mode 100644 index 0000000..0e5e460 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/1/ER/0052Q73JIE2QUZ2PRYCN70.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:451ed51acf06c07451f91eaa6219b84a99c44f3fb315d9981d3915a18e448723 +size 3969 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/2/7L/ZLK0WFZ40XXDSQEKE18ETY.uasset b/Content/__ExternalActors__/Maps/TopDownMap/2/7L/ZLK0WFZ40XXDSQEKE18ETY.uasset new file mode 100644 index 0000000..9a5d7f0 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/2/7L/ZLK0WFZ40XXDSQEKE18ETY.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e7026346b5ccc26d213ed89861a751f8354d8948689cf63e6cc7cafd42981af +size 3751 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/2/SO/0WBQ0JFQYHNK6L0M55NCLJ.uasset b/Content/__ExternalActors__/Maps/TopDownMap/2/SO/0WBQ0JFQYHNK6L0M55NCLJ.uasset new file mode 100644 index 0000000..cf268f8 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/2/SO/0WBQ0JFQYHNK6L0M55NCLJ.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:52fc992e88a317ba3a17f26711c36044f430a9cdf229fbf1093e2d8ec8310239 +size 7071 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/2/YN/AYX438C9JYYJ4DDSPIV4A5.uasset b/Content/__ExternalActors__/Maps/TopDownMap/2/YN/AYX438C9JYYJ4DDSPIV4A5.uasset new file mode 100644 index 0000000..5b54fb9 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/2/YN/AYX438C9JYYJ4DDSPIV4A5.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1213a3156950d8336c2f166f19f9fd5b5dbf7bfd7c61ef5e79a8d0dfb4805d14 +size 5388 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/3/D1/3P0V7GN2WCBEV177DCBQMP.uasset b/Content/__ExternalActors__/Maps/TopDownMap/3/D1/3P0V7GN2WCBEV177DCBQMP.uasset new file mode 100644 index 0000000..81a429d --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/3/D1/3P0V7GN2WCBEV177DCBQMP.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4dc10ccf6577f181787a8b7eb1e2dbf9c91511dbe71e79dd3803960c83c91425 +size 4587 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/3/F3/NKKMEQ947H3S9IQUZHNODB.uasset b/Content/__ExternalActors__/Maps/TopDownMap/3/F3/NKKMEQ947H3S9IQUZHNODB.uasset new file mode 100644 index 0000000..c7ffc0c --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/3/F3/NKKMEQ947H3S9IQUZHNODB.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:50e994234a91fc04defa9382a6f8abf52831019791f82f4942156a57cd0a9308 +size 4449 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/3/RG/G5B1KP1SS6MUNGGUDJUUQ3.uasset b/Content/__ExternalActors__/Maps/TopDownMap/3/RG/G5B1KP1SS6MUNGGUDJUUQ3.uasset new file mode 100644 index 0000000..8a61841 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/3/RG/G5B1KP1SS6MUNGGUDJUUQ3.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a458ea6da74dd3779109a94d975d68296c26fd0a576e21a18ddc7405d2554b9a +size 5026 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/4/0J/2C7CW4S4WZCPR2HY42C5OW.uasset b/Content/__ExternalActors__/Maps/TopDownMap/4/0J/2C7CW4S4WZCPR2HY42C5OW.uasset new file mode 100644 index 0000000..98453c9 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/4/0J/2C7CW4S4WZCPR2HY42C5OW.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79075fb0b680bdbc9c0cc19466fc3ee379a4d6fd0a4883c0156c1b73e9d908ea +size 4447 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/4/1X/RSSQVW5OKSZXEWXYD7TWT7.uasset b/Content/__ExternalActors__/Maps/TopDownMap/4/1X/RSSQVW5OKSZXEWXYD7TWT7.uasset new file mode 100644 index 0000000..27bc0e1 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/4/1X/RSSQVW5OKSZXEWXYD7TWT7.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:53e6665c66ac10051b18074c383eccb6d589921cbf7ac9ee603faa0fb89d9610 +size 4449 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/4/5V/QPI8Y3RE7XIPSK2Y7OYPLT.uasset b/Content/__ExternalActors__/Maps/TopDownMap/4/5V/QPI8Y3RE7XIPSK2Y7OYPLT.uasset new file mode 100644 index 0000000..bde1f59 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/4/5V/QPI8Y3RE7XIPSK2Y7OYPLT.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06e78b8f17ebcf7e49e46f331ff304c83110c5fbcf883e0c98648d41a29788f9 +size 4587 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/4/62/P3AJT8RQGAXSPBG9GJOYNW.uasset b/Content/__ExternalActors__/Maps/TopDownMap/4/62/P3AJT8RQGAXSPBG9GJOYNW.uasset new file mode 100644 index 0000000..5e329f4 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/4/62/P3AJT8RQGAXSPBG9GJOYNW.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:894c80091e6a4986929be7c650b19382d7a0bcc6dfd576878c1feab753be35a6 +size 2586 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/4/7T/954LHB4NZHQLZ8P89RBV2T.uasset b/Content/__ExternalActors__/Maps/TopDownMap/4/7T/954LHB4NZHQLZ8P89RBV2T.uasset new file mode 100644 index 0000000..3386bfa --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/4/7T/954LHB4NZHQLZ8P89RBV2T.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a09ab9408c4334694124dac15054143bd62527b33420646c06d58b74892f681 +size 4447 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/4/Y2/GXTRSKAYLAJ9V2XFXNHZZR.uasset b/Content/__ExternalActors__/Maps/TopDownMap/4/Y2/GXTRSKAYLAJ9V2XFXNHZZR.uasset new file mode 100644 index 0000000..6046c28 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/4/Y2/GXTRSKAYLAJ9V2XFXNHZZR.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:986c4d77c22c9f021f8324f82b0c92fe5f440cc40db49096cfaad2788c920455 +size 4587 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/5/EQ/K33I24KSMKSKMFMXW0TRD9.uasset b/Content/__ExternalActors__/Maps/TopDownMap/5/EQ/K33I24KSMKSKMFMXW0TRD9.uasset new file mode 100644 index 0000000..2e6def2 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/5/EQ/K33I24KSMKSKMFMXW0TRD9.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:083521562c1b218c7977f934715ffa20af664edaba06108b1804a0da4b538e02 +size 4125 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/6/2W/Z8XXBFDBL421SHPI3IHHQ9.uasset b/Content/__ExternalActors__/Maps/TopDownMap/6/2W/Z8XXBFDBL421SHPI3IHHQ9.uasset new file mode 100644 index 0000000..2005610 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/6/2W/Z8XXBFDBL421SHPI3IHHQ9.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e414815a7658ca7482fa7e723eb28863716568a34631d2f9d58d9ef4202d410f +size 4587 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/6/6X/SQZQV5DDUO4S60L44ZBYKG.uasset b/Content/__ExternalActors__/Maps/TopDownMap/6/6X/SQZQV5DDUO4S60L44ZBYKG.uasset new file mode 100644 index 0000000..45462e3 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/6/6X/SQZQV5DDUO4S60L44ZBYKG.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae1edd2fca5b449eb81bfc4534f77ec62b9898967c45f1b19959e8dee7c5bc7c +size 5026 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/7/2R/17ZEU9MD3YO6YRRSLYQI1Y.uasset b/Content/__ExternalActors__/Maps/TopDownMap/7/2R/17ZEU9MD3YO6YRRSLYQI1Y.uasset new file mode 100644 index 0000000..3f7198d --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/7/2R/17ZEU9MD3YO6YRRSLYQI1Y.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bc95ad2ca749b198441cb05cfe8e40ecf4720e571d011ad8a065dc4995cc8229 +size 5026 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/7/4H/5NWT0LPLC100J3RW44O92Z.uasset b/Content/__ExternalActors__/Maps/TopDownMap/7/4H/5NWT0LPLC100J3RW44O92Z.uasset new file mode 100644 index 0000000..5d4dd87 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/7/4H/5NWT0LPLC100J3RW44O92Z.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4ac057143aa9e6448f18d776fa07e670bc9cd3e611cf3c32eb6f8ebc621f0c87 +size 4587 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/7/Y2/LA4ND77WA6UHWFPVE5QC7T.uasset b/Content/__ExternalActors__/Maps/TopDownMap/7/Y2/LA4ND77WA6UHWFPVE5QC7T.uasset new file mode 100644 index 0000000..e9fccd6 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/7/Y2/LA4ND77WA6UHWFPVE5QC7T.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a1c5df5cb4bccff2ada655d9c0764e36312099f2c28670e30454220e24c7bcf +size 5126 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/9/SK/XD8X1AVEDPSQOFGEX3WCXT.uasset b/Content/__ExternalActors__/Maps/TopDownMap/9/SK/XD8X1AVEDPSQOFGEX3WCXT.uasset new file mode 100644 index 0000000..9a971c4 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/9/SK/XD8X1AVEDPSQOFGEX3WCXT.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c541a3ecbd2a97e3b3f90d69f89d800593077b0e4e94a68089efdb3c58217693 +size 4469 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/B/8S/5KLLU22ZQQ4W5RPTBKI8QB.uasset b/Content/__ExternalActors__/Maps/TopDownMap/B/8S/5KLLU22ZQQ4W5RPTBKI8QB.uasset new file mode 100644 index 0000000..97364f7 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/B/8S/5KLLU22ZQQ4W5RPTBKI8QB.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fc3adc37c05e72334d452505881e1fcc556dcabd9c45ac543318a56ec42adf90 +size 4447 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/B/ET/YWK0783M4NLO5NMABKFV6D.uasset b/Content/__ExternalActors__/Maps/TopDownMap/B/ET/YWK0783M4NLO5NMABKFV6D.uasset new file mode 100644 index 0000000..e591ea2 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/B/ET/YWK0783M4NLO5NMABKFV6D.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21af691c4559feebfc43a5dc2228c16090d5c1e336f763c5b8a8d96e1d85529c +size 2546 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/B/F1/QV0IK7DWGGUNHZID0RJGN0.uasset b/Content/__ExternalActors__/Maps/TopDownMap/B/F1/QV0IK7DWGGUNHZID0RJGN0.uasset new file mode 100644 index 0000000..451ce95 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/B/F1/QV0IK7DWGGUNHZID0RJGN0.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:82198fe82b19c76f86a4d4a5c08fd4be2c379ebfd79f3474972b908edd9888f0 +size 4593 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/B/LM/8KAWPFENUIZWO82K5S1103.uasset b/Content/__ExternalActors__/Maps/TopDownMap/B/LM/8KAWPFENUIZWO82K5S1103.uasset new file mode 100644 index 0000000..58a3da3 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/B/LM/8KAWPFENUIZWO82K5S1103.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:63641d66f92432faa8e05dd4f646d8e489518a299570425221629fd8c178ac71 +size 5024 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/D/9Z/JZE9C2J05AAKZ1TQF9PDGD.uasset b/Content/__ExternalActors__/Maps/TopDownMap/D/9Z/JZE9C2J05AAKZ1TQF9PDGD.uasset new file mode 100644 index 0000000..d913dc9 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/D/9Z/JZE9C2J05AAKZ1TQF9PDGD.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:015837c0506bfc9e68aa281da72cc87bf147e3793752387d789fd0bbc18b4eef +size 12764 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/D/BU/MDMH09Z7MALQDECQSJF1XQ.uasset b/Content/__ExternalActors__/Maps/TopDownMap/D/BU/MDMH09Z7MALQDECQSJF1XQ.uasset new file mode 100644 index 0000000..4f7b110 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/D/BU/MDMH09Z7MALQDECQSJF1XQ.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79ad3e456bc7129d6ae89a807fa4ae81adecdad20143283bf8311ae48f986937 +size 4585 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/D/C7/L5PMOF6E0HE6JAE4YS6PAN.uasset b/Content/__ExternalActors__/Maps/TopDownMap/D/C7/L5PMOF6E0HE6JAE4YS6PAN.uasset new file mode 100644 index 0000000..d7dd840 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/D/C7/L5PMOF6E0HE6JAE4YS6PAN.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8781acac9d1ee11af4adbcd98628c1b46b17d31815fa6c4cc9389192f9106494 +size 4373 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/D/NP/E582A1RLB1OCAL5AN0HWAU.uasset b/Content/__ExternalActors__/Maps/TopDownMap/D/NP/E582A1RLB1OCAL5AN0HWAU.uasset new file mode 100644 index 0000000..f0f533b --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/D/NP/E582A1RLB1OCAL5AN0HWAU.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9143f5594f311301ad11c6f4b9bcfe9eee70af7f0957dc03a2ff45ad731d4cc1 +size 4447 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/D/WV/LW0WJ93H4QQLGLOVNQJ71Q.uasset b/Content/__ExternalActors__/Maps/TopDownMap/D/WV/LW0WJ93H4QQLGLOVNQJ71Q.uasset new file mode 100644 index 0000000..5ae7960 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/D/WV/LW0WJ93H4QQLGLOVNQJ71Q.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:04399633647e31a45fbcc35e0239f40f3fc554dba16759260834aa66767ba778 +size 4447 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/E/0L/VWSXSOIVWH9WLWEC3Y4YRD.uasset b/Content/__ExternalActors__/Maps/TopDownMap/E/0L/VWSXSOIVWH9WLWEC3Y4YRD.uasset new file mode 100644 index 0000000..e4257e1 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/E/0L/VWSXSOIVWH9WLWEC3Y4YRD.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba90bccacc9067c4bd4fe57a1f8fa5223788fe7dbc113d7e2a30754a6e498448 +size 4647 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/E/3Q/FJCC6I5EZ6JCTSSSP1PHKU.uasset b/Content/__ExternalActors__/Maps/TopDownMap/E/3Q/FJCC6I5EZ6JCTSSSP1PHKU.uasset new file mode 100644 index 0000000..c9882c2 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/E/3Q/FJCC6I5EZ6JCTSSSP1PHKU.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3031f7571e9afcedac11ce3418eef7cb703cd5544595199cb2a38764bcd4db8b +size 12411 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/E/7B/CNZFKH0XOKJMR97T8SVZVJ.uasset b/Content/__ExternalActors__/Maps/TopDownMap/E/7B/CNZFKH0XOKJMR97T8SVZVJ.uasset new file mode 100644 index 0000000..2ac689a --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/E/7B/CNZFKH0XOKJMR97T8SVZVJ.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6b73eb8fd56ae58da68b4ea0568f8743a9c23c6df3a85d825a68efa9d2860b38 +size 4646 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/E/FC/8FIOUHDK9NSGXFUF5800PH.uasset b/Content/__ExternalActors__/Maps/TopDownMap/E/FC/8FIOUHDK9NSGXFUF5800PH.uasset new file mode 100644 index 0000000..2c5a928 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/E/FC/8FIOUHDK9NSGXFUF5800PH.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0601401a8ce1b850b340db39dd16b1d1098d00c0ef78a3a551a933a1b74ffe45 +size 4447 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/E/FV/TJRE33ILSZSCE5GKIRPC0O.uasset b/Content/__ExternalActors__/Maps/TopDownMap/E/FV/TJRE33ILSZSCE5GKIRPC0O.uasset new file mode 100644 index 0000000..6c1dc2b --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/E/FV/TJRE33ILSZSCE5GKIRPC0O.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1f93d9833adf4a6dcde34de407da212bffeb342ddf60a816bfd82aa6027c974 +size 3855 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/E/KC/XBEJEQV1RI05PRRGA1AYD6.uasset b/Content/__ExternalActors__/Maps/TopDownMap/E/KC/XBEJEQV1RI05PRRGA1AYD6.uasset new file mode 100644 index 0000000..1af152b --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/E/KC/XBEJEQV1RI05PRRGA1AYD6.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c56318c8d6b4a8671c9027f0680b103e41c74bbc6fe9e8250945ac4bba7d0fa +size 4647 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/E/RY/AUP1N3N1C80O3B03WHZJYK.uasset b/Content/__ExternalActors__/Maps/TopDownMap/E/RY/AUP1N3N1C80O3B03WHZJYK.uasset new file mode 100644 index 0000000..af57828 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/E/RY/AUP1N3N1C80O3B03WHZJYK.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bdebd0440d48d1f0ac0a67daa41bf3edb9ef66961ba5e749df1ba81dbb0a780f +size 3745 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/E/S2/HI9FDN1S995L7NU3SL6OXY.uasset b/Content/__ExternalActors__/Maps/TopDownMap/E/S2/HI9FDN1S995L7NU3SL6OXY.uasset new file mode 100644 index 0000000..7f67a1d --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/E/S2/HI9FDN1S995L7NU3SL6OXY.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1acead775823c19ccf928f5f6517988056f0d0da8a77123cf95514320f99df2b +size 4585 diff --git a/Content/__ExternalActors__/Maps/TopDownMap/F/4S/QRK2THKQ7R0BRB23NLJJRP.uasset b/Content/__ExternalActors__/Maps/TopDownMap/F/4S/QRK2THKQ7R0BRB23NLJJRP.uasset new file mode 100644 index 0000000..7cc25d0 --- /dev/null +++ b/Content/__ExternalActors__/Maps/TopDownMap/F/4S/QRK2THKQ7R0BRB23NLJJRP.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2bd3ee58cbb4acd1e078f6480a69ea2ee21e5397e403abfc0b20ab5be74a5d3b +size 4587 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/0/DR/OCVU8YG3TFFGMMBMWTU7VI.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/0/DR/OCVU8YG3TFFGMMBMWTU7VI.uasset deleted file mode 100644 index b43f189..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/0/DR/OCVU8YG3TFFGMMBMWTU7VI.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:17355c84d68f9de6bb2c709d95e6897d62530e71f553b2bf9b26f4f183a995bc -size 4225 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/0/E1/PV1E7L48T15IS72GGCGK5Y.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/0/E1/PV1E7L48T15IS72GGCGK5Y.uasset deleted file mode 100644 index 891544d..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/0/E1/PV1E7L48T15IS72GGCGK5Y.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec72d60f4679d11ec2bcf6e5d333bfde4b4d36740a1c6acaba90fbd4de57513f -size 4027 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/0/MZ/J2Q7VJB341YVU7JLBCAH3B.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/0/MZ/J2Q7VJB341YVU7JLBCAH3B.uasset deleted file mode 100644 index fe0ea95..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/0/MZ/J2Q7VJB341YVU7JLBCAH3B.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e712d5bd9d986ffafbc333d6d5ab43b6d573775a8de0eb64bf2758cd8ec29b2b -size 4579 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/0/QS/8AKCSH4RXXQHHQMCR8GO6C.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/0/QS/8AKCSH4RXXQHHQMCR8GO6C.uasset deleted file mode 100644 index 6b3c9c9..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/0/QS/8AKCSH4RXXQHHQMCR8GO6C.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f010e727ac7b24eb73e9439b1ba91bc95a30c2092305fb26ebb9d9dead2b46a1 -size 11865 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/0/W3/RNMLH0LC92F4NQBRIDJWY9.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/0/W3/RNMLH0LC92F4NQBRIDJWY9.uasset deleted file mode 100644 index d54260b..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/0/W3/RNMLH0LC92F4NQBRIDJWY9.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a74cfc6625349e34333f9b8258fb2468c53dfee5db4a411de29c8f4b0732997 -size 4021 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/0/WT/9EB3EM9K49XRZB2CEEEXNN.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/0/WT/9EB3EM9K49XRZB2CEEEXNN.uasset deleted file mode 100644 index c99029e..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/0/WT/9EB3EM9K49XRZB2CEEEXNN.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dcee1ceb5d054f069c9df25a6e7098d3b3f1ca485b3610b1c925ac83bf9cbe25 -size 4581 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/2/PP/0FWE1XT4SIGHXZQ61E0BPN.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/2/PP/0FWE1XT4SIGHXZQ61E0BPN.uasset deleted file mode 100644 index bc9b114..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/2/PP/0FWE1XT4SIGHXZQ61E0BPN.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:04c266921a36f9077baa4d80835477fdd52bfdbe1ac81f1d569c7bebac53e05f -size 4165 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/3/16/IU32BEDS8KCRBPZIQZ3317.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/3/16/IU32BEDS8KCRBPZIQZ3317.uasset deleted file mode 100644 index c64b605..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/3/16/IU32BEDS8KCRBPZIQZ3317.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee1141d63507389c2a571b8088c13ac2ec9d121fe4c0f2572a0bc70f380d9488 -size 4165 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/3/JQ/O3BQ2TUN2VQCVCL5OA4W7F.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/3/JQ/O3BQ2TUN2VQCVCL5OA4W7F.uasset deleted file mode 100644 index 6964913..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/3/JQ/O3BQ2TUN2VQCVCL5OA4W7F.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c6b2ef0c35ce087c6896cf9fceeaf84de594b81a2621b25014ddeb1c3eb4a32 -size 3710 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/4/DT/VK9K3LWM0J7UO8TVHOZPQ9.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/4/DT/VK9K3LWM0J7UO8TVHOZPQ9.uasset deleted file mode 100644 index 52a5046..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/4/DT/VK9K3LWM0J7UO8TVHOZPQ9.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d3d919236fd5dcadb27ccb2098d10c862e74b1b95b9e07ac15709cf25e7df3c -size 4027 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/4/OB/UE797FL8JPMDZ27UFM0IFO.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/4/OB/UE797FL8JPMDZ27UFM0IFO.uasset deleted file mode 100644 index 0eb4329..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/4/OB/UE797FL8JPMDZ27UFM0IFO.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d60b0624af17bbfacd4cd1c057eeae0b1be980d8562c906486d765684278af49 -size 4983 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/5/73/UVHWRURIUV7MNJFJVJ61SJ.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/5/73/UVHWRURIUV7MNJFJVJ61SJ.uasset deleted file mode 100644 index 5947cfa..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/5/73/UVHWRURIUV7MNJFJVJ61SJ.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:513e8ff8280d37539f3dffe70be50d39891a2a6041dceb8bd1f026fbd28b8bc4 -size 4027 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/5/LH/V6N3G2I7QT53NAD6H1AD04.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/5/LH/V6N3G2I7QT53NAD6H1AD04.uasset deleted file mode 100644 index e5b6c64..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/5/LH/V6N3G2I7QT53NAD6H1AD04.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4782f5f21e689161738bf39d8bc862a2f6ac8611666b95e6c0a37f38eb8c66db -size 4163 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/5/R2/QH9S99IJ11XYP1Q6HIKILE.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/5/R2/QH9S99IJ11XYP1Q6HIKILE.uasset deleted file mode 100644 index 21f28f2..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/5/R2/QH9S99IJ11XYP1Q6HIKILE.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:580ad20fe03afda50675e1ab267c25a83dcc3c55ec820fce8a9b2bd49e9c6029 -size 4021 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/5/WX/5QM6K2GGCX5YO14Y6QBJ4C.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/5/WX/5QM6K2GGCX5YO14Y6QBJ4C.uasset deleted file mode 100644 index 74f3160..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/5/WX/5QM6K2GGCX5YO14Y6QBJ4C.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11ac39f6a6cd756bcba069741f8e028fd1d43dca115205dad933930d1358f8b8 -size 4581 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/5/YN/TCNGOWDVRBFBJ5YZR7VI7S.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/5/YN/TCNGOWDVRBFBJ5YZR7VI7S.uasset deleted file mode 100644 index 13dd54d..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/5/YN/TCNGOWDVRBFBJ5YZR7VI7S.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bbe5b929e175f2dfc72eef634ff7bbfdbeac5b028bbf0140d16ae74777340074 -size 3569 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/6/BO/BYV4KSLUROOOL33DU1XUWQ.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/6/BO/BYV4KSLUROOOL33DU1XUWQ.uasset deleted file mode 100644 index 6fd418f..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/6/BO/BYV4KSLUROOOL33DU1XUWQ.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c516a3e2b25555e1828e15d3cdd8a18750d424da1f73ced21135f82db40bbe59 -size 3346 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/6/VI/ESHAVRHFZFA2JDR9ZAQIOE.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/6/VI/ESHAVRHFZFA2JDR9ZAQIOE.uasset deleted file mode 100644 index 805d8b8..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/6/VI/ESHAVRHFZFA2JDR9ZAQIOE.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d989aba34ed58a17665d6156ad0ca7d9f51d3e240ca03cd688c26d6f6264a1d -size 12380 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/7/7N/EXUVZTOOFW2W6GLQ3P3461.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/7/7N/EXUVZTOOFW2W6GLQ3P3461.uasset deleted file mode 100644 index d3a2dda..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/7/7N/EXUVZTOOFW2W6GLQ3P3461.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0439dd0a3949def38f08e94646cd81b4b83bdd1b5196d55f991f32e68fc013d3 -size 4165 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/7/EA/CFM5Q53S1WTXZE2D8WNZG3.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/7/EA/CFM5Q53S1WTXZE2D8WNZG3.uasset deleted file mode 100644 index 925ec5e..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/7/EA/CFM5Q53S1WTXZE2D8WNZG3.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a75a864db015ef2880bf55080a5ae5c104df140b453ef2e5dc69ceb02105d1c -size 4021 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/7/EJ/7JCMZ75LZ4IDNH7SV7SZBW.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/7/EJ/7JCMZ75LZ4IDNH7SV7SZBW.uasset deleted file mode 100644 index 79d499d..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/7/EJ/7JCMZ75LZ4IDNH7SV7SZBW.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:93820d93e33db8c466d07d9b98768ff5fce240a39a44f25c9ebfd5b507bea97e -size 4165 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/7/WV/FF6LPDZ0FKKLS0GFFG7RY1.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/7/WV/FF6LPDZ0FKKLS0GFFG7RY1.uasset deleted file mode 100644 index 6d9bbb7..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/7/WV/FF6LPDZ0FKKLS0GFFG7RY1.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5458360fa3a17a9aee3f6a17af0202db754177d022feeb480b209abfe0f00640 -size 4047 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/8/R1/ENMI5ZSH5EMTVMF7P7JJ6A.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/8/R1/ENMI5ZSH5EMTVMF7P7JJ6A.uasset deleted file mode 100644 index 4e435e8..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/8/R1/ENMI5ZSH5EMTVMF7P7JJ6A.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c6dc2fb48aa865c24508457f345149984a39c815a1c8cfff4ad622cdb7e824c8 -size 4167 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/8/R7/0I68M8T0K5GQDUX5H3A9IO.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/8/R7/0I68M8T0K5GQDUX5H3A9IO.uasset deleted file mode 100644 index 05458b2..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/8/R7/0I68M8T0K5GQDUX5H3A9IO.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:70586418bda92491045f63de983e1f93a55198714d2a389409368199edbe4ae3 -size 4049 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/8/UB/YOMIFUVSBFZCNAEZXLIK5N.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/8/UB/YOMIFUVSBFZCNAEZXLIK5N.uasset deleted file mode 100644 index f2f7806..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/8/UB/YOMIFUVSBFZCNAEZXLIK5N.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:80cd3427c7c0d8fe1c146183efe1079fdbba8fccedbe77d6deed31e2e1afb432 -size 4021 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/8/YS/FOXTUL6MPN05XEWRDRZ58J.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/8/YS/FOXTUL6MPN05XEWRDRZ58J.uasset deleted file mode 100644 index b229171..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/8/YS/FOXTUL6MPN05XEWRDRZ58J.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3146a5e9817977e009f8fd8694ce56e5acac2c4f089dd64cd6ac815bf8c0c342 -size 2548 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/9/D3/60ORICH9SPD98P0GDB2WTP.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/9/D3/60ORICH9SPD98P0GDB2WTP.uasset deleted file mode 100644 index b034b10..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/9/D3/60ORICH9SPD98P0GDB2WTP.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8681bad6a44aaed8bc51fbe4bad50fe79921d6c343b4fd22a7562ef6652edae8 -size 4165 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/A/1B/Z9KIZN9Y2PXBVF0YBHFYTL.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/A/1B/Z9KIZN9Y2PXBVF0YBHFYTL.uasset deleted file mode 100644 index 76d5196..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/A/1B/Z9KIZN9Y2PXBVF0YBHFYTL.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e18502d3f1d180e06599a95f0cf5ab493b540886cef40051df59d0a67f0fc03 -size 4225 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/A/LM/VRK8UAZR3J2TAKS74SHCUD.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/A/LM/VRK8UAZR3J2TAKS74SHCUD.uasset deleted file mode 100644 index 43edc7f..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/A/LM/VRK8UAZR3J2TAKS74SHCUD.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9124ce34d042328c374abfbcc0195315497ac2b8bb06aa0def5bfa1613a7fa77 -size 4575 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/A/RN/FHX05LPSBNMAJG3SW97PS7.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/A/RN/FHX05LPSBNMAJG3SW97PS7.uasset deleted file mode 100644 index 7f4b1ea..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/A/RN/FHX05LPSBNMAJG3SW97PS7.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:293280db6f2fa8f988dbbee296bd91bdaa4e637470784068a5dafc52c03a069b -size 2693 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/B/6L/BX1MD4MTK46U2U5IL6VF4B.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/B/6L/BX1MD4MTK46U2U5IL6VF4B.uasset deleted file mode 100644 index a478a7b..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/B/6L/BX1MD4MTK46U2U5IL6VF4B.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d9bcc5209da7d182208e10a891282f3c48111fddd5e9e464d40ec4a44b9aa7c5 -size 4225 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/B/AX/QD7MAQAIBJ16OYN5ZXXIUV.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/B/AX/QD7MAQAIBJ16OYN5ZXXIUV.uasset deleted file mode 100644 index 7f41da3..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/B/AX/QD7MAQAIBJ16OYN5ZXXIUV.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53779edc76abaee56d0a685498c08c4e0ff8eac35e7ad10cc11d012b9ff0cd61 -size 3951 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/B/G0/ISLYFIMFWSWGJY6SPWE06D.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/B/G0/ISLYFIMFWSWGJY6SPWE06D.uasset deleted file mode 100644 index 7ba09b8..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/B/G0/ISLYFIMFWSWGJY6SPWE06D.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:24210d1a1dab2d71edf4f30f94cbcfc24ee213e3679f27923c559637f92c9fdd -size 6377 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/B/PL/MYXGV0RBWT3ZBX00KVP1IE.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/B/PL/MYXGV0RBWT3ZBX00KVP1IE.uasset deleted file mode 100644 index 9550d9a..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/B/PL/MYXGV0RBWT3ZBX00KVP1IE.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c9b69e89db9e947474a42396e7b65b6b0fe53083a2bb0fcdc0c57f8dbf5906c -size 4163 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/B/Z5/CT51ZMVM45K0XE3H3IEN6E.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/B/Z5/CT51ZMVM45K0XE3H3IEN6E.uasset deleted file mode 100644 index 14d6f76..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/B/Z5/CT51ZMVM45K0XE3H3IEN6E.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:29666b256a17cc3e39cf466838c16f0a028a28b1a7c79f4b2df8784566761a2d -size 4581 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/C/1E/4Y8WX2VBX0O2F29MA2EFQ3.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/C/1E/4Y8WX2VBX0O2F29MA2EFQ3.uasset deleted file mode 100644 index 2c91d5b..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/C/1E/4Y8WX2VBX0O2F29MA2EFQ3.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6f794eaece4ee0eef0ec90881fa29dbd269e49c0b1d70891d554538e42a6f609 -size 4021 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/C/EK/K75411SFI66JADVMYUHSE9.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/C/EK/K75411SFI66JADVMYUHSE9.uasset deleted file mode 100644 index 6b9b6f6..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/C/EK/K75411SFI66JADVMYUHSE9.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cf62a0d4f8dde1344027f3124722e03e12cf2a520e1874503b761ba91880d222 -size 4021 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/C/JD/5BHFU0IH6WKMJJHSUWD35N.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/C/JD/5BHFU0IH6WKMJJHSUWD35N.uasset deleted file mode 100644 index b6225be..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/C/JD/5BHFU0IH6WKMJJHSUWD35N.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db2022e0901bae829417c7a948cfa049b99955878629e8eed8f224f0f1c1e3a0 -size 4032 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/C/M5/2S0ICYCUTIK653O06ATB8T.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/C/M5/2S0ICYCUTIK653O06ATB8T.uasset deleted file mode 100644 index 928e7e7..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/C/M5/2S0ICYCUTIK653O06ATB8T.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:16ee7470f57f7b0909597fa2ae163e6b23d2b21f411520d5110ff3dcd166c018 -size 4165 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/E/LR/47NTFRDFK6M7265A1UYTOW.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/E/LR/47NTFRDFK6M7265A1UYTOW.uasset deleted file mode 100644 index 8837b0b..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/E/LR/47NTFRDFK6M7265A1UYTOW.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d775630d625c8cf74bd30e99bb25e0b6e1beccc7740a8e3ebd3b6846513ecc0 -size 3332 diff --git a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/E/SW/R38LZ3VU1OWS6QBVEOT0MO.uasset b/Content/__ExternalActors__/TopDown/Maps/TopDownMap/E/SW/R38LZ3VU1OWS6QBVEOT0MO.uasset deleted file mode 100644 index 8fce5ed..0000000 --- a/Content/__ExternalActors__/TopDown/Maps/TopDownMap/E/SW/R38LZ3VU1OWS6QBVEOT0MO.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fbd13707c5b3439290ea36b76bdff44ef31fb4932658bd5c3b955c74b5e35895 -size 3268 diff --git a/Content/__ExternalObjects__/Maps/TopDownMap/1/3E/W5R3JFDUGIWD7UORIPR3G2.uasset b/Content/__ExternalObjects__/Maps/TopDownMap/1/3E/W5R3JFDUGIWD7UORIPR3G2.uasset new file mode 100644 index 0000000..8bcef9c --- /dev/null +++ b/Content/__ExternalObjects__/Maps/TopDownMap/1/3E/W5R3JFDUGIWD7UORIPR3G2.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a4a96b403de57a3c397e0db0d02b102c8677eac8f1aa942efc12c4ad511c31a +size 2208 diff --git a/Content/__ExternalObjects__/Maps/TopDownMap/4/5A/9M6OTA5VOX036NH2U5CF2O.uasset b/Content/__ExternalObjects__/Maps/TopDownMap/4/5A/9M6OTA5VOX036NH2U5CF2O.uasset new file mode 100644 index 0000000..1e28e3f --- /dev/null +++ b/Content/__ExternalObjects__/Maps/TopDownMap/4/5A/9M6OTA5VOX036NH2U5CF2O.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ad821937a334046198612e3162fa6778c811a1574607bca96d35e299b372bc4 +size 2208 diff --git a/Content/__ExternalObjects__/Maps/TopDownMap/5/GD/496GE7Z84YN1UREVKO8YEJ.uasset b/Content/__ExternalObjects__/Maps/TopDownMap/5/GD/496GE7Z84YN1UREVKO8YEJ.uasset new file mode 100644 index 0000000..c8b6d9d --- /dev/null +++ b/Content/__ExternalObjects__/Maps/TopDownMap/5/GD/496GE7Z84YN1UREVKO8YEJ.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07fd27e041e3fb50b3db5bf4b7d7f78aa7cac6656a14e284b0e7d0a24fb6887c +size 2202 diff --git a/Content/__ExternalObjects__/Maps/TopDownMap/8/NI/51DN3QQB4CNSVAN87SABCY.uasset b/Content/__ExternalObjects__/Maps/TopDownMap/8/NI/51DN3QQB4CNSVAN87SABCY.uasset new file mode 100644 index 0000000..59e8cf5 --- /dev/null +++ b/Content/__ExternalObjects__/Maps/TopDownMap/8/NI/51DN3QQB4CNSVAN87SABCY.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:810ecd2dfe11d26a0efd847e0b15e90e8d721f39c62853f8520735ce94f2bb4b +size 2204 diff --git a/Content/__ExternalObjects__/Maps/TopDownMap/C/J2/3OSYS49QABXXE1DJP4YQEL.uasset b/Content/__ExternalObjects__/Maps/TopDownMap/C/J2/3OSYS49QABXXE1DJP4YQEL.uasset new file mode 100644 index 0000000..b64cf01 --- /dev/null +++ b/Content/__ExternalObjects__/Maps/TopDownMap/C/J2/3OSYS49QABXXE1DJP4YQEL.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8a323aa859087640ee0e09ab91e41d8261ec61f0245b729899dadfb75e0e63d +size 2202 diff --git a/Content/__ExternalObjects__/TopDown/Maps/TopDownMap/2/OD/JN9AMFHJ3BLRX4UL09MSAN.uasset b/Content/__ExternalObjects__/TopDown/Maps/TopDownMap/2/OD/JN9AMFHJ3BLRX4UL09MSAN.uasset deleted file mode 100644 index ea9cf1c..0000000 --- a/Content/__ExternalObjects__/TopDown/Maps/TopDownMap/2/OD/JN9AMFHJ3BLRX4UL09MSAN.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f0ca932d1758286bcb5ab783431b9a2909889761493f43b71d90425f15ae214b -size 1969 diff --git a/Content/__ExternalObjects__/TopDown/Maps/TopDownMap/7/DJ/L93A9ROLR8G18PECTHQYXO.uasset b/Content/__ExternalObjects__/TopDown/Maps/TopDownMap/7/DJ/L93A9ROLR8G18PECTHQYXO.uasset deleted file mode 100644 index 9f547a2..0000000 --- a/Content/__ExternalObjects__/TopDown/Maps/TopDownMap/7/DJ/L93A9ROLR8G18PECTHQYXO.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c988e38fabd1083da6191ac69ea3938f1b29786481916ec629e08b26b63992f3 -size 1975 diff --git a/Content/__ExternalObjects__/TopDown/Maps/TopDownMap/7/X0/PMOXL3SAM2HXQHUVR9J2AN.uasset b/Content/__ExternalObjects__/TopDown/Maps/TopDownMap/7/X0/PMOXL3SAM2HXQHUVR9J2AN.uasset deleted file mode 100644 index 75d8bfc..0000000 --- a/Content/__ExternalObjects__/TopDown/Maps/TopDownMap/7/X0/PMOXL3SAM2HXQHUVR9J2AN.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:58675502a65b60b564fff9a76b1b6eee13c2d14536546dffd04d3f4c7c85f17e -size 1975 diff --git a/Content/__ExternalObjects__/TopDown/Maps/TopDownMap/C/WJ/1QDXSIZ1B1FX2WSR16OSS0.uasset b/Content/__ExternalObjects__/TopDown/Maps/TopDownMap/C/WJ/1QDXSIZ1B1FX2WSR16OSS0.uasset deleted file mode 100644 index 31d6f28..0000000 --- a/Content/__ExternalObjects__/TopDown/Maps/TopDownMap/C/WJ/1QDXSIZ1B1FX2WSR16OSS0.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7cbecf1dd35c7965584135644a8644ab0e0d2a9ac2122f71446b1e157aca2674 -size 1971 diff --git a/Content/__ExternalObjects__/TopDown/Maps/TopDownMap/E/60/LNW66FR8L07Y79WMADIAIZ.uasset b/Content/__ExternalObjects__/TopDown/Maps/TopDownMap/E/60/LNW66FR8L07Y79WMADIAIZ.uasset deleted file mode 100644 index 7123464..0000000 --- a/Content/__ExternalObjects__/TopDown/Maps/TopDownMap/E/60/LNW66FR8L07Y79WMADIAIZ.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d15175f72475a8a47887eec83db427db5a91bc812a3f1e970c2642a77b72035 -size 1969 diff --git a/README.md b/README.md new file mode 100644 index 0000000..75c50aa --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# U-Tad UI Project + diff --git a/RawContent/Damage/T_Damage_T1.png b/RawContent/Damage/T_Damage_T1.png new file mode 100644 index 0000000..bc08575 --- /dev/null +++ b/RawContent/Damage/T_Damage_T1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a220faa84f9ff117d843097782b587995530305bb3172748b980761779cfdbb8 +size 22549 diff --git a/RawContent/Damage/T_Damage_T2.png b/RawContent/Damage/T_Damage_T2.png new file mode 100644 index 0000000..974a530 --- /dev/null +++ b/RawContent/Damage/T_Damage_T2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1e12ae0c2a645b20e998b509224335ed6b6cebb295a8ab87f5093b03826b5e8 +size 25096 diff --git a/RawContent/Damage/T_Damage_T3.png b/RawContent/Damage/T_Damage_T3.png new file mode 100644 index 0000000..79c1629 --- /dev/null +++ b/RawContent/Damage/T_Damage_T3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:98d64cbf299e184e2d047d576bd9d5e1d28b6b49f449872a6e37a8faa98cd131 +size 29608 diff --git a/RawContent/Health/T_Health_T1.png b/RawContent/Health/T_Health_T1.png new file mode 100644 index 0000000..f1b583e --- /dev/null +++ b/RawContent/Health/T_Health_T1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fdd7cf1796f2e4e3691cde33b45881b89cb8066dde1e64d7fbc6eeceea1be750 +size 41158 diff --git a/RawContent/Health/T_Health_T2.png b/RawContent/Health/T_Health_T2.png new file mode 100644 index 0000000..bdf0394 --- /dev/null +++ b/RawContent/Health/T_Health_T2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c4409bcdaabd5af4abebe38d7ee3e963a028eeac68661040d28be0ba32e7fd77 +size 41615 diff --git a/RawContent/Health/T_Health_T3.png b/RawContent/Health/T_Health_T3.png new file mode 100644 index 0000000..94e0fc8 --- /dev/null +++ b/RawContent/Health/T_Health_T3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1cea3c422c8dec4b483c72e2cd88eb291fa5afd8eae508bf63f6ab4ea5a22d5e +size 46713 diff --git a/RawContent/Node.psd b/RawContent/Node.psd new file mode 100644 index 0000000..da838f6 --- /dev/null +++ b/RawContent/Node.psd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c00dce4943b13057ecacf4144c3000b04dd3f5bc3f208ff857ee0fb9be94af0 +size 1169282 diff --git a/RawContent/Speed/T_Speed_T1.png b/RawContent/Speed/T_Speed_T1.png new file mode 100644 index 0000000..fff4f4b --- /dev/null +++ b/RawContent/Speed/T_Speed_T1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e2020eb0d639d0306ccdc4f26ce74c6b7cc8b4f8ab6f854f8f6b52883eade6d +size 52760 diff --git a/RawContent/Speed/T_Speed_T2.png b/RawContent/Speed/T_Speed_T2.png new file mode 100644 index 0000000..1a05023 --- /dev/null +++ b/RawContent/Speed/T_Speed_T2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:11243f8db4ee5130ad7fe18856e37a2ce019c87e8f16aa311a050fa01fe54692 +size 55974 diff --git a/RawContent/Speed/T_Speed_T3.png b/RawContent/Speed/T_Speed_T3.png new file mode 100644 index 0000000..d5aaef4 --- /dev/null +++ b/RawContent/Speed/T_Speed_T3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aae400c7b6ac4cba35a6d42efe77f2bc9f3958461c60ff9c016b4af8b4779c28 +size 58538 diff --git a/RawContent/T_NodeBackground.png b/RawContent/T_NodeBackground.png new file mode 100644 index 0000000..db8c214 --- /dev/null +++ b/RawContent/T_NodeBackground.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:517acfaa1c774d3ee674ab19709e2d0460dca8f6ddac496422b458fa7bc48999 +size 10121 diff --git a/RawContent/T_NodeBorder.png b/RawContent/T_NodeBorder.png new file mode 100644 index 0000000..ea33a2e --- /dev/null +++ b/RawContent/T_NodeBorder.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23da85929aa5307a93e5a7d096582ed7b5fc372a15ba0c4cf39c92e139d46065 +size 12469 diff --git a/Source/UTAD_UI/SkillTree/CharacterStatsComponent.cpp b/Source/UTAD_UI/SkillTree/CharacterStatsComponent.cpp new file mode 100644 index 0000000..e16c197 --- /dev/null +++ b/Source/UTAD_UI/SkillTree/CharacterStatsComponent.cpp @@ -0,0 +1,192 @@ +#include "CharacterStatsComponent.h" +#include "SkillTreeComponent.h" +#include "GameFramework/Character.h" +#include "GameFramework/CharacterMovementComponent.h" + +UCharacterStatsComponent::UCharacterStatsComponent() +{ + PrimaryComponentTick.bCanEverTick = false; + + // Default base stats + BaseMaxHealth = 100.0f; + BaseDamage = 10.0f; + BaseSpeed = 600.0f; + + // Initialize current values + CurrentHealth = BaseMaxHealth; + MaxHealth = BaseMaxHealth; + CurrentDamage = BaseDamage; + CurrentSpeed = BaseSpeed; + + // Initialize bonuses to 0 + SkillHealthBonus = 0.0f; + SkillDamageBonus = 0.0f; + SkillSpeedBonus = 0.0f; + SkillHealthBonusPercent = 0.0f; + SkillDamageBonusPercent = 0.0f; + SkillSpeedBonusPercent = 0.0f; +} + +void UCharacterStatsComponent::BeginPlay() +{ + Super::BeginPlay(); + + // Find the skill tree component on the same actor + AActor* Owner = GetOwner(); + if (Owner) + { + OwnerSkillTree = Owner->FindComponentByClass(); + + // Bind to skill tree events + if (OwnerSkillTree) + { + OwnerSkillTree->OnSkillPurchased.AddDynamic(this, &UCharacterStatsComponent::OnSkillPurchased); + } + } + + InitializeStats(); +} + +void UCharacterStatsComponent::InitializeStats() +{ + MaxHealth = BaseMaxHealth; + CurrentHealth = MaxHealth; + CurrentDamage = BaseDamage; + CurrentSpeed = BaseSpeed; + + RecalculateStats(); +} + +void UCharacterStatsComponent::OnSkillPurchased(FName SkillID) +{ + // Called when a skill is purchased, update all stats + UpdateStatsFromSkillTree(); +} + +void UCharacterStatsComponent::UpdateStatsFromSkillTree() +{ + if (!OwnerSkillTree) + { + return; + } + + // Reset skill bonuses + SkillHealthBonus = 0.0f; + SkillDamageBonus = 0.0f; + SkillSpeedBonus = 0.0f; + SkillHealthBonusPercent = 0.0f; + SkillDamageBonusPercent = 0.0f; + SkillSpeedBonusPercent = 0.0f; + + // Calculate total bonuses from purchased skills + TArray AllSkills = OwnerSkillTree->GetAllSkillNodes(); + for (const FSkillNodeRuntime& Skill : AllSkills) + { + if (Skill.CurrentState == ESkillNodeState::Purchased) + { + // Add flat bonuses + SkillHealthBonus += Skill.NodeData.HealthBonus; + SkillDamageBonus += Skill.NodeData.DamageBonus; + SkillSpeedBonus += Skill.NodeData.SpeedBonus; + + // Add percentage bonuses + SkillHealthBonusPercent += Skill.NodeData.HealthBonusPercent; + SkillDamageBonusPercent += Skill.NodeData.DamageBonusPercent; + SkillSpeedBonusPercent += Skill.NodeData.SpeedBonusPercent; + } + } + + RecalculateStats(); +} + +void UCharacterStatsComponent::RecalculateStats() +{ + // Calculate final stats: Base + Flat Bonus + (Base * Percentage Bonus) + float OldMaxHealth = MaxHealth; + + MaxHealth = BaseMaxHealth + SkillHealthBonus + (BaseMaxHealth * SkillHealthBonusPercent / 100.0f); + CurrentDamage = BaseDamage + SkillDamageBonus + (BaseDamage * SkillDamageBonusPercent / 100.0f); + CurrentSpeed = BaseSpeed + SkillSpeedBonus + (BaseSpeed * SkillSpeedBonusPercent / 100.0f); + + // Scale current health proportionally if max health changed + if (OldMaxHealth > 0 && MaxHealth != OldMaxHealth) + { + float HealthPercent = CurrentHealth / OldMaxHealth; + CurrentHealth = MaxHealth * HealthPercent; + } + + // Apply speed to character movement + ApplySpeedToMovement(); + + // Broadcast events + OnHealthChanged.Broadcast(CurrentHealth, MaxHealth); + OnDamageChanged.Broadcast(CurrentDamage); + OnSpeedChanged.Broadcast(CurrentSpeed); + OnStatsUpdated.Broadcast(); + + UE_LOG(LogTemp, Log, TEXT("Stats Updated - Health: %.0f/%.0f, Damage: %.0f, Speed: %.0f"), + CurrentHealth, MaxHealth, CurrentDamage, CurrentSpeed); +} + +void UCharacterStatsComponent::TakeDamage(float DamageAmount) +{ + if (DamageAmount <= 0.0f) + { + return; + } + + CurrentHealth = FMath::Clamp(CurrentHealth - DamageAmount, 0.0f, MaxHealth); + OnHealthChanged.Broadcast(CurrentHealth, MaxHealth); + + if (CurrentHealth <= 0.0f) + { + UE_LOG(LogTemp, Warning, TEXT("Character has died!")); + } +} + +void UCharacterStatsComponent::Heal(float HealAmount) +{ + if (HealAmount <= 0.0f) + { + return; + } + + CurrentHealth = FMath::Clamp(CurrentHealth + HealAmount, 0.0f, MaxHealth); + OnHealthChanged.Broadcast(CurrentHealth, MaxHealth); +} + +void UCharacterStatsComponent::SetHealth(float NewHealth) +{ + CurrentHealth = FMath::Clamp(NewHealth, 0.0f, MaxHealth); + OnHealthChanged.Broadcast(CurrentHealth, MaxHealth); +} + +FText UCharacterStatsComponent::GetHealthText() const +{ + return FText::Format(FText::FromString(TEXT("{0:.0f} / {1:.0f}")), + FText::AsNumber(CurrentHealth), + FText::AsNumber(MaxHealth)); +} + +FText UCharacterStatsComponent::GetDamageText() const +{ + return FText::Format(FText::FromString(TEXT("Damage: {0:.0f}")), + FText::AsNumber(CurrentDamage)); +} + +FText UCharacterStatsComponent::GetSpeedText() const +{ + return FText::Format(FText::FromString(TEXT("Speed: {0:.0f}")), + FText::AsNumber(CurrentSpeed)); +} + +void UCharacterStatsComponent::ApplySpeedToMovement() +{ + // Apply speed to character movement component + ACharacter* CharacterOwner = Cast(GetOwner()); + if (CharacterOwner && CharacterOwner->GetCharacterMovement()) + { + CharacterOwner->GetCharacterMovement()->MaxWalkSpeed = CurrentSpeed; + UE_LOG(LogTemp, Log, TEXT("Applied movement speed: %.0f"), CurrentSpeed); + } +} \ No newline at end of file diff --git a/Source/UTAD_UI/SkillTree/CharacterStatsComponent.h b/Source/UTAD_UI/SkillTree/CharacterStatsComponent.h new file mode 100644 index 0000000..2e22099 --- /dev/null +++ b/Source/UTAD_UI/SkillTree/CharacterStatsComponent.h @@ -0,0 +1,140 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Components/ActorComponent.h" +#include "CharacterStatsComponent.generated.h" + +DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnHealthChanged, float, CurrentHealth, float, MaxHealth); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnDamageChanged, float, CurrentDamage); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnSpeedChanged, float, CurrentSpeed); +DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnStatsUpdated); + +UCLASS(ClassGroup=(Custom), meta=(BlueprintSpawnableComponent)) +class UTAD_UI_API UCharacterStatsComponent : public UActorComponent +{ + GENERATED_BODY() + +public: + UCharacterStatsComponent(); + +protected: + virtual void BeginPlay() override; + + // Base stats (without any bonuses) + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Base Stats") + float BaseMaxHealth; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Base Stats") + float BaseDamage; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Base Stats") + float BaseSpeed; + + // Current values + UPROPERTY(BlueprintReadOnly, Category = "Current Stats") + float CurrentHealth; + + // Calculated stats (base + bonuses) + UPROPERTY(BlueprintReadOnly, Category = "Current Stats") + float MaxHealth; + + UPROPERTY(BlueprintReadOnly, Category = "Current Stats") + float CurrentDamage; + + UPROPERTY(BlueprintReadOnly, Category = "Current Stats") + float CurrentSpeed; + + // Skill tree bonuses (flat bonuses) + UPROPERTY(BlueprintReadOnly, Category = "Skill Bonuses") + float SkillHealthBonus; + + UPROPERTY(BlueprintReadOnly, Category = "Skill Bonuses") + float SkillDamageBonus; + + UPROPERTY(BlueprintReadOnly, Category = "Skill Bonuses") + float SkillSpeedBonus; + + // Skill tree bonuses (percentage bonuses) + UPROPERTY(BlueprintReadOnly, Category = "Skill Bonuses") + float SkillHealthBonusPercent; + + UPROPERTY(BlueprintReadOnly, Category = "Skill Bonuses") + float SkillDamageBonusPercent; + + UPROPERTY(BlueprintReadOnly, Category = "Skill Bonuses") + float SkillSpeedBonusPercent; + +public: + // Initialize stats + UFUNCTION(BlueprintCallable, Category = "Character Stats") + void InitializeStats(); + + // Update stats from skill tree + UFUNCTION(BlueprintCallable, Category = "Character Stats") + void UpdateStatsFromSkillTree(); + + // Called when a skill is purchased + UFUNCTION() + void OnSkillPurchased(FName SkillID); + + // Calculate final stats + UFUNCTION(BlueprintCallable, Category = "Character Stats") + void RecalculateStats(); + + // Getters for current stats + UFUNCTION(BlueprintPure, Category = "Character Stats") + float GetCurrentHealth() const { return CurrentHealth; } + + UFUNCTION(BlueprintPure, Category = "Character Stats") + float GetMaxHealth() const { return MaxHealth; } + + UFUNCTION(BlueprintPure, Category = "Character Stats") + float GetHealthPercentage() const { return MaxHealth > 0 ? CurrentHealth / MaxHealth : 0.0f; } + + UFUNCTION(BlueprintPure, Category = "Character Stats") + float GetCurrentDamage() const { return CurrentDamage; } + + UFUNCTION(BlueprintPure, Category = "Character Stats") + float GetCurrentSpeed() const { return CurrentSpeed; } + + // Health management + UFUNCTION(BlueprintCallable, Category = "Character Stats") + void TakeDamage(float DamageAmount); + + UFUNCTION(BlueprintCallable, Category = "Character Stats") + void Heal(float HealAmount); + + UFUNCTION(BlueprintCallable, Category = "Character Stats") + void SetHealth(float NewHealth); + + // Get formatted text for UI + UFUNCTION(BlueprintPure, Category = "Character Stats UI") + FText GetHealthText() const; + + UFUNCTION(BlueprintPure, Category = "Character Stats UI") + FText GetDamageText() const; + + UFUNCTION(BlueprintPure, Category = "Character Stats UI") + FText GetSpeedText() const; + + // Events + UPROPERTY(BlueprintAssignable, Category = "Stats Events") + FOnHealthChanged OnHealthChanged; + + UPROPERTY(BlueprintAssignable, Category = "Stats Events") + FOnDamageChanged OnDamageChanged; + + UPROPERTY(BlueprintAssignable, Category = "Stats Events") + FOnSpeedChanged OnSpeedChanged; + + UPROPERTY(BlueprintAssignable, Category = "Stats Events") + FOnStatsUpdated OnStatsUpdated; + +private: + // Apply speed to character movement + void ApplySpeedToMovement(); + + // Reference to owner's skill tree component + UPROPERTY() + class USkillTreeComponent* OwnerSkillTree; +}; \ No newline at end of file diff --git a/Source/UTAD_UI/SkillTree/SkillTreeBlueprintLibrary.cpp b/Source/UTAD_UI/SkillTree/SkillTreeBlueprintLibrary.cpp new file mode 100644 index 0000000..a61a3e7 --- /dev/null +++ b/Source/UTAD_UI/SkillTree/SkillTreeBlueprintLibrary.cpp @@ -0,0 +1,249 @@ +#include "SkillTreeBlueprintLibrary.h" +#include "SkillTreeComponent.h" + +FLinearColor USkillTreeBlueprintLibrary::GetSkillStateColor(ESkillNodeState State) +{ + switch (State) + { + case ESkillNodeState::Locked: + return FLinearColor(0.3f, 0.3f, 0.3f, 1.0f); // Gray + case ESkillNodeState::Available: + return FLinearColor(1.0f, 1.0f, 1.0f, 1.0f); // White + case ESkillNodeState::Selected: + return FLinearColor(1.0f, 0.8f, 0.0f, 1.0f); // Gold + case ESkillNodeState::Purchased: + return FLinearColor(0.0f, 1.0f, 0.0f, 1.0f); // Green + default: + return FLinearColor::White; + } +} + +FText USkillTreeBlueprintLibrary::GetSkillStateText(ESkillNodeState State) +{ + switch (State) + { + case ESkillNodeState::Locked: + return FText::FromString(TEXT("Locked")); + case ESkillNodeState::Available: + return FText::FromString(TEXT("Available")); + case ESkillNodeState::Selected: + return FText::FromString(TEXT("Selected")); + case ESkillNodeState::Purchased: + return FText::FromString(TEXT("Purchased")); + default: + return FText::FromString(TEXT("Unknown")); + } +} + +FText USkillTreeBlueprintLibrary::GetSkillAvailabilityText(USkillTreeComponent* SkillTreeComponent, FName SkillID) +{ + if (!SkillTreeComponent) + { + return FText::FromString(TEXT("No Skill Tree Component")); + } + + FSkillNodeRuntime NodeData; + if (!SkillTreeComponent->GetSkillNodeData(SkillID, NodeData)) + { + return FText::FromString(TEXT("Invalid Skill")); + } + + ESkillNodeState State = SkillTreeComponent->GetSkillState(SkillID); + + switch (State) + { + case ESkillNodeState::Purchased: + return FText::FromString(TEXT("Already Purchased")); + case ESkillNodeState::Selected: + return FText::FromString(TEXT("Selected for Purchase")); + case ESkillNodeState::Available: + return FText::Format(FText::FromString(TEXT("Available - Cost: {0} Points")), NodeData.NodeData.Cost); + case ESkillNodeState::Locked: + { + // Check why it's locked + if (NodeData.NodeData.Prerequisites.Num() > 0) + { + FString MissingPrereqs; + for (const FName& PrereqID : NodeData.NodeData.Prerequisites) + { + if (!SkillTreeComponent->IsSkillPurchased(PrereqID)) + { + FSkillNodeRuntime PrereqData; + if (SkillTreeComponent->GetSkillNodeData(PrereqID, PrereqData)) + { + if (!MissingPrereqs.IsEmpty()) + { + MissingPrereqs += TEXT(", "); + } + MissingPrereqs += PrereqData.NodeData.DisplayName.ToString(); + } + } + } + return FText::Format(FText::FromString(TEXT("Requires: {0}")), FText::FromString(MissingPrereqs)); + } + return FText::FromString(TEXT("Locked")); + } + default: + return FText::FromString(TEXT("Unknown State")); + } +} + +FText USkillTreeBlueprintLibrary::FormatSkillDescription(const FSkillNodeData& NodeData) +{ + FString Description = NodeData.Description.ToString(); + + // Add effect descriptions + FString Effects; + + if (NodeData.HealthBonus > 0) + { + Effects += FString::Printf(TEXT("\n+%.0f Health"), NodeData.HealthBonus); + } + if (NodeData.HealthBonusPercent > 0) + { + Effects += FString::Printf(TEXT("\n+%.0f%% Health"), NodeData.HealthBonusPercent); + } + if (NodeData.DamageBonus > 0) + { + Effects += FString::Printf(TEXT("\n+%.0f Damage"), NodeData.DamageBonus); + } + if (NodeData.DamageBonusPercent > 0) + { + Effects += FString::Printf(TEXT("\n+%.0f%% Damage"), NodeData.DamageBonusPercent); + } + if (NodeData.SpeedBonus > 0) + { + Effects += FString::Printf(TEXT("\n+%.0f Speed"), NodeData.SpeedBonus); + } + if (NodeData.SpeedBonusPercent > 0) + { + Effects += FString::Printf(TEXT("\n+%.0f%% Speed"), NodeData.SpeedBonusPercent); + } + + if (!Effects.IsEmpty()) + { + Description += TEXT("\n\nEffects:") + Effects; + } + + return FText::FromString(Description); +} + + +float USkillTreeBlueprintLibrary::GetPreviewTotalDamageBonus(USkillTreeComponent* SkillTreeComponent) +{ + if (!SkillTreeComponent) + { + return 0.0f; + } + + float Total = SkillTreeComponent->GetTotalDamageBonus(); + + // Add selected (but not purchased) skills + TArray SelectedSkills = SkillTreeComponent->GetSelectedSkills(); + for (const FName& SkillID : SelectedSkills) + { + FSkillNodeRuntime NodeData; + if (SkillTreeComponent->GetSkillNodeData(SkillID, NodeData)) + { + Total += NodeData.NodeData.DamageBonus; + } + } + + return Total; +} + + +float USkillTreeBlueprintLibrary::GetPreviewTotalSpeedBonus(USkillTreeComponent* SkillTreeComponent) +{ + if (!SkillTreeComponent) + { + return 0.0f; + } + + float Total = SkillTreeComponent->GetTotalSpeedBonus(); + + // Add selected (but not purchased) skills + TArray SelectedSkills = SkillTreeComponent->GetSelectedSkills(); + for (const FName& SkillID : SelectedSkills) + { + FSkillNodeRuntime NodeData; + if (SkillTreeComponent->GetSkillNodeData(SkillID, NodeData)) + { + Total += NodeData.NodeData.SpeedBonus; + } + } + + return Total; +} + +float USkillTreeBlueprintLibrary::GetPreviewTotalHealthBonus(USkillTreeComponent* SkillTreeComponent) +{ + if (!SkillTreeComponent) + { + return 0.0f; + } + + float Total = SkillTreeComponent->GetTotalHealthBonus(); + + // Add selected (but not purchased) skills + TArray SelectedSkills = SkillTreeComponent->GetSelectedSkills(); + for (const FName& SkillID : SelectedSkills) + { + FSkillNodeRuntime NodeData; + if (SkillTreeComponent->GetSkillNodeData(SkillID, NodeData)) + { + Total += NodeData.NodeData.HealthBonus; + } + } + + return Total; +} + +bool USkillTreeBlueprintLibrary::HasSelectedSkills(USkillTreeComponent* SkillTreeComponent) +{ + if (!SkillTreeComponent) + { + return false; + } + + return SkillTreeComponent->GetSelectedSkills().Num() > 0; +} + +bool USkillTreeBlueprintLibrary::CanPlayerRespec(USkillTreeComponent* SkillTreeComponent) +{ + if (!SkillTreeComponent) + { + return false; + } + + // Check if player has any purchased skills to reset + TArray AllNodes = SkillTreeComponent->GetAllSkillNodes(); + for (const FSkillNodeRuntime& Node : AllNodes) + { + if (Node.CurrentState == ESkillNodeState::Purchased) + { + return true; + } + } + + return false; +} + +TArray USkillTreeBlueprintLibrary::GetSkillConnections(USkillTreeComponent* SkillTreeComponent, FName SkillID) +{ + TArray Connections; + + if (!SkillTreeComponent) + { + return Connections; + } + + FSkillNodeRuntime NodeData; + if (SkillTreeComponent->GetSkillNodeData(SkillID, NodeData)) + { + // Return the prerequisites as connections + Connections = NodeData.NodeData.Prerequisites; + } + + return Connections; +} \ No newline at end of file diff --git a/Source/UTAD_UI/SkillTree/SkillTreeBlueprintLibrary.h b/Source/UTAD_UI/SkillTree/SkillTreeBlueprintLibrary.h new file mode 100644 index 0000000..66d02e5 --- /dev/null +++ b/Source/UTAD_UI/SkillTree/SkillTreeBlueprintLibrary.h @@ -0,0 +1,56 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Kismet/BlueprintFunctionLibrary.h" +#include "SkillTreeTypes.h" +#include "SkillTreeBlueprintLibrary.generated.h" + +// Forward declarations +class USkillTreeComponent; + +UCLASS() +class UTAD_UI_API USkillTreeBlueprintLibrary : public UBlueprintFunctionLibrary +{ + GENERATED_BODY() + +public: + // UI Helper Functions + + // Get state color for UI display + UFUNCTION(BlueprintPure, Category = "Skill Tree UI", meta = (DisplayName = "Get Skill State Color")) + static FLinearColor GetSkillStateColor(ESkillNodeState State); + + // Get state text for UI display + UFUNCTION(BlueprintPure, Category = "Skill Tree UI", meta = (DisplayName = "Get Skill State Text")) + static FText GetSkillStateText(ESkillNodeState State); + + // Check if a skill can be selected with detailed reason + UFUNCTION(BlueprintPure, Category = "Skill Tree UI", meta = (DisplayName = "Get Skill Availability Text")) + static FText GetSkillAvailabilityText(USkillTreeComponent* SkillTreeComponent, FName SkillID); + + // Get formatted description with current values + UFUNCTION(BlueprintPure, Category = "Skill Tree UI", meta = (DisplayName = "Format Skill Description")) + static FText FormatSkillDescription(const FSkillNodeData& NodeData); + + // Calculate total stats preview (including selected but not purchased skills) + UFUNCTION(BlueprintPure, Category = "Skill Tree UI", meta = (DisplayName = "Get Preview Total Health Bonus")) + static float GetPreviewTotalHealthBonus(USkillTreeComponent* SkillTreeComponent); + + UFUNCTION(BlueprintPure, Category = "Skill Tree UI", meta = (DisplayName = "Get Preview Total Damage Bonus")) + static float GetPreviewTotalDamageBonus(USkillTreeComponent* SkillTreeComponent); + + UFUNCTION(BlueprintPure, Category = "Skill Tree UI", meta = (DisplayName = "Get Preview Total Speed Bonus")) + static float GetPreviewTotalSpeedBonus(USkillTreeComponent* SkillTreeComponent); + + // Check if any skills are selected + UFUNCTION(BlueprintPure, Category = "Skill Tree UI", meta = (DisplayName = "Has Selected Skills")) + static bool HasSelectedSkills(USkillTreeComponent* SkillTreeComponent); + + // Check if player can respec + UFUNCTION(BlueprintPure, Category = "Skill Tree UI", meta = (DisplayName = "Can Player Respec")) + static bool CanPlayerRespec(USkillTreeComponent* SkillTreeComponent); + + // Get the connections between skills for line rendering + UFUNCTION(BlueprintPure, Category = "Skill Tree UI", meta = (DisplayName = "Get Skill Connections")) + static TArray GetSkillConnections(USkillTreeComponent* SkillTreeComponent, FName SkillID); +}; \ No newline at end of file diff --git a/Source/UTAD_UI/SkillTree/SkillTreeComponent.cpp b/Source/UTAD_UI/SkillTree/SkillTreeComponent.cpp new file mode 100644 index 0000000..c656a7e --- /dev/null +++ b/Source/UTAD_UI/SkillTree/SkillTreeComponent.cpp @@ -0,0 +1,557 @@ +#include "SkillTreeComponent.h" +#include "Engine/DataTable.h" + +USkillTreeComponent::USkillTreeComponent() +{ + PrimaryComponentTick.bCanEverTick = false; + + AvailableSkillPoints = 5; // Start with 5 skill points for testing + TotalSkillPointsEarned = 5; + CurrentSelectionCost = 0; +} + +void USkillTreeComponent::BeginPlay() +{ + Super::BeginPlay(); + InitializeSkillTree(); +} + +void USkillTreeComponent::InitializeSkillTree() +{ + AllSkills.Empty(); + + if (!SkillDataTable) + { + UE_LOG(LogTemp, Warning, TEXT("SkillTreeComponent: No skill data table assigned!")); + return; + } + + // Load all skills from the data table using RowNames as IDs + TArray RowNames = SkillDataTable->GetRowNames(); + + for (const FName& RowName : RowNames) + { + FSkillNodeData* Row = SkillDataTable->FindRow(RowName, TEXT("SkillTreeComponent")); + if (Row) + { + FSkillNodeRuntime RuntimeNode; + RuntimeNode.NodeData = *Row; + RuntimeNode.CurrentState = ESkillNodeState::Locked; + RuntimeNode.bIsSelected = false; + + // Use RowName as the skill ID + AllSkills.Add(RowName, RuntimeNode); + } + } + + UpdateSkillStates(); + + UE_LOG(LogTemp, Log, TEXT("SkillTreeComponent: Initialized with %d skills"), AllSkills.Num()); +} + +void USkillTreeComponent::AddSkillPoints(int32 Amount) +{ + if (Amount > 0) + { + AvailableSkillPoints += Amount; + TotalSkillPointsEarned += Amount; + OnSkillPointsChanged.Broadcast(AvailableSkillPoints); + UpdateSkillStates(); + } +} + +void USkillTreeComponent::RemoveSkillPoints(int32 Amount) +{ + if (Amount > 0) + { + AvailableSkillPoints = FMath::Max(0, AvailableSkillPoints - Amount); + OnSkillPointsChanged.Broadcast(AvailableSkillPoints); + UpdateSkillStates(); + } +} + +bool USkillTreeComponent::SelectSkill(FName SkillID) +{ + FText ErrorMessage; + + // Check if skill exists + if (!AllSkills.Contains(SkillID)) + { + ErrorMessage = FText::FromString(TEXT("Skill does not exist")); + OnSelectionError.Broadcast(SkillID, ErrorMessage); + return false; + } + + FSkillNodeRuntime* SkillNode = AllSkills.Find(SkillID); + + // Check if already purchased + if (SkillNode->CurrentState == ESkillNodeState::Purchased) + { + ErrorMessage = FText::FromString(TEXT("Skill already purchased")); + OnSelectionError.Broadcast(SkillID, ErrorMessage); + return false; + } + + // Check if already selected + if (SkillNode->bIsSelected) + { + ErrorMessage = FText::FromString(TEXT("Skill already selected")); + OnSelectionError.Broadcast(SkillID, ErrorMessage); + return false; + } + + // For locked skills, we allow selection but will validate on purchase + // This allows players to "plan" their build + if (SkillNode->CurrentState == ESkillNodeState::Locked) + { + // Check if prerequisites would be met with current selection + bool bWouldBeAvailable = true; + for (const FName& PrereqID : SkillNode->NodeData.Prerequisites) + { + if (!IsSkillPurchased(PrereqID) && !IsSkillSelected(PrereqID)) + { + bWouldBeAvailable = false; + break; + } + } + + if (!bWouldBeAvailable) + { + ErrorMessage = FText::FromString(TEXT("Prerequisites not selected. Select prerequisite skills first.")); + OnSelectionError.Broadcast(SkillID, ErrorMessage); + return false; + } + } + + // Add to selection + SkillNode->bIsSelected = true; + SelectedSkills.Add(SkillID); + UpdateSelectionCost(); + + OnSkillSelectionChanged.Broadcast(CurrentSelectionCost); + OnSkillStateChanged.Broadcast(SkillID); + + return true; +} + +bool USkillTreeComponent::DeselectSkill(FName SkillID) +{ + if (!AllSkills.Contains(SkillID)) + { + return false; + } + + FSkillNodeRuntime* SkillNode = AllSkills.Find(SkillID); + + if (!SkillNode->bIsSelected) + { + return false; + } + + // Check if any selected skills depend on this one + for (const FName& SelectedID : SelectedSkills) + { + if (SelectedID != SkillID) + { + FSkillNodeRuntime* SelectedNode = AllSkills.Find(SelectedID); + if (SelectedNode && SelectedNode->NodeData.Prerequisites.Contains(SkillID)) + { + // Can't deselect if other selected skills depend on it + FText ErrorMessage = FText::FromString(TEXT("Other selected skills depend on this one")); + OnSelectionError.Broadcast(SkillID, ErrorMessage); + return false; + } + } + } + + // Remove from selection + SkillNode->bIsSelected = false; + SelectedSkills.Remove(SkillID); + UpdateSelectionCost(); + + OnSkillSelectionChanged.Broadcast(CurrentSelectionCost); + OnSkillStateChanged.Broadcast(SkillID); + + return true; +} + +void USkillTreeComponent::ClearSelection() +{ + for (const FName& SkillID : SelectedSkills) + { + if (FSkillNodeRuntime* SkillNode = AllSkills.Find(SkillID)) + { + SkillNode->bIsSelected = false; + OnSkillStateChanged.Broadcast(SkillID); + } + } + + SelectedSkills.Empty(); + UpdateSelectionCost(); + OnSkillSelectionChanged.Broadcast(CurrentSelectionCost); +} + +bool USkillTreeComponent::ConfirmPurchase() +{ + // Validate we can afford it + if (!CanAffordSelection()) + { + FText ErrorMessage = FText::FromString(TEXT("Not enough skill points")); + OnSelectionError.Broadcast(NAME_None, ErrorMessage); + return false; + } + + // Sort selected skills by purchase order to ensure prerequisites are purchased first + TArray SortedSelection = SelectedSkills; + SortedSelection.Sort([this](const FName& A, const FName& B) { + FSkillNodeRuntime* NodeA = AllSkills.Find(A); + FSkillNodeRuntime* NodeB = AllSkills.Find(B); + if (NodeA && NodeB) + { + return NodeA->NodeData.PurchaseOrder < NodeB->NodeData.PurchaseOrder; + } + return false; + }); + + // Validate all skills can be purchased in order + for (const FName& SkillID : SortedSelection) + { + FSkillNodeRuntime* SkillNode = AllSkills.Find(SkillID); + if (!SkillNode) + { + continue; + } + + // Check prerequisites (considering already processed skills in this batch) + bool bPrereqsMet = true; + for (const FName& PrereqID : SkillNode->NodeData.Prerequisites) + { + if (!IsSkillPurchased(PrereqID)) + { + // Check if it's in our current batch and would be purchased before this + int32 PrereqIndex = SortedSelection.IndexOfByKey(PrereqID); + int32 CurrentIndex = SortedSelection.IndexOfByKey(SkillID); + + if (PrereqIndex == INDEX_NONE || PrereqIndex >= CurrentIndex) + { + bPrereqsMet = false; + break; + } + } + } + + if (!bPrereqsMet) + { + FText ErrorMessage = FText::Format( + FText::FromString(TEXT("Cannot purchase {0}: prerequisites not met")), + SkillNode->NodeData.DisplayName + ); + OnSelectionError.Broadcast(SkillID, ErrorMessage); + return false; + } + } + + // Purchase all selected skills + for (const FName& SkillID : SortedSelection) + { + FSkillNodeRuntime* SkillNode = AllSkills.Find(SkillID); + if (SkillNode) + { + // Mark as purchased + SkillNode->CurrentState = ESkillNodeState::Purchased; + SkillNode->bIsSelected = false; + PurchasedSkills.Add(SkillID); + + // Apply effects + ApplySkillEffects(SkillNode->NodeData); + + // Broadcast purchase event + OnSkillPurchased.Broadcast(SkillID); + OnSkillStateChanged.Broadcast(SkillID); + } + } + + // Deduct skill points + RemoveSkillPoints(CurrentSelectionCost); + + // Clear selection + SelectedSkills.Empty(); + UpdateSelectionCost(); + UpdateSkillStates(); + + OnSkillSelectionChanged.Broadcast(CurrentSelectionCost); + + return true; +} + +bool USkillTreeComponent::IsSkillPurchased(FName SkillID) const +{ + return PurchasedSkills.Contains(SkillID); +} + +bool USkillTreeComponent::IsSkillSelected(FName SkillID) const +{ + return SelectedSkills.Contains(SkillID); +} + +bool USkillTreeComponent::IsSkillAvailable(FName SkillID) const +{ + const FSkillNodeRuntime* SkillNode = AllSkills.Find(SkillID); + if (!SkillNode) + { + return false; + } + + return SkillNode->CurrentState == ESkillNodeState::Available; +} + +bool USkillTreeComponent::CanSelectSkill(FName SkillID, FText& OutErrorMessage) const +{ + const FSkillNodeRuntime* SkillNode = AllSkills.Find(SkillID); + if (!SkillNode) + { + OutErrorMessage = FText::FromString(TEXT("Skill does not exist")); + return false; + } + + if (SkillNode->CurrentState == ESkillNodeState::Purchased) + { + OutErrorMessage = FText::FromString(TEXT("Skill already purchased")); + return false; + } + + if (SkillNode->bIsSelected) + { + OutErrorMessage = FText::FromString(TEXT("Skill already selected")); + return false; + } + + OutErrorMessage = FText::GetEmpty(); + return true; +} + +ESkillNodeState USkillTreeComponent::GetSkillState(FName SkillID) const +{ + const FSkillNodeRuntime* SkillNode = AllSkills.Find(SkillID); + if (SkillNode) + { + return SkillNode->CurrentState; + } + + return ESkillNodeState::Locked; +} + +bool USkillTreeComponent::GetSkillNodeData(FName SkillID, FSkillNodeRuntime& OutNodeData) const +{ + const FSkillNodeRuntime* SkillNode = AllSkills.Find(SkillID); + if (SkillNode) + { + OutNodeData = *SkillNode; + return true; + } + + return false; +} + +TArray USkillTreeComponent::GetAllSkillNodes() const +{ + TArray Result; + for (const auto& Pair : AllSkills) + { + Result.Add(Pair.Value); + } + return Result; +} + +float USkillTreeComponent::GetTotalHealthBonus() const +{ + float Total = 0.0f; + for (const FName& SkillID : PurchasedSkills) + { + if (const FSkillNodeRuntime* SkillNode = AllSkills.Find(SkillID)) + { + Total += SkillNode->NodeData.HealthBonus; + } + } + return Total; +} + +float USkillTreeComponent::GetTotalDamageBonus() const +{ + float Total = 0.0f; + for (const FName& SkillID : PurchasedSkills) + { + if (const FSkillNodeRuntime* SkillNode = AllSkills.Find(SkillID)) + { + Total += SkillNode->NodeData.DamageBonus; + } + } + return Total; +} + +float USkillTreeComponent::GetTotalSpeedBonus() const +{ + float Total = 0.0f; + for (const FName& SkillID : PurchasedSkills) + { + if (const FSkillNodeRuntime* SkillNode = AllSkills.Find(SkillID)) + { + Total += SkillNode->NodeData.SpeedBonus; + } + } + return Total; +} + +float USkillTreeComponent::GetTotalHealthBonusPercent() const +{ + float Total = 0.0f; + for (const FName& SkillID : PurchasedSkills) + { + if (const FSkillNodeRuntime* SkillNode = AllSkills.Find(SkillID)) + { + Total += SkillNode->NodeData.HealthBonusPercent; + } + } + return Total; +} + +float USkillTreeComponent::GetTotalDamageBonusPercent() const +{ + float Total = 0.0f; + for (const FName& SkillID : PurchasedSkills) + { + if (const FSkillNodeRuntime* SkillNode = AllSkills.Find(SkillID)) + { + Total += SkillNode->NodeData.DamageBonusPercent; + } + } + return Total; +} + +float USkillTreeComponent::GetTotalSpeedBonusPercent() const +{ + float Total = 0.0f; + for (const FName& SkillID : PurchasedSkills) + { + if (const FSkillNodeRuntime* SkillNode = AllSkills.Find(SkillID)) + { + Total += SkillNode->NodeData.SpeedBonusPercent; + } + } + return Total; +} + +void USkillTreeComponent::ResetAllSkills() +{ + // Refund all skill points + int32 RefundAmount = 0; + for (const FName& SkillID : PurchasedSkills) + { + if (const FSkillNodeRuntime* SkillNode = AllSkills.Find(SkillID)) + { + RefundAmount += SkillNode->NodeData.Cost; + RemoveSkillEffects(SkillNode->NodeData); + } + } + + // Clear purchases + PurchasedSkills.Empty(); + + // Reset all skill states + for (auto& Pair : AllSkills) + { + Pair.Value.CurrentState = ESkillNodeState::Locked; + Pair.Value.bIsSelected = false; + } + + // Clear selection + SelectedSkills.Empty(); + CurrentSelectionCost = 0; + + // Add refunded points + AddSkillPoints(RefundAmount); + + // Update states + UpdateSkillStates(); + + // Broadcast events + OnSkillSelectionChanged.Broadcast(CurrentSelectionCost); +} + +void USkillTreeComponent::UpdateSkillStates() +{ + for (auto& Pair : AllSkills) + { + FSkillNodeRuntime& SkillNode = Pair.Value; + + // Skip if already purchased + if (SkillNode.CurrentState == ESkillNodeState::Purchased) + { + continue; + } + + // Check if prerequisites are met + if (ArePrerequisitesMet(SkillNode.NodeData)) + { + SkillNode.CurrentState = SkillNode.bIsSelected ? + ESkillNodeState::Selected : ESkillNodeState::Available; + } + else + { + SkillNode.CurrentState = SkillNode.bIsSelected ? + ESkillNodeState::Selected : ESkillNodeState::Locked; + } + } +} + +void USkillTreeComponent::UpdateSelectionCost() +{ + CurrentSelectionCost = 0; + for (const FName& SkillID : SelectedSkills) + { + if (const FSkillNodeRuntime* SkillNode = AllSkills.Find(SkillID)) + { + CurrentSelectionCost += SkillNode->NodeData.Cost; + } + } +} + +bool USkillTreeComponent::ArePrerequisitesMet(const FSkillNodeData& SkillData) const +{ + for (const FName& PrereqID : SkillData.Prerequisites) + { + if (!IsSkillPurchased(PrereqID)) + { + return false; + } + } + return true; +} + +bool USkillTreeComponent::HasChildrenPurchased(FName SkillID) const +{ + for (const auto& Pair : AllSkills) + { + // Pair.Key is the RowName (SkillID) + if (Pair.Value.NodeData.Prerequisites.Contains(SkillID) && + IsSkillPurchased(Pair.Key)) + { + return true; + } + } + return false; +} + +void USkillTreeComponent::ApplySkillEffects(const FSkillNodeData& SkillData) +{ + // This is where you would apply the actual skill effects to the character + // For now, we just log it + UE_LOG(LogTemp, Log, TEXT("Applied skill effects for: %s"), *SkillData.DisplayName.ToString()); +} + +void USkillTreeComponent::RemoveSkillEffects(const FSkillNodeData& SkillData) +{ + // This is where you would remove skill effects from the character + // For now, we just log it + UE_LOG(LogTemp, Log, TEXT("Removed skill effects for: %s"), *SkillData.DisplayName.ToString()); +} \ No newline at end of file diff --git a/Source/UTAD_UI/SkillTree/SkillTreeComponent.h b/Source/UTAD_UI/SkillTree/SkillTreeComponent.h new file mode 100644 index 0000000..14fbc91 --- /dev/null +++ b/Source/UTAD_UI/SkillTree/SkillTreeComponent.h @@ -0,0 +1,163 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Components/ActorComponent.h" +#include "SkillTreeTypes.h" +#include "SkillTreeComponent.generated.h" + +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnSkillPointsChanged, int32, NewSkillPoints); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnSkillPurchased, FName, SkillID); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnSkillSelectionChanged, int32, TotalCost); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnSkillStateChanged, FName, SkillID); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnSelectionError, FName, SkillID, FText, ErrorMessage); + +UCLASS(ClassGroup=(Custom), meta=(BlueprintSpawnableComponent)) +class UTAD_UI_API USkillTreeComponent : public UActorComponent +{ + GENERATED_BODY() + +public: + USkillTreeComponent(); + +protected: + virtual void BeginPlay() override; + + // Current skill points available + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Skill Points", SaveGame) + int32 AvailableSkillPoints; + + // Total skill points earned + UPROPERTY(BlueprintReadOnly, Category = "Skill Points", SaveGame) + int32 TotalSkillPointsEarned; + + // Data table containing all skill definitions + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Skill Tree") + class UDataTable* SkillDataTable; + + // All skills loaded from the data table + UPROPERTY(BlueprintReadOnly, Category = "Skill Tree") + TMap AllSkills; + + // Currently purchased skills + UPROPERTY(BlueprintReadOnly, Category = "Skill Tree", SaveGame) + TArray PurchasedSkills; + + // Currently selected skills for purchase + UPROPERTY(BlueprintReadOnly, Category = "Skill Tree") + TArray SelectedSkills; + + // Cache the total cost of selected skills + UPROPERTY(BlueprintReadOnly, Category = "Skill Tree") + int32 CurrentSelectionCost; + +public: + // Initialize the skill tree from data table + UFUNCTION(BlueprintCallable, Category = "Skill Tree") + void InitializeSkillTree(); + + // Skill Points Management + UFUNCTION(BlueprintCallable, Category = "Skill Points") + void AddSkillPoints(int32 Amount); + + UFUNCTION(BlueprintCallable, Category = "Skill Points") + void RemoveSkillPoints(int32 Amount); + + UFUNCTION(BlueprintPure, Category = "Skill Points") + int32 GetAvailableSkillPoints() const { return AvailableSkillPoints; } + + UFUNCTION(BlueprintPure, Category = "Skill Points") + int32 GetTotalSkillPointsEarned() const { return TotalSkillPointsEarned; } + + // Selection Management + UFUNCTION(BlueprintCallable, Category = "Skill Selection") + bool SelectSkill(FName SkillID); + + UFUNCTION(BlueprintCallable, Category = "Skill Selection") + bool DeselectSkill(FName SkillID); + + UFUNCTION(BlueprintCallable, Category = "Skill Selection") + void ClearSelection(); + + UFUNCTION(BlueprintCallable, Category = "Skill Selection") + bool ConfirmPurchase(); + + UFUNCTION(BlueprintPure, Category = "Skill Selection") + TArray GetSelectedSkills() const { return SelectedSkills; } + + UFUNCTION(BlueprintPure, Category = "Skill Selection") + int32 GetSelectionCost() const { return CurrentSelectionCost; } + + UFUNCTION(BlueprintPure, Category = "Skill Selection") + bool CanAffordSelection() const { return AvailableSkillPoints >= CurrentSelectionCost; } + + // Skill State Queries + UFUNCTION(BlueprintPure, Category = "Skill State") + bool IsSkillPurchased(FName SkillID) const; + + UFUNCTION(BlueprintPure, Category = "Skill State") + bool IsSkillSelected(FName SkillID) const; + + UFUNCTION(BlueprintPure, Category = "Skill State") + bool IsSkillAvailable(FName SkillID) const; + + UFUNCTION(BlueprintPure, Category = "Skill State") + bool CanSelectSkill(FName SkillID, FText& OutErrorMessage) const; + + UFUNCTION(BlueprintPure, Category = "Skill State") + ESkillNodeState GetSkillState(FName SkillID) const; + + // Get skill data + UFUNCTION(BlueprintPure, Category = "Skill Data") + bool GetSkillNodeData(FName SkillID, FSkillNodeRuntime& OutNodeData) const; + + UFUNCTION(BlueprintPure, Category = "Skill Data") + TArray GetAllSkillNodes() const; + + // Calculate total bonuses from purchased skills + UFUNCTION(BlueprintPure, Category = "Skill Bonuses") + float GetTotalHealthBonus() const; + + UFUNCTION(BlueprintPure, Category = "Skill Bonuses") + float GetTotalDamageBonus() const; + + UFUNCTION(BlueprintPure, Category = "Skill Bonuses") + float GetTotalSpeedBonus() const; + + UFUNCTION(BlueprintPure, Category = "Skill Bonuses") + float GetTotalHealthBonusPercent() const; + + UFUNCTION(BlueprintPure, Category = "Skill Bonuses") + float GetTotalDamageBonusPercent() const; + + UFUNCTION(BlueprintPure, Category = "Skill Bonuses") + float GetTotalSpeedBonusPercent() const; + + // Reset skills (for respec feature) + UFUNCTION(BlueprintCallable, Category = "Skill Tree") + void ResetAllSkills(); + + // Events + UPROPERTY(BlueprintAssignable, Category = "Skill Events") + FOnSkillPointsChanged OnSkillPointsChanged; + + UPROPERTY(BlueprintAssignable, Category = "Skill Events") + FOnSkillPurchased OnSkillPurchased; + + UPROPERTY(BlueprintAssignable, Category = "Skill Events") + FOnSkillSelectionChanged OnSkillSelectionChanged; + + UPROPERTY(BlueprintAssignable, Category = "Skill Events") + FOnSkillStateChanged OnSkillStateChanged; + + UPROPERTY(BlueprintAssignable, Category = "Skill Events") + FOnSelectionError OnSelectionError; + +private: + // Internal helper functions + void UpdateSkillStates(); + void UpdateSelectionCost(); + bool ArePrerequisitesMet(const FSkillNodeData& SkillData) const; + bool HasChildrenPurchased(FName SkillID) const; + void ApplySkillEffects(const FSkillNodeData& SkillData); + void RemoveSkillEffects(const FSkillNodeData& SkillData); +}; \ No newline at end of file diff --git a/Source/UTAD_UI/SkillTree/SkillTreeTypes.h b/Source/UTAD_UI/SkillTree/SkillTreeTypes.h new file mode 100644 index 0000000..7284986 --- /dev/null +++ b/Source/UTAD_UI/SkillTree/SkillTreeTypes.h @@ -0,0 +1,104 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Engine/DataTable.h" +#include "SkillTreeTypes.generated.h" + +// Enum for skill node state +UENUM(BlueprintType) +enum class ESkillNodeState : uint8 +{ + Locked UMETA(DisplayName = "Locked"), // Can't be purchased yet (missing prerequisites) + Available UMETA(DisplayName = "Available"), // Can be purchased + Selected UMETA(DisplayName = "Selected"), // Currently selected for purchase + Purchased UMETA(DisplayName = "Purchased") // Already owned +}; + +// Struct for individual skill node data +// Note: RowName in the DataTable serves as the unique SkillID +USTRUCT(BlueprintType) +struct FSkillNodeData : public FTableRowBase +{ + GENERATED_BODY() + + // Display name for UI + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Skill") + FText DisplayName; + + // Description of what the skill does + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Skill") + FText Description; + + // Icon for the skill + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Skill") + class UTexture2D* Icon; + + // Skill point cost + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Skill") + int32 Cost; + + // Purchase order priority (lower = buy first, used when confirming multiple skills) + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Skill") + int32 PurchaseOrder; + + // Prerequisites - must have these skills first (RowNames of required skills) + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Skill") + TArray Prerequisites; + + // Effects this skill provides (actual stat bonuses) + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Effects") + float HealthBonus; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Effects") + float DamageBonus; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Effects") + float SpeedBonus; + + // Percentage bonuses (multiplicative) + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Effects") + float HealthBonusPercent; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Effects") + float DamageBonusPercent; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Effects") + float SpeedBonusPercent; + + FSkillNodeData() + { + DisplayName = FText::GetEmpty(); + Description = FText::GetEmpty(); + Icon = nullptr; + Cost = 1; + PurchaseOrder = 0; + HealthBonus = 0.0f; + DamageBonus = 0.0f; + SpeedBonus = 0.0f; + HealthBonusPercent = 0.0f; + DamageBonusPercent = 0.0f; + SpeedBonusPercent = 0.0f; + } +}; + +// Runtime struct for tracking skill state +USTRUCT(BlueprintType) +struct FSkillNodeRuntime +{ + GENERATED_BODY() + + UPROPERTY(BlueprintReadOnly, Category = "Skill") + FSkillNodeData NodeData; + + UPROPERTY(BlueprintReadOnly, Category = "Skill") + ESkillNodeState CurrentState; + + UPROPERTY(BlueprintReadOnly, Category = "Skill") + bool bIsSelected; + + FSkillNodeRuntime() + { + CurrentState = ESkillNodeState::Locked; + bIsSelected = false; + } +}; \ No newline at end of file diff --git a/Source/UTAD_UI/UTAD_UI.Build.cs b/Source/UTAD_UI/UTAD_UI.Build.cs index afd6d06..328f85a 100644 --- a/Source/UTAD_UI/UTAD_UI.Build.cs +++ b/Source/UTAD_UI/UTAD_UI.Build.cs @@ -17,7 +17,10 @@ public class UTAD_UI : ModuleRules "NavigationSystem", "AIModule", "Niagara", - "EnhancedInput" + "EnhancedInput", + "UMG", + "Slate", + "SlateCore" }); } } diff --git a/Source/UTAD_UI/UTAD_UICharacter.cpp b/Source/UTAD_UI/UTAD_UICharacter.cpp index 8257094..238ba3c 100644 --- a/Source/UTAD_UI/UTAD_UICharacter.cpp +++ b/Source/UTAD_UI/UTAD_UICharacter.cpp @@ -10,6 +10,9 @@ #include "GameFramework/SpringArmComponent.h" #include "Materials/Material.h" #include "Engine/World.h" +#include "SkillTree/SkillTreeComponent.h" +#include "SkillTree/SkillTreeSubsystem.h" +#include "SkillTree/CharacterStatsComponent.h" AUTAD_UICharacter::AUTAD_UICharacter() { @@ -50,9 +53,46 @@ AUTAD_UICharacter::AUTAD_UICharacter() // Activate ticking in order to update the cursor every frame. PrimaryActorTick.bCanEverTick = true; PrimaryActorTick.bStartWithTickEnabled = true; + + // Create the skill tree component + SkillTreeComponent = CreateDefaultSubobject(TEXT("SkillTreeComponent")); + + // Create the character stats component + CharacterStatsComponent = CreateDefaultSubobject(TEXT("CharacterStatsComponent")); + + // Initialize character level + CharacterLevel = 1; +} + +void AUTAD_UICharacter::BeginPlay() +{ + Super::BeginPlay(); + + // Register the skill tree component with the manager + if (SkillTreeComponent) + { + if (USkillTreeSubsystem* Manager = USkillTreeSubsystem::GetSkillTreeManager(this)) + { + Manager->RegisterPlayerSkillTree(SkillTreeComponent); + } + } } void AUTAD_UICharacter::Tick(float DeltaSeconds) { Super::Tick(DeltaSeconds); } + +void AUTAD_UICharacter::LevelUp() +{ + CharacterLevel++; + + // Grant skill points on level up + if (SkillTreeComponent) + { + // Grant 1 skill point per level (can be configured) + SkillTreeComponent->AddSkillPoints(1); + + UE_LOG(LogTemp, Log, TEXT("Character leveled up to %d! Gained 1 skill point."), CharacterLevel); + } +} diff --git a/Source/UTAD_UI/UTAD_UICharacter.h b/Source/UTAD_UI/UTAD_UICharacter.h index c650077..2b45ea1 100644 --- a/Source/UTAD_UI/UTAD_UICharacter.h +++ b/Source/UTAD_UI/UTAD_UICharacter.h @@ -17,6 +17,9 @@ public: // Called every frame. virtual void Tick(float DeltaSeconds) override; + // Called when the game starts + virtual void BeginPlay() override; + /** Returns TopDownCameraComponent subobject **/ FORCEINLINE class UCameraComponent* GetTopDownCameraComponent() const { @@ -28,6 +31,24 @@ public: return CameraBoom; } + /** Returns SkillTreeComponent subobject **/ + UFUNCTION(BlueprintPure, Category = "Skill Tree") + class USkillTreeComponent* GetSkillTreeComponent() const + { + return SkillTreeComponent; + } + + /** Returns CharacterStatsComponent subobject **/ + UFUNCTION(BlueprintPure, Category = "Character Stats") + class UCharacterStatsComponent* GetStatsComponent() const + { + return CharacterStatsComponent; + } + + // Level up function to grant skill points + UFUNCTION(BlueprintCallable, Category = "Character") + void LevelUp(); + private: /** Top down camera */ UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, @@ -38,4 +59,19 @@ private: UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true")) class USpringArmComponent* CameraBoom; + + /** Skill Tree Component for managing character skills */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Skill Tree", + meta = (AllowPrivateAccess = "true")) + class USkillTreeComponent* SkillTreeComponent; + + /** Character Stats Component for managing health, damage, speed */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Character Stats", + meta = (AllowPrivateAccess = "true")) + class UCharacterStatsComponent* CharacterStatsComponent; + + // Current character level + UPROPERTY(BlueprintReadOnly, Category = "Character", + meta = (AllowPrivateAccess = "true")) + int32 CharacterLevel; }; diff --git a/Source/UTAD_UI/UTAD_UIGameMode.cpp b/Source/UTAD_UI/UTAD_UIGameMode.cpp index 0383e6f..fbb2800 100644 --- a/Source/UTAD_UI/UTAD_UIGameMode.cpp +++ b/Source/UTAD_UI/UTAD_UIGameMode.cpp @@ -12,7 +12,7 @@ AUTAD_UIGameMode::AUTAD_UIGameMode() // set default pawn class to our Blueprinted character static ConstructorHelpers::FClassFinder PlayerPawnBPClass( - TEXT("/Game/TopDown/Blueprints/BP_TopDownCharacter")); + TEXT("/Game/Blueprints/BP_TopDownCharacter")); if (PlayerPawnBPClass.Class != nullptr) { DefaultPawnClass = PlayerPawnBPClass.Class; @@ -21,7 +21,7 @@ AUTAD_UIGameMode::AUTAD_UIGameMode() // set default controller to our Blueprinted controller static ConstructorHelpers::FClassFinder PlayerControllerBPClass( - TEXT("/Game/TopDown/Blueprints/BP_TopDownPlayerController")); + TEXT("/Game/Blueprints/BP_TopDownPlayerController")); if (PlayerControllerBPClass.Class != NULL) { PlayerControllerClass = PlayerControllerBPClass.Class; diff --git a/Source/UTAD_UI/UTAD_UIPlayerController.cpp b/Source/UTAD_UI/UTAD_UIPlayerController.cpp index ab2f17d..8a9b3fa 100644 --- a/Source/UTAD_UI/UTAD_UIPlayerController.cpp +++ b/Source/UTAD_UI/UTAD_UIPlayerController.cpp @@ -11,6 +11,7 @@ #include "InputActionValue.h" #include "EnhancedInputSubsystems.h" #include "Engine/LocalPlayer.h" +#include "Blueprint/UserWidget.h" DEFINE_LOG_CATEGORY(LogTemplateCharacter); @@ -26,6 +27,9 @@ void AUTAD_UIPlayerController::BeginPlay() { // Call the base class Super::BeginPlay(); + + // Create and show the main HUD + ShowMainHUD(); } void AUTAD_UIPlayerController::SetupInputComponent() @@ -72,6 +76,14 @@ void AUTAD_UIPlayerController::SetupInputComponent() EnhancedInputComponent->BindAction( SetDestinationTouchAction, ETriggerEvent::Canceled, this, &AUTAD_UIPlayerController::OnTouchReleased); + + // Setup skill tree input + if (OpenSkillTreeAction) + { + EnhancedInputComponent->BindAction( + OpenSkillTreeAction, ETriggerEvent::Triggered, this, + &AUTAD_UIPlayerController::OnOpenSkillTree); + } } else { @@ -154,3 +166,66 @@ void AUTAD_UIPlayerController::OnTouchReleased() bIsTouch = false; OnSetDestinationReleased(); } + +void AUTAD_UIPlayerController::OnOpenSkillTree() +{ + ToggleSkillTree(); +} + +void AUTAD_UIPlayerController::ShowMainHUD() +{ + if (MainHUDClass && !MainHUDWidget) + { + MainHUDWidget = CreateWidget(this, MainHUDClass); + if (MainHUDWidget) + { + MainHUDWidget->AddToViewport(0); + } + } +} + +void AUTAD_UIPlayerController::ShowSkillTree() +{ + if (!SkillTreeWidget && SkillTreeWidgetClass) + { + SkillTreeWidget = CreateWidget(this, SkillTreeWidgetClass); + } + + if (SkillTreeWidget && !SkillTreeWidget->IsInViewport()) + { + SkillTreeWidget->AddToViewport(1); + + // Set input mode to Game and UI + FInputModeGameAndUI InputMode; + InputMode.SetWidgetToFocus(SkillTreeWidget->TakeWidget()); + InputMode.SetLockMouseToViewportBehavior(EMouseLockMode::DoNotLock); + SetInputMode(InputMode); + bShowMouseCursor = true; + } +} + +void AUTAD_UIPlayerController::HideSkillTree() +{ + if (SkillTreeWidget && SkillTreeWidget->IsInViewport()) + { + SkillTreeWidget->RemoveFromParent(); + + // Set input mode back to game only + FInputModeGameOnly InputMode; + SetInputMode(InputMode); + // Keep mouse cursor visible for top-down game + bShowMouseCursor = true; + } +} + +void AUTAD_UIPlayerController::ToggleSkillTree() +{ + if (SkillTreeWidget && SkillTreeWidget->IsInViewport()) + { + HideSkillTree(); + } + else + { + ShowSkillTree(); + } +} diff --git a/Source/UTAD_UI/UTAD_UIPlayerController.h b/Source/UTAD_UI/UTAD_UIPlayerController.h index 31b036c..4c609df 100644 --- a/Source/UTAD_UI/UTAD_UIPlayerController.h +++ b/Source/UTAD_UI/UTAD_UIPlayerController.h @@ -22,6 +22,19 @@ class AUTAD_UIPlayerController : public APlayerController public: AUTAD_UIPlayerController(); + // UI Management + UFUNCTION(BlueprintCallable, Category = "UI") + void ShowMainHUD(); + + UFUNCTION(BlueprintCallable, Category = "UI") + void ShowSkillTree(); + + UFUNCTION(BlueprintCallable, Category = "UI") + void HideSkillTree(); + + UFUNCTION(BlueprintCallable, Category = "UI") + void ToggleSkillTree(); + /** Time Threshold to know if it was a short press */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input) float ShortPressThreshold; @@ -45,6 +58,11 @@ public: meta = (AllowPrivateAccess = "true")) UInputAction* SetDestinationTouchAction; + /** Open Skill Tree Input Action */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, + meta = (AllowPrivateAccess = "true")) + UInputAction* OpenSkillTreeAction; + protected: /** True if the controlled character should navigate to the mouse cursor. */ uint32 bMoveToMouseCursor : 1; @@ -61,6 +79,23 @@ protected: void OnTouchTriggered(); void OnTouchReleased(); + /** Input handler for opening skill tree */ + void OnOpenSkillTree(); + + // Widget Classes + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "UI") + TSubclassOf MainHUDClass; + + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "UI") + TSubclassOf SkillTreeWidgetClass; + + // Widget Instances + UPROPERTY() + class UUserWidget* MainHUDWidget; + + UPROPERTY() + class UUserWidget* SkillTreeWidget; + private: FVector CachedDestination;