diff --git a/EndlessVendetta/.gitignore b/EndlessVendetta/.gitignore
index 24acec7a..54c50950 100644
--- a/EndlessVendetta/.gitignore
+++ b/EndlessVendetta/.gitignore
@@ -16,6 +16,7 @@
### UnrealEngine ###
# Visual Studio 2015 user specific files
.vs/
+.idea/
# Compiled Object files
*.slo
diff --git a/EndlessVendetta/.idea/.idea.EndlessVendetta/.idea/workspace.xml b/EndlessVendetta/.idea/.idea.EndlessVendetta/.idea/workspace.xml
index 18b2937a..3a72e6ff 100644
--- a/EndlessVendetta/.idea/.idea.EndlessVendetta/.idea/workspace.xml
+++ b/EndlessVendetta/.idea/.idea.EndlessVendetta/.idea/workspace.xml
@@ -1,5 +1,64 @@
+
+ Intermediate/ProjectFiles/EndlessVendetta.vcxproj
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -63,4 +122,22 @@
+
+
+
+
+ 1706900339638
+
+
+ 1706900339638
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/EndlessVendetta/Config/DefaultEngine.ini b/EndlessVendetta/Config/DefaultEngine.ini
index 43b2de20..fb4f7741 100644
--- a/EndlessVendetta/Config/DefaultEngine.ini
+++ b/EndlessVendetta/Config/DefaultEngine.ini
@@ -60,7 +60,7 @@
+CollisionChannelRedirects=(OldName="PawnMovement",NewName="Pawn")
[/Script/EngineSettings.GameMapsSettings]
-EditorStartupMap=/Game/Levels/ControlTutorialLevel.ControlTutorialLevel
+EditorStartupMap=/Game/Levels/MainMenuLevel.MainMenuLevel
LocalMapOptions=
TransitionMap=None
bUseSplitscreen=True
@@ -69,7 +69,7 @@ ThreePlayerSplitscreenLayout=FavorTop
FourPlayerSplitscreenLayout=Grid
bOffsetPlayerGamepadIds=False
GameInstanceClass=/Script/EndlessVendetta.EVGameInstance
-GameDefaultMap=/Game/Levels/ControlTutorialLevel.ControlTutorialLevel
+GameDefaultMap=/Game/Levels/MainMenuLevel.MainMenuLevel
ServerDefaultMap=/Engine/Maps/Entry.Entry
GlobalDefaultGameMode=/Script/EndlessVendetta.EndlessVendettaGameMode
GlobalDefaultServerGameMode=None
diff --git a/EndlessVendetta/Config/DefaultGame.ini b/EndlessVendetta/Config/DefaultGame.ini
index 224486bc..e26801cb 100644
--- a/EndlessVendetta/Config/DefaultGame.ini
+++ b/EndlessVendetta/Config/DefaultGame.ini
@@ -101,6 +101,9 @@ bSkipMovies=False
+IniSectionDenylist=StorageServers
+MapsToCook=(FilePath="/Game/Levels/ControlTutorialLevel")
+MapsToCook=(FilePath="/Game/Levels/Apartment_hit")
++MapsToCook=(FilePath="/Game/Levels/MainMenuLevel")
++MapsToCook=(FilePath="/Game/Levels/TempOpenWorld")
++MapsToCook=(FilePath="/Game/Levels/EnemyAITest")
+DirectoriesToAlwaysCook=(Path="/Interchange/Functions")
+DirectoriesToAlwaysCook=(Path="/Interchange/gltf")
+DirectoriesToAlwaysCook=(Path="/Interchange/Materials")
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_2StripTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_2StripTable.uasset
new file mode 100644
index 00000000..176ce991
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_2StripTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4173bbb99ed7551dd216c3f159de978ce4cf589e9fcb2c8360c9c864e491a1e2
+size 9180
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_3StripTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_3StripTable.uasset
new file mode 100644
index 00000000..ab137c37
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_3StripTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0735b1c0d8b616c487ca423a3ac78005a9ab0549458274dcb00cdb58ef791f67
+size 14162
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_AOHighlightTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_AOHighlightTable.uasset
new file mode 100644
index 00000000..bae4c86a
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_AOHighlightTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:07afabc0c84f119ec624a65efe1c354cec47dfd57c06e52d1a99600ea0bd4102
+size 9485
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_BaseRGBTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_BaseRGBTable.uasset
new file mode 100644
index 00000000..39a03216
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_BaseRGBTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f2c6a6e9fd7c972c49af2cbb3a535a6d5a586f9249dd0380ee08e47d954cf0ef
+size 8893
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_BurgasTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_BurgasTable.uasset
new file mode 100644
index 00000000..98c6490a
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_BurgasTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:17409768100554ae606126642715fafcd40008e9073309b9658606b8c9a921a1
+size 13067
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_CandlelightTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_CandlelightTable.uasset
new file mode 100644
index 00000000..7b32f026
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_CandlelightTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:565882fee42c87d2522f442755bcf730b65ac895a2a6fe85231fcf469f7a1be7
+size 14656
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_ChromaTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_ChromaTable.uasset
new file mode 100644
index 00000000..47fc514d
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_ChromaTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9c65bf851097f549e455d869621fb15228ac167ce1948cbdd10d878fdc0be0f2
+size 9908
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_CrispWarmTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_CrispWarmTable.uasset
new file mode 100644
index 00000000..ef8291b0
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_CrispWarmTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:65b3d16892a30b506e6397cbd08f751075fa26f2cef0386754794c704d6004d4
+size 9134
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_CrispWinterTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_CrispWinterTable.uasset
new file mode 100644
index 00000000..ba7a8eee
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_CrispWinterTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4c78d9c4576065e0f4d1082e45c7387ac9c9b99675d6ad67882f0691d99e176c
+size 11465
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_DesertTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_DesertTable.uasset
new file mode 100644
index 00000000..2fe5fec0
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_DesertTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2c6c664d72b3aa3502171708e319d25c30bd36c20e14da3ee8bf87f256d55deb
+size 15084
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_DrasticBWTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_DrasticBWTable.uasset
new file mode 100644
index 00000000..29284f41
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_DrasticBWTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0da8cb86d2bddc788d8dcd42e33b615400b8989603d4711c452b540e1c2be63b
+size 9492
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/Combat/BP_CombatWorkbench.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_DropBluesTable.uasset
similarity index 82%
rename from EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/Combat/BP_CombatWorkbench.uasset
rename to EndlessVendetta/Content/Assets/LUT/LUT_DropBluesTable.uasset
index 2e888b3f..e737d4c4 100644
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/Combat/BP_CombatWorkbench.uasset
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_DropBluesTable.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:7ca32d8fb46fc46a26048f0055e978a2581adb2139ee494329a1041da61bf936
-size 2760
+oid sha256:fa92879a5b4fbb062ec4777b5b1d0f50f4988cf02034d6d494a6b744aa0f525f
+size 15581
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_FallColorsTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_FallColorsTable.uasset
new file mode 100644
index 00000000..4d3dc5a7
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_FallColorsTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:48f813113e8fa1c1ef10530bc742f280653d1c877b8d5dac7ee96a54282a76c2
+size 15660
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_FilmStockTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_FilmStockTable.uasset
new file mode 100644
index 00000000..fc3b24b8
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_FilmStockTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9b66582f10221fc79c460d612fc326d418e6affaaf8fda36b03a1588ffc5056d
+size 12483
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_FoggyNightTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_FoggyNightTable.uasset
new file mode 100644
index 00000000..2b2189c8
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_FoggyNightTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1b03c429f27b5e79e3021e562ba4e55318055f5d034cdfb331d6db34f59644b4
+size 15879
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_HaskovoTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_HaskovoTable.uasset
new file mode 100644
index 00000000..b85fbd8f
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_HaskovoTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:652ef0e07b8213ee9fecdd8ad85a9d2bda340fd169dd42cc67f2270682cb99f2
+size 14811
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_HorrorBlueTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_HorrorBlueTable.uasset
new file mode 100644
index 00000000..46e1e02b
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_HorrorBlueTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a63d7b0c5e5d6e46a52244f407f8bff185c7fffbf7447311e74f795de53c66cc
+size 16412
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_KidnPlayTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_KidnPlayTable.uasset
new file mode 100644
index 00000000..1d4c2346
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_KidnPlayTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bad4df2999ffb9caeaf825dfa02fc9aee58179391fb435d4a7ffd2c236e40086
+size 13926
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_LateSunsetTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_LateSunsetTable.uasset
new file mode 100644
index 00000000..0f3ddacf
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_LateSunsetTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:54766a3085ff5c78ab4f9b04496754da5447855178552fca36a9b574a79963e7
+size 16283
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_LightBluePurpleTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_LightBluePurpleTable.uasset
new file mode 100644
index 00000000..a15b9715
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_LightBluePurpleTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fbfb871358407167907587c976b2d8efe96ca9fd9b96ea67b45e3e4b493c96f4
+size 10643
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_MoonlightTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_MoonlightTable.uasset
new file mode 100644
index 00000000..16db7815
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_MoonlightTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9aa72bbcc759937bbea99758c413989b8ff862037761ad09b6df1a9abed5af1b
+size 13215
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_NightFromDayTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_NightFromDayTable.uasset
new file mode 100644
index 00000000..bf3104e3
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_NightFromDayTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b33b4a44ad7372bb7b565b425d5542b21ef9dbc714649ec56f651b60519e4778
+size 14215
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_PernikTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_PernikTable.uasset
new file mode 100644
index 00000000..3b333b62
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_PernikTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:73fa25427bc3796940853ee62b100920f943d479c3e1f3aa00c74c8171209090
+size 14850
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_PurplePastelWhiteTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_PurplePastelWhiteTable.uasset
new file mode 100644
index 00000000..cfcc04cc
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_PurplePastelWhiteTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:628e3efd2d06aef31860fe0ea32c7d75cc66e4bc1d4530f475b01ebfa6e6c5e6
+size 11397
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_RedFromLumaTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_RedFromLumaTable.uasset
new file mode 100644
index 00000000..846196be
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_RedFromLumaTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5be8bad14ab764eb7abc91b0b9860d41f3d4eef857d999f49eff8bc82ff18043
+size 12109
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_SofiaTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_SofiaTable.uasset
new file mode 100644
index 00000000..9db1d4d8
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_SofiaTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0a726d94245644d8ab49a5c16f5902794d8016dc213a452dc3c213d859c7ab85
+size 16202
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_SoftWarmingTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_SoftWarmingTable.uasset
new file mode 100644
index 00000000..f65c1fa9
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_SoftWarmingTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cfda167f02167d6c040257d664a7f125141b2bbf58ae5930e0d4043eb2f71326
+size 11188
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_TealOrangeContrastTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_TealOrangeContrastTable.uasset
new file mode 100644
index 00000000..61c2ab49
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_TealOrangeContrastTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6324cfbb7f430b41f76d0385a49890c755efe478057b087015b6150f144100da
+size 16834
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_TensionGreenTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_TensionGreenTable.uasset
new file mode 100644
index 00000000..71c93a9c
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_TensionGreenTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6071f12f4d6fb1414d745d38f995e2233e619aa78cb3d0bd2da88221f49c9263
+size 16024
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_VarnaTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_VarnaTable.uasset
new file mode 100644
index 00000000..c2afeca4
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_VarnaTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4ee99af2e336cc4f696fbb6688e16f139af1dee83cbf4e494bdb230fde27ea52
+size 15970
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_YambolTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_YambolTable.uasset
new file mode 100644
index 00000000..075161fc
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_YambolTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b785f1095e59d36cbbce4d3595cbc6a829a34bb3a0a660d99577cd468f358a31
+size 14918
diff --git a/EndlessVendetta/Content/Assets/LUT/LUT_YellowPurpleTable.uasset b/EndlessVendetta/Content/Assets/LUT/LUT_YellowPurpleTable.uasset
new file mode 100644
index 00000000..14f3734b
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/LUT_YellowPurpleTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:80d5360b4126213544370c07021aeba763e400ab763bfcc4855dae5baafc73aa
+size 10712
diff --git a/EndlessVendetta/Content/Assets/LUT/sepia.uasset b/EndlessVendetta/Content/Assets/LUT/sepia.uasset
new file mode 100644
index 00000000..99187bb3
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/sepia.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ca68bf61c65aa35525002f80e1a4c1048d2fe55cd6484432e8fa6ba0bbfdd666
+size 16207
diff --git a/EndlessVendetta/Content/Assets/LUT/vibrant_test_table_01.uasset b/EndlessVendetta/Content/Assets/LUT/vibrant_test_table_01.uasset
new file mode 100644
index 00000000..9cbdf640
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/LUT/vibrant_test_table_01.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b509b8e32220f37086fc76546ecba546f09927146123fc1af8ac01feb9c03407
+size 11916
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Bathroom/Mirror_Texture/Bathroom_Mirror.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Bathroom/Mirror_Texture/Bathroom_Mirror.uasset
index 45f4213e..5cc809ca 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Bathroom/Mirror_Texture/Bathroom_Mirror.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Bathroom/Mirror_Texture/Bathroom_Mirror.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5fde4502ac704c1003547612e52045ad9ab2ce8260887bed47177fdc153c5591
-size 14299
+oid sha256:62687c37f04c037ad32b9481f15a16e613e6c6502c80ef30b9a3376231ad79ce
+size 13605
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Bathroom/Shower_Texture/Shower_Texture.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Bathroom/Shower_Texture/Shower_Texture.uasset
index e8a2d440..2c3b2e75 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Bathroom/Shower_Texture/Shower_Texture.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Bathroom/Shower_Texture/Shower_Texture.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:171ed4cf5cae49ad8bf59cef8a50b62d9c4db3b264b46ef498e973a7238780ee
-size 14989
+oid sha256:4920f862265ee3c70a598e3be0ed75eadb3d88b2a80d6731b89deac3d797daf3
+size 13286
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Bathroom/Sink_Texture/Sink_Texture.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Bathroom/Sink_Texture/Sink_Texture.uasset
index d44ff32b..10a84894 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Bathroom/Sink_Texture/Sink_Texture.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Bathroom/Sink_Texture/Sink_Texture.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:6eb0b468952a82ef3628f1977f7b964f48ee2ade332d868b1fa73d8a2859cfb2
-size 12870
+oid sha256:b3c9304d8380492c63e70883b63058547a1eddb60ac915aed5d1594080bdde9a
+size 11596
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Bathroom/Tap_Texture/Tap_Texture.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Bathroom/Tap_Texture/Tap_Texture.uasset
index a35a036e..1b93689a 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Bathroom/Tap_Texture/Tap_Texture.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Bathroom/Tap_Texture/Tap_Texture.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:3486d36bcd9731f28772837b88aa13537f760069151de0a81a14bc7887e84172
-size 13649
+oid sha256:cd87004f019fd38cb334537044ccd45c7b6eb0e2ea5bc8356e6e97ab62f5b72b
+size 11776
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Bathroom/Toilet_Texture/Seat/Toilet_Seat_Texture.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Bathroom/Toilet_Texture/Seat/Toilet_Seat_Texture.uasset
index 89eadda8..ce55f90c 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Bathroom/Toilet_Texture/Seat/Toilet_Seat_Texture.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Bathroom/Toilet_Texture/Seat/Toilet_Seat_Texture.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:4ff7a998ec5e4d4e3bea2c37b49bf59c2f61733636fa2dc5f6db4ebad07078bb
-size 11719
+oid sha256:b718e533698c60193b881f907f002f087117096d533a25be337bf57e78717cae
+size 10734
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Bathroom/Toilet_Texture/Toilet/Toilet_Texture.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Bathroom/Toilet_Texture/Toilet/Toilet_Texture.uasset
index 4cce17a0..0d0f3923 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Bathroom/Toilet_Texture/Toilet/Toilet_Texture.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Bathroom/Toilet_Texture/Toilet/Toilet_Texture.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:f51082b53052fb8a8c83571952b09ef7f34ec5a3856349a2592a88ddbc21f342
-size 12511
+oid sha256:660e8cd4308630bd639f8664d0fa0b026118290934063b726da5753fb208fcd7
+size 10859
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/DoorFrame.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/DoorFrame.uasset
new file mode 100644
index 00000000..593155ab
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/DoorFrame.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c578908cc14d1ff8cddf68cf6ec41cc630569fbf6f810f654fbffb7109a5f8d4
+size 29796
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Kitchen/Materials/Counter.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Kitchen/Materials/Counter.uasset
index f0c332b7..ae863cf3 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Kitchen/Materials/Counter.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Kitchen/Materials/Counter.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:24f63c60295d078953eaa822c375436fb978800dd7576ce406fd9cdb8bfc1904
-size 12503
+oid sha256:0d37cd60ca7f37073bd5676a903e00ea9be1e9a3ec235d0dd87c52f16d6ed947
+size 11981
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Kitchen/Materials/Cupboard44.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Kitchen/Materials/Cupboard44.uasset
index dba51d8b..47849e0f 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Kitchen/Materials/Cupboard44.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Kitchen/Materials/Cupboard44.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:0d75d7f58eaaa3139542ea023298952336d47b7d289c4a1d4df7a277a9b0d59b
-size 12108
+oid sha256:d0c8f3349459ef980b66717f95f2314ce70d049f6bc8ac27d0dd80014809bdbf
+size 12324
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Kitchen/Materials/Draws.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Kitchen/Materials/Draws.uasset
index 71af3be2..c59ae09e 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Kitchen/Materials/Draws.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Kitchen/Materials/Draws.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:c10aa4e0e28b965a473b12257c3d05cabe38f4d8e0c0b57e833cadbac436b1b9
-size 11244
+oid sha256:fa0e2c8a32d5b8ba91cfbd6f5e8eabd29f1dbfbb2cdd2bf2464c14ac3f11d57f
+size 10704
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Lights/lights_textures/ceiling_light_02/ceiling_light_02_orange.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Lights/lights_textures/ceiling_light_02/ceiling_light_02_orange.uasset
index ec8aeb24..d8a868ba 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Lights/lights_textures/ceiling_light_02/ceiling_light_02_orange.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Lights/lights_textures/ceiling_light_02/ceiling_light_02_orange.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:e5b9d488ee5e362f100a4924afe17b6dbb3039e3112b5bd482df71f3302052f0
-size 13002
+oid sha256:ad0d46be2d0a6e0a33f342769e4ec4b270b26307cec2fa3e6f1b1e421b29b807
+size 11463
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Lights/lights_textures/lamp_01/lamp_01_blue.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Lights/lights_textures/lamp_01/lamp_01_blue.uasset
index 9517aa66..bcf7de61 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Lights/lights_textures/lamp_01/lamp_01_blue.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Lights/lights_textures/lamp_01/lamp_01_blue.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:3db264a7b130a06244e3a49dca892177315d1b2a81865ce235fa5f5e194e696e
-size 15634
+oid sha256:a8c7c3c965a97de09fc1e38bc86545de193d026a316066c3b0a40429780f7250
+size 15146
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Lights/lights_textures/wall_light_01/wall_light_01_orange.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Lights/lights_textures/wall_light_01/wall_light_01_orange.uasset
index bef62466..3ac6035c 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Lights/lights_textures/wall_light_01/wall_light_01_orange.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Lights/lights_textures/wall_light_01/wall_light_01_orange.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:2e40d5c789007ac42573bfd211db39cddabaaca3e8841f96f16616f3ee54eb34
-size 13822
+oid sha256:ddb0291ab683762522ed26fdd342eeb9546e821a873a173cf7dfa67287c9a28d
+size 12630
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Lights/lights_textures/wall_light_02/wall_light_02_orange.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Lights/lights_textures/wall_light_02/wall_light_02_orange.uasset
index 7475f490..f2d804cc 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Lights/lights_textures/wall_light_02/wall_light_02_orange.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Lights/lights_textures/wall_light_02/wall_light_02_orange.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:97c052964b723e73a17f033341dc0c3538d7f04d149f24532a7f56b13643989f
-size 12568
+oid sha256:385035a96e4caa66b9df50ae72013e854997ba7743a3ef368cb62fc1d527bbb7
+size 11029
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Rug01.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Rug01.uasset
new file mode 100644
index 00000000..c49c2b09
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Rug01.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c598ad12df877a5e0476cff03b380258dca3e05017bf415edea3e63e76c53288
+size 18752
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Rug02.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Rug02.uasset
new file mode 100644
index 00000000..c16e0826
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Rug02.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3c3667128a04932f62aa1235b4a6b4587224d7f818e7aae0e1259e46ad6d0322
+size 15908
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Rug03.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Rug03.uasset
new file mode 100644
index 00000000..f730dc20
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Rug03.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:997d095144c3bb1b18e73755df8adcadc2318bca7aa59ecc9b00c2e236e665ab
+size 16422
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Rug_graph_basecolor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Rug_graph_basecolor.uasset
new file mode 100644
index 00000000..88003fd9
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Rug_graph_basecolor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:94d72647b4d8f51e3d79b84e34289b8ca60694ec303e32b30d0ca2568c68cbdd
+size 23195321
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Bed01/bed1_low_Bed_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Bed01/bed1_low_Bed_BaseColor.uasset
index f8f91a92..83cbe85d 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Bed01/bed1_low_Bed_BaseColor.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Bed01/bed1_low_Bed_BaseColor.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:016706ad2a87a09dcbeeed286891a73c8384b62021abc5fb4b1f36e3f0f37399
-size 617426
+oid sha256:9dd1272c8b07fa191733f94b8f6b39419156fd4bd32af5cd614b0c2e1b78467b
+size 642872
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Bed01/bed1_low_Bed_Normal.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Bed01/bed1_low_Bed_Normal.uasset
index db454649..1ce61f4b 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Bed01/bed1_low_Bed_Normal.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Bed01/bed1_low_Bed_Normal.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:f5636d8962414a67bb9535bdc4570d93b7cdb398ecba3a90c9fea261c66c4ca0
-size 1090483
+oid sha256:503302dc11a3434a82972bfca6bbfd4c9bc97234b3f28d3552a99db5d71e650a
+size 1085295
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Bed01/bed1_low_Bed_OcclusionRoughnessMetallic.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Bed01/bed1_low_Bed_OcclusionRoughnessMetallic.uasset
index 4038185b..b8052cfa 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Bed01/bed1_low_Bed_OcclusionRoughnessMetallic.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Bed01/bed1_low_Bed_OcclusionRoughnessMetallic.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:1168a7a90dd257178ce0e4fb92bedb23e817dc43d862e461110fc26a2eb49143
-size 307929
+oid sha256:f17969000533ad280a1c4aa7202751941f0c018db003ea52b8f103557a4fd2e4
+size 288426
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/BookShelf/B_BookShelf.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/BookShelf/B_BookShelf.uasset
index 2cc5f1a0..615d8ab5 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/BookShelf/B_BookShelf.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/BookShelf/B_BookShelf.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:3e1833b6faf97d493964d91ac9d83cb9a628c539bfb6288868dbf9e1e1480fc3
-size 13096
+oid sha256:c5eda860cb2b53faaf322497dcd9e65a911f698d30d9f9a777c3daaadb0c993b
+size 13748
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/BookShelf/M_Books.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/BookShelf/M_Books.uasset
index 19d15e5e..b53603df 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/BookShelf/M_Books.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/BookShelf/M_Books.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:7a4740cda303fc78a754cc9bc1688037377ef97bd09ca793c87cf245609f2b9c
-size 13837
+oid sha256:729fff11a9906d2b8407fc8df287c1164ff6626a2a2e4dc35d94c7d80bcb9d3c
+size 11767
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/BookShelf_Edge/M_BooksShelfEdge.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/BookShelf_Edge/M_BooksShelfEdge.uasset
index 1868b332..6f0d7630 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/BookShelf_Edge/M_BooksShelfEdge.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/BookShelf_Edge/M_BooksShelfEdge.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:ded6c421983414e4b87a3bab28a0959b1e63d7c36df756c1714d0c2c74325aa3
-size 12395
+oid sha256:6dfb537b7977472a78afe5de0f15e36faccae68d4f564d83754f8aa90afa171b
+size 11305
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/CLOCK01/m_clock01.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/CLOCK01/m_clock01.uasset
index f5ab0f00..1111dd28 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/CLOCK01/m_clock01.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/CLOCK01/m_clock01.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:9e09599451b476ee8164439a6e2e07b2e79fd140c310ffa657c953cbd3615cbc
-size 11502
+oid sha256:a9f9a723f4512a3dc01378d123309c06ed718ece66c58b485baac6139ef93340
+size 11130
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/DoorFrame/Frame_low_DoorFrame_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/DoorFrame/Frame_low_DoorFrame_BaseColor.uasset
new file mode 100644
index 00000000..6473e0dc
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/DoorFrame/Frame_low_DoorFrame_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:247843d01f8be1b0d647a49372a1fe01276f823764d0b9e285e29fae5ac07579
+size 481691
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/DoorFrame/Frame_low_DoorFrame_Normal.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/DoorFrame/Frame_low_DoorFrame_Normal.uasset
new file mode 100644
index 00000000..daa40dc7
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/DoorFrame/Frame_low_DoorFrame_Normal.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1b9deae910bd3154a8545c334d13e5359044ce9d5b9a0547970b25d6d0396fdf
+size 1607262
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/DoorFrame/Frame_low_DoorFrame_OcclusionRoughnessMetallic.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/DoorFrame/Frame_low_DoorFrame_OcclusionRoughnessMetallic.uasset
new file mode 100644
index 00000000..74770c2a
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/DoorFrame/Frame_low_DoorFrame_OcclusionRoughnessMetallic.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:844c55e59d814ded847c070eb8e5dae5477db61c60cb4a62a1f17ca24b91ab3b
+size 316640
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/DoorFrame/M_DoorFrame.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/DoorFrame/M_DoorFrame.uasset
new file mode 100644
index 00000000..2de71c2e
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/DoorFrame/M_DoorFrame.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:28016347c8277940b8c6958005aeb78207be2c7b42439dea51af1c7ba39a5142
+size 12229
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_Chamber.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_Chamber.uasset
index defab6e5..b081756c 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_Chamber.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_Chamber.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:952227d32fa9cd1cf9ad103e1aa826124d3013074de2130df956c5a04e69d3a1
-size 14735
+oid sha256:124fad8f3b528b138d3e370d360c4591e33fa5ba8fe8c2e94839c063b0a553a0
+size 11939
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_Gameboy_MugCup01.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_Gameboy_MugCup01.uasset
index 0b818c1f..9e4a7761 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_Gameboy_MugCup01.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_Gameboy_MugCup01.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:a7df692f1e7f3f41df8bc472e7034604638d060fa552802d72fc4605a58ce173
-size 19693
+oid sha256:38ef1631f51679b26cbfe6ff6c78cb5d56ed9ff84726bee868244b00587fc881
+size 16706
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_Table02.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_Table02.uasset
index 51fbe2ad..5478440a 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_Table02.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_Table02.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:919288c600089c5b553d59bcf950517558962fa119ef25bb4ec3b6495ffd7bc3
-size 13819
+oid sha256:d49a957dd18b98c65ddcb96e860b31e3b797b3a87145998802bf90f802d74b86
+size 12688
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_WallPiece.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_WallPiece.uasset
index f474a884..1e2ece53 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_WallPiece.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_WallPiece.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:f5b0cc314c81adfea85698a6b90eb31c70b223d2beb445012e8683832003a496
-size 15283
+oid sha256:d6d8f8168f26e4e10f2dae01ee2ca1bd62a71e46dd823df587956b7b57627365
+size 13992
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_WallPiece02/M_wallpiece02.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_WallPiece02/M_wallpiece02.uasset
new file mode 100644
index 00000000..6f9e3bdb
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_WallPiece02/M_wallpiece02.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:187f33689a3d833e4a0c5c5eda6c01ade8201a06fdab3aadc5e275cdbc1425fc
+size 18029
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_WallPiece02/Wall01_WallPiece02_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_WallPiece02/Wall01_WallPiece02_BaseColor.uasset
new file mode 100644
index 00000000..92afd9a7
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_WallPiece02/Wall01_WallPiece02_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6cba085b6aacbf0a721780bd87ddbe7da3f54c796feef62da0b61f3ab6b982d2
+size 1741132
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_WallPiece02/Wall01_WallPiece02_Normal.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_WallPiece02/Wall01_WallPiece02_Normal.uasset
new file mode 100644
index 00000000..f4c2009b
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_WallPiece02/Wall01_WallPiece02_Normal.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:dbc63f4b055caceb16eb6e3c31fa688fce07fbdd96b31b4f8a096a2882813fa7
+size 1830742
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_WallPiece02/Wall01_WallPiece02_OcclusionRoughnessMetallic.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_WallPiece02/Wall01_WallPiece02_OcclusionRoughnessMetallic.uasset
new file mode 100644
index 00000000..0917c433
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_WallPiece02/Wall01_WallPiece02_OcclusionRoughnessMetallic.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a7efd9884c740716555c130a9911856dde53a2915f9f1f18f49bcb5ab2796b48
+size 270472
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_WallTest.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_WallTest.uasset
new file mode 100644
index 00000000..d73ea792
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/M_WallTest.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ee8d7439843338eea8a5785699ac35b3bc702c5614745edfb1b1e1785bca30a5
+size 11463
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Rug01/M_RugTrim01.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Rug01/M_RugTrim01.uasset
new file mode 100644
index 00000000..aa2b0c72
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Rug01/M_RugTrim01.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d4d4ed190fd5c11eef8d97f53c0b9a1bec4f3e394285d1929a8735da42671ff0
+size 18401
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Rug01/Panel_Rug01_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Rug01/Panel_Rug01_BaseColor.uasset
new file mode 100644
index 00000000..6c98fc02
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Rug01/Panel_Rug01_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f88f51c8b4f45b84184569bc2fb688876c71bf9bc2b4f1224369cbb96fbaf96c
+size 2075587
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Rug01/Panel_Rug01_Normal.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Rug01/Panel_Rug01_Normal.uasset
new file mode 100644
index 00000000..daab4707
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Rug01/Panel_Rug01_Normal.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5a640efef6ebae2faefc853184f891226237d0f84844505827be87150c2373a1
+size 3341437
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Rug01/Panel_Rug01_OcclusionRoughnessMetallic.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Rug01/Panel_Rug01_OcclusionRoughnessMetallic.uasset
new file mode 100644
index 00000000..99028e10
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Rug01/Panel_Rug01_OcclusionRoughnessMetallic.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:12bfea5270f1a724a6b54428de415eea226104579f1bbfbc536a612a63a53e8c
+size 531484
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/TRadio/M_Radio.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/TRadio/M_Radio.uasset
index 28afc60c..a63be2ec 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/TRadio/M_Radio.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/TRadio/M_Radio.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:4b722ffae2a72f01f84108391913695b42df54aae98c4fc8c1661d335c8fa656
-size 13128
+oid sha256:a05612fef4304e2b141603b5488fb0fa5a8d26556a8ddfa35dbc6319f382a2ed
+size 12057
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Wardrobe/M_Wardrobe.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Wardrobe/M_Wardrobe.uasset
new file mode 100644
index 00000000..7279972c
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Wardrobe/M_Wardrobe.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9e4ffb500a0b827f13cdaba798e64971dc56bbdcdadef92a48c0965b780051fa
+size 12974
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Wardrobe/Wardrobe_low_Wardrobe_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Wardrobe/Wardrobe_low_Wardrobe_BaseColor.uasset
new file mode 100644
index 00000000..9048b98b
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Wardrobe/Wardrobe_low_Wardrobe_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a0e6e63429af968cdf97ebe1095f2e18e582af470eb2587d97add2e10335e130
+size 1043460
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Wardrobe/Wardrobe_low_Wardrobe_Normal.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Wardrobe/Wardrobe_low_Wardrobe_Normal.uasset
new file mode 100644
index 00000000..ffd1b378
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Wardrobe/Wardrobe_low_Wardrobe_Normal.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c3c9410dc53302d4b675ff55e503c3122d28c420e22060b16d86b4044bee8f22
+size 956753
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Wardrobe/Wardrobe_low_Wardrobe_OcclusionRoughnessMetallic.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Wardrobe/Wardrobe_low_Wardrobe_OcclusionRoughnessMetallic.uasset
new file mode 100644
index 00000000..d6092aa5
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/Wardrobe/Wardrobe_low_Wardrobe_OcclusionRoughnessMetallic.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1fc6777d6326d08fb20610e30b6a29d5b727eb54fd701f8d177714e28ab694c7
+size 635629
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/boiler/boiler.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/boiler/boiler.uasset
new file mode 100644
index 00000000..8e9ebd2f
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/boiler/boiler.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:654110b3f9e035f5bb609e094fc8b10d640e006277feb69c613cfd95087ada48
+size 14251
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/boiler/boiler_low_standardSurface1_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/boiler/boiler_low_standardSurface1_BaseColor.uasset
new file mode 100644
index 00000000..fe1454a1
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/boiler/boiler_low_standardSurface1_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8b7c59d4afaa6ba9b0976c2e6356e305366c2efc342f0d56c7c97024ccba83b7
+size 3767275
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/boiler/boiler_low_standardSurface1_Emissive.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/boiler/boiler_low_standardSurface1_Emissive.uasset
new file mode 100644
index 00000000..995c4851
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/boiler/boiler_low_standardSurface1_Emissive.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:43b80c0e78584e591ea8843aa6e2df8edf71869b52e1e0421f0360b1e01afe37
+size 138730
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/boiler/boiler_low_standardSurface1_Normal.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/boiler/boiler_low_standardSurface1_Normal.uasset
new file mode 100644
index 00000000..fcf4ad64
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/boiler/boiler_low_standardSurface1_Normal.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:654d8e3c9ac7086299f3e8811c3098e675e2fdd2bd3d091f02e5c35ff929f730
+size 1923526
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/boiler/boiler_low_standardSurface1_OcclusionRoughnessMetallic.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/boiler/boiler_low_standardSurface1_OcclusionRoughnessMetallic.uasset
new file mode 100644
index 00000000..e8795e6f
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/boiler/boiler_low_standardSurface1_OcclusionRoughnessMetallic.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ae800e08efa72490a4afd21673b63c0282016adf79ed7ed5a78e45304af335c3
+size 4754523
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/cabinets/cabinet_01.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/cabinets/cabinet_01.uasset
index 84adc553..fc78439e 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/cabinets/cabinet_01.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/cabinets/cabinet_01.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:9337175440c79d144cab5aa716e46a73753c56fcf50662348b0d134dc428b9c2
-size 16330
+oid sha256:92432113540ea30b778f2e0e2f5d34c9f12ea38bb90a2cbdc00f092e41e24b06
+size 16190
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/chair_01/chair.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/chair_01/chair.uasset
index e3839fb9..bee60842 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/chair_01/chair.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/chair_01/chair.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:807bdfacec387b49ae2057b87bead8e1df81ef6563b0c9568a8f81a9d73ca2ce
-size 14179
+oid sha256:61af9635ba5030371b93336536543d947c12eb3c235e556c31afc7bca3d98958
+size 13883
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/cofffee_table/coffee_table_bl.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/cofffee_table/coffee_table_bl.uasset
index dadef7fc..b977d3cc 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/cofffee_table/coffee_table_bl.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/cofffee_table/coffee_table_bl.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:e876e73343bd57250499efa633a2fd09a928f59a2ac67b8a2b89acd87e764433
-size 29879
+oid sha256:bb5395f3fe1d96037f54bd524be2db2db3679fcaf8e3db2cc2cb66d64988f741
+size 24459
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/decals/EV_dust_decal_ambientocclusion.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/decals/EV_dust_decal_ambientocclusion.uasset
new file mode 100644
index 00000000..429a325a
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/decals/EV_dust_decal_ambientocclusion.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:07f1673cfc27c368d1670b885687cc09e8197706e6a379e7b1f7f515c1d55a1f
+size 1027414
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/decals/EV_dust_decal_basecolor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/decals/EV_dust_decal_basecolor.uasset
new file mode 100644
index 00000000..84615427
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/decals/EV_dust_decal_basecolor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d016aa40e73b6562c55ae676841c8fa872f727fee7c167c145ffdf11ffdc2e69
+size 2441599
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/decals/EV_dust_decal_opacity.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/decals/EV_dust_decal_opacity.uasset
new file mode 100644
index 00000000..799d5a59
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/decals/EV_dust_decal_opacity.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:51c1db29e79a12f35d37c2cfc197b8e8b2de9f0b8909cf1ccc784ffd40a9cc8c
+size 969107
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/decals/EV_grunge_decal_ambientocclusion.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/decals/EV_grunge_decal_ambientocclusion.uasset
new file mode 100644
index 00000000..b8585790
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/decals/EV_grunge_decal_ambientocclusion.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:28a17308f3bf5e8792cfd82e2f3904b1ec2a6a0e6a2e05a05698dff3986a6278
+size 1011354
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/decals/EV_grunge_decal_basecolor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/decals/EV_grunge_decal_basecolor.uasset
new file mode 100644
index 00000000..baac4038
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/decals/EV_grunge_decal_basecolor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8d5dc826320b527d8325c22619aa8ff2f7dee1e609d55fba4817b72bc6bff0ff
+size 2250395
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/decals/EV_grunge_decal_opacity.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/decals/EV_grunge_decal_opacity.uasset
new file mode 100644
index 00000000..1c2774c7
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/decals/EV_grunge_decal_opacity.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3fb47a2cb0ecf8e69e516c144c9a068416042fec4bf277bc1b7854002d1e0f05
+size 1011147
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/decals/decal_dust.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/decals/decal_dust.uasset
new file mode 100644
index 00000000..7dbddb0b
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/decals/decal_dust.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:dafec8003a798553ae1d30bd27b3d3b871422133de679a9552f76f6265f39f58
+size 11655
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/decals/decal_grunge.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/decals/decal_grunge.uasset
new file mode 100644
index 00000000..796a42c8
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/decals/decal_grunge.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1356d3d2f43eed9d491e2c6f2197e04d53e7895493eb540f0356f2ab7e5d71f8
+size 9333
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/fireplace/fireplace.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/fireplace/fireplace.uasset
index 703db0ba..bfde63ae 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/fireplace/fireplace.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/fireplace/fireplace.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:55a43b825eae14cb745c317a9417396f9a243b81218331ef2e2ebd8e81d0098f
-size 15954
+oid sha256:b94ab1e2633ea6c0e06a14565816dc7427d5fbcb863f10d1d6b77412e26882fb
+size 16260
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/ironing_board/ironing_board.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/ironing_board/ironing_board.uasset
new file mode 100644
index 00000000..6faefc4d
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/ironing_board/ironing_board.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8b0e3178e71e3469480c413f429014d00393da20cf70e478f445ae27b5c57217
+size 15969
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/ironing_board/ironingboard_low_standardSurface1_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/ironing_board/ironingboard_low_standardSurface1_BaseColor.uasset
new file mode 100644
index 00000000..7e76d0df
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/ironing_board/ironingboard_low_standardSurface1_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a48a317c04e4c6d4e77e05d8471f29eb2fb0ee199d7c007ab001b4fcdcff754e
+size 857423
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/ironing_board/ironingboard_low_standardSurface1_Normal.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/ironing_board/ironingboard_low_standardSurface1_Normal.uasset
new file mode 100644
index 00000000..27081fe7
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/ironing_board/ironingboard_low_standardSurface1_Normal.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2513aa75002329ec59d9a06092de3190915db72e87742a4698dde35291803e69
+size 962924
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/ironing_board/ironingboard_low_standardSurface1_OcclusionRoughnessMetallic.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/ironing_board/ironingboard_low_standardSurface1_OcclusionRoughnessMetallic.uasset
new file mode 100644
index 00000000..447a6505
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/ironing_board/ironingboard_low_standardSurface1_OcclusionRoughnessMetallic.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:663c1dae8ef9a7195aa6712b05a65299d0273a15a7cd9b190c031e20b066d3b8
+size 1294633
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_basket.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_basket.uasset
new file mode 100644
index 00000000..ccd1f3ad
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_basket.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d738cb6bdba34fb53097094d0c61789c94efd0307534c010a9deb03bdf144585
+size 13465
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_basket_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_basket_BaseColor.uasset
new file mode 100644
index 00000000..1dcf7480
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_basket_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c5dd08ea8e9ca73c031ae0505442f461d8df1da952ab50d6865c889fc9527dce
+size 1147505
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_basket_Normal.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_basket_Normal.uasset
new file mode 100644
index 00000000..3b717570
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_basket_Normal.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:641f2bc733f40b74d21284bd24edb5ad6321a494ebb5f6b58b056411f0a6bd77
+size 1216299
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_basket_OcclusionRoughnessMetallic.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_basket_OcclusionRoughnessMetallic.uasset
new file mode 100644
index 00000000..3b8d9f68
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_basket_OcclusionRoughnessMetallic.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:00980642a2810606d2ced631960e9349fb639f6d30bb1e44c418e8903de22c61
+size 414692
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_rails.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_rails.uasset
new file mode 100644
index 00000000..329e0682
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_rails.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1e6cc89409f5912b85bf16b161ec51442b413b521bec6f928fcd4d942e0cf29c
+size 11912
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_rails_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_rails_BaseColor.uasset
new file mode 100644
index 00000000..7f7e5de0
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_rails_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b5c9b81c0c4c20d7bad195633dacc312ae2da85bfdf222d0f1dd4c2b249a33ef
+size 503220
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_rails_Normal.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_rails_Normal.uasset
new file mode 100644
index 00000000..7c950997
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_rails_Normal.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3bbd96250d6e923da0868173a0e2e8e3f62078fcb4b1188509ab8bdd6598a45b
+size 542511
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_rails_OcclusionRoughnessMetallic.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_rails_OcclusionRoughnessMetallic.uasset
new file mode 100644
index 00000000..41df9933
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_rails_OcclusionRoughnessMetallic.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e765485e41b662ccb510d1e99a8ebb0b974dc485f26051a0251dfac5e4a6c140
+size 510869
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_table.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_table.uasset
new file mode 100644
index 00000000..cec4ab52
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_table.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:23349db6d151dfd7641a231c21c73d01a9c327c88b1d387d3f35d0218177d506
+size 13900
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_table_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_table_BaseColor.uasset
new file mode 100644
index 00000000..bd13df62
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_table_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:58211274320f6064d34d955823e2d40dc3ea7fa5bd7df29221aa74a086d2202f
+size 913203
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_table_Normal.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_table_Normal.uasset
new file mode 100644
index 00000000..6e7439db
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_table_Normal.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cc590f166a85600189856e3219208adf480bb78a2139348564ae37f8aadbefe1
+size 107662
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_table_OcclusionRoughnessMetallic.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_table_OcclusionRoughnessMetallic.uasset
new file mode 100644
index 00000000..cc76bdf6
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/laundry/laundry_table_OcclusionRoughnessMetallic.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b0f9ade9d917ae6747204c1f8951e4e46cb7cc7198de340331ebad40f2f29429
+size 217686
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/CORP_SOCIALISM_poster_2.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/CORP_SOCIALISM_poster_2.uasset
new file mode 100644
index 00000000..86558c81
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/CORP_SOCIALISM_poster_2.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:42c9a71191408a7378c18487d21d97a0a016cedbc1dae22d228cd09f8e65012a
+size 18907
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/fame_glass.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/fame_glass.uasset
new file mode 100644
index 00000000..d534808b
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/fame_glass.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d0b2fcc8046d34fc876a7714109c2e598fdb8b0be7d35dfada954b2a906c430e
+size 10872
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_CORP_SOCIALISM_poster_2_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_CORP_SOCIALISM_poster_2_BaseColor.uasset
new file mode 100644
index 00000000..475db767
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_CORP_SOCIALISM_poster_2_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f6581f8889e815c5313369abd693f27df5b897a983a97dae6d8abd405e574861
+size 1829716
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_KOMET_poster1_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_KOMET_poster1_BaseColor.uasset
new file mode 100644
index 00000000..203ebd51
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_KOMET_poster1_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d49bcc75b362399dce7110c11637d50fc69bd76a9116f0d87e365eadf868b835
+size 1024498
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_KOMET_poster2_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_KOMET_poster2_BaseColor.uasset
new file mode 100644
index 00000000..d880822a
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_KOMET_poster2_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1ca1708ff419c1d3a23dc2679f227cbe66d50f7af5d2aea20400043064e7ad23
+size 1255793
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_KOMET_poster3_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_KOMET_poster3_BaseColor.uasset
new file mode 100644
index 00000000..e1675560
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_KOMET_poster3_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:eeea66bbdec2ffa13fa3d66c0f707789434776a74149d087568491ecfd6ad132
+size 2405785
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_SPACESHI10_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_SPACESHI10_BaseColor.uasset
new file mode 100644
index 00000000..d0c7453e
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_SPACESHI10_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:63ceaf4ea439c2ed41fdc36fd731f339dae2770c7c3f7800d82139e713879c1c
+size 684518
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_SPACESHIP6_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_SPACESHIP6_BaseColor.uasset
new file mode 100644
index 00000000..fbc470c9
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_SPACESHIP6_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:35b25a4f4e5e7de446c7cbb807f6d2f5c08ccdf81c7656d51248b767e2a7caaa
+size 742020
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_SPACESHIP7_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_SPACESHIP7_BaseColor.uasset
new file mode 100644
index 00000000..79ba955c
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_SPACESHIP7_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:12528bf29236e1bbe23b4461b462e1d45fee92679547ff47f1aac383b36651d8
+size 696543
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_SPACESHIP8_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_SPACESHIP8_BaseColor.uasset
new file mode 100644
index 00000000..b0b98d18
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_SPACESHIP8_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3549e3c6529fe1fa4d7ef5788c08f2ddd6288df91242d2716f6950030fa1b3c6
+size 775789
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_SPACESHIP9_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_SPACESHIP9_BaseColor.uasset
new file mode 100644
index 00000000..64f0932e
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_SPACESHIP9_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cbc5d30b238ab45da6455e15efcb00fbacf00104cc240477d672e3cd1f404147
+size 1209879
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_TORIO_poster2_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_TORIO_poster2_BaseColor.uasset
new file mode 100644
index 00000000..5628b0fe
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_TORIO_poster2_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6960e3be0602cb4f2402f2c968a7013e6aefe2046b96b0339fd9b1463549babf
+size 660020
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_TORIO_poster4_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_TORIO_poster4_BaseColor.uasset
new file mode 100644
index 00000000..0b3eb84d
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_TORIO_poster4_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:65433a769bd8db7d46f21cb116830ce76f552878795e2f00306d39e7a137a6db
+size 972832
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_TORIO_poster_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_TORIO_poster_BaseColor.uasset
new file mode 100644
index 00000000..1307875f
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_TORIO_poster_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3f85ed02c46920db994acf195227128c0fcc477124e0570848d1341d765b95d8
+size 782218
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_VLAST_poster1_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_VLAST_poster1_BaseColor.uasset
new file mode 100644
index 00000000..0a9030ea
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_VLAST_poster1_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:86dcce3d342f517ae909de507b2c05c5973320a1ebb71f9952f919c96fd39142
+size 355738
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_VLAST_poster2_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_VLAST_poster2_BaseColor.uasset
new file mode 100644
index 00000000..bf1c32b2
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_VLAST_poster2_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:49b63c2357aed34afea1c4907fbab7248a56d3be6efe3e0ce644b5f65c1ebaa6
+size 344956
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_VLAST_poster3_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_VLAST_poster3_BaseColor.uasset
new file mode 100644
index 00000000..708ea245
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_VLAST_poster3_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e2f1fd6118ab23963eb6ff32414e8366ffe2f18e7856ddb315b76ddf8bb7e552
+size 783831
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_glass_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_glass_BaseColor.uasset
new file mode 100644
index 00000000..ba909d39
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_glass_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:962f09adcf0c1aa1e8079d81a48ff7ab3304b08a42176aa9597a63339ad936e8
+size 3969349
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_glass_Normal.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_glass_Normal.uasset
new file mode 100644
index 00000000..33952e6d
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_glass_Normal.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:db7caf6e4b8b4645eaad1ad20a13b264508661a29eab4e18bbfb2d6b39c25e39
+size 56251
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_glass_OcclusionRoughnessMetallic.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_glass_OcclusionRoughnessMetallic.uasset
new file mode 100644
index 00000000..af0f20e6
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_glass_OcclusionRoughnessMetallic.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f2d721c04eda225ced7d43febbea0f9a1fdf5707b19be0615e579078a4d09db9
+size 2183900
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_metal.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_metal.uasset
new file mode 100644
index 00000000..c886db6a
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_metal.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fbcd3168bcf4817d5882ca9d3f9939a6b257401b9e596773bc17e79923f3c66c
+size 12696
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_metal_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_metal_BaseColor.uasset
new file mode 100644
index 00000000..2f5e5e8b
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_metal_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ed4fe169d38d58f2c12803dffe9eefbb6a1f38a3575bfb801524a29f1ca0693b
+size 1843961
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_metal_Normal.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_metal_Normal.uasset
new file mode 100644
index 00000000..68d5de11
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_metal_Normal.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:379677ee86b33f564c967091753ab36cc016e6711492e080c911ac7754a4916a
+size 3104123
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_metal_OcclusionRoughnessMetallic.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_metal_OcclusionRoughnessMetallic.uasset
new file mode 100644
index 00000000..3bb8b092
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_metal_OcclusionRoughnessMetallic.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3ce3c8bb5233b10ac7427a9f3ac3a3451d2446137f381041dd8d473f5507d0d6
+size 3442594
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_poster_Normal.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_poster_Normal.uasset
new file mode 100644
index 00000000..31ae574b
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_poster_Normal.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1435f2ab43364c3c8f7e9a30f0932706c9ff816794b8bdbeb3fa50bbc8a63ae7
+size 1912620
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_poster_OcclusionRoughnessMetallic.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_poster_OcclusionRoughnessMetallic.uasset
new file mode 100644
index 00000000..503a598a
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/frame_poster_OcclusionRoughnessMetallic.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e9ebd6d9f38883bed33518fabab6b900bd919377f7b631eaa317e53c58cc3b92
+size 1429535
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_KOMET_poster1.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_KOMET_poster1.uasset
new file mode 100644
index 00000000..af5782f8
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_KOMET_poster1.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:880252cad78514366bf7932e60d4cebce3bcc5393a0eb135a8c931dd3cb297d4
+size 14306
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_KOMET_poster2.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_KOMET_poster2.uasset
new file mode 100644
index 00000000..2b8b9d4a
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_KOMET_poster2.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2270c17e8e92fda32343505f80bd3e67657f5c4cbda75f0dd95098a8ea8a1890
+size 13497
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_KOMET_poster3.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_KOMET_poster3.uasset
new file mode 100644
index 00000000..d014f4d3
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_KOMET_poster3.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b0b50d5e98f3324998ea0fa03418941868bebd92c22b00d1db0c92537cfa6eef
+size 16667
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_SPACESHIP10.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_SPACESHIP10.uasset
new file mode 100644
index 00000000..02380191
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_SPACESHIP10.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6b12932dc517f5415aeee17258b81be468bdfe609638cba89a3778a39275162d
+size 13836
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_SPACESHIP6.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_SPACESHIP6.uasset
new file mode 100644
index 00000000..9a3e656a
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_SPACESHIP6.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:52727988bfbb81122d315f0d01916e2ba494fb86d69694c660faaf92b071cff3
+size 13055
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_SPACESHIP7.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_SPACESHIP7.uasset
new file mode 100644
index 00000000..4f20d28f
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_SPACESHIP7.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:85a0f86530805696f7e8dda40bb16fd2c50d360f68a24f93839e6f15d9a9d2c4
+size 12403
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_SPACESHIP8.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_SPACESHIP8.uasset
new file mode 100644
index 00000000..64de6e27
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_SPACESHIP8.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3bfc2ec418e58c749dba041328d4ecb4273e7f81cfd4d31c93f48de553eb9d89
+size 12903
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_SPACESHIP9.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_SPACESHIP9.uasset
new file mode 100644
index 00000000..323a02df
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_SPACESHIP9.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3454ac32000a1a68eec6a71d78f8426299339c3f48857e161ec210d5d4b4f0dd
+size 13948
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_TORIO_poster.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_TORIO_poster.uasset
new file mode 100644
index 00000000..da28cf76
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_TORIO_poster.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d7af3f7d2ec8f08760f6f712fb863e09ec856f085ea2e0ab675ccbc4070a93ec
+size 15382
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_TORIO_poster2.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_TORIO_poster2.uasset
new file mode 100644
index 00000000..bf2adc69
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_TORIO_poster2.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e0bf0dd26ac167b535ee566023c54461c68ca99c9e676a53ad0f5c60fef3c032
+size 16021
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_TORIO_poster4.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_TORIO_poster4.uasset
new file mode 100644
index 00000000..6d40d30e
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_TORIO_poster4.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0bb1d4d532f7acc15eb48f7f89dd8e6389bd6d6eab90d5a79695e5a4aac63721
+size 15218
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_VLAST_poster1.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_VLAST_poster1.uasset
new file mode 100644
index 00000000..5211e053
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_VLAST_poster1.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b5ce74e3d45ee1f7487be3db0259484a74be92402d1767edd8110d58e8e0d29f
+size 12365
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_VLAST_poster2.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_VLAST_poster2.uasset
new file mode 100644
index 00000000..41635cd1
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_VLAST_poster2.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2a1d16d52e9385d16be2bd29c596c61bd28d509fab367784203184ab7895ce8d
+size 11878
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_VLAST_poster3.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_VLAST_poster3.uasset
new file mode 100644
index 00000000..015e3a7d
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/posters/poster_VLAST_poster3.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c2b24c2cb7ada4f2e5ff4e6c4caf7c3cd89ccd6b2fc6bb5985b41c780931938e
+size 12885
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/shelf_laundry/shelf_laundry.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/shelf_laundry/shelf_laundry.uasset
new file mode 100644
index 00000000..a53a68e5
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/shelf_laundry/shelf_laundry.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:32bc6a16a1ceace189afe78cdc3f1e3b5355fa1764ea0bc0a5c72ca6ca737134
+size 14432
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/shelf_laundry/shelf_low_standardSurface1_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/shelf_laundry/shelf_low_standardSurface1_BaseColor.uasset
new file mode 100644
index 00000000..1808477a
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/shelf_laundry/shelf_low_standardSurface1_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b462d582854e81408c989a328fd29d7678447ea23fa3fa5665ca5b349dcd6921
+size 398780
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/shelf_laundry/shelf_low_standardSurface1_Normal.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/shelf_laundry/shelf_low_standardSurface1_Normal.uasset
new file mode 100644
index 00000000..cf68873f
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/shelf_laundry/shelf_low_standardSurface1_Normal.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d1825c4cd12193d837ff477d02ee9fe4c68a81a64f49aeb8338139f28d13adb5
+size 167212
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/shelf_laundry/shelf_low_standardSurface1_OcclusionRoughnessMetallic.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/shelf_laundry/shelf_low_standardSurface1_OcclusionRoughnessMetallic.uasset
new file mode 100644
index 00000000..6ed11450
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/shelf_laundry/shelf_low_standardSurface1_OcclusionRoughnessMetallic.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:acd5ec3e132fa0f3f5122f55326bd4c01d219a71991a48464d2b60b0d42ac584
+size 73230
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/side_table/side_table_ye.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/side_table/side_table_ye.uasset
index 588e6f42..2d95b716 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/side_table/side_table_ye.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/side_table/side_table_ye.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:bee15307e1072d93ec3623c3d717372276721c90e3276a53ebecb77de9a4ccb1
-size 24225
+oid sha256:53e551d2d2ae526c9ba4838dcde092ef19345452e6afa2dc364dd4a5a2ebf846
+size 19612
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/sofa_02/sofa_02.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/sofa_02/sofa_02.uasset
index e3245bf4..70d58dd0 100644
--- a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/sofa_02/sofa_02.uasset
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/sofa_02/sofa_02.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:59e5de77ae561c21c524ec182345337034b0be8f13303b037249dc97757398ba
-size 18596
+oid sha256:dec2889284d75544fd452d2334869c9ba2155dbc3bcb52818cc6ed0c6a7e05d5
+size 19188
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/dryer.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/dryer.uasset
new file mode 100644
index 00000000..250ef5d6
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/dryer.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d5e01cd668ac0bbec6d460ca5f4779f4c2a5b9358c9d98dbb562220deb10e13d
+size 14682
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/dryer_low_standardSurface1_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/dryer_low_standardSurface1_BaseColor.uasset
new file mode 100644
index 00000000..456be651
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/dryer_low_standardSurface1_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3a55c2066663d2d0c54206f95341f561407635ed9838bcbe375f867b3e55976c
+size 962040
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/dryer_low_standardSurface1_Emissive.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/dryer_low_standardSurface1_Emissive.uasset
new file mode 100644
index 00000000..7b4526da
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/dryer_low_standardSurface1_Emissive.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8b3d3abc730ca16f51a7a441571c0d5bae687009e20dc6fec505031314faed3b
+size 35869
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/dryer_low_standardSurface1_Normal.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/dryer_low_standardSurface1_Normal.uasset
new file mode 100644
index 00000000..71294bd7
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/dryer_low_standardSurface1_Normal.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a1b590770b8ff0493ba21819c746dfbcc6c371cc5f063724533dcc0e7599449e
+size 965295
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/dryer_low_standardSurface1_OcclusionRoughnessMetallic.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/dryer_low_standardSurface1_OcclusionRoughnessMetallic.uasset
new file mode 100644
index 00000000..8fe1474e
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/dryer_low_standardSurface1_OcclusionRoughnessMetallic.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:47abc04c38ce07a9cc1a4b441287f35900ee9cfc0e111724b2101a4de469f876
+size 174265
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/washer.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/washer.uasset
new file mode 100644
index 00000000..add2204c
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/washer.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c47d548981b20a60e9df956fb0676956fa9a8cbdbcdb93ab5d825908ab3f9fd0
+size 14237
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/washer_low_standardSurface1_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/washer_low_standardSurface1_BaseColor.uasset
new file mode 100644
index 00000000..ffc5cca6
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/washer_low_standardSurface1_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c271e51e4bb62ba49d6e3debfebcc9eac7488b06126bf750574385dd4a372eff
+size 1050958
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/washer_low_standardSurface1_Emissive.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/washer_low_standardSurface1_Emissive.uasset
new file mode 100644
index 00000000..93d575e4
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/washer_low_standardSurface1_Emissive.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:99d9c6edb0ede55b687afca95bf7aab2e47e0006d521ab4b1ed03e7a17af3f1a
+size 34536
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/washer_low_standardSurface1_Normal.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/washer_low_standardSurface1_Normal.uasset
new file mode 100644
index 00000000..eda8fb8b
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/washer_low_standardSurface1_Normal.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:092eb1e2e86cbec6f7f1a56d89a611a7311eabf1588c7ed920889f0284b9e1c0
+size 965328
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/washer_low_standardSurface1_OcclusionRoughnessMetallic.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/washer_low_standardSurface1_OcclusionRoughnessMetallic.uasset
new file mode 100644
index 00000000..9e03c57d
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Textures/washer_n_dryer/washer_low_standardSurface1_OcclusionRoughnessMetallic.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e143983eb11a8ec57e52b4597dd34a1ecd4077d212c927732dec92bb89fdd454
+size 174298
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Wardrobe_low.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Wardrobe_low.uasset
new file mode 100644
index 00000000..e39721b5
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/Wardrobe_low.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:052e33f77ccd7185c8c5c0d2e0d5e9b23e4ac6050c1c66f496bd06b74863e399
+size 49396
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/boiler_low.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/boiler_low.uasset
new file mode 100644
index 00000000..50f21ddb
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/boiler_low.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:73bbf1ae727e6b76480fde6f60a72eb66177a99a0da8e79978f6212b47c1541b
+size 177145
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/dryer_low.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/dryer_low.uasset
new file mode 100644
index 00000000..2c10cfab
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/dryer_low.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:28236549a9dfc3fec74c440e94c80919ccbeabd3f99c0367b45621d3b5663445
+size 113260
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/ironingboard_low.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/ironingboard_low.uasset
new file mode 100644
index 00000000..d650fefc
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/ironingboard_low.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e76052ed1456fc8fb9cec40c6fbabf6645392e39356bb1e6d1a7801eac69dba0
+size 120476
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/laundry_low.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/laundry_low.uasset
new file mode 100644
index 00000000..c868de54
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/laundry_low.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a8af264a994db050885905860d98afda46dfb3bd026f5e9ad205e78208e731a4
+size 178531
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/shelf_low.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/shelf_low.uasset
new file mode 100644
index 00000000..1b5e9fa4
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/shelf_low.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:eea02aecd9280cf26002dfb8e5acb63c65276c271a221a5bcdc47147b304388a
+size 38141
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/shh/becca_shovel.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/shh/becca_shovel.uasset
new file mode 100644
index 00000000..981d3b61
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/shh/becca_shovel.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f3b1482d78352464495fb59c0faef86c05c213b62b5394497d458ef7190de859
+size 15312
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/shh/real_shovel_low.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/shh/real_shovel_low.uasset
new file mode 100644
index 00000000..ed648809
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/shh/real_shovel_low.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:03d1188e290a6af54d699dd1619b15b94e3a355d6e43a7bf4bf822292c51e691
+size 83613
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/shh/real_shovel_low_lambert1_BaseColor.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/shh/real_shovel_low_lambert1_BaseColor.uasset
new file mode 100644
index 00000000..1e4e7cfd
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/shh/real_shovel_low_lambert1_BaseColor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:450c976b63250b8371529feeaaaa2319167aa21dd4db6f7d874d43ace68098f4
+size 680422
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/shh/real_shovel_low_lambert1_Normal.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/shh/real_shovel_low_lambert1_Normal.uasset
new file mode 100644
index 00000000..c10a17ec
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/shh/real_shovel_low_lambert1_Normal.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c710c226b864974a9e3851ca4c74f3e1c735677fd44bca152c4317065b7808bc
+size 1574790
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/shh/real_shovel_low_lambert1_OcclusionRoughnessMetallic.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/shh/real_shovel_low_lambert1_OcclusionRoughnessMetallic.uasset
new file mode 100644
index 00000000..4d743f37
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/boiler_room/shh/real_shovel_low_lambert1_OcclusionRoughnessMetallic.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9c6e5375ed1a2f5fb0d94de2ae152879b0af4e840b37adf73d56de195f5a901e
+size 925531
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/frame.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/frame.uasset
new file mode 100644
index 00000000..765c200b
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/frame.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6331a1642afb4c7bf37ffeb290b055acbc45fac82703acf899e7a6d245e56206
+size 27140
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/particle_effects/dust_small.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/particle_effects/dust_small.uasset
new file mode 100644
index 00000000..0bb45044
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/particle_effects/dust_small.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ad7dc75325b63ab858cf940fbf44b78a5ba93b3ed8238fbe19c8374f0d418759
+size 1017855
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/particle_effects/dust_test_01.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/particle_effects/dust_test_01.uasset
new file mode 100644
index 00000000..31ebe594
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/particle_effects/dust_test_01.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:494168b1b8a1363e4b6bd8977f6a7cbdd267189926dcc49af103a1a7bc9701f6
+size 848853
diff --git a/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/standardSurface2.uasset b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/standardSurface2.uasset
new file mode 100644
index 00000000..ce102d54
--- /dev/null
+++ b/EndlessVendetta/Content/Assets/Objects/Tutorial-Level/standardSurface2.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:18862c1d7476da86e4d63ffcc8eaeff682de37973f9953f574c8fd86a66900b8
+size 8215
diff --git a/EndlessVendetta/Content/BountySystem/ApartmentBounty/BP_Elevator.uasset b/EndlessVendetta/Content/BountySystem/ApartmentBounty/BP_Elevator.uasset
new file mode 100644
index 00000000..f6e4a525
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/ApartmentBounty/BP_Elevator.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a28c44c09d3ee396d17502b08ad02f029c01b5f0927fa3ec295dc77621a87dbf
+size 101367
diff --git a/EndlessVendetta/Content/BountySystem/ApartmentBounty/CP_ElimTImothyHuntsmer.uasset b/EndlessVendetta/Content/BountySystem/ApartmentBounty/CP_ElimTImothyHuntsmer.uasset
new file mode 100644
index 00000000..13650e05
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/ApartmentBounty/CP_ElimTImothyHuntsmer.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:402b1927aa8568280268ea72ed9a74d119cfb7f90b15aea33b51e2c77d676638
+size 98725
diff --git a/EndlessVendetta/Content/BountySystem/ApartmentBounty/CinematicFrmaes/TimothyEliminatedSequence1.png b/EndlessVendetta/Content/BountySystem/ApartmentBounty/CinematicFrmaes/TimothyEliminatedSequence1.png
new file mode 100644
index 00000000..798913fa
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/ApartmentBounty/CinematicFrmaes/TimothyEliminatedSequence1.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d6defdebce48d779d1cf9053de2a395b030f4034602ad2027a0b4a082b168cf3
+size 146340
diff --git a/EndlessVendetta/Content/BountySystem/ApartmentBounty/CinematicFrmaes/TimothyEliminatedSequence1.uasset b/EndlessVendetta/Content/BountySystem/ApartmentBounty/CinematicFrmaes/TimothyEliminatedSequence1.uasset
new file mode 100644
index 00000000..c61f6f3d
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/ApartmentBounty/CinematicFrmaes/TimothyEliminatedSequence1.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9a9afa23ae558b83cb702459c867762949f69aef33c0f2f8a56e183deef52932
+size 194758
diff --git a/EndlessVendetta/Content/BountySystem/ApartmentBounty/CinematicFrmaes/TimothyEliminatedSequence2.png b/EndlessVendetta/Content/BountySystem/ApartmentBounty/CinematicFrmaes/TimothyEliminatedSequence2.png
new file mode 100644
index 00000000..6b66e440
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/ApartmentBounty/CinematicFrmaes/TimothyEliminatedSequence2.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:40542ca5853424aac1fde9208cd0c1ed33cb85166ea4ec97ad8f0f3ca2e15346
+size 178614
diff --git a/EndlessVendetta/Content/BountySystem/ApartmentBounty/CinematicFrmaes/TimothyEliminatedSequence2.uasset b/EndlessVendetta/Content/BountySystem/ApartmentBounty/CinematicFrmaes/TimothyEliminatedSequence2.uasset
new file mode 100644
index 00000000..6f47784b
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/ApartmentBounty/CinematicFrmaes/TimothyEliminatedSequence2.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b42f7563773dec9db697b0e2621bf9ce0f4f66c973f77ef24e3ffec0f633e14a
+size 187754
diff --git a/EndlessVendetta/Content/BountySystem/ApartmentBounty/CinematicFrmaes/TimothyEliminatedSequence3.png b/EndlessVendetta/Content/BountySystem/ApartmentBounty/CinematicFrmaes/TimothyEliminatedSequence3.png
new file mode 100644
index 00000000..4dab7396
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/ApartmentBounty/CinematicFrmaes/TimothyEliminatedSequence3.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a7766c777eb648565ddd99693d5d8fb69dad34ce1d5489e69ce617939bbde6bf
+size 19246
diff --git a/EndlessVendetta/Content/BountySystem/ApartmentBounty/CinematicFrmaes/TimothyEliminatedSequence3.uasset b/EndlessVendetta/Content/BountySystem/ApartmentBounty/CinematicFrmaes/TimothyEliminatedSequence3.uasset
new file mode 100644
index 00000000..ac6f5814
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/ApartmentBounty/CinematicFrmaes/TimothyEliminatedSequence3.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:161d5bd4b9ad1fd63d358155ca4612b125d7471c35dd39219bb0727fdf255cf0
+size 46015
diff --git a/EndlessVendetta/Content/BountySystem/ApartmentBounty/MB_Apartment.uasset b/EndlessVendetta/Content/BountySystem/ApartmentBounty/MB_Apartment.uasset
new file mode 100644
index 00000000..30ecc43f
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/ApartmentBounty/MB_Apartment.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c24d0e32c594435e5c24f57444e1a99c1c7e491256f16bf15f60f1a627928600
+size 23786
diff --git a/EndlessVendetta/Content/BountySystem/ApartmentBounty/OWCP_Apartment.uasset b/EndlessVendetta/Content/BountySystem/ApartmentBounty/OWCP_Apartment.uasset
new file mode 100644
index 00000000..69c1e83d
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/ApartmentBounty/OWCP_Apartment.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f671cf047ef64679d0a306f563a38958bb751c78b68c615d63c539ec1cf84b92
+size 24453
diff --git a/EndlessVendetta/Content/BountySystem/ApartmentBounty/TargetEliminatedSequence.uasset b/EndlessVendetta/Content/BountySystem/ApartmentBounty/TargetEliminatedSequence.uasset
new file mode 100644
index 00000000..cc5c5772
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/ApartmentBounty/TargetEliminatedSequence.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:59b317daaff6320cb349f0431e5afd1dda081e7ccd94c85e1410a79acb309b5c
+size 15321
diff --git a/EndlessVendetta/Content/BountySystem/ApartmentBounty/WBP_TimothyEliminated.uasset b/EndlessVendetta/Content/BountySystem/ApartmentBounty/WBP_TimothyEliminated.uasset
new file mode 100644
index 00000000..7288e08b
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/ApartmentBounty/WBP_TimothyEliminated.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0cf418c167f49075338deb5047703b031ac61ed014b691277846e62a97bca97e
+size 105471
diff --git a/EndlessVendetta/Content/BountySystem/BountyDirector/BountyDirector.uasset b/EndlessVendetta/Content/BountySystem/BountyDirector/BountyDirector.uasset
deleted file mode 100644
index 2bf1b703..00000000
--- a/EndlessVendetta/Content/BountySystem/BountyDirector/BountyDirector.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:cb434bd86f5440300a97827c0043b25f804e7648ac189615a90fb0ba61978060
-size 22149
diff --git a/EndlessVendetta/Content/BountySystem/BountyDirector/PC_Background.uasset b/EndlessVendetta/Content/BountySystem/BountyDirector/PC_Background.uasset
deleted file mode 100644
index cbb194b6..00000000
--- a/EndlessVendetta/Content/BountySystem/BountyDirector/PC_Background.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:168c4766d0d0686ae57a992b6b59db7ff0bf98e75547d37623910aa3d8c3649b
-size 247653
diff --git a/EndlessVendetta/Content/BountySystem/BountyDirector/WBP_PC_Display.uasset b/EndlessVendetta/Content/BountySystem/BountyDirector/WBP_PC_Display.uasset
deleted file mode 100644
index 5e266442..00000000
--- a/EndlessVendetta/Content/BountySystem/BountyDirector/WBP_PC_Display.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:acab50641ebfd8ec73bda00d7ce661f23e7773e4b88863de1982b34b52ebc114
-size 1026639
diff --git a/EndlessVendetta/Content/BountySystem/BountyDirector/WBP_StaticPCBG.uasset b/EndlessVendetta/Content/BountySystem/BountyDirector/WBP_StaticPCBG.uasset
deleted file mode 100644
index 02a4c8b4..00000000
--- a/EndlessVendetta/Content/BountySystem/BountyDirector/WBP_StaticPCBG.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:1fd8cfefdb9488ee066675e784fe4fe0ec31f689d82741b5cc8d5cfdbf0b64e4
-size 29059
diff --git a/EndlessVendetta/Content/BountySystem/CP_FinalCheckpoint.uasset b/EndlessVendetta/Content/BountySystem/CP_FinalCheckpoint.uasset
new file mode 100644
index 00000000..069dbaf8
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/CP_FinalCheckpoint.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b4def4c35207288e74d661944c22141894dab91956f6460bf59c67373a2732c4
+size 26814
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/BD_ControlsTutorial.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/BD_ControlsTutorial.uasset
index 0be75321..efcbde67 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/BD_ControlsTutorial.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/BD_ControlsTutorial.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:40bd75983c7b88eeb6da42edb3385099060d4fe752549c93b78022ef04178432
-size 23414
+oid sha256:2a9f8a712306da06c1d52eca49f38b700757456c7de80e65a955f34b4d30ae5d
+size 21612
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/BP_FakePC.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/BP_FakePC.uasset
index 58851687..dcb8b4a8 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/BP_FakePC.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/BP_FakePC.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:344ee11e0bef8351a5864ff640c6683b671b770618d874e7176520acf7ce28d4
-size 31613
+oid sha256:b71c8e03553562e61f578505293ae2d566f9cb7aa3e4807ca2e12238f684711e
+size 31703
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_ARTargets.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_ARTargets.uasset
index 2af01bdc..36650dc1 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_ARTargets.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_ARTargets.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d2fa8f3a9544a1a634ef263e4fbb972cd89d36e288969fd8ab0433b58d3217ed
-size 139421
+oid sha256:fb666c3b8ece874e8ed766a2044f48dcd90c90c92d91544dfd7c63e1cd5ed1be
+size 137365
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_BeginPlay.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_BeginPlay.uasset
index 1cbf22b6..cb98668e 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_BeginPlay.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_BeginPlay.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:aeaebe8f4e55dd6acef6fafb7f68b37daa8de601f6e7c49b731afcbbd8359737
-size 23701
+oid sha256:3cc9d57fa13895cf12ef2b16c2fc357c7251c429519d0d4ced1973aa95cc2877
+size 63667
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_CrouchTutorial.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_CrouchTutorial.uasset
index 6eb66527..841de14e 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_CrouchTutorial.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_CrouchTutorial.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5325ea111c8fb93bc1041dd9c0047c5e79a495b1d915692a93953e66f9928b7a
-size 32432
+oid sha256:d4efb7c1ba1f73f8a28af056a62999ebe516fb9a5417d67e0b923527c73106fd
+size 32191
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_EnterApartment.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_EnterApartment.uasset
index 071fbb33..94fbb18f 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_EnterApartment.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_EnterApartment.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:ec504a6b730e8a130a953402743ccc6bc824ceb5a81c01faf75c4c09f3b4270e
-size 24494
+oid sha256:a2462cc97e58b98796201e445f71d8ea88b65a47c49ee1df949d76eb37bc3892
+size 24165
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_EnterSpaceShip.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_EnterSpaceShip.uasset
index 0dacf6c4..460acb58 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_EnterSpaceShip.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_EnterSpaceShip.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:ed613e63504155e721996dea2f3180730a6b814cd3711ec6c49d2ed3f923cdf0
-size 30859
+oid sha256:bbfb03b3eb01f922dc51f468218f2c718d79033b5e79d14852c5e158937c6a5f
+size 30816
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_GoToParkourRoom.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_GoToParkourRoom.uasset
index 725a2f8d..610ddb92 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_GoToParkourRoom.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_GoToParkourRoom.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:6240a080976c8265bb3f30dabffaa60e39342e4ad21a09e0c6e502b26db1bd9f
-size 79097
+oid sha256:7708afcb260864d1ea1c68dc91bc59b9112809ad42a1aed2319505dbc9b1eb4a
+size 78283
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_JumpAcross.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_JumpAcross.uasset
index 051f0897..2cc8f74d 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_JumpAcross.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_JumpAcross.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:4253efb3878b3746237d94284c111cbf6b7194174abacc443977b6c5c05376f2
-size 32263
+oid sha256:36d12b8f4022742a62116cf0f9331774ae808a1c5823aad5c7deb88d6bc8e95a
+size 32097
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_LandAtTheLZ.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_LandAtTheLZ.uasset
index 08d2e523..6b6b9f3d 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_LandAtTheLZ.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_LandAtTheLZ.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5c29582635bba8a022617ea4ab24a67129c83637a62708033c73e202e660c73a
-size 32480
+oid sha256:d750a1fb59aa72b306a51d728cb5f030fd6ba160bac08bc8d243f8333e34105c
+size 32186
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_PickAGun.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_PickAGun.uasset
index e57df75c..701a0043 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_PickAGun.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_PickAGun.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:2bc46d8f06b67bb59c378a7fae31b43fdc3687f2564a982805a339d6cf7eb336
-size 101877
+oid sha256:d9958f2c1c8bce46aee31989458737e7ce1b0b77c89ec4e77945addcbaa202e0
+size 98464
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_PickUpAR.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_PickUpAR.uasset
index 974afaa5..abf4d3ec 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_PickUpAR.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_PickUpAR.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:dd1d85ab782abd0e077f12beb4112d4451c7c64d574fdac5286e919c833fd3ad
-size 112873
+oid sha256:e0d22b524ec3ba6a4f487a053cb0c30d797f7ad84a68eaf2a4e1520117b206cc
+size 108582
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_PickUpPistol.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_PickUpPistol.uasset
index 5f6bbddd..e2287dc0 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_PickUpPistol.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_PickUpPistol.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:b671686018ce92a788dd6081c763154a924b59d545598e4664e12fb8b7349785
-size 112610
+oid sha256:225ebd8974c59ad97fd7432439ff1b1b38a823ecece0aa37cd90204ac9d7d5b9
+size 108723
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_PickUpShotgun.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_PickUpShotgun.uasset
index e3a3f7b0..e7143b86 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_PickUpShotgun.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_PickUpShotgun.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:517c23d9b6fe1d1c153e85a8fba4c1395718150de1043538126813b8528f2b29
-size 112571
+oid sha256:477cc99dfadffda504188c966a3ae4ea9b3c46a9854ef1f910ded5830d14a15d
+size 107851
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_PickUpSniper.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_PickUpSniper.uasset
index 59489c9b..59579cc7 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_PickUpSniper.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_PickUpSniper.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:7b40a020b449acdbe5936f8f50ca0392383ed9052fbc816bd801bc8f7891a116
-size 112615
+oid sha256:804d570352178c6a3c98388a67c672b2dfff00831c4f4239c9626223609de69f
+size 107716
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_PickupShipKeys.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_PickupShipKeys.uasset
index 4fe69927..b07c55b8 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_PickupShipKeys.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_PickupShipKeys.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:8acdf6bef392e519d56700c01d14c8baf5846ef88312e094fdd9ad43ec928b1d
-size 35556
+oid sha256:7382be6426cf944bdf11682efcefb49bf1da004ef678716def3a234cf4e9bd6e
+size 35513
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_PistolTargets.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_PistolTargets.uasset
index 1aa9c10a..a4b439fe 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_PistolTargets.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_PistolTargets.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5a5faea0ea4c17c09962caf04dbd847ae816e8393357f9d3aa3b98e58a536cd5
-size 138635
+oid sha256:bee00855718a89c9ffc159bd2a4e95ce9c5538d2570649e79ee3248c088fb631
+size 137451
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_ShotgunTargets.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_ShotgunTargets.uasset
index 5310f2a3..be2dc5f1 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_ShotgunTargets.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_ShotgunTargets.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:9479dddf3a10d1d0d4c531c7a99b4b92c228fdba019413fae1dcc5b3ef3a611a
-size 139218
+oid sha256:7d56f6fa8da408d61da9b2e6b354dd90e3e34d1ecfe05d2ccc5563314b12341d
+size 137495
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_SignPapers.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_SignPapers.uasset
index 17653bdc..eef16353 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_SignPapers.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_SignPapers.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:39f596602119a2d87afe4264d72d7c128a466d15e70edd392be378dad3c07c60
-size 41769
+oid sha256:789a0ed560bafea9492c5f9e8b8f4081c7113620cec63e13623c8dbdb78fb33a
+size 41619
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_SniperTargets.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_SniperTargets.uasset
index 5b294b0d..1d92c881 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_SniperTargets.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_SniperTargets.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:7b8f05d26ba5ca90f8715c4b4f46a602ffecfe30b16dff0162e2109245b2f32d
-size 133796
+oid sha256:9d0d70db58a092d9889facf2c50a62628132278b35214692c0895166e169379b
+size 131406
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_SprintAcross.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_SprintAcross.uasset
index 3d7aa91c..c247b51f 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_SprintAcross.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_SprintAcross.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:997d9aabef7ac6af506b7c5e0ae86773102ebe12751037356f93165a94a3b8aa
-size 32411
+oid sha256:6499e8e62f26382870864eed81685520f4e8cc09dd44cb344dfbd73e71e1df3d
+size 32170
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_VaultOver.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_VaultOver.uasset
index f4893bc5..6f90c07b 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_VaultOver.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Checkpoints/CP_VaultOver.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:0c8afdedd67bcb947122e95349c550600f599cd77cc28d582f422bf7f97e547f
-size 32316
+oid sha256:63e22888a9cdb2f057306006eb4ad8d4276b68c438627d0fc7176f5058fd13a9
+size 32097
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Cutscenes/WBP_GameIntro.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Cutscenes/WBP_GameIntro.uasset
new file mode 100644
index 00000000..c3ee7b1f
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/Cutscenes/WBP_GameIntro.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d46e59922d5c6c22e421303807855e757a2de879cb81e482ab4e5329e3cf1b38
+size 93040
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/MB_Training.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/MB_Training.uasset
index 34fc9e16..11607e4e 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/MB_Training.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/MB_Training.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:1e8460e234c4bb8d7571c60a13281283510f8e388120cbe9527f2bd6a3f0b4a0
-size 26318
+oid sha256:14fd53a50ee9b233156dd4e8ff06c7a92800afbe4934bb067d7fe94c28d2cdda
+size 26131
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/OWCP_Training.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/OWCP_Training.uasset
new file mode 100644
index 00000000..2ed776b6
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/Bounty/OWCP_Training.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f6f9debd6a0a8ef030b539f4e5a09d27bfd0c840cf7ae6ee680612eede4e454f
+size 24209
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/GadgetRoom/BP_CombatWorkbench.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/GadgetRoom/BP_CombatWorkbench.uasset
index ac8bd1a3..7318d3fe 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/GadgetRoom/BP_CombatWorkbench.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/GadgetRoom/BP_CombatWorkbench.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:bba29d903bd71cd8616cb0d7fac5d27b6f96532ca0f79a8ec153e2de884045c3
-size 22827
+oid sha256:4a8d81ddcd99e038c7e5e087ad382fb0c3d9fb5685316366ba152b07ff86f9f2
+size 22698
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/GadgetRoom/BP_GadgetWall.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/GadgetRoom/BP_GadgetWall.uasset
index 66bf5551..7a992806 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/GadgetRoom/BP_GadgetWall.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/GadgetRoom/BP_GadgetWall.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:370cad49c42aa8322993053abfa0955b5aeb9c6035392c82a01d7bf12c7e6e3f
-size 93912
+oid sha256:0f58fe8846e4dfd57ddd385a05c04f0dfbbdf342829567375efd75e1aad361fc
+size 92072
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/GadgetRoom/BP_ReconWorkbench.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/GadgetRoom/BP_ReconWorkbench.uasset
index 4161fe1b..c6f71fc5 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/GadgetRoom/BP_ReconWorkbench.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/GadgetRoom/BP_ReconWorkbench.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:589125c0e5dd3e531117df471dc16a549d3ef6f72ddd7ceed1b6832b9f75371a
-size 22912
+oid sha256:11a7c980f59dd567c5f59e3963537536bd3f2dd69d43067ac1f84bf228e48983
+size 22967
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/Parkour/BP_SprintWall1.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/Parkour/BP_SprintWall1.uasset
index e63ad1c3..4562a026 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/Parkour/BP_SprintWall1.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/Parkour/BP_SprintWall1.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:007c41e02175f5148b70e70402ff985c1d343b0ce85f5b5845f82351aeb6c8b6
-size 105113
+oid sha256:f9efcb82f57b17b3a9bc48530ba28334fbbad9c2220784a68275972634c5946d
+size 102503
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/Parkour/BP_SprintWall2.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/Parkour/BP_SprintWall2.uasset
index ad3cfd25..58eaf6e3 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/Parkour/BP_SprintWall2.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/Parkour/BP_SprintWall2.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:2b24b7285a71d441bb8813d55db2341fe7e99b97fb25b33a84ca1e1c4a7bee0f
-size 111590
+oid sha256:d69e435f092b24d3e1e71b2016f5b331f16c3a1c03c0bfb78c1a1e4c65c253c3
+size 108370
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/Parkour/BP_SprintWall3.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/Parkour/BP_SprintWall3.uasset
index 9905d716..625e8c0d 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/Parkour/BP_SprintWall3.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/Parkour/BP_SprintWall3.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:ed77e01ce92927b44b11dc1b5515bdac53fe8c0669c02884850972d491a74381
-size 110924
+oid sha256:cc730be68f2ab24f99721d5a4a07dc3bbccd048b08eb244c5d8c0a3e2fa13543
+size 107933
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/Target/BP_NonShootableTarget.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/Target/BP_NonShootableTarget.uasset
index 2f3a6471..3cbc8128 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/Target/BP_NonShootableTarget.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/Target/BP_NonShootableTarget.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:9da4b09d534f6e2890b12d0dbaacba8204da954d9c88f454395070346a61c993
-size 63628
+oid sha256:7d195c14ffcbabf84b66202c1a1e8c2575fc2a528fef5785084f76c99198e4ca
+size 63790
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/Target/BP_Target.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/Target/BP_Target.uasset
index 4e299b9e..50e84f33 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/Target/BP_Target.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/Target/BP_Target.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:e333e91573e1d36e39ad1e52eb0da38a11aefc23ed219427acfc9ffe3a3160f0
-size 99655
+oid sha256:6fc7c50381ecef344c02fce37526cf44de06d07d0bdc4e697ef4ec30e8f0e8f4
+size 98315
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/Target/M_Target.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/Target/M_Target.uasset
new file mode 100644
index 00000000..38743b98
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/Target/M_Target.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:13e2f623f9de1a599a75178637b756a7081b59fa03e5f3eced51cca1836a9423
+size 15545
diff --git a/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/Target/standardSurface1.uasset b/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/Target/standardSurface1.uasset
index f02b0cc5..d9f2948d 100644
--- a/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/Target/standardSurface1.uasset
+++ b/EndlessVendetta/Content/BountySystem/ControlsTutorial/GunRangeMechanics/Target/standardSurface1.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:1d04d6fd6e9dc14ff6f65a890367b8165bf8e9db049cd1cd7339f2e999dd8833
-size 8260
+oid sha256:5964328a707ccd0d44172ddefc1dce4ae9159c3ec8b8146b3eda19d3097d3664
+size 1642
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/BountyDirector/BountyDirector.uasset b/EndlessVendetta/Content/BountySystem/Legacy/BountyDirector/BountyDirector.uasset
new file mode 100644
index 00000000..64387264
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/BountyDirector/BountyDirector.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f10c06825d0044b2d4be64e29bcddb66f8cbbff423ee7c4d3e8fdd0f1fbf00fc
+size 22219
diff --git a/EndlessVendetta/Content/BountySystem/BountyDirector/PC_Background.jpg b/EndlessVendetta/Content/BountySystem/Legacy/BountyDirector/PC_Background.jpg
similarity index 100%
rename from EndlessVendetta/Content/BountySystem/BountyDirector/PC_Background.jpg
rename to EndlessVendetta/Content/BountySystem/Legacy/BountyDirector/PC_Background.jpg
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/BountyDirector/PC_Background.uasset b/EndlessVendetta/Content/BountySystem/Legacy/BountyDirector/PC_Background.uasset
new file mode 100644
index 00000000..41d69c17
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/BountyDirector/PC_Background.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:658a104a86c28d2c666caa71db206093bd5345567a2e8ab5c11f5a177bd5d639
+size 247667
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/BountyDirector/WBP_PC_Display.uasset b/EndlessVendetta/Content/BountySystem/Legacy/BountyDirector/WBP_PC_Display.uasset
new file mode 100644
index 00000000..16bb4a81
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/BountyDirector/WBP_PC_Display.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9a478e964b2a600c91f592778049e1f6011049f76555225f9e7a6de26832daec
+size 1024136
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/BountyDirector/WBP_StaticPCBG.uasset b/EndlessVendetta/Content/BountySystem/Legacy/BountyDirector/WBP_StaticPCBG.uasset
new file mode 100644
index 00000000..b2603fb1
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/BountyDirector/WBP_StaticPCBG.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e1b83c38a21515446e89c93b1c52d3544b78c66c709ac8b3a1f90f4fe15d5ee8
+size 28610
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TestBounties/FavourSystemBountyTest/MainBounty/CP_MB.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TestBounties/FavourSystemBountyTest/MainBounty/CP_MB.uasset
new file mode 100644
index 00000000..7307ab77
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TestBounties/FavourSystemBountyTest/MainBounty/CP_MB.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e7f07405491766078ac280ee603e56e23e1c8fb67bab131368aa6c9e59dd3b2c
+size 63586
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TestBounties/FavourSystemBountyTest/MainBounty/MB_TestBounty.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TestBounties/FavourSystemBountyTest/MainBounty/MB_TestBounty.uasset
new file mode 100644
index 00000000..315558fe
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TestBounties/FavourSystemBountyTest/MainBounty/MB_TestBounty.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7d3dcedd3c3121a883ccd1f32979bb75c505962763d35fa2d56eeb45e22f48bc
+size 36512
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TestBounties/FavourSystemBountyTest/SideBounties/CP_1.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TestBounties/FavourSystemBountyTest/SideBounties/CP_1.uasset
new file mode 100644
index 00000000..9f8bdb01
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TestBounties/FavourSystemBountyTest/SideBounties/CP_1.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:84d921ae3f886b7982cd7cd3bd3220bbe0684ed02a4c29917e18feaffb921e79
+size 63625
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TestBounties/FavourSystemBountyTest/SideBounties/CP_2.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TestBounties/FavourSystemBountyTest/SideBounties/CP_2.uasset
new file mode 100644
index 00000000..2745e6b8
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TestBounties/FavourSystemBountyTest/SideBounties/CP_2.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d2698a2ae2b1292052cf3305d6f13ff650feb019e96d6661707cc6f2d7e86a72
+size 63619
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TestBounties/FavourSystemBountyTest/SideBounties/CP_3.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TestBounties/FavourSystemBountyTest/SideBounties/CP_3.uasset
new file mode 100644
index 00000000..a92f29ca
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TestBounties/FavourSystemBountyTest/SideBounties/CP_3.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:022989dc5dfc1db3a356b48324761390e13d861fd55b863d5160047f8c5e06bd
+size 63613
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TestBounties/FavourSystemBountyTest/SideBounties/SB_1.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TestBounties/FavourSystemBountyTest/SideBounties/SB_1.uasset
new file mode 100644
index 00000000..5589244d
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TestBounties/FavourSystemBountyTest/SideBounties/SB_1.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5b8f2f01ccf500fbadb5a240f7dbef80656bbb0156cb9a37172fc318cff18549
+size 22879
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TestBounties/FavourSystemBountyTest/SideBounties/SB_2.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TestBounties/FavourSystemBountyTest/SideBounties/SB_2.uasset
new file mode 100644
index 00000000..45962650
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TestBounties/FavourSystemBountyTest/SideBounties/SB_2.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:774b37246cc07ee0e243da33343721048e0aaee4f895de2efb34cb68141b278b
+size 22941
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TestBounties/FavourSystemBountyTest/SideBounties/SB_3.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TestBounties/FavourSystemBountyTest/SideBounties/SB_3.uasset
new file mode 100644
index 00000000..fea2a55c
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TestBounties/FavourSystemBountyTest/SideBounties/SB_3.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3d69237482e5b359319cd3da38443f444029c3e17ce28ee6963c132cabc8af07
+size 22875
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/BP_WeaponTable.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/BP_WeaponTable.uasset
new file mode 100644
index 00000000..86e26ecc
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/BP_WeaponTable.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:52ce673af2c9929ca4172dc11a825fd775000834aeb60c0bf566d0ee09a96c84
+size 29694
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/BountySimulation/CP_ElimTutorialTarget.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/BountySimulation/CP_ElimTutorialTarget.uasset
new file mode 100644
index 00000000..4af01071
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/BountySimulation/CP_ElimTutorialTarget.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2be049b806cbf608d0062def11a2c31313a7c8fa7db8a235361060540e67d810
+size 139491
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/BountySimulation/CP_EnterBountySimulationFacility.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/BountySimulation/CP_EnterBountySimulationFacility.uasset
new file mode 100644
index 00000000..4555e49e
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/BountySimulation/CP_EnterBountySimulationFacility.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:91bb76daaa241739e84cd8e5475db967b7a090ed397749872e0eed9e67751764
+size 81995
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/BountySimulation/CP_ExitBountySimulationFacility.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/BountySimulation/CP_ExitBountySimulationFacility.uasset
new file mode 100644
index 00000000..f894918b
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/BountySimulation/CP_ExitBountySimulationFacility.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:57e44aea22dc6a0679b5520909b3141f93767849078b00f61981ec60edc6e236
+size 58101
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/CP_IntroCinematic.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/CP_IntroCinematic.uasset
new file mode 100644
index 00000000..850985d1
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/CP_IntroCinematic.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9b752be467bc1f771cab1606e0a4359e941121c3de2cd6adab366ef9c5edf37c
+size 57900
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/CP_ParkourTutorial.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/CP_ParkourTutorial.uasset
new file mode 100644
index 00000000..7f54a4f4
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/CP_ParkourTutorial.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:574b8e6737057c2a38c3d914e37fdad923d8afca96cd8ccf8eb409680ca4703c
+size 38502
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/CP_PickUpWeapon.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/CP_PickUpWeapon.uasset
new file mode 100644
index 00000000..891c1a92
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/CP_PickUpWeapon.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:efd4f218e1269d71aa2fd5504af0d75233d5fc305cfe12463918af6092496b84
+size 60195
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/FiringRanges/BP_CQCRange.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/FiringRanges/BP_CQCRange.uasset
new file mode 100644
index 00000000..39f853ff
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/FiringRanges/BP_CQCRange.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:13c689be17d437fa22bab321597eabff9577e164f610d6568d19a65ada975b44
+size 100380
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/FiringRanges/BP_LongRange.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/FiringRanges/BP_LongRange.uasset
new file mode 100644
index 00000000..3679d599
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/FiringRanges/BP_LongRange.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:30cc1f6d2125612681ab878e8aebfa4646193e40df54775d9844cf296b82c295
+size 112244
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/FiringRanges/CP_CheckOutCQCRange.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/FiringRanges/CP_CheckOutCQCRange.uasset
new file mode 100644
index 00000000..7c8c9649
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/FiringRanges/CP_CheckOutCQCRange.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fbcab427c8e1bfdd423b6991820145e68bd892fdbc202185ef34f4a561444f90
+size 147980
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/FiringRanges/CP_CheckOutLongRange.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/FiringRanges/CP_CheckOutLongRange.uasset
new file mode 100644
index 00000000..03a31093
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/FiringRanges/CP_CheckOutLongRange.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3503aa4e773a374ef6d4175005f3e6d1e5c4e40f673e326b52211824ff3f1449
+size 156494
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/BP_InfiniteHealthEnemy.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/BP_InfiniteHealthEnemy.uasset
new file mode 100644
index 00000000..c672543d
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/BP_InfiniteHealthEnemy.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fc4c2421452de8606495aab0466b8e08f09084b3f1856a45c58dfcf02be6231d
+size 42155
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/Combat/CP_CombatTraining.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/Combat/CP_CombatTraining.uasset
new file mode 100644
index 00000000..b1804e89
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/Combat/CP_CombatTraining.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:14ee8aa50aaae227912d0a7f0c9f309bd04bc49400bff4dbe8d5ceb95605f740
+size 46647
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/Combat/GT_OverloadModule.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/Combat/GT_OverloadModule.uasset
new file mode 100644
index 00000000..5bcf5fc6
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/Combat/GT_OverloadModule.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ce45fda78c7faea91cedcad4463e498859625f54277d615fca69536b0a3e0d89
+size 143141
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/GadgetTutorialIcon.png b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/GadgetTutorialIcon.png
similarity index 100%
rename from EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/GadgetTutorialIcon.png
rename to EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/GadgetTutorialIcon.png
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/GadgetTutorialIcon.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/GadgetTutorialIcon.uasset
new file mode 100644
index 00000000..1f5c659a
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/GadgetTutorialIcon.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a1714e5970e23885870f1e4fe41eab9a3b034c0f26ead5346aa77bc9adeb3362
+size 39841
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/Recon/CP_GoDownstairs.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/Recon/CP_GoDownstairs.uasset
new file mode 100644
index 00000000..61428964
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/Recon/CP_GoDownstairs.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f6db8fa7f0cf34e90e33d18300222b4169b78ed334ecd145f440512360b5940b
+size 38604
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/Recon/CP_ReconTraining.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/Recon/CP_ReconTraining.uasset
new file mode 100644
index 00000000..a167a1f2
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/Recon/CP_ReconTraining.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7cd387fbda243514dd8bd7a03a29a782dd87ef9a6ac0d5c9ccbfcd5a33b14501
+size 46677
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/Recon/GT_RingModule.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/Recon/GT_RingModule.uasset
new file mode 100644
index 00000000..ee75aa60
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/Recon/GT_RingModule.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a0afa8f007cd324eb2e52ea0bf0674ce9ba3ed337ae6459dd310dd304ae3d219
+size 144256
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/Recon/GT_VisionLink.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/Recon/GT_VisionLink.uasset
new file mode 100644
index 00000000..7bc9e5bf
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/Recon/GT_VisionLink.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:db5b3c6db40c0ead734f6febffc883903ae8898c7ea35950ba92d64d9477bf7d
+size 213168
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/WBP_GadgetMenu.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/WBP_GadgetMenu.uasset
new file mode 100644
index 00000000..129eefbf
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/GadgetTutorial/WBP_GadgetMenu.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5c480a50c56791e4ae21ac2cdf3f9a362ec14665b376bbe595f310fa6ea30d7f
+size 118680
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/WBP_EnterSimulationCutscene.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/WBP_EnterSimulationCutscene.uasset
new file mode 100644
index 00000000..6d65eb5f
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/WBP_EnterSimulationCutscene.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0eab344456c153b25f15718f40309ab3c11ca722a5a0a689137a799041f87826
+size 86035
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/WBP_HiredCutscene.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/WBP_HiredCutscene.uasset
new file mode 100644
index 00000000..ca1680ce
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Checkpoints/WBP_HiredCutscene.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7cc5988a0b0d09e9c4b718cdaed4e47842a960de3a817a6b9ba457f504d2fbbb
+size 103436
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/BedroomEnemy/BE_TF_Bedroom.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/BedroomEnemy/BE_TF_Bedroom.uasset
new file mode 100644
index 00000000..af6e4d99
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/BedroomEnemy/BE_TF_Bedroom.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ab67366fd4d5c24e140afd8a1d857cbfa510602f42eab8be85cf8994e4246647
+size 105561
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/BedroomEnemy/PP_TF_Bedroom.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/BedroomEnemy/PP_TF_Bedroom.uasset
new file mode 100644
index 00000000..0935974a
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/BedroomEnemy/PP_TF_Bedroom.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:50269b6f53df831840a1b8edf1030aa0a8c78a970e0f610ed9759b6a34cc4b50
+size 13032
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/DiningRoomEnemy/BE_TF_Dining.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/DiningRoomEnemy/BE_TF_Dining.uasset
new file mode 100644
index 00000000..d9247c70
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/DiningRoomEnemy/BE_TF_Dining.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7fecb40716ffa8b66706ae8e99910f2794668107ff51e3274315f6e099981ae0
+size 105632
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/DiningRoomEnemy/PP_TF_DiningRoom.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/DiningRoomEnemy/PP_TF_DiningRoom.uasset
new file mode 100644
index 00000000..aecdb2bc
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/DiningRoomEnemy/PP_TF_DiningRoom.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:06018ab9ab92c83bd1b8973f7f1705d29fcdac2941b1f6d7370d08d9048747c4
+size 13089
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/LivingRoomEnemy/BE_TF_Living.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/LivingRoomEnemy/BE_TF_Living.uasset
new file mode 100644
index 00000000..82aad92f
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/LivingRoomEnemy/BE_TF_Living.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bac33da3b4123d3ad696c2c0e77ab098bf71ed7492cf5e024d88079ac551a349
+size 105626
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/LivingRoomEnemy/PP_TF_LivingRoom.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/LivingRoomEnemy/PP_TF_LivingRoom.uasset
new file mode 100644
index 00000000..5be8abd6
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/LivingRoomEnemy/PP_TF_LivingRoom.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d6155f001c5cf3ed0c06b8d16083dd60cc7edbb717bc695fb966e4f6c2a4d695
+size 13089
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/OutsidePatrolEnemy/BE_TF_Outside.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/OutsidePatrolEnemy/BE_TF_Outside.uasset
new file mode 100644
index 00000000..013a1727
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/OutsidePatrolEnemy/BE_TF_Outside.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:91b9659ffd04e6cda37de8659bde09613ac91a6257dede524aa5176f9084eb11
+size 105642
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/OutsidePatrolEnemy/PP_TF_Outside.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/OutsidePatrolEnemy/PP_TF_Outside.uasset
new file mode 100644
index 00000000..cccbf3ba
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/OutsidePatrolEnemy/PP_TF_Outside.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0366093de4e1c824bd9f4ddd08454796321231d365859dea9f62d057d8366bc0
+size 13056
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/RoamingEnemy/BE_TF_Roaming.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/RoamingEnemy/BE_TF_Roaming.uasset
new file mode 100644
index 00000000..012b9935
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/RoamingEnemy/BE_TF_Roaming.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:27d9760d1c3b135c09a17652620b54ab2ddf4a5f4b6bb5b9b914b151c83a3735
+size 105561
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/RoamingEnemy/PP_TF_Roaming.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/RoamingEnemy/PP_TF_Roaming.uasset
new file mode 100644
index 00000000..dfa92ffd
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/RoamingEnemy/PP_TF_Roaming.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1a02c8f1d1b55231822f18e3480293e91ca44034dcbf9a6375b63e169aff838e
+size 13128
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/TargetEnemy/BE_TF_Target.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/TargetEnemy/BE_TF_Target.uasset
new file mode 100644
index 00000000..26f92651
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/TargetEnemy/BE_TF_Target.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7d16a2f29193444a7ca6ea3558388089b3addf32426a7c1e632ac2c90fa1943b
+size 106185
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/TargetEnemy/PP_TF_Target.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/TargetEnemy/PP_TF_Target.uasset
new file mode 100644
index 00000000..d3fc7dad
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/TargetEnemy/PP_TF_Target.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2c781553daaed3c0268de5fa03194f560601fd4213379b399b480ab7d7c0df61
+size 13013
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/UpstairsPatrolEnemy/BE_TF_Upstairs.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/UpstairsPatrolEnemy/BE_TF_Upstairs.uasset
new file mode 100644
index 00000000..339d5998
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/UpstairsPatrolEnemy/BE_TF_Upstairs.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cecad06a61c97b651f509cd3760e549660bcf4689ddfc2a113888a868f4cf5d4
+size 105635
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/UpstairsPatrolEnemy/PP_TF_Upstairs.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/UpstairsPatrolEnemy/PP_TF_Upstairs.uasset
new file mode 100644
index 00000000..bb99b337
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/Enemies/UpstairsPatrolEnemy/PP_TF_Upstairs.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6528d16cbcf7954407e69ce0e0bcd00199d1efcec89f66b9350985307ca83f15
+size 13099
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF1.jpg b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF1.jpg
similarity index 100%
rename from EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF1.jpg
rename to EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF1.jpg
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF1.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF1.uasset
new file mode 100644
index 00000000..4b3ad12f
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF1.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:13927ed75b340c1d45994f6480d05e126b49286b7f70abc72a1cafb9b605a98a
+size 520121
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF10.jpg b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF10.jpg
similarity index 100%
rename from EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF10.jpg
rename to EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF10.jpg
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF10.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF10.uasset
new file mode 100644
index 00000000..91a03129
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF10.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2b10f0282440b1714e84bda283dd5ad5d4897a5ee948aa7a705c3277ef5c132c
+size 190157
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF11.jpg b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF11.jpg
similarity index 100%
rename from EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF11.jpg
rename to EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF11.jpg
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF11.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF11.uasset
new file mode 100644
index 00000000..cbac11e1
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF11.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9b41278c784f571d5b7cf90e5196870d569ad3a3408e58efa2f9e14b739d5974
+size 199897
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF12.jpg b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF12.jpg
similarity index 100%
rename from EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF12.jpg
rename to EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF12.jpg
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF12.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF12.uasset
new file mode 100644
index 00000000..c04f8079
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF12.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:56a286eac8b1f21e971c758cfc398e694075bcc248725b49e4331bb28648c2a1
+size 278017
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF13.jpg b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF13.jpg
similarity index 100%
rename from EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF13.jpg
rename to EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF13.jpg
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF13.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF13.uasset
new file mode 100644
index 00000000..2fabc459
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF13.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8991ab471958d9e0d17318e31d994f069bca9477208f94ed674dfcdb3dc0d0ef
+size 216055
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF14.jpg b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF14.jpg
similarity index 100%
rename from EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF14.jpg
rename to EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF14.jpg
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF14.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF14.uasset
new file mode 100644
index 00000000..6412f628
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF14.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7feadcc7a9a72d1608a6cb555e42c120bf3761d0283a633047ade546eff507e1
+size 207094
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF15.jpg b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF15.jpg
similarity index 100%
rename from EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF15.jpg
rename to EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF15.jpg
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF15.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF15.uasset
new file mode 100644
index 00000000..56a815d8
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF15.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:31d285958b9bb9d53914a97f99dc12b69724c3a041b6331bd6f66c1087e55911
+size 265263
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF16.jpg b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF16.jpg
similarity index 100%
rename from EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF16.jpg
rename to EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF16.jpg
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF16.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF16.uasset
new file mode 100644
index 00000000..1803fe27
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF16.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2bc7068735cf576c29aa70a804b1c19439797a9e89f4a5af4be363655b50af1e
+size 287312
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF17.jpg b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF17.jpg
similarity index 100%
rename from EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF17.jpg
rename to EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF17.jpg
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF17.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF17.uasset
new file mode 100644
index 00000000..e556406e
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF17.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d69aa3909bdca7c18e8dde23e5998c612a5201c44c88e37f6d5a42649587cc31
+size 93883
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF18.jpg b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF18.jpg
similarity index 100%
rename from EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF18.jpg
rename to EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF18.jpg
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF18.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF18.uasset
new file mode 100644
index 00000000..e373a51a
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF18.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8d5080a9dd754481cc48c3ecda48ef344728619abefb1591a2523c76d8a72cd7
+size 222878
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF19.jpg b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF19.jpg
similarity index 100%
rename from EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF19.jpg
rename to EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF19.jpg
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF19.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF19.uasset
new file mode 100644
index 00000000..2d972709
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF19.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7a00bb41cb941855298ecc641a8606a2aaef1afc2c16edbc16b20fe73a75fe24
+size 349142
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF2.jpg b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF2.jpg
similarity index 100%
rename from EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF2.jpg
rename to EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF2.jpg
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF2.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF2.uasset
new file mode 100644
index 00000000..7affc7ad
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF2.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:526e67746bf784480c303624c2db22f42cc92b5891a4a5df45724090036de95a
+size 514336
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF20.jpg b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF20.jpg
similarity index 100%
rename from EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF20.jpg
rename to EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF20.jpg
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF20.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF20.uasset
new file mode 100644
index 00000000..90545539
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF20.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b1dadc8686d931a7d56dcc615bd360aec43e3d863c62c060a27f9542134d4b8a
+size 279722
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF21.jpg b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF21.jpg
similarity index 100%
rename from EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF21.jpg
rename to EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF21.jpg
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF21.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF21.uasset
new file mode 100644
index 00000000..e4ab3727
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF21.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c7b0d8b2f8fa3c67325eb40fce823c4992b033430e7a2035c46a46b96b85e921
+size 264996
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF22.jpg b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF22.jpg
similarity index 100%
rename from EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF22.jpg
rename to EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF22.jpg
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF22.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF22.uasset
new file mode 100644
index 00000000..352e3fd5
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF22.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:02672d579a231b7f20e46f660e952424a5ee2cb7c8a65ad2c62a40e65a6955c8
+size 201422
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF23.jpg b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF23.jpg
similarity index 100%
rename from EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF23.jpg
rename to EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF23.jpg
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF23.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF23.uasset
new file mode 100644
index 00000000..054f3996
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF23.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:171f8a1ffaa8e823519dcfeabfc38c20e3b8a8a29b55693eb979a5e22de30404
+size 233885
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF24.jpg b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF24.jpg
similarity index 100%
rename from EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF24.jpg
rename to EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF24.jpg
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF24.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF24.uasset
new file mode 100644
index 00000000..276e16bf
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF24.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:25c3a4bc8f7e9264a6e08faeb207179690a080064944d88b102064aca921f326
+size 243473
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF3.jpg b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF3.jpg
similarity index 100%
rename from EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF3.jpg
rename to EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF3.jpg
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF3.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF3.uasset
new file mode 100644
index 00000000..b889b439
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF3.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:255743fd8a4d98470627936bf3db65554e66a030c458eb89ae5fb549dfa51f1c
+size 223849
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF4.jpg b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF4.jpg
similarity index 100%
rename from EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF4.jpg
rename to EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF4.jpg
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF4.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF4.uasset
new file mode 100644
index 00000000..a0b77c55
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF4.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e0f95956468b3565535547dcd9dedd920265df86ee1fd300e2a564c8166fd6c6
+size 154165
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF5.jpg b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF5.jpg
similarity index 100%
rename from EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF5.jpg
rename to EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF5.jpg
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF5.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF5.uasset
new file mode 100644
index 00000000..c77c07c3
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF5.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:71072ea290b02ba755a99d0ba7431ddcf7af53d9c6244848115fcf3ee4798a48
+size 196697
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF6.jpg b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF6.jpg
similarity index 100%
rename from EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF6.jpg
rename to EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF6.jpg
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF6.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF6.uasset
new file mode 100644
index 00000000..f1c4860c
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF6.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b6130543f18fdb50a710b67240134ebb87ba9eec8a6702ebfcf591b60cda5d30
+size 230606
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF7.jpg b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF7.jpg
similarity index 100%
rename from EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF7.jpg
rename to EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF7.jpg
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF7.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF7.uasset
new file mode 100644
index 00000000..820a5fb7
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF7.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:941ee76cbcfd6d076fa433390a1a4f51ab71ecc98b004e45b50e2652f0848241
+size 234033
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF8.jpg b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF8.jpg
similarity index 100%
rename from EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF8.jpg
rename to EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF8.jpg
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF8.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF8.uasset
new file mode 100644
index 00000000..b8f45980
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF8.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:34069edf6defdb76d68ae1dd44c4de0ad6fb5e9b17bc981efaf9d6259facd2a0
+size 225008
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF9.jpg b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF9.jpg
similarity index 100%
rename from EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF9.jpg
rename to EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF9.jpg
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF9.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF9.uasset
new file mode 100644
index 00000000..931cb465
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/IntroF9.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b00bd581cec253a1d34aa241f880d5e5aa1c481d7b90e1768275abcc44a0cb55
+size 251635
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/PlayersHomeShipImage.jpg b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/PlayersHomeShipImage.jpg
similarity index 100%
rename from EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/PlayersHomeShipImage.jpg
rename to EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/PlayersHomeShipImage.jpg
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/PlayersHomeShipImage.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/PlayersHomeShipImage.uasset
new file mode 100644
index 00000000..7711c2f3
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/PlayersHomeShipImage.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:eeff5c7a398d612a5e100b13b7ddb36a2a2c2816c0447d22a6c6010935fe0c7c
+size 148266
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/WBP_IntroCutscene.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/WBP_IntroCutscene.uasset
new file mode 100644
index 00000000..6935f4fa
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/IntroCutscene/WBP_IntroCutscene.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7f5abe814da514365911427a44fb06d527d89c83c9ec09e21bf6e9330a86c0fd
+size 131544
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/MB_TutorialFacility.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/MB_TutorialFacility.uasset
new file mode 100644
index 00000000..776777f7
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/MB_TutorialFacility.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5e2c6f5432fcd43a5ec6d741122cb6b7bffc728fba418b26443ee16e516b5046
+size 16338
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/RespawnPoint.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/RespawnPoint.uasset
new file mode 100644
index 00000000..31ba4319
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/RespawnPoint.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bec6acd307ed9b0de4e228831379a95dbcb20f1ed5cd738bc12d8c53b7f8c2f6
+size 22142
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/TrainingFacilityBountyDirector.uasset b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/TrainingFacilityBountyDirector.uasset
new file mode 100644
index 00000000..6c7107e6
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/TutorialFacility/TrainingFacilityBountyDirector.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:09c762bea1a69f8d7349755bab6889a697003177850255e124c2e5fe7825fe3d
+size 22406
diff --git a/EndlessVendetta/Content/BountySystem/Legacy/testintesting.uasset b/EndlessVendetta/Content/BountySystem/Legacy/testintesting.uasset
new file mode 100644
index 00000000..9007fcab
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Legacy/testintesting.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:066668e7bba9999c8cc5d09b26520ffbd5327d37de8789099af2764841720bca
+size 9250
diff --git a/EndlessVendetta/Content/BountySystem/TestBounties/FavourSystemBountyTest/MainBounty/CP_MB.uasset b/EndlessVendetta/Content/BountySystem/TestBounties/FavourSystemBountyTest/MainBounty/CP_MB.uasset
deleted file mode 100644
index 822f2d62..00000000
--- a/EndlessVendetta/Content/BountySystem/TestBounties/FavourSystemBountyTest/MainBounty/CP_MB.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4630de4ea95731ea1488ab3b135b07396a1dd842f9909c6380d2a7934c2aa8d7
-size 63981
diff --git a/EndlessVendetta/Content/BountySystem/TestBounties/FavourSystemBountyTest/MainBounty/MB_TestBounty.uasset b/EndlessVendetta/Content/BountySystem/TestBounties/FavourSystemBountyTest/MainBounty/MB_TestBounty.uasset
deleted file mode 100644
index 0309cf1b..00000000
--- a/EndlessVendetta/Content/BountySystem/TestBounties/FavourSystemBountyTest/MainBounty/MB_TestBounty.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3bee98bbd8e50e208c8f9ee6c2a8560f183a2bba774f090b183ab236ba7ebd22
-size 38649
diff --git a/EndlessVendetta/Content/BountySystem/TestBounties/FavourSystemBountyTest/SideBounties/CP_1.uasset b/EndlessVendetta/Content/BountySystem/TestBounties/FavourSystemBountyTest/SideBounties/CP_1.uasset
deleted file mode 100644
index 79086246..00000000
--- a/EndlessVendetta/Content/BountySystem/TestBounties/FavourSystemBountyTest/SideBounties/CP_1.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:cd5b80d48c39e4dbd4f62dafaecb54ec5c7fa2a1d12dfbdd1f9be85cc74b368a
-size 64021
diff --git a/EndlessVendetta/Content/BountySystem/TestBounties/FavourSystemBountyTest/SideBounties/CP_2.uasset b/EndlessVendetta/Content/BountySystem/TestBounties/FavourSystemBountyTest/SideBounties/CP_2.uasset
deleted file mode 100644
index 30c128aa..00000000
--- a/EndlessVendetta/Content/BountySystem/TestBounties/FavourSystemBountyTest/SideBounties/CP_2.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d27935ca0589d21ab1e7ca9ebd3de80fa4666c43fdc239cbe4cd13358ecb5d71
-size 64015
diff --git a/EndlessVendetta/Content/BountySystem/TestBounties/FavourSystemBountyTest/SideBounties/CP_3.uasset b/EndlessVendetta/Content/BountySystem/TestBounties/FavourSystemBountyTest/SideBounties/CP_3.uasset
deleted file mode 100644
index 7804ed1b..00000000
--- a/EndlessVendetta/Content/BountySystem/TestBounties/FavourSystemBountyTest/SideBounties/CP_3.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:127a3c5d1ddd972ed32552a4e0e61f4d72d94ed978d98ad9eec8933e2711c6c0
-size 64009
diff --git a/EndlessVendetta/Content/BountySystem/TestBounties/FavourSystemBountyTest/SideBounties/SB_1.uasset b/EndlessVendetta/Content/BountySystem/TestBounties/FavourSystemBountyTest/SideBounties/SB_1.uasset
deleted file mode 100644
index d88016a5..00000000
--- a/EndlessVendetta/Content/BountySystem/TestBounties/FavourSystemBountyTest/SideBounties/SB_1.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e89aba9e6af5b1bd48b5b2b48242eb1d057a63f552b22ea6122091a81556d9d6
-size 22765
diff --git a/EndlessVendetta/Content/BountySystem/TestBounties/FavourSystemBountyTest/SideBounties/SB_2.uasset b/EndlessVendetta/Content/BountySystem/TestBounties/FavourSystemBountyTest/SideBounties/SB_2.uasset
deleted file mode 100644
index f61482fd..00000000
--- a/EndlessVendetta/Content/BountySystem/TestBounties/FavourSystemBountyTest/SideBounties/SB_2.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8ae78ca79d0f944fd9ae21df42c30f3993f595e6a750455a5960cd0e4b890143
-size 22827
diff --git a/EndlessVendetta/Content/BountySystem/TestBounties/FavourSystemBountyTest/SideBounties/SB_3.uasset b/EndlessVendetta/Content/BountySystem/TestBounties/FavourSystemBountyTest/SideBounties/SB_3.uasset
deleted file mode 100644
index f575b5b1..00000000
--- a/EndlessVendetta/Content/BountySystem/TestBounties/FavourSystemBountyTest/SideBounties/SB_3.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:736bb99394a031e33b1a14f712b0ad0b6540cc047153933347b449746f46ffc5
-size 22761
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/BP_WeaponTable.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/BP_WeaponTable.uasset
deleted file mode 100644
index fd66d6d4..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/BP_WeaponTable.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:00bbbb9790870bbe08879eec576c3c57f0eca6162cfe7063cb2f2a0c10b87a93
-size 29602
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/BountySimulation/CP_ElimTutorialTarget.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/BountySimulation/CP_ElimTutorialTarget.uasset
deleted file mode 100644
index e35ad8ed..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/BountySimulation/CP_ElimTutorialTarget.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e517fd38bf17f395edda2c998cbed260ac94e95ab348f7eb696232dffd112dc9
-size 143697
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/BountySimulation/CP_EnterBountySimulationFacility.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/BountySimulation/CP_EnterBountySimulationFacility.uasset
deleted file mode 100644
index 537c3b62..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/BountySimulation/CP_EnterBountySimulationFacility.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:cb422b19b15ab7568686c196a6f8344053589c94ab572025195f6a31ed6e2a7a
-size 83208
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/BountySimulation/CP_ExitBountySimulationFacility.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/BountySimulation/CP_ExitBountySimulationFacility.uasset
deleted file mode 100644
index 16ed3897..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/BountySimulation/CP_ExitBountySimulationFacility.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a95afab359651372dc7a4b610c26acdceee19e660d3e0a1036eecc5e9dc081ba
-size 59234
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/CP_IntroCinematic.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/CP_IntroCinematic.uasset
deleted file mode 100644
index 9baa8118..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/CP_IntroCinematic.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:66f9f7016f0fb3d431f16dc9ec1c045a7123a20d7001bb1094c5d43fd7cfcb3b
-size 60949
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/CP_ParkourTutorial.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/CP_ParkourTutorial.uasset
deleted file mode 100644
index c1b4c121..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/CP_ParkourTutorial.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:20c146ca9121d08cc486f1d15b935101e2faad580974b40b32144f4f3cf466b6
-size 38506
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/CP_PickUpWeapon.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/CP_PickUpWeapon.uasset
deleted file mode 100644
index 80f6d632..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/CP_PickUpWeapon.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c983ac6f5ed8e39f4fd28d0d35a06fc6b1d4569f0448a3e6672a1cc664e91175
-size 60950
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/FiringRanges/BP_CQCRange.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/FiringRanges/BP_CQCRange.uasset
deleted file mode 100644
index 942a2ae0..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/FiringRanges/BP_CQCRange.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:96f0a512c232f3f8d44a79dde7fd6da8d34a02581ac068f010f9ffdaf7bba755
-size 101077
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/FiringRanges/BP_LongRange.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/FiringRanges/BP_LongRange.uasset
deleted file mode 100644
index 12a9aaa2..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/FiringRanges/BP_LongRange.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f8f3d90b13b51423a6cba2d48c8b722b3659b7a14f4bcb6ac730a20df8339b1a
-size 112942
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/FiringRanges/CP_CheckOutCQCRange.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/FiringRanges/CP_CheckOutCQCRange.uasset
deleted file mode 100644
index b7080ef7..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/FiringRanges/CP_CheckOutCQCRange.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9a329b5461ac74c60fb7e33cc1369d9985dfb5cf33c1f85ddf207a36f94e3fb8
-size 147979
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/FiringRanges/CP_CheckOutLongRange.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/FiringRanges/CP_CheckOutLongRange.uasset
deleted file mode 100644
index ffe2f671..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/FiringRanges/CP_CheckOutLongRange.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e035f7ddd3dcf755fb0ed071ba8d162c3a8b17bb9e5fe788443a35df5a0f5b21
-size 156499
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/BP_GadgetTutorial.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/BP_GadgetTutorial.uasset
deleted file mode 100644
index 35556abe..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/BP_GadgetTutorial.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0c9c1c5174be17340a5c1af17f65ebad2f56450fb8194dd1aee554d703ac68ed
-size 2754
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/BP_InfiniteHealthEnemy.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/BP_InfiniteHealthEnemy.uasset
deleted file mode 100644
index 3ac4ffc8..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/BP_InfiniteHealthEnemy.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ff0184855d0b831ff073d507262a1297f3fd676f49a4ec28ded918fbb8896069
-size 42127
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/BP_Recon.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/BP_Recon.uasset
deleted file mode 100644
index 6f1b328e..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/BP_Recon.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:86a649d86566076f0904ef7792d413399eedea9e074a4d60603396c5ea3734fb
-size 2763
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/BP_ReconWorkbench.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/BP_ReconWorkbench.uasset
deleted file mode 100644
index 546a248e..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/BP_ReconWorkbench.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:191a1e2ab132262fdd234e16a45508f0bff1cc081c977e49cffba1c4017bb052
-size 2801
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/Combat/CP_CombatTraining.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/Combat/CP_CombatTraining.uasset
deleted file mode 100644
index 36b8ab99..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/Combat/CP_CombatTraining.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e05c2b2a67900f795bea030cd060cb7ce55f4801f5573c5e4b5ab22ff5aa4198
-size 47609
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/Combat/GT_OverloadModule.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/Combat/GT_OverloadModule.uasset
deleted file mode 100644
index 7ab35daf..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/Combat/GT_OverloadModule.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c3f7370adadacaa691397522121b6c975e922c007eba7b08420598f3cb906fdb
-size 143122
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/GadgetTutorialIcon.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/GadgetTutorialIcon.uasset
deleted file mode 100644
index b4abdb12..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/GadgetTutorialIcon.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:7c8b4bb3136c292666348a27c69ab73e1431c62985783fa66a12f622d002228f
-size 39827
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/Recon/BP_ReconWorkbench.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/Recon/BP_ReconWorkbench.uasset
deleted file mode 100644
index 4c9ab416..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/Recon/BP_ReconWorkbench.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:db7428812684fd4a236a27ac272036dcb2c51411792f52a44c6c2880229efda7
-size 2738
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/Recon/CP_GoDownstairs.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/Recon/CP_GoDownstairs.uasset
deleted file mode 100644
index 0edb31b5..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/Recon/CP_GoDownstairs.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9f83c02b2613872e32f795c91ce190d44c2cfdf83785965105ed43d9e326ec7e
-size 38762
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/Recon/CP_ReconTraining.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/Recon/CP_ReconTraining.uasset
deleted file mode 100644
index 90dbb721..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/Recon/CP_ReconTraining.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8c6becce8ef63d5920459cc97049122bbd5c56ff7886c49fbbccd06f2f24d8f1
-size 47510
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/Recon/GT_RingModule.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/Recon/GT_RingModule.uasset
deleted file mode 100644
index c361a44b..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/Recon/GT_RingModule.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:029257b219ada12742b0a16af98a8904c477cd27345d9997c9a3fc79d1327117
-size 144242
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/Recon/GT_VisionLink.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/Recon/GT_VisionLink.uasset
deleted file mode 100644
index 2ca83102..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/Recon/GT_VisionLink.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:535cd7f074418223d517abe6748a7c40749000dcfa9ecb5e17d7d1c378b5360e
-size 214724
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/WBP_GadgetMenu.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/WBP_GadgetMenu.uasset
deleted file mode 100644
index 69d96971..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/WBP_GadgetMenu.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:810d2dfb5cf17a33620f773ada8e2d7972ad795139900d78e326fdae5af35239
-size 119297
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/WBP_EnterSimulationCutscene.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/WBP_EnterSimulationCutscene.uasset
deleted file mode 100644
index faf0e8c8..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/WBP_EnterSimulationCutscene.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:42595da531f4db98b51bb2fdb8f617a91fd9de728df25a64f47b7200947f884c
-size 86733
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/WBP_HiredCutscene.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/WBP_HiredCutscene.uasset
deleted file mode 100644
index 3abe2366..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/WBP_HiredCutscene.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ddfa2b5455c745aaf63af8000945f2696d2248d6f059347bd4c2dd927910baed
-size 104895
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/BedroomEnemy/BE_TF_Bedroom.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/BedroomEnemy/BE_TF_Bedroom.uasset
deleted file mode 100644
index 282d52f2..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/BedroomEnemy/BE_TF_Bedroom.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:1df06845b2be99973a0567e9bbd4b05f87ff4ac270bd78e78d030f41996826dc
-size 106375
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/BedroomEnemy/PP_TF_Bedroom.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/BedroomEnemy/PP_TF_Bedroom.uasset
deleted file mode 100644
index 68f70e77..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/BedroomEnemy/PP_TF_Bedroom.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:df5a2500d27329e8de757164387d7d8f8b63b58119bb7ad63898a34cd053c653
-size 13034
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/DiningRoomEnemy/BE_TF_Dining.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/DiningRoomEnemy/BE_TF_Dining.uasset
deleted file mode 100644
index 313cc740..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/DiningRoomEnemy/BE_TF_Dining.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b8abac0ac05cf183bc4a7d6a6b54dad56a476d41b49db54a85933b704b0b10a8
-size 106926
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/DiningRoomEnemy/PP_TF_DiningRoom.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/DiningRoomEnemy/PP_TF_DiningRoom.uasset
deleted file mode 100644
index 58c88511..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/DiningRoomEnemy/PP_TF_DiningRoom.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c8b98d4f4b418d7e056899dc8153137c700342c0325dfc4d9bf126d84af445ca
-size 13061
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/LivingRoomEnemy/BE_TF_Living.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/LivingRoomEnemy/BE_TF_Living.uasset
deleted file mode 100644
index 3876306c..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/LivingRoomEnemy/BE_TF_Living.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:96bf3bc05b1d4a6a76556282cf0817abee6af85a9bc4f10af94c323e10e6b06a
-size 106920
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/LivingRoomEnemy/PP_TF_LivingRoom.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/LivingRoomEnemy/PP_TF_LivingRoom.uasset
deleted file mode 100644
index 65e00893..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/LivingRoomEnemy/PP_TF_LivingRoom.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:966e6cbe348de1734c26bbf2dfadc4238378765a962a155cb7aae81295fd83bb
-size 13061
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/OutsidePatrolEnemy/BE_TF_Outside.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/OutsidePatrolEnemy/BE_TF_Outside.uasset
deleted file mode 100644
index 65966bd4..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/OutsidePatrolEnemy/BE_TF_Outside.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ec0a4d9f721fa3407d9977d6e47e742426d1e49f5f2c40ee5167d153ea6e9058
-size 106934
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/OutsidePatrolEnemy/PP_TF.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/OutsidePatrolEnemy/PP_TF.uasset
deleted file mode 100644
index 12e36731..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/OutsidePatrolEnemy/PP_TF.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fc837363528efff7871b4dfcbdc89052ce58dee49ff3ab8fb3bfe7b95be9a05a
-size 2682
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/OutsidePatrolEnemy/PP_TF_OutBack.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/OutsidePatrolEnemy/PP_TF_OutBack.uasset
deleted file mode 100644
index 4bd16431..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/OutsidePatrolEnemy/PP_TF_OutBack.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:406ab0ed0c686c21a00dda4b3d6e268eacf6bfc911cc5fbfc6615897e6e7f4ee
-size 2674
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/OutsidePatrolEnemy/PP_TF_Outside.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/OutsidePatrolEnemy/PP_TF_Outside.uasset
deleted file mode 100644
index 6cd3336f..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/OutsidePatrolEnemy/PP_TF_Outside.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:731235fa24a1937da6099c8925abd34bbf99d4a1a6334c993c89f7a4b3114f0f
-size 13791
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/RoamingEnemy/BE_TF_Roaming.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/RoamingEnemy/BE_TF_Roaming.uasset
deleted file mode 100644
index 8b8d13cd..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/RoamingEnemy/BE_TF_Roaming.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f0567198a616343a45aef20d4be70b57a7eefefb6c54668645ce397186e27bf6
-size 106932
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/RoamingEnemy/PP_TF_Roaming.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/RoamingEnemy/PP_TF_Roaming.uasset
deleted file mode 100644
index 67602f41..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/RoamingEnemy/PP_TF_Roaming.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:062d6ee93303344368b3401d4a0bd412fa1d1af6cc95a81607453054cc697d67
-size 13100
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/TargetEnemy/BE_TF_Target.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/TargetEnemy/BE_TF_Target.uasset
deleted file mode 100644
index 1b25edbb..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/TargetEnemy/BE_TF_Target.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8a3d210a0ff91d671754196ced646a4128ea967f531e2c1c27201fbf9eba9c7f
-size 107795
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/TargetEnemy/PP_TF_Target.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/TargetEnemy/PP_TF_Target.uasset
deleted file mode 100644
index b7adcb40..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/TargetEnemy/PP_TF_Target.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:496b55e0f80f2e6208269215944632df3161f025bc5888e294cf92b6deb13a2b
-size 12985
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/UpstairsPatrolEnemy/BE_TF_Upstairs.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/UpstairsPatrolEnemy/BE_TF_Upstairs.uasset
deleted file mode 100644
index 787e0913..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/UpstairsPatrolEnemy/BE_TF_Upstairs.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ae60e9cb9b9afd7fe56aae046399dfd98ea8db80ecacffc4d278e262452ddb45
-size 106997
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/UpstairsPatrolEnemy/PP_TF_Upstairs.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/UpstairsPatrolEnemy/PP_TF_Upstairs.uasset
deleted file mode 100644
index 9c71a224..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Enemies/UpstairsPatrolEnemy/PP_TF_Upstairs.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e2f2065e357769a2642143c21eae5fea45a3a60dfe59706f944d18ffe930b205
-size 13071
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF1.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF1.uasset
deleted file mode 100644
index ff594e93..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF1.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d3222e9e86643dc447022502f2d9dc090dc6a5ceba6cb22140e5defb450ca494
-size 520107
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF10.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF10.uasset
deleted file mode 100644
index faa470af..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF10.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0ee539ee295fde45825def6001d96e70a7355c910663339a71f9c8c07fcbd820
-size 190143
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF11.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF11.uasset
deleted file mode 100644
index a1b1fbdd..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF11.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a9f7052caaca78dbd170a68b849e9a498fb9d1c0167dfac5ec0d3d6e1a5f106a
-size 199883
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF12.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF12.uasset
deleted file mode 100644
index 1ba1c568..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF12.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:599a90873cb758c9263040510ae22bc8c88f19e2541f495c0f8f26f8fe7bd58f
-size 278003
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF13.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF13.uasset
deleted file mode 100644
index 8ccad9af..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF13.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:70a02c53ec549db94daae705eadfcadf479712eab787bc99be7b0072dbbf189e
-size 216041
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF14.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF14.uasset
deleted file mode 100644
index 9043d5d4..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF14.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ac65e38904a43f9572a5541d03d18fba8541cb04d0022c33d650a8e22e1c0e99
-size 207080
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF15.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF15.uasset
deleted file mode 100644
index 8f9e9b0e..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF15.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:66ced6f4829c1047301466482d34b1ab715a75f9786b4d67201c7e0dd1de2c27
-size 265249
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF16.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF16.uasset
deleted file mode 100644
index cbbab91d..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF16.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3e9c1b089ca16b48abbbe8f8e3707d58359c31b1714b1cc09d0a6cd8ff761408
-size 287298
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF17.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF17.uasset
deleted file mode 100644
index 1ae804b0..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF17.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:67b866902ab14c076b998c503565fe47b9a286b804ba15dbffa941f777e75523
-size 93869
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF18.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF18.uasset
deleted file mode 100644
index 942736aa..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF18.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:314f8e68e722882c47507880a3a01d31e2cc3ae7b38499fac5aff1970f4063dc
-size 222864
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF19.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF19.uasset
deleted file mode 100644
index 94cda5d1..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF19.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9443f0754a9150ccc2d576068d9477f8af0de722dd48c1674bb779c168cb3c52
-size 349128
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF2.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF2.uasset
deleted file mode 100644
index 1b733020..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF2.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:22920c78e8d4fce5e8201fd7f3677f71af46e9a2983a318ccd59b7953abe5041
-size 514322
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF20.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF20.uasset
deleted file mode 100644
index e08a1cea..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF20.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:df4909ec22cfb8bb33b96b9543d632d94f698aedad617b7155caccfa30f51620
-size 279708
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF21.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF21.uasset
deleted file mode 100644
index 1e98746a..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF21.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c6ae7b861db5537ec6da74a374df59ab9de83245d0f2edc89700e64192cbc0bb
-size 264982
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF22.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF22.uasset
deleted file mode 100644
index 37e99fbc..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF22.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:693e100e900d78d4f0b6b2b9e4aa94887f3f5ff61472e27d6637440ecd986906
-size 201408
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF23.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF23.uasset
deleted file mode 100644
index 47834a34..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF23.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:bc5d4c874b276896a5c7e312baf31dec449ecf8335fe16c0f840cacdf4e54455
-size 233871
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF24.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF24.uasset
deleted file mode 100644
index 62348f3f..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF24.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a405f2635dab582bc03bcd0d1755e748119069f1cd9bd1cf999368508b530091
-size 243459
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF3.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF3.uasset
deleted file mode 100644
index 007c07e5..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF3.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:839551287c132b8adf1f989383f7eeef22dc25d1ce0c3715a9aa8ac584d007b3
-size 223835
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF4.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF4.uasset
deleted file mode 100644
index c4d6f37f..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF4.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3af6b53040bbf9c6981c279d869765e118dc793358bc7b3e8cb3e85afadab01a
-size 154151
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF5.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF5.uasset
deleted file mode 100644
index 3a9ad85e..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF5.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:302ea1f05c0bb01b3857874440db2e9eebcae7bbe8f2900be6764d6b98080a6c
-size 196683
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF6.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF6.uasset
deleted file mode 100644
index ed717240..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF6.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:58142883f2158722839c0bb64738a269a1f960cdd82840857246e9738416f53b
-size 230592
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF7.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF7.uasset
deleted file mode 100644
index 871edbb6..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF7.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:2e56bd8e60a11b604e5b6037c7abf13a929bc8695e28afee55fe1afaeda2496e
-size 234019
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF8.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF8.uasset
deleted file mode 100644
index 57dc1edd..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF8.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:12f8fd87f96144c9f206f7faac11f2bc7b016fa9b2977d0b509802279cbe477f
-size 224994
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF9.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF9.uasset
deleted file mode 100644
index f5b1d62e..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/IntroF9.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:94cc5c50d6999063d3ae435b09ce77696c5d6aad8103ea084ec7e4d995e26b3c
-size 251621
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/PlayersHomeShipImage.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/PlayersHomeShipImage.uasset
deleted file mode 100644
index 068824b4..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/PlayersHomeShipImage.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b96eabdd3e093be39d5544ed2b3dfa40947e53a7f14ce0b9a20f381417e064be
-size 148252
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/WBP_IntroCutscene.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/WBP_IntroCutscene.uasset
deleted file mode 100644
index 9423ea04..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/IntroCutscene/WBP_IntroCutscene.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4d72553065b7759af8b25f2f70ded6db41e0f89f9d67aa11a19a9850ceca2562
-size 133720
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/MB_TutorialFacility.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/MB_TutorialFacility.uasset
deleted file mode 100644
index 24c72606..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/MB_TutorialFacility.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f832cb5ec5d4dfc2edd473b4cfd0ac80019547d5f2d1125b4a71942de584bb76
-size 16169
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/RespawnPoint.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/RespawnPoint.uasset
deleted file mode 100644
index cfefe2d6..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/RespawnPoint.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ddfaf161972d5ed7da321d0764e3887dd4b91ef6d6e294ed590f8645bd5c1e01
-size 22117
diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/TrainingFacilityBountyDirector.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/TrainingFacilityBountyDirector.uasset
deleted file mode 100644
index 35ada0bc..00000000
--- a/EndlessVendetta/Content/BountySystem/TutorialFacility/TrainingFacilityBountyDirector.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a1e75c64d6be90e7099664b99af6b8faab033decb1e269ab3e9f472e0e0fc2eb
-size 22314
diff --git a/EndlessVendetta/Content/BountySystem/Waypoint/MainBountyIcon.png b/EndlessVendetta/Content/BountySystem/Waypoint/MainBountyIcon.png
new file mode 100644
index 00000000..26e35bd5
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Waypoint/MainBountyIcon.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7ab3a1fdab300776fa77b01bcaa676620d8ae5eaf96b3e121179f419cd5c1e0f
+size 112854
diff --git a/EndlessVendetta/Content/BountySystem/Waypoint/MainBountyIcon.uasset b/EndlessVendetta/Content/BountySystem/Waypoint/MainBountyIcon.uasset
new file mode 100644
index 00000000..805b8a75
--- /dev/null
+++ b/EndlessVendetta/Content/BountySystem/Waypoint/MainBountyIcon.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:47deb8998ce928b6448dcbd1a22e3309e144cf43cc5440ac286024dd3aa83167
+size 84616
diff --git a/EndlessVendetta/Content/BountySystem/Waypoint/WaypointArrow.uasset b/EndlessVendetta/Content/BountySystem/Waypoint/WaypointArrow.uasset
deleted file mode 100644
index 77db169b..00000000
--- a/EndlessVendetta/Content/BountySystem/Waypoint/WaypointArrow.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:581ee1ef957a3b4e90433ecabc49b6afd731418013eb96e516f54876097f0ca4
-size 255
diff --git a/EndlessVendetta/Content/BountySystem/testintesting.uasset b/EndlessVendetta/Content/BountySystem/testintesting.uasset
deleted file mode 100644
index 0c667c09..00000000
--- a/EndlessVendetta/Content/BountySystem/testintesting.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a52448bedde7fdbdaa6dd78db571d463666715dcf04c67bb55dedb81fe8d8488
-size 9233
diff --git a/EndlessVendetta/Content/Dialogue/BP_ChoiceButton.uasset b/EndlessVendetta/Content/Dialogue/BP_ChoiceButton.uasset
new file mode 100644
index 00000000..99fe8f57
--- /dev/null
+++ b/EndlessVendetta/Content/Dialogue/BP_ChoiceButton.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:92491ea67e7c30c15a81fb5f3f5ea677337f308489c06b92509a99b0fc6ad5bb
+size 47654
diff --git a/EndlessVendetta/Content/Dialogue/BP_DialogueUI.uasset b/EndlessVendetta/Content/Dialogue/BP_DialogueUI.uasset
new file mode 100644
index 00000000..085864ef
--- /dev/null
+++ b/EndlessVendetta/Content/Dialogue/BP_DialogueUI.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:35908c5dcdb5143afd98a83341d8cb46d90ab1430b3d365f1b4707d85c793c70
+size 224018
diff --git a/EndlessVendetta/Content/Dialogue/D_Mayor_Tutorial.uasset b/EndlessVendetta/Content/Dialogue/D_Mayor_Tutorial.uasset
new file mode 100644
index 00000000..c8a1e2e7
--- /dev/null
+++ b/EndlessVendetta/Content/Dialogue/D_Mayor_Tutorial.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5b1e0389b55c1a3619cc6d04739ca92ebf332e67c2f9fce20a7d9a240d7fc654
+size 87783
diff --git a/EndlessVendetta/Content/Dialogue/Mayor_tutorial_dialogue_tree.uasset b/EndlessVendetta/Content/Dialogue/Mayor_tutorial_dialogue_tree.uasset
new file mode 100644
index 00000000..94d07770
--- /dev/null
+++ b/EndlessVendetta/Content/Dialogue/Mayor_tutorial_dialogue_tree.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2ff24a84d1c042c20b8f3ec95ad35354f71120cae523ef67a0e54a129fb4c738
+size 106796
diff --git a/EndlessVendetta/Content/Dialogue/TestDialogueCube.uasset b/EndlessVendetta/Content/Dialogue/TestDialogueCube.uasset
new file mode 100644
index 00000000..c527979a
--- /dev/null
+++ b/EndlessVendetta/Content/Dialogue/TestDialogueCube.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1f02a139ca0765bc88152d89b253c76f11837193aaaaf1822f950d38578cc5e1
+size 2455
diff --git a/EndlessVendetta/Content/Dialogue/Testing/BP_Mayor.uasset b/EndlessVendetta/Content/Dialogue/Testing/BP_Mayor.uasset
new file mode 100644
index 00000000..86869ecb
--- /dev/null
+++ b/EndlessVendetta/Content/Dialogue/Testing/BP_Mayor.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4280fd261e4b0d85f410669264906255cdcc74e55477faa4fe5e46c3d33aeee4
+size 30273
diff --git a/EndlessVendetta/Content/Dialogue/Testing/Catman_Idle.uasset b/EndlessVendetta/Content/Dialogue/Testing/Catman_Idle.uasset
new file mode 100644
index 00000000..5ad7be4d
--- /dev/null
+++ b/EndlessVendetta/Content/Dialogue/Testing/Catman_Idle.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8f6e6d75f641a2e7dd11f95db5bfc72cde7bb66e942831962061901cf79f21b3
+size 785162
diff --git a/EndlessVendetta/Content/Dialogue/Testing/Catman_Idle_PhysicsAsset.uasset b/EndlessVendetta/Content/Dialogue/Testing/Catman_Idle_PhysicsAsset.uasset
new file mode 100644
index 00000000..fb0f6134
--- /dev/null
+++ b/EndlessVendetta/Content/Dialogue/Testing/Catman_Idle_PhysicsAsset.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e7d59d593d60ea9144d8f0632eb29ee2d1ee92fcbe20e5fccb7a34505beb9a71
+size 16250
diff --git a/EndlessVendetta/Content/Dialogue/Testing/Catman_Idle_Skeleton.uasset b/EndlessVendetta/Content/Dialogue/Testing/Catman_Idle_Skeleton.uasset
new file mode 100644
index 00000000..5a52dca2
--- /dev/null
+++ b/EndlessVendetta/Content/Dialogue/Testing/Catman_Idle_Skeleton.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:97c387ee6c4607c9a841c13d5f309ce7e48158b7db0521f0f9c65549324c326e
+size 13447
diff --git a/EndlessVendetta/Content/Dialogue/Testing/Material.uasset b/EndlessVendetta/Content/Dialogue/Testing/Material.uasset
new file mode 100644
index 00000000..9eab430c
--- /dev/null
+++ b/EndlessVendetta/Content/Dialogue/Testing/Material.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f3d1f8b1ff90eb9ba3ff2dc40dc19d0deef6e69dc213255bee4f7748e4b04346
+size 7914
diff --git a/EndlessVendetta/Content/Dialogue/Testing/Material_001.uasset b/EndlessVendetta/Content/Dialogue/Testing/Material_001.uasset
new file mode 100644
index 00000000..bc52c384
--- /dev/null
+++ b/EndlessVendetta/Content/Dialogue/Testing/Material_001.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:656790daef70f5db329953fe750bd011cc50dd34ff9b0ba51bb2e26476d85972
+size 8143
diff --git a/EndlessVendetta/Content/Dialogue/Testing/Material_002.uasset b/EndlessVendetta/Content/Dialogue/Testing/Material_002.uasset
new file mode 100644
index 00000000..83dce43a
--- /dev/null
+++ b/EndlessVendetta/Content/Dialogue/Testing/Material_002.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b041ea1092257c487bab6aef0483e5e6c950a6f90474bdaf4dd9976c5fee72bb
+size 8143
diff --git a/EndlessVendetta/Content/Dialogue/Testing/TestDialogueCube.uasset b/EndlessVendetta/Content/Dialogue/Testing/TestDialogueCube.uasset
new file mode 100644
index 00000000..c12313ff
--- /dev/null
+++ b/EndlessVendetta/Content/Dialogue/Testing/TestDialogueCube.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e7323a610767b1f1cc758dd6fa1c9cb34407545561ad153e0ad0ac12cb78f894
+size 28384
diff --git a/EndlessVendetta/Content/Dialogue/Testing/TestDialogueTree.uasset b/EndlessVendetta/Content/Dialogue/Testing/TestDialogueTree.uasset
new file mode 100644
index 00000000..5f598325
--- /dev/null
+++ b/EndlessVendetta/Content/Dialogue/Testing/TestDialogueTree.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ec1e794ed8e8a4409f4bc77584623c727508513bf407e4059ce1e4a41b8d90c1
+size 24487
diff --git a/EndlessVendetta/Content/FPWeapon/Mesh/SK_FPGun.uasset b/EndlessVendetta/Content/FPWeapon/Mesh/SK_FPGun.uasset
index 0f1eb268..28e6c3fd 100644
--- a/EndlessVendetta/Content/FPWeapon/Mesh/SK_FPGun.uasset
+++ b/EndlessVendetta/Content/FPWeapon/Mesh/SK_FPGun.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:67c8259a243d5c66d35b91458da2dd7e9e860224052098ba554eba470cee4a2a
-size 2162660
+oid sha256:388390c8d51429942976c17d06b5e4084e652f9b2554782794c1dad2d766438c
+size 2113778
diff --git a/EndlessVendetta/Content/FPWeapon/Mesh/SK_FPGun_Skeleton.uasset b/EndlessVendetta/Content/FPWeapon/Mesh/SK_FPGun_Skeleton.uasset
index c6396a47..8a95da14 100644
--- a/EndlessVendetta/Content/FPWeapon/Mesh/SK_FPGun_Skeleton.uasset
+++ b/EndlessVendetta/Content/FPWeapon/Mesh/SK_FPGun_Skeleton.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:f9c7063e48c0b3c23194a6a2fc3625da96d20bbd92fece19210001cf0cac8964
-size 8568
+oid sha256:a791858557c1d4a2c87aefc7d0cff0cb191cb6d496ec518f602ce3db92323815
+size 9020
diff --git a/EndlessVendetta/Content/FirstPerson/Blueprints/BP_FirstPersonCharacter.uasset b/EndlessVendetta/Content/FirstPerson/Blueprints/BP_FirstPersonCharacter.uasset
index 9e824917..46367c77 100644
--- a/EndlessVendetta/Content/FirstPerson/Blueprints/BP_FirstPersonCharacter.uasset
+++ b/EndlessVendetta/Content/FirstPerson/Blueprints/BP_FirstPersonCharacter.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:c99ec2b828cf671d0d33afa160e745375f0b82d79a8b49f2e9e74c0b68aedd7f
-size 76231
+oid sha256:f8ca10fde945fbab4c1f76b326cd5808c53a338dedd01c73be8ae655552aa31c
+size 474080
diff --git a/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/AssaultRifles/BP_ARTEST1.uasset b/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/AssaultRifles/BP_ARTEST1.uasset
index 5cd48aa7..f2ca1773 100644
--- a/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/AssaultRifles/BP_ARTEST1.uasset
+++ b/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/AssaultRifles/BP_ARTEST1.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:55d9774b1be0067976e247efb9c0924028d8e6f104a2356fc3c244d0ca0bcbab
-size 40721
+oid sha256:da280a53ff9a19fc5698a2e4e87a2f0b6e4fd81c95fb5929a659cdb507b0d446
+size 41581
diff --git a/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/BP_BaseWeapon.uasset b/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/BP_BaseWeapon.uasset
index 2ef319e4..201ac1f9 100644
--- a/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/BP_BaseWeapon.uasset
+++ b/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/BP_BaseWeapon.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:c20c755e25ce7a0993636889cf8bf6196888a85f4428e15eb600c48cb357d5f4
-size 123751
+oid sha256:f4d4c8728c6346fed52e60b7b56fa54a6492180815d2cee29d8d8730ac624947
+size 125545
diff --git a/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/BP_GunCameraShake.uasset b/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/BP_GunCameraShake.uasset
index cc04228d..f570bf8e 100644
--- a/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/BP_GunCameraShake.uasset
+++ b/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/BP_GunCameraShake.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:4358c8520e164b973fae2ae1a18307f0eb691ecfd94b433cbda1052b8b2751fa
-size 7209
+oid sha256:c17011787947edd0492999385adc17e76b12aa4fe03ef946ae96b2ad435f4eda
+size 9114
diff --git a/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Pistols/BP_BasePistolWeapon.uasset b/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Pistols/BP_BasePistolWeapon.uasset
index 4b1c45a0..bcdca35f 100644
--- a/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Pistols/BP_BasePistolWeapon.uasset
+++ b/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Pistols/BP_BasePistolWeapon.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:6f31b971cc0237138a2bd8e0aa68d0ac68cac907b0a05aa9617c69883a711cd5
-size 125774
+oid sha256:27baa0566dff77e1a10c6ad16334355882c66dc68bddb90cd8790af23918a24c
+size 126225
diff --git a/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Pistols/Pistol_Assets/SM_HandGun.uasset b/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Pistols/Pistol_Assets/SM_HandGun.uasset
new file mode 100644
index 00000000..b98fc270
--- /dev/null
+++ b/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Pistols/Pistol_Assets/SM_HandGun.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7c875b5a56660d1175d197651084a60f82e244678cb44b7ed2354937caced1c0
+size 964880
diff --git a/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Pistols/Pistol_Assets/SM_HandGun_PhysicsAsset.uasset b/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Pistols/Pistol_Assets/SM_HandGun_PhysicsAsset.uasset
new file mode 100644
index 00000000..f38a4924
--- /dev/null
+++ b/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Pistols/Pistol_Assets/SM_HandGun_PhysicsAsset.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3d65a0223ea0c6fdc4c9be73cf9f1b4b9be6a0a74e416e198ea002a014a79313
+size 7534
diff --git a/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Pistols/Pistol_Assets/SM_HandGun_Skeleton.uasset b/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Pistols/Pistol_Assets/SM_HandGun_Skeleton.uasset
new file mode 100644
index 00000000..33067b99
--- /dev/null
+++ b/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Pistols/Pistol_Assets/SM_HandGun_Skeleton.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:224fd066e908fdcb82c95df41d433787f45507d56387cb8978feaf6f2d759125
+size 7075
diff --git a/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Pistols/Pistol_Assets/SM_gun_A.uasset b/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Pistols/Pistol_Assets/SM_gun_A.uasset
new file mode 100644
index 00000000..95ca8f4f
--- /dev/null
+++ b/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Pistols/Pistol_Assets/SM_gun_A.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f31ef8fe90ab7b57893b0b8167d8a1bc5b6df8aa9d73832fe1cbf7c0effc9314
+size 1004195
diff --git a/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Pistols/Pistol_Assets/SM_gun_N.uasset b/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Pistols/Pistol_Assets/SM_gun_N.uasset
new file mode 100644
index 00000000..86aec470
--- /dev/null
+++ b/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Pistols/Pistol_Assets/SM_gun_N.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:72bc48c594152df6409f6eed91ca4ee8518d641f8528171a54a3d925d1041a41
+size 6552237
diff --git a/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Pistols/Pistol_Assets/SM_gun_ORM.uasset b/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Pistols/Pistol_Assets/SM_gun_ORM.uasset
new file mode 100644
index 00000000..cd6200ad
--- /dev/null
+++ b/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Pistols/Pistol_Assets/SM_gun_ORM.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7d2d3d737a5f330587a3c60a2c3f904e6c0c33ef540e39e7eda196bf995a1ee2
+size 2765283
diff --git a/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Shotguns/BP_BaseShotgun.uasset b/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Shotguns/BP_BaseShotgun.uasset
index 8e445757..2a158809 100644
--- a/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Shotguns/BP_BaseShotgun.uasset
+++ b/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Shotguns/BP_BaseShotgun.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d4bcd23aa245c0819235be1d2d992930fed4440aabdafba514d6a1f99a418fcb
-size 124531
+oid sha256:362a64d67da0cb91a66300f81b87b5482e4cd9a1058aafb5b012ed79a835ba07
+size 125596
diff --git a/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Snipers/BaseSniper.uasset b/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Snipers/BaseSniper.uasset
index 881c555d..658f6c74 100644
--- a/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Snipers/BaseSniper.uasset
+++ b/EndlessVendetta/Content/FirstPerson/Blueprints/BaseWeapons/Snipers/BaseSniper.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d3335a1091802c5f484bcc99a573e0cbd388e3cbb586147614ede78c274a14fc
-size 124510
+oid sha256:cf3cb3f1c18d9cef57e27220662bc04a7cfb0de1aff48d810eaefeed37c29d20
+size 127332
diff --git a/EndlessVendetta/Content/FirstPerson/Blueprints/DoorBP/BP_Door.uasset b/EndlessVendetta/Content/FirstPerson/Blueprints/DoorBP/BP_Door.uasset
new file mode 100644
index 00000000..6c55793e
--- /dev/null
+++ b/EndlessVendetta/Content/FirstPerson/Blueprints/DoorBP/BP_Door.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d577d68165ea935df55d93682617ee4cde6015fd49125424514f6d7f4724246a
+size 69897
diff --git a/EndlessVendetta/Content/FirstPerson/Blueprints/DoorBP/WBP_DoorPrompt.uasset b/EndlessVendetta/Content/FirstPerson/Blueprints/DoorBP/WBP_DoorPrompt.uasset
new file mode 100644
index 00000000..b55b152d
--- /dev/null
+++ b/EndlessVendetta/Content/FirstPerson/Blueprints/DoorBP/WBP_DoorPrompt.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b7cff7bcd8f753a0c636853df512555687c1450a25dd908391b55b7589c220ec
+size 79813
diff --git a/EndlessVendetta/Content/FirstPerson/Blueprints/DoorPrompt/BP_Door.uasset b/EndlessVendetta/Content/FirstPerson/Blueprints/DoorPrompt/BP_Door.uasset
deleted file mode 100644
index 2e39669d..00000000
--- a/EndlessVendetta/Content/FirstPerson/Blueprints/DoorPrompt/BP_Door.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:03cc628cc4a9ab85f3fb7754903bb0b4f5cbf3db50b0cb2044f6812aec991c82
-size 71627
diff --git a/EndlessVendetta/Content/FirstPerson/Blueprints/DoorPrompt/WBP_DoorPrompt.uasset b/EndlessVendetta/Content/FirstPerson/Blueprints/DoorPrompt/WBP_DoorPrompt.uasset
deleted file mode 100644
index 5608096e..00000000
--- a/EndlessVendetta/Content/FirstPerson/Blueprints/DoorPrompt/WBP_DoorPrompt.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:dd2cc6201da826cdd7357a5f683f0c9d0638cd2c44ebaab60b6585f1c2659159
-size 81251
diff --git a/EndlessVendetta/Content/FirstPerson/Blueprints/HeadBobbingEffect/CameraShake_Idle.uasset b/EndlessVendetta/Content/FirstPerson/Blueprints/HeadBobbingEffect/CameraShake_Idle.uasset
new file mode 100644
index 00000000..451728d5
--- /dev/null
+++ b/EndlessVendetta/Content/FirstPerson/Blueprints/HeadBobbingEffect/CameraShake_Idle.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a4edc2f6d9b0bde40c02ba5fec57f3f08573add14e1d62bbed4e4cb33a74f73a
+size 7217
diff --git a/EndlessVendetta/Content/FirstPerson/Blueprints/HeadBobbingEffect/CameraShake_OutOfStam.uasset b/EndlessVendetta/Content/FirstPerson/Blueprints/HeadBobbingEffect/CameraShake_OutOfStam.uasset
new file mode 100644
index 00000000..c8468545
--- /dev/null
+++ b/EndlessVendetta/Content/FirstPerson/Blueprints/HeadBobbingEffect/CameraShake_OutOfStam.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2e7640dc1229f02365ed721ad413a620bf85e1a1280a08cec8b56e499f7820af
+size 6830
diff --git a/EndlessVendetta/Content/FirstPerson/Blueprints/HeadBobbingEffect/CameraShake_Sprint.uasset b/EndlessVendetta/Content/FirstPerson/Blueprints/HeadBobbingEffect/CameraShake_Sprint.uasset
new file mode 100644
index 00000000..929d8476
--- /dev/null
+++ b/EndlessVendetta/Content/FirstPerson/Blueprints/HeadBobbingEffect/CameraShake_Sprint.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6a9231f702f7fffdfe9f4bd9024bcb549a148dd6d9a4410f55475f6445d0a432
+size 6791
diff --git a/EndlessVendetta/Content/FirstPerson/Blueprints/HeadBobbingEffect/CameraShake_Walk.uasset b/EndlessVendetta/Content/FirstPerson/Blueprints/HeadBobbingEffect/CameraShake_Walk.uasset
new file mode 100644
index 00000000..7b388294
--- /dev/null
+++ b/EndlessVendetta/Content/FirstPerson/Blueprints/HeadBobbingEffect/CameraShake_Walk.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0465ca03bf373461df13d58cf2ad596af380542610db4f3a151a91128482be61
+size 6765
diff --git a/EndlessVendetta/Content/FirstPerson/Blueprints/Workbench_WeaponAttachments/BP_WeaponWorkbench.uasset b/EndlessVendetta/Content/FirstPerson/Blueprints/Workbench_WeaponAttachments/BP_WeaponWorkbench.uasset
new file mode 100644
index 00000000..065961de
--- /dev/null
+++ b/EndlessVendetta/Content/FirstPerson/Blueprints/Workbench_WeaponAttachments/BP_WeaponWorkbench.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d75e36753040dd1b42758b69e6c786086cdef6c0bb189130b8d0e611ba119da9
+size 139146
diff --git a/EndlessVendetta/Content/FirstPerson/Blueprints/Workbench_WeaponAttachments/Workbench_UI/WBP_SilencerImage.uasset b/EndlessVendetta/Content/FirstPerson/Blueprints/Workbench_WeaponAttachments/Workbench_UI/WBP_SilencerImage.uasset
new file mode 100644
index 00000000..e4bcc0c7
--- /dev/null
+++ b/EndlessVendetta/Content/FirstPerson/Blueprints/Workbench_WeaponAttachments/Workbench_UI/WBP_SilencerImage.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6541b0e884663dee959f9484786850d0a8dc7727b41a2fc8a063ac28381ee851
+size 22763
diff --git a/EndlessVendetta/Content/FirstPerson/Blueprints/Workbench_WeaponAttachments/Workbench_UI/WBP_Workbench.uasset b/EndlessVendetta/Content/FirstPerson/Blueprints/Workbench_WeaponAttachments/Workbench_UI/WBP_Workbench.uasset
new file mode 100644
index 00000000..ec08dd4c
--- /dev/null
+++ b/EndlessVendetta/Content/FirstPerson/Blueprints/Workbench_WeaponAttachments/Workbench_UI/WBP_Workbench.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:26e12a1e4c8c9e552111d447a43b2e8518c1f916d96239e30a9699079dd04d3f
+size 228620
diff --git a/EndlessVendetta/Content/FirstPersonArms/Character/Mesh/SK_Mannequin_Arms_Skeleton.uasset b/EndlessVendetta/Content/FirstPersonArms/Character/Mesh/SK_Mannequin_Arms_Skeleton.uasset
index 91e47258..a1590c6f 100644
--- a/EndlessVendetta/Content/FirstPersonArms/Character/Mesh/SK_Mannequin_Arms_Skeleton.uasset
+++ b/EndlessVendetta/Content/FirstPersonArms/Character/Mesh/SK_Mannequin_Arms_Skeleton.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:f4e7da19e1c7c367caadb1bf513b3f7353b8ae90bf24428e0418487ec339670b
-size 22171
+oid sha256:3e87ba3269dc65b8d3dd5024eaeb7bd23f9645fdb6626293ecdc212a0d0778b6
+size 22438
diff --git a/EndlessVendetta/Content/Fonts/Conthrax/conthrax-sb.uasset b/EndlessVendetta/Content/Fonts/Conthrax/conthrax-sb.uasset
new file mode 100644
index 00000000..61def072
--- /dev/null
+++ b/EndlessVendetta/Content/Fonts/Conthrax/conthrax-sb.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6d48b68f103c839f484864e16b1c70825eca0272b7658887945efe190eb61a9a
+size 154427
diff --git a/EndlessVendetta/Content/Fonts/Conthrax/conthrax-sb_Font.uasset b/EndlessVendetta/Content/Fonts/Conthrax/conthrax-sb_Font.uasset
new file mode 100644
index 00000000..0df62046
--- /dev/null
+++ b/EndlessVendetta/Content/Fonts/Conthrax/conthrax-sb_Font.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8c83f32cb77196ba00771af4c65bafda85ec8cefcc88b79f278623c7ba3c824a
+size 6544
diff --git a/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-Bold.uasset b/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-Bold.uasset
new file mode 100644
index 00000000..6ccdae65
--- /dev/null
+++ b/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-Bold.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b653e74a78e127d4fc9dd2b86bc02a6f3db120d8ceb5a19164e13dea5ae93b57
+size 57094
diff --git a/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-Bold_Font.uasset b/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-Bold_Font.uasset
new file mode 100644
index 00000000..592af238
--- /dev/null
+++ b/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-Bold_Font.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d29c99ed7afe6a7a4ab39261a8a5d47962c510846c56d76499fa820fc4e2ee60
+size 6405
diff --git a/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-ExtraBold.uasset b/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-ExtraBold.uasset
new file mode 100644
index 00000000..161fff54
--- /dev/null
+++ b/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-ExtraBold.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:dfc9c97c08173fe375d30d4f16ec209499c14a077136050883a4ae27985891b7
+size 57221
diff --git a/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-ExtraBold_Font.uasset b/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-ExtraBold_Font.uasset
new file mode 100644
index 00000000..4f762266
--- /dev/null
+++ b/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-ExtraBold_Font.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2c4ed01d92f0b771b7bb4d906b094a4be893e4ed48a4a0c36f1a232fa4078a13
+size 6511
diff --git a/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-ExtraLight.uasset b/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-ExtraLight.uasset
new file mode 100644
index 00000000..57f022dc
--- /dev/null
+++ b/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-ExtraLight.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a2a0d57985ba024b3f880f2767ff8b875d70ad3419a6fc163db97435e271b265
+size 57352
diff --git a/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-ExtraLight_Font.uasset b/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-ExtraLight_Font.uasset
new file mode 100644
index 00000000..8343f26b
--- /dev/null
+++ b/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-ExtraLight_Font.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:32ead0bdec890960b8379909515ab973d1a72e8dcfddc1fb83951b0d978c07ac
+size 6397
diff --git a/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-Light.uasset b/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-Light.uasset
new file mode 100644
index 00000000..c8e8d3c3
--- /dev/null
+++ b/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-Light.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:523ae9c30e94afaec9568627e44082b9ceacecd2a88c3589a520e638b02a73f6
+size 57233
diff --git a/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-Light_Font.uasset b/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-Light_Font.uasset
new file mode 100644
index 00000000..f96aabbd
--- /dev/null
+++ b/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-Light_Font.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6361409472cd93b6bc9b06a061e275e3bb43e8fb90ac974a0ed279ba1a3c80b7
+size 6320
diff --git a/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-Medium.uasset b/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-Medium.uasset
new file mode 100644
index 00000000..13ce41e9
--- /dev/null
+++ b/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-Medium.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5b9fb607be1b5aeb2161da1ab2f77d237307e3e2cc2eb9a6bce2ca55a27c8b18
+size 57216
diff --git a/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-Medium_Font.uasset b/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-Medium_Font.uasset
new file mode 100644
index 00000000..0d52c0ba
--- /dev/null
+++ b/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-Medium_Font.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9c764f1fa07a8736117f6c1a6c748cc7604f04b4980f7204b2e4915975e85e43
+size 6485
diff --git a/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-Regular.uasset b/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-Regular.uasset
new file mode 100644
index 00000000..83319abe
--- /dev/null
+++ b/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-Regular.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:83bdf29373fca452a260331538560971cfc7770ca021cf312955b899f358cf13
+size 57155
diff --git a/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-Regular_Font.uasset b/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-Regular_Font.uasset
new file mode 100644
index 00000000..6bef215d
--- /dev/null
+++ b/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-Regular_Font.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0981619a0267c6a381b1c9c18e4335ffdb52df11e0e77293771512ab33263aed
+size 6479
diff --git a/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-SemiBold.uasset b/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-SemiBold.uasset
new file mode 100644
index 00000000..5db5b16c
--- /dev/null
+++ b/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-SemiBold.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e3fe22e46ed7b55f8eddab603d0619c96ef21afac64fff1f736c237ee1b37421
+size 57234
diff --git a/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-SemiBold_Font.uasset b/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-SemiBold_Font.uasset
new file mode 100644
index 00000000..ae0d41cc
--- /dev/null
+++ b/EndlessVendetta/Content/Fonts/Oxanium/Oxanium-SemiBold_Font.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:216d140f81e1f045143e623730dcf07185008cd2e3e800fd81d9149f5a8606e9
+size 6522
diff --git a/EndlessVendetta/Content/Gadgets/CombatGadgets/OverloadModule/CG_OverloadModule.uasset b/EndlessVendetta/Content/Gadgets/CombatGadgets/OverloadModule/CG_OverloadModule.uasset
index ac45c725..37d99b25 100644
--- a/EndlessVendetta/Content/Gadgets/CombatGadgets/OverloadModule/CG_OverloadModule.uasset
+++ b/EndlessVendetta/Content/Gadgets/CombatGadgets/OverloadModule/CG_OverloadModule.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:2a0ac6bb1c776390adbc9e10c1a9e9c6629c4f69eea6d3720d502a3b7807abf0
-size 110595
+oid sha256:fb1496b56a8e87f9025f0c245ee55e585e0b81277a74162d0531f777414f8443
+size 111687
diff --git a/EndlessVendetta/Content/Gadgets/ReconGadgets/RingModule/RG_RingModule.uasset b/EndlessVendetta/Content/Gadgets/ReconGadgets/RingModule/RG_RingModule.uasset
index e5b9faad..c9f59c0f 100644
--- a/EndlessVendetta/Content/Gadgets/ReconGadgets/RingModule/RG_RingModule.uasset
+++ b/EndlessVendetta/Content/Gadgets/ReconGadgets/RingModule/RG_RingModule.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:163e6c220966ca84c1c7e3f9ae176fe99bb0f7b8b364403ad5cf42f0272a87f0
-size 108688
+oid sha256:d3ae912ab5c02aa352d2e9d4f1885e7217791a701f23b241535cd24def3e1a20
+size 109272
diff --git a/EndlessVendetta/Content/Gadgets/ReconGadgets/RingModule/Ringtones/TempRingTone_Cue_1.uasset b/EndlessVendetta/Content/Gadgets/ReconGadgets/RingModule/Ringtones/TempRingTone_Cue_1.uasset
index d69e0e6a..47972023 100644
--- a/EndlessVendetta/Content/Gadgets/ReconGadgets/RingModule/Ringtones/TempRingTone_Cue_1.uasset
+++ b/EndlessVendetta/Content/Gadgets/ReconGadgets/RingModule/Ringtones/TempRingTone_Cue_1.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:00265bc01e803ae78c9486a50cdb2fe60b93de0d265a599dec052b079cc724c8
-size 4272
+oid sha256:a59d5848a9889747f69cfc80ff33d051308070c9764d0836994374b37c6038c5
+size 5353
diff --git a/EndlessVendetta/Content/Gadgets/ReconGadgets/VisionLink/RG_VisionLink.uasset b/EndlessVendetta/Content/Gadgets/ReconGadgets/VisionLink/RG_VisionLink.uasset
index aea6e927..74f5f55e 100644
--- a/EndlessVendetta/Content/Gadgets/ReconGadgets/VisionLink/RG_VisionLink.uasset
+++ b/EndlessVendetta/Content/Gadgets/ReconGadgets/VisionLink/RG_VisionLink.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:576cf6674035552a043dab60a2173beec40cf65683d138ad0df40f66fd48370b
-size 108618
+oid sha256:d6c1b0360db438f17c7cbb7a907c95ae67d455c711d94866ee07bbeb932f0acd
+size 109202
diff --git a/EndlessVendetta/Content/Levels/Apartment_hit.umap b/EndlessVendetta/Content/Levels/Apartment_hit.umap
index 3699de65..e11bff2b 100644
--- a/EndlessVendetta/Content/Levels/Apartment_hit.umap
+++ b/EndlessVendetta/Content/Levels/Apartment_hit.umap
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:fa51241ae1af23456e7f888143053bb9725a7b23a368ba22605845f0c9990797
-size 234051
+oid sha256:c0323083b144e4004c8d4923094ebbc18d011c193b614beef9a0cef1af5728bb
+size 372293
diff --git a/EndlessVendetta/Content/Levels/BP_EVGameMode.uasset b/EndlessVendetta/Content/Levels/BP_EVGameMode.uasset
new file mode 100644
index 00000000..5071a49d
--- /dev/null
+++ b/EndlessVendetta/Content/Levels/BP_EVGameMode.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:15c54b4347648ffc36e88cb70a4ab7496f81c85300b8856d30b24dbbb57abc8b
+size 19500
diff --git a/EndlessVendetta/Content/Levels/ControlTutorialLevel.umap b/EndlessVendetta/Content/Levels/ControlTutorialLevel.umap
index 9748e914..acf3a596 100644
--- a/EndlessVendetta/Content/Levels/ControlTutorialLevel.umap
+++ b/EndlessVendetta/Content/Levels/ControlTutorialLevel.umap
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:a86a917f878f965f58aa3bf308f3fdb2c29dd30ddc5d7f261b2dd0447ee3c44c
-size 17258822
+oid sha256:c78dde892caa4b4cb292592b66f9ee2fd986382798310e40212c1f80ee418cee
+size 3452507
diff --git a/EndlessVendetta/Content/Levels/MainMenuLevel.umap b/EndlessVendetta/Content/Levels/MainMenuLevel.umap
new file mode 100644
index 00000000..d2321b53
--- /dev/null
+++ b/EndlessVendetta/Content/Levels/MainMenuLevel.umap
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1c86b9618ce0418f07d9a359900fa7815818fc8e5f0a1956b2bfb87a4452fe01
+size 306418
diff --git a/EndlessVendetta/Content/Levels/TempOpenWorld.umap b/EndlessVendetta/Content/Levels/TempOpenWorld.umap
new file mode 100644
index 00000000..331dc700
--- /dev/null
+++ b/EndlessVendetta/Content/Levels/TempOpenWorld.umap
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3977a136e9c4c43dad14b8288902b6cf0cf3c7b46eac4dfdcb8cc25e225edc02
+size 13864728
diff --git a/EndlessVendetta/Content/MainMenu/BP_MainSaveGame.uasset b/EndlessVendetta/Content/MainMenu/BP_MainSaveGame.uasset
new file mode 100644
index 00000000..c0d71a60
--- /dev/null
+++ b/EndlessVendetta/Content/MainMenu/BP_MainSaveGame.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c9d27472d220a66dded1121bfbd0e985360e88d0a86dc6f88894db11aa2e117a
+size 9426
diff --git a/EndlessVendetta/Content/MainMenu/Gameplay/MainMenuCharacter.uasset b/EndlessVendetta/Content/MainMenu/Gameplay/MainMenuCharacter.uasset
new file mode 100644
index 00000000..51e22328
--- /dev/null
+++ b/EndlessVendetta/Content/MainMenu/Gameplay/MainMenuCharacter.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:402426e80078bade413ec8c155d3b75b527978e2364d7e38c6b7dfb7edc104e2
+size 23103
diff --git a/EndlessVendetta/Content/MainMenu/Gameplay/MainMenuGameMode.uasset b/EndlessVendetta/Content/MainMenu/Gameplay/MainMenuGameMode.uasset
new file mode 100644
index 00000000..2aa1f19e
--- /dev/null
+++ b/EndlessVendetta/Content/MainMenu/Gameplay/MainMenuGameMode.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:77f694765327ae7ced9a163d61f69472fcd8b629eda7649b0cab4936ab36c07d
+size 19647
diff --git a/EndlessVendetta/Content/MainMenu/Gameplay/MainMenuPlayerController.uasset b/EndlessVendetta/Content/MainMenu/Gameplay/MainMenuPlayerController.uasset
new file mode 100644
index 00000000..6891d70e
--- /dev/null
+++ b/EndlessVendetta/Content/MainMenu/Gameplay/MainMenuPlayerController.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ad835c5a96e5af4cdf7871ccb3a74e336cf83ef1f3eb8b0171ffdb88dcab7d50
+size 128279
diff --git a/EndlessVendetta/Content/MainMenu/MainMenuGameMode.uasset b/EndlessVendetta/Content/MainMenu/MainMenuGameMode.uasset
new file mode 100644
index 00000000..120877b5
--- /dev/null
+++ b/EndlessVendetta/Content/MainMenu/MainMenuGameMode.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:02c10b675c4a29abf6f9b7a4da2be54839783e3b31fa9ccefbd8b98784480c23
+size 2460
diff --git a/EndlessVendetta/Content/MainMenu/MainMenuLevelSequence.uasset b/EndlessVendetta/Content/MainMenu/MainMenuLevelSequence.uasset
new file mode 100644
index 00000000..7cb23377
--- /dev/null
+++ b/EndlessVendetta/Content/MainMenu/MainMenuLevelSequence.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:40b6fe4997aac2fb85d7adae23cdece606540e7e0c4f2922de025d98e20a1f7f
+size 102280
diff --git a/EndlessVendetta/Content/MainMenu/Music/Menu_maybe_1.uasset b/EndlessVendetta/Content/MainMenu/Music/Menu_maybe_1.uasset
new file mode 100644
index 00000000..94c0b816
--- /dev/null
+++ b/EndlessVendetta/Content/MainMenu/Music/Menu_maybe_1.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c45189d39477bb218b76eb906ade0e079d528c9b0bd97dcd91595d3d84c5498b
+size 10175168
diff --git a/EndlessVendetta/Content/MainMenu/Music/Menu_maybe_1.wav b/EndlessVendetta/Content/MainMenu/Music/Menu_maybe_1.wav
new file mode 100644
index 00000000..54d8d35a
--- /dev/null
+++ b/EndlessVendetta/Content/MainMenu/Music/Menu_maybe_1.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:660d9a04574795e7b164f04772283cb6e4cd61d45f585333f92542e4add86387
+size 12501608
diff --git a/EndlessVendetta/Content/MainMenu/Music/Menu_maybe_1_Cue.uasset b/EndlessVendetta/Content/MainMenu/Music/Menu_maybe_1_Cue.uasset
new file mode 100644
index 00000000..68511f67
--- /dev/null
+++ b/EndlessVendetta/Content/MainMenu/Music/Menu_maybe_1_Cue.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8f029c7540d6196fc8aefada0553299b6173827df03d6448a4489d3261a1ad2d
+size 5262
diff --git a/EndlessVendetta/Content/MainMenu/Music/Menu_maybe_2.uasset b/EndlessVendetta/Content/MainMenu/Music/Menu_maybe_2.uasset
new file mode 100644
index 00000000..02149b54
--- /dev/null
+++ b/EndlessVendetta/Content/MainMenu/Music/Menu_maybe_2.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4ab7d47d6559b81d51e0575f55eb4a10aa96504500b0ab5ddce0fb4b9c40cc2e
+size 4793489
diff --git a/EndlessVendetta/Content/MainMenu/Music/Menu_maybe_2.wav b/EndlessVendetta/Content/MainMenu/Music/Menu_maybe_2.wav
new file mode 100644
index 00000000..565e456c
--- /dev/null
+++ b/EndlessVendetta/Content/MainMenu/Music/Menu_maybe_2.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d93748a6a06c7eb63398e7a38ee260ef84644b372303827c50b36a155266cba2
+size 6124136
diff --git a/EndlessVendetta/Content/MainMenu/Music/Menu_maybe_2_Cue.uasset b/EndlessVendetta/Content/MainMenu/Music/Menu_maybe_2_Cue.uasset
new file mode 100644
index 00000000..63544fa2
--- /dev/null
+++ b/EndlessVendetta/Content/MainMenu/Music/Menu_maybe_2_Cue.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a7cb8bb57a58a09b99e491c541603316db857a4e9f40c01c029ccd2a4020dcf7
+size 5262
diff --git a/EndlessVendetta/Content/MainMenu/Widgets/WBP_MainMenu.uasset b/EndlessVendetta/Content/MainMenu/Widgets/WBP_MainMenu.uasset
new file mode 100644
index 00000000..289edced
--- /dev/null
+++ b/EndlessVendetta/Content/MainMenu/Widgets/WBP_MainMenu.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bb7364e8bc0576814cbb1332a7dc1c0468f3a04d683b98e4b117b2cab0033bf1
+size 114749
diff --git a/EndlessVendetta/Content/MainMenu/Widgets/WBP_MainMenuSequenceFade.uasset b/EndlessVendetta/Content/MainMenu/Widgets/WBP_MainMenuSequenceFade.uasset
new file mode 100644
index 00000000..31ab59b2
--- /dev/null
+++ b/EndlessVendetta/Content/MainMenu/Widgets/WBP_MainMenuSequenceFade.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3db0e8cde21f61ee69a8556a7e4091ef9dfadc39679eaace9185918351dd2bcf
+size 57284
diff --git a/EndlessVendetta/Content/MainMenu/Widgets/WBP_StudioIntro.uasset b/EndlessVendetta/Content/MainMenu/Widgets/WBP_StudioIntro.uasset
new file mode 100644
index 00000000..802b2be3
--- /dev/null
+++ b/EndlessVendetta/Content/MainMenu/Widgets/WBP_StudioIntro.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2fc9e802496b96fce577dd02600d98755c0eb2499d038b7a7b1f14cbc7226999
+size 68533
diff --git a/EndlessVendetta/Content/Ships/BP_HomeShip.uasset b/EndlessVendetta/Content/Ships/BP_HomeShip.uasset
index 2fcb8256..f47c8e96 100644
--- a/EndlessVendetta/Content/Ships/BP_HomeShip.uasset
+++ b/EndlessVendetta/Content/Ships/BP_HomeShip.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5adf54f06d91186e171b05251396919a7994ee9c88964a4a49a4743058b2df8b
-size 38469
+oid sha256:9b365fc235303095ae9a94177656b3e5294012ada186a2f0d89de08cb38bf2d3
+size 38349
diff --git a/EndlessVendetta/Content/Ships/BP_SpaceShip.uasset b/EndlessVendetta/Content/Ships/BP_SpaceShip.uasset
index 414ee7d9..92ea4e0b 100644
--- a/EndlessVendetta/Content/Ships/BP_SpaceShip.uasset
+++ b/EndlessVendetta/Content/Ships/BP_SpaceShip.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:4c424148a2d3ebc876cb27453c51f1383792430536cde08915c4114a366e77bc
-size 37169
+oid sha256:b44f822f5c6482c3351c981ff00819af201f59f73a9f8a4a84e2eb6ba0bd9d72
+size 59373
diff --git a/EndlessVendetta/Content/Ships/LZ_HomeHubIcon.png b/EndlessVendetta/Content/Ships/LZ_HomeHubIcon.png
new file mode 100644
index 00000000..a5784314
--- /dev/null
+++ b/EndlessVendetta/Content/Ships/LZ_HomeHubIcon.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e160dc0e0259e441a356594e7fd64f791cafa8071872310ac32fa9f7dea6e73c
+size 366544
diff --git a/EndlessVendetta/Content/Ships/LZ_HomeHubIcon.uasset b/EndlessVendetta/Content/Ships/LZ_HomeHubIcon.uasset
new file mode 100644
index 00000000..f91d508f
--- /dev/null
+++ b/EndlessVendetta/Content/Ships/LZ_HomeHubIcon.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e492db2251e6e8a8ccd0fa57f4ecbb86d19662484b74a4a52ed1a84943fc3783
+size 318979
diff --git a/EndlessVendetta/Content/Ships/LandingZone.uasset b/EndlessVendetta/Content/Ships/LandingZone.uasset
index 32fb9317..d8d6f2ba 100644
--- a/EndlessVendetta/Content/Ships/LandingZone.uasset
+++ b/EndlessVendetta/Content/Ships/LandingZone.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:4ea90e487ea5bf751b7573ac6ef2be781c1efdf4e0bae7c8b95f9fbf0c4169dd
-size 113548
+oid sha256:dfde55ec08a338b74108a49afc1af5c2f689d323773b9cc4719adcacce033a03
+size 77058
diff --git a/EndlessVendetta/Content/Ships/LandingZoneIcon.png b/EndlessVendetta/Content/Ships/LandingZoneIcon.png
new file mode 100644
index 00000000..3fb9bcaa
--- /dev/null
+++ b/EndlessVendetta/Content/Ships/LandingZoneIcon.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8512b3a28465f4570eee63557f0dd56211e85ce32b87227c0de9789c4b7be559
+size 203875
diff --git a/EndlessVendetta/Content/Ships/LandingZoneIcon.uasset b/EndlessVendetta/Content/Ships/LandingZoneIcon.uasset
new file mode 100644
index 00000000..3de4997f
--- /dev/null
+++ b/EndlessVendetta/Content/Ships/LandingZoneIcon.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ea65d4aa723707110e27c6765eadd3cd8bbdf3902cfb12e67b76b3e01f5992e2
+size 162033
diff --git a/EndlessVendetta/Content/Ships/LandingZone_HomeHub.uasset b/EndlessVendetta/Content/Ships/LandingZone_HomeHub.uasset
new file mode 100644
index 00000000..1ed70fe2
--- /dev/null
+++ b/EndlessVendetta/Content/Ships/LandingZone_HomeHub.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:abbb67678dc0d1cac94a866d1604c7658d787b8c4e2f8d8f69b1dfd85ac763d1
+size 92831
diff --git a/EndlessVendetta/Content/Ships/WBP_LandingZone.uasset b/EndlessVendetta/Content/Ships/WBP_LandingZone.uasset
index 4e8bc23f..29ff3dda 100644
--- a/EndlessVendetta/Content/Ships/WBP_LandingZone.uasset
+++ b/EndlessVendetta/Content/Ships/WBP_LandingZone.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:3e302d2da63cfd690807b0dd6dacd7b4b4b1176e88945f007ffd2c12211cdf9c
-size 42570
+oid sha256:4fdbdd41b8678797719817f408afef87573bf6c01d7c87c79d12d2b4eeea5aee
+size 42518
diff --git a/EndlessVendetta/Content/StarterContent/HDRI/HDRI_Epic_Courtyard_Daylight.uasset b/EndlessVendetta/Content/StarterContent/HDRI/HDRI_Epic_Courtyard_Daylight.uasset
index 1c0675e1..8720c67f 100644
--- a/EndlessVendetta/Content/StarterContent/HDRI/HDRI_Epic_Courtyard_Daylight.uasset
+++ b/EndlessVendetta/Content/StarterContent/HDRI/HDRI_Epic_Courtyard_Daylight.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:2b1214c2656169689002a1b8976a3ae6c3287520fae9ca08f71889c57690c775
+oid sha256:2948a0f047ea3d4c550459ad2641ce7a098433ea2c165c572d9816ad798fd473
size 66790690
diff --git a/EndlessVendetta/Content/StarterContent/Shapes/TempSilencer.uasset b/EndlessVendetta/Content/StarterContent/Shapes/TempSilencer.uasset
new file mode 100644
index 00000000..05ac52df
--- /dev/null
+++ b/EndlessVendetta/Content/StarterContent/Shapes/TempSilencer.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:09bd5fb96ee510542e6f9c5439748cae1542863fd4909d649bf76be51e9d4468
+size 28225
diff --git a/EndlessVendetta/Content/__ExternalActors__/Levels/DoorTestLevel/0/24/JBARER4CBJ0QZT5CZY8ID6.uasset b/EndlessVendetta/Content/__ExternalActors__/Levels/DoorTestLevel/0/24/JBARER4CBJ0QZT5CZY8ID6.uasset
new file mode 100644
index 00000000..a5e2facf
--- /dev/null
+++ b/EndlessVendetta/Content/__ExternalActors__/Levels/DoorTestLevel/0/24/JBARER4CBJ0QZT5CZY8ID6.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:84b30818e9bae891d6c94279a7ca4f0fc7de1ef3432141d4a7adc9057459595e
+size 6503
diff --git a/EndlessVendetta/Content/__ExternalActors__/Levels/DoorTestLevel/0/GQ/QPISORMXEPSB0MNOUMBIZ4.uasset b/EndlessVendetta/Content/__ExternalActors__/Levels/DoorTestLevel/0/GQ/QPISORMXEPSB0MNOUMBIZ4.uasset
new file mode 100644
index 00000000..50f5595b
--- /dev/null
+++ b/EndlessVendetta/Content/__ExternalActors__/Levels/DoorTestLevel/0/GQ/QPISORMXEPSB0MNOUMBIZ4.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8c4ce0647a5c6be70b5b2078d285a9d14a8a6eb0264271d36931b66c7a7904b6
+size 6516
diff --git a/EndlessVendetta/Content/__ExternalActors__/Levels/DoorTestLevel/2/ZU/URNIY7YZNRDH4QY14A8BN4.uasset b/EndlessVendetta/Content/__ExternalActors__/Levels/DoorTestLevel/2/ZU/URNIY7YZNRDH4QY14A8BN4.uasset
new file mode 100644
index 00000000..667b9993
--- /dev/null
+++ b/EndlessVendetta/Content/__ExternalActors__/Levels/DoorTestLevel/2/ZU/URNIY7YZNRDH4QY14A8BN4.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a9b1da883f91278772e9215096e70c10d298b9416f1b392476303d0f8235dbe1
+size 6952
diff --git a/EndlessVendetta/Content/__ExternalActors__/Levels/DoorTestLevel/9/PG/AISD2CY0WTWKV1BJDYTYJ3.uasset b/EndlessVendetta/Content/__ExternalActors__/Levels/DoorTestLevel/9/PG/AISD2CY0WTWKV1BJDYTYJ3.uasset
new file mode 100644
index 00000000..11295e10
--- /dev/null
+++ b/EndlessVendetta/Content/__ExternalActors__/Levels/DoorTestLevel/9/PG/AISD2CY0WTWKV1BJDYTYJ3.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4d53dac7e3e749916ed5e5802c3c3495f2895827dcb66e9b2f49a8cac9a4ecb5
+size 6664
diff --git a/EndlessVendetta/Content/__ExternalActors__/Levels/DoorTestLevel/9/V5/00HOTT7GJB6N5M6TZHPJO5.uasset b/EndlessVendetta/Content/__ExternalActors__/Levels/DoorTestLevel/9/V5/00HOTT7GJB6N5M6TZHPJO5.uasset
new file mode 100644
index 00000000..0d782ca2
--- /dev/null
+++ b/EndlessVendetta/Content/__ExternalActors__/Levels/DoorTestLevel/9/V5/00HOTT7GJB6N5M6TZHPJO5.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f97293c8252b81250776e74e7637a467ec93628edeac54773472326b7bd45303
+size 6593
diff --git a/EndlessVendetta/Content/__ExternalActors__/Levels/DoorTestLevel/D/HT/HCK94DMZ442FV8M21GRO0Q.uasset b/EndlessVendetta/Content/__ExternalActors__/Levels/DoorTestLevel/D/HT/HCK94DMZ442FV8M21GRO0Q.uasset
new file mode 100644
index 00000000..86bd9ab5
--- /dev/null
+++ b/EndlessVendetta/Content/__ExternalActors__/Levels/DoorTestLevel/D/HT/HCK94DMZ442FV8M21GRO0Q.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1a02acdaa622152fe92278f5c6bcfa93a1f8831cee568902f7fde1b519ae6f6f
+size 6374
diff --git a/EndlessVendetta/Content/__ExternalActors__/Levels/DoorTestLevel/D/X5/OKD54JHXNGXNVF4JEBBMVP.uasset b/EndlessVendetta/Content/__ExternalActors__/Levels/DoorTestLevel/D/X5/OKD54JHXNGXNVF4JEBBMVP.uasset
deleted file mode 100644
index e0940ef3..00000000
--- a/EndlessVendetta/Content/__ExternalActors__/Levels/DoorTestLevel/D/X5/OKD54JHXNGXNVF4JEBBMVP.uasset
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4f37bd6fd21d44596891c4bd6763bd936b1ff98425033925bbed475ee4d2f5b9
-size 7302
diff --git a/EndlessVendetta/Content/__ExternalActors__/Levels/EnemyAITest/0/BH/KS02NXNXRR4I87WM39RJJN.uasset b/EndlessVendetta/Content/__ExternalActors__/Levels/EnemyAITest/0/BH/KS02NXNXRR4I87WM39RJJN.uasset
new file mode 100644
index 00000000..24c2fecd
--- /dev/null
+++ b/EndlessVendetta/Content/__ExternalActors__/Levels/EnemyAITest/0/BH/KS02NXNXRR4I87WM39RJJN.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2c62abbef4890ad85a6b0c5056e7cad9a1963f937c34630f3a5ba29d584bde1c
+size 6362
diff --git a/EndlessVendetta/Content/__ExternalActors__/Levels/EnemyAITest/4/EH/H0RJG09BGRG4TA8B6P9SKL.uasset b/EndlessVendetta/Content/__ExternalActors__/Levels/EnemyAITest/4/EH/H0RJG09BGRG4TA8B6P9SKL.uasset
index 76ff7bba..f99c95bc 100644
--- a/EndlessVendetta/Content/__ExternalActors__/Levels/EnemyAITest/4/EH/H0RJG09BGRG4TA8B6P9SKL.uasset
+++ b/EndlessVendetta/Content/__ExternalActors__/Levels/EnemyAITest/4/EH/H0RJG09BGRG4TA8B6P9SKL.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:3ded950368a5368f3187fcdae9b883ab92a7b57840a28a3613a0024df71d2098
-size 27121
+oid sha256:ca5b42f11542b515ca1b651d50754be68ce0bdc4fefe264a2993b01e6e7a9506
+size 16757
diff --git a/EndlessVendetta/Content/__ExternalActors__/Levels/EnemyAITest/5/LS/LPZ549UOJAZIWJNZLR0EH0.uasset b/EndlessVendetta/Content/__ExternalActors__/Levels/EnemyAITest/5/LS/LPZ549UOJAZIWJNZLR0EH0.uasset
new file mode 100644
index 00000000..75ca0ce6
--- /dev/null
+++ b/EndlessVendetta/Content/__ExternalActors__/Levels/EnemyAITest/5/LS/LPZ549UOJAZIWJNZLR0EH0.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0f1cdc2ca5697a5f4e97574930f1a81e9ea5203847aa2abc34fe682a322d150e
+size 4218
diff --git a/EndlessVendetta/Content/__ExternalActors__/Levels/EnemyAITest/E/WM/7S8OEF1ALOX6NKI759UPUB.uasset b/EndlessVendetta/Content/__ExternalActors__/Levels/EnemyAITest/E/WM/7S8OEF1ALOX6NKI759UPUB.uasset
new file mode 100644
index 00000000..16fa5da5
--- /dev/null
+++ b/EndlessVendetta/Content/__ExternalActors__/Levels/EnemyAITest/E/WM/7S8OEF1ALOX6NKI759UPUB.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b3b486e5f781568dfc3311e0a748054cd44c937f24cf97813ffdb41bc57ff9ab
+size 4797
diff --git a/EndlessVendetta/EndlessVendetta.sln.DotSettings.user b/EndlessVendetta/EndlessVendetta.sln.DotSettings.user
new file mode 100644
index 00000000..3e7d92d6
--- /dev/null
+++ b/EndlessVendetta/EndlessVendetta.sln.DotSettings.user
@@ -0,0 +1,5 @@
+
+ C:\Users\Rafal\AppData\Local\JetBrains\Rider2023.3\resharper-host\temp\Rider\vAny\CoverageData\_EndlessVendetta.-1253833435\Snapshot\snapshot.utdcvr
+ <SessionState ContinuousTestingMode="0" IsActive="True" Name="All tests from Solution" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session">
+ <Solution />
+</SessionState>
\ No newline at end of file
diff --git a/EndlessVendetta/EndlessVendetta.uproject b/EndlessVendetta/EndlessVendetta.uproject
index 7e992166..f9454b2c 100644
--- a/EndlessVendetta/EndlessVendetta.uproject
+++ b/EndlessVendetta/EndlessVendetta.uproject
@@ -14,6 +14,11 @@
"CoreUObject",
"UMG"
]
+ },
+ {
+ "Name": "DialogueSystemEditor",
+ "Type": "Editor",
+ "LoadingPhase": "PostEngineInit"
}
],
"Plugins": [
diff --git a/EndlessVendetta/Plugins/GenericGraph/.gitignore b/EndlessVendetta/Plugins/GenericGraph/.gitignore
new file mode 100644
index 00000000..7b887157
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/.gitignore
@@ -0,0 +1,14 @@
+Binaries
+DerivedDataCache
+Intermediate
+Saved
+Build
+*.sdf
+*.sln
+*.suo
+*.opensdf
+*.opendb
+*.db
+/docs/sphinx-build-result
+/.vs
+NoCommit
\ No newline at end of file
diff --git a/EndlessVendetta/Plugins/GenericGraph/GenericGraph.uplugin b/EndlessVendetta/Plugins/GenericGraph/GenericGraph.uplugin
new file mode 100644
index 00000000..68e4ef88
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/GenericGraph.uplugin
@@ -0,0 +1,30 @@
+{
+ "FileVersion" : 3,
+ "Version" : 1,
+ "VersionName" : "1.0",
+ "FriendlyName" : "Generic Graph Plugin",
+ "Description" : "",
+ "Category" : "GenericGraph",
+ "CreatedBy" : "jinyuliao",
+ "CreatedByURL" : "",
+ "DocsURL" : "",
+ "MarketplaceURL" : "",
+ "SupportURL" : "",
+ "EnabledByDefault" : true,
+ "CanContainContent" : true,
+ "IsBetaVersion" : false,
+ "Installed" : false,
+ "Modules" :
+ [
+ {
+ "Name" : "GenericGraphRuntime",
+ "Type" : "Runtime",
+ "LoadingPhase" : "PreDefault"
+ },
+ {
+ "Name" : "GenericGraphEditor",
+ "Type" : "Editor",
+ "LoadingPhase" : "Default"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/EndlessVendetta/Plugins/GenericGraph/LICENSE b/EndlessVendetta/Plugins/GenericGraph/LICENSE
new file mode 100644
index 00000000..9c189b15
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2016 jinyuliao
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/EndlessVendetta/Plugins/GenericGraph/Resources/AutoArrangeIcon.png b/EndlessVendetta/Plugins/GenericGraph/Resources/AutoArrangeIcon.png
new file mode 100644
index 00000000..b5e6c3b1
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Resources/AutoArrangeIcon.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:71dff338a731ee7bf2def0d378b0a866615d2ee72aa591ab4ed7ad1105049806
+size 5528
diff --git a/EndlessVendetta/Plugins/GenericGraph/Resources/Icon128.png b/EndlessVendetta/Plugins/GenericGraph/Resources/Icon128.png
new file mode 100644
index 00000000..57ee2a55
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Resources/Icon128.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9eb6f69963ee569b0a8a4446e21f69d0a93205caf07b30cc37b1fddb62599602
+size 15543
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/GenericGraphEditor.Build.cs b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/GenericGraphEditor.Build.cs
new file mode 100644
index 00000000..aa57f0ce
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/GenericGraphEditor.Build.cs
@@ -0,0 +1,62 @@
+using UnrealBuildTool;
+
+public class GenericGraphEditor : ModuleRules
+{
+ public GenericGraphEditor(ReadOnlyTargetRules Target) : base(Target)
+ {
+ PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
+ bLegacyPublicIncludePaths = false;
+ ShadowVariableWarningLevel = WarningLevel.Error;
+
+ PublicIncludePaths.AddRange(
+ new string[] {
+ // ... add public include paths required here ...
+ }
+ );
+
+ PrivateIncludePaths.AddRange(
+ new string[] {
+ // ... add other private include paths required here ...
+ "GenericGraphEditor/Private",
+ "GenericGraphEditor/Public",
+ }
+ );
+
+ PublicDependencyModuleNames.AddRange(
+ new string[]
+ {
+ "Core",
+ "CoreUObject",
+ "Engine",
+ "UnrealEd",
+ // ... add other public dependencies that you statically link with here ...
+ }
+ );
+
+ PrivateDependencyModuleNames.AddRange(
+ new string[]
+ {
+ "GenericGraphRuntime",
+ "AssetTools",
+ "Slate",
+ "InputCore",
+ "SlateCore",
+ "GraphEditor",
+ "PropertyEditor",
+ "EditorStyle",
+ "Kismet",
+ "KismetWidgets",
+ "ApplicationCore",
+ "ToolMenus",
+ // ... add private dependencies that you statically link with here ...
+ }
+ );
+
+ DynamicallyLoadedModuleNames.AddRange(
+ new string[]
+ {
+ // ... add any modules that your module loads dynamically here ...
+ }
+ );
+ }
+}
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/AssetTypeActions_GenericGraph.cpp b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/AssetTypeActions_GenericGraph.cpp
new file mode 100644
index 00000000..643911c7
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/AssetTypeActions_GenericGraph.cpp
@@ -0,0 +1,48 @@
+#include "AssetTypeActions_GenericGraph.h"
+#include "GenericGraphEditorPCH.h"
+#include "GenericGraphAssetEditor/AssetEditor_GenericGraph.h"
+
+#define LOCTEXT_NAMESPACE "AssetTypeActions_GenericGraph"
+
+FAssetTypeActions_GenericGraph::FAssetTypeActions_GenericGraph(EAssetTypeCategories::Type InAssetCategory)
+ : MyAssetCategory(InAssetCategory)
+{
+}
+
+FText FAssetTypeActions_GenericGraph::GetName() const
+{
+ return LOCTEXT("FGenericGraphAssetTypeActionsName", "Generic Graph");
+}
+
+FColor FAssetTypeActions_GenericGraph::GetTypeColor() const
+{
+ return FColor(129, 196, 115);
+}
+
+UClass* FAssetTypeActions_GenericGraph::GetSupportedClass() const
+{
+ return UGenericGraph::StaticClass();
+}
+
+void FAssetTypeActions_GenericGraph::OpenAssetEditor(const TArray& InObjects, TSharedPtr EditWithinLevelEditor)
+{
+ const EToolkitMode::Type Mode = EditWithinLevelEditor.IsValid() ? EToolkitMode::WorldCentric : EToolkitMode::Standalone;
+
+ for (auto ObjIt = InObjects.CreateConstIterator(); ObjIt; ++ObjIt)
+ {
+ if (UGenericGraph* Graph = Cast(*ObjIt))
+ {
+ TSharedRef NewGraphEditor(new FAssetEditor_GenericGraph());
+ NewGraphEditor->InitGenericGraphAssetEditor(Mode, EditWithinLevelEditor, Graph);
+ }
+ }
+}
+
+uint32 FAssetTypeActions_GenericGraph::GetCategories()
+{
+ return MyAssetCategory;
+}
+
+//////////////////////////////////////////////////////////////////////////
+
+#undef LOCTEXT_NAMESPACE
\ No newline at end of file
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/AutoLayout/AutoLayoutStrategy.cpp b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/AutoLayout/AutoLayoutStrategy.cpp
new file mode 100644
index 00000000..4d03bd87
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/AutoLayout/AutoLayoutStrategy.cpp
@@ -0,0 +1,96 @@
+#include "AutoLayout/AutoLayoutStrategy.h"
+#include "Kismet/KismetMathLibrary.h"
+#include "GenericGraphAssetEditor/EdNode_GenericGraphNode.h"
+#include "GenericGraphAssetEditor/SEdNode_GenericGraphNode.h"
+
+UAutoLayoutStrategy::UAutoLayoutStrategy()
+{
+ Settings = nullptr;
+ MaxIteration = 50;
+ OptimalDistance = 150;
+}
+
+UAutoLayoutStrategy::~UAutoLayoutStrategy()
+{
+
+}
+
+FBox2D UAutoLayoutStrategy::GetNodeBound(UEdGraphNode* EdNode)
+{
+ int32 NodeWidth = GetNodeWidth(Cast(EdNode));
+ int32 NodeHeight = GetNodeHeight(Cast(EdNode));
+ FVector2D Min(EdNode->NodePosX, EdNode->NodePosY);
+ FVector2D Max(EdNode->NodePosX + NodeWidth, EdNode->NodePosY + NodeHeight);
+ return FBox2D(Min, Max);
+}
+
+FBox2D UAutoLayoutStrategy::GetActualBounds(UGenericGraphNode* RootNode)
+{
+ int Level = 0;
+ TArray CurrLevelNodes = { RootNode };
+ TArray NextLevelNodes;
+
+ FBox2D Rtn = GetNodeBound(EdGraph->NodeMap[RootNode]);
+
+ while (CurrLevelNodes.Num() != 0)
+ {
+ for (int i = 0; i < CurrLevelNodes.Num(); ++i)
+ {
+ UGenericGraphNode* Node = CurrLevelNodes[i];
+ check(Node != nullptr);
+
+ Rtn += GetNodeBound(EdGraph->NodeMap[Node]);
+
+ for (int j = 0; j < Node->ChildrenNodes.Num(); ++j)
+ {
+ NextLevelNodes.Add(Node->ChildrenNodes[j]);
+ }
+ }
+
+ CurrLevelNodes = NextLevelNodes;
+ NextLevelNodes.Reset();
+ ++Level;
+ }
+ return Rtn;
+}
+
+void UAutoLayoutStrategy::RandomLayoutOneTree(UGenericGraphNode* RootNode, const FBox2D& Bound)
+{
+ int Level = 0;
+ TArray CurrLevelNodes = { RootNode };
+ TArray NextLevelNodes;
+
+ while (CurrLevelNodes.Num() != 0)
+ {
+ for (int i = 0; i < CurrLevelNodes.Num(); ++i)
+ {
+ UGenericGraphNode* Node = CurrLevelNodes[i];
+ check(Node != nullptr);
+
+ UEdNode_GenericGraphNode* EdNode_Node = EdGraph->NodeMap[Node];
+
+ EdNode_Node->NodePosX = UKismetMathLibrary::RandomFloatInRange(Bound.Min.X, Bound.Max.X);
+ EdNode_Node->NodePosY = UKismetMathLibrary::RandomFloatInRange(Bound.Min.Y, Bound.Max.Y);
+
+ for (int j = 0; j < Node->ChildrenNodes.Num(); ++j)
+ {
+ NextLevelNodes.Add(Node->ChildrenNodes[j]);
+ }
+ }
+
+ CurrLevelNodes = NextLevelNodes;
+ NextLevelNodes.Reset();
+ ++Level;
+ }
+}
+
+int32 UAutoLayoutStrategy::GetNodeWidth(UEdNode_GenericGraphNode* EdNode)
+{
+ return EdNode->SEdNode->GetCachedGeometry().GetLocalSize().X;
+}
+
+int32 UAutoLayoutStrategy::GetNodeHeight(UEdNode_GenericGraphNode* EdNode)
+{
+ return EdNode->SEdNode->GetCachedGeometry().GetLocalSize().Y;
+}
+
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/AutoLayout/ForceDirectedLayoutStrategy.cpp b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/AutoLayout/ForceDirectedLayoutStrategy.cpp
new file mode 100644
index 00000000..8d66bfcb
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/AutoLayout/ForceDirectedLayoutStrategy.cpp
@@ -0,0 +1,162 @@
+#include "AutoLayout/ForceDirectedLayoutStrategy.h"
+
+static inline float CoolDown(float Temp, float CoolDownRate)
+{
+ if (Temp < .01) return .01;
+ return Temp - (Temp / CoolDownRate);
+}
+
+static inline float GetAttractForce(float X, float K)
+{
+ return (X * X) / K;
+}
+
+static inline float GetRepulseForce(float X, float k)
+{
+ return X != 0 ? k * k / X : TNumericLimits::Max();
+}
+
+UForceDirectedLayoutStrategy::UForceDirectedLayoutStrategy()
+{
+ bRandomInit = false;
+ CoolDownRate = 10;
+ InitTemperature = 10.f;
+}
+
+UForceDirectedLayoutStrategy::~UForceDirectedLayoutStrategy()
+{
+
+}
+
+void UForceDirectedLayoutStrategy::Layout(UEdGraph* _EdGraph)
+{
+ EdGraph = Cast(_EdGraph);
+ check(EdGraph != nullptr);
+
+ EdGraph->RebuildGenericGraph();
+ Graph = EdGraph->GetGenericGraph();
+ check(Graph != nullptr);
+
+ if (Settings != nullptr)
+ {
+ OptimalDistance = Settings->OptimalDistance;
+ MaxIteration = Settings->MaxIteration;
+ bRandomInit = Settings->bRandomInit;
+ }
+
+ FBox2D PreTreeBound(ForceInitToZero);
+ for (int32 i = 0; i < Graph->RootNodes.Num(); ++i)
+ {
+ PreTreeBound = LayoutOneTree(Graph->RootNodes[i], PreTreeBound);
+ }
+}
+
+FBox2D UForceDirectedLayoutStrategy::LayoutOneTree(UGenericGraphNode* RootNode, const FBox2D& PreTreeBound)
+{
+ float Temp = InitTemperature;
+ FBox2D TreeBound = GetActualBounds(RootNode);
+ TreeBound.Min.X += PreTreeBound.Max.X + OptimalDistance;
+ TreeBound.Max.X += PreTreeBound.Max.X + OptimalDistance;
+
+ if (bRandomInit)
+ {
+ RandomLayoutOneTree(RootNode, TreeBound);
+ }
+
+ float RepulseForce, AttractForce, Distance;
+ FVector2D Diff;
+
+ TMap NodeToDisplacement;
+
+ for (int32 i = 0; i < EdGraph->Nodes.Num(); ++i)
+ {
+ NodeToDisplacement.Add(EdGraph->Nodes[i], FVector2D(0.f, 0.f));
+ }
+
+ for (int32 IterrationNum = 0; IterrationNum < MaxIteration; ++IterrationNum)
+ {
+ // Calculate the repulsive forces.
+ for (int32 i = 0; i < EdGraph->Nodes.Num(); ++i)
+ {
+ for (int32 j = 0; j < EdGraph->Nodes.Num(); ++j)
+ {
+ if (i == j)
+ continue;
+ Diff.X = EdGraph->Nodes[i]->NodePosX - EdGraph->Nodes[j]->NodePosX;
+ Diff.Y = EdGraph->Nodes[i]->NodePosY - EdGraph->Nodes[j]->NodePosY;
+ Distance = Diff.Size();
+ Diff.Normalize();
+
+ RepulseForce = Distance > 2 * OptimalDistance ? 0 : GetRepulseForce(Distance, OptimalDistance);
+
+ NodeToDisplacement[EdGraph->Nodes[i]] += Diff * RepulseForce;
+ }
+ }
+
+ // Calculate the attractive forces.
+ int Level = 0;
+ TArray CurrLevelNodes = { RootNode };
+ TArray NextLevelNodes;
+
+ while (CurrLevelNodes.Num() != 0)
+ {
+ for (int32 i = 0; i < CurrLevelNodes.Num(); ++i)
+ {
+ UGenericGraphNode* Node = CurrLevelNodes[i];
+ check(Node != nullptr);
+
+ UEdNode_GenericGraphNode* EdNode_ParentNode = EdGraph->NodeMap[Node];
+
+ for (int32 j = 0; j < Node->ChildrenNodes.Num(); ++j)
+ {
+ NextLevelNodes.Add(Node->ChildrenNodes[j]);
+
+ UEdNode_GenericGraphNode* EdNode_ChildNode = EdGraph->NodeMap[Node->ChildrenNodes[j]];
+
+ Diff.X = EdNode_ChildNode->NodePosX - EdNode_ParentNode->NodePosY;
+ Diff.Y = EdNode_ChildNode->NodePosY - EdNode_ParentNode->NodePosY;
+ Distance = Diff.Size();
+ Diff.Normalize();
+
+ AttractForce = GetAttractForce(Distance, OptimalDistance);
+
+ NodeToDisplacement[EdNode_ParentNode] += Distance * Diff;
+ NodeToDisplacement[EdNode_ChildNode] -= Distance * Diff;
+ }
+ }
+
+ CurrLevelNodes = NextLevelNodes;
+ NextLevelNodes.Reset();
+ ++Level;
+ }
+
+ for (int32 i = 0; i < EdGraph->Nodes.Num(); ++i)
+ {
+ UEdGraphNode* EdNode = EdGraph->Nodes[i];
+ Distance = NodeToDisplacement[EdNode].Size();
+ NodeToDisplacement[EdNode].Normalize();
+
+ float Minimum = Distance < Temp ? Distance : Temp;
+ EdNode->NodePosX += NodeToDisplacement[EdNode].X * Minimum;
+ EdNode->NodePosY += NodeToDisplacement[EdNode].Y * Minimum;
+ }
+
+ Temp = CoolDown(Temp, CoolDownRate);
+ }
+
+ FBox2D ActualBound = GetActualBounds(RootNode);
+
+ FVector2D Center = ActualBound.GetCenter();
+ FVector2D TreeCenter = TreeBound.GetCenter();
+
+ FVector2D Scale = (TreeBound.Max - TreeBound.Min) / (ActualBound.Max - ActualBound.Min);
+
+ for (int32 i = 0; i < EdGraph->Nodes.Num(); ++i)
+ {
+ UEdGraphNode* EdNode = EdGraph->Nodes[i];
+ EdNode->NodePosX = TreeCenter.X + Scale.X * (EdNode->NodePosX - Center.X);
+ EdNode->NodePosY = TreeCenter.Y + Scale.Y * (EdNode->NodePosY - Center.Y);
+ }
+
+ return TreeBound;
+}
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/AutoLayout/TreeLayoutStrategy.cpp b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/AutoLayout/TreeLayoutStrategy.cpp
new file mode 100644
index 00000000..93163208
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/AutoLayout/TreeLayoutStrategy.cpp
@@ -0,0 +1,241 @@
+#include "AutoLayout/TreeLayoutStrategy.h"
+#include "GenericGraphEditorPCH.h"
+#include "GenericGraphAssetEditor/SEdNode_GenericGraphNode.h"
+
+UTreeLayoutStrategy::UTreeLayoutStrategy()
+{
+}
+
+UTreeLayoutStrategy::~UTreeLayoutStrategy()
+{
+
+}
+
+void UTreeLayoutStrategy::Layout(UEdGraph* _EdGraph)
+{
+ EdGraph = Cast(_EdGraph);
+ check(EdGraph != nullptr);
+
+ EdGraph->RebuildGenericGraph();
+ Graph = EdGraph->GetGenericGraph();
+ check(Graph != nullptr);
+
+ bool bFirstPassOnly = false;
+
+ if (Settings != nullptr)
+ {
+ OptimalDistance = Settings->OptimalDistance;
+ MaxIteration = Settings->MaxIteration;
+ bFirstPassOnly = Settings->bFirstPassOnly;
+ }
+
+ FVector2D Anchor(0.f, 0.f);
+ for (int32 i = 0; i < Graph->RootNodes.Num(); ++i)
+ {
+ UGenericGraphNode* RootNode = Graph->RootNodes[i];
+ InitPass(RootNode, Anchor);
+
+ if (!bFirstPassOnly)
+ {
+ for (int32 j = 0; j < MaxIteration; ++j)
+ {
+ bool HasConflict = ResolveConflictPass(RootNode);
+ if (!HasConflict)
+ {
+ break;
+ }
+ }
+ }
+ }
+
+ for (int32 i = 0; i < Graph->RootNodes.Num(); ++i)
+ {
+ for (int32 j = 0; j < i; ++j)
+ {
+ ResolveConflict(Graph->RootNodes[j], Graph->RootNodes[i]);
+ }
+ }
+}
+
+void UTreeLayoutStrategy::InitPass(UGenericGraphNode* RootNode, const FVector2D& Anchor)
+{
+ UEdNode_GenericGraphNode* EdNode_RootNode = EdGraph->NodeMap[RootNode];
+
+ FVector2D ChildAnchor(FVector2D(0.f, GetNodeHeight(EdNode_RootNode) + OptimalDistance + Anchor.Y));
+ for (int32 i = 0; i < RootNode->ChildrenNodes.Num(); ++i)
+ {
+ UGenericGraphNode* Child = RootNode->ChildrenNodes[i];
+ UEdNode_GenericGraphNode* EdNode_ChildNode = EdGraph->NodeMap[Child];
+ if (i > 0)
+ {
+ UGenericGraphNode* PreChild = RootNode->ChildrenNodes[i - 1];
+ UEdNode_GenericGraphNode* EdNode_PreChildNode = EdGraph->NodeMap[PreChild];
+ ChildAnchor.X += OptimalDistance + GetNodeWidth(EdNode_PreChildNode) / 2;
+ }
+ ChildAnchor.X += GetNodeWidth(EdNode_ChildNode) / 2;
+ InitPass(Child, ChildAnchor);
+ }
+
+ float NodeWidth = GetNodeWidth(EdNode_RootNode);
+
+ EdNode_RootNode->NodePosY = Anchor.Y;
+ if (RootNode->ChildrenNodes.Num() == 0)
+ {
+ EdNode_RootNode->NodePosX = Anchor.X - NodeWidth / 2;
+ }
+ else
+ {
+ UpdateParentNodePosition(RootNode);
+ }
+}
+
+bool UTreeLayoutStrategy::ResolveConflictPass(UGenericGraphNode* Node)
+{
+ bool HasConflict = false;
+ for (int32 i = 0; i < Node->ChildrenNodes.Num(); ++i)
+ {
+ UGenericGraphNode* Child = Node->ChildrenNodes[i];
+ if (ResolveConflictPass(Child))
+ {
+ HasConflict = true;
+ }
+ }
+
+ for (int32 i = 0; i < Node->ParentNodes.Num(); ++i)
+ {
+ UGenericGraphNode* ParentNode = Node->ParentNodes[i];
+ for (int32 j = 0; j < ParentNode->ChildrenNodes.Num(); ++j)
+ {
+ UGenericGraphNode* LeftSibling = ParentNode->ChildrenNodes[j];
+ if (LeftSibling == Node)
+ break;
+ if (ResolveConflict(LeftSibling, Node))
+ {
+ HasConflict = true;
+ }
+ }
+ }
+
+ return HasConflict;
+}
+
+bool UTreeLayoutStrategy::ResolveConflict(UGenericGraphNode* LRoot, UGenericGraphNode* RRoot)
+{
+ TArray RightContour, LeftContour;
+
+ GetRightContour(LRoot, 0, RightContour);
+ GetLeftContour(RRoot, 0, LeftContour);
+
+ int32 MaxOverlapDistance = 0;
+ int32 Num = FMath::Min(LeftContour.Num(), RightContour.Num());
+ for (int32 i = 0; i < Num; ++i)
+ {
+ if (RightContour.Contains(LeftContour[i]) || LeftContour.Contains(RightContour[i]))
+ break;
+
+ int32 RightBound = RightContour[i]->NodePosX + GetNodeWidth(RightContour[i]);
+ int32 LeftBound = LeftContour[i]->NodePosX;
+ int32 Distance = RightBound + OptimalDistance - LeftBound;
+ if (Distance > MaxOverlapDistance)
+ {
+ MaxOverlapDistance = Distance;
+ }
+ }
+
+ if (MaxOverlapDistance > 0)
+ {
+ ShiftSubTree(RRoot, FVector2D(MaxOverlapDistance, 0.f));
+
+ TArray ParentNodes = RRoot->ParentNodes;
+ TArray NextParentNodes;
+ while (ParentNodes.Num() != 0)
+ {
+ for (int32 i = 0; i < ParentNodes.Num(); ++i)
+ {
+ UpdateParentNodePosition(ParentNodes[i]);
+
+ NextParentNodes.Append(ParentNodes[i]->ParentNodes);
+ }
+
+ ParentNodes = NextParentNodes;
+ NextParentNodes.Reset();
+ }
+
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+void UTreeLayoutStrategy::GetLeftContour(UGenericGraphNode* RootNode, int32 Level, TArray& Contour)
+{
+ UEdNode_GenericGraphNode* EdNode_Node = EdGraph->NodeMap[RootNode];
+ if (Level >= Contour.Num())
+ {
+ Contour.Add(EdNode_Node);
+ }
+ else if (EdNode_Node->NodePosX < Contour[Level]->NodePosX)
+ {
+ Contour[Level] = EdNode_Node;
+ }
+
+ for (int32 i = 0; i < RootNode->ChildrenNodes.Num(); ++i)
+ {
+ GetLeftContour(RootNode->ChildrenNodes[i], Level + 1, Contour);
+ }
+}
+
+void UTreeLayoutStrategy::GetRightContour(UGenericGraphNode* RootNode, int32 Level, TArray& Contour)
+{
+ UEdNode_GenericGraphNode* EdNode_Node = EdGraph->NodeMap[RootNode];
+ if (Level >= Contour.Num())
+ {
+ Contour.Add(EdNode_Node);
+ }
+ else if (EdNode_Node->NodePosX + GetNodeWidth(EdNode_Node) > Contour[Level]->NodePosX + GetNodeWidth(Contour[Level]))
+ {
+ Contour[Level] = EdNode_Node;
+ }
+
+ for (int32 i = 0; i < RootNode->ChildrenNodes.Num(); ++i)
+ {
+ GetRightContour(RootNode->ChildrenNodes[i], Level + 1, Contour);
+ }
+}
+
+void UTreeLayoutStrategy::ShiftSubTree(UGenericGraphNode* RootNode, const FVector2D& Offset)
+{
+ UEdNode_GenericGraphNode* EdNode_Node = EdGraph->NodeMap[RootNode];
+ EdNode_Node->NodePosX += Offset.X;
+ EdNode_Node->NodePosY += Offset.Y;
+
+ for (int32 i = 0; i < RootNode->ChildrenNodes.Num(); ++i)
+ {
+ UGenericGraphNode* Child = RootNode->ChildrenNodes[i];
+
+ if (Child->ParentNodes[0] == RootNode)
+ {
+ ShiftSubTree(RootNode->ChildrenNodes[i], Offset);
+ }
+ }
+}
+
+void UTreeLayoutStrategy::UpdateParentNodePosition(UGenericGraphNode* ParentNode)
+{
+ UEdNode_GenericGraphNode* EdNode_ParentNode = EdGraph->NodeMap[ParentNode];
+ if (ParentNode->ChildrenNodes.Num() % 2 == 0)
+ {
+ UEdNode_GenericGraphNode* FirstChild = EdGraph->NodeMap[ParentNode->ChildrenNodes[0]];
+ UEdNode_GenericGraphNode* LastChild = EdGraph->NodeMap[ParentNode->ChildrenNodes.Last()];
+ float LeftBound = FirstChild->NodePosX;
+ float RightBound = LastChild->NodePosX + GetNodeWidth(LastChild);
+ EdNode_ParentNode->NodePosX = (LeftBound + RightBound) / 2 - GetNodeWidth(EdNode_ParentNode) / 2;
+ }
+ else
+ {
+ UEdNode_GenericGraphNode* MidChild = EdGraph->NodeMap[ParentNode->ChildrenNodes[ParentNode->ChildrenNodes.Num() / 2]];
+ EdNode_ParentNode->NodePosX = MidChild->NodePosX + GetNodeWidth(MidChild) / 2 - GetNodeWidth(EdNode_ParentNode) / 2;
+ }
+}
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/AssetEditorToolbar_GenericGraph.cpp b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/AssetEditorToolbar_GenericGraph.cpp
new file mode 100644
index 00000000..1d9127cc
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/AssetEditorToolbar_GenericGraph.cpp
@@ -0,0 +1,46 @@
+#include "GenericGraphAssetEditor/AssetEditorToolbar_GenericGraph.h"
+#include "GenericGraphAssetEditor/AssetEditor_GenericGraph.h"
+#include "GenericGraphAssetEditor/EditorCommands_GenericGraph.h"
+#include "GenericGraphAssetEditor/GenericGraphEditorStyle.h"
+
+#define LOCTEXT_NAMESPACE "AssetEditorToolbar_GenericGraph"
+
+void FAssetEditorToolbar_GenericGraph::AddGenericGraphToolbar(TSharedPtr Extender)
+{
+ check(GenericGraphEditor.IsValid());
+ TSharedPtr GenericGraphEditorPtr = GenericGraphEditor.Pin();
+
+ TSharedPtr ToolbarExtender = MakeShareable(new FExtender);
+ ToolbarExtender->AddToolBarExtension("Asset", EExtensionHook::After, GenericGraphEditorPtr->GetToolkitCommands(), FToolBarExtensionDelegate::CreateSP( this, &FAssetEditorToolbar_GenericGraph::FillGenericGraphToolbar ));
+ GenericGraphEditorPtr->AddToolbarExtender(ToolbarExtender);
+}
+
+void FAssetEditorToolbar_GenericGraph::FillGenericGraphToolbar(FToolBarBuilder& ToolbarBuilder)
+{
+ check(GenericGraphEditor.IsValid());
+ TSharedPtr GenericGraphEditorPtr = GenericGraphEditor.Pin();
+
+ ToolbarBuilder.BeginSection("Generic Graph");
+ {
+ ToolbarBuilder.AddToolBarButton(FEditorCommands_GenericGraph::Get().GraphSettings,
+ NAME_None,
+ LOCTEXT("GraphSettings_Label", "Graph Settings"),
+ LOCTEXT("GraphSettings_ToolTip", "Show the Graph Settings"),
+ FSlateIcon(FAppStyle::GetAppStyleSetName(), "LevelEditor.GameSettings"));
+ }
+ ToolbarBuilder.EndSection();
+
+ ToolbarBuilder.BeginSection("Util");
+ {
+ ToolbarBuilder.AddToolBarButton(FEditorCommands_GenericGraph::Get().AutoArrange,
+ NAME_None,
+ LOCTEXT("AutoArrange_Label", "Auto Arrange"),
+ LOCTEXT("AutoArrange_ToolTip", "Auto arrange nodes, not perfect, but still handy"),
+ FSlateIcon(FGenericGraphEditorStyle::GetStyleSetName(), "GenericGraphEditor.AutoArrange"));
+ }
+ ToolbarBuilder.EndSection();
+
+}
+
+
+#undef LOCTEXT_NAMESPACE
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/AssetEditor_GenericGraph.cpp b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/AssetEditor_GenericGraph.cpp
new file mode 100644
index 00000000..68507d39
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/AssetEditor_GenericGraph.cpp
@@ -0,0 +1,819 @@
+#include "GenericGraphAssetEditor/AssetEditor_GenericGraph.h"
+#include "GenericGraphEditorPCH.h"
+#include "GenericGraphAssetEditor/AssetEditorToolbar_GenericGraph.h"
+#include "GenericGraphAssetEditor/AssetGraphSchema_GenericGraph.h"
+#include "GenericGraphAssetEditor/EditorCommands_GenericGraph.h"
+#include "GenericGraphAssetEditor/EdGraph_GenericGraph.h"
+#include "AssetToolsModule.h"
+#include "HAL/PlatformApplicationMisc.h"
+#include "Framework/Commands/GenericCommands.h"
+#include "GraphEditorActions.h"
+#include "IDetailsView.h"
+#include "PropertyEditorModule.h"
+#include "Editor/UnrealEd/Public/Kismet2/BlueprintEditorUtils.h"
+#include "Kismet2/KismetEditorUtilities.h"
+#include "EdGraphUtilities.h"
+#include "GenericGraphAssetEditor/EdGraph_GenericGraph.h"
+#include "GenericGraphAssetEditor/EdNode_GenericGraphNode.h"
+#include "GenericGraphAssetEditor/EdNode_GenericGraphEdge.h"
+#include "AutoLayout/TreeLayoutStrategy.h"
+#include "AutoLayout/ForceDirectedLayoutStrategy.h"
+
+#define LOCTEXT_NAMESPACE "AssetEditor_GenericGraph"
+
+const FName GenericGraphEditorAppName = FName(TEXT("GenericGraphEditorApp"));
+
+struct FGenericGraphAssetEditorTabs
+{
+ // Tab identifiers
+ static const FName GenericGraphPropertyID;
+ static const FName ViewportID;
+ static const FName GenericGraphEditorSettingsID;
+};
+
+//////////////////////////////////////////////////////////////////////////
+
+const FName FGenericGraphAssetEditorTabs::GenericGraphPropertyID(TEXT("GenericGraphProperty"));
+const FName FGenericGraphAssetEditorTabs::ViewportID(TEXT("Viewport"));
+const FName FGenericGraphAssetEditorTabs::GenericGraphEditorSettingsID(TEXT("GenericGraphEditorSettings"));
+
+//////////////////////////////////////////////////////////////////////////
+
+FAssetEditor_GenericGraph::FAssetEditor_GenericGraph()
+{
+ EditingGraph = nullptr;
+
+ GenricGraphEditorSettings = NewObject(UGenericGraphEditorSettings::StaticClass());
+
+#if ENGINE_MAJOR_VERSION < 5
+ OnPackageSavedDelegateHandle = UPackage::PackageSavedEvent.AddRaw(this, &FAssetEditor_GenericGraph::OnPackageSaved);
+#else // #if ENGINE_MAJOR_VERSION < 5
+ OnPackageSavedDelegateHandle = UPackage::PackageSavedWithContextEvent.AddRaw(this, &FAssetEditor_GenericGraph::OnPackageSavedWithContext);
+#endif // #else // #if ENGINE_MAJOR_VERSION < 5
+}
+
+FAssetEditor_GenericGraph::~FAssetEditor_GenericGraph()
+{
+#if ENGINE_MAJOR_VERSION < 5
+ UPackage::PackageSavedEvent.Remove(OnPackageSavedDelegateHandle);
+#else // #if ENGINE_MAJOR_VERSION < 5
+ UPackage::PackageSavedWithContextEvent.Remove(OnPackageSavedDelegateHandle);
+#endif // #else // #if ENGINE_MAJOR_VERSION < 5
+}
+
+void FAssetEditor_GenericGraph::InitGenericGraphAssetEditor(const EToolkitMode::Type Mode, const TSharedPtr< IToolkitHost >& InitToolkitHost, UGenericGraph* Graph)
+{
+ EditingGraph = Graph;
+ CreateEdGraph();
+
+ FGenericCommands::Register();
+ FGraphEditorCommands::Register();
+ FEditorCommands_GenericGraph::Register();
+
+ if (!ToolbarBuilder.IsValid())
+ {
+ ToolbarBuilder = MakeShareable(new FAssetEditorToolbar_GenericGraph(SharedThis(this)));
+ }
+
+ BindCommands();
+
+ CreateInternalWidgets();
+
+ TSharedPtr ToolbarExtender = MakeShareable(new FExtender);
+
+ ToolbarBuilder->AddGenericGraphToolbar(ToolbarExtender);
+
+ // Layout
+ const TSharedRef StandaloneDefaultLayout = FTabManager::NewLayout("Standalone_GenericGraphEditor_Layout_v1")
+ ->AddArea
+ (
+ FTabManager::NewPrimaryArea()->SetOrientation(Orient_Vertical)
+#if ENGINE_MAJOR_VERSION < 5
+ ->Split
+ (
+ FTabManager::NewStack()
+ ->SetSizeCoefficient(0.1f)
+ ->AddTab(GetToolbarTabId(), ETabState::OpenedTab)->SetHideTabWell(true)
+ )
+#endif // #if ENGINE_MAJOR_VERSION < 5
+ ->Split
+ (
+ FTabManager::NewSplitter()->SetOrientation(Orient_Horizontal)->SetSizeCoefficient(0.9f)
+ ->Split
+ (
+ FTabManager::NewStack()
+ ->SetSizeCoefficient(0.65f)
+ ->AddTab(FGenericGraphAssetEditorTabs::ViewportID, ETabState::OpenedTab)->SetHideTabWell(true)
+ )
+ ->Split
+ (
+ FTabManager::NewSplitter()->SetOrientation(Orient_Vertical)
+ ->Split
+ (
+ FTabManager::NewStack()
+ ->SetSizeCoefficient(0.7f)
+ ->AddTab(FGenericGraphAssetEditorTabs::GenericGraphPropertyID, ETabState::OpenedTab)->SetHideTabWell(true)
+ )
+ ->Split
+ (
+ FTabManager::NewStack()
+ ->SetSizeCoefficient(0.3f)
+ ->AddTab(FGenericGraphAssetEditorTabs::GenericGraphEditorSettingsID, ETabState::OpenedTab)
+ )
+ )
+ )
+ );
+
+ const bool bCreateDefaultStandaloneMenu = true;
+ const bool bCreateDefaultToolbar = true;
+ FAssetEditorToolkit::InitAssetEditor(Mode, InitToolkitHost, GenericGraphEditorAppName, StandaloneDefaultLayout, bCreateDefaultStandaloneMenu, bCreateDefaultToolbar, EditingGraph, false);
+
+ RegenerateMenusAndToolbars();
+}
+
+void FAssetEditor_GenericGraph::RegisterTabSpawners(const TSharedRef& InTabManager)
+{
+ WorkspaceMenuCategory = InTabManager->AddLocalWorkspaceMenuCategory(LOCTEXT("WorkspaceMenu_GenericGraphEditor", "Generic Graph Editor"));
+ auto WorkspaceMenuCategoryRef = WorkspaceMenuCategory.ToSharedRef();
+
+ FAssetEditorToolkit::RegisterTabSpawners(InTabManager);
+
+ InTabManager->RegisterTabSpawner(FGenericGraphAssetEditorTabs::ViewportID, FOnSpawnTab::CreateSP(this, &FAssetEditor_GenericGraph::SpawnTab_Viewport))
+ .SetDisplayName(LOCTEXT("GraphCanvasTab", "Viewport"))
+ .SetGroup(WorkspaceMenuCategoryRef)
+ .SetIcon(FSlateIcon(FAppStyle::GetAppStyleSetName(), "GraphEditor.EventGraph_16x"));
+
+ InTabManager->RegisterTabSpawner(FGenericGraphAssetEditorTabs::GenericGraphPropertyID, FOnSpawnTab::CreateSP(this, &FAssetEditor_GenericGraph::SpawnTab_Details))
+ .SetDisplayName(LOCTEXT("DetailsTab", "Property"))
+ .SetGroup(WorkspaceMenuCategoryRef)
+ .SetIcon(FSlateIcon(FAppStyle::GetAppStyleSetName(), "LevelEditor.Tabs.Details"));
+
+ InTabManager->RegisterTabSpawner(FGenericGraphAssetEditorTabs::GenericGraphEditorSettingsID, FOnSpawnTab::CreateSP(this, &FAssetEditor_GenericGraph::SpawnTab_EditorSettings))
+ .SetDisplayName(LOCTEXT("EditorSettingsTab", "Generic Graph Editor Setttings"))
+ .SetGroup(WorkspaceMenuCategoryRef)
+ .SetIcon(FSlateIcon(FAppStyle::GetAppStyleSetName(), "LevelEditor.Tabs.Details"));
+}
+
+void FAssetEditor_GenericGraph::UnregisterTabSpawners(const TSharedRef& InTabManager)
+{
+ FAssetEditorToolkit::UnregisterTabSpawners(InTabManager);
+
+ InTabManager->UnregisterTabSpawner(FGenericGraphAssetEditorTabs::ViewportID);
+ InTabManager->UnregisterTabSpawner(FGenericGraphAssetEditorTabs::GenericGraphPropertyID);
+ InTabManager->UnregisterTabSpawner(FGenericGraphAssetEditorTabs::GenericGraphEditorSettingsID);
+}
+
+FName FAssetEditor_GenericGraph::GetToolkitFName() const
+{
+ return FName("FGenericGraphEditor");
+}
+
+FText FAssetEditor_GenericGraph::GetBaseToolkitName() const
+{
+ return LOCTEXT("GenericGraphEditorAppLabel", "Generic Graph Editor");
+}
+
+FText FAssetEditor_GenericGraph::GetToolkitName() const
+{
+ const bool bDirtyState = EditingGraph->GetOutermost()->IsDirty();
+
+ FFormatNamedArguments Args;
+ Args.Add(TEXT("GenericGraphName"), FText::FromString(EditingGraph->GetName()));
+ Args.Add(TEXT("DirtyState"), bDirtyState ? FText::FromString(TEXT("*")) : FText::GetEmpty());
+ return FText::Format(LOCTEXT("GenericGraphEditorToolkitName", "{GenericGraphName}{DirtyState}"), Args);
+}
+
+FText FAssetEditor_GenericGraph::GetToolkitToolTipText() const
+{
+ return FAssetEditorToolkit::GetToolTipTextForObject(EditingGraph);
+}
+
+FLinearColor FAssetEditor_GenericGraph::GetWorldCentricTabColorScale() const
+{
+ return FLinearColor::White;
+}
+
+FString FAssetEditor_GenericGraph::GetWorldCentricTabPrefix() const
+{
+ return TEXT("GenericGraphEditor");
+}
+
+FString FAssetEditor_GenericGraph::GetDocumentationLink() const
+{
+ return TEXT("");
+}
+
+void FAssetEditor_GenericGraph::SaveAsset_Execute()
+{
+ if (EditingGraph != nullptr)
+ {
+ RebuildGenericGraph();
+ }
+
+ FAssetEditorToolkit::SaveAsset_Execute();
+}
+
+void FAssetEditor_GenericGraph::AddReferencedObjects(FReferenceCollector& Collector)
+{
+ Collector.AddReferencedObject(EditingGraph);
+ Collector.AddReferencedObject(EditingGraph->EdGraph);
+}
+
+UGenericGraphEditorSettings* FAssetEditor_GenericGraph::GetSettings() const
+{
+ return GenricGraphEditorSettings;
+}
+
+TSharedRef FAssetEditor_GenericGraph::SpawnTab_Viewport(const FSpawnTabArgs& Args)
+{
+ check(Args.GetTabId() == FGenericGraphAssetEditorTabs::ViewportID);
+
+ TSharedRef SpawnedTab = SNew(SDockTab)
+ .Label(LOCTEXT("ViewportTab_Title", "Viewport"));
+
+ if (ViewportWidget.IsValid())
+ {
+ SpawnedTab->SetContent(ViewportWidget.ToSharedRef());
+ }
+
+ return SpawnedTab;
+}
+
+TSharedRef FAssetEditor_GenericGraph::SpawnTab_Details(const FSpawnTabArgs& Args)
+{
+ check(Args.GetTabId() == FGenericGraphAssetEditorTabs::GenericGraphPropertyID);
+
+ return SNew(SDockTab)
+#if ENGINE_MAJOR_VERSION < 5
+ .Icon(FAppStyle::GetBrush("LevelEditor.Tabs.Details"))
+#endif // #if ENGINE_MAJOR_VERSION < 5
+ .Label(LOCTEXT("Details_Title", "Property"))
+ [
+ PropertyWidget.ToSharedRef()
+ ];
+}
+
+TSharedRef FAssetEditor_GenericGraph::SpawnTab_EditorSettings(const FSpawnTabArgs& Args)
+{
+ check(Args.GetTabId() == FGenericGraphAssetEditorTabs::GenericGraphEditorSettingsID);
+
+ return SNew(SDockTab)
+#if ENGINE_MAJOR_VERSION < 5
+ .Icon(FAppStyle::GetBrush("LevelEditor.Tabs.Details"))
+#endif // #if ENGINE_MAJOR_VERSION < 5
+ .Label(LOCTEXT("EditorSettings_Title", "Generic Graph Editor Setttings"))
+ [
+ EditorSettingsWidget.ToSharedRef()
+ ];
+}
+
+void FAssetEditor_GenericGraph::CreateInternalWidgets()
+{
+ ViewportWidget = CreateViewportWidget();
+
+ FDetailsViewArgs Args;
+ Args.bHideSelectionTip = true;
+ Args.NotifyHook = this;
+
+ FPropertyEditorModule& PropertyModule = FModuleManager::LoadModuleChecked("PropertyEditor");
+ PropertyWidget = PropertyModule.CreateDetailView(Args);
+ PropertyWidget->SetObject(EditingGraph);
+ PropertyWidget->OnFinishedChangingProperties().AddSP(this, &FAssetEditor_GenericGraph::OnFinishedChangingProperties);
+
+ EditorSettingsWidget = PropertyModule.CreateDetailView(Args);
+ EditorSettingsWidget->SetObject(GenricGraphEditorSettings);
+}
+
+TSharedRef FAssetEditor_GenericGraph::CreateViewportWidget()
+{
+ FGraphAppearanceInfo AppearanceInfo;
+ AppearanceInfo.CornerText = LOCTEXT("AppearanceCornerText_GenericGraph", "Generic Graph");
+
+ CreateCommandList();
+
+ SGraphEditor::FGraphEditorEvents InEvents;
+ InEvents.OnSelectionChanged = SGraphEditor::FOnSelectionChanged::CreateSP(this, &FAssetEditor_GenericGraph::OnSelectedNodesChanged);
+ InEvents.OnNodeDoubleClicked = FSingleNodeEvent::CreateSP(this, &FAssetEditor_GenericGraph::OnNodeDoubleClicked);
+
+ return SNew(SGraphEditor)
+ .AdditionalCommands(GraphEditorCommands)
+ .IsEditable(true)
+ .Appearance(AppearanceInfo)
+ .GraphToEdit(EditingGraph->EdGraph)
+ .GraphEvents(InEvents)
+ .AutoExpandActionMenu(true)
+ .ShowGraphStateOverlay(false);
+}
+
+void FAssetEditor_GenericGraph::BindCommands()
+{
+ ToolkitCommands->MapAction(FEditorCommands_GenericGraph::Get().GraphSettings,
+ FExecuteAction::CreateSP(this, &FAssetEditor_GenericGraph::GraphSettings),
+ FCanExecuteAction::CreateSP(this, &FAssetEditor_GenericGraph::CanGraphSettings)
+ );
+
+ ToolkitCommands->MapAction(FEditorCommands_GenericGraph::Get().AutoArrange,
+ FExecuteAction::CreateSP(this, &FAssetEditor_GenericGraph::AutoArrange),
+ FCanExecuteAction::CreateSP(this, &FAssetEditor_GenericGraph::CanAutoArrange)
+ );
+}
+
+void FAssetEditor_GenericGraph::CreateEdGraph()
+{
+ if (EditingGraph->EdGraph == nullptr)
+ {
+ EditingGraph->EdGraph = CastChecked(FBlueprintEditorUtils::CreateNewGraph(EditingGraph, NAME_None, UEdGraph_GenericGraph::StaticClass(), UAssetGraphSchema_GenericGraph::StaticClass()));
+ EditingGraph->EdGraph->bAllowDeletion = false;
+
+ // Give the schema a chance to fill out any required nodes (like the results node)
+ const UEdGraphSchema* Schema = EditingGraph->EdGraph->GetSchema();
+ Schema->CreateDefaultNodesForGraph(*EditingGraph->EdGraph);
+ }
+}
+
+void FAssetEditor_GenericGraph::CreateCommandList()
+{
+ if (GraphEditorCommands.IsValid())
+ {
+ return;
+ }
+
+ GraphEditorCommands = MakeShareable(new FUICommandList);
+
+ // Can't use CreateSP here because derived editor are already implementing TSharedFromThis
+ // however it should be safe, since commands are being used only within this editor
+ // if it ever crashes, this function will have to go away and be reimplemented in each derived class
+
+ GraphEditorCommands->MapAction(FEditorCommands_GenericGraph::Get().GraphSettings,
+ FExecuteAction::CreateRaw(this, &FAssetEditor_GenericGraph::GraphSettings),
+ FCanExecuteAction::CreateRaw(this, &FAssetEditor_GenericGraph::CanGraphSettings));
+
+ GraphEditorCommands->MapAction(FEditorCommands_GenericGraph::Get().AutoArrange,
+ FExecuteAction::CreateRaw(this, &FAssetEditor_GenericGraph::AutoArrange),
+ FCanExecuteAction::CreateRaw(this, &FAssetEditor_GenericGraph::CanAutoArrange));
+
+ GraphEditorCommands->MapAction(FGenericCommands::Get().SelectAll,
+ FExecuteAction::CreateRaw(this, &FAssetEditor_GenericGraph::SelectAllNodes),
+ FCanExecuteAction::CreateRaw(this, &FAssetEditor_GenericGraph::CanSelectAllNodes)
+ );
+
+ GraphEditorCommands->MapAction(FGenericCommands::Get().Delete,
+ FExecuteAction::CreateRaw(this, &FAssetEditor_GenericGraph::DeleteSelectedNodes),
+ FCanExecuteAction::CreateRaw(this, &FAssetEditor_GenericGraph::CanDeleteNodes)
+ );
+
+ GraphEditorCommands->MapAction(FGenericCommands::Get().Copy,
+ FExecuteAction::CreateRaw(this, &FAssetEditor_GenericGraph::CopySelectedNodes),
+ FCanExecuteAction::CreateRaw(this, &FAssetEditor_GenericGraph::CanCopyNodes)
+ );
+
+ GraphEditorCommands->MapAction(FGenericCommands::Get().Cut,
+ FExecuteAction::CreateRaw(this, &FAssetEditor_GenericGraph::CutSelectedNodes),
+ FCanExecuteAction::CreateRaw(this, &FAssetEditor_GenericGraph::CanCutNodes)
+ );
+
+ GraphEditorCommands->MapAction(FGenericCommands::Get().Paste,
+ FExecuteAction::CreateRaw(this, &FAssetEditor_GenericGraph::PasteNodes),
+ FCanExecuteAction::CreateRaw(this, &FAssetEditor_GenericGraph::CanPasteNodes)
+ );
+
+ GraphEditorCommands->MapAction(FGenericCommands::Get().Duplicate,
+ FExecuteAction::CreateRaw(this, &FAssetEditor_GenericGraph::DuplicateNodes),
+ FCanExecuteAction::CreateRaw(this, &FAssetEditor_GenericGraph::CanDuplicateNodes)
+ );
+
+ GraphEditorCommands->MapAction(FGenericCommands::Get().Rename,
+ FExecuteAction::CreateSP(this, &FAssetEditor_GenericGraph::OnRenameNode),
+ FCanExecuteAction::CreateSP(this, &FAssetEditor_GenericGraph::CanRenameNodes)
+ );
+}
+
+TSharedPtr FAssetEditor_GenericGraph::GetCurrGraphEditor() const
+{
+ return ViewportWidget;
+}
+
+FGraphPanelSelectionSet FAssetEditor_GenericGraph::GetSelectedNodes() const
+{
+ FGraphPanelSelectionSet CurrentSelection;
+ TSharedPtr FocusedGraphEd = GetCurrGraphEditor();
+ if (FocusedGraphEd.IsValid())
+ {
+ CurrentSelection = FocusedGraphEd->GetSelectedNodes();
+ }
+
+ return CurrentSelection;
+}
+
+void FAssetEditor_GenericGraph::RebuildGenericGraph()
+{
+ if (EditingGraph == nullptr)
+ {
+ LOG_WARNING(TEXT("FGenericGraphAssetEditor::RebuildGenericGraph EditingGraph is nullptr"));
+ return;
+ }
+
+ UEdGraph_GenericGraph* EdGraph = Cast(EditingGraph->EdGraph);
+ check(EdGraph != nullptr);
+
+ EdGraph->RebuildGenericGraph();
+}
+
+void FAssetEditor_GenericGraph::SelectAllNodes()
+{
+ TSharedPtr CurrentGraphEditor = GetCurrGraphEditor();
+ if (CurrentGraphEditor.IsValid())
+ {
+ CurrentGraphEditor->SelectAllNodes();
+ }
+}
+
+bool FAssetEditor_GenericGraph::CanSelectAllNodes()
+{
+ return true;
+}
+
+void FAssetEditor_GenericGraph::DeleteSelectedNodes()
+{
+ TSharedPtr CurrentGraphEditor = GetCurrGraphEditor();
+ if (!CurrentGraphEditor.IsValid())
+ {
+ return;
+ }
+
+ const FScopedTransaction Transaction(FGenericCommands::Get().Delete->GetDescription());
+
+ CurrentGraphEditor->GetCurrentGraph()->Modify();
+
+ const FGraphPanelSelectionSet SelectedNodes = CurrentGraphEditor->GetSelectedNodes();
+ CurrentGraphEditor->ClearSelectionSet();
+
+ for (FGraphPanelSelectionSet::TConstIterator NodeIt(SelectedNodes); NodeIt; ++NodeIt)
+ {
+ UEdGraphNode* EdNode = Cast(*NodeIt);
+ if (EdNode == nullptr || !EdNode->CanUserDeleteNode())
+ continue;;
+
+ if (UEdNode_GenericGraphNode* EdNode_Node = Cast(EdNode))
+ {
+ EdNode_Node->Modify();
+
+ const UEdGraphSchema* Schema = EdNode_Node->GetSchema();
+ if (Schema != nullptr)
+ {
+ Schema->BreakNodeLinks(*EdNode_Node);
+ }
+
+ EdNode_Node->DestroyNode();
+ }
+ else
+ {
+ EdNode->Modify();
+ EdNode->DestroyNode();
+ }
+ }
+}
+
+bool FAssetEditor_GenericGraph::CanDeleteNodes()
+{
+ // If any of the nodes can be deleted then we should allow deleting
+ const FGraphPanelSelectionSet SelectedNodes = GetSelectedNodes();
+ for (FGraphPanelSelectionSet::TConstIterator SelectedIter(SelectedNodes); SelectedIter; ++SelectedIter)
+ {
+ UEdGraphNode* Node = Cast(*SelectedIter);
+ if (Node != nullptr && Node->CanUserDeleteNode())
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void FAssetEditor_GenericGraph::DeleteSelectedDuplicatableNodes()
+{
+ TSharedPtr CurrentGraphEditor = GetCurrGraphEditor();
+ if (!CurrentGraphEditor.IsValid())
+ {
+ return;
+ }
+
+ const FGraphPanelSelectionSet OldSelectedNodes = CurrentGraphEditor->GetSelectedNodes();
+ CurrentGraphEditor->ClearSelectionSet();
+
+ for (FGraphPanelSelectionSet::TConstIterator SelectedIter(OldSelectedNodes); SelectedIter; ++SelectedIter)
+ {
+ UEdGraphNode* Node = Cast(*SelectedIter);
+ if (Node && Node->CanDuplicateNode())
+ {
+ CurrentGraphEditor->SetNodeSelection(Node, true);
+ }
+ }
+
+ // Delete the duplicatable nodes
+ DeleteSelectedNodes();
+
+ CurrentGraphEditor->ClearSelectionSet();
+
+ for (FGraphPanelSelectionSet::TConstIterator SelectedIter(OldSelectedNodes); SelectedIter; ++SelectedIter)
+ {
+ if (UEdGraphNode* Node = Cast(*SelectedIter))
+ {
+ CurrentGraphEditor->SetNodeSelection(Node, true);
+ }
+ }
+}
+
+void FAssetEditor_GenericGraph::CutSelectedNodes()
+{
+ CopySelectedNodes();
+ DeleteSelectedDuplicatableNodes();
+}
+
+bool FAssetEditor_GenericGraph::CanCutNodes()
+{
+ return CanCopyNodes() && CanDeleteNodes();
+}
+
+void FAssetEditor_GenericGraph::CopySelectedNodes()
+{
+ // Export the selected nodes and place the text on the clipboard
+ FGraphPanelSelectionSet SelectedNodes = GetSelectedNodes();
+
+ FString ExportedText;
+
+ for (FGraphPanelSelectionSet::TIterator SelectedIter(SelectedNodes); SelectedIter; ++SelectedIter)
+ {
+ UEdGraphNode* Node = Cast(*SelectedIter);
+ if (Node == nullptr)
+ {
+ SelectedIter.RemoveCurrent();
+ continue;
+ }
+
+ if (UEdNode_GenericGraphEdge* EdNode_Edge = Cast(*SelectedIter))
+ {
+ UEdNode_GenericGraphNode* StartNode = EdNode_Edge->GetStartNode();
+ UEdNode_GenericGraphNode* EndNode = EdNode_Edge->GetEndNode();
+
+ if (!SelectedNodes.Contains(StartNode) || !SelectedNodes.Contains(EndNode))
+ {
+ SelectedIter.RemoveCurrent();
+ continue;
+ }
+ }
+
+ Node->PrepareForCopying();
+ }
+
+ FEdGraphUtilities::ExportNodesToText(SelectedNodes, ExportedText);
+ FPlatformApplicationMisc::ClipboardCopy(*ExportedText);
+}
+
+bool FAssetEditor_GenericGraph::CanCopyNodes()
+{
+ // If any of the nodes can be duplicated then we should allow copying
+ const FGraphPanelSelectionSet SelectedNodes = GetSelectedNodes();
+ for (FGraphPanelSelectionSet::TConstIterator SelectedIter(SelectedNodes); SelectedIter; ++SelectedIter)
+ {
+ UEdGraphNode* Node = Cast(*SelectedIter);
+ if (Node && Node->CanDuplicateNode())
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void FAssetEditor_GenericGraph::PasteNodes()
+{
+ TSharedPtr CurrentGraphEditor = GetCurrGraphEditor();
+ if (CurrentGraphEditor.IsValid())
+ {
+ PasteNodesHere(CurrentGraphEditor->GetPasteLocation());
+ }
+}
+
+void FAssetEditor_GenericGraph::PasteNodesHere(const FVector2D& Location)
+{
+ // Find the graph editor with focus
+ TSharedPtr CurrentGraphEditor = GetCurrGraphEditor();
+ if (!CurrentGraphEditor.IsValid())
+ {
+ return;
+ }
+ // Select the newly pasted stuff
+ UEdGraph* EdGraph = CurrentGraphEditor->GetCurrentGraph();
+
+ {
+ const FScopedTransaction Transaction(FGenericCommands::Get().Paste->GetDescription());
+ EdGraph->Modify();
+
+ // Clear the selection set (newly pasted stuff will be selected)
+ CurrentGraphEditor->ClearSelectionSet();
+
+ // Grab the text to paste from the clipboard.
+ FString TextToImport;
+ FPlatformApplicationMisc::ClipboardPaste(TextToImport);
+
+ // Import the nodes
+ TSet PastedNodes;
+ FEdGraphUtilities::ImportNodesFromText(EdGraph, TextToImport, PastedNodes);
+
+ //Average position of nodes so we can move them while still maintaining relative distances to each other
+ FVector2D AvgNodePosition(0.0f, 0.0f);
+
+ for (TSet::TIterator It(PastedNodes); It; ++It)
+ {
+ UEdGraphNode* Node = *It;
+ AvgNodePosition.X += Node->NodePosX;
+ AvgNodePosition.Y += Node->NodePosY;
+ }
+
+ float InvNumNodes = 1.0f / float(PastedNodes.Num());
+ AvgNodePosition.X *= InvNumNodes;
+ AvgNodePosition.Y *= InvNumNodes;
+
+ for (TSet::TIterator It(PastedNodes); It; ++It)
+ {
+ UEdGraphNode* Node = *It;
+ CurrentGraphEditor->SetNodeSelection(Node, true);
+
+ Node->NodePosX = (Node->NodePosX - AvgNodePosition.X) + Location.X;
+ Node->NodePosY = (Node->NodePosY - AvgNodePosition.Y) + Location.Y;
+
+ Node->SnapToGrid(16);
+
+ // Give new node a different Guid from the old one
+ Node->CreateNewGuid();
+ }
+ }
+
+ // Update UI
+ CurrentGraphEditor->NotifyGraphChanged();
+
+ UObject* GraphOwner = EdGraph->GetOuter();
+ if (GraphOwner)
+ {
+ GraphOwner->PostEditChange();
+ GraphOwner->MarkPackageDirty();
+ }
+}
+
+bool FAssetEditor_GenericGraph::CanPasteNodes()
+{
+ TSharedPtr CurrentGraphEditor = GetCurrGraphEditor();
+ if (!CurrentGraphEditor.IsValid())
+ {
+ return false;
+ }
+
+ FString ClipboardContent;
+ FPlatformApplicationMisc::ClipboardPaste(ClipboardContent);
+
+ return FEdGraphUtilities::CanImportNodesFromText(CurrentGraphEditor->GetCurrentGraph(), ClipboardContent);
+}
+
+void FAssetEditor_GenericGraph::DuplicateNodes()
+{
+ CopySelectedNodes();
+ PasteNodes();
+}
+
+bool FAssetEditor_GenericGraph::CanDuplicateNodes()
+{
+ return CanCopyNodes();
+}
+
+void FAssetEditor_GenericGraph::GraphSettings()
+{
+ PropertyWidget->SetObject(EditingGraph);
+}
+
+bool FAssetEditor_GenericGraph::CanGraphSettings() const
+{
+ return true;
+}
+
+void FAssetEditor_GenericGraph::AutoArrange()
+{
+ UEdGraph_GenericGraph* EdGraph = Cast(EditingGraph->EdGraph);
+ check(EdGraph != nullptr);
+
+ const FScopedTransaction Transaction(LOCTEXT("GenericGraphEditorAutoArrange", "Generic Graph Editor: Auto Arrange"));
+
+ EdGraph->Modify();
+
+ UAutoLayoutStrategy* LayoutStrategy = nullptr;
+ switch (GenricGraphEditorSettings->AutoLayoutStrategy)
+ {
+ case EAutoLayoutStrategy::Tree:
+ LayoutStrategy = NewObject(EdGraph, UTreeLayoutStrategy::StaticClass());
+ break;
+ case EAutoLayoutStrategy::ForceDirected:
+ LayoutStrategy = NewObject(EdGraph, UForceDirectedLayoutStrategy::StaticClass());
+ break;
+ default:
+ break;
+ }
+
+ if (LayoutStrategy != nullptr)
+ {
+ LayoutStrategy->Settings = GenricGraphEditorSettings;
+ LayoutStrategy->Layout(EdGraph);
+ LayoutStrategy->ConditionalBeginDestroy();
+ }
+ else
+ {
+ LOG_ERROR(TEXT("FAssetEditor_GenericGraph::AutoArrange LayoutStrategy is null."));
+ }
+}
+
+bool FAssetEditor_GenericGraph::CanAutoArrange() const
+{
+ return EditingGraph != nullptr && Cast(EditingGraph->EdGraph) != nullptr;
+}
+
+void FAssetEditor_GenericGraph::OnRenameNode()
+{
+ TSharedPtr CurrentGraphEditor = GetCurrGraphEditor();
+ if (CurrentGraphEditor.IsValid())
+ {
+ const FGraphPanelSelectionSet SelectedNodes = GetSelectedNodes();
+ for (FGraphPanelSelectionSet::TConstIterator NodeIt(SelectedNodes); NodeIt; ++NodeIt)
+ {
+ UEdGraphNode* SelectedNode = Cast(*NodeIt);
+ if (SelectedNode != NULL && SelectedNode->bCanRenameNode)
+ {
+ CurrentGraphEditor->IsNodeTitleVisible(SelectedNode, true);
+ break;
+ }
+ }
+ }
+}
+
+bool FAssetEditor_GenericGraph::CanRenameNodes() const
+{
+ UEdGraph_GenericGraph* EdGraph = Cast(EditingGraph->EdGraph);
+ check(EdGraph != nullptr);
+
+ UGenericGraph* Graph = EdGraph->GetGenericGraph();
+ check(Graph != nullptr)
+
+ return Graph->bCanRenameNode && GetSelectedNodes().Num() == 1;
+}
+
+void FAssetEditor_GenericGraph::OnSelectedNodesChanged(const TSet& NewSelection)
+{
+ TArray Selection;
+
+ for (UObject* SelectionEntry : NewSelection)
+ {
+ Selection.Add(SelectionEntry);
+ }
+
+ if (Selection.Num() == 0)
+ {
+ PropertyWidget->SetObject(EditingGraph);
+
+ }
+ else
+ {
+ PropertyWidget->SetObjects(Selection);
+ }
+}
+
+void FAssetEditor_GenericGraph::OnNodeDoubleClicked(UEdGraphNode* Node)
+{
+
+}
+
+void FAssetEditor_GenericGraph::OnFinishedChangingProperties(const FPropertyChangedEvent& PropertyChangedEvent)
+{
+ if (EditingGraph == nullptr)
+ return;
+
+ EditingGraph->EdGraph->GetSchema()->ForceVisualizationCacheClear();
+}
+
+#if ENGINE_MAJOR_VERSION < 5
+void FAssetEditor_GenericGraph::OnPackageSaved(const FString& PackageFileName, UObject* Outer)
+{
+ RebuildGenericGraph();
+}
+#else // #if ENGINE_MAJOR_VERSION < 5
+void FAssetEditor_GenericGraph::OnPackageSavedWithContext(const FString& PackageFileName, UPackage* Package, FObjectPostSaveContext ObjectSaveContext)
+{
+ RebuildGenericGraph();
+}
+#endif // #else // #if ENGINE_MAJOR_VERSION < 5
+
+void FAssetEditor_GenericGraph::RegisterToolbarTab(const TSharedRef& InTabManager)
+{
+ FAssetEditorToolkit::RegisterTabSpawners(InTabManager);
+}
+
+
+#undef LOCTEXT_NAMESPACE
+
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/AssetGraphSchema_GenericGraph.cpp b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/AssetGraphSchema_GenericGraph.cpp
new file mode 100644
index 00000000..8c873f8d
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/AssetGraphSchema_GenericGraph.cpp
@@ -0,0 +1,476 @@
+#include "GenericGraphAssetEditor/AssetGraphSchema_GenericGraph.h"
+#include "ToolMenus.h"
+#include "GenericGraphEditorPCH.h"
+#include "GenericGraphAssetEditor/EdNode_GenericGraphNode.h"
+#include "GenericGraphAssetEditor/EdNode_GenericGraphEdge.h"
+#include "GenericGraphAssetEditor/ConnectionDrawingPolicy_GenericGraph.h"
+#include "GraphEditorActions.h"
+#include "Framework/Commands/GenericCommands.h"
+#include "AutoLayout/ForceDirectedLayoutStrategy.h"
+#include "AutoLayout/TreeLayoutStrategy.h"
+
+#define LOCTEXT_NAMESPACE "AssetSchema_GenericGraph"
+
+int32 UAssetGraphSchema_GenericGraph::CurrentCacheRefreshID = 0;
+
+
+class FNodeVisitorCycleChecker
+{
+public:
+ /** Check whether a loop in the graph would be caused by linking the passed-in nodes */
+ bool CheckForLoop(UEdGraphNode* StartNode, UEdGraphNode* EndNode)
+ {
+
+ VisitedNodes.Add(StartNode);
+
+ return TraverseNodes(EndNode);
+ }
+
+private:
+ bool TraverseNodes(UEdGraphNode* Node)
+ {
+ VisitedNodes.Add(Node);
+
+ for (auto MyPin : Node->Pins)
+ {
+ if (MyPin->Direction == EGPD_Output)
+ {
+ for (auto OtherPin : MyPin->LinkedTo)
+ {
+ UEdGraphNode* OtherNode = OtherPin->GetOwningNode();
+ if (VisitedNodes.Contains(OtherNode))
+ {
+ // Only an issue if this is a back-edge
+ return false;
+ }
+ else if (!FinishedNodes.Contains(OtherNode))
+ {
+ // Only should traverse if this node hasn't been traversed
+ if (!TraverseNodes(OtherNode))
+ return false;
+ }
+ }
+ }
+ }
+
+ VisitedNodes.Remove(Node);
+ FinishedNodes.Add(Node);
+ return true;
+ };
+
+
+ TSet VisitedNodes;
+ TSet FinishedNodes;
+};
+
+UEdGraphNode* FAssetSchemaAction_GenericGraph_NewNode::PerformAction(class UEdGraph* ParentGraph, UEdGraphPin* FromPin, const FVector2D Location, bool bSelectNewNode /*= true*/)
+{
+ UEdGraphNode* ResultNode = nullptr;
+
+ if (NodeTemplate != nullptr)
+ {
+ const FScopedTransaction Transaction(LOCTEXT("GenericGraphEditorNewNode", "Generic Graph Editor: New Node"));
+ ParentGraph->Modify();
+ if (FromPin != nullptr)
+ FromPin->Modify();
+
+ NodeTemplate->Rename(nullptr, ParentGraph);
+ ParentGraph->AddNode(NodeTemplate, true, bSelectNewNode);
+
+ NodeTemplate->CreateNewGuid();
+ NodeTemplate->PostPlacedNewNode();
+ NodeTemplate->AllocateDefaultPins();
+ NodeTemplate->AutowireNewNode(FromPin);
+
+ NodeTemplate->NodePosX = Location.X;
+ NodeTemplate->NodePosY = Location.Y;
+
+ NodeTemplate->GenericGraphNode->SetFlags(RF_Transactional);
+ NodeTemplate->SetFlags(RF_Transactional);
+
+ ResultNode = NodeTemplate;
+ }
+
+ return ResultNode;
+}
+
+void FAssetSchemaAction_GenericGraph_NewNode::AddReferencedObjects(FReferenceCollector& Collector)
+{
+ FEdGraphSchemaAction::AddReferencedObjects(Collector);
+ Collector.AddReferencedObject(NodeTemplate);
+}
+
+UEdGraphNode* FAssetSchemaAction_GenericGraph_NewEdge::PerformAction(class UEdGraph* ParentGraph, UEdGraphPin* FromPin, const FVector2D Location, bool bSelectNewNode /*= true*/)
+{
+ UEdGraphNode* ResultNode = nullptr;
+
+ if (NodeTemplate != nullptr)
+ {
+ const FScopedTransaction Transaction(LOCTEXT("GenericGraphEditorNewEdge", "Generic Graph Editor: New Edge"));
+ ParentGraph->Modify();
+ if (FromPin != nullptr)
+ FromPin->Modify();
+
+ NodeTemplate->Rename(nullptr, ParentGraph);
+ ParentGraph->AddNode(NodeTemplate, true, bSelectNewNode);
+
+ NodeTemplate->CreateNewGuid();
+ NodeTemplate->PostPlacedNewNode();
+ NodeTemplate->AllocateDefaultPins();
+ NodeTemplate->AutowireNewNode(FromPin);
+
+ NodeTemplate->NodePosX = Location.X;
+ NodeTemplate->NodePosY = Location.Y;
+
+ NodeTemplate->GenericGraphEdge->SetFlags(RF_Transactional);
+ NodeTemplate->SetFlags(RF_Transactional);
+
+ ResultNode = NodeTemplate;
+ }
+
+ return ResultNode;
+}
+
+void FAssetSchemaAction_GenericGraph_NewEdge::AddReferencedObjects(FReferenceCollector& Collector)
+{
+ FEdGraphSchemaAction::AddReferencedObjects(Collector);
+ Collector.AddReferencedObject(NodeTemplate);
+}
+
+void UAssetGraphSchema_GenericGraph::GetBreakLinkToSubMenuActions(UToolMenu* Menu, UEdGraphPin* InGraphPin)
+{
+ // Make sure we have a unique name for every entry in the list
+ TMap< FString, uint32 > LinkTitleCount;
+
+ FToolMenuSection& Section = Menu->FindOrAddSection("GenericGraphAssetGraphSchemaPinActions");
+
+ // Add all the links we could break from
+ for (TArray::TConstIterator Links(InGraphPin->LinkedTo); Links; ++Links)
+ {
+ UEdGraphPin* Pin = *Links;
+ FString TitleString = Pin->GetOwningNode()->GetNodeTitle(ENodeTitleType::ListView).ToString();
+ FText Title = FText::FromString(TitleString);
+ if (Pin->PinName != TEXT(""))
+ {
+ TitleString = FString::Printf(TEXT("%s (%s)"), *TitleString, *Pin->PinName.ToString());
+
+ // Add name of connection if possible
+ FFormatNamedArguments Args;
+ Args.Add(TEXT("NodeTitle"), Title);
+ Args.Add(TEXT("PinName"), Pin->GetDisplayName());
+ Title = FText::Format(LOCTEXT("BreakDescPin", "{NodeTitle} ({PinName})"), Args);
+ }
+
+ uint32& Count = LinkTitleCount.FindOrAdd(TitleString);
+
+ FText Description;
+ FFormatNamedArguments Args;
+ Args.Add(TEXT("NodeTitle"), Title);
+ Args.Add(TEXT("NumberOfNodes"), Count);
+
+ if (Count == 0)
+ {
+ Description = FText::Format(LOCTEXT("BreakDesc", "Break link to {NodeTitle}"), Args);
+ }
+ else
+ {
+ Description = FText::Format(LOCTEXT("BreakDescMulti", "Break link to {NodeTitle} ({NumberOfNodes})"), Args);
+ }
+ ++Count;
+
+ Section.AddMenuEntry(NAME_None, Description, Description, FSlateIcon(), FUIAction(
+ FExecuteAction::CreateUObject(this, &UAssetGraphSchema_GenericGraph::BreakSinglePinLink, const_cast(InGraphPin), *Links)));
+ }
+}
+
+EGraphType UAssetGraphSchema_GenericGraph::GetGraphType(const UEdGraph* TestEdGraph) const
+{
+ return GT_StateMachine;
+}
+
+void UAssetGraphSchema_GenericGraph::GetGraphContextActions(FGraphContextMenuBuilder& ContextMenuBuilder) const
+{
+ UGenericGraph* Graph = CastChecked(ContextMenuBuilder.CurrentGraph->GetOuter());
+
+ if (Graph->NodeType == nullptr)
+ {
+ return;
+ }
+
+ const bool bNoParent = (ContextMenuBuilder.FromPin == NULL);
+
+ const FText AddToolTip = LOCTEXT("NewGenericGraphNodeTooltip", "Add node here");
+
+ TSet > Visited;
+
+ FText Desc = Graph->NodeType.GetDefaultObject()->ContextMenuName;
+
+ if (Desc.IsEmpty())
+ {
+ FString Title = Graph->NodeType->GetName();
+ Title.RemoveFromEnd("_C");
+ Desc = FText::FromString(Title);
+ }
+
+ if (!Graph->NodeType->HasAnyClassFlags(CLASS_Abstract))
+ {
+ TSharedPtr NewNodeAction(new FAssetSchemaAction_GenericGraph_NewNode(LOCTEXT("GenericGraphNodeAction", "Generic Graph Node"), Desc, AddToolTip, 0));
+ NewNodeAction->NodeTemplate = NewObject(ContextMenuBuilder.OwnerOfTemporaries);
+ NewNodeAction->NodeTemplate->GenericGraphNode = NewObject(NewNodeAction->NodeTemplate, Graph->NodeType);
+ NewNodeAction->NodeTemplate->GenericGraphNode->Graph = Graph;
+ ContextMenuBuilder.AddAction(NewNodeAction);
+
+ Visited.Add(Graph->NodeType);
+ }
+
+ for (TObjectIterator It; It; ++It)
+ {
+ if (It->IsChildOf(Graph->NodeType) && !It->HasAnyClassFlags(CLASS_Abstract) && !Visited.Contains(*It))
+ {
+ TSubclassOf NodeType = *It;
+
+ if (It->GetName().StartsWith("REINST") || It->GetName().StartsWith("SKEL"))
+ continue;
+
+ if (!Graph->GetClass()->IsChildOf(NodeType.GetDefaultObject()->CompatibleGraphType))
+ continue;
+
+ Desc = NodeType.GetDefaultObject()->ContextMenuName;
+
+ if (Desc.IsEmpty())
+ {
+ FString Title = NodeType->GetName();
+ Title.RemoveFromEnd("_C");
+ Desc = FText::FromString(Title);
+ }
+
+ TSharedPtr Action(new FAssetSchemaAction_GenericGraph_NewNode(LOCTEXT("GenericGraphNodeAction", "Generic Graph Node"), Desc, AddToolTip, 0));
+ Action->NodeTemplate = NewObject(ContextMenuBuilder.OwnerOfTemporaries);
+ Action->NodeTemplate->GenericGraphNode = NewObject(Action->NodeTemplate, NodeType);
+ Action->NodeTemplate->GenericGraphNode->Graph = Graph;
+ ContextMenuBuilder.AddAction(Action);
+
+ Visited.Add(NodeType);
+ }
+ }
+}
+
+void UAssetGraphSchema_GenericGraph::GetContextMenuActions(UToolMenu* Menu, UGraphNodeContextMenuContext* Context) const
+{
+ if (Context->Pin)
+ {
+ {
+ FToolMenuSection& Section = Menu->AddSection("GenericGraphAssetGraphSchemaNodeActions", LOCTEXT("PinActionsMenuHeader", "Pin Actions"));
+ // Only display the 'Break Links' option if there is a link to break!
+ if (Context->Pin->LinkedTo.Num() > 0)
+ {
+ Section.AddMenuEntry(FGraphEditorCommands::Get().BreakPinLinks);
+
+ // add sub menu for break link to
+ if (Context->Pin->LinkedTo.Num() > 1)
+ {
+ Section.AddSubMenu(
+ "BreakLinkTo",
+ LOCTEXT("BreakLinkTo", "Break Link To..."),
+ LOCTEXT("BreakSpecificLinks", "Break a specific link..."),
+ FNewToolMenuDelegate::CreateUObject((UAssetGraphSchema_GenericGraph* const)this, &UAssetGraphSchema_GenericGraph::GetBreakLinkToSubMenuActions, const_cast(Context->Pin)));
+ }
+ else
+ {
+ ((UAssetGraphSchema_GenericGraph* const)this)->GetBreakLinkToSubMenuActions(Menu, const_cast(Context->Pin));
+ }
+ }
+ }
+ }
+ else if (Context->Node)
+ {
+ {
+ FToolMenuSection& Section = Menu->AddSection("GenericGraphAssetGraphSchemaNodeActions", LOCTEXT("ClassActionsMenuHeader", "Node Actions"));
+ Section.AddMenuEntry(FGenericCommands::Get().Delete);
+ Section.AddMenuEntry(FGenericCommands::Get().Cut);
+ Section.AddMenuEntry(FGenericCommands::Get().Copy);
+ Section.AddMenuEntry(FGenericCommands::Get().Duplicate);
+
+ Section.AddMenuEntry(FGraphEditorCommands::Get().BreakNodeLinks);
+ }
+ }
+
+ Super::GetContextMenuActions(Menu, Context);
+}
+
+const FPinConnectionResponse UAssetGraphSchema_GenericGraph::CanCreateConnection(const UEdGraphPin* A, const UEdGraphPin* B) const
+{
+ // Make sure the pins are not on the same node
+ if (A->GetOwningNode() == B->GetOwningNode())
+ {
+ return FPinConnectionResponse(CONNECT_RESPONSE_DISALLOW, LOCTEXT("PinErrorSameNode", "Can't connect node to itself"));
+ }
+
+ const UEdGraphPin *Out = A;
+ const UEdGraphPin *In = B;
+
+ UEdNode_GenericGraphNode* EdNode_Out = Cast(Out->GetOwningNode());
+ UEdNode_GenericGraphNode* EdNode_In = Cast(In->GetOwningNode());
+
+ if (EdNode_Out == nullptr || EdNode_In == nullptr)
+ {
+ return FPinConnectionResponse(CONNECT_RESPONSE_DISALLOW, LOCTEXT("PinError", "Not a valid UGenericGraphEdNode"));
+ }
+
+ //Determine if we can have cycles or not
+ bool bAllowCycles = false;
+ auto EdGraph = Cast(Out->GetOwningNode()->GetGraph());
+ if (EdGraph != nullptr)
+ {
+ bAllowCycles = EdGraph->GetGenericGraph()->bCanBeCyclical;
+ }
+
+ // check for cycles
+ FNodeVisitorCycleChecker CycleChecker;
+ if (!bAllowCycles && !CycleChecker.CheckForLoop(Out->GetOwningNode(), In->GetOwningNode()))
+ {
+ return FPinConnectionResponse(CONNECT_RESPONSE_DISALLOW, LOCTEXT("PinErrorCycle", "Can't create a graph cycle"));
+ }
+
+ FText ErrorMessage;
+ if (!EdNode_Out->GenericGraphNode->CanCreateConnectionTo(EdNode_In->GenericGraphNode, EdNode_Out->GetOutputPin()->LinkedTo.Num(), ErrorMessage))
+ {
+ return FPinConnectionResponse(CONNECT_RESPONSE_DISALLOW, ErrorMessage);
+ }
+ if (!EdNode_In->GenericGraphNode->CanCreateConnectionFrom(EdNode_Out->GenericGraphNode, EdNode_In->GetInputPin()->LinkedTo.Num(), ErrorMessage))
+ {
+ return FPinConnectionResponse(CONNECT_RESPONSE_DISALLOW, ErrorMessage);
+ }
+
+
+ if (EdNode_Out->GenericGraphNode->GetGraph()->bEdgeEnabled)
+ {
+ return FPinConnectionResponse(CONNECT_RESPONSE_MAKE_WITH_CONVERSION_NODE, LOCTEXT("PinConnect", "Connect nodes with edge"));
+ }
+ else
+ {
+ return FPinConnectionResponse(CONNECT_RESPONSE_MAKE, LOCTEXT("PinConnect", "Connect nodes"));
+ }
+}
+
+bool UAssetGraphSchema_GenericGraph::TryCreateConnection(UEdGraphPin* A, UEdGraphPin* B) const
+{
+ // We don't actually care about the pin, we want the node that is being dragged between
+ UEdNode_GenericGraphNode* NodeA = Cast(A->GetOwningNode());
+ UEdNode_GenericGraphNode* NodeB = Cast(B->GetOwningNode());
+
+ // Check that this edge doesn't already exist
+ for (UEdGraphPin *TestPin : NodeA->GetOutputPin()->LinkedTo)
+ {
+ UEdGraphNode* ChildNode = TestPin->GetOwningNode();
+ if (UEdNode_GenericGraphEdge* EdNode_Edge = Cast(ChildNode))
+ {
+ ChildNode = EdNode_Edge->GetEndNode();
+ }
+
+ if (ChildNode == NodeB)
+ return false;
+ }
+
+ if (NodeA && NodeB)
+ {
+ // Always create connections from node A to B, don't allow adding in reverse
+ Super::TryCreateConnection(NodeA->GetOutputPin(), NodeB->GetInputPin());
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+bool UAssetGraphSchema_GenericGraph::CreateAutomaticConversionNodeAndConnections(UEdGraphPin* A, UEdGraphPin* B) const
+{
+ UEdNode_GenericGraphNode* NodeA = Cast(A->GetOwningNode());
+ UEdNode_GenericGraphNode* NodeB = Cast(B->GetOwningNode());
+
+ // Are nodes and pins all valid?
+ if (!NodeA || !NodeA->GetOutputPin() || !NodeB || !NodeB->GetInputPin())
+ return false;
+
+ UGenericGraph* Graph = NodeA->GenericGraphNode->GetGraph();
+
+ FVector2D InitPos((NodeA->NodePosX + NodeB->NodePosX) / 2, (NodeA->NodePosY + NodeB->NodePosY) / 2);
+
+ FAssetSchemaAction_GenericGraph_NewEdge Action;
+ Action.NodeTemplate = NewObject(NodeA->GetGraph());
+ Action.NodeTemplate->SetEdge(NewObject(Action.NodeTemplate, Graph->EdgeType));
+ UEdNode_GenericGraphEdge* EdgeNode = Cast(Action.PerformAction(NodeA->GetGraph(), nullptr, InitPos, false));
+
+ // Always create connections from node A to B, don't allow adding in reverse
+ EdgeNode->CreateConnections(NodeA, NodeB);
+
+ return true;
+}
+
+class FConnectionDrawingPolicy* UAssetGraphSchema_GenericGraph::CreateConnectionDrawingPolicy(int32 InBackLayerID, int32 InFrontLayerID, float InZoomFactor, const FSlateRect& InClippingRect, class FSlateWindowElementList& InDrawElements, class UEdGraph* InGraphObj) const
+{
+ return new FConnectionDrawingPolicy_GenericGraph(InBackLayerID, InFrontLayerID, InZoomFactor, InClippingRect, InDrawElements, InGraphObj);
+}
+
+FLinearColor UAssetGraphSchema_GenericGraph::GetPinTypeColor(const FEdGraphPinType& PinType) const
+{
+ return FColor::White;
+}
+
+void UAssetGraphSchema_GenericGraph::BreakNodeLinks(UEdGraphNode& TargetNode) const
+{
+ const FScopedTransaction Transaction(NSLOCTEXT("UnrealEd", "GraphEd_BreakNodeLinks", "Break Node Links"));
+
+ Super::BreakNodeLinks(TargetNode);
+}
+
+void UAssetGraphSchema_GenericGraph::BreakPinLinks(UEdGraphPin& TargetPin, bool bSendsNodeNotifcation) const
+{
+ const FScopedTransaction Transaction(NSLOCTEXT("UnrealEd", "GraphEd_BreakPinLinks", "Break Pin Links"));
+
+ Super::BreakPinLinks(TargetPin, bSendsNodeNotifcation);
+}
+
+void UAssetGraphSchema_GenericGraph::BreakSinglePinLink(UEdGraphPin* SourcePin, UEdGraphPin* TargetPin) const
+{
+ const FScopedTransaction Transaction(NSLOCTEXT("UnrealEd", "GraphEd_BreakSinglePinLink", "Break Pin Link"));
+
+ Super::BreakSinglePinLink(SourcePin, TargetPin);
+}
+
+UEdGraphPin* UAssetGraphSchema_GenericGraph::DropPinOnNode(UEdGraphNode* InTargetNode, const FName& InSourcePinName, const FEdGraphPinType& InSourcePinType, EEdGraphPinDirection InSourcePinDirection) const
+{
+ UEdNode_GenericGraphNode* EdNode = Cast(InTargetNode);
+ switch (InSourcePinDirection)
+ {
+ case EGPD_Input:
+ return EdNode->GetOutputPin();
+ case EGPD_Output:
+ return EdNode->GetInputPin();
+ default:
+ return nullptr;
+ }
+}
+
+bool UAssetGraphSchema_GenericGraph::SupportsDropPinOnNode(UEdGraphNode* InTargetNode, const FEdGraphPinType& InSourcePinType, EEdGraphPinDirection InSourcePinDirection, FText& OutErrorMessage) const
+{
+ return Cast(InTargetNode) != nullptr;
+}
+
+bool UAssetGraphSchema_GenericGraph::IsCacheVisualizationOutOfDate(int32 InVisualizationCacheID) const
+{
+ return CurrentCacheRefreshID != InVisualizationCacheID;
+}
+
+int32 UAssetGraphSchema_GenericGraph::GetCurrentVisualizationCacheID() const
+{
+ return CurrentCacheRefreshID;
+}
+
+void UAssetGraphSchema_GenericGraph::ForceVisualizationCacheClear() const
+{
+ ++CurrentCacheRefreshID;
+}
+
+#undef LOCTEXT_NAMESPACE
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/ConnectionDrawingPolicy_GenericGraph.cpp b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/ConnectionDrawingPolicy_GenericGraph.cpp
new file mode 100644
index 00000000..a727293d
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/ConnectionDrawingPolicy_GenericGraph.cpp
@@ -0,0 +1,149 @@
+#include "GenericGraphAssetEditor/ConnectionDrawingPolicy_GenericGraph.h"
+#include "GenericGraphAssetEditor/EdNode_GenericGraphNode.h"
+#include "GenericGraphAssetEditor/EdNode_GenericGraphEdge.h"
+
+FConnectionDrawingPolicy_GenericGraph::FConnectionDrawingPolicy_GenericGraph(int32 InBackLayerID, int32 InFrontLayerID, float ZoomFactor, const FSlateRect& InClippingRect, FSlateWindowElementList& InDrawElements, UEdGraph* InGraphObj)
+ : FConnectionDrawingPolicy(InBackLayerID, InFrontLayerID, ZoomFactor, InClippingRect, InDrawElements)
+ , GraphObj(InGraphObj)
+{
+}
+
+void FConnectionDrawingPolicy_GenericGraph::DetermineWiringStyle(UEdGraphPin* OutputPin, UEdGraphPin* InputPin, /*inout*/ FConnectionParams& Params)
+{
+ Params.AssociatedPin1 = OutputPin;
+ Params.AssociatedPin2 = InputPin;
+ Params.WireThickness = 1.5f;
+
+ const bool bDeemphasizeUnhoveredPins = HoveredPins.Num() > 0;
+ if (bDeemphasizeUnhoveredPins)
+ {
+ ApplyHoverDeemphasis(OutputPin, InputPin, /*inout*/ Params.WireThickness, /*inout*/ Params.WireColor);
+ }
+}
+
+void FConnectionDrawingPolicy_GenericGraph::Draw(TMap, FArrangedWidget>& InPinGeometries, FArrangedChildren& ArrangedNodes)
+{
+ // Build an acceleration structure to quickly find geometry for the nodes
+ NodeWidgetMap.Empty();
+ for (int32 NodeIndex = 0; NodeIndex < ArrangedNodes.Num(); ++NodeIndex)
+ {
+ FArrangedWidget& CurWidget = ArrangedNodes[NodeIndex];
+ TSharedRef ChildNode = StaticCastSharedRef(CurWidget.Widget);
+ NodeWidgetMap.Add(ChildNode->GetNodeObj(), NodeIndex);
+ }
+
+ // Now draw
+ FConnectionDrawingPolicy::Draw(InPinGeometries, ArrangedNodes);
+}
+
+void FConnectionDrawingPolicy_GenericGraph::DrawPreviewConnector(const FGeometry& PinGeometry, const FVector2D& StartPoint, const FVector2D& EndPoint, UEdGraphPin* Pin)
+{
+ FConnectionParams Params;
+ DetermineWiringStyle(Pin, nullptr, /*inout*/ Params);
+
+ if (Pin->Direction == EEdGraphPinDirection::EGPD_Output)
+ {
+ DrawSplineWithArrow(FGeometryHelper::FindClosestPointOnGeom(PinGeometry, EndPoint), EndPoint, Params);
+ }
+ else
+ {
+ DrawSplineWithArrow(FGeometryHelper::FindClosestPointOnGeom(PinGeometry, StartPoint), StartPoint, Params);
+ }
+}
+
+void FConnectionDrawingPolicy_GenericGraph::DrawSplineWithArrow(const FVector2D& StartAnchorPoint, const FVector2D& EndAnchorPoint, const FConnectionParams& Params)
+{
+ // bUserFlag1 indicates that we need to reverse the direction of connection (used by debugger)
+ const FVector2D& P0 = Params.bUserFlag1 ? EndAnchorPoint : StartAnchorPoint;
+ const FVector2D& P1 = Params.bUserFlag1 ? StartAnchorPoint : EndAnchorPoint;
+
+ Internal_DrawLineWithArrow(P0, P1, Params);
+}
+
+void FConnectionDrawingPolicy_GenericGraph::Internal_DrawLineWithArrow(const FVector2D& StartAnchorPoint, const FVector2D& EndAnchorPoint, const FConnectionParams& Params)
+{
+ //@TODO: Should this be scaled by zoom factor?
+ const float LineSeparationAmount = 4.5f;
+
+ const FVector2D DeltaPos = EndAnchorPoint - StartAnchorPoint;
+ const FVector2D UnitDelta = DeltaPos.GetSafeNormal();
+ const FVector2D Normal = FVector2D(DeltaPos.Y, -DeltaPos.X).GetSafeNormal();
+
+ // Come up with the final start/end points
+ const FVector2D DirectionBias = Normal * LineSeparationAmount;
+ const FVector2D LengthBias = ArrowRadius.X * UnitDelta;
+ const FVector2D StartPoint = StartAnchorPoint + DirectionBias + LengthBias;
+ const FVector2D EndPoint = EndAnchorPoint + DirectionBias - LengthBias;
+
+ // Draw a line/spline
+ DrawConnection(WireLayerID, StartPoint, EndPoint, Params);
+
+ // Draw the arrow
+ const FVector2D ArrowDrawPos = EndPoint - ArrowRadius;
+ const float AngleInRadians = FMath::Atan2(DeltaPos.Y, DeltaPos.X);
+
+ FSlateDrawElement::MakeRotatedBox(
+ DrawElementsList,
+ ArrowLayerID,
+ FPaintGeometry(ArrowDrawPos, ArrowImage->ImageSize * ZoomFactor, ZoomFactor),
+ ArrowImage,
+ ESlateDrawEffect::None,
+ AngleInRadians,
+ TOptional(),
+ FSlateDrawElement::RelativeToElement,
+ Params.WireColor
+ );
+}
+
+void FConnectionDrawingPolicy_GenericGraph::DrawSplineWithArrow(const FGeometry& StartGeom, const FGeometry& EndGeom, const FConnectionParams& Params)
+{
+ // Get a reasonable seed point (halfway between the boxes)
+ const FVector2D StartCenter = FGeometryHelper::CenterOf(StartGeom);
+ const FVector2D EndCenter = FGeometryHelper::CenterOf(EndGeom);
+ const FVector2D SeedPoint = (StartCenter + EndCenter) * 0.5f;
+
+ // Find the (approximate) closest points between the two boxes
+ const FVector2D StartAnchorPoint = FGeometryHelper::FindClosestPointOnGeom(StartGeom, SeedPoint);
+ const FVector2D EndAnchorPoint = FGeometryHelper::FindClosestPointOnGeom(EndGeom, SeedPoint);
+
+ DrawSplineWithArrow(StartAnchorPoint, EndAnchorPoint, Params);
+}
+
+FVector2D FConnectionDrawingPolicy_GenericGraph::ComputeSplineTangent(const FVector2D& Start, const FVector2D& End) const
+{
+ const FVector2D Delta = End - Start;
+ const FVector2D NormDelta = Delta.GetSafeNormal();
+
+ return NormDelta;
+}
+
+void FConnectionDrawingPolicy_GenericGraph::DetermineLinkGeometry(FArrangedChildren& ArrangedNodes, TSharedRef& OutputPinWidget,
+ UEdGraphPin* OutputPin, UEdGraphPin* InputPin, FArrangedWidget*& StartWidgetGeometry, FArrangedWidget*& EndWidgetGeometry)
+{
+ if (UEdNode_GenericGraphEdge* EdgeNode = Cast(InputPin->GetOwningNode()))
+ {
+ UEdNode_GenericGraphNode* Start = EdgeNode->GetStartNode();
+ UEdNode_GenericGraphNode* End = EdgeNode->GetEndNode();
+ if (Start != nullptr && End != nullptr)
+ {
+ int32* StartNodeIndex = NodeWidgetMap.Find(Start);
+ int32* EndNodeIndex = NodeWidgetMap.Find(End);
+ if (StartNodeIndex != nullptr && EndNodeIndex != nullptr)
+ {
+ StartWidgetGeometry = &(ArrangedNodes[*StartNodeIndex]);
+ EndWidgetGeometry = &(ArrangedNodes[*EndNodeIndex]);
+ }
+ }
+ }
+ else
+ {
+ StartWidgetGeometry = PinGeometries->Find(OutputPinWidget);
+
+ if (TSharedPtr* pTargetWidget = PinToPinWidgetMap.Find(InputPin))
+ {
+ TSharedRef InputWidget = (*pTargetWidget).ToSharedRef();
+ EndWidgetGeometry = PinGeometries->Find(InputWidget);
+ }
+ }
+}
+
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/EdGraph_GenericGraph.cpp b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/EdGraph_GenericGraph.cpp
new file mode 100644
index 00000000..f730756f
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/EdGraph_GenericGraph.cpp
@@ -0,0 +1,205 @@
+#include "GenericGraphAssetEditor/EdGraph_GenericGraph.h"
+#include "GenericGraphEditorPCH.h"
+#include "GenericGraph.h"
+#include "GenericGraphAssetEditor/EdNode_GenericGraphNode.h"
+#include "GenericGraphAssetEditor/EdNode_GenericGraphEdge.h"
+
+UEdGraph_GenericGraph::UEdGraph_GenericGraph()
+{
+
+}
+
+UEdGraph_GenericGraph::~UEdGraph_GenericGraph()
+{
+
+}
+
+void UEdGraph_GenericGraph::RebuildGenericGraph()
+{
+ LOG_INFO(TEXT("UGenericGraphEdGraph::RebuildGenericGraph has been called"));
+
+ UGenericGraph* Graph = GetGenericGraph();
+
+ Clear();
+
+ for (int i = 0; i < Nodes.Num(); ++i)
+ {
+ if (UEdNode_GenericGraphNode* EdNode = Cast(Nodes[i]))
+ {
+ if (EdNode->GenericGraphNode == nullptr)
+ continue;
+
+ UGenericGraphNode* GenericGraphNode = EdNode->GenericGraphNode;
+
+ NodeMap.Add(GenericGraphNode, EdNode);
+
+ Graph->AllNodes.Add(GenericGraphNode);
+
+ for (int PinIdx = 0; PinIdx < EdNode->Pins.Num(); ++PinIdx)
+ {
+ UEdGraphPin* Pin = EdNode->Pins[PinIdx];
+
+ if (Pin->Direction != EEdGraphPinDirection::EGPD_Output)
+ continue;
+
+ for (int LinkToIdx = 0; LinkToIdx < Pin->LinkedTo.Num(); ++LinkToIdx)
+ {
+ UGenericGraphNode* ChildNode = nullptr;
+ if (UEdNode_GenericGraphNode* EdNode_Child = Cast(Pin->LinkedTo[LinkToIdx]->GetOwningNode()))
+ {
+ ChildNode = EdNode_Child->GenericGraphNode;
+ }
+ else if (UEdNode_GenericGraphEdge* EdNode_Edge = Cast(Pin->LinkedTo[LinkToIdx]->GetOwningNode()))
+ {
+ UEdNode_GenericGraphNode* Child = EdNode_Edge->GetEndNode();;
+ if (Child != nullptr)
+ {
+ ChildNode = Child->GenericGraphNode;
+ }
+ }
+
+ if (ChildNode != nullptr)
+ {
+ GenericGraphNode->ChildrenNodes.Add(ChildNode);
+
+ ChildNode->ParentNodes.Add(GenericGraphNode);
+ }
+ else
+ {
+ LOG_ERROR(TEXT("UEdGraph_GenericGraph::RebuildGenericGraph can't find child node"));
+ }
+ }
+ }
+ }
+ else if (UEdNode_GenericGraphEdge* EdgeNode = Cast(Nodes[i]))
+ {
+ UEdNode_GenericGraphNode* StartNode = EdgeNode->GetStartNode();
+ UEdNode_GenericGraphNode* EndNode = EdgeNode->GetEndNode();
+ UGenericGraphEdge* Edge = EdgeNode->GenericGraphEdge;
+
+ if (StartNode == nullptr || EndNode == nullptr || Edge == nullptr)
+ {
+ LOG_ERROR(TEXT("UEdGraph_GenericGraph::RebuildGenericGraph add edge failed."));
+ continue;
+ }
+
+ EdgeMap.Add(Edge, EdgeNode);
+
+ Edge->Graph = Graph;
+ Edge->Rename(nullptr, Graph, REN_DontCreateRedirectors | REN_DoNotDirty);
+ Edge->StartNode = StartNode->GenericGraphNode;
+ Edge->EndNode = EndNode->GenericGraphNode;
+ Edge->StartNode->Edges.Add(Edge->EndNode, Edge);
+ }
+ }
+
+ for (int i = 0; i < Graph->AllNodes.Num(); ++i)
+ {
+ UGenericGraphNode* Node = Graph->AllNodes[i];
+ if (Node->ParentNodes.Num() == 0)
+ {
+ Graph->RootNodes.Add(Node);
+
+ SortNodes(Node);
+ }
+
+ Node->Graph = Graph;
+ Node->Rename(nullptr, Graph, REN_DontCreateRedirectors | REN_DoNotDirty);
+ }
+
+ Graph->RootNodes.Sort([&](const UGenericGraphNode& L, const UGenericGraphNode& R)
+ {
+ UEdNode_GenericGraphNode* EdNode_LNode = NodeMap[&L];
+ UEdNode_GenericGraphNode* EdNode_RNode = NodeMap[&R];
+ return EdNode_LNode->NodePosX < EdNode_RNode->NodePosX;
+ });
+}
+
+UGenericGraph* UEdGraph_GenericGraph::GetGenericGraph() const
+{
+ return CastChecked(GetOuter());
+}
+
+bool UEdGraph_GenericGraph::Modify(bool bAlwaysMarkDirty /*= true*/)
+{
+ bool Rtn = Super::Modify(bAlwaysMarkDirty);
+
+ GetGenericGraph()->Modify();
+
+ for (int32 i = 0; i < Nodes.Num(); ++i)
+ {
+ Nodes[i]->Modify();
+ }
+
+ return Rtn;
+}
+
+void UEdGraph_GenericGraph::Clear()
+{
+ UGenericGraph* Graph = GetGenericGraph();
+
+ Graph->ClearGraph();
+ NodeMap.Reset();
+ EdgeMap.Reset();
+
+ for (int i = 0; i < Nodes.Num(); ++i)
+ {
+ if (UEdNode_GenericGraphNode* EdNode = Cast(Nodes[i]))
+ {
+ UGenericGraphNode* GenericGraphNode = EdNode->GenericGraphNode;
+ if (GenericGraphNode)
+ {
+ GenericGraphNode->ParentNodes.Reset();
+ GenericGraphNode->ChildrenNodes.Reset();
+ GenericGraphNode->Edges.Reset();
+ }
+ }
+ }
+}
+
+void UEdGraph_GenericGraph::SortNodes(UGenericGraphNode* RootNode)
+{
+ int Level = 0;
+ TArray CurrLevelNodes = { RootNode };
+ TArray NextLevelNodes;
+ TSet Visited;
+
+ while (CurrLevelNodes.Num() != 0)
+ {
+ int32 LevelWidth = 0;
+ for (int i = 0; i < CurrLevelNodes.Num(); ++i)
+ {
+ UGenericGraphNode* Node = CurrLevelNodes[i];
+ Visited.Add(Node);
+
+ auto Comp = [&](const UGenericGraphNode& L, const UGenericGraphNode& R)
+ {
+ UEdNode_GenericGraphNode* EdNode_LNode = NodeMap[&L];
+ UEdNode_GenericGraphNode* EdNode_RNode = NodeMap[&R];
+ return EdNode_LNode->NodePosX < EdNode_RNode->NodePosX;
+ };
+
+ Node->ChildrenNodes.Sort(Comp);
+ Node->ParentNodes.Sort(Comp);
+
+ for (int j = 0; j < Node->ChildrenNodes.Num(); ++j)
+ {
+ UGenericGraphNode* ChildNode = Node->ChildrenNodes[j];
+ if(!Visited.Contains(ChildNode))
+ NextLevelNodes.Add(Node->ChildrenNodes[j]);
+ }
+ }
+
+ CurrLevelNodes = NextLevelNodes;
+ NextLevelNodes.Reset();
+ ++Level;
+ }
+}
+
+void UEdGraph_GenericGraph::PostEditUndo()
+{
+ Super::PostEditUndo();
+
+ NotifyGraphChanged();
+}
+
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/EdNode_GenericGraphEdge.cpp b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/EdNode_GenericGraphEdge.cpp
new file mode 100644
index 00000000..636ce9c4
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/EdNode_GenericGraphEdge.cpp
@@ -0,0 +1,97 @@
+#include "GenericGraphAssetEditor/EdNode_GenericGraphEdge.h"
+#include "GenericGraphEdge.h"
+#include "GenericGraphAssetEditor/EdNode_GenericGraphNode.h"
+
+#define LOCTEXT_NAMESPACE "EdNode_GenericGraphEdge"
+
+UEdNode_GenericGraphEdge::UEdNode_GenericGraphEdge()
+{
+ bCanRenameNode = true;
+}
+
+void UEdNode_GenericGraphEdge::SetEdge(UGenericGraphEdge* Edge)
+{
+ GenericGraphEdge = Edge;
+}
+
+void UEdNode_GenericGraphEdge::AllocateDefaultPins()
+{
+ UEdGraphPin* Inputs = CreatePin(EGPD_Input, TEXT("Edge"), FName(), TEXT("In"));
+ Inputs->bHidden = true;
+ UEdGraphPin* Outputs = CreatePin(EGPD_Output, TEXT("Edge"), FName(), TEXT("Out"));
+ Outputs->bHidden = true;
+}
+
+FText UEdNode_GenericGraphEdge::GetNodeTitle(ENodeTitleType::Type TitleType) const
+{
+ if (GenericGraphEdge)
+ {
+ return GenericGraphEdge->GetNodeTitle();
+ }
+ return FText();
+}
+
+void UEdNode_GenericGraphEdge::PinConnectionListChanged(UEdGraphPin* Pin)
+{
+ if (Pin->LinkedTo.Num() == 0)
+ {
+ // Commit suicide; transitions must always have an input and output connection
+ Modify();
+
+ // Our parent graph will have our graph in SubGraphs so needs to be modified to record that.
+ if (UEdGraph* ParentGraph = GetGraph())
+ {
+ ParentGraph->Modify();
+ }
+
+ DestroyNode();
+ }
+}
+
+void UEdNode_GenericGraphEdge::PrepareForCopying()
+{
+ GenericGraphEdge->Rename(nullptr, this, REN_DontCreateRedirectors | REN_DoNotDirty);
+}
+
+void UEdNode_GenericGraphEdge::CreateConnections(UEdNode_GenericGraphNode* Start, UEdNode_GenericGraphNode* End)
+{
+ Pins[0]->Modify();
+ Pins[0]->LinkedTo.Empty();
+
+ Start->GetOutputPin()->Modify();
+ Pins[0]->MakeLinkTo(Start->GetOutputPin());
+
+ // This to next
+ Pins[1]->Modify();
+ Pins[1]->LinkedTo.Empty();
+
+ End->GetInputPin()->Modify();
+ Pins[1]->MakeLinkTo(End->GetInputPin());
+}
+
+UEdNode_GenericGraphNode* UEdNode_GenericGraphEdge::GetStartNode()
+{
+ if (Pins[0]->LinkedTo.Num() > 0)
+ {
+ return Cast(Pins[0]->LinkedTo[0]->GetOwningNode());
+ }
+ else
+ {
+ return nullptr;
+ }
+}
+
+UEdNode_GenericGraphNode* UEdNode_GenericGraphEdge::GetEndNode()
+{
+ if (Pins[1]->LinkedTo.Num() > 0)
+ {
+ return Cast(Pins[1]->LinkedTo[0]->GetOwningNode());
+ }
+ else
+ {
+ return nullptr;
+ }
+}
+
+#undef LOCTEXT_NAMESPACE
+
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/EdNode_GenericGraphNode.cpp b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/EdNode_GenericGraphNode.cpp
new file mode 100644
index 00000000..9a487cf6
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/EdNode_GenericGraphNode.cpp
@@ -0,0 +1,84 @@
+#include "GenericGraphAssetEditor/EdNode_GenericGraphNode.h"
+#include "GenericGraphAssetEditor/EdGraph_GenericGraph.h"
+#include "Kismet2/Kismet2NameValidators.h"
+#include "Kismet2/BlueprintEditorUtils.h"
+
+#define LOCTEXT_NAMESPACE "EdNode_GenericGraph"
+
+UEdNode_GenericGraphNode::UEdNode_GenericGraphNode()
+{
+ bCanRenameNode = true;
+}
+
+UEdNode_GenericGraphNode::~UEdNode_GenericGraphNode()
+{
+
+}
+
+void UEdNode_GenericGraphNode::AllocateDefaultPins()
+{
+ CreatePin(EGPD_Input, "MultipleNodes", FName(), TEXT("In"));
+ CreatePin(EGPD_Output, "MultipleNodes", FName(), TEXT("Out"));
+}
+
+UEdGraph_GenericGraph* UEdNode_GenericGraphNode::GetGenericGraphEdGraph()
+{
+ return Cast(GetGraph());
+}
+
+FText UEdNode_GenericGraphNode::GetNodeTitle(ENodeTitleType::Type TitleType) const
+{
+ if (GenericGraphNode == nullptr)
+ {
+ return Super::GetNodeTitle(TitleType);
+ }
+ else
+ {
+ return GenericGraphNode->GetNodeTitle();
+ }
+}
+
+void UEdNode_GenericGraphNode::PrepareForCopying()
+{
+ GenericGraphNode->Rename(nullptr, this, REN_DontCreateRedirectors | REN_DoNotDirty);
+}
+
+void UEdNode_GenericGraphNode::AutowireNewNode(UEdGraphPin* FromPin)
+{
+ Super::AutowireNewNode(FromPin);
+
+ if (FromPin != nullptr)
+ {
+ if (GetSchema()->TryCreateConnection(FromPin, GetInputPin()))
+ {
+ FromPin->GetOwningNode()->NodeConnectionListChanged();
+ }
+ }
+}
+
+void UEdNode_GenericGraphNode::SetGenericGraphNode(UGenericGraphNode* InNode)
+{
+ GenericGraphNode = InNode;
+}
+
+FLinearColor UEdNode_GenericGraphNode::GetBackgroundColor() const
+{
+ return GenericGraphNode == nullptr ? FLinearColor::Black : GenericGraphNode->GetBackgroundColor();
+}
+
+UEdGraphPin* UEdNode_GenericGraphNode::GetInputPin() const
+{
+ return Pins[0];
+}
+
+UEdGraphPin* UEdNode_GenericGraphNode::GetOutputPin() const
+{
+ return Pins[1];
+}
+
+void UEdNode_GenericGraphNode::PostEditUndo()
+{
+ UEdGraphNode::PostEditUndo();
+}
+
+#undef LOCTEXT_NAMESPACE
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/EditorCommands_GenericGraph.cpp b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/EditorCommands_GenericGraph.cpp
new file mode 100644
index 00000000..8cd338f5
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/EditorCommands_GenericGraph.cpp
@@ -0,0 +1,11 @@
+#include "GenericGraphAssetEditor/EditorCommands_GenericGraph.h"
+
+#define LOCTEXT_NAMESPACE "EditorCommands_GenericGraph"
+
+void FEditorCommands_GenericGraph::RegisterCommands()
+{
+ UI_COMMAND(GraphSettings, "Graph Settings", "Graph Settings", EUserInterfaceActionType::Button, FInputChord());
+ UI_COMMAND(AutoArrange, "Auto Arrange", "Auto Arrange", EUserInterfaceActionType::Button, FInputChord());
+}
+
+#undef LOCTEXT_NAMESPACE
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/GenericGraphDragConnection.cpp b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/GenericGraphDragConnection.cpp
new file mode 100644
index 00000000..c8c3999d
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/GenericGraphDragConnection.cpp
@@ -0,0 +1,325 @@
+// Copyright Epic Games, Inc. All Rights Reserved.
+
+
+#include "GenericGraphAssetEditor/GenericGraphDragConnection.h"
+#include "Widgets/SBoxPanel.h"
+#include "Framework/Application/SlateApplication.h"
+#include "Widgets/Images/SImage.h"
+#include "EdGraph/EdGraph.h"
+#include "SGraphPanel.h"
+#include "ScopedTransaction.h"
+
+TSharedRef FGenericGraphDragConnection::New(const TSharedRef& GraphPanel, const FDraggedPinTable& DraggedPins)
+{
+ TSharedRef Operation = MakeShareable(new FGenericGraphDragConnection(GraphPanel, DraggedPins));
+ Operation->Construct();
+
+ return Operation;
+}
+
+void FGenericGraphDragConnection::OnDrop(bool bDropWasHandled, const FPointerEvent& MouseEvent)
+{
+ GraphPanel->OnStopMakingConnection();
+
+ Super::OnDrop(bDropWasHandled, MouseEvent);
+}
+
+void FGenericGraphDragConnection::OnDragged(const class FDragDropEvent& DragDropEvent)
+{
+ FVector2D TargetPosition = DragDropEvent.GetScreenSpacePosition();
+
+ // Reposition the info window wrt to the drag
+ CursorDecoratorWindow->MoveWindowTo(DragDropEvent.GetScreenSpacePosition() + DecoratorAdjust);
+ // Request the active panel to scroll if required
+ GraphPanel->RequestDeferredPan(TargetPosition);
+}
+
+void FGenericGraphDragConnection::HoverTargetChanged()
+{
+ TArray UniqueMessages;
+
+ if (UEdGraphPin* TargetPinObj = GetHoveredPin())
+ {
+ TArray ValidSourcePins;
+ ValidateGraphPinList(/*out*/ ValidSourcePins);
+
+ // Check the schema for connection responses
+ for (UEdGraphPin* StartingPinObj : ValidSourcePins)
+ {
+ // The Graph object in which the pins reside.
+ UEdGraph* GraphObj = StartingPinObj->GetOwningNode()->GetGraph();
+
+ // Determine what the schema thinks about the wiring action
+ const FPinConnectionResponse Response = GraphObj->GetSchema()->CanCreateConnection(StartingPinObj, TargetPinObj);
+
+ if (Response.Response == ECanCreateConnectionResponse::CONNECT_RESPONSE_DISALLOW)
+ {
+ TSharedPtr NodeWidget = TargetPinObj->GetOwningNode()->DEPRECATED_NodeWidget.Pin();
+ if (NodeWidget.IsValid())
+ {
+ NodeWidget->NotifyDisallowedPinConnection(StartingPinObj, TargetPinObj);
+ }
+ }
+
+ UniqueMessages.AddUnique(Response);
+ }
+ }
+ else if (UEdNode_GenericGraphNode* TargetNodeObj = Cast(GetHoveredNode()))
+ {
+ TArray ValidSourcePins;
+ ValidateGraphPinList(/*out*/ ValidSourcePins);
+
+ // Check the schema for connection responses
+ for (UEdGraphPin* StartingPinObj : ValidSourcePins)
+ {
+ FPinConnectionResponse Response;
+ FText ResponseText;
+
+ const UEdGraphSchema *Schema = StartingPinObj->GetSchema();
+ UEdGraphPin *TargetPin = TargetNodeObj->GetInputPin();
+
+ if (Schema && TargetPin)
+ {
+ Response = Schema->CanCreateConnection(StartingPinObj, TargetPin);
+ if (Response.Response == ECanCreateConnectionResponse::CONNECT_RESPONSE_DISALLOW)
+ {
+ TSharedPtr NodeWidget = TargetPin->GetOwningNode()->DEPRECATED_NodeWidget.Pin();
+ if (NodeWidget.IsValid())
+ {
+ NodeWidget->NotifyDisallowedPinConnection(StartingPinObj, TargetPinObj);
+ }
+ }
+ }
+ else
+ {
+#define LOCTEXT_NAMESPACE "AssetSchema_GenericGraph"
+ Response = FPinConnectionResponse(CONNECT_RESPONSE_DISALLOW, LOCTEXT("PinError", "Not a valid UGenericGraphEdNode"));
+#undef LOCTEXT_NAMESPACE
+ }
+
+ UniqueMessages.AddUnique(Response);
+ }
+ }
+ else if (UEdGraph* CurrentHoveredGraph = GetHoveredGraph())
+ {
+ TArray ValidSourcePins;
+ ValidateGraphPinList(/*out*/ ValidSourcePins);
+
+ for (UEdGraphPin* StartingPinObj : ValidSourcePins)
+ {
+ // Let the schema describe the connection we might make
+ FPinConnectionResponse Response = CurrentHoveredGraph->GetSchema()->CanCreateNewNodes(StartingPinObj);
+ if (!Response.Message.IsEmpty())
+ {
+ UniqueMessages.AddUnique(Response);
+ }
+ }
+ }
+
+ // Let the user know the status of dropping now
+ if (UniqueMessages.Num() == 0)
+ {
+ // Display the place a new node icon, we're not over a valid pin and have no message from the schema
+ SetSimpleFeedbackMessage(
+ FAppStyle::GetBrush(TEXT("Graph.ConnectorFeedback.NewNode")),
+ FLinearColor::White,
+ NSLOCTEXT("GraphEditor.Feedback", "PlaceNewNode", "Place a new node."));
+ }
+ else
+ {
+ // Take the unique responses and create visual feedback for it
+ TSharedRef FeedbackBox = SNew(SVerticalBox);
+ for (auto ResponseIt = UniqueMessages.CreateConstIterator(); ResponseIt; ++ResponseIt)
+ {
+ // Determine the icon
+ const FSlateBrush* StatusSymbol = NULL;
+
+ switch (ResponseIt->Response)
+ {
+ case CONNECT_RESPONSE_MAKE:
+ case CONNECT_RESPONSE_BREAK_OTHERS_A:
+ case CONNECT_RESPONSE_BREAK_OTHERS_B:
+ case CONNECT_RESPONSE_BREAK_OTHERS_AB:
+ StatusSymbol = FAppStyle::GetBrush(TEXT("Graph.ConnectorFeedback.OK"));
+ break;
+
+ case CONNECT_RESPONSE_MAKE_WITH_CONVERSION_NODE:
+ StatusSymbol = FAppStyle::GetBrush(TEXT("Graph.ConnectorFeedback.ViaCast"));
+ break;
+
+ case CONNECT_RESPONSE_DISALLOW:
+ default:
+ StatusSymbol = FAppStyle::GetBrush(TEXT("Graph.ConnectorFeedback.Error"));
+ break;
+ }
+
+ // Add a new message row
+ FeedbackBox->AddSlot()
+ .AutoHeight()
+ [
+ SNew(SHorizontalBox)
+ + SHorizontalBox::Slot()
+ .AutoWidth()
+ .Padding(3.0f)
+ .VAlign(VAlign_Center)
+ [
+ SNew(SImage).Image(StatusSymbol)
+ ]
+ + SHorizontalBox::Slot()
+ .AutoWidth()
+ .VAlign(VAlign_Center)
+ [
+ SNew(STextBlock).Text(ResponseIt->Message)
+ ]
+ ];
+ }
+
+ SetFeedbackMessage(FeedbackBox);
+ }
+}
+
+FGenericGraphDragConnection::FGenericGraphDragConnection(const TSharedRef& GraphPanelIn, const FDraggedPinTable& DraggedPinsIn)
+ : GraphPanel(GraphPanelIn)
+ , DraggingPins(DraggedPinsIn)
+ , DecoratorAdjust(FSlateApplication::Get().GetCursorSize())
+{
+ if (DraggingPins.Num() > 0)
+ {
+ const UEdGraphPin* PinObj = FDraggedPinTable::TConstIterator(DraggedPinsIn)->GetPinObj(*GraphPanelIn);
+ if (PinObj && PinObj->Direction == EGPD_Input)
+ {
+ DecoratorAdjust *= FVector2D(-1.0f, 1.0f);
+ }
+ }
+
+ for (const FGraphPinHandle& DraggedPin : DraggedPinsIn)
+ {
+ GraphPanelIn->OnBeginMakingConnection(DraggedPin);
+ }
+}
+
+FReply FGenericGraphDragConnection::DroppedOnPin(FVector2D ScreenPosition, FVector2D GraphPosition)
+{
+ TArray ValidSourcePins;
+ ValidateGraphPinList(/*out*/ ValidSourcePins);
+
+ const FScopedTransaction Transaction(NSLOCTEXT("UnrealEd", "GraphEd_CreateConnection", "Create Pin Link"));
+
+ UEdGraphPin* PinB = GetHoveredPin();
+ bool bError = false;
+ TSet NodeList;
+
+ for (UEdGraphPin* PinA : ValidSourcePins)
+ {
+ if ((PinA != NULL) && (PinB != NULL))
+ {
+ UEdGraph* MyGraphObj = PinA->GetOwningNode()->GetGraph();
+
+ if (MyGraphObj->GetSchema()->TryCreateConnection(PinA, PinB))
+ {
+ if (!PinA->IsPendingKill())
+ {
+ NodeList.Add(PinA->GetOwningNode());
+ }
+ if (!PinB->IsPendingKill())
+ {
+ NodeList.Add(PinB->GetOwningNode());
+ }
+ }
+ }
+ else
+ {
+ bError = true;
+ }
+ }
+
+ // Send all nodes that received a new pin connection a notification
+ for (auto It = NodeList.CreateConstIterator(); It; ++It)
+ {
+ UEdGraphNode* Node = (*It);
+ Node->NodeConnectionListChanged();
+ }
+
+ if (bError)
+ {
+ return FReply::Unhandled();
+ }
+
+ return FReply::Handled();
+}
+
+FReply FGenericGraphDragConnection::DroppedOnNode(FVector2D ScreenPosition, FVector2D GraphPosition)
+{
+ bool bHandledPinDropOnNode = false;
+ UEdGraphNode* NodeOver = GetHoveredNode();
+
+ if (NodeOver)
+ {
+ // Gather any source drag pins
+ TArray ValidSourcePins;
+ ValidateGraphPinList(/*out*/ ValidSourcePins);
+
+ if (ValidSourcePins.Num())
+ {
+ for (UEdGraphPin* SourcePin : ValidSourcePins)
+ {
+ // Check for pin drop support
+ FText ResponseText;
+ if (SourcePin->GetOwningNode() != NodeOver && SourcePin->GetSchema()->SupportsDropPinOnNode(NodeOver, SourcePin->PinType, SourcePin->Direction, ResponseText))
+ {
+ bHandledPinDropOnNode = true;
+
+ // Find which pin name to use and drop the pin on the node
+ const FName PinName = SourcePin->PinFriendlyName.IsEmpty() ? SourcePin->PinName : *SourcePin->PinFriendlyName.ToString();
+
+ const FScopedTransaction Transaction((SourcePin->Direction == EGPD_Output) ? NSLOCTEXT("UnrealEd", "AddInParam", "Add In Parameter") : NSLOCTEXT("UnrealEd", "AddOutParam", "Add Out Parameter"));
+
+ UEdGraphPin* EdGraphPin = NodeOver->GetSchema()->DropPinOnNode(GetHoveredNode(), PinName, SourcePin->PinType, SourcePin->Direction);
+
+ // This can invalidate the source pin due to node reconstruction, abort in that case
+ if (SourcePin->GetOwningNodeUnchecked() && EdGraphPin)
+ {
+ SourcePin->Modify();
+ EdGraphPin->Modify();
+ SourcePin->GetSchema()->TryCreateConnection(SourcePin, EdGraphPin);
+ }
+ }
+
+ // If we have not handled the pin drop on node and there is an error message, do not let other actions occur.
+ if (!bHandledPinDropOnNode && !ResponseText.IsEmpty())
+ {
+ bHandledPinDropOnNode = true;
+ }
+ }
+ }
+ }
+ return bHandledPinDropOnNode ? FReply::Handled() : FReply::Unhandled();
+}
+
+FReply FGenericGraphDragConnection::DroppedOnPanel(const TSharedRef< SWidget >& Panel, FVector2D ScreenPosition, FVector2D GraphPosition, UEdGraph& Graph)
+{
+ // Gather any source drag pins
+ TArray PinObjects;
+ ValidateGraphPinList(/*out*/ PinObjects);
+
+ // Create a context menu
+ TSharedPtr WidgetToFocus = GraphPanel->SummonContextMenu(ScreenPosition, GraphPosition, NULL, NULL, PinObjects);
+
+ // Give the context menu focus
+ return (WidgetToFocus.IsValid())
+ ? FReply::Handled().SetUserFocus(WidgetToFocus.ToSharedRef(), EFocusCause::SetDirectly)
+ : FReply::Handled();
+}
+
+
+void FGenericGraphDragConnection::ValidateGraphPinList(TArray& OutValidPins)
+{
+ OutValidPins.Empty(DraggingPins.Num());
+ for (const FGraphPinHandle& PinHandle : DraggingPins)
+ {
+ if (UEdGraphPin* GraphPin = PinHandle.GetPinObj(*GraphPanel))
+ {
+ OutValidPins.Add(GraphPin);
+ }
+ }
+}
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/GenericGraphEditorStyle.cpp b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/GenericGraphEditorStyle.cpp
new file mode 100644
index 00000000..6870128f
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/GenericGraphEditorStyle.cpp
@@ -0,0 +1,54 @@
+#include "GenericGraphAssetEditor/GenericGraphEditorStyle.h"
+#include "Styling/SlateStyleRegistry.h"
+#include "Styling/SlateTypes.h"
+#include "Misc/Paths.h"
+
+TSharedPtr FGenericGraphEditorStyle::StyleSet = nullptr;
+
+#define IMAGE_BRUSH( RelativePath, ... ) FSlateImageBrush( StyleSet->RootToContentDir( RelativePath, TEXT(".png") ), __VA_ARGS__ )
+#define BOX_BRUSH( RelativePath, ... ) FSlateBoxBrush( StyleSet->RootToContentDir( RelativePath, TEXT(".png") ), __VA_ARGS__ )
+#define BORDER_BRUSH( RelativePath, ... ) FSlateBorderBrush( StyleSet->RootToContentDir( RelativePath, TEXT(".png") ), __VA_ARGS__ )
+#define TTF_FONT( RelativePath, ... ) FSlateFontInfo( StyleSet->RootToContentDir( RelativePath, TEXT(".ttf") ), __VA_ARGS__ )
+#define OTF_FONT( RelativePath, ... ) FSlateFontInfo( StyleSet->RootToContentDir( RelativePath, TEXT(".otf") ), __VA_ARGS__ )
+
+void FGenericGraphEditorStyle::Initialize()
+{
+ const FVector2D Icon20x20(20.0f, 20.0f);
+ const FVector2D Icon40x40(40.0f, 40.0f);
+ const FVector2D Icon64x64(64.0f, 64.0f);
+
+ if (StyleSet.IsValid())
+ {
+ return;
+ }
+
+ StyleSet = MakeShareable(new FSlateStyleSet("GenericGraphEditorStyle"));
+
+ StyleSet->SetContentRoot(FPaths::ProjectPluginsDir() / TEXT("GenericGraph/Resources"));
+
+ StyleSet->Set("GenericGraphEditor.AutoArrange", new IMAGE_BRUSH("AutoArrangeIcon", Icon40x40));
+ StyleSet->Set("GenericGraphEditor.AutoArrange.Small", new IMAGE_BRUSH( "AutoArrangeIcon", Icon20x20 ) );
+
+ FSlateStyleRegistry::RegisterSlateStyle(*StyleSet.Get());
+}
+
+void FGenericGraphEditorStyle::Shutdown()
+{
+ if (StyleSet.IsValid())
+ {
+ FSlateStyleRegistry::UnRegisterSlateStyle(*StyleSet.Get());
+ ensure(StyleSet.IsUnique());
+ StyleSet.Reset();
+ }
+}
+
+const FName& FGenericGraphEditorStyle::GetStyleSetName()
+{
+ return StyleSet->GetStyleSetName();
+}
+
+#undef IMAGE_BRUSH
+#undef BOX_BRUSH
+#undef BORDER_BRUSH
+#undef TTF_FONT
+#undef OTF_FONT
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/SEdNode_GenericGraphEdge.cpp b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/SEdNode_GenericGraphEdge.cpp
new file mode 100644
index 00000000..d46b0777
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/SEdNode_GenericGraphEdge.cpp
@@ -0,0 +1,199 @@
+#include "GenericGraphAssetEditor/SEdNode_GenericGraphEdge.h"
+#include "Widgets/SBoxPanel.h"
+#include "Widgets/Images/SImage.h"
+#include "Widgets/Text/SInlineEditableTextBlock.h"
+#include "Widgets/SToolTip.h"
+#include "SGraphPanel.h"
+#include "EdGraphSchema_K2.h"
+#include "GenericGraphAssetEditor/EdNode_GenericGraphNode.h"
+#include "GenericGraphAssetEditor/EdNode_GenericGraphEdge.h"
+#include "GenericGraphAssetEditor/ConnectionDrawingPolicy_GenericGraph.h"
+
+#define LOCTEXT_NAMESPACE "SGenericGraphEdge"
+
+void SEdNode_GenericGraphEdge::Construct(const FArguments& InArgs, UEdNode_GenericGraphEdge* InNode)
+{
+ this->GraphNode = InNode;
+ this->UpdateGraphNode();
+}
+
+bool SEdNode_GenericGraphEdge::RequiresSecondPassLayout() const
+{
+ return true;
+}
+
+void SEdNode_GenericGraphEdge::PerformSecondPassLayout(const TMap< UObject*, TSharedRef >& NodeToWidgetLookup) const
+{
+ UEdNode_GenericGraphEdge* EdgeNode = CastChecked(GraphNode);
+
+ FGeometry StartGeom;
+ FGeometry EndGeom;
+
+ UEdNode_GenericGraphNode* Start = EdgeNode->GetStartNode();
+ UEdNode_GenericGraphNode* End = EdgeNode->GetEndNode();
+ if (Start != nullptr && End != nullptr)
+ {
+ const TSharedRef* pFromWidget = NodeToWidgetLookup.Find(Start);
+ const TSharedRef* pToWidget = NodeToWidgetLookup.Find(End);
+ if (pFromWidget != nullptr && pToWidget != nullptr)
+ {
+ const TSharedRef& FromWidget = *pFromWidget;
+ const TSharedRef& ToWidget = *pToWidget;
+
+ StartGeom = FGeometry(FVector2D(Start->NodePosX, Start->NodePosY), FVector2D::ZeroVector, FromWidget->GetDesiredSize(), 1.0f);
+ EndGeom = FGeometry(FVector2D(End->NodePosX, End->NodePosY), FVector2D::ZeroVector, ToWidget->GetDesiredSize(), 1.0f);
+ }
+ }
+
+ PositionBetweenTwoNodesWithOffset(StartGeom, EndGeom, 0, 1);
+}
+
+void SEdNode_GenericGraphEdge::OnNameTextCommited(const FText& InText, ETextCommit::Type CommitInfo)
+{
+ SGraphNode::OnNameTextCommited(InText, CommitInfo);
+
+ UEdNode_GenericGraphEdge* MyNode = CastChecked(GraphNode);
+
+ if (MyNode != nullptr && MyNode->GenericGraphEdge != nullptr)
+ {
+ const FScopedTransaction Transaction(LOCTEXT("GenericGraphEditorRenameEdge", "Generic Graph Editor: Rename Edge"));
+ MyNode->Modify();
+ MyNode->GenericGraphEdge->SetNodeTitle(InText);
+ UpdateGraphNode();
+ }
+}
+
+void SEdNode_GenericGraphEdge::UpdateGraphNode()
+{
+ InputPins.Empty();
+ OutputPins.Empty();
+
+ RightNodeBox.Reset();
+ LeftNodeBox.Reset();
+
+ TSharedPtr NodeTitle = SNew(SNodeTitle, GraphNode);
+
+ this->ContentScale.Bind( this, &SGraphNode::GetContentScale );
+ this->GetOrAddSlot( ENodeZone::Center )
+ .HAlign(HAlign_Center)
+ .VAlign(VAlign_Center)
+ [
+ SNew(SOverlay)
+ + SOverlay::Slot()
+ [
+ SNew(SImage)
+ .Image(FAppStyle::GetBrush("Graph.TransitionNode.ColorSpill"))
+ .ColorAndOpacity(this, &SEdNode_GenericGraphEdge::GetEdgeColor)
+ ]
+ + SOverlay::Slot()
+ [
+ SNew(SImage)
+ .Image(this, &SEdNode_GenericGraphEdge::GetEdgeImage)
+ .Visibility(this, &SEdNode_GenericGraphEdge::GetEdgeImageVisibility)
+ ]
+
+ + SOverlay::Slot()
+ .Padding(FMargin(4.0f, 4.0f, 4.0f, 4.0f))
+ [
+ SNew(SVerticalBox)
+ + SVerticalBox::Slot()
+ .HAlign(HAlign_Center)
+ .AutoHeight()
+ [
+ SAssignNew(InlineEditableText, SInlineEditableTextBlock)
+ .ColorAndOpacity(FLinearColor::Black)
+ .Visibility(this, &SEdNode_GenericGraphEdge::GetEdgeTitleVisbility)
+ .Font(FCoreStyle::GetDefaultFontStyle("Regular", 12))
+ .Text(NodeTitle.Get(), &SNodeTitle::GetHeadTitle)
+ .OnTextCommitted(this, &SEdNode_GenericGraphEdge::OnNameTextCommited)
+ ]
+ + SVerticalBox::Slot()
+ .AutoHeight()
+ [
+ NodeTitle.ToSharedRef()
+ ]
+
+ ]
+ ];
+}
+
+void SEdNode_GenericGraphEdge::PositionBetweenTwoNodesWithOffset(const FGeometry& StartGeom, const FGeometry& EndGeom, int32 NodeIndex, int32 MaxNodes) const
+{
+ // Get a reasonable seed point (halfway between the boxes)
+ const FVector2D StartCenter = FGeometryHelper::CenterOf(StartGeom);
+ const FVector2D EndCenter = FGeometryHelper::CenterOf(EndGeom);
+ const FVector2D SeedPoint = (StartCenter + EndCenter) * 0.5f;
+
+ // Find the (approximate) closest points between the two boxes
+ const FVector2D StartAnchorPoint = FGeometryHelper::FindClosestPointOnGeom(StartGeom, SeedPoint);
+ const FVector2D EndAnchorPoint = FGeometryHelper::FindClosestPointOnGeom(EndGeom, SeedPoint);
+
+ // Position ourselves halfway along the connecting line between the nodes, elevated away perpendicular to the direction of the line
+ const float Height = 30.0f;
+
+ const FVector2D DesiredNodeSize = GetDesiredSize();
+
+ FVector2D DeltaPos(EndAnchorPoint - StartAnchorPoint);
+
+ if (DeltaPos.IsNearlyZero())
+ {
+ DeltaPos = FVector2D(10.0f, 0.0f);
+ }
+
+ const FVector2D Normal = FVector2D(DeltaPos.Y, -DeltaPos.X).GetSafeNormal();
+
+ const FVector2D NewCenter = StartAnchorPoint + (0.5f * DeltaPos) + (Height * Normal);
+
+ FVector2D DeltaNormal = DeltaPos.GetSafeNormal();
+
+ // Calculate node offset in the case of multiple transitions between the same two nodes
+ // MultiNodeOffset: the offset where 0 is the centre of the transition, -1 is 1
+ // towards the PrevStateNode and +1 is 1 towards the NextStateNode.
+
+ const float MutliNodeSpace = 0.2f; // Space between multiple transition nodes (in units of )
+ const float MultiNodeStep = (1.f + MutliNodeSpace); //Step between node centres (Size of node + size of node spacer)
+
+ const float MultiNodeStart = -((MaxNodes - 1) * MultiNodeStep) / 2.f;
+ const float MultiNodeOffset = MultiNodeStart + (NodeIndex * MultiNodeStep);
+
+ // Now we need to adjust the new center by the node size, zoom factor and multi node offset
+ const FVector2D NewCorner = NewCenter - (0.5f * DesiredNodeSize) + (DeltaNormal * MultiNodeOffset * DesiredNodeSize.Size());
+
+ GraphNode->NodePosX = NewCorner.X;
+ GraphNode->NodePosY = NewCorner.Y;
+}
+
+FSlateColor SEdNode_GenericGraphEdge::GetEdgeColor() const
+{
+ UEdNode_GenericGraphEdge* EdgeNode = CastChecked(GraphNode);
+ if (EdgeNode != nullptr && EdgeNode->GenericGraphEdge != nullptr)
+ {
+ return EdgeNode->GenericGraphEdge->GetEdgeColour();
+ }
+ return FLinearColor(0.9f, 0.9f, 0.9f, 1.0f);
+}
+
+const FSlateBrush* SEdNode_GenericGraphEdge::GetEdgeImage() const
+{
+ return FAppStyle::GetBrush("Graph.TransitionNode.Icon");
+}
+
+EVisibility SEdNode_GenericGraphEdge::GetEdgeImageVisibility() const
+{
+ UEdNode_GenericGraphEdge* EdgeNode = CastChecked(GraphNode);
+ if (EdgeNode && EdgeNode->GenericGraphEdge && EdgeNode->GenericGraphEdge->bShouldDrawTitle)
+ return EVisibility::Hidden;
+
+ return EVisibility::Visible;
+}
+
+EVisibility SEdNode_GenericGraphEdge::GetEdgeTitleVisbility() const
+{
+ UEdNode_GenericGraphEdge* EdgeNode = CastChecked(GraphNode);
+ if (EdgeNode && EdgeNode->GenericGraphEdge && EdgeNode->GenericGraphEdge->bShouldDrawTitle)
+ return EVisibility::Visible;
+
+ return EVisibility::Collapsed;
+}
+
+#undef LOCTEXT_NAMESPACE
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/SEdNode_GenericGraphNode.cpp b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/SEdNode_GenericGraphNode.cpp
new file mode 100644
index 00000000..d69e7eea
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/SEdNode_GenericGraphNode.cpp
@@ -0,0 +1,336 @@
+#include "GenericGraphAssetEditor/SEdNode_GenericGraphNode.h"
+#include "GenericGraphEditorPCH.h"
+#include "GenericGraphAssetEditor/Colors_GenericGraph.h"
+#include "SLevelOfDetailBranchNode.h"
+#include "Widgets/Text/SInlineEditableTextBlock.h"
+#include "SCommentBubble.h"
+#include "SlateOptMacros.h"
+#include "SGraphPin.h"
+#include "GraphEditorSettings.h"
+#include "GenericGraphAssetEditor/EdNode_GenericGraphNode.h"
+#include "GenericGraphAssetEditor/GenericGraphDragConnection.h"
+
+#define LOCTEXT_NAMESPACE "EdNode_GenericGraph"
+
+//////////////////////////////////////////////////////////////////////////
+class SGenericGraphPin : public SGraphPin
+{
+public:
+ SLATE_BEGIN_ARGS(SGenericGraphPin) {}
+ SLATE_END_ARGS()
+
+ void Construct(const FArguments& InArgs, UEdGraphPin* InPin)
+ {
+ this->SetCursor(EMouseCursor::Default);
+
+ bShowLabel = true;
+
+ GraphPinObj = InPin;
+ check(GraphPinObj != nullptr);
+
+ const UEdGraphSchema* Schema = GraphPinObj->GetSchema();
+ check(Schema);
+
+ SBorder::Construct(SBorder::FArguments()
+ .BorderImage(this, &SGenericGraphPin::GetPinBorder)
+ .BorderBackgroundColor(this, &SGenericGraphPin::GetPinColor)
+ .OnMouseButtonDown(this, &SGenericGraphPin::OnPinMouseDown)
+ .Cursor(this, &SGenericGraphPin::GetPinCursor)
+ .Padding(FMargin(5.0f))
+ );
+ }
+
+protected:
+ virtual FSlateColor GetPinColor() const override
+ {
+ return GenericGraphColors::Pin::Default;
+ }
+
+ virtual TSharedRef GetDefaultValueWidget() override
+ {
+ return SNew(STextBlock);
+ }
+
+ const FSlateBrush* GetPinBorder() const
+ {
+ return FAppStyle::GetBrush(TEXT("Graph.StateNode.Body"));
+ }
+
+ virtual TSharedRef SpawnPinDragEvent(const TSharedRef& InGraphPanel, const TArray< TSharedRef >& InStartingPins) override
+ {
+ FGenericGraphDragConnection::FDraggedPinTable PinHandles;
+ PinHandles.Reserve(InStartingPins.Num());
+ // since the graph can be refreshed and pins can be reconstructed/replaced
+ // behind the scenes, the DragDropOperation holds onto FGraphPinHandles
+ // instead of direct widgets/graph-pins
+ for (const TSharedRef& PinWidget : InStartingPins)
+ {
+ PinHandles.Add(PinWidget->GetPinObj());
+ }
+
+ return FGenericGraphDragConnection::New(InGraphPanel, PinHandles);
+ }
+
+};
+
+
+//////////////////////////////////////////////////////////////////////////
+void SEdNode_GenericGraphNode::Construct(const FArguments& InArgs, UEdNode_GenericGraphNode* InNode)
+{
+ GraphNode = InNode;
+ UpdateGraphNode();
+ InNode->SEdNode = this;
+}
+
+BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
+void SEdNode_GenericGraphNode::UpdateGraphNode()
+{
+ const FMargin NodePadding = FMargin(5);
+ const FMargin NamePadding = FMargin(2);
+
+ InputPins.Empty();
+ OutputPins.Empty();
+
+ // Reset variables that are going to be exposed, in case we are refreshing an already setup node.
+ RightNodeBox.Reset();
+ LeftNodeBox.Reset();
+
+ const FSlateBrush *NodeTypeIcon = GetNameIcon();
+
+ FLinearColor TitleShadowColor(0.6f, 0.6f, 0.6f);
+ TSharedPtr ErrorText;
+ TSharedPtr NodeBody;
+ TSharedPtr NodeTitle = SNew(SNodeTitle, GraphNode);
+
+ this->ContentScale.Bind(this, &SGraphNode::GetContentScale);
+ this->GetOrAddSlot(ENodeZone::Center)
+ .HAlign(HAlign_Fill)
+ .VAlign(VAlign_Center)
+ [
+ SNew(SBorder)
+ .BorderImage(FAppStyle::GetBrush("Graph.StateNode.Body"))
+ .Padding(0.0f)
+ .BorderBackgroundColor(this, &SEdNode_GenericGraphNode::GetBorderBackgroundColor)
+ [
+ SNew(SOverlay)
+
+ + SOverlay::Slot()
+ .HAlign(HAlign_Fill)
+ .VAlign(VAlign_Fill)
+ [
+ SNew(SVerticalBox)
+
+ // Input Pin Area
+ + SVerticalBox::Slot()
+ .FillHeight(1)
+ [
+ SAssignNew(LeftNodeBox, SVerticalBox)
+ ]
+
+ // Output Pin Area
+ + SVerticalBox::Slot()
+ .FillHeight(1)
+ [
+ SAssignNew(RightNodeBox, SVerticalBox)
+ ]
+ ]
+
+ + SOverlay::Slot()
+ .HAlign(HAlign_Center)
+ .VAlign(VAlign_Center)
+ .Padding(8.0f)
+ [
+ SNew(SBorder)
+ .BorderImage(FAppStyle::GetBrush("Graph.StateNode.ColorSpill"))
+ .BorderBackgroundColor(TitleShadowColor)
+ .HAlign(HAlign_Center)
+ .VAlign(VAlign_Center)
+ .Visibility(EVisibility::SelfHitTestInvisible)
+ .Padding(6.0f)
+ [
+ SAssignNew(NodeBody, SVerticalBox)
+
+ // Title
+ + SVerticalBox::Slot()
+ .AutoHeight()
+ [
+ SNew(SHorizontalBox)
+
+ // Error message
+ + SHorizontalBox::Slot()
+ .AutoWidth()
+ [
+ SAssignNew(ErrorText, SErrorText)
+ .BackgroundColor(this, &SEdNode_GenericGraphNode::GetErrorColor)
+ .ToolTipText(this, &SEdNode_GenericGraphNode::GetErrorMsgToolTip)
+ ]
+
+ // Icon
+ +SHorizontalBox::Slot()
+ .AutoWidth()
+ .VAlign(VAlign_Center)
+ [
+ SNew(SImage)
+ .Image(NodeTypeIcon)
+ ]
+
+ // Node Title
+ + SHorizontalBox::Slot()
+ .Padding(FMargin(4.0f, 0.0f, 4.0f, 0.0f))
+ [
+ SNew(SVerticalBox)
+ + SVerticalBox::Slot()
+ .AutoHeight()
+ [
+ SAssignNew(InlineEditableText, SInlineEditableTextBlock)
+ .Style(FAppStyle::Get(), "Graph.StateNode.NodeTitleInlineEditableText")
+ .Text(NodeTitle.Get(), &SNodeTitle::GetHeadTitle)
+ .OnVerifyTextChanged(this, &SEdNode_GenericGraphNode::OnVerifyNameTextChanged)
+ .OnTextCommitted(this, &SEdNode_GenericGraphNode::OnNameTextCommited)
+ .IsReadOnly(this, &SEdNode_GenericGraphNode::IsNameReadOnly)
+ .IsSelected(this, &SEdNode_GenericGraphNode::IsSelectedExclusively)
+ ]
+ + SVerticalBox::Slot()
+ .AutoHeight()
+ [
+ NodeTitle.ToSharedRef()
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]
+ ];
+
+ // Create comment bubble
+ TSharedPtr CommentBubble;
+ const FSlateColor CommentColor = GetDefault()->DefaultCommentNodeTitleColor;
+
+ SAssignNew(CommentBubble, SCommentBubble)
+ .GraphNode(GraphNode)
+ .Text(this, &SGraphNode::GetNodeComment)
+ .OnTextCommitted(this, &SGraphNode::OnCommentTextCommitted)
+ .ColorAndOpacity(CommentColor)
+ .AllowPinning(true)
+ .EnableTitleBarBubble(true)
+ .EnableBubbleCtrls(true)
+ .GraphLOD(this, &SGraphNode::GetCurrentLOD)
+ .IsGraphNodeHovered(this, &SGraphNode::IsHovered);
+
+ GetOrAddSlot(ENodeZone::TopCenter)
+ .SlotOffset(TAttribute(CommentBubble.Get(), &SCommentBubble::GetOffset))
+ .SlotSize(TAttribute(CommentBubble.Get(), &SCommentBubble::GetSize))
+ .AllowScaling(TAttribute(CommentBubble.Get(), &SCommentBubble::IsScalingAllowed))
+ .VAlign(VAlign_Top)
+ [
+ CommentBubble.ToSharedRef()
+ ];
+
+ ErrorReporting = ErrorText;
+ ErrorReporting->SetError(ErrorMsg);
+ CreatePinWidgets();
+}
+
+void SEdNode_GenericGraphNode::CreatePinWidgets()
+{
+ UEdNode_GenericGraphNode* StateNode = CastChecked(GraphNode);
+
+ for (int32 PinIdx = 0; PinIdx < StateNode->Pins.Num(); PinIdx++)
+ {
+ UEdGraphPin* MyPin = StateNode->Pins[PinIdx];
+ if (!MyPin->bHidden)
+ {
+ TSharedPtr NewPin = SNew(SGenericGraphPin, MyPin);
+
+ AddPin(NewPin.ToSharedRef());
+ }
+ }
+}
+
+void SEdNode_GenericGraphNode::AddPin(const TSharedRef& PinToAdd)
+{
+ PinToAdd->SetOwner(SharedThis(this));
+
+ const UEdGraphPin* PinObj = PinToAdd->GetPinObj();
+ const bool bAdvancedParameter = PinObj && PinObj->bAdvancedView;
+ if (bAdvancedParameter)
+ {
+ PinToAdd->SetVisibility( TAttribute(PinToAdd, &SGraphPin::IsPinVisibleAsAdvanced) );
+ }
+
+ TSharedPtr PinBox;
+ if (PinToAdd->GetDirection() == EEdGraphPinDirection::EGPD_Input)
+ {
+ PinBox = LeftNodeBox;
+ InputPins.Add(PinToAdd);
+ }
+ else // Direction == EEdGraphPinDirection::EGPD_Output
+ {
+ PinBox = RightNodeBox;
+ OutputPins.Add(PinToAdd);
+ }
+
+ if (PinBox)
+ {
+ PinBox->AddSlot()
+ .HAlign(HAlign_Fill)
+ .VAlign(VAlign_Fill)
+ .FillHeight(1.0f)
+ //.Padding(6.0f, 0.0f)
+ [
+ PinToAdd
+ ];
+ }
+}
+
+bool SEdNode_GenericGraphNode::IsNameReadOnly() const
+{
+ UEdNode_GenericGraphNode* EdNode_Node = Cast(GraphNode);
+ check(EdNode_Node != nullptr);
+
+ UGenericGraph* GenericGraph = EdNode_Node->GenericGraphNode->Graph;
+ check(GenericGraph != nullptr);
+
+ return (!GenericGraph->bCanRenameNode || !EdNode_Node->GenericGraphNode->IsNameEditable()) || SGraphNode::IsNameReadOnly();
+}
+
+END_SLATE_FUNCTION_BUILD_OPTIMIZATION
+
+void SEdNode_GenericGraphNode::OnNameTextCommited(const FText& InText, ETextCommit::Type CommitInfo)
+{
+ SGraphNode::OnNameTextCommited(InText, CommitInfo);
+
+ UEdNode_GenericGraphNode* MyNode = CastChecked(GraphNode);
+
+ if (MyNode != nullptr && MyNode->GenericGraphNode != nullptr)
+ {
+ const FScopedTransaction Transaction(LOCTEXT("GenericGraphEditorRenameNode", "Generic Graph Editor: Rename Node"));
+ MyNode->Modify();
+ MyNode->GenericGraphNode->Modify();
+ MyNode->GenericGraphNode->SetNodeTitle(InText);
+ UpdateGraphNode();
+ }
+}
+
+FSlateColor SEdNode_GenericGraphNode::GetBorderBackgroundColor() const
+{
+ UEdNode_GenericGraphNode* MyNode = CastChecked(GraphNode);
+ return MyNode ? MyNode->GetBackgroundColor() : GenericGraphColors::NodeBorder::HighlightAbortRange0;
+}
+
+FSlateColor SEdNode_GenericGraphNode::GetBackgroundColor() const
+{
+ return GenericGraphColors::NodeBody::Default;
+}
+
+EVisibility SEdNode_GenericGraphNode::GetDragOverMarkerVisibility() const
+{
+ return EVisibility::Visible;
+}
+
+const FSlateBrush* SEdNode_GenericGraphNode::GetNameIcon() const
+{
+ return FAppStyle::GetBrush(TEXT("BTEditor.Graph.BTNode.Icon"));
+}
+
+#undef LOCTEXT_NAMESPACE
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/Settings_GenericGraphEditor.cpp b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/Settings_GenericGraphEditor.cpp
new file mode 100644
index 00000000..a5180a8d
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphAssetEditor/Settings_GenericGraphEditor.cpp
@@ -0,0 +1,24 @@
+#include "GenericGraphAssetEditor/Settings_GenericGraphEditor.h"
+
+UGenericGraphEditorSettings::UGenericGraphEditorSettings()
+{
+ AutoLayoutStrategy = EAutoLayoutStrategy::Tree;
+
+ bFirstPassOnly = false;
+
+ bRandomInit = false;
+
+ OptimalDistance = 100.f;
+
+ MaxIteration = 50;
+
+ InitTemperature = 10.f;
+
+ CoolDownRate = 10.f;
+}
+
+UGenericGraphEditorSettings::~UGenericGraphEditorSettings()
+{
+
+}
+
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphEditor.cpp b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphEditor.cpp
new file mode 100644
index 00000000..b83d1f6d
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphEditor.cpp
@@ -0,0 +1,55 @@
+#include "GenericGraphEditor.h"
+#include "GenericGraphNodeFactory.h"
+#include "AssetTypeActions_GenericGraph.h"
+#include "GenericGraphAssetEditor/GenericGraphEditorStyle.h"
+
+DEFINE_LOG_CATEGORY(GenericGraphEditor)
+
+#define LOCTEXT_NAMESPACE "Editor_GenericGraph"
+
+void FGenericGraphEditor::StartupModule()
+{
+ FGenericGraphEditorStyle::Initialize();
+
+ GraphPanelNodeFactory_GenericGraph = MakeShareable(new FGraphPanelNodeFactory_GenericGraph());
+ FEdGraphUtilities::RegisterVisualNodeFactory(GraphPanelNodeFactory_GenericGraph);
+
+ IAssetTools& AssetTools = FModuleManager::LoadModuleChecked("AssetTools").Get();
+
+ GenericGraphAssetCategoryBit = AssetTools.RegisterAdvancedAssetCategory(FName(TEXT("GenericGraph")), LOCTEXT("GenericGraphAssetCategory", "GenericGraph"));
+
+ RegisterAssetTypeAction(AssetTools, MakeShareable(new FAssetTypeActions_GenericGraph(GenericGraphAssetCategoryBit)));
+}
+
+
+void FGenericGraphEditor::ShutdownModule()
+{
+ // Unregister all the asset types that we registered
+ if (FModuleManager::Get().IsModuleLoaded("AssetTools"))
+ {
+ IAssetTools& AssetTools = FModuleManager::GetModuleChecked("AssetTools").Get();
+ for (int32 Index = 0; Index < CreatedAssetTypeActions.Num(); ++Index)
+ {
+ AssetTools.UnregisterAssetTypeActions(CreatedAssetTypeActions[Index].ToSharedRef());
+ }
+ }
+
+ if (GraphPanelNodeFactory_GenericGraph.IsValid())
+ {
+ FEdGraphUtilities::UnregisterVisualNodeFactory(GraphPanelNodeFactory_GenericGraph);
+ GraphPanelNodeFactory_GenericGraph.Reset();
+ }
+
+ FGenericGraphEditorStyle::Shutdown();
+}
+
+void FGenericGraphEditor::RegisterAssetTypeAction(IAssetTools& AssetTools, TSharedRef Action)
+{
+ AssetTools.RegisterAssetTypeActions(Action);
+ CreatedAssetTypeActions.Add(Action);
+}
+
+IMPLEMENT_MODULE(FGenericGraphEditor, GenericGraphEditor)
+
+#undef LOCTEXT_NAMESPACE
+
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphFactory.cpp b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphFactory.cpp
new file mode 100644
index 00000000..4c9fc7bb
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphFactory.cpp
@@ -0,0 +1,117 @@
+#include "GenericGraphFactory.h"
+#include "GenericGraph.h"
+
+#include "ClassViewerModule.h"
+#include "ClassViewerFilter.h"
+#include "Kismet2/KismetEditorUtilities.h"
+#include "Kismet2/SClassPickerDialog.h"
+
+#define LOCTEXT_NAMESPACE "GenericGraphFactory"
+
+class FAssetClassParentFilter : public IClassViewerFilter
+{
+public:
+ FAssetClassParentFilter()
+ : DisallowedClassFlags(CLASS_None), bDisallowBlueprintBase(false)
+ {}
+
+ /** All children of these classes will be included unless filtered out by another setting. */
+ TSet< const UClass* > AllowedChildrenOfClasses;
+
+ /** Disallowed class flags. */
+ EClassFlags DisallowedClassFlags;
+
+ /** Disallow blueprint base classes. */
+ bool bDisallowBlueprintBase;
+
+ virtual bool IsClassAllowed(const FClassViewerInitializationOptions& InInitOptions, const UClass* InClass, TSharedRef< FClassViewerFilterFuncs > InFilterFuncs) override
+ {
+ bool bAllowed= !InClass->HasAnyClassFlags(DisallowedClassFlags)
+ && InFilterFuncs->IfInChildOfClassesSet(AllowedChildrenOfClasses, InClass) != EFilterReturn::Failed;
+
+ if (bAllowed && bDisallowBlueprintBase)
+ {
+ if (FKismetEditorUtilities::CanCreateBlueprintOfClass(InClass))
+ {
+ return false;
+ }
+ }
+
+ return bAllowed;
+ }
+
+ virtual bool IsUnloadedClassAllowed(const FClassViewerInitializationOptions& InInitOptions, const TSharedRef< const IUnloadedBlueprintData > InUnloadedClassData, TSharedRef< FClassViewerFilterFuncs > InFilterFuncs) override
+ {
+ if (bDisallowBlueprintBase)
+ {
+ return false;
+ }
+
+ return !InUnloadedClassData->HasAnyClassFlags(DisallowedClassFlags)
+ && InFilterFuncs->IfInChildOfClassesSet(AllowedChildrenOfClasses, InUnloadedClassData) != EFilterReturn::Failed;
+ }
+};
+
+
+UGenericGraphFactory::UGenericGraphFactory()
+{
+ bCreateNew = true;
+ bEditAfterNew = true;
+ SupportedClass = UGenericGraph::StaticClass();
+}
+
+UGenericGraphFactory::~UGenericGraphFactory()
+{
+
+}
+
+bool UGenericGraphFactory::ConfigureProperties()
+{
+ // nullptr the GenericGraphClass so we can check for selection
+ GenericGraphClass = nullptr;
+
+ // Load the classviewer module to display a class picker
+ FClassViewerModule& ClassViewerModule = FModuleManager::LoadModuleChecked("ClassViewer");
+
+ // Fill in options
+ FClassViewerInitializationOptions Options;
+ Options.Mode = EClassViewerMode::ClassPicker;
+
+#if ENGINE_MAJOR_VERSION < 5
+ TSharedPtr Filter = MakeShareable(new FAssetClassParentFilter);
+ Options.ClassFilter = Filter;
+#else // #if ENGINE_MAJOR_VERSION < 5
+ TSharedRef Filter = MakeShareable(new FAssetClassParentFilter);
+ Options.ClassFilters.Add(Filter);
+#endif // #else // #if ENGINE_MAJOR_VERSION < 5
+
+ Filter->DisallowedClassFlags = CLASS_Abstract | CLASS_Deprecated | CLASS_NewerVersionExists | CLASS_HideDropDown;
+ Filter->AllowedChildrenOfClasses.Add(UGenericGraph::StaticClass());
+
+ const FText TitleText = LOCTEXT("CreateGenericGraphAssetOptions", "Pick Generic Graph Class");
+ UClass* ChosenClass = nullptr;
+ const bool bPressedOk = SClassPickerDialog::PickClass(TitleText, Options, ChosenClass, UGenericGraph::StaticClass());
+
+ if ( bPressedOk )
+ {
+ GenericGraphClass = ChosenClass;
+ }
+
+ return bPressedOk;
+}
+
+UObject* UGenericGraphFactory::FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn)
+{
+ if (GenericGraphClass != nullptr)
+ {
+ return NewObject(InParent, GenericGraphClass, Name, Flags | RF_Transactional);
+ }
+ else
+ {
+ check(Class->IsChildOf(UGenericGraph::StaticClass()));
+ return NewObject(InParent, Class, Name, Flags | RF_Transactional);
+ }
+
+}
+
+#undef LOCTEXT_NAMESPACE
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphNodeFactory.cpp b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphNodeFactory.cpp
new file mode 100644
index 00000000..e79dd2cf
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Private/GenericGraphNodeFactory.cpp
@@ -0,0 +1,20 @@
+#include "GenericGraphNodeFactory.h"
+#include
+#include "GenericGraphAssetEditor/SEdNode_GenericGraphEdge.h"
+#include "GenericGraphAssetEditor/EdNode_GenericGraphNode.h"
+#include "GenericGraphAssetEditor/SEdNode_GenericGraphNode.h"
+#include "GenericGraphAssetEditor/EdNode_GenericGraphEdge.h"
+
+TSharedPtr FGraphPanelNodeFactory_GenericGraph::CreateNode(UEdGraphNode* Node) const
+{
+ if (UEdNode_GenericGraphNode* EdNode_GraphNode = Cast(Node))
+ {
+ return SNew(SEdNode_GenericGraphNode, EdNode_GraphNode);
+ }
+ else if (UEdNode_GenericGraphEdge* EdNode_Edge = Cast(Node))
+ {
+ return SNew(SEdNode_GenericGraphEdge, EdNode_Edge);
+ }
+ return nullptr;
+}
+
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/AssetTypeActions_GenericGraph.h b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/AssetTypeActions_GenericGraph.h
new file mode 100644
index 00000000..8d7ba935
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/AssetTypeActions_GenericGraph.h
@@ -0,0 +1,19 @@
+#pragma once
+
+#include "CoreMinimal.h"
+#include "AssetTypeActions_Base.h"
+
+class GENERICGRAPHEDITOR_API FAssetTypeActions_GenericGraph : public FAssetTypeActions_Base
+{
+public:
+ FAssetTypeActions_GenericGraph(EAssetTypeCategories::Type InAssetCategory);
+
+ virtual FText GetName() const override;
+ virtual FColor GetTypeColor() const override;
+ virtual UClass* GetSupportedClass() const override;
+ virtual void OpenAssetEditor(const TArray& InObjects, TSharedPtr EditWithinLevelEditor = TSharedPtr()) override;
+ virtual uint32 GetCategories() override;
+
+private:
+ EAssetTypeCategories::Type MyAssetCategory;
+};
\ No newline at end of file
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/AutoLayout/AutoLayoutStrategy.h b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/AutoLayout/AutoLayoutStrategy.h
new file mode 100644
index 00000000..52a5efb3
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/AutoLayout/AutoLayoutStrategy.h
@@ -0,0 +1,40 @@
+#pragma once
+
+#include "CoreMinimal.h"
+#include "EdGraph/EdGraph.h"
+#include "GenericGraph.h"
+#include "GenericGraphAssetEditor/EdGraph_GenericGraph.h"
+#include "GenericGraphAssetEditor/EdNode_GenericGraphNode.h"
+#include "GenericGraphAssetEditor/EdNode_GenericGraphEdge.h"
+#include "GenericGraphAssetEditor/Settings_GenericGraphEditor.h"
+#include "AutoLayoutStrategy.generated.h"
+
+UCLASS(abstract)
+class GENERICGRAPHEDITOR_API UAutoLayoutStrategy : public UObject
+{
+ GENERATED_BODY()
+public:
+ UAutoLayoutStrategy();
+ virtual ~UAutoLayoutStrategy();
+
+ virtual void Layout(UEdGraph* G) {};
+
+ class UGenericGraphEditorSettings* Settings;
+
+protected:
+ int32 GetNodeWidth(UEdNode_GenericGraphNode* EdNode);
+
+ int32 GetNodeHeight(UEdNode_GenericGraphNode* EdNode);
+
+ FBox2D GetNodeBound(UEdGraphNode* EdNode);
+
+ FBox2D GetActualBounds(UGenericGraphNode* RootNode);
+
+ virtual void RandomLayoutOneTree(UGenericGraphNode* RootNode, const FBox2D& Bound);
+
+protected:
+ UGenericGraph* Graph;
+ UEdGraph_GenericGraph* EdGraph;
+ int32 MaxIteration;
+ int32 OptimalDistance;
+};
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/AutoLayout/ForceDirectedLayoutStrategy.h b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/AutoLayout/ForceDirectedLayoutStrategy.h
new file mode 100644
index 00000000..e5c40c95
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/AutoLayout/ForceDirectedLayoutStrategy.h
@@ -0,0 +1,24 @@
+#pragma once
+
+#include "CoreMinimal.h"
+#include "AutoLayoutStrategy.h"
+#include "ForceDirectedLayoutStrategy.generated.h"
+
+UCLASS()
+class GENERICGRAPHEDITOR_API UForceDirectedLayoutStrategy : public UAutoLayoutStrategy
+{
+ GENERATED_BODY()
+public:
+ UForceDirectedLayoutStrategy();
+ virtual ~UForceDirectedLayoutStrategy();
+
+ virtual void Layout(UEdGraph* EdGraph) override;
+
+protected:
+ virtual FBox2D LayoutOneTree(UGenericGraphNode* RootNode, const FBox2D& PreTreeBound);
+
+protected:
+ bool bRandomInit;
+ float InitTemperature;
+ float CoolDownRate;
+};
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/AutoLayout/TreeLayoutStrategy.h b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/AutoLayout/TreeLayoutStrategy.h
new file mode 100644
index 00000000..27c7ff42
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/AutoLayout/TreeLayoutStrategy.h
@@ -0,0 +1,29 @@
+#pragma once
+
+#include "CoreMinimal.h"
+#include "AutoLayoutStrategy.h"
+#include "TreeLayoutStrategy.generated.h"
+
+UCLASS()
+class GENERICGRAPHEDITOR_API UTreeLayoutStrategy : public UAutoLayoutStrategy
+{
+ GENERATED_BODY()
+public:
+ UTreeLayoutStrategy();
+ virtual ~UTreeLayoutStrategy();
+
+ virtual void Layout(UEdGraph* EdGraph) override;
+
+protected:
+ void InitPass(UGenericGraphNode* RootNode, const FVector2D& Anchor);
+ bool ResolveConflictPass(UGenericGraphNode* Node);
+
+ bool ResolveConflict(UGenericGraphNode* LRoot, UGenericGraphNode* RRoot);
+
+ void GetLeftContour(UGenericGraphNode* RootNode, int32 Level, TArray& Contour);
+ void GetRightContour(UGenericGraphNode* RootNode, int32 Level, TArray& Contour);
+
+ void ShiftSubTree(UGenericGraphNode* RootNode, const FVector2D& Offset);
+
+ void UpdateParentNodePosition(UGenericGraphNode* RootNode);
+};
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/AssetEditorToolbar_GenericGraph.h b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/AssetEditorToolbar_GenericGraph.h
new file mode 100644
index 00000000..37e5d092
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/AssetEditorToolbar_GenericGraph.h
@@ -0,0 +1,24 @@
+
+#pragma once
+
+#include "CoreMinimal.h"
+
+class FAssetEditor_GenericGraph;
+class FExtender;
+class FToolBarBuilder;
+
+class GENERICGRAPHEDITOR_API FAssetEditorToolbar_GenericGraph : public TSharedFromThis
+{
+public:
+ FAssetEditorToolbar_GenericGraph(TSharedPtr InGenericGraphEditor)
+ : GenericGraphEditor(InGenericGraphEditor) {}
+
+ void AddGenericGraphToolbar(TSharedPtr Extender);
+
+private:
+ void FillGenericGraphToolbar(FToolBarBuilder& ToolbarBuilder);
+
+protected:
+ /** Pointer back to the blueprint editor tool that owns us */
+ TWeakPtr GenericGraphEditor;
+};
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/AssetEditor_GenericGraph.h b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/AssetEditor_GenericGraph.h
new file mode 100644
index 00000000..f1cc415b
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/AssetEditor_GenericGraph.h
@@ -0,0 +1,137 @@
+#pragma once
+
+#include "CoreMinimal.h"
+#include "Settings_GenericGraphEditor.h"
+#include "GenericGraph.h"
+
+#if ENGINE_MAJOR_VERSION == 5
+#include "UObject/ObjectSaveContext.h"
+#endif // #if ENGINE_MAJOR_VERSION == 5
+
+class FGGAssetEditorToolbar;
+
+class GENERICGRAPHEDITOR_API FAssetEditor_GenericGraph : public FAssetEditorToolkit, public FNotifyHook, public FGCObject
+{
+public:
+ FAssetEditor_GenericGraph();
+ virtual ~FAssetEditor_GenericGraph();
+
+ void InitGenericGraphAssetEditor(const EToolkitMode::Type Mode, const TSharedPtr< IToolkitHost >& InitToolkitHost, UGenericGraph* Graph);
+
+ // IToolkit interface
+ virtual void RegisterTabSpawners(const TSharedRef& TabManager) override;
+ virtual void UnregisterTabSpawners(const TSharedRef& TabManager) override;
+ // End of IToolkit interface
+
+ // FAssetEditorToolkit
+ virtual FName GetToolkitFName() const override;
+ virtual FText GetBaseToolkitName() const override;
+ virtual FText GetToolkitName() const override;
+ virtual FText GetToolkitToolTipText() const override;
+ virtual FLinearColor GetWorldCentricTabColorScale() const override;
+ virtual FString GetWorldCentricTabPrefix() const override;
+ virtual FString GetDocumentationLink() const override;
+ virtual void SaveAsset_Execute() override;
+ // End of FAssetEditorToolkit
+
+ //Toolbar
+ void UpdateToolbar();
+ TSharedPtr GetToolbarBuilder() { return ToolbarBuilder; }
+ void RegisterToolbarTab(const TSharedRef& TabManager);
+
+
+ // FSerializableObject interface
+ virtual void AddReferencedObjects(FReferenceCollector& Collector) override;
+ // End of FSerializableObject interface
+
+#if ENGINE_MAJOR_VERSION == 5
+ // FGCObject interface
+ virtual FString GetReferencerName() const
+ {
+ return TEXT("FAssetEditor_LTGenericGraph");
+ }
+ // ~FGCObject interface
+#endif // #if ENGINE_MAJOR_VERSION == 5
+
+ UGenericGraphEditorSettings* GetSettings() const;
+
+protected:
+ TSharedRef SpawnTab_Viewport(const FSpawnTabArgs& Args);
+ TSharedRef SpawnTab_Details(const FSpawnTabArgs& Args);
+ TSharedRef SpawnTab_EditorSettings(const FSpawnTabArgs& Args);
+
+ void CreateInternalWidgets();
+ TSharedRef CreateViewportWidget();
+
+
+ void BindCommands();
+
+ void CreateEdGraph();
+
+ void CreateCommandList();
+
+ TSharedPtr GetCurrGraphEditor() const;
+
+ FGraphPanelSelectionSet GetSelectedNodes() const;
+
+ void RebuildGenericGraph();
+
+ // Delegates for graph editor commands
+ void SelectAllNodes();
+ bool CanSelectAllNodes();
+ void DeleteSelectedNodes();
+ bool CanDeleteNodes();
+ void DeleteSelectedDuplicatableNodes();
+ void CutSelectedNodes();
+ bool CanCutNodes();
+ void CopySelectedNodes();
+ bool CanCopyNodes();
+ void PasteNodes();
+ void PasteNodesHere(const FVector2D& Location);
+ bool CanPasteNodes();
+ void DuplicateNodes();
+ bool CanDuplicateNodes();
+
+ void GraphSettings();
+ bool CanGraphSettings() const;
+
+ void AutoArrange();
+ bool CanAutoArrange() const;
+
+ void OnRenameNode();
+ bool CanRenameNodes() const;
+
+ //////////////////////////////////////////////////////////////////////////
+ // graph editor event
+ void OnSelectedNodesChanged(const TSet& NewSelection);
+
+ void OnNodeDoubleClicked(UEdGraphNode* Node);
+
+ void OnFinishedChangingProperties(const FPropertyChangedEvent& PropertyChangedEvent);
+
+#if ENGINE_MAJOR_VERSION < 5
+ void OnPackageSaved(const FString& PackageFileName, UObject* Outer);
+#else // #if ENGINE_MAJOR_VERSION < 5
+ void OnPackageSavedWithContext(const FString& PackageFileName, UPackage* Package, FObjectPostSaveContext ObjectSaveContext);
+#endif // #else // #if ENGINE_MAJOR_VERSION < 5
+
+protected:
+ UGenericGraphEditorSettings* GenricGraphEditorSettings;
+
+ UGenericGraph* EditingGraph;
+
+ //Toolbar
+ TSharedPtr ToolbarBuilder;
+
+ /** Handle to the registered OnPackageSave delegate */
+ FDelegateHandle OnPackageSavedDelegateHandle;
+
+ TSharedPtr ViewportWidget;
+ TSharedPtr PropertyWidget;
+ TSharedPtr EditorSettingsWidget;
+
+ /** The command list for this editor */
+ TSharedPtr GraphEditorCommands;
+};
+
+
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/AssetGraphSchema_GenericGraph.h b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/AssetGraphSchema_GenericGraph.h
new file mode 100644
index 00000000..faf74b9c
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/AssetGraphSchema_GenericGraph.h
@@ -0,0 +1,90 @@
+#pragma once
+
+#include "CoreMinimal.h"
+#include "GenericGraph.h"
+#include "GenericGraphNode.h"
+#include "GenericGraphEdge.h"
+#include "AssetGraphSchema_GenericGraph.generated.h"
+
+class UEdNode_GenericGraphNode;
+class UEdNode_GenericGraphEdge;
+class UAutoLayoutStrategy;
+
+/** Action to add a node to the graph */
+USTRUCT()
+struct GENERICGRAPHEDITOR_API FAssetSchemaAction_GenericGraph_NewNode : public FEdGraphSchemaAction
+{
+ GENERATED_USTRUCT_BODY();
+
+public:
+ FAssetSchemaAction_GenericGraph_NewNode(): NodeTemplate(nullptr) {}
+
+ FAssetSchemaAction_GenericGraph_NewNode(const FText& InNodeCategory, const FText& InMenuDesc, const FText& InToolTip, const int32 InGrouping)
+ : FEdGraphSchemaAction(InNodeCategory, InMenuDesc, InToolTip, InGrouping), NodeTemplate(nullptr) {}
+
+ virtual UEdGraphNode* PerformAction(class UEdGraph* ParentGraph, UEdGraphPin* FromPin, const FVector2D Location, bool bSelectNewNode = true) override;
+ virtual void AddReferencedObjects(FReferenceCollector& Collector) override;
+
+ UEdNode_GenericGraphNode* NodeTemplate;
+};
+
+USTRUCT()
+struct GENERICGRAPHEDITOR_API FAssetSchemaAction_GenericGraph_NewEdge : public FEdGraphSchemaAction
+{
+ GENERATED_USTRUCT_BODY();
+
+public:
+ FAssetSchemaAction_GenericGraph_NewEdge(): NodeTemplate(nullptr){}
+
+ FAssetSchemaAction_GenericGraph_NewEdge(const FText& InNodeCategory, const FText& InMenuDesc, const FText& InToolTip, const int32 InGrouping)
+ : FEdGraphSchemaAction(InNodeCategory, InMenuDesc, InToolTip, InGrouping), NodeTemplate(nullptr) {}
+
+ virtual UEdGraphNode* PerformAction(class UEdGraph* ParentGraph, UEdGraphPin* FromPin, const FVector2D Location, bool bSelectNewNode = true) override;
+ virtual void AddReferencedObjects(FReferenceCollector& Collector) override;
+
+ UEdNode_GenericGraphEdge* NodeTemplate;
+};
+
+UCLASS(MinimalAPI)
+class UAssetGraphSchema_GenericGraph : public UEdGraphSchema
+{
+ GENERATED_BODY()
+
+public:
+ void GetBreakLinkToSubMenuActions(class UToolMenu* Menu, class UEdGraphPin* InGraphPin);
+
+ virtual EGraphType GetGraphType(const UEdGraph* TestEdGraph) const override;
+
+ virtual void GetGraphContextActions(FGraphContextMenuBuilder& ContextMenuBuilder) const override;
+
+ virtual void GetContextMenuActions(class UToolMenu* Menu, class UGraphNodeContextMenuContext* Context) const override;
+
+ virtual const FPinConnectionResponse CanCreateConnection(const UEdGraphPin* A, const UEdGraphPin* B) const override;
+
+ virtual bool TryCreateConnection(UEdGraphPin* A, UEdGraphPin* B) const override;
+ virtual bool CreateAutomaticConversionNodeAndConnections(UEdGraphPin* A, UEdGraphPin* B) const override;
+
+ virtual class FConnectionDrawingPolicy* CreateConnectionDrawingPolicy(int32 InBackLayerID, int32 InFrontLayerID, float InZoomFactor, const FSlateRect& InClippingRect, class FSlateWindowElementList& InDrawElements, class UEdGraph* InGraphObj) const override;
+
+ virtual FLinearColor GetPinTypeColor(const FEdGraphPinType& PinType) const override;
+
+ virtual void BreakNodeLinks(UEdGraphNode& TargetNode) const override;
+
+ virtual void BreakPinLinks(UEdGraphPin& TargetPin, bool bSendsNodeNotifcation) const override;
+
+ virtual void BreakSinglePinLink(UEdGraphPin* SourcePin, UEdGraphPin* TargetPin) const override;
+
+ virtual UEdGraphPin* DropPinOnNode(UEdGraphNode* InTargetNode, const FName& InSourcePinName, const FEdGraphPinType& InSourcePinType, EEdGraphPinDirection InSourcePinDirection) const override;
+
+ virtual bool SupportsDropPinOnNode(UEdGraphNode* InTargetNode, const FEdGraphPinType& InSourcePinType, EEdGraphPinDirection InSourcePinDirection, FText& OutErrorMessage) const override;
+
+ virtual bool IsCacheVisualizationOutOfDate(int32 InVisualizationCacheID) const override;
+
+ virtual int32 GetCurrentVisualizationCacheID() const override;
+
+ virtual void ForceVisualizationCacheClear() const override;
+
+private:
+ static int32 CurrentCacheRefreshID;
+};
+
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/Colors_GenericGraph.h b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/Colors_GenericGraph.h
new file mode 100644
index 00000000..5258d1a8
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/Colors_GenericGraph.h
@@ -0,0 +1,45 @@
+#pragma once
+
+#include "CoreMinimal.h"
+
+namespace GenericGraphColors
+{
+ namespace NodeBody
+ {
+ const FLinearColor Default(0.1f, 0.1f, 0.1f);
+ const FLinearColor Root(0.5f, 0.5f, 0.5f, 0.1f);
+ const FLinearColor Error(1.0f, 0.0f, 0.0f);
+ }
+
+ namespace NodeBorder
+ {
+ const FLinearColor Inactive(0.08f, 0.08f, 0.08f);
+ const FLinearColor Root(0.2f, 0.2f, 0.2f, 0.2f);
+ const FLinearColor Selected(1.00f, 0.08f, 0.08f);
+ const FLinearColor ActiveDebugging(1.0f, 1.0f, 0.0f);
+ const FLinearColor InactiveDebugging(0.4f, 0.4f, 0.0f);
+ const FLinearColor HighlightAbortRange0(0.0f, 0.22f, 0.4f);
+ const FLinearColor HighlightAbortRange1(0.0f, 0.4f, 0.22f);
+ const FLinearColor Disconnected(0.f, 0.f, 0.f);
+ const FLinearColor BrokenWithParent(1.f, 0.f, 1.f);
+ const FLinearColor QuickFind(0.f, 0.8f, 0.f);
+ }
+
+ namespace Pin
+ {
+ const FLinearColor Diff(0.9f, 0.2f, 0.15f);
+ const FLinearColor Hover(1.0f, 0.7f, 0.0f);
+ const FLinearColor Default(0.02f, 0.02f, 0.02f);
+ const FLinearColor SingleNode(0.02f, 0.02f, 0.02f);
+ }
+
+ namespace Connection
+ {
+ const FLinearColor Default(1.0f, 1.0f, 1.0f);
+ }
+
+ namespace Action
+ {
+ const FLinearColor DragMarker(1.0f, 1.0f, 0.2f);
+ }
+}
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/ConnectionDrawingPolicy_GenericGraph.h b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/ConnectionDrawingPolicy_GenericGraph.h
new file mode 100644
index 00000000..e375e816
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/ConnectionDrawingPolicy_GenericGraph.h
@@ -0,0 +1,27 @@
+#pragma once
+
+#include "CoreMinimal.h"
+#include "ConnectionDrawingPolicy.h"
+
+class GENERICGRAPHEDITOR_API FConnectionDrawingPolicy_GenericGraph : public FConnectionDrawingPolicy
+{
+protected:
+ UEdGraph* GraphObj;
+ TMap NodeWidgetMap;
+
+public:
+ FConnectionDrawingPolicy_GenericGraph(int32 InBackLayerID, int32 InFrontLayerID, float ZoomFactor, const FSlateRect& InClippingRect, FSlateWindowElementList& InDrawElements, UEdGraph* InGraphObj);
+
+ // FConnectionDrawingPolicy interface
+ virtual void DetermineWiringStyle(UEdGraphPin* OutputPin, UEdGraphPin* InputPin, /*inout*/ FConnectionParams& Params) override;
+ virtual void Draw(TMap, FArrangedWidget>& PinGeometries, FArrangedChildren& ArrangedNodes) override;
+ virtual void DrawSplineWithArrow(const FGeometry& StartGeom, const FGeometry& EndGeom, const FConnectionParams& Params) override;
+ virtual void DrawSplineWithArrow(const FVector2D& StartPoint, const FVector2D& EndPoint, const FConnectionParams& Params) override;
+ virtual void DrawPreviewConnector(const FGeometry& PinGeometry, const FVector2D& StartPoint, const FVector2D& EndPoint, UEdGraphPin* Pin) override;
+ virtual FVector2D ComputeSplineTangent(const FVector2D& Start, const FVector2D& End) const override;
+ virtual void DetermineLinkGeometry(FArrangedChildren& ArrangedNodes, TSharedRef& OutputPinWidget, UEdGraphPin* OutputPin, UEdGraphPin* InputPin, FArrangedWidget*& StartWidgetGeometry, FArrangedWidget*& EndWidgetGeometry) override;
+ // End of FConnectionDrawingPolicy interface
+
+protected:
+ void Internal_DrawLineWithArrow(const FVector2D& StartAnchorPoint, const FVector2D& EndAnchorPoint, const FConnectionParams& Params);
+};
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/EdGraph_GenericGraph.h b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/EdGraph_GenericGraph.h
new file mode 100644
index 00000000..5cb92af3
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/EdGraph_GenericGraph.h
@@ -0,0 +1,39 @@
+#pragma once
+
+#include "CoreMinimal.h"
+#include "EdGraph/EdGraph.h"
+#include "EdGraph_GenericGraph.generated.h"
+
+class UGenericGraph;
+class UGenericGraphNode;
+class UGenericGraphEdge;
+class UEdNode_GenericGraphNode;
+class UEdNode_GenericGraphEdge;
+
+UCLASS()
+class GENERICGRAPHEDITOR_API UEdGraph_GenericGraph : public UEdGraph
+{
+ GENERATED_BODY()
+
+public:
+ UEdGraph_GenericGraph();
+ virtual ~UEdGraph_GenericGraph();
+
+ virtual void RebuildGenericGraph();
+
+ UGenericGraph* GetGenericGraph() const;
+
+ virtual bool Modify(bool bAlwaysMarkDirty = true) override;
+ virtual void PostEditUndo() override;
+
+ UPROPERTY(Transient)
+ TMap NodeMap;
+
+ UPROPERTY(Transient)
+ TMap EdgeMap;
+
+protected:
+ void Clear();
+
+ void SortNodes(UGenericGraphNode* RootNode);
+};
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/EdNode_GenericGraphEdge.h b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/EdNode_GenericGraphEdge.h
new file mode 100644
index 00000000..ac480d8f
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/EdNode_GenericGraphEdge.h
@@ -0,0 +1,42 @@
+#pragma once
+
+#include "CoreMinimal.h"
+#include "EdGraph/EdGraphNode.h"
+#include "EdNode_GenericGraphEdge.generated.h"
+
+class UGenericGraphNode;
+class UGenericGraphEdge;
+class UEdNode_GenericGraphNode;
+
+UCLASS(MinimalAPI)
+class UEdNode_GenericGraphEdge : public UEdGraphNode
+{
+ GENERATED_BODY()
+
+public:
+ UEdNode_GenericGraphEdge();
+
+ UPROPERTY()
+ class UEdGraph* Graph;
+
+ UPROPERTY(VisibleAnywhere, Instanced, Category = "GenericGraph")
+ UGenericGraphEdge* GenericGraphEdge;
+
+ void SetEdge(UGenericGraphEdge* Edge);
+
+ virtual void AllocateDefaultPins() override;
+
+ virtual FText GetNodeTitle(ENodeTitleType::Type TitleType) const override;
+
+ virtual void PinConnectionListChanged(UEdGraphPin* Pin) override;
+
+ virtual void PrepareForCopying() override;
+
+ virtual UEdGraphPin* GetInputPin() const { return Pins[0]; }
+ virtual UEdGraphPin* GetOutputPin() const { return Pins[1]; }
+
+ void CreateConnections(UEdNode_GenericGraphNode* Start, UEdNode_GenericGraphNode* End);
+
+ UEdNode_GenericGraphNode* GetStartNode();
+ UEdNode_GenericGraphNode* GetEndNode();
+};
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/EdNode_GenericGraphNode.h b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/EdNode_GenericGraphNode.h
new file mode 100644
index 00000000..258a089c
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/EdNode_GenericGraphNode.h
@@ -0,0 +1,42 @@
+#pragma once
+
+#include "CoreMinimal.h"
+#include "EdGraph/EdGraphNode.h"
+#include "GenericGraphNode.h"
+#include "EdNode_GenericGraphNode.generated.h"
+
+class UEdNode_GenericGraphEdge;
+class UEdGraph_GenericGraph;
+class SEdNode_GenericGraphNode;
+
+UCLASS(MinimalAPI)
+class UEdNode_GenericGraphNode : public UEdGraphNode
+{
+ GENERATED_BODY()
+
+public:
+ UEdNode_GenericGraphNode();
+ virtual ~UEdNode_GenericGraphNode();
+
+ UPROPERTY(VisibleAnywhere, Instanced, Category = "GenericGraph")
+ UGenericGraphNode* GenericGraphNode;
+
+ void SetGenericGraphNode(UGenericGraphNode* InNode);
+ UEdGraph_GenericGraph* GetGenericGraphEdGraph();
+
+ SEdNode_GenericGraphNode* SEdNode;
+
+ virtual void AllocateDefaultPins() override;
+ virtual FText GetNodeTitle(ENodeTitleType::Type TitleType) const override;
+ virtual void PrepareForCopying() override;
+ virtual void AutowireNewNode(UEdGraphPin* FromPin) override;
+
+ virtual FLinearColor GetBackgroundColor() const;
+ virtual UEdGraphPin* GetInputPin() const;
+ virtual UEdGraphPin* GetOutputPin() const;
+
+#if WITH_EDITOR
+ virtual void PostEditUndo() override;
+#endif
+
+};
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/EditorCommands_GenericGraph.h b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/EditorCommands_GenericGraph.h
new file mode 100644
index 00000000..ff6c5bd9
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/EditorCommands_GenericGraph.h
@@ -0,0 +1,18 @@
+#pragma once
+
+#include "CoreMinimal.h"
+
+class GENERICGRAPHEDITOR_API FEditorCommands_GenericGraph : public TCommands
+{
+public:
+ /** Constructor */
+ FEditorCommands_GenericGraph()
+ : TCommands("GenericGraphEditor", NSLOCTEXT("Contexts", "GenericGraphEditor", "Generic Graph Editor"), NAME_None, FAppStyle::GetAppStyleSetName())
+ {
+ }
+
+ TSharedPtr GraphSettings;
+ TSharedPtr AutoArrange;
+
+ virtual void RegisterCommands() override;
+};
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/GenericGraphDragConnection.h b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/GenericGraphDragConnection.h
new file mode 100644
index 00000000..bd0a91af
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/GenericGraphDragConnection.h
@@ -0,0 +1,52 @@
+// Copyright Epic Games, Inc. All Rights Reserved.
+
+#pragma once
+
+#include "CoreMinimal.h"
+#include "Input/DragAndDrop.h"
+#include "Input/Reply.h"
+#include "Widgets/SWidget.h"
+#include "SGraphPin.h"
+#include "GraphEditorDragDropAction.h"
+
+class SGraphPanel;
+class UEdGraph;
+
+class FGenericGraphDragConnection : public FGraphEditorDragDropAction
+{
+public:
+ DRAG_DROP_OPERATOR_TYPE(FDragConnection, FGraphEditorDragDropAction)
+
+ typedef TArray FDraggedPinTable;
+ static TSharedRef New(const TSharedRef& InGraphPanel, const FDraggedPinTable& InStartingPins);
+
+ // FDragDropOperation interface
+ virtual void OnDrop(bool bDropWasHandled, const FPointerEvent& MouseEvent) override;
+ // End of FDragDropOperation interface
+
+ // FGraphEditorDragDropAction interface
+ virtual void HoverTargetChanged() override;
+ virtual FReply DroppedOnPin(FVector2D ScreenPosition, FVector2D GraphPosition) override;
+ virtual FReply DroppedOnNode(FVector2D ScreenPosition, FVector2D GraphPosition) override;
+ virtual FReply DroppedOnPanel(const TSharedRef< SWidget >& Panel, FVector2D ScreenPosition, FVector2D GraphPosition, UEdGraph& Graph) override;
+ virtual void OnDragged(const class FDragDropEvent& DragDropEvent) override;
+ // End of FGraphEditorDragDropAction interface
+
+ /*
+ * Function to check validity of graph pins in the StartPins list. This check helps to prevent processing graph pins which are outdated.
+ */
+ virtual void ValidateGraphPinList(TArray& OutValidPins);
+
+protected:
+ typedef FGraphEditorDragDropAction Super;
+
+ // Constructor: Make sure to call Construct() after factorying one of these
+ FGenericGraphDragConnection(const TSharedRef& GraphPanel, const FDraggedPinTable& DraggedPins);
+
+protected:
+ TSharedPtr GraphPanel;
+ FDraggedPinTable DraggingPins;
+
+ /** Offset information for the decorator widget */
+ FVector2D DecoratorAdjust;
+};
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/GenericGraphEditorStyle.h b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/GenericGraphEditorStyle.h
new file mode 100644
index 00000000..577312f3
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/GenericGraphEditorStyle.h
@@ -0,0 +1,16 @@
+#pragma once
+
+#include "CoreMinimal.h"
+#include "Styling/SlateStyle.h"
+
+class GENERICGRAPHEDITOR_API FGenericGraphEditorStyle
+{
+public:
+ static void Initialize();
+ static void Shutdown();
+
+ static const FName& GetStyleSetName();
+
+private:
+ static TSharedPtr StyleSet;
+};
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/SEdNode_GenericGraphEdge.h b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/SEdNode_GenericGraphEdge.h
new file mode 100644
index 00000000..8505a5f6
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/SEdNode_GenericGraphEdge.h
@@ -0,0 +1,40 @@
+#pragma once
+
+#include "CoreMinimal.h"
+#include "Styling/SlateColor.h"
+#include "Widgets/DeclarativeSyntaxSupport.h"
+#include "Widgets/SWidget.h"
+#include "SNodePanel.h"
+#include "SGraphNode.h"
+
+class SToolTip;
+class UEdNode_GenericGraphEdge;
+
+class GENERICGRAPHEDITOR_API SEdNode_GenericGraphEdge : public SGraphNode
+{
+public:
+ SLATE_BEGIN_ARGS(SEdNode_GenericGraphEdge){}
+ SLATE_END_ARGS()
+
+ void Construct(const FArguments& InArgs, UEdNode_GenericGraphEdge* InNode);
+
+ virtual bool RequiresSecondPassLayout() const override;
+ virtual void PerformSecondPassLayout(const TMap< UObject*, TSharedRef >& NodeToWidgetLookup) const override;
+
+ virtual void UpdateGraphNode() override;
+
+ // Calculate position for multiple nodes to be placed between a start and end point, by providing this nodes index and max expected nodes
+ void PositionBetweenTwoNodesWithOffset(const FGeometry& StartGeom, const FGeometry& EndGeom, int32 NodeIndex, int32 MaxNodes) const;
+
+ void OnNameTextCommited(const FText& InText, ETextCommit::Type CommitInfo);
+
+protected:
+ FSlateColor GetEdgeColor() const;
+
+ const FSlateBrush* GetEdgeImage() const;
+
+ EVisibility GetEdgeImageVisibility() const;
+ EVisibility GetEdgeTitleVisbility() const;
+private:
+ TSharedPtr TextEntryWidget;
+};
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/SEdNode_GenericGraphNode.h b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/SEdNode_GenericGraphNode.h
new file mode 100644
index 00000000..1d4d9b99
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/SEdNode_GenericGraphNode.h
@@ -0,0 +1,32 @@
+#pragma once
+
+#include "CoreMinimal.h"
+#include "SGraphNode.h"
+
+class UEdNode_GenericGraphNode;
+
+class GENERICGRAPHEDITOR_API SEdNode_GenericGraphNode : public SGraphNode
+{
+public:
+ SLATE_BEGIN_ARGS(SEdNode_GenericGraphNode) {}
+ SLATE_END_ARGS()
+
+ void Construct(const FArguments& InArgs, UEdNode_GenericGraphNode* InNode);
+
+ virtual void UpdateGraphNode() override;
+ virtual void CreatePinWidgets() override;
+ virtual void AddPin(const TSharedRef& PinToAdd) override;
+ virtual bool IsNameReadOnly() const override;
+
+ void OnNameTextCommited(const FText& InText, ETextCommit::Type CommitInfo);
+
+ virtual FSlateColor GetBorderBackgroundColor() const;
+ virtual FSlateColor GetBackgroundColor() const;
+
+ virtual EVisibility GetDragOverMarkerVisibility() const;
+
+ virtual const FSlateBrush* GetNameIcon() const;
+
+protected:
+};
+
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/Settings_GenericGraphEditor.h b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/Settings_GenericGraphEditor.h
new file mode 100644
index 00000000..c1e39156
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphAssetEditor/Settings_GenericGraphEditor.h
@@ -0,0 +1,42 @@
+#pragma once
+
+#include "CoreMinimal.h"
+#include "Settings_GenericGraphEditor.generated.h"
+
+UENUM(BlueprintType)
+enum class EAutoLayoutStrategy : uint8
+{
+ Tree,
+ ForceDirected,
+};
+
+UCLASS()
+class GENERICGRAPHEDITOR_API UGenericGraphEditorSettings : public UObject
+{
+ GENERATED_BODY()
+
+public:
+ UGenericGraphEditorSettings();
+ virtual ~UGenericGraphEditorSettings();
+
+ UPROPERTY(EditDefaultsOnly, Category = "AutoArrange")
+ float OptimalDistance;
+
+ UPROPERTY(EditDefaultsOnly, AdvancedDisplay, Category = "AutoArrange")
+ EAutoLayoutStrategy AutoLayoutStrategy;
+
+ UPROPERTY(EditDefaultsOnly, AdvancedDisplay, Category = "AutoArrange")
+ int32 MaxIteration;
+
+ UPROPERTY(EditDefaultsOnly, AdvancedDisplay, Category = "AutoArrange")
+ bool bFirstPassOnly;
+
+ UPROPERTY(EditDefaultsOnly, AdvancedDisplay, Category = "AutoArrange")
+ bool bRandomInit;
+
+ UPROPERTY(EditDefaultsOnly, AdvancedDisplay, Category = "AutoArrange")
+ float InitTemperature;
+
+ UPROPERTY(EditDefaultsOnly, AdvancedDisplay, Category = "AutoArrange")
+ float CoolDownRate;
+};
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphEditor.h b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphEditor.h
new file mode 100644
index 00000000..f710fc2c
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphEditor.h
@@ -0,0 +1,23 @@
+#pragma once
+#include "Modules/ModuleManager.h"
+#include "GenericGraphEditorModule.h"
+#include
+#include
+
+class FGenericGraphEditor : public IGenericGraphEditor
+{
+ /** IModuleInterface implementation */
+ virtual void StartupModule() override;
+ virtual void ShutdownModule() override;
+
+
+private:
+ void RegisterAssetTypeAction(IAssetTools& AssetTools, TSharedRef Action);
+
+private:
+ TArray< TSharedPtr > CreatedAssetTypeActions;
+
+ EAssetTypeCategories::Type GenericGraphAssetCategoryBit;
+
+ TSharedPtr GraphPanelNodeFactory_GenericGraph;
+};
\ No newline at end of file
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphEditorModule.h b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphEditorModule.h
new file mode 100644
index 00000000..c042dc1f
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphEditorModule.h
@@ -0,0 +1,34 @@
+#include"Modules/ModuleManager.h"
+
+DECLARE_LOG_CATEGORY_EXTERN(GenericGraphEditor, Log, All);
+
+/**
+ * The public interface to this module
+ */
+class IGenericGraphEditor : public IModuleInterface
+{
+
+public:
+
+ /**
+ * Singleton-like access to this module's interface. This is just for convenience!
+ * Beware of calling this during the shutdown phase, though. Your module might have been unloaded already.
+ *
+ * @return Returns singleton instance, loading the module on demand if needed
+ */
+ static IGenericGraphEditor& Get()
+ {
+ return FModuleManager::LoadModuleChecked< IGenericGraphEditor >("GenericGraphEditor");
+ }
+
+ /**
+ * Checks to see if this module is loaded and ready. It is only valid to call Get() if IsAvailable() returns true.
+ *
+ * @return True if the module is loaded and ready to use
+ */
+ static bool IsAvailable()
+ {
+ return FModuleManager::Get().IsModuleLoaded("GenericGraphEditor");
+ }
+};
+
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphEditorPCH.h b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphEditorPCH.h
new file mode 100644
index 00000000..f0385f7d
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphEditorPCH.h
@@ -0,0 +1,13 @@
+#pragma once
+
+#include "GenericGraph.h"
+#include "GenericGraphNode.h"
+#include "GenericGraphEdge.h"
+
+// You should place include statements to your module's private header files here. You only need to
+// add includes for headers that are used in most of your module's source files though.
+#include "GenericGraphEditor.h"
+
+#define LOG_INFO(FMT, ...) UE_LOG(GenericGraphEditor, Display, (FMT), ##__VA_ARGS__)
+#define LOG_WARNING(FMT, ...) UE_LOG(GenericGraphEditor, Warning, (FMT), ##__VA_ARGS__)
+#define LOG_ERROR(FMT, ...) UE_LOG(GenericGraphEditor, Error, (FMT), ##__VA_ARGS__)
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphFactory.h b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphFactory.h
new file mode 100644
index 00000000..00cc44d4
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphFactory.h
@@ -0,0 +1,22 @@
+#pragma once
+
+#include "CoreMinimal.h"
+#include "Factories/Factory.h"
+#include "GenericGraph.h"
+#include "GenericGraphFactory.generated.h"
+
+UCLASS()
+class GENERICGRAPHEDITOR_API UGenericGraphFactory : public UFactory
+{
+ GENERATED_BODY()
+
+public:
+ UGenericGraphFactory();
+ virtual ~UGenericGraphFactory();
+
+ UPROPERTY(EditAnywhere, Category=DataAsset)
+ TSubclassOf GenericGraphClass;
+
+ virtual bool ConfigureProperties() override;
+ virtual UObject* FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn) override;
+};
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphNodeFactory.h b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphNodeFactory.h
new file mode 100644
index 00000000..5feb3345
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphEditor/Public/GenericGraphNodeFactory.h
@@ -0,0 +1,8 @@
+#pragma once
+#include
+#include
+
+class FGraphPanelNodeFactory_GenericGraph : public FGraphPanelNodeFactory
+{
+ virtual TSharedPtr CreateNode(UEdGraphNode* Node) const override;
+};
\ No newline at end of file
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/GenericGraphRuntime.Build.cs b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/GenericGraphRuntime.Build.cs
new file mode 100644
index 00000000..e3d5c5d9
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/GenericGraphRuntime.Build.cs
@@ -0,0 +1,51 @@
+using UnrealBuildTool;
+
+public class GenericGraphRuntime : ModuleRules
+{
+ public GenericGraphRuntime(ReadOnlyTargetRules Target) : base(Target)
+ {
+ PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
+ bLegacyPublicIncludePaths = false;
+ ShadowVariableWarningLevel = WarningLevel.Error;
+
+ PublicIncludePaths.AddRange(
+ new string[] {
+ // ... add public include paths required here ...
+ }
+ );
+
+ PrivateIncludePaths.AddRange(
+ new string[] {
+ "GenericGraphRuntime/Private",
+ // ... add other private include paths required here ...
+ }
+ );
+
+ PublicDependencyModuleNames.AddRange(
+ new string[]
+ {
+ "Core",
+ "CoreUObject",
+ "Engine",
+ // ... add other public dependencies that you statically link with here ...
+ }
+ );
+
+ PrivateDependencyModuleNames.AddRange(
+ new string[]
+ {
+ // ... add private dependencies that you statically link with here ...
+ "Slate",
+ "SlateCore",
+ "GameplayTags"
+ }
+ );
+
+ DynamicallyLoadedModuleNames.AddRange(
+ new string[]
+ {
+ // ... add any modules that your module loads dynamically here ...
+ }
+ );
+ }
+}
\ No newline at end of file
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/Private/GenericGraph.cpp b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/Private/GenericGraph.cpp
new file mode 100644
index 00000000..c2bbb302
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/Private/GenericGraph.cpp
@@ -0,0 +1,136 @@
+#include "GenericGraph.h"
+#include "GenericGraphRuntimePCH.h"
+#include "Engine/Engine.h"
+
+#define LOCTEXT_NAMESPACE "GenericGraph"
+
+UGenericGraph::UGenericGraph()
+{
+ NodeType = UGenericGraphNode::StaticClass();
+ EdgeType = UGenericGraphEdge::StaticClass();
+
+ bEdgeEnabled = true;
+
+#if WITH_EDITORONLY_DATA
+ EdGraph = nullptr;
+
+ bCanRenameNode = true;
+#endif
+}
+
+UGenericGraph::~UGenericGraph()
+{
+
+}
+
+void UGenericGraph::Print(bool ToConsole /*= true*/, bool ToScreen /*= true*/)
+{
+ int Level = 0;
+ TArray CurrLevelNodes = RootNodes;
+ TArray NextLevelNodes;
+
+ while (CurrLevelNodes.Num() != 0)
+ {
+ for (int i = 0; i < CurrLevelNodes.Num(); ++i)
+ {
+ UGenericGraphNode* Node = CurrLevelNodes[i];
+ check(Node != nullptr);
+
+ FString Message = FString::Printf(TEXT("%s, Level %d"), *Node->GetDescription().ToString(), Level);
+
+ if (ToConsole)
+ {
+ LOG_INFO(TEXT("%s"), *Message);
+ }
+
+ if (ToScreen && GEngine != nullptr)
+ {
+ GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Blue, Message);
+ }
+
+ for (int j = 0; j < Node->ChildrenNodes.Num(); ++j)
+ {
+ NextLevelNodes.Add(Node->ChildrenNodes[j]);
+ }
+ }
+
+ CurrLevelNodes = NextLevelNodes;
+ NextLevelNodes.Reset();
+ ++Level;
+ }
+}
+
+int UGenericGraph::GetLevelNum() const
+{
+ int Level = 0;
+ TArray CurrLevelNodes = RootNodes;
+ TArray NextLevelNodes;
+
+ while (CurrLevelNodes.Num() != 0)
+ {
+ for (int i = 0; i < CurrLevelNodes.Num(); ++i)
+ {
+ UGenericGraphNode* Node = CurrLevelNodes[i];
+ check(Node != nullptr);
+
+ for (int j = 0; j < Node->ChildrenNodes.Num(); ++j)
+ {
+ NextLevelNodes.Add(Node->ChildrenNodes[j]);
+ }
+ }
+
+ CurrLevelNodes = NextLevelNodes;
+ NextLevelNodes.Reset();
+ ++Level;
+ }
+
+ return Level;
+}
+
+void UGenericGraph::GetNodesByLevel(int Level, TArray& Nodes)
+{
+ int CurrLEvel = 0;
+ TArray NextLevelNodes;
+
+ Nodes = RootNodes;
+
+ while (Nodes.Num() != 0)
+ {
+ if (CurrLEvel == Level)
+ break;
+
+ for (int i = 0; i < Nodes.Num(); ++i)
+ {
+ UGenericGraphNode* Node = Nodes[i];
+ check(Node != nullptr);
+
+ for (int j = 0; j < Node->ChildrenNodes.Num(); ++j)
+ {
+ NextLevelNodes.Add(Node->ChildrenNodes[j]);
+ }
+ }
+
+ Nodes = NextLevelNodes;
+ NextLevelNodes.Reset();
+ ++CurrLEvel;
+ }
+}
+
+void UGenericGraph::ClearGraph()
+{
+ for (int i = 0; i < AllNodes.Num(); ++i)
+ {
+ UGenericGraphNode* Node = AllNodes[i];
+ if (Node)
+ {
+ Node->ParentNodes.Empty();
+ Node->ChildrenNodes.Empty();
+ Node->Edges.Empty();
+ }
+ }
+
+ AllNodes.Empty();
+ RootNodes.Empty();
+}
+
+#undef LOCTEXT_NAMESPACE
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/Private/GenericGraphEdge.cpp b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/Private/GenericGraphEdge.cpp
new file mode 100644
index 00000000..6d0118c7
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/Private/GenericGraphEdge.cpp
@@ -0,0 +1,23 @@
+#include "GenericGraphEdge.h"
+
+UGenericGraphEdge::UGenericGraphEdge()
+{
+
+}
+
+UGenericGraphEdge::~UGenericGraphEdge()
+{
+
+}
+
+UGenericGraph* UGenericGraphEdge::GetGraph() const
+{
+ return Graph;
+}
+
+#if WITH_EDITOR
+void UGenericGraphEdge::SetNodeTitle(const FText& NewTitle)
+{
+ NodeTitle = NewTitle;
+}
+#endif // #if WITH_EDITOR
\ No newline at end of file
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/Private/GenericGraphNode.cpp b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/Private/GenericGraphNode.cpp
new file mode 100644
index 00000000..548cdc3b
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/Private/GenericGraphNode.cpp
@@ -0,0 +1,90 @@
+#include "GenericGraphNode.h"
+#include "GenericGraph.h"
+
+#define LOCTEXT_NAMESPACE "GenericGraphNode"
+
+UGenericGraphNode::UGenericGraphNode()
+{
+#if WITH_EDITORONLY_DATA
+ CompatibleGraphType = UGenericGraph::StaticClass();
+
+ BackgroundColor = FLinearColor::Black;
+#endif
+}
+
+UGenericGraphNode::~UGenericGraphNode()
+{
+}
+
+UGenericGraphEdge* UGenericGraphNode::GetEdge(UGenericGraphNode* ChildNode)
+{
+ return Edges.Contains(ChildNode) ? Edges.FindChecked(ChildNode) : nullptr;
+}
+
+FText UGenericGraphNode::GetDescription_Implementation() const
+{
+ return LOCTEXT("NodeDesc", "Generic Graph Node");
+}
+
+#if WITH_EDITOR
+bool UGenericGraphNode::IsNameEditable() const
+{
+ return true;
+}
+
+FLinearColor UGenericGraphNode::GetBackgroundColor() const
+{
+ return BackgroundColor;
+}
+
+FText UGenericGraphNode::GetNodeTitle() const
+{
+ return NodeTitle.IsEmpty() ? GetDescription() : NodeTitle;
+}
+
+void UGenericGraphNode::SetNodeTitle(const FText& NewTitle)
+{
+ NodeTitle = NewTitle;
+}
+
+bool UGenericGraphNode::CanCreateConnection(UGenericGraphNode* Other, FText& ErrorMessage)
+{
+ return true;
+}
+
+bool UGenericGraphNode::CanCreateConnectionTo(UGenericGraphNode* Other, int32 NumberOfChildrenNodes, FText& ErrorMessage)
+{
+ if (ChildrenLimitType == ENodeLimit::Limited && NumberOfChildrenNodes >= ChildrenLimit)
+ {
+ ErrorMessage = FText::FromString("Children limit exceeded");
+ return false;
+ }
+
+ return CanCreateConnection(Other, ErrorMessage);
+}
+
+bool UGenericGraphNode::CanCreateConnectionFrom(UGenericGraphNode* Other, int32 NumberOfParentNodes, FText& ErrorMessage)
+{
+ if (ParentLimitType == ENodeLimit::Limited && NumberOfParentNodes >= ParentLimit)
+ {
+ ErrorMessage = FText::FromString("Parent limit exceeded");
+ return false;
+ }
+
+ return true;
+}
+
+
+#endif
+
+bool UGenericGraphNode::IsLeafNode() const
+{
+ return ChildrenNodes.Num() == 0;
+}
+
+UGenericGraph* UGenericGraphNode::GetGraph() const
+{
+ return Graph;
+}
+
+#undef LOCTEXT_NAMESPACE
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/Private/GenericGraphRuntime.cpp b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/Private/GenericGraphRuntime.cpp
new file mode 100644
index 00000000..bfc33a53
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/Private/GenericGraphRuntime.cpp
@@ -0,0 +1,29 @@
+#include "GenericGraphRuntimePCH.h"
+
+DEFINE_LOG_CATEGORY(GenericGraphRuntime)
+
+class FGenericGraphRuntime : public IGenericGraphRuntime
+{
+ /** IModuleInterface implementation */
+ virtual void StartupModule() override;
+ virtual void ShutdownModule() override;
+};
+
+IMPLEMENT_MODULE( FGenericGraphRuntime, GenericGraphRuntime )
+
+
+
+void FGenericGraphRuntime::StartupModule()
+{
+ // This code will execute after your module is loaded into memory (but after global variables are initialized, of course.)
+}
+
+
+void FGenericGraphRuntime::ShutdownModule()
+{
+ // This function may be called during shutdown to clean up your module. For modules that support dynamic reloading,
+ // we call this function before unloading the module.
+}
+
+
+
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/Private/GenericGraphRuntimePCH.h b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/Private/GenericGraphRuntimePCH.h
new file mode 100644
index 00000000..18feed8f
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/Private/GenericGraphRuntimePCH.h
@@ -0,0 +1,12 @@
+#pragma once
+
+// #include "CoreUObject.h"
+// #include "Engine.h"
+
+// You should place include statements to your module's private header files here. You only need to
+// add includes for headers that are used in most of your module's source files though.
+#include "IGenericGraphRuntime.h"
+
+#define LOG_INFO(FMT, ...) UE_LOG(GenericGraphRuntime, Display, (FMT), ##__VA_ARGS__)
+#define LOG_WARNING(FMT, ...) UE_LOG(GenericGraphRuntime, Warning, (FMT), ##__VA_ARGS__)
+#define LOG_ERROR(FMT, ...) UE_LOG(GenericGraphRuntime, Error, (FMT), ##__VA_ARGS__)
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/Public/GenericGraph.h b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/Public/GenericGraph.h
new file mode 100644
index 00000000..1ac0d39d
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/Public/GenericGraph.h
@@ -0,0 +1,60 @@
+#pragma once
+
+#include "CoreMinimal.h"
+#include "GenericGraphNode.h"
+#include "GenericGraphEdge.h"
+#include "GameplayTagContainer.h"
+#include "GenericGraph.generated.h"
+
+UCLASS(Blueprintable)
+class GENERICGRAPHRUNTIME_API UGenericGraph : public UObject
+{
+ GENERATED_BODY()
+
+public:
+ UGenericGraph();
+ virtual ~UGenericGraph();
+
+ UPROPERTY(EditDefaultsOnly, Category = "GenericGraph")
+ FString Name;
+
+ UPROPERTY(EditDefaultsOnly, Category = "GenericGraph")
+ TSubclassOf NodeType;
+
+ UPROPERTY(EditDefaultsOnly, Category = "GenericGraph")
+ TSubclassOf EdgeType;
+
+ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "GenericGraph")
+ FGameplayTagContainer GraphTags;
+
+ UPROPERTY(BlueprintReadOnly, Category = "GenericGraph")
+ TArray RootNodes;
+
+ UPROPERTY(BlueprintReadOnly, Category = "GenericGraph")
+ TArray AllNodes;
+
+ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "GenericGraph")
+ bool bEdgeEnabled;
+
+ UFUNCTION(BlueprintCallable, Category = "GenericGraph")
+ void Print(bool ToConsole = true, bool ToScreen = true);
+
+ UFUNCTION(BlueprintCallable, Category = "GenericGraph")
+ int GetLevelNum() const;
+
+ UFUNCTION(BlueprintCallable, Category = "GenericGraph")
+ void GetNodesByLevel(int Level, TArray& Nodes);
+
+ void ClearGraph();
+
+#if WITH_EDITORONLY_DATA
+ UPROPERTY()
+ class UEdGraph* EdGraph;
+
+ UPROPERTY(EditDefaultsOnly, Category = "GenericGraph_Editor")
+ bool bCanRenameNode;
+
+ UPROPERTY(EditDefaultsOnly, Category = "GenericGraph_Editor")
+ bool bCanBeCyclical;
+#endif
+};
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/Public/GenericGraphEdge.h b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/Public/GenericGraphEdge.h
new file mode 100644
index 00000000..3df297b4
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/Public/GenericGraphEdge.h
@@ -0,0 +1,48 @@
+#pragma once
+
+#include "CoreMinimal.h"
+#include "GenericGraphNode.h"
+#include "GenericGraphEdge.generated.h"
+
+class UGenericGraph;
+
+UCLASS(Blueprintable)
+class GENERICGRAPHRUNTIME_API UGenericGraphEdge : public UObject
+{
+ GENERATED_BODY()
+
+public:
+ UGenericGraphEdge();
+ virtual ~UGenericGraphEdge();
+
+ UPROPERTY(VisibleAnywhere, Category = "GenericGraphNode")
+ UGenericGraph* Graph;
+
+ UPROPERTY(BlueprintReadOnly, Category = "GenericGraphEdge")
+ UGenericGraphNode* StartNode;
+
+ UPROPERTY(BlueprintReadOnly, Category = "GenericGraphEdge")
+ UGenericGraphNode* EndNode;
+
+ UFUNCTION(BlueprintPure, Category = "GenericGraphEdge")
+ UGenericGraph* GetGraph() const;
+
+#if WITH_EDITORONLY_DATA
+ UPROPERTY(EditDefaultsOnly, Category = "GenericGraphNode_Editor")
+ bool bShouldDrawTitle = false;
+
+ UPROPERTY(EditDefaultsOnly, Category = "GenericGraphNode_Editor")
+ FText NodeTitle;
+
+ UPROPERTY(EditDefaultsOnly, Category = "GenericGraphEdge")
+ FLinearColor EdgeColour = FLinearColor(0.9f, 0.9f, 0.9f, 1.0f);
+#endif
+
+#if WITH_EDITOR
+ virtual FText GetNodeTitle() const { return NodeTitle; }
+ FLinearColor GetEdgeColour() { return EdgeColour; }
+
+ virtual void SetNodeTitle(const FText& NewTitle);
+#endif
+
+};
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/Public/GenericGraphNode.h b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/Public/GenericGraphNode.h
new file mode 100644
index 00000000..965d109e
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/Public/GenericGraphNode.h
@@ -0,0 +1,94 @@
+#pragma once
+
+#include "CoreMinimal.h"
+#include "Templates/SubclassOf.h"
+#include "GenericGraphNode.generated.h"
+
+class UGenericGraph;
+class UGenericGraphEdge;
+
+UENUM(BlueprintType)
+enum class ENodeLimit : uint8
+{
+ Unlimited,
+ Limited
+};
+
+
+UCLASS(Blueprintable)
+class GENERICGRAPHRUNTIME_API UGenericGraphNode : public UObject
+{
+ GENERATED_BODY()
+
+public:
+ UGenericGraphNode();
+ virtual ~UGenericGraphNode();
+
+ UPROPERTY(VisibleDefaultsOnly, Category = "GenericGraphNode")
+ UGenericGraph* Graph;
+
+ UPROPERTY(BlueprintReadOnly, Category = "GenericGraphNode")
+ TArray ParentNodes;
+
+ UPROPERTY(BlueprintReadOnly, Category = "GenericGraphNode")
+ TArray ChildrenNodes;
+
+ UPROPERTY(BlueprintReadOnly, Category = "GenericGraphNode")
+ TMap Edges;
+
+ UFUNCTION(BlueprintCallable, Category = "GenericGraphNode")
+ virtual UGenericGraphEdge* GetEdge(UGenericGraphNode* ChildNode);
+
+ UFUNCTION(BlueprintCallable, Category = "GenericGraphNode")
+ bool IsLeafNode() const;
+
+ UFUNCTION(BlueprintCallable, Category = "GenericGraphNode")
+ UGenericGraph* GetGraph() const;
+
+ UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "GenericGraphNode")
+ FText GetDescription() const;
+ virtual FText GetDescription_Implementation() const;
+
+ //////////////////////////////////////////////////////////////////////////
+#if WITH_EDITORONLY_DATA
+ UPROPERTY(EditDefaultsOnly, Category = "GenericGraphNode_Editor")
+ FText NodeTitle;
+
+ UPROPERTY(VisibleDefaultsOnly, Category = "GenericGraphNode_Editor")
+ TSubclassOf CompatibleGraphType;
+
+ UPROPERTY(EditDefaultsOnly, Category = "GenericGraphNode_Editor")
+ FLinearColor BackgroundColor;
+
+ UPROPERTY(EditDefaultsOnly, Category = "GenericGraphNode_Editor")
+ FText ContextMenuName;
+
+ UPROPERTY(EditDefaultsOnly, Category = "GenericGraphNode_Editor")
+ ENodeLimit ParentLimitType;
+
+ UPROPERTY(EditDefaultsOnly, Category = "GenericGraphNode_Editor" ,meta = (ClampMin = "0",EditCondition = "ParentLimitType == ENodeLimit::Limited", EditConditionHides))
+ int32 ParentLimit;
+
+ UPROPERTY(EditDefaultsOnly, Category = "GenericGraphNode_Editor")
+ ENodeLimit ChildrenLimitType;
+
+ UPROPERTY(EditDefaultsOnly, Category = "GenericGraphNode_Editor" ,meta = (ClampMin = "0",EditCondition = "ChildrenLimitType == ENodeLimit::Limited", EditConditionHides))
+ int32 ChildrenLimit;
+
+#endif
+
+#if WITH_EDITOR
+ virtual bool IsNameEditable() const;
+
+ virtual FLinearColor GetBackgroundColor() const;
+
+ virtual FText GetNodeTitle() const;
+
+ virtual void SetNodeTitle(const FText& NewTitle);
+
+ virtual bool CanCreateConnection(UGenericGraphNode* Other, FText& ErrorMessage);
+
+ virtual bool CanCreateConnectionTo(UGenericGraphNode* Other, int32 NumberOfChildrenNodes, FText& ErrorMessage);
+ virtual bool CanCreateConnectionFrom(UGenericGraphNode* Other, int32 NumberOfParentNodes, FText& ErrorMessage);
+#endif
+};
diff --git a/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/Public/IGenericGraphRuntime.h b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/Public/IGenericGraphRuntime.h
new file mode 100644
index 00000000..f978a2b6
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/Source/GenericGraphRuntime/Public/IGenericGraphRuntime.h
@@ -0,0 +1,36 @@
+#pragma once
+
+#include "Modules/ModuleManager.h"
+
+DECLARE_LOG_CATEGORY_EXTERN(GenericGraphRuntime, Log, All);
+
+/**
+ * The public interface to this module
+ */
+class IGenericGraphRuntime : public IModuleInterface
+{
+
+public:
+
+ /**
+ * Singleton-like access to this module's interface. This is just for convenience!
+ * Beware of calling this during the shutdown phase, though. Your module might have been unloaded already.
+ *
+ * @return Returns singleton instance, loading the module on demand if needed
+ */
+ static IGenericGraphRuntime& Get()
+ {
+ return FModuleManager::LoadModuleChecked< IGenericGraphRuntime >("GenericGraphRuntime");
+ }
+
+ /**
+ * Checks to see if this module is loaded and ready. It is only valid to call Get() if IsAvailable() returns true.
+ *
+ * @return True if the module is loaded and ready to use
+ */
+ static bool IsAvailable()
+ {
+ return FModuleManager::Get().IsModuleLoaded( "GenericGraphRuntime" );
+ }
+};
+
diff --git a/EndlessVendetta/Plugins/GenericGraph/docs/images/GenericGraph.png b/EndlessVendetta/Plugins/GenericGraph/docs/images/GenericGraph.png
new file mode 100644
index 00000000..0d899979
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/docs/images/GenericGraph.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:092185ad7a9989a69ba9543793326cf0f893fcc1a0895de65db3ca24ee7c970a
+size 89534
diff --git a/EndlessVendetta/Plugins/GenericGraph/docs/images/ability-graph.png b/EndlessVendetta/Plugins/GenericGraph/docs/images/ability-graph.png
new file mode 100644
index 00000000..b65adf2a
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/docs/images/ability-graph.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e97bb76a079e7e37c685cfa0f480c4028be755577939d8ae3d51be6e5571112c
+size 114519
diff --git a/EndlessVendetta/Plugins/GenericGraph/docs/images/dialogue/dialogue01.png b/EndlessVendetta/Plugins/GenericGraph/docs/images/dialogue/dialogue01.png
new file mode 100644
index 00000000..7fbb5326
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/docs/images/dialogue/dialogue01.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:95ab320c78c5ed1a79b78686a9e453bf459805b71ca6b855305f2ac328103d9e
+size 98959
diff --git a/EndlessVendetta/Plugins/GenericGraph/docs/images/dialogue/dialogue02.png b/EndlessVendetta/Plugins/GenericGraph/docs/images/dialogue/dialogue02.png
new file mode 100644
index 00000000..c03fde96
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/docs/images/dialogue/dialogue02.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cbbb01dc0b5af841164b8baeeebfb5aa769cb0710482f6accd984d02e0586eb9
+size 94706
diff --git a/EndlessVendetta/Plugins/GenericGraph/docs/images/dialogue/dialogue03.png b/EndlessVendetta/Plugins/GenericGraph/docs/images/dialogue/dialogue03.png
new file mode 100644
index 00000000..ec53962e
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/docs/images/dialogue/dialogue03.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a51f6bd700c3346982c523d3c6e535cadb7ec8f0dc6c806bd5c481e961e8969c
+size 95655
diff --git a/EndlessVendetta/Plugins/GenericGraph/readme.rst b/EndlessVendetta/Plugins/GenericGraph/readme.rst
new file mode 100644
index 00000000..f76c40ba
--- /dev/null
+++ b/EndlessVendetta/Plugins/GenericGraph/readme.rst
@@ -0,0 +1,51 @@
+GenericGraphPlugin
+==================
+
+Generic graph data structure plugin for ue4
+
+.. image:: docs/images/GenericGraph.png
+
+Feature
+-------
+
+* Custom asset type
+* UE4 BehaviorTree-like asset editor
+* Extendable graph node type
+* Extendable graph edge type
+* Extendable graph type(new asset type with generic graph editor, C++ only)
+
+Usage
+-----
+
+* Ability system
+* Dialogue system
+* Quest system
+* Etc
+
+Install
+-------
+
+#. Clone this project to ${YourProject}/Plugins/
+#. Generate project file
+#. Compile
+
+Tutorial
+--------
+
+`Dialogue System`_ (WIP)
+
+Example
+-------
+
+Dialogue System and ability system: SRPGTemplate_
+
+.. image:: docs/images/dialogue/dialogue01.png
+
+.. image:: docs/images/dialogue/dialogue02.png
+
+.. image:: docs/images/dialogue/dialogue03.png
+
+.. image:: docs/images/ability-graph.png
+
+.. _Dialogue System: https://jinyuliao.github.io/blog/html/2017/12/15/ue4_dialogue_system_part1.html
+.. _SRPGTemplate: https://github.com/jinyuliao/SRPGTemplate
diff --git a/EndlessVendetta/Source/DialogueSystemEditor/DialogueSystemEditor.Build.cs b/EndlessVendetta/Source/DialogueSystemEditor/DialogueSystemEditor.Build.cs
new file mode 100644
index 00000000..c1cb2430
--- /dev/null
+++ b/EndlessVendetta/Source/DialogueSystemEditor/DialogueSystemEditor.Build.cs
@@ -0,0 +1,36 @@
+using UnrealBuildTool;
+
+public class DialogueSystemEditor : ModuleRules
+{
+ public DialogueSystemEditor(ReadOnlyTargetRules Target) : base(Target)
+ {
+ PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
+
+ PublicIncludePaths.AddRange(
+ new string[]
+ {
+ "EndlessVendetta/DialogueSystem"
+ }
+ );
+
+ PublicDependencyModuleNames.AddRange(
+ new string[]
+ {
+ "Core",
+ }
+ );
+
+ PrivateDependencyModuleNames.AddRange(
+ new string[]
+ {
+ "CoreUObject",
+ "Engine",
+ "Slate",
+ "UnrealEd",
+ "SlateCore",
+ "GenericGraphRuntime",
+ "EndlessVendetta"
+ }
+ );
+ }
+}
\ No newline at end of file
diff --git a/EndlessVendetta/Source/DialogueSystemEditor/Private/DialogueSystemEditor.cpp b/EndlessVendetta/Source/DialogueSystemEditor/Private/DialogueSystemEditor.cpp
new file mode 100644
index 00000000..7a4fad39
--- /dev/null
+++ b/EndlessVendetta/Source/DialogueSystemEditor/Private/DialogueSystemEditor.cpp
@@ -0,0 +1,17 @@
+#include "DialogueSystemEditor.h"
+
+#define LOCTEXT_NAMESPACE "FDialogueSystemEditorModule"
+
+void FDialogueSystemEditorModule::StartupModule()
+{
+
+}
+
+void FDialogueSystemEditorModule::ShutdownModule()
+{
+
+}
+
+#undef LOCTEXT_NAMESPACE
+
+IMPLEMENT_MODULE(FDialogueSystemEditorModule, DialogueSystemEditor)
\ No newline at end of file
diff --git a/EndlessVendetta/Source/DialogueSystemEditor/Private/DialogueTreeFactory.cpp b/EndlessVendetta/Source/DialogueSystemEditor/Private/DialogueTreeFactory.cpp
new file mode 100644
index 00000000..a1f39692
--- /dev/null
+++ b/EndlessVendetta/Source/DialogueSystemEditor/Private/DialogueTreeFactory.cpp
@@ -0,0 +1,28 @@
+#include "DialogueTreeFactory.h"
+#include "DialogueTree.h"
+
+#define LOCTEXT_NAMESPACE "DialogueSessionFactory"
+
+UDialogueTreeFactory::UDialogueTreeFactory()
+{
+ bCreateNew = true;
+ bEditAfterNew = true;
+ SupportedClass = UDialogueTree::StaticClass();
+}
+
+UObject* UDialogueTreeFactory::FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn)
+{
+ return NewObject(InParent, Class, Name, Flags | RF_Transactional);
+}
+
+FText UDialogueTreeFactory::GetDisplayName() const
+{
+ return LOCTEXT("FactoryName", "Dialogue Tree");
+}
+
+FString UDialogueTreeFactory::GetDefaultNewAssetName() const
+{
+ return "DialogueTree";
+}
+
+#undef LOCTEXT_NAMESPACE
\ No newline at end of file
diff --git a/EndlessVendetta/Source/DialogueSystemEditor/Private/DialogueTreeFactory.h b/EndlessVendetta/Source/DialogueSystemEditor/Private/DialogueTreeFactory.h
new file mode 100644
index 00000000..80d6f49d
--- /dev/null
+++ b/EndlessVendetta/Source/DialogueSystemEditor/Private/DialogueTreeFactory.h
@@ -0,0 +1,18 @@
+#pragma once
+
+#include "CoreMinimal.h"
+#include "Factories/Factory.h"
+#include "DialogueTreeFactory.generated.h"
+
+UCLASS()
+class UDialogueTreeFactory : public UFactory
+{
+ GENERATED_BODY()
+
+public:
+ UDialogueTreeFactory();
+
+ virtual UObject* FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn) override;
+ virtual FText GetDisplayName() const override;
+ virtual FString GetDefaultNewAssetName() const override;
+};
\ No newline at end of file
diff --git a/EndlessVendetta/Source/DialogueSystemEditor/Public/DialogueSystemEditor.h b/EndlessVendetta/Source/DialogueSystemEditor/Public/DialogueSystemEditor.h
new file mode 100644
index 00000000..3333f03a
--- /dev/null
+++ b/EndlessVendetta/Source/DialogueSystemEditor/Public/DialogueSystemEditor.h
@@ -0,0 +1,11 @@
+#pragma once
+
+#include "CoreMinimal.h"
+#include "Modules/ModuleManager.h"
+
+class FDialogueSystemEditorModule : public IModuleInterface
+{
+public:
+ virtual void StartupModule() override;
+ virtual void ShutdownModule() override;
+};
diff --git a/EndlessVendetta/Source/EndlessVendetta/BountySystem/BountyClass.cpp b/EndlessVendetta/Source/EndlessVendetta/BountySystem/BountyClass.cpp
index 7ef3ff9d..e96b02ca 100644
--- a/EndlessVendetta/Source/EndlessVendetta/BountySystem/BountyClass.cpp
+++ b/EndlessVendetta/Source/EndlessVendetta/BountySystem/BountyClass.cpp
@@ -11,18 +11,14 @@ ABountyClass::ABountyClass()
}
-void ABountyClass::BeginPlay()
+void ABountyClass::ActivateFirstCheckpoint()
{
- Super::BeginPlay();
-
- SpawnCheckpoints();
+ if (BountyCheckpoints.IsEmpty() || BountyCheckpoints[0] == nullptr) return;
-}
-
-void ABountyClass::Tick(float DeltaTime)
-{
- Super::Tick(DeltaTime);
-
+ BountyCheckpoints[0]->Active = true;
+ BountyCheckpoints[0]->SpawnWaypoint(BountyTitle);
+ BountyCheckpoints[0]->CheckpointActivated();
+ BountyCheckpoints[0]->CompletedCheckpoint.AddDynamic(this, &ABountyClass::IncrementBountyCheckpoint);
}
void ABountyClass::SpawnCheckpoints()
@@ -46,49 +42,45 @@ void ABountyClass::SpawnCheckpoints()
BountyCheckpoints.Add(SpawnedCheckpoint);
}
- // Activate the first checkpoint and listen for its completion
- BountyCheckpoints[0]->Active = true;
- BountyCheckpoints[0]->SpawnWaypoint(BountyTitle);
- BountyCheckpoints[0]->CheckpointActivated();
- BountyCheckpoints[0]->CompletedCheckpoint.AddDynamic(this, &ABountyClass::IncrementBountyCheckpoint);
+ ActivateFirstCheckpoint();
}
void ABountyClass::IncrementBountyCheckpoint()
{
+ // ---------------------------------------------------------------------------------------------------------------------
// Broadcast that the first Checkpoint has been completed so that side bounties can be destroyed
- if (!BountyStarted)
- {
- BountyStarted = true;
- CompletedFirstCheckpoint.Broadcast();
- }
-
- // Bounty Completion Condition
- if (BountyCheckpoints.Num() <= 1)
- {
- Completed = true;
- BountyCheckpoints[0]->Active = false;
- BountyCheckpoints[0]->Destroy();
- BountyCheckpoints.RemoveAt(0);
- UE_LOG(LogTemp, Warning, TEXT(" You've Completed the Bounty!! Well done"));
- return;
- }
-
- if (BountyCheckpoints[0] == nullptr)
- {
- UE_LOG(LogTemp, Fatal, TEXT("Missing checkpoint in bounty checkpoints, could've failed to spawn or cast"));
- return;
- }
+ // if (!BountyStarted)
+ // {
+ // BountyStarted = true;
+ // CompletedFirstCheckpoint.Broadcast();
+ // }
+ //
+ // // Bounty Completion Condition
+ // if (BountyCheckpoints.Num() <= 1)
+ // {
+ // Completed = true;
+ // BountyCheckpoints[0]->Active = false;
+ // BountyCheckpoints[0]->Destroy();
+ // BountyCheckpoints.RemoveAt(0);
+ // UE_LOG(LogTemp, Warning, TEXT(" You've Completed the Bounty!! Well done"));
+ // return;
+ // }
+ //
+ // if (BountyCheckpoints[0] == nullptr)
+ // {
+ // UE_LOG(LogTemp, Fatal, TEXT("Missing checkpoint in bounty checkpoints, could've failed to spawn or cast"));
+ // return;
+ // }
+ //---------------------------------------------------------------------------------------------------------------------
+ if (BountyCheckpoints.IsEmpty() || BountyCheckpoints[0] == nullptr) return;
+
// Destroy Actor and Shrink Array
BountyCheckpoints[0]->Active = false;
BountyCheckpoints[0]->Destroy();
BountyCheckpoints.RemoveAt(0);
- // Set the new checkpoint in pos 0 to be active and listen for it's completion
- BountyCheckpoints[0]->Active = true;
- BountyCheckpoints[0]->SpawnWaypoint(BountyTitle);
- BountyCheckpoints[0]->CheckpointActivated();
- BountyCheckpoints[0]->CompletedCheckpoint.AddDynamic(this, &ABountyClass::IncrementBountyCheckpoint);
+ ActivateFirstCheckpoint();
}
void ABountyClass::CollectRewards_Implementation()
diff --git a/EndlessVendetta/Source/EndlessVendetta/BountySystem/BountyClass.h b/EndlessVendetta/Source/EndlessVendetta/BountySystem/BountyClass.h
index 35b33288..94cb313b 100644
--- a/EndlessVendetta/Source/EndlessVendetta/BountySystem/BountyClass.h
+++ b/EndlessVendetta/Source/EndlessVendetta/BountySystem/BountyClass.h
@@ -8,21 +8,58 @@
#include "BountyClass.generated.h"
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FCompletedFirstCheckpoint);
+DECLARE_DYNAMIC_MULTICAST_DELEGATE(FCompletedACheckpoint);
UCLASS()
class ENDLESSVENDETTA_API ABountyClass : public AActor
{
GENERATED_BODY()
- // Used to temp store value of incoming replacement checkpoint class
- TSubclassOf ReplacementCheckpointClass;
+// ------------------- ATTRIBUTES ------------------------------
+
+ // Array of Checkpoint Classes to Spawn for this Bounty
+ UPROPERTY(EditDefaultsOnly, Category = "Bounty")
+ TArray> CheckpointsToSpawn;
+
+protected:
+ // Array of References to the Spawned in Checkpoints for this Bounty
+ TArray BountyCheckpoints;
+
+public:
+ FCompletedACheckpoint CompletedACheckpoint;
+
+
+// ------------------- METHODS ---------------------------------
+private:
+ // Activate the First Checkpoint in Bounty Checkpoints and Listen for its Completion
+ void ActivateFirstCheckpoint();
+
+protected:
+ // Called when a checkpoint is completed, handles moving onto next checkpoint and discarding the old one
+ UFUNCTION()
+ virtual void IncrementBountyCheckpoint();
+
+public:
+ // Sets default values for this actor's properties
+ ABountyClass();
+
+ // Spawns and stores this Bounties Checkpoints in order
+ void SpawnCheckpoints();
+
+
+
+
+
+
+
+// ------------------- LEGACY CODE TO BE REWORKED ---------------------------------
+
bool BountyStarted = false;
protected:
// ------- Properties Set in Editor --------------
- UPROPERTY(EditDefaultsOnly, Category = "Bounty")
- TArray