diff --git a/Content/BPs/AI.uasset b/Content/BPs/AI.uasset index e938edc..202f78a 100644 Binary files a/Content/BPs/AI.uasset and b/Content/BPs/AI.uasset differ diff --git a/Content/BPs/Birdview.uasset b/Content/BPs/Birdview.uasset index 431f47a..aeafc34 100644 Binary files a/Content/BPs/Birdview.uasset and b/Content/BPs/Birdview.uasset differ diff --git a/Content/BPs/BridgetBP.uasset b/Content/BPs/BridgetBP.uasset index 4410abf..0af6200 100644 Binary files a/Content/BPs/BridgetBP.uasset and b/Content/BPs/BridgetBP.uasset differ diff --git a/Content/BPs/CameraShake.uasset b/Content/BPs/CameraShake.uasset index 3cebcee..be7afb1 100644 Binary files a/Content/BPs/CameraShake.uasset and b/Content/BPs/CameraShake.uasset differ diff --git a/Content/BPs/CityExpansion.uasset b/Content/BPs/CityExpansion.uasset index 1c863e8..bfb04aa 100644 Binary files a/Content/BPs/CityExpansion.uasset and b/Content/BPs/CityExpansion.uasset differ diff --git a/Content/BPs/Daily.uasset b/Content/BPs/Daily.uasset index 7222cc2..d426feb 100644 Binary files a/Content/BPs/Daily.uasset and b/Content/BPs/Daily.uasset differ diff --git a/Content/BPs/Daily_F.uasset b/Content/BPs/Daily_F.uasset index 07ebecb..aea91e9 100644 Binary files a/Content/BPs/Daily_F.uasset and b/Content/BPs/Daily_F.uasset differ diff --git a/Content/BPs/FirstPerson.uasset b/Content/BPs/FirstPerson.uasset index 3fceadb..6c7f06d 100644 Binary files a/Content/BPs/FirstPerson.uasset and b/Content/BPs/FirstPerson.uasset differ diff --git a/Content/BPs/FullScreenMode.uasset b/Content/BPs/FullScreenMode.uasset index 1116935..44b8b83 100644 Binary files a/Content/BPs/FullScreenMode.uasset and b/Content/BPs/FullScreenMode.uasset differ diff --git a/Content/BPs/GM.uasset b/Content/BPs/GM.uasset index f93a911..26a6844 100644 Binary files a/Content/BPs/GM.uasset and b/Content/BPs/GM.uasset differ diff --git a/Content/BPs/GameSettings.uasset b/Content/BPs/GameSettings.uasset index 7b29d6b..c3b4707 100644 Binary files a/Content/BPs/GameSettings.uasset and b/Content/BPs/GameSettings.uasset differ diff --git a/Content/BPs/HISM.uasset b/Content/BPs/HISM.uasset index 4da8374..3cf0686 100644 Binary files a/Content/BPs/HISM.uasset and b/Content/BPs/HISM.uasset differ diff --git a/Content/BPs/LightSource.uasset b/Content/BPs/LightSource.uasset index c0e7440..15dbf6e 100644 Binary files a/Content/BPs/LightSource.uasset and b/Content/BPs/LightSource.uasset differ diff --git a/Content/BPs/MapMarkers.uasset b/Content/BPs/MapMarkers.uasset index 4560a2e..3bbfa72 100644 Binary files a/Content/BPs/MapMarkers.uasset and b/Content/BPs/MapMarkers.uasset differ diff --git a/Content/BPs/MapStreets.uasset b/Content/BPs/MapStreets.uasset index 70a5be4..636a210 100644 Binary files a/Content/BPs/MapStreets.uasset and b/Content/BPs/MapStreets.uasset differ diff --git a/Content/BPs/PC.uasset b/Content/BPs/PC.uasset index 8f25b22..6ac7519 100644 Binary files a/Content/BPs/PC.uasset and b/Content/BPs/PC.uasset differ diff --git a/Content/BPs/Pawn.uasset b/Content/BPs/Pawn.uasset index 64a4dbb..2c5ae39 100644 Binary files a/Content/BPs/Pawn.uasset and b/Content/BPs/Pawn.uasset differ diff --git a/Content/BPs/Person.uasset b/Content/BPs/Person.uasset index 28c1760..5618e71 100644 Binary files a/Content/BPs/Person.uasset and b/Content/BPs/Person.uasset differ diff --git a/Content/BPs/Room.uasset b/Content/BPs/Room.uasset index 3ce2eb2..0c671c8 100644 Binary files a/Content/BPs/Room.uasset and b/Content/BPs/Room.uasset differ diff --git a/Content/BPs/Save.uasset b/Content/BPs/Save.uasset index 59174be..8702fbc 100644 Binary files a/Content/BPs/Save.uasset and b/Content/BPs/Save.uasset differ diff --git a/Content/BPs/SecondScreenFloor.uasset b/Content/BPs/SecondScreenFloor.uasset index afcd38e..e42e35b 100644 Binary files a/Content/BPs/SecondScreenFloor.uasset and b/Content/BPs/SecondScreenFloor.uasset differ diff --git a/Content/BPs/SkyBox.uasset b/Content/BPs/SkyBox.uasset index d464a8e..296e8af 100644 Binary files a/Content/BPs/SkyBox.uasset and b/Content/BPs/SkyBox.uasset differ diff --git a/Content/BPs/StreetMap_Static.uasset b/Content/BPs/StreetMap_Static.uasset index a2155d7..5e4e686 100644 Binary files a/Content/BPs/StreetMap_Static.uasset and b/Content/BPs/StreetMap_Static.uasset differ diff --git a/Content/BPs/TestBall.uasset b/Content/BPs/TestBall.uasset index 6a86df4..9a3468c 100644 Binary files a/Content/BPs/TestBall.uasset and b/Content/BPs/TestBall.uasset differ diff --git a/Content/BPs/TestPerson.uasset b/Content/BPs/TestPerson.uasset index ff8eb95..55db871 100644 Binary files a/Content/BPs/TestPerson.uasset and b/Content/BPs/TestPerson.uasset differ diff --git a/Content/BPs/TestStatic.uasset b/Content/BPs/TestStatic.uasset index 17d06cc..f044fd9 100644 Binary files a/Content/BPs/TestStatic.uasset and b/Content/BPs/TestStatic.uasset differ diff --git a/Content/Characters/Textures/NormalMap.uasset b/Content/Characters/Textures/NormalMap.uasset index 52f2d40..2a77771 100644 Binary files a/Content/Characters/Textures/NormalMap.uasset and b/Content/Characters/Textures/NormalMap.uasset differ diff --git a/Content/Render/BackgroundMaterial.uasset b/Content/Render/BackgroundMaterial.uasset index 4c5c21e..9cd10a2 100644 Binary files a/Content/Render/BackgroundMaterial.uasset and b/Content/Render/BackgroundMaterial.uasset differ diff --git a/Content/Render/FaceMaterialRound.uasset b/Content/Render/FaceMaterialRound.uasset index c6fa8a2..f6f2b8b 100644 Binary files a/Content/Render/FaceMaterialRound.uasset and b/Content/Render/FaceMaterialRound.uasset differ diff --git a/Content/Render/FaceMaterialSquircle.uasset b/Content/Render/FaceMaterialSquircle.uasset index 9f47856..569d5bc 100644 Binary files a/Content/Render/FaceMaterialSquircle.uasset and b/Content/Render/FaceMaterialSquircle.uasset differ diff --git a/Content/Render/FaceRT.uasset b/Content/Render/FaceRT.uasset index 93e5bbb..c69ac0f 100644 Binary files a/Content/Render/FaceRT.uasset and b/Content/Render/FaceRT.uasset differ diff --git a/Content/Render/SecondScreen.uasset b/Content/Render/SecondScreen.uasset index 1e62dd3..dcb55be 100644 Binary files a/Content/Render/SecondScreen.uasset and b/Content/Render/SecondScreen.uasset differ diff --git a/Content/Render/SecondScreenMat.uasset b/Content/Render/SecondScreenMat.uasset index c2e0261..56f93a2 100644 Binary files a/Content/Render/SecondScreenMat.uasset and b/Content/Render/SecondScreenMat.uasset differ diff --git a/Content/Render/ToonLines.uasset b/Content/Render/ToonLines.uasset index 9c93bbc..1efd6c3 100644 Binary files a/Content/Render/ToonLines.uasset and b/Content/Render/ToonLines.uasset differ diff --git a/Content/Render/ToonLines_Inst.uasset b/Content/Render/ToonLines_Inst.uasset index 80a7274..14e4bb3 100644 Binary files a/Content/Render/ToonLines_Inst.uasset and b/Content/Render/ToonLines_Inst.uasset differ diff --git a/Content/Render/ToonShader.uasset b/Content/Render/ToonShader.uasset index 902460b..bdcddb1 100644 Binary files a/Content/Render/ToonShader.uasset and b/Content/Render/ToonShader.uasset differ diff --git a/Content/Render/mask.uasset b/Content/Render/mask.uasset index 8eaa429..c5cf52f 100644 Binary files a/Content/Render/mask.uasset and b/Content/Render/mask.uasset differ diff --git a/Content/Render/squircle.uasset b/Content/Render/squircle.uasset index ed1dcf5..3921c06 100644 Binary files a/Content/Render/squircle.uasset and b/Content/Render/squircle.uasset differ diff --git a/Content/Scenes/CentralLondon.umap b/Content/Scenes/CentralLondon.umap index 8d6e1c9..6e186d1 100644 Binary files a/Content/Scenes/CentralLondon.umap and b/Content/Scenes/CentralLondon.umap differ diff --git a/Content/Scenes/CentralLondon_BuiltData.uasset b/Content/Scenes/CentralLondon_BuiltData.uasset index 4701866..fdb879e 100644 Binary files a/Content/Scenes/CentralLondon_BuiltData.uasset and b/Content/Scenes/CentralLondon_BuiltData.uasset differ diff --git a/Content/Structs/Achievement.uasset b/Content/Structs/Achievement.uasset index 55c1a30..35043e3 100644 Binary files a/Content/Structs/Achievement.uasset and b/Content/Structs/Achievement.uasset differ diff --git a/Content/Structs/AchievementType.uasset b/Content/Structs/AchievementType.uasset index da71847..d601a84 100644 Binary files a/Content/Structs/AchievementType.uasset and b/Content/Structs/AchievementType.uasset differ diff --git a/Content/Structs/ActionDetail.uasset b/Content/Structs/ActionDetail.uasset index da47f32..40af865 100644 Binary files a/Content/Structs/ActionDetail.uasset and b/Content/Structs/ActionDetail.uasset differ diff --git a/Content/Structs/ActorVar.uasset b/Content/Structs/ActorVar.uasset index 1d3d821..0bc918d 100644 Binary files a/Content/Structs/ActorVar.uasset and b/Content/Structs/ActorVar.uasset differ diff --git a/Content/Structs/ActorVars.uasset b/Content/Structs/ActorVars.uasset index 16e235c..335d2e7 100644 Binary files a/Content/Structs/ActorVars.uasset and b/Content/Structs/ActorVars.uasset differ diff --git a/Content/Structs/AmenityAction.uasset b/Content/Structs/AmenityAction.uasset index d571f94..812b86d 100644 Binary files a/Content/Structs/AmenityAction.uasset and b/Content/Structs/AmenityAction.uasset differ diff --git a/Content/Structs/AmenityImg.uasset b/Content/Structs/AmenityImg.uasset index 7357649..b606ca6 100644 Binary files a/Content/Structs/AmenityImg.uasset and b/Content/Structs/AmenityImg.uasset differ diff --git a/Content/Structs/AmenityPresets.uasset b/Content/Structs/AmenityPresets.uasset index 850afe7..b83403b 100644 Binary files a/Content/Structs/AmenityPresets.uasset and b/Content/Structs/AmenityPresets.uasset differ diff --git a/Content/Structs/Anim.uasset b/Content/Structs/Anim.uasset index adfcc31..faed312 100644 Binary files a/Content/Structs/Anim.uasset and b/Content/Structs/Anim.uasset differ diff --git a/Content/Structs/BuildingUntil.uasset b/Content/Structs/BuildingUntil.uasset index 72148e5..2211ba8 100644 Binary files a/Content/Structs/BuildingUntil.uasset and b/Content/Structs/BuildingUntil.uasset differ diff --git a/Content/Structs/Business.uasset b/Content/Structs/Business.uasset index 3a32b6a..b7ff81e 100644 Binary files a/Content/Structs/Business.uasset and b/Content/Structs/Business.uasset differ diff --git a/Content/Structs/ChanceMinMax.uasset b/Content/Structs/ChanceMinMax.uasset index f46e415..c9a2af9 100644 Binary files a/Content/Structs/ChanceMinMax.uasset and b/Content/Structs/ChanceMinMax.uasset differ diff --git a/Content/Structs/ChancePreset.uasset b/Content/Structs/ChancePreset.uasset index 5310b75..03bae25 100644 Binary files a/Content/Structs/ChancePreset.uasset and b/Content/Structs/ChancePreset.uasset differ diff --git a/Content/Structs/ChangeOverTime.uasset b/Content/Structs/ChangeOverTime.uasset index f497760..231ead9 100644 Binary files a/Content/Structs/ChangeOverTime.uasset and b/Content/Structs/ChangeOverTime.uasset differ diff --git a/Content/Structs/City.uasset b/Content/Structs/City.uasset index 447438c..186be08 100644 Binary files a/Content/Structs/City.uasset and b/Content/Structs/City.uasset differ diff --git a/Content/Structs/Cloth.uasset b/Content/Structs/Cloth.uasset index 1f7909a..8d65857 100644 Binary files a/Content/Structs/Cloth.uasset and b/Content/Structs/Cloth.uasset differ diff --git a/Content/Structs/ConditionDesc.uasset b/Content/Structs/ConditionDesc.uasset index 9e54316..ead1e35 100644 Binary files a/Content/Structs/ConditionDesc.uasset and b/Content/Structs/ConditionDesc.uasset differ diff --git a/Content/Structs/ConditionDirtyTalks.uasset b/Content/Structs/ConditionDirtyTalks.uasset index 00f9bd6..7c8bf9b 100644 Binary files a/Content/Structs/ConditionDirtyTalks.uasset and b/Content/Structs/ConditionDirtyTalks.uasset differ diff --git a/Content/Structs/Custom.uasset b/Content/Structs/Custom.uasset index b494495..06039d0 100644 Binary files a/Content/Structs/Custom.uasset and b/Content/Structs/Custom.uasset differ diff --git a/Content/Structs/DelayedChange.uasset b/Content/Structs/DelayedChange.uasset index 9349265..188d822 100644 Binary files a/Content/Structs/DelayedChange.uasset and b/Content/Structs/DelayedChange.uasset differ diff --git a/Content/Structs/Effect.uasset b/Content/Structs/Effect.uasset index e8ba567..2581608 100644 Binary files a/Content/Structs/Effect.uasset and b/Content/Structs/Effect.uasset differ diff --git a/Content/Structs/Employee.uasset b/Content/Structs/Employee.uasset index 6000b2e..bbd1a99 100644 Binary files a/Content/Structs/Employee.uasset and b/Content/Structs/Employee.uasset differ diff --git a/Content/Structs/Favorite.uasset b/Content/Structs/Favorite.uasset index 5dca1d0..df5d498 100644 Binary files a/Content/Structs/Favorite.uasset and b/Content/Structs/Favorite.uasset differ diff --git a/Content/Structs/FloatArray.uasset b/Content/Structs/FloatArray.uasset index e38ec58..4d4ee92 100644 Binary files a/Content/Structs/FloatArray.uasset and b/Content/Structs/FloatArray.uasset differ diff --git a/Content/Structs/IntArray.uasset b/Content/Structs/IntArray.uasset index 1680c1c..a667b1e 100644 Binary files a/Content/Structs/IntArray.uasset and b/Content/Structs/IntArray.uasset differ diff --git a/Content/Structs/IntStrings.uasset b/Content/Structs/IntStrings.uasset index ec22f6f..3a3bf3c 100644 Binary files a/Content/Structs/IntStrings.uasset and b/Content/Structs/IntStrings.uasset differ diff --git a/Content/Structs/Inventory.uasset b/Content/Structs/Inventory.uasset index fd906f1..e308b2e 100644 Binary files a/Content/Structs/Inventory.uasset and b/Content/Structs/Inventory.uasset differ diff --git a/Content/Structs/Major.uasset b/Content/Structs/Major.uasset index 7ba76f7..d0da2ce 100644 Binary files a/Content/Structs/Major.uasset and b/Content/Structs/Major.uasset differ diff --git a/Content/Structs/MaterialArray.uasset b/Content/Structs/MaterialArray.uasset index 438964c..f56aba9 100644 Binary files a/Content/Structs/MaterialArray.uasset and b/Content/Structs/MaterialArray.uasset differ diff --git a/Content/Structs/MeshSexRace.uasset b/Content/Structs/MeshSexRace.uasset index b25e749..008d849 100644 Binary files a/Content/Structs/MeshSexRace.uasset and b/Content/Structs/MeshSexRace.uasset differ diff --git a/Content/Structs/ModEnabled.uasset b/Content/Structs/ModEnabled.uasset index dc90c44..8ee3b02 100644 Binary files a/Content/Structs/ModEnabled.uasset and b/Content/Structs/ModEnabled.uasset differ diff --git a/Content/Structs/Month.uasset b/Content/Structs/Month.uasset index 77d6685..746e973 100644 Binary files a/Content/Structs/Month.uasset and b/Content/Structs/Month.uasset differ diff --git a/Content/Structs/MorphSlider.uasset b/Content/Structs/MorphSlider.uasset index a781bc5..9b43751 100644 Binary files a/Content/Structs/MorphSlider.uasset and b/Content/Structs/MorphSlider.uasset differ diff --git a/Content/Structs/NameFloat.uasset b/Content/Structs/NameFloat.uasset index 533cb30..cf15660 100644 Binary files a/Content/Structs/NameFloat.uasset and b/Content/Structs/NameFloat.uasset differ diff --git a/Content/Structs/NameText.uasset b/Content/Structs/NameText.uasset index fbc3395..be91949 100644 Binary files a/Content/Structs/NameText.uasset and b/Content/Structs/NameText.uasset differ diff --git a/Content/Structs/Perk.uasset b/Content/Structs/Perk.uasset index 474c117..43b8bb7 100644 Binary files a/Content/Structs/Perk.uasset and b/Content/Structs/Perk.uasset differ diff --git a/Content/Structs/PersonData.uasset b/Content/Structs/PersonData.uasset index 0b68494..2c19ee4 100644 Binary files a/Content/Structs/PersonData.uasset and b/Content/Structs/PersonData.uasset differ diff --git a/Content/Structs/PlaceBuilding.uasset b/Content/Structs/PlaceBuilding.uasset index 13b71a6..c9dce20 100644 Binary files a/Content/Structs/PlaceBuilding.uasset and b/Content/Structs/PlaceBuilding.uasset differ diff --git a/Content/Structs/Pregnancy.uasset b/Content/Structs/Pregnancy.uasset index 588cb28..db3a1ed 100644 Binary files a/Content/Structs/Pregnancy.uasset and b/Content/Structs/Pregnancy.uasset differ diff --git a/Content/Structs/Quest.uasset b/Content/Structs/Quest.uasset index b0e17b8..ec358ce 100644 Binary files a/Content/Structs/Quest.uasset and b/Content/Structs/Quest.uasset differ diff --git a/Content/Structs/RelationshipPersons.uasset b/Content/Structs/RelationshipPersons.uasset index d8fa47e..48597db 100644 Binary files a/Content/Structs/RelationshipPersons.uasset and b/Content/Structs/RelationshipPersons.uasset differ diff --git a/Content/Structs/Room.uasset b/Content/Structs/Room.uasset index 0e9ea57..3005ebf 100644 Binary files a/Content/Structs/Room.uasset and b/Content/Structs/Room.uasset differ diff --git a/Content/Structs/RoomObject.uasset b/Content/Structs/RoomObject.uasset index a1ac423..f6df6d2 100644 Binary files a/Content/Structs/RoomObject.uasset and b/Content/Structs/RoomObject.uasset differ diff --git a/Content/Structs/RoomObjectMat.uasset b/Content/Structs/RoomObjectMat.uasset index 1e7053d..57957bc 100644 Binary files a/Content/Structs/RoomObjectMat.uasset and b/Content/Structs/RoomObjectMat.uasset differ diff --git a/Content/Structs/SMBool.uasset b/Content/Structs/SMBool.uasset index 90ced43..f0ba703 100644 Binary files a/Content/Structs/SMBool.uasset and b/Content/Structs/SMBool.uasset differ diff --git a/Content/Structs/SMBools.uasset b/Content/Structs/SMBools.uasset index c7b2027..aa5dac6 100644 Binary files a/Content/Structs/SMBools.uasset and b/Content/Structs/SMBools.uasset differ diff --git a/Content/Structs/Scene.uasset b/Content/Structs/Scene.uasset index cd931f8..6da8144 100644 Binary files a/Content/Structs/Scene.uasset and b/Content/Structs/Scene.uasset differ diff --git a/Content/Structs/StatValue.uasset b/Content/Structs/StatValue.uasset index 212800c..b35d11b 100644 Binary files a/Content/Structs/StatValue.uasset and b/Content/Structs/StatValue.uasset differ diff --git a/Content/Structs/StringArray.uasset b/Content/Structs/StringArray.uasset index dfa7f2f..5381c66 100644 Binary files a/Content/Structs/StringArray.uasset and b/Content/Structs/StringArray.uasset differ diff --git a/Content/Structs/StringArrayArray.uasset b/Content/Structs/StringArrayArray.uasset index 804be23..adadc28 100644 Binary files a/Content/Structs/StringArrayArray.uasset and b/Content/Structs/StringArrayArray.uasset differ diff --git a/Content/Structs/StringString.uasset b/Content/Structs/StringString.uasset index d2140ab..18c64fa 100644 Binary files a/Content/Structs/StringString.uasset and b/Content/Structs/StringString.uasset differ diff --git a/Content/Structs/StringWindowMode.uasset b/Content/Structs/StringWindowMode.uasset index 28b7fb5..0c64629 100644 Binary files a/Content/Structs/StringWindowMode.uasset and b/Content/Structs/StringWindowMode.uasset differ diff --git a/Content/Structs/StringsString.uasset b/Content/Structs/StringsString.uasset index 4180ac0..4ab0b45 100644 Binary files a/Content/Structs/StringsString.uasset and b/Content/Structs/StringsString.uasset differ diff --git a/Content/Structs/Te2dArray.uasset b/Content/Structs/Te2dArray.uasset index 67bb5e7..58a7b76 100644 Binary files a/Content/Structs/Te2dArray.uasset and b/Content/Structs/Te2dArray.uasset differ diff --git a/Content/Structs/Toy.uasset b/Content/Structs/Toy.uasset index 6205f0e..74b1554 100644 Binary files a/Content/Structs/Toy.uasset and b/Content/Structs/Toy.uasset differ diff --git a/Content/Structs/Toys.uasset b/Content/Structs/Toys.uasset index 7a0f6cc..185adb5 100644 Binary files a/Content/Structs/Toys.uasset and b/Content/Structs/Toys.uasset differ diff --git a/Content/Structs/Variable.uasset b/Content/Structs/Variable.uasset index 57fe452..b4463a8 100644 Binary files a/Content/Structs/Variable.uasset and b/Content/Structs/Variable.uasset differ diff --git a/Content/UI/Achievement.uasset b/Content/UI/Achievement.uasset index 2f85c4f..e67d8df 100644 Binary files a/Content/UI/Achievement.uasset and b/Content/UI/Achievement.uasset differ diff --git a/Content/UI/Action.uasset b/Content/UI/Action.uasset index fa9871b..906f074 100644 Binary files a/Content/UI/Action.uasset and b/Content/UI/Action.uasset differ diff --git a/Content/UI/Backgrounds/sports_centre.uasset b/Content/UI/Backgrounds/sports_centre.uasset index 957a000..5cad51d 100644 Binary files a/Content/UI/Backgrounds/sports_centre.uasset and b/Content/UI/Backgrounds/sports_centre.uasset differ diff --git a/Content/UI/Banner.uasset b/Content/UI/Banner.uasset index 606b576..c0c8c3f 100644 Binary files a/Content/UI/Banner.uasset and b/Content/UI/Banner.uasset differ diff --git a/Content/UI/BodyShape.uasset b/Content/UI/BodyShape.uasset index 7747758..03648c7 100644 Binary files a/Content/UI/BodyShape.uasset and b/Content/UI/BodyShape.uasset differ diff --git a/Content/UI/BodyShapeMenu.uasset b/Content/UI/BodyShapeMenu.uasset index 197d914..1adb44c 100644 Binary files a/Content/UI/BodyShapeMenu.uasset and b/Content/UI/BodyShapeMenu.uasset differ diff --git a/Content/UI/Bondage.uasset b/Content/UI/Bondage.uasset index f6e8f16..c09d6d4 100644 Binary files a/Content/UI/Bondage.uasset and b/Content/UI/Bondage.uasset differ diff --git a/Content/UI/Bubble.uasset b/Content/UI/Bubble.uasset index b4002c3..8b15e98 100644 Binary files a/Content/UI/Bubble.uasset and b/Content/UI/Bubble.uasset differ diff --git a/Content/UI/Builder.uasset b/Content/UI/Builder.uasset index a4c7d77..ebebae0 100644 Binary files a/Content/UI/Builder.uasset and b/Content/UI/Builder.uasset differ diff --git a/Content/UI/BuilderFnt.uasset b/Content/UI/BuilderFnt.uasset index a4967a2..e972678 100644 Binary files a/Content/UI/BuilderFnt.uasset and b/Content/UI/BuilderFnt.uasset differ diff --git a/Content/UI/BuilderSlot.uasset b/Content/UI/BuilderSlot.uasset index 5ca4f81..f068af1 100644 Binary files a/Content/UI/BuilderSlot.uasset and b/Content/UI/BuilderSlot.uasset differ diff --git a/Content/UI/BuilderTexture.uasset b/Content/UI/BuilderTexture.uasset index 579503a..47e9d7e 100644 Binary files a/Content/UI/BuilderTexture.uasset and b/Content/UI/BuilderTexture.uasset differ diff --git a/Content/UI/BuildingEdit.uasset b/Content/UI/BuildingEdit.uasset index b58d27f..a8fb98a 100644 Binary files a/Content/UI/BuildingEdit.uasset and b/Content/UI/BuildingEdit.uasset differ diff --git a/Content/UI/Censore.uasset b/Content/UI/Censore.uasset index ba58b9a..287e165 100644 Binary files a/Content/UI/Censore.uasset and b/Content/UI/Censore.uasset differ diff --git a/Content/UI/CensoreBoobs.uasset b/Content/UI/CensoreBoobs.uasset index 9f6fb2b..12fe4cf 100644 Binary files a/Content/UI/CensoreBoobs.uasset and b/Content/UI/CensoreBoobs.uasset differ diff --git a/Content/UI/CharGen.uasset b/Content/UI/CharGen.uasset index 2189071..aba6fdd 100644 Binary files a/Content/UI/CharGen.uasset and b/Content/UI/CharGen.uasset differ diff --git a/Content/UI/CharGenSlider.uasset b/Content/UI/CharGenSlider.uasset index 689679c..56626e3 100644 Binary files a/Content/UI/CharGenSlider.uasset and b/Content/UI/CharGenSlider.uasset differ diff --git a/Content/UI/City.uasset b/Content/UI/City.uasset index 1b99c57..05098ab 100644 Binary files a/Content/UI/City.uasset and b/Content/UI/City.uasset differ diff --git a/Content/UI/CityMenu.uasset b/Content/UI/CityMenu.uasset index 2b35c51..ae38b3c 100644 Binary files a/Content/UI/CityMenu.uasset and b/Content/UI/CityMenu.uasset differ diff --git a/Content/UI/ColorSlot.uasset b/Content/UI/ColorSlot.uasset index d928aaf..2938b1d 100644 Binary files a/Content/UI/ColorSlot.uasset and b/Content/UI/ColorSlot.uasset differ diff --git a/Content/UI/Contact.uasset b/Content/UI/Contact.uasset index c8060f8..222e720 100644 Binary files a/Content/UI/Contact.uasset and b/Content/UI/Contact.uasset differ diff --git a/Content/UI/ContactContact.uasset b/Content/UI/ContactContact.uasset index 7c6e1e4..2436282 100644 Binary files a/Content/UI/ContactContact.uasset and b/Content/UI/ContactContact.uasset differ diff --git a/Content/UI/ContactMenu.uasset b/Content/UI/ContactMenu.uasset index 36f4d06..4dce3f4 100644 Binary files a/Content/UI/ContactMenu.uasset and b/Content/UI/ContactMenu.uasset differ diff --git a/Content/UI/Cursor.uasset b/Content/UI/Cursor.uasset index e509dc2..e7014ed 100644 Binary files a/Content/UI/Cursor.uasset and b/Content/UI/Cursor.uasset differ diff --git a/Content/UI/DirtyTalk.uasset b/Content/UI/DirtyTalk.uasset index b8c9996..406b515 100644 Binary files a/Content/UI/DirtyTalk.uasset and b/Content/UI/DirtyTalk.uasset differ diff --git a/Content/UI/ExtImg.uasset b/Content/UI/ExtImg.uasset index db2320b..1337b11 100644 Binary files a/Content/UI/ExtImg.uasset and b/Content/UI/ExtImg.uasset differ diff --git a/Content/UI/FAQ.uasset b/Content/UI/FAQ.uasset index a11dc10..467e7f0 100644 Binary files a/Content/UI/FAQ.uasset and b/Content/UI/FAQ.uasset differ diff --git a/Content/UI/FaceTexture.uasset b/Content/UI/FaceTexture.uasset index fdd9e44..c94010c 100644 Binary files a/Content/UI/FaceTexture.uasset and b/Content/UI/FaceTexture.uasset differ diff --git a/Content/UI/Favorite.uasset b/Content/UI/Favorite.uasset index d7b48e1..6046bf4 100644 Binary files a/Content/UI/Favorite.uasset and b/Content/UI/Favorite.uasset differ diff --git a/Content/UI/GenitalSlider.uasset b/Content/UI/GenitalSlider.uasset index 4b90b45..526b521 100644 Binary files a/Content/UI/GenitalSlider.uasset and b/Content/UI/GenitalSlider.uasset differ diff --git a/Content/UI/Hairstyle.uasset b/Content/UI/Hairstyle.uasset index b1f8a28..482212a 100644 Binary files a/Content/UI/Hairstyle.uasset and b/Content/UI/Hairstyle.uasset differ diff --git a/Content/UI/Icons/Amenities/Alcohol.uasset b/Content/UI/Icons/Amenities/Alcohol.uasset index c681341..02cc0e5 100644 Binary files a/Content/UI/Icons/Amenities/Alcohol.uasset and b/Content/UI/Icons/Amenities/Alcohol.uasset differ diff --git a/Content/UI/Icons/Amenities/Bag.uasset b/Content/UI/Icons/Amenities/Bag.uasset index 876f7d3..2d93143 100644 Binary files a/Content/UI/Icons/Amenities/Bag.uasset and b/Content/UI/Icons/Amenities/Bag.uasset differ diff --git a/Content/UI/Icons/Amenities/Bakery.uasset b/Content/UI/Icons/Amenities/Bakery.uasset index 07522cc..3d2efee 100644 Binary files a/Content/UI/Icons/Amenities/Bakery.uasset and b/Content/UI/Icons/Amenities/Bakery.uasset differ diff --git a/Content/UI/Icons/Amenities/Bank.uasset b/Content/UI/Icons/Amenities/Bank.uasset index 7462816..06ea481 100644 Binary files a/Content/UI/Icons/Amenities/Bank.uasset and b/Content/UI/Icons/Amenities/Bank.uasset differ diff --git a/Content/UI/Icons/Amenities/Bar.uasset b/Content/UI/Icons/Amenities/Bar.uasset index e370fc8..ab6f31f 100644 Binary files a/Content/UI/Icons/Amenities/Bar.uasset and b/Content/UI/Icons/Amenities/Bar.uasset differ diff --git a/Content/UI/Icons/Amenities/Beauty.uasset b/Content/UI/Icons/Amenities/Beauty.uasset index 402d9d2..95f93e6 100644 Binary files a/Content/UI/Icons/Amenities/Beauty.uasset and b/Content/UI/Icons/Amenities/Beauty.uasset differ diff --git a/Content/UI/Icons/Amenities/Beverages.uasset b/Content/UI/Icons/Amenities/Beverages.uasset index 80429b5..694fb50 100644 Binary files a/Content/UI/Icons/Amenities/Beverages.uasset and b/Content/UI/Icons/Amenities/Beverages.uasset differ diff --git a/Content/UI/Icons/Amenities/Bicycle.uasset b/Content/UI/Icons/Amenities/Bicycle.uasset index 8be372b..a61759e 100644 Binary files a/Content/UI/Icons/Amenities/Bicycle.uasset and b/Content/UI/Icons/Amenities/Bicycle.uasset differ diff --git a/Content/UI/Icons/Amenities/Biergarten.uasset b/Content/UI/Icons/Amenities/Biergarten.uasset index 57deafc..b6851a4 100644 Binary files a/Content/UI/Icons/Amenities/Biergarten.uasset and b/Content/UI/Icons/Amenities/Biergarten.uasset differ diff --git a/Content/UI/Icons/Amenities/Books.uasset b/Content/UI/Icons/Amenities/Books.uasset index 8799fbe..633e303 100644 Binary files a/Content/UI/Icons/Amenities/Books.uasset and b/Content/UI/Icons/Amenities/Books.uasset differ diff --git a/Content/UI/Icons/Amenities/Butcher.uasset b/Content/UI/Icons/Amenities/Butcher.uasset index 76ca56f..81b9fe4 100644 Binary files a/Content/UI/Icons/Amenities/Butcher.uasset and b/Content/UI/Icons/Amenities/Butcher.uasset differ diff --git a/Content/UI/Icons/Amenities/Cafe.uasset b/Content/UI/Icons/Amenities/Cafe.uasset index f76c347..9fe43c6 100644 Binary files a/Content/UI/Icons/Amenities/Cafe.uasset and b/Content/UI/Icons/Amenities/Cafe.uasset differ diff --git a/Content/UI/Icons/Amenities/Chemist.uasset b/Content/UI/Icons/Amenities/Chemist.uasset index ccb17c0..12b3b3b 100644 Binary files a/Content/UI/Icons/Amenities/Chemist.uasset and b/Content/UI/Icons/Amenities/Chemist.uasset differ diff --git a/Content/UI/Icons/Amenities/Cinema.uasset b/Content/UI/Icons/Amenities/Cinema.uasset index 5b722c1..cc9280b 100644 Binary files a/Content/UI/Icons/Amenities/Cinema.uasset and b/Content/UI/Icons/Amenities/Cinema.uasset differ diff --git a/Content/UI/Icons/Amenities/Clothes.uasset b/Content/UI/Icons/Amenities/Clothes.uasset index b3ceb52..65deda6 100644 Binary files a/Content/UI/Icons/Amenities/Clothes.uasset and b/Content/UI/Icons/Amenities/Clothes.uasset differ diff --git a/Content/UI/Icons/Amenities/Coffee.uasset b/Content/UI/Icons/Amenities/Coffee.uasset index b6af4ff..71c3202 100644 Binary files a/Content/UI/Icons/Amenities/Coffee.uasset and b/Content/UI/Icons/Amenities/Coffee.uasset differ diff --git a/Content/UI/Icons/Amenities/Computer.uasset b/Content/UI/Icons/Amenities/Computer.uasset index 2dafbf3..5f939ea 100644 Binary files a/Content/UI/Icons/Amenities/Computer.uasset and b/Content/UI/Icons/Amenities/Computer.uasset differ diff --git a/Content/UI/Icons/Amenities/Confectionery.uasset b/Content/UI/Icons/Amenities/Confectionery.uasset index acb1814..4f97d8a 100644 Binary files a/Content/UI/Icons/Amenities/Confectionery.uasset and b/Content/UI/Icons/Amenities/Confectionery.uasset differ diff --git a/Content/UI/Icons/Amenities/Convenience.uasset b/Content/UI/Icons/Amenities/Convenience.uasset index 17ce960..7bc9b8b 100644 Binary files a/Content/UI/Icons/Amenities/Convenience.uasset and b/Content/UI/Icons/Amenities/Convenience.uasset differ diff --git a/Content/UI/Icons/Amenities/Copyshop.uasset b/Content/UI/Icons/Amenities/Copyshop.uasset index 3842780..c9d7a99 100644 Binary files a/Content/UI/Icons/Amenities/Copyshop.uasset and b/Content/UI/Icons/Amenities/Copyshop.uasset differ diff --git a/Content/UI/Icons/Amenities/Cosmestics.uasset b/Content/UI/Icons/Amenities/Cosmestics.uasset index 666ea16..9ced522 100644 Binary files a/Content/UI/Icons/Amenities/Cosmestics.uasset and b/Content/UI/Icons/Amenities/Cosmestics.uasset differ diff --git a/Content/UI/Icons/Amenities/Deli.uasset b/Content/UI/Icons/Amenities/Deli.uasset index 48246b5..9ec379c 100644 Binary files a/Content/UI/Icons/Amenities/Deli.uasset and b/Content/UI/Icons/Amenities/Deli.uasset differ diff --git a/Content/UI/Icons/Amenities/Dentist.uasset b/Content/UI/Icons/Amenities/Dentist.uasset index 04b9562..7257360 100644 Binary files a/Content/UI/Icons/Amenities/Dentist.uasset and b/Content/UI/Icons/Amenities/Dentist.uasset differ diff --git a/Content/UI/Icons/Amenities/Department_store.uasset b/Content/UI/Icons/Amenities/Department_store.uasset index cc2d269..8e740bf 100644 Binary files a/Content/UI/Icons/Amenities/Department_store.uasset and b/Content/UI/Icons/Amenities/Department_store.uasset differ diff --git a/Content/UI/Icons/Amenities/Doctor.uasset b/Content/UI/Icons/Amenities/Doctor.uasset index 9cac444..a349026 100644 Binary files a/Content/UI/Icons/Amenities/Doctor.uasset and b/Content/UI/Icons/Amenities/Doctor.uasset differ diff --git a/Content/UI/Icons/Amenities/Doityourself.uasset b/Content/UI/Icons/Amenities/Doityourself.uasset index 57b7d6b..80cf0c8 100644 Binary files a/Content/UI/Icons/Amenities/Doityourself.uasset and b/Content/UI/Icons/Amenities/Doityourself.uasset differ diff --git a/Content/UI/Icons/Amenities/Electronics.uasset b/Content/UI/Icons/Amenities/Electronics.uasset index a7a2804..92287e6 100644 Binary files a/Content/UI/Icons/Amenities/Electronics.uasset and b/Content/UI/Icons/Amenities/Electronics.uasset differ diff --git a/Content/UI/Icons/Amenities/Fast_food.uasset b/Content/UI/Icons/Amenities/Fast_food.uasset index 9ee09a9..06fa625 100644 Binary files a/Content/UI/Icons/Amenities/Fast_food.uasset and b/Content/UI/Icons/Amenities/Fast_food.uasset differ diff --git a/Content/UI/Icons/Amenities/Florist.uasset b/Content/UI/Icons/Amenities/Florist.uasset index e9e977f..bd22a9f 100644 Binary files a/Content/UI/Icons/Amenities/Florist.uasset and b/Content/UI/Icons/Amenities/Florist.uasset differ diff --git a/Content/UI/Icons/Amenities/Furniture.uasset b/Content/UI/Icons/Amenities/Furniture.uasset index b782c6e..166f851 100644 Binary files a/Content/UI/Icons/Amenities/Furniture.uasset and b/Content/UI/Icons/Amenities/Furniture.uasset differ diff --git a/Content/UI/Icons/Amenities/Garden_centre.uasset b/Content/UI/Icons/Amenities/Garden_centre.uasset index f52c4b7..51c4278 100644 Binary files a/Content/UI/Icons/Amenities/Garden_centre.uasset and b/Content/UI/Icons/Amenities/Garden_centre.uasset differ diff --git a/Content/UI/Icons/Amenities/Gift.uasset b/Content/UI/Icons/Amenities/Gift.uasset index 91c7469..bc51abb 100644 Binary files a/Content/UI/Icons/Amenities/Gift.uasset and b/Content/UI/Icons/Amenities/Gift.uasset differ diff --git a/Content/UI/Icons/Amenities/Greengrocer.uasset b/Content/UI/Icons/Amenities/Greengrocer.uasset index 4cb46d8..c31f705 100644 Binary files a/Content/UI/Icons/Amenities/Greengrocer.uasset and b/Content/UI/Icons/Amenities/Greengrocer.uasset differ diff --git a/Content/UI/Icons/Amenities/Hairdresser.uasset b/Content/UI/Icons/Amenities/Hairdresser.uasset index 8cec4e2..a027e4c 100644 Binary files a/Content/UI/Icons/Amenities/Hairdresser.uasset and b/Content/UI/Icons/Amenities/Hairdresser.uasset differ diff --git a/Content/UI/Icons/Amenities/Hospital.uasset b/Content/UI/Icons/Amenities/Hospital.uasset index aa7abe9..898f140 100644 Binary files a/Content/UI/Icons/Amenities/Hospital.uasset and b/Content/UI/Icons/Amenities/Hospital.uasset differ diff --git a/Content/UI/Icons/Amenities/Hotel.uasset b/Content/UI/Icons/Amenities/Hotel.uasset index d650ca9..598b993 100644 Binary files a/Content/UI/Icons/Amenities/Hotel.uasset and b/Content/UI/Icons/Amenities/Hotel.uasset differ diff --git a/Content/UI/Icons/Amenities/Ice_cream.uasset b/Content/UI/Icons/Amenities/Ice_cream.uasset index 1d2d02d..5eef210 100644 Binary files a/Content/UI/Icons/Amenities/Ice_cream.uasset and b/Content/UI/Icons/Amenities/Ice_cream.uasset differ diff --git a/Content/UI/Icons/Amenities/Jewellery.uasset b/Content/UI/Icons/Amenities/Jewellery.uasset index 8389dba..23e2112 100644 Binary files a/Content/UI/Icons/Amenities/Jewellery.uasset and b/Content/UI/Icons/Amenities/Jewellery.uasset differ diff --git a/Content/UI/Icons/Amenities/Laptop-Phone-icon.uasset b/Content/UI/Icons/Amenities/Laptop-Phone-icon.uasset index 8742417..0dc3ffc 100644 Binary files a/Content/UI/Icons/Amenities/Laptop-Phone-icon.uasset and b/Content/UI/Icons/Amenities/Laptop-Phone-icon.uasset differ diff --git a/Content/UI/Icons/Amenities/Laundry.uasset b/Content/UI/Icons/Amenities/Laundry.uasset index 0c291a2..c8655f0 100644 Binary files a/Content/UI/Icons/Amenities/Laundry.uasset and b/Content/UI/Icons/Amenities/Laundry.uasset differ diff --git a/Content/UI/Icons/Amenities/Library.uasset b/Content/UI/Icons/Amenities/Library.uasset index 50b52f7..6113f2b 100644 Binary files a/Content/UI/Icons/Amenities/Library.uasset and b/Content/UI/Icons/Amenities/Library.uasset differ diff --git a/Content/UI/Icons/Amenities/Marketplace.uasset b/Content/UI/Icons/Amenities/Marketplace.uasset index 18cee96..d827a6d 100644 Binary files a/Content/UI/Icons/Amenities/Marketplace.uasset and b/Content/UI/Icons/Amenities/Marketplace.uasset differ diff --git a/Content/UI/Icons/Amenities/Mobile_phone.uasset b/Content/UI/Icons/Amenities/Mobile_phone.uasset index 0e11b8c..d516333 100644 Binary files a/Content/UI/Icons/Amenities/Mobile_phone.uasset and b/Content/UI/Icons/Amenities/Mobile_phone.uasset differ diff --git a/Content/UI/Icons/Amenities/Musical_instrument.uasset b/Content/UI/Icons/Amenities/Musical_instrument.uasset index 8cd2414..b916d8c 100644 Binary files a/Content/UI/Icons/Amenities/Musical_instrument.uasset and b/Content/UI/Icons/Amenities/Musical_instrument.uasset differ diff --git a/Content/UI/Icons/Amenities/Newsagent.uasset b/Content/UI/Icons/Amenities/Newsagent.uasset index fa5ea00..ac284d5 100644 Binary files a/Content/UI/Icons/Amenities/Newsagent.uasset and b/Content/UI/Icons/Amenities/Newsagent.uasset differ diff --git a/Content/UI/Icons/Amenities/Nightclub.uasset b/Content/UI/Icons/Amenities/Nightclub.uasset index 79c5a11..93adb20 100644 Binary files a/Content/UI/Icons/Amenities/Nightclub.uasset and b/Content/UI/Icons/Amenities/Nightclub.uasset differ diff --git a/Content/UI/Icons/Amenities/Optician.uasset b/Content/UI/Icons/Amenities/Optician.uasset index 2594836..00db409 100644 Binary files a/Content/UI/Icons/Amenities/Optician.uasset and b/Content/UI/Icons/Amenities/Optician.uasset differ diff --git a/Content/UI/Icons/Amenities/Outdoor.uasset b/Content/UI/Icons/Amenities/Outdoor.uasset index 504c267..d25686a 100644 Binary files a/Content/UI/Icons/Amenities/Outdoor.uasset and b/Content/UI/Icons/Amenities/Outdoor.uasset differ diff --git a/Content/UI/Icons/Amenities/Pet.uasset b/Content/UI/Icons/Amenities/Pet.uasset index 8f62bd5..013fa3e 100644 Binary files a/Content/UI/Icons/Amenities/Pet.uasset and b/Content/UI/Icons/Amenities/Pet.uasset differ diff --git a/Content/UI/Icons/Amenities/Pharmacy.uasset b/Content/UI/Icons/Amenities/Pharmacy.uasset index 4a1c384..856a794 100644 Binary files a/Content/UI/Icons/Amenities/Pharmacy.uasset and b/Content/UI/Icons/Amenities/Pharmacy.uasset differ diff --git a/Content/UI/Icons/Amenities/Photo.uasset b/Content/UI/Icons/Amenities/Photo.uasset index 03a44d4..69e5b8c 100644 Binary files a/Content/UI/Icons/Amenities/Photo.uasset and b/Content/UI/Icons/Amenities/Photo.uasset differ diff --git a/Content/UI/Icons/Amenities/Place_of_worship.uasset b/Content/UI/Icons/Amenities/Place_of_worship.uasset index 3f8c483..0b94917 100644 Binary files a/Content/UI/Icons/Amenities/Place_of_worship.uasset and b/Content/UI/Icons/Amenities/Place_of_worship.uasset differ diff --git a/Content/UI/Icons/Amenities/Police.uasset b/Content/UI/Icons/Amenities/Police.uasset index b63a2bb..9368625 100644 Binary files a/Content/UI/Icons/Amenities/Police.uasset and b/Content/UI/Icons/Amenities/Police.uasset differ diff --git a/Content/UI/Icons/Amenities/Post_office.uasset b/Content/UI/Icons/Amenities/Post_office.uasset index 8fe3c73..aa14fe9 100644 Binary files a/Content/UI/Icons/Amenities/Post_office.uasset and b/Content/UI/Icons/Amenities/Post_office.uasset differ diff --git a/Content/UI/Icons/Amenities/Prison.uasset b/Content/UI/Icons/Amenities/Prison.uasset index 430cfd8..db782a0 100644 Binary files a/Content/UI/Icons/Amenities/Prison.uasset and b/Content/UI/Icons/Amenities/Prison.uasset differ diff --git a/Content/UI/Icons/Amenities/Pub.uasset b/Content/UI/Icons/Amenities/Pub.uasset index 0f5748b..5591dcb 100644 Binary files a/Content/UI/Icons/Amenities/Pub.uasset and b/Content/UI/Icons/Amenities/Pub.uasset differ diff --git a/Content/UI/Icons/Amenities/Restaurant.uasset b/Content/UI/Icons/Amenities/Restaurant.uasset index cc7afce..ab01d06 100644 Binary files a/Content/UI/Icons/Amenities/Restaurant.uasset and b/Content/UI/Icons/Amenities/Restaurant.uasset differ diff --git a/Content/UI/Icons/Amenities/Seafood.uasset b/Content/UI/Icons/Amenities/Seafood.uasset index f5dc4d0..9eb3c07 100644 Binary files a/Content/UI/Icons/Amenities/Seafood.uasset and b/Content/UI/Icons/Amenities/Seafood.uasset differ diff --git a/Content/UI/Icons/Amenities/Shoes.uasset b/Content/UI/Icons/Amenities/Shoes.uasset index b2534c0..a85b877 100644 Binary files a/Content/UI/Icons/Amenities/Shoes.uasset and b/Content/UI/Icons/Amenities/Shoes.uasset differ diff --git a/Content/UI/Icons/Amenities/Sports.uasset b/Content/UI/Icons/Amenities/Sports.uasset index 03ff76b..650efbf 100644 Binary files a/Content/UI/Icons/Amenities/Sports.uasset and b/Content/UI/Icons/Amenities/Sports.uasset differ diff --git a/Content/UI/Icons/Amenities/Stationery.uasset b/Content/UI/Icons/Amenities/Stationery.uasset index 519a836..844a183 100644 Binary files a/Content/UI/Icons/Amenities/Stationery.uasset and b/Content/UI/Icons/Amenities/Stationery.uasset differ diff --git a/Content/UI/Icons/Amenities/Supermarket.uasset b/Content/UI/Icons/Amenities/Supermarket.uasset index 9c52a94..7b8a943 100644 Binary files a/Content/UI/Icons/Amenities/Supermarket.uasset and b/Content/UI/Icons/Amenities/Supermarket.uasset differ diff --git a/Content/UI/Icons/Amenities/Tea.uasset b/Content/UI/Icons/Amenities/Tea.uasset index e5e7807..0988f7e 100644 Binary files a/Content/UI/Icons/Amenities/Tea.uasset and b/Content/UI/Icons/Amenities/Tea.uasset differ diff --git a/Content/UI/Icons/Amenities/Theatre.uasset b/Content/UI/Icons/Amenities/Theatre.uasset index 2af0f0e..ba1839b 100644 Binary files a/Content/UI/Icons/Amenities/Theatre.uasset and b/Content/UI/Icons/Amenities/Theatre.uasset differ diff --git a/Content/UI/Icons/Amenities/Tobacco.uasset b/Content/UI/Icons/Amenities/Tobacco.uasset index e9aa39d..af342e9 100644 Binary files a/Content/UI/Icons/Amenities/Tobacco.uasset and b/Content/UI/Icons/Amenities/Tobacco.uasset differ diff --git a/Content/UI/Icons/Amenities/Toilets.uasset b/Content/UI/Icons/Amenities/Toilets.uasset index 659f737..477fa73 100644 Binary files a/Content/UI/Icons/Amenities/Toilets.uasset and b/Content/UI/Icons/Amenities/Toilets.uasset differ diff --git a/Content/UI/Icons/Amenities/Toys.uasset b/Content/UI/Icons/Amenities/Toys.uasset index 1bdb969..093fc44 100644 Binary files a/Content/UI/Icons/Amenities/Toys.uasset and b/Content/UI/Icons/Amenities/Toys.uasset differ diff --git a/Content/UI/Icons/Amenities/Travel_agency.uasset b/Content/UI/Icons/Amenities/Travel_agency.uasset index 742df40..385d551 100644 Binary files a/Content/UI/Icons/Amenities/Travel_agency.uasset and b/Content/UI/Icons/Amenities/Travel_agency.uasset differ diff --git a/Content/UI/Icons/Amenities/Variety_store.uasset b/Content/UI/Icons/Amenities/Variety_store.uasset index 2b75401..dc2d7e6 100644 Binary files a/Content/UI/Icons/Amenities/Variety_store.uasset and b/Content/UI/Icons/Amenities/Variety_store.uasset differ diff --git a/Content/UI/Icons/Amenities/Veterinary.uasset b/Content/UI/Icons/Amenities/Veterinary.uasset index 20919ce..ae6597f 100644 Binary files a/Content/UI/Icons/Amenities/Veterinary.uasset and b/Content/UI/Icons/Amenities/Veterinary.uasset differ diff --git a/Content/UI/Icons/Amenities/all.uasset b/Content/UI/Icons/Amenities/all.uasset index a0aefe5..eabd1f6 100644 Binary files a/Content/UI/Icons/Amenities/all.uasset and b/Content/UI/Icons/Amenities/all.uasset differ diff --git a/Content/UI/Icons/Amenities/art.uasset b/Content/UI/Icons/Amenities/art.uasset index e8a89d3..27dae31 100644 Binary files a/Content/UI/Icons/Amenities/art.uasset and b/Content/UI/Icons/Amenities/art.uasset differ diff --git a/Content/UI/Icons/Amenities/car.uasset b/Content/UI/Icons/Amenities/car.uasset index 5de8d94..4b9ff0e 100644 Binary files a/Content/UI/Icons/Amenities/car.uasset and b/Content/UI/Icons/Amenities/car.uasset differ diff --git a/Content/UI/Icons/Amenities/community_centre.uasset b/Content/UI/Icons/Amenities/community_centre.uasset index 5411362..cb2924b 100644 Binary files a/Content/UI/Icons/Amenities/community_centre.uasset and b/Content/UI/Icons/Amenities/community_centre.uasset differ diff --git a/Content/UI/Icons/Amenities/fraternity.uasset b/Content/UI/Icons/Amenities/fraternity.uasset index 7120514..be02289 100644 Binary files a/Content/UI/Icons/Amenities/fraternity.uasset and b/Content/UI/Icons/Amenities/fraternity.uasset differ diff --git a/Content/UI/Icons/Amenities/motorcycle.uasset b/Content/UI/Icons/Amenities/motorcycle.uasset index 6a11e40..1a58737 100644 Binary files a/Content/UI/Icons/Amenities/motorcycle.uasset and b/Content/UI/Icons/Amenities/motorcycle.uasset differ diff --git a/Content/UI/Icons/Amenities/office.uasset b/Content/UI/Icons/Amenities/office.uasset index 25a1229..6f5a16e 100644 Binary files a/Content/UI/Icons/Amenities/office.uasset and b/Content/UI/Icons/Amenities/office.uasset differ diff --git a/Content/UI/Icons/Amenities/questionmark.uasset b/Content/UI/Icons/Amenities/questionmark.uasset index ebf8e09..3c06621 100644 Binary files a/Content/UI/Icons/Amenities/questionmark.uasset and b/Content/UI/Icons/Amenities/questionmark.uasset differ diff --git a/Content/UI/Icons/Amenities/residential.uasset b/Content/UI/Icons/Amenities/residential.uasset index 9926bb6..639ff3b 100644 Binary files a/Content/UI/Icons/Amenities/residential.uasset and b/Content/UI/Icons/Amenities/residential.uasset differ diff --git a/Content/UI/Icons/Amenities/sexwork.uasset b/Content/UI/Icons/Amenities/sexwork.uasset index 89c9bd8..84ad66a 100644 Binary files a/Content/UI/Icons/Amenities/sexwork.uasset and b/Content/UI/Icons/Amenities/sexwork.uasset differ diff --git a/Content/UI/Icons/Amenities/sports_centre.uasset b/Content/UI/Icons/Amenities/sports_centre.uasset index 4c26502..15a39b2 100644 Binary files a/Content/UI/Icons/Amenities/sports_centre.uasset and b/Content/UI/Icons/Amenities/sports_centre.uasset differ diff --git a/Content/UI/Icons/Amenities/university.uasset b/Content/UI/Icons/Amenities/university.uasset index db3712a..57f868b 100644 Binary files a/Content/UI/Icons/Amenities/university.uasset and b/Content/UI/Icons/Amenities/university.uasset differ diff --git a/Content/UI/Icons/Load.uasset b/Content/UI/Icons/Load.uasset index a70d7c1..bedf807 100644 Binary files a/Content/UI/Icons/Load.uasset and b/Content/UI/Icons/Load.uasset differ diff --git a/Content/UI/Icons/Save.uasset b/Content/UI/Icons/Save.uasset index c2fe15c..c5b2143 100644 Binary files a/Content/UI/Icons/Save.uasset and b/Content/UI/Icons/Save.uasset differ diff --git a/Content/UI/Icons/achievement.uasset b/Content/UI/Icons/achievement.uasset index 52dad6c..1bd2799 100644 Binary files a/Content/UI/Icons/achievement.uasset and b/Content/UI/Icons/achievement.uasset differ diff --git a/Content/UI/Icons/arousal.uasset b/Content/UI/Icons/arousal.uasset index c06a8db..76d6fbf 100644 Binary files a/Content/UI/Icons/arousal.uasset and b/Content/UI/Icons/arousal.uasset differ diff --git a/Content/UI/Icons/attractiveness.uasset b/Content/UI/Icons/attractiveness.uasset index 9b2a82c..f22b80c 100644 Binary files a/Content/UI/Icons/attractiveness.uasset and b/Content/UI/Icons/attractiveness.uasset differ diff --git a/Content/UI/Icons/close.uasset b/Content/UI/Icons/close.uasset index 4a89211..7a95340 100644 Binary files a/Content/UI/Icons/close.uasset and b/Content/UI/Icons/close.uasset differ diff --git a/Content/UI/Icons/cum.uasset b/Content/UI/Icons/cum.uasset index c343f58..6ae7abd 100644 Binary files a/Content/UI/Icons/cum.uasset and b/Content/UI/Icons/cum.uasset differ diff --git a/Content/UI/Icons/discard.uasset b/Content/UI/Icons/discard.uasset index ef300da..0c5f090 100644 Binary files a/Content/UI/Icons/discard.uasset and b/Content/UI/Icons/discard.uasset differ diff --git a/Content/UI/Icons/discord-3-569463.uasset b/Content/UI/Icons/discord-3-569463.uasset index 057a3c1..e32f764 100644 Binary files a/Content/UI/Icons/discord-3-569463.uasset and b/Content/UI/Icons/discord-3-569463.uasset differ diff --git a/Content/UI/Icons/dogicon.uasset b/Content/UI/Icons/dogicon.uasset index d2b070c..734c68c 100644 Binary files a/Content/UI/Icons/dogicon.uasset and b/Content/UI/Icons/dogicon.uasset differ diff --git a/Content/UI/Icons/energy.uasset b/Content/UI/Icons/energy.uasset index 6e58c35..f127ead 100644 Binary files a/Content/UI/Icons/energy.uasset and b/Content/UI/Icons/energy.uasset differ diff --git a/Content/UI/Icons/example.uasset b/Content/UI/Icons/example.uasset index 0804def..d9aa295 100644 Binary files a/Content/UI/Icons/example.uasset and b/Content/UI/Icons/example.uasset differ diff --git a/Content/UI/Icons/favorite.uasset b/Content/UI/Icons/favorite.uasset index 968df46..6feda50 100644 Binary files a/Content/UI/Icons/favorite.uasset and b/Content/UI/Icons/favorite.uasset differ diff --git a/Content/UI/Icons/female.uasset b/Content/UI/Icons/female.uasset index 7a12265..cd3f963 100644 Binary files a/Content/UI/Icons/female.uasset and b/Content/UI/Icons/female.uasset differ diff --git a/Content/UI/Icons/fitness.uasset b/Content/UI/Icons/fitness.uasset index 88a8617..2c56cd1 100644 Binary files a/Content/UI/Icons/fitness.uasset and b/Content/UI/Icons/fitness.uasset differ diff --git a/Content/UI/Icons/flipvertical.uasset b/Content/UI/Icons/flipvertical.uasset index 38064bc..90f444c 100644 Binary files a/Content/UI/Icons/flipvertical.uasset and b/Content/UI/Icons/flipvertical.uasset differ diff --git a/Content/UI/Icons/icon_tattoo.uasset b/Content/UI/Icons/icon_tattoo.uasset index 468e753..dd60ac6 100644 Binary files a/Content/UI/Icons/icon_tattoo.uasset and b/Content/UI/Icons/icon_tattoo.uasset differ diff --git a/Content/UI/Icons/intelligence.uasset b/Content/UI/Icons/intelligence.uasset index 1f14399..e1b94de 100644 Binary files a/Content/UI/Icons/intelligence.uasset and b/Content/UI/Icons/intelligence.uasset differ diff --git a/Content/UI/Icons/interpersonal.uasset b/Content/UI/Icons/interpersonal.uasset index 202a7b6..648feda 100644 Binary files a/Content/UI/Icons/interpersonal.uasset and b/Content/UI/Icons/interpersonal.uasset differ diff --git a/Content/UI/Icons/karma.uasset b/Content/UI/Icons/karma.uasset index 1d501b1..407e13e 100644 Binary files a/Content/UI/Icons/karma.uasset and b/Content/UI/Icons/karma.uasset differ diff --git a/Content/UI/Icons/male.uasset b/Content/UI/Icons/male.uasset index 5f0d69c..0fb6d38 100644 Binary files a/Content/UI/Icons/male.uasset and b/Content/UI/Icons/male.uasset differ diff --git a/Content/UI/Icons/mod.uasset b/Content/UI/Icons/mod.uasset index 7d29ea9..7d9b7cd 100644 Binary files a/Content/UI/Icons/mod.uasset and b/Content/UI/Icons/mod.uasset differ diff --git a/Content/UI/Icons/mood.uasset b/Content/UI/Icons/mood.uasset index 6c710e8..782845f 100644 Binary files a/Content/UI/Icons/mood.uasset and b/Content/UI/Icons/mood.uasset differ diff --git a/Content/UI/Icons/objective.uasset b/Content/UI/Icons/objective.uasset index 1a3fe58..5233193 100644 Binary files a/Content/UI/Icons/objective.uasset and b/Content/UI/Icons/objective.uasset differ diff --git a/Content/UI/Icons/patreon.uasset b/Content/UI/Icons/patreon.uasset index 09ce5c8..20680de 100644 Binary files a/Content/UI/Icons/patreon.uasset and b/Content/UI/Icons/patreon.uasset differ diff --git a/Content/UI/Icons/pauseplay.uasset b/Content/UI/Icons/pauseplay.uasset index 501d7cb..efe4e0a 100644 Binary files a/Content/UI/Icons/pauseplay.uasset and b/Content/UI/Icons/pauseplay.uasset differ diff --git a/Content/UI/Icons/perk.uasset b/Content/UI/Icons/perk.uasset index 1769d51..273b76c 100644 Binary files a/Content/UI/Icons/perk.uasset and b/Content/UI/Icons/perk.uasset differ diff --git a/Content/UI/Icons/perversion.uasset b/Content/UI/Icons/perversion.uasset index 71607ba..19453aa 100644 Binary files a/Content/UI/Icons/perversion.uasset and b/Content/UI/Icons/perversion.uasset differ diff --git a/Content/UI/Icons/quest.uasset b/Content/UI/Icons/quest.uasset index 6eae530..0a66db7 100644 Binary files a/Content/UI/Icons/quest.uasset and b/Content/UI/Icons/quest.uasset differ diff --git a/Content/UI/Icons/randomize_body.uasset b/Content/UI/Icons/randomize_body.uasset index 0045843..c862026 100644 Binary files a/Content/UI/Icons/randomize_body.uasset and b/Content/UI/Icons/randomize_body.uasset differ diff --git a/Content/UI/Icons/randomize_face.uasset b/Content/UI/Icons/randomize_face.uasset index 8873f35..1a3a3e2 100644 Binary files a/Content/UI/Icons/randomize_face.uasset and b/Content/UI/Icons/randomize_face.uasset differ diff --git a/Content/UI/Icons/randomize_hair.uasset b/Content/UI/Icons/randomize_hair.uasset index f0dacdc..d0b2131 100644 Binary files a/Content/UI/Icons/randomize_hair.uasset and b/Content/UI/Icons/randomize_hair.uasset differ diff --git a/Content/UI/Icons/randomize_sexy.uasset b/Content/UI/Icons/randomize_sexy.uasset index ce4c130..e32c978 100644 Binary files a/Content/UI/Icons/randomize_sexy.uasset and b/Content/UI/Icons/randomize_sexy.uasset differ diff --git a/Content/UI/Icons/recommended.uasset b/Content/UI/Icons/recommended.uasset index c06c55e..2bf10d8 100644 Binary files a/Content/UI/Icons/recommended.uasset and b/Content/UI/Icons/recommended.uasset differ diff --git a/Content/UI/Icons/rotate.uasset b/Content/UI/Icons/rotate.uasset index 1cbfba5..ca5154e 100644 Binary files a/Content/UI/Icons/rotate.uasset and b/Content/UI/Icons/rotate.uasset differ diff --git a/Content/UI/Icons/search.uasset b/Content/UI/Icons/search.uasset index c972fe6..7663dc8 100644 Binary files a/Content/UI/Icons/search.uasset and b/Content/UI/Icons/search.uasset differ diff --git a/Content/UI/Icons/tf.uasset b/Content/UI/Icons/tf.uasset index 0577b9d..5867d5a 100644 Binary files a/Content/UI/Icons/tf.uasset and b/Content/UI/Icons/tf.uasset differ diff --git a/Content/UI/Icons/trans.uasset b/Content/UI/Icons/trans.uasset index e4ce13a..0f81458 100644 Binary files a/Content/UI/Icons/trans.uasset and b/Content/UI/Icons/trans.uasset differ diff --git a/Content/UI/Icons/zoom.uasset b/Content/UI/Icons/zoom.uasset index 413f119..aa3a77b 100644 Binary files a/Content/UI/Icons/zoom.uasset and b/Content/UI/Icons/zoom.uasset differ diff --git a/Content/UI/Inventory.uasset b/Content/UI/Inventory.uasset index f2b12ac..ca7f719 100644 Binary files a/Content/UI/Inventory.uasset and b/Content/UI/Inventory.uasset differ diff --git a/Content/UI/Inventory_Cloth.uasset b/Content/UI/Inventory_Cloth.uasset index a1e8607..18fb56e 100644 Binary files a/Content/UI/Inventory_Cloth.uasset and b/Content/UI/Inventory_Cloth.uasset differ diff --git a/Content/UI/Journal.uasset b/Content/UI/Journal.uasset index 2c479a0..0db84f0 100644 Binary files a/Content/UI/Journal.uasset and b/Content/UI/Journal.uasset differ diff --git a/Content/UI/LineBreak.uasset b/Content/UI/LineBreak.uasset index d13b908..cb31188 100644 Binary files a/Content/UI/LineBreak.uasset and b/Content/UI/LineBreak.uasset differ diff --git a/Content/UI/LoadExtImg.uasset b/Content/UI/LoadExtImg.uasset index 30a0fde..eb6a03e 100644 Binary files a/Content/UI/LoadExtImg.uasset and b/Content/UI/LoadExtImg.uasset differ diff --git a/Content/UI/Loading.uasset b/Content/UI/Loading.uasset index 2d0a15b..65ed3e0 100644 Binary files a/Content/UI/Loading.uasset and b/Content/UI/Loading.uasset differ diff --git a/Content/UI/LoadingAsset.uasset b/Content/UI/LoadingAsset.uasset index d6fc40d..b02dfd4 100644 Binary files a/Content/UI/LoadingAsset.uasset and b/Content/UI/LoadingAsset.uasset differ diff --git a/Content/UI/MainMenu.uasset b/Content/UI/MainMenu.uasset index 6c87293..5742dee 100644 Binary files a/Content/UI/MainMenu.uasset and b/Content/UI/MainMenu.uasset differ diff --git a/Content/UI/Marker.uasset b/Content/UI/Marker.uasset index 4ebb705..23e58e3 100644 Binary files a/Content/UI/Marker.uasset and b/Content/UI/Marker.uasset differ diff --git a/Content/UI/ModManager.uasset b/Content/UI/ModManager.uasset index 687ec06..94fd195 100644 Binary files a/Content/UI/ModManager.uasset and b/Content/UI/ModManager.uasset differ diff --git a/Content/UI/ModuleTick.uasset b/Content/UI/ModuleTick.uasset index 09a02b8..b5146dd 100644 Binary files a/Content/UI/ModuleTick.uasset and b/Content/UI/ModuleTick.uasset differ diff --git a/Content/UI/Objective.uasset b/Content/UI/Objective.uasset index 9a4fc18..d944b16 100644 Binary files a/Content/UI/Objective.uasset and b/Content/UI/Objective.uasset differ diff --git a/Content/UI/Perk.uasset b/Content/UI/Perk.uasset index 0c6e15a..5e8bed3 100644 Binary files a/Content/UI/Perk.uasset and b/Content/UI/Perk.uasset differ diff --git a/Content/UI/PerkPoint.uasset b/Content/UI/PerkPoint.uasset index 1bfb8e4..ca7181a 100644 Binary files a/Content/UI/PerkPoint.uasset and b/Content/UI/PerkPoint.uasset differ diff --git a/Content/UI/PersonButton.uasset b/Content/UI/PersonButton.uasset index 575b430..99d54b3 100644 Binary files a/Content/UI/PersonButton.uasset and b/Content/UI/PersonButton.uasset differ diff --git a/Content/UI/Player.uasset b/Content/UI/Player.uasset index 1f61bcc..c2a0be4 100644 Binary files a/Content/UI/Player.uasset and b/Content/UI/Player.uasset differ diff --git a/Content/UI/Preset.uasset b/Content/UI/Preset.uasset index 73f5abc..74b264c 100644 Binary files a/Content/UI/Preset.uasset and b/Content/UI/Preset.uasset differ diff --git a/Content/UI/Quest.uasset b/Content/UI/Quest.uasset index f510870..94df517 100644 Binary files a/Content/UI/Quest.uasset and b/Content/UI/Quest.uasset differ diff --git a/Content/UI/Recommend.uasset b/Content/UI/Recommend.uasset index 2971f7a..8373073 100644 Binary files a/Content/UI/Recommend.uasset and b/Content/UI/Recommend.uasset differ diff --git a/Content/UI/SaveSlot.uasset b/Content/UI/SaveSlot.uasset index 1af364e..e8e6865 100644 Binary files a/Content/UI/SaveSlot.uasset and b/Content/UI/SaveSlot.uasset differ diff --git a/Content/UI/ScalarSlider.uasset b/Content/UI/ScalarSlider.uasset index 239e9fd..4deb19f 100644 Binary files a/Content/UI/ScalarSlider.uasset and b/Content/UI/ScalarSlider.uasset differ diff --git a/Content/UI/Scene.uasset b/Content/UI/Scene.uasset index 9541d8e..15f1329 100644 Binary files a/Content/UI/Scene.uasset and b/Content/UI/Scene.uasset differ diff --git a/Content/UI/SceneOption.uasset b/Content/UI/SceneOption.uasset index 33b77d0..e8c6721 100644 Binary files a/Content/UI/SceneOption.uasset and b/Content/UI/SceneOption.uasset differ diff --git a/Content/UI/SceneSneakStep.uasset b/Content/UI/SceneSneakStep.uasset index 880494f..caa081a 100644 Binary files a/Content/UI/SceneSneakStep.uasset and b/Content/UI/SceneSneakStep.uasset differ diff --git a/Content/UI/ScreenTint.uasset b/Content/UI/ScreenTint.uasset index a8d6b07..06c724e 100644 Binary files a/Content/UI/ScreenTint.uasset and b/Content/UI/ScreenTint.uasset differ diff --git a/Content/UI/SearchResult.uasset b/Content/UI/SearchResult.uasset index 79a33e1..488f494 100644 Binary files a/Content/UI/SearchResult.uasset and b/Content/UI/SearchResult.uasset differ diff --git a/Content/UI/SettingCheckbox.uasset b/Content/UI/SettingCheckbox.uasset index c9f3737..fff17c5 100644 Binary files a/Content/UI/SettingCheckbox.uasset and b/Content/UI/SettingCheckbox.uasset differ diff --git a/Content/UI/SettingSlider.uasset b/Content/UI/SettingSlider.uasset index 646eebb..70290d6 100644 Binary files a/Content/UI/SettingSlider.uasset and b/Content/UI/SettingSlider.uasset differ diff --git a/Content/UI/SexAction.uasset b/Content/UI/SexAction.uasset index f4e5b68..05dfddc 100644 Binary files a/Content/UI/SexAction.uasset and b/Content/UI/SexAction.uasset differ diff --git a/Content/UI/SexInterface.uasset b/Content/UI/SexInterface.uasset index 004c35a..ecc82d8 100644 Binary files a/Content/UI/SexInterface.uasset and b/Content/UI/SexInterface.uasset differ diff --git a/Content/UI/SexLight.uasset b/Content/UI/SexLight.uasset index 8487891..2ccb7ec 100644 Binary files a/Content/UI/SexLight.uasset and b/Content/UI/SexLight.uasset differ diff --git a/Content/UI/SexOrgasmEnergy.uasset b/Content/UI/SexOrgasmEnergy.uasset index 7ef569a..b1f53df 100644 Binary files a/Content/UI/SexOrgasmEnergy.uasset and b/Content/UI/SexOrgasmEnergy.uasset differ diff --git a/Content/UI/SexQuicks.uasset b/Content/UI/SexQuicks.uasset index cf2da73..78d66c4 100644 Binary files a/Content/UI/SexQuicks.uasset and b/Content/UI/SexQuicks.uasset differ diff --git a/Content/UI/Shortcut.uasset b/Content/UI/Shortcut.uasset index 68d52fe..9bd361d 100644 Binary files a/Content/UI/Shortcut.uasset and b/Content/UI/Shortcut.uasset differ diff --git a/Content/UI/StatAdjust.uasset b/Content/UI/StatAdjust.uasset index 1772507..8ca25d3 100644 Binary files a/Content/UI/StatAdjust.uasset and b/Content/UI/StatAdjust.uasset differ diff --git a/Content/UI/StatMenu.uasset b/Content/UI/StatMenu.uasset index 5fe68df..a1ec920 100644 Binary files a/Content/UI/StatMenu.uasset and b/Content/UI/StatMenu.uasset differ diff --git a/Content/UI/StatNumber.uasset b/Content/UI/StatNumber.uasset index 397f5d6..e55ff61 100644 Binary files a/Content/UI/StatNumber.uasset and b/Content/UI/StatNumber.uasset differ diff --git a/Content/UI/Street.uasset b/Content/UI/Street.uasset index d1bc383..c0fac38 100644 Binary files a/Content/UI/Street.uasset and b/Content/UI/Street.uasset differ diff --git a/Content/UI/Tooltip.uasset b/Content/UI/Tooltip.uasset index 4f4b0f9..f001de7 100644 Binary files a/Content/UI/Tooltip.uasset and b/Content/UI/Tooltip.uasset differ diff --git a/Content/UI/TopRight.uasset b/Content/UI/TopRight.uasset index 2f71512..064c828 100644 Binary files a/Content/UI/TopRight.uasset and b/Content/UI/TopRight.uasset differ diff --git a/Content/UI/Tutorial.uasset b/Content/UI/Tutorial.uasset index d704155..7113fb0 100644 Binary files a/Content/UI/Tutorial.uasset and b/Content/UI/Tutorial.uasset differ diff --git a/Content/UI/VisualMorph.uasset b/Content/UI/VisualMorph.uasset index 4f4f665..57fc9dd 100644 Binary files a/Content/UI/VisualMorph.uasset and b/Content/UI/VisualMorph.uasset differ diff --git a/Content/UI/VisualMorphPair.uasset b/Content/UI/VisualMorphPair.uasset index a57c10e..06e5102 100644 Binary files a/Content/UI/VisualMorphPair.uasset and b/Content/UI/VisualMorphPair.uasset differ diff --git a/Docs/Migration/01_Architecture_Initiale.md b/Docs/Migration/01_Architecture_Initiale.md index f003472..50fecb2 100644 --- a/Docs/Migration/01_Architecture_Initiale.md +++ b/Docs/Migration/01_Architecture_Initiale.md @@ -62,7 +62,7 @@ Aucun `GConfig` dans le C++. Les réglages joueur sont dans `Saved/SaveGames/Gam ### 3.2 Plugins | Plugin | Rôle | Fonctions consommées par le contenu | |---|---|---| -| `ModdingExtra` (Vinfamy, Runtime, `PreLoadingScreen`) | **toute l'entrée/sortie de données** | `LoadTxt` (9 assets), `GetAllFilesFromFolder` (6), `SaveTxt` (4) | +| `ModdingExtra` (Vinfamy, Runtime, `PreLoadingScreen`) | **toute l'entrée/sortie de données** | `LoadTxt` : `BPs/GI`, `Room` ; `UI/CharGen`, `Contact`, `ContactMenu`, `Inventory`, `MainMenu`, `ModManager`, `StatMenu`. `GetAllFilesFromFolder` : `BPs/GI`, `Room` ; `UI/Builder`, `CharGen`, `CityMenu`, `StatMenu`. `SaveTxt` : `BPs/GI`, `Room` ; `UI/BodyShapeMenu`, `Inventory` | | `StreetMap` (fork Vinfamy) | villes OSM : routes, bâtiments, `SearchByBuildingName` | 292 assets | | `VictoryBPLibrary` (4.27 seulement) | 2 nœuds : `Victory_LoadTexture2D_FromFile`, `Victory_SaveStringToOSClipboard` | remplacé en 5.5 par `LPVictoryCompat` + `[CoreRedirects]` | @@ -161,6 +161,7 @@ Tout le hasard passe par `KismetMathLibrary` (`RandomFloat`, `RandomBool`, `Rand | Structures utilisateur avec tableaux (`Variable`) | conteneur de variables du DSL | `Variable.uasset` porte un `DoubleProperty` en 5.5 (conversion LWC) — piste principale du bug ouvert | | `TMap` dans les `USaveGame` | `Save_C`, `GameSettings_C` | compatibilité des `.sav` existants | | `GetAssetByObjectPath` + `GetAsset` | chargement de maillages et textures par chemin | API passée à `FSoftObjectPath` ; broches orphelines au portage | +| `AssetRegistry.GetAssetsByClass("SkeletalMesh" / "StaticMesh" / "StreetMap")` | `GI::EventGraph` : énumération des corps, vêtements, coiffures, meubles, villes | **5.1 a remplacé le paramètre `FName ClassName` par `FTopLevelAssetPath`** : à la montée de version, la valeur de classe est perdue (broche orpheline), la requête ne renvoie plus rien, sans erreur de compilation. Mesuré sur la base 4.27 chargée en 5.5 (L1). Correctif CX-B01 | | `SetSkeletalMesh`, `SetMasterPoseComponent`, propriété `SkeletalMesh` | `Person`, `GI`, UI | renommés/dépréciés en 5.1 | | Composants proxy ajoutés à l'exécution (`AddComponent`) | `Person::NewProxy`, `MorphProxy` | type réel `USkinnedMeshComponent` ≠ `USkeletalMeshComponent` (cause de l'échec de R-03) | | `FFileHelper`, `IFileManager` sur `ProjectContentDir` | `ModdingExtra` | stable ; exige `Modules` hors paquet | diff --git a/Docs/Migration/04_Cahier_Des_Charges.md b/Docs/Migration/04_Cahier_Des_Charges.md index 77e48f0..67860c1 100644 --- a/Docs/Migration/04_Cahier_Des_Charges.md +++ b/Docs/Migration/04_Cahier_Des_Charges.md @@ -53,25 +53,37 @@ Traitement du `Registre_Erreurs.md` **par ordre de fréquence × gravité**, un `D:\Game\LifePlay_Backup_5.5\L0` (53 fichiers). - **Sortie** : aller-retour `Snapshot`/`Restore` vérifié par MD5 ; T-STAT-02 à 04 au vert. -### L1 — Assainissement du contenu et des caches -- **Objectif** : 0 package UE4 ; `GI` dans un état 5.5 connu et documenté ; projet débarrassé des artefacts. -- **Périmètre** : - 1. Reconstituer `GI` « R-03 annulé + correctif AssetRegistry » : restaurer - `Saved/Backups/avant-R03-R06/BPs/GI.uasset`, puis `LPFixAssetRegistryPins -DryRun`, puis réel - (décision D-01, §4). - 2. Rendre R-03/R-04 cohérents sur les autres assets (décision D-02, §4). - 3. Purger les dossiers régénérables (`02_Audit_Logiciel.md` §8), après sauvegarde. - 4. `DefaultEngine.ini` : retirer `AndroidFileServerRuntimeSettings` et `CookerSettings` ; - `DefaultEditor.ini` : vider les `SharedProfiles` générés. -- **Sortie** : T-STAT-01 à 05, T-LOAD-02 (0 broche orpheline), T-LOAD-01. -- **Retour** : `Restore.ps1 -Lot L1` ; les caches purgés se régénèrent seuls. +### L1 — Base saine ✅ (2026-09-29) +- **Objectif** : repartir d'un contenu de gameplay **connu et sain** (décisions D-01, D-02) et + mesurer ce que le moteur 5.5 en dit, sans aucun correctif. +- **Périmètre réalisé** : + 1. `Content/{BPs,UI,Structs,Scenes,Render,Characters}` (385 fichiers) remis **à l'identique de + 4.27** (MD5 vérifiés). Tous les correctifs de contenu antérieurs sont ainsi retirés, R-03 et + R-04 compris. `Content/Heavy` (resave moteur seul, sans correctif) est conservé et sera + contrôlé en L4. + 2. Correctifs isolés : catalogue et protocole de réimport dans `05_Correctifs_Isoles.md` ; + écarts de code 4.27 → 5.5 exportés dans `correctifs/P01…P06.patch`. + 3. Diagnostic brut de la base : `LPCheckMeshAssignment` et `CompileAllBlueprints` + (`etat/L1_*.txt`). +- **Écarté du lot** : suppression des sections `AndroidFileServerRuntimeSettings` / `CookerSettings` + de `DefaultEngine.ini` : le plugin moteur AndroidFileServer la **recrée à chaque lancement** + (nouveau `SecurityToken`). Traitement correct en L2 : désactiver ce plugin dans le `.uproject`. + `DefaultEditor.ini` conservé (profils de prévisualisation réécrits par l'éditeur). +- **Déplacé en L2** : purge des dossiers régénérables (`Binaries`, `Intermediate` sont + nécessaires aux commandlets tant que la reconstruction n'est pas faite). +- **Sortie** : contenu de gameplay = 4.27 (MD5) ; relevé de base archivé ; T-STAT-02 à 05. + T-STAT-01 (0 package UE4) est **reporté** au sous-lot `L4-CX-B07` (resave contrôlé). +- **Retour** : `Tools\Restore.ps1 -Lot L1` ou `git checkout lot-L1-avant -- Content`. ### L2 — Compilation propre - **Objectif** : binaires reconstruits à partir de zéro, projet conforme UE5. - **Périmètre** : `.uproject` (`TargetPlatforms: ["Windows"]`, section `Plugins` explicite : - `ModdingExtra`, `StreetMap`, `EnhancedInput`, `McpAutomationBridge` limité à l'éditeur) ; - retrait de `Build/WindowsNoEditor` et `Build/LinuxNoEditor` ; régénération des fichiers de projet ; - compilation éditeur et jeu. + `ModdingExtra`, `StreetMap`, `EnhancedInput`, `McpAutomationBridge` limité à l'éditeur, + `AndroidFileServer` désactivé puis retrait de sa section dans `DefaultEngine.ini`) ; + retrait de `Build/WindowsNoEditor` et `Build/LinuxNoEditor` ; mise de côté (déplacement vers + `D:\Game\LifePlay_Backup_5.5\L2\_purge`, pas de suppression) de `Binaries`, `Intermediate`, + `Plugins/*/Binaries`, `Plugins/*/Intermediate`, `Saved/Cooked`, `Saved/StagedBuilds` ; + régénération des fichiers de projet ; compilation éditeur et jeu. - **Sortie** : T-BUILD-01, T-BUILD-02, T-LOAD-04. ### L3 — Journalisation efficace @@ -86,13 +98,15 @@ Traitement du `Registre_Erreurs.md` **par ordre de fréquence × gravité**, un répétitifs. - **Sortie** : T-BUILD-01, T-LOG-01 ; A/B : mêmes comptes `GetAllFilesFromFolder` qu'avant. -### L4 — Chargement stable +### L4 — Réimport contrôlé des correctifs, chargement stable - **Objectif** : 0 erreur de chargement et de compilation des Blueprints, cuisson à 0 erreur. -- **Périmètre** : relevé `CompileAllBlueprints` + `LPCheckMeshAssignment` ; une famille de - correction par sous-lot (`LPFixAssetRegistryPins`, `LPFixOrphanBoundEvents`, - `LPFixEditableTextBoxFont`, `LPFixZeroScaleActors`) ; contrôle StreetMap (`LPCheckStreetMap` - sur 4.27 **et** 5.5, comparaison des CSV). -- **Sortie** : T-LOAD-01 à T-LOAD-05. +- **Périmètre** : un sous-lot par correctif, dans l'ordre de `05_Correctifs_Isoles.md` §2, selon + le protocole §3 (photographie avant/après, `-DryRun`, diff, compilation, A/B si gameplay) : + `L4-CX-B01` (broches AssetRegistry de `GI`, **avec A/B d'exécution**), `L4-CX-B02` + (`EditableTextBoxStyle`), `L4-CX-B03` (mur à échelle nulle), `L4-CX-B04` (événements orphelins), + `L4-CX-B07` (resave UE5 des dossiers de gameplay) ; contrôle StreetMap (`LPCheckStreetMap` sur + 4.27 **et** 5.5, comparaison des CSV). +- **Sortie** : T-LOAD-01 à T-LOAD-05, T-STAT-01. ### L5 — Données et personnages - **Objectif** : `generatePerson()` sans argument produit des personnages distincts et habillés. @@ -128,7 +142,7 @@ Ordre indicatif, à réviser selon le registre : | ID | Question | Recommandation | Statut | |---|---|---|---| -| D-01 | Base de reconstruction de `GI` | `avant-R03-R06` + `LPFixAssetRegistryPins` : reproduit l'état « R-03 annulé + correctif » décrit par le rapport du 28/09. Alternative : repartir du `GI` 4.27 actuel (le moteur le convertira) + même commandlet | à valider (L1) | -| D-02 | R-03/R-04 présents sur `AI`, `Room` et 7 widgets, annulés sur `Person` et `GI` | **conserver en l'état pour la V1** (les widgets ne portent pas de proxies ; `CompileAllBlueprints` passait) ; refaire R-03 proprement en L7a | à valider (L1) | +| D-01 | Base de reconstruction de `GI` | **Décidé (utilisateur, 2026-09-29)** : les correctifs antérieurs sont douteux (ni suivis ni testés). On repart d'une base saine — le contenu de gameplay 4.27 — et on **isole** les correctifs pour les réimporter un par un avec un contrôle renforcé (`05_Correctifs_Isoles.md`) | acquis (L1) | +| D-02 | R-03/R-04 présents sur `AI`, `Room` et 7 widgets, annulés sur `Person` et `GI` | **Décidé (utilisateur)** : tout annuler maintenant — réalisé par le retour à la base 4.27 | acquis (L1) | | D-03 | Mesure d'exécution | builds empaquetées Development uniquement (règle §2 du document 03) | acquis | | D-04 | Suivi de version | dépôt git local, Blueprints de gameplay inclus, `Content/Heavy` exclu (sauvegardes par lot) | acquis (L0) | diff --git a/Docs/Migration/05_Correctifs_Isoles.md b/Docs/Migration/05_Correctifs_Isoles.md new file mode 100644 index 0000000..54a9b3d --- /dev/null +++ b/Docs/Migration/05_Correctifs_Isoles.md @@ -0,0 +1,59 @@ +# 05 — Correctifs isolés et protocole de réimport sous contrôle renforcé + +> Décision D-01 (2026-09-29) : les correctifs appliqués avant la reprise n'ont été ni suivis ni +> testés. Ils sont **isolés** : retirés du contenu (retour à la base 4.27 en L1) ou exportés en +> patchs relisibles pour le code. Chacun est **réimporté seul**, selon le protocole du §3. +> Décision D-02 : R-03 et R-04 sont annulés partout. + +--- + +## 1. Correctifs de code (conservés, relisibles) + +Le code 5.5 est nécessaire pour compiler : il reste en place, mais chaque écart avec 4.27 est +exporté dans `Docs/Migration/correctifs/` pour relecture. + +| ID | Patch | Contenu | Nécessaire à | Statut | +|---|---|---|---|---| +| CX-C01 | `P06` | `Target.cs` : `BuildSettingsVersion.V5`, `Unreal5_5` | compilation | conservé | +| CX-C02 | `P06` | `.uproject` : `EngineAssociation 5.5`, suppression des 5 entrées de plugins (Victory, VisualStudioTools, SteamVR, ModdingPlus, MultiTask) | ouverture du projet | conservé ; section `Plugins` explicite en L2 | +| CX-C03 | `P06` | `.uplugin` : suppression de `EngineVersion "4.27.0"` | chargement des plugins | conservé | +| CX-C04 | `P03` | `ModdingExtra` : inclusions UE5 (`Engine.h` retiré), `Path.Combine` | compilation | conservé | +| CX-C05 | `P04` | `StreetMap` : portage LWC (`FVector3f`, `FBox3f`), R-01 (`FAssetRegistryTagsContext`), R-02 (initialiseurs) | compilation, 280 villes | conservé ; vérifié en L4 (`LPCheckStreetMap` 4.27 et 5.5) | +| CX-C06 | `P01`, `P05` | `LPVictoryCompat` (2 fonctions) + 3 `[CoreRedirects]` Victory → LifePlay | chargement de `GI`, `ExtImg`, `FaceTexture`, `MainMenu`, `Inventory` | conservé ; à contrôler en L4 (T-LOAD-01) | +| CX-C07 | `P01` | `LPAssetRegistryHelpers::GetAssetByObjectPath` : conversion `FSoftObjectPath` | compilation | conservé | +| CX-C08 | `P01` | `LPAssetRegistryHelpers::GetAssetsByClassName`, `GetAssetObjectPath` (nouvelles fonctions) | réimport de CX-B01 | conservé, **inutilisé** tant que CX-B01 n'est pas réimporté | +| CX-C09 | `P01` | `LPNavigationHelpers` (enrobage pur de `K2_GetRandomLocationInNavigableRadius`) | R-04 | conservé, inutilisé (R-04 annulé) | +| CX-C10 | `P01` | `LifePlay.Build.cs` : `PublicIncludePaths`, `NavigationSystem`, `ImageWrapper`, `ApplicationCore` | compilation | conservé | +| CX-C11 | `P05` | `Config` : `[CoreRedirects]`, 4 clés PhysX retirées, classes Enhanced Input par défaut, description, `StagingDirectory`, section `McpAutomationBridgeSettings` | — | conservé ; relu en L2 | +| CX-C12 | `P03` (hors patch : ajouté le 2026-09-28) | instrumentation `LogLPModdingTrace` | diagnostic | **à retirer** en L3 | +| CX-C13 | `P02` | commandlets `LifePlayEditorTools` (1 777 lignes) | outillage éditeur | conservé ; ne touche pas au jeu | + +## 2. Correctifs de contenu (retirés en L1, à réimporter un par un) + +| ID | Outil | Cible | Effet attendu | Justification | Priorité | Statut | +|---|---|---|---|---|---|---| +| CX-B00 | `LPFixAssetRegistryNodes` (portage 4.27) | `GI`, `Person`, `Room`, `UI/VisualMorph` | `GetAssetByObjectPath` en nœud pur | **déjà présent dans la base 4.27** (les 4 assets importent `LifePlay.LPAssetRegistryHelpers`) | — | inclus dans la base | +| CX-B01 | `LPFixAssetRegistryPins` | `GI` : 3 `GetAssetsByClass` (+ 2 broches associées) | nœuds rebranchés sur `GetAssetsByClassName` avec la valeur de classe d'origine | **candidat n°1 pour ERR-002** : sans lui, `GetAssetsByClass` interroge avec un chemin de classe vide ; aucun corps, vêtement ni coiffure énumérable | 1 | à réimporter (L4) avec A/B d'exécution | +| CX-B02 | `LPFixEditableTextBoxFont` | `UI/CharGen`, `UI/StatMenu` : 6 nœuds `Make/Break EditableTextBoxStyle` | broche `Font` orpheline retirée | **bloque la cuisson** (6 erreurs, cook du 2026-09-07) | 2 | à réimporter (L4) | +| CX-B03 | `LPFixZeroScaleActors -Fix -Scale=0.1` | `Scenes/CentralLondon` : `Wall.StaticMeshComponent0` | échelle X 0 → 0,1 | corps physique invalide ; `ensure InverseFast` (plantage éditeur du 2026-09-07) | 3 | à réimporter (L4) | +| CX-B04 | `LPFixOrphanBoundEvents` | `UI/TopRight` (1), `UI/CharGen` (2) | 3 événements `On Clicked` orphelins supprimés | avertissements ; clics déjà morts | 4 | à réimporter (L4) | +| CX-B05 | `LPFixDeprecatedNodes` (R-03) | 56 nœuds `SkeletalMesh`, 10 Blueprints | `GetSkeletalMeshAsset()` | **rejeté** : aggrave ERR-002 (16,6 → 35 `Accessed None`/perso) car les proxies sont des `USkinnedMeshComponent` | — | à refaire autrement (L7a) | +| CX-B06 | `LPFixDeprecatedNodes` (R-04) | 6 nœuds, `AI`, `Person`, `Room` | `LPNavigationHelpers` | avertissements de dépréciation seulement | 5 | reporté (L7) | +| CX-B07 | `ResavePackages` | dossiers de gameplay (`BPs`, `UI`, `Structs`, `Scenes`, `Render`, `Characters`) | format UE5 | chargement plus rapide ; T-STAT-01 | 6 | après CX-B01 à B04 (L4) | + +## 3. Protocole de réimport sous contrôle renforcé + +Un correctif = un sous-lot (`L4-CX-B01`, …) = un commit. Pas de regroupement. + +| Étape | Action | Preuve archivée dans `Docs/Migration/etat/` | +|---|---|---| +| 1 | `git tag L4-CX-xx-avant` ; `Tools\Snapshot.ps1 -Lot L4-CX-xx -Path ` | manifeste MD5 | +| 2 | **Photographie avant** : `LPDumpFunction -BP= -Fn= -Pins` | `_dump_avant.txt` | +| 3 | **Simulation** : commandlet avec `-DryRun` ; le nombre de nœuds trouvés doit égaler celui attendu (§2) | `_dryrun.txt` ; tout écart arrête le sous-lot | +| 4 | Application réelle | journal de la commandlet | +| 5 | **Photographie après** + diff avant/après : seuls les nœuds attendus diffèrent | `_dump_apres.txt`, `_diff.txt` | +| 6 | `CompileAllBlueprints` + `LPCheckMeshAssignment` : aucune erreur **nouvelle** par rapport au relevé de base | résumés `RunCommandlet` | +| 7 | Si le correctif touche le gameplay (CX-B01) : build Development + A/B avec la référence 4.27 (`Tools\LogStats.ps1 -Compare`) | tableau A/B | +| 8 | Journal `CHG`, commit, `git tag L4-CX-xx-apres` ; en cas d'échec : `Tools\Restore.ps1 -Lot L4-CX-xx` | entrée de journal | + +Critère d'acceptation commun : **effet attendu observé, aucun effet de bord mesuré**. diff --git a/Docs/Migration/Journal_Modifications.md b/Docs/Migration/Journal_Modifications.md index 91f3366..a527079 100644 --- a/Docs/Migration/Journal_Modifications.md +++ b/Docs/Migration/Journal_Modifications.md @@ -24,3 +24,36 @@ | T-STAT-04 arbre 4.27 inchangé | ✅ 144 fichiers (empreinte créée : `etat/L0_ref427.csv`) | Aucun fichier du projet n'a été modifié en L0 en dehors de `.gitignore` et des ajouts ci-dessus. + +--- + +## Lot L1 — Base saine (2026-09-29) + +Décisions utilisateur D-01 et D-02 : `04_Cahier_Des_Charges.md` §4. Tag d'entrée `lot-L1-avant`. +Sauvegarde : `D:\Game\LifePlay_Backup_5.5\L1\` (387 fichiers). + +| ID | Date | Lot | Fichiers | Raison | Avant → après | Retour arrière | +|---|---|---|---|---|---|---| +| CHG-007 | 2026-09-29 | L1 | `Content/{BPs,UI,Structs,Scenes,Render,Characters}` (385 fichiers, 293 packages) | retour à la base 4.27 : retire tous les correctifs de contenu non suivis (dont R-03, R-04) | contenu 5.5 (empreintes `etat/L0_md5_*.csv`) → identique à 4.27 (MD5 vérifiés, 0 écart) | `Tools\Restore.ps1 -Lot L1` ou `git checkout lot-L1-avant -- Content` | +| CHG-008 | 2026-09-29 | L1 | `Tools/RunCommandlet.ps1` (nouveau) | lancement de commandlet avec journal archivé et résumé dédoublonné | — → créé | `git rm` | +| CHG-009 | 2026-09-29 | L1 | `Docs/Migration/05_Correctifs_Isoles.md`, `correctifs/P01…P06.patch` (nouveaux) | isolement des correctifs : catalogue, protocole de réimport, patchs de code 4.27 → 5.5 | — → créés | `git rm` | +| CHG-010 | 2026-09-29 | L1 | `Config/DefaultEngine.ini` | essai de retrait des sections `AndroidFileServer`/`CookerSettings` **annulé** : l'éditeur recrée la section à chaque lancement (nouveau `SecurityToken`) | inchangé (restauré depuis `lot-L1-avant`) | sans objet ; traité en L2 | + +### Relevé de base : moteur 5.5 sur le contenu 4.27, sans aucun correctif + +| Commandlet | Résultat | Résumé | +|---|---|---| +| `LPCheckMeshAssignment` | 5 nœuds à broches orphelines dans `GI` : 3 `GetAssetsByClass` (classe perdue : `SkeletalMesh`, `StaticMesh`, `StreetMap`), 2 `Break AssetData` (`ObjectPath`) ; 6 nœuds `EditableTextBoxStyle` (`StatMenu`, `CharGen`) | `etat/L1_LPCheckMeshAssignment_20260929-010821.txt` | +| `CompileAllBlueprints` | **6 erreurs, 100 avertissements, 0 Blueprint en échec de chargement** ; échecs : `UI/StatMenu` (3), `UI/CharGen` (3) — broche `Font` d'`EditableTextBoxStyle` | `etat/L1_CompileAllBlueprints_20260929-010931.txt` | + +Les commandlets de contrôle n'ont rien écrit : contenu toujours identique à 4.27 après passage (385/385). + +### Vérifications de sortie L1 + +| Test | Résultat | +|---|---| +| Contenu de gameplay = 4.27 | ✅ 385/385 MD5 | +| T-STAT-01 | ⏳ 293 packages UE4 (attendu : base 4.27) — resave contrôlé en `L4-CX-B07` | +| T-STAT-02, 03, 04 | ✅ | +| T-LOAD-01 | ❌ attendu : 6 erreurs (`CX-B02`), à corriger en L4 | +| T-LOAD-02 | ❌ attendu : 5 broches (`CX-B01`), à corriger en L4 | diff --git a/Docs/Migration/Registre_Erreurs.md b/Docs/Migration/Registre_Erreurs.md index 241cb24..d189865 100644 --- a/Docs/Migration/Registre_Erreurs.md +++ b/Docs/Migration/Registre_Erreurs.md @@ -5,7 +5,11 @@ | ID | Signature | Source | Fréquence | Gravité | Lot cible | Statut | |---|---|---|---:|---|---|---| -| ERR-001 | `Content/BPs/GI.uasset` au format UE4, identique à 4.27 | `Tools\AssetHeaders.ps1` | 1 fichier | bloquante | L1 | ouvert | +| ERR-001 | `Content/BPs/GI.uasset` au format UE4, identique à 4.27 | `Tools\AssetHeaders.ps1` | 1 fichier | bloquante | L1 | clos (CHG-007) : remplacé par la base saine 4.27 complète ; format UE5 → ERR-022 | +| ERR-020 | `GetAssetsByClass` : classe perdue à la montée de version (3 nœuds `GI`) + 2 `Break AssetData` sans `ObjectPath` | `LPCheckMeshAssignment` L1 | 5 broches | **bloquante** (cause probable d'ERR-002) | L4-CX-B01 | ouvert | +| ERR-021 | broche `Font` d'`EditableTextBoxStyle` : échec de compilation `UI/StatMenu`, `UI/CharGen` | `CompileAllBlueprints` L1 | 6 erreurs | **bloquante** (cuisson) | L4-CX-B02 | ouvert | +| ERR-022 | 293 packages de gameplay au format UE4 (base 4.27) | `Tools\AssetHeaders.ps1` | 293 | faible (converti au chargement) | L4-CX-B07 | ouvert | +| ERR-023 | `AndroidFileServer` réécrit sa section et son `SecurityToken` dans `DefaultEngine.ini` à chaque lancement | L1 | chaque lancement | faible (bruit git) | L2 | ouvert | | ERR-002 | `generatePerson()` sans argument : personnages identiques (« Tyrone »), nus, invisibles ; en PIE 5.5 chaque `index SPAWN` pointe vers `Person_C_0` | rapport 2026-09-28, journal PIE 09-28 | 16,6 `Accessed None` maillage/perso (4.27 : 0,3) | bloquante | L5 | ouvert | | ERR-003 | `Attempted to access index 0 from array Float_… of length 0` dans `GI::ReturnStatIfNeeded` (variable DSL `Float` vide) | build 5.5 Development | 2 (4.27 : 0) | haute | L5 | ouvert | | ERR-004 | `index N from CallFunc_ParseIntoArray_ReturnValue of length N` (`GI` EventGraph) | PIE 09-28 | 6 510 | moyenne | L7b | ouvert | diff --git a/Docs/Migration/correctifs/P01_Source_LifePlay.patch b/Docs/Migration/correctifs/P01_Source_LifePlay.patch new file mode 100644 index 0000000..da87211 --- /dev/null +++ b/Docs/Migration/correctifs/P01_Source_LifePlay.patch @@ -0,0 +1,355 @@ +diff --git a/D:/Game/LifePlay-master 4.27/Source/LifePlay/LPAssetRegistryHelpers.cpp b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPAssetRegistryHelpers.cpp +index 9553b8f..b8ab09f 100644 +--- a/D:/Game/LifePlay-master 4.27/Source/LifePlay/LPAssetRegistryHelpers.cpp ++++ b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPAssetRegistryHelpers.cpp +@@ -1,4 +1,4 @@ +-// Portage UE 4.27 (2026.9 beta) - voir LPAssetRegistryHelpers.h ++// Portage UE 5.5 (2026.9 beta) - voir LPAssetRegistryHelpers.h + + #include "LPAssetRegistryHelpers.h" + +@@ -11,5 +11,48 @@ FAssetData ULPAssetRegistryHelpers::GetAssetByObjectPath(const FName ObjectPath, + const FAssetRegistryModule& AssetRegistryModule = + FModuleManager::LoadModuleChecked(TEXT("AssetRegistry")); + +- return AssetRegistryModule.Get().GetAssetByObjectPath(ObjectPath, bIncludeOnlyOnDiskAssets); ++ // 5.1+ : la surcharge prenant un FName est depreciee. La broche Blueprint reste un ++ // FName (les noeuds rebranches par la commandlet en dependent), seule la conversion ++ // vers FSoftObjectPath est faite ici. ++ const FSoftObjectPath Path(ObjectPath.ToString()); ++ const FAssetData Result = AssetRegistryModule.Get().GetAssetByObjectPath(Path, bIncludeOnlyOnDiskAssets); ++ ++ // Diagnostic du 2026-09-08 : cette fonction a ete instrumentee pour verifier qu'elle ++ // n'etait pas en cause dans l'absence de maillage des personnages. Elle ne l'etait pas ++ // (2720 resolutions reussies sur 2776). Le defaut venait de GetAssetsByClass, ci-dessous. ++ return Result; ++} ++ ++bool ULPAssetRegistryHelpers::GetAssetsByClassName(FName ClassName, TArray& OutAssetData, bool bSearchSubClasses) ++{ ++ OutAssetData.Reset(); ++ ++ if (ClassName.IsNone()) ++ { ++ return false; ++ } ++ ++ // TryFindTypeSlow resout un nom court ("SkeletalMesh") vers la classe reelle, quel que ++ // soit son module : /Script/Engine.SkeletalMesh comme /Script/StreetMapRuntime.StreetMap. ++ const UClass* ResolvedClass = UClass::TryFindTypeSlow(ClassName.ToString()); ++ if (!ResolvedClass) ++ { ++ UE_LOG(LogTemp, Warning, TEXT("LPAssetRegistryHelpers : classe '%s' introuvable."), *ClassName.ToString()); ++ return false; ++ } ++ ++ const FAssetRegistryModule& AssetRegistryModule = ++ FModuleManager::LoadModuleChecked(TEXT("AssetRegistry")); ++ ++ return AssetRegistryModule.Get().GetAssetsByClass( ++ FTopLevelAssetPath(ResolvedClass), OutAssetData, bSearchSubClasses); ++} ++ ++FName ULPAssetRegistryHelpers::GetAssetObjectPath(const FAssetData& AssetData) ++{ ++ if (!AssetData.IsValid()) ++ { ++ return NAME_None; ++ } ++ return FName(*AssetData.GetSoftObjectPath().ToString()); + } +diff --git a/D:/Game/LifePlay-master 4.27/Source/LifePlay/LPAssetRegistryHelpers.h b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPAssetRegistryHelpers.h +index d59109a..85fe6fa 100644 +--- a/D:/Game/LifePlay-master 4.27/Source/LifePlay/LPAssetRegistryHelpers.h ++++ b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPAssetRegistryHelpers.h +@@ -1,8 +1,8 @@ +-// Portage UE 4.27 (2026.9 beta) ++// Portage UE 5.5 (2026.9 beta) - rustine introduite lors du portage 4.27, toujours necessaire. + // + // Epic a rendu IAssetRegistry::GetAssetByObjectPath impur (BlueprintPure=false) apres la + // version d'Unreal utilisee pour ecrire les Blueprints du jeu. Les graphes existants +-// l'employaient comme noeud PUR : au chargement en 4.27 le noeud gagne une broche Exec non ++// l'employaient comme noeud PUR : au chargement le noeud gagne une broche Exec non + // connectee, il est donc elague, et le noeud "Get Asset" qui consommait sa sortie se retrouve + // sans entree -> "'In Asset Data' ... must have an input wired into it". + // +@@ -31,4 +31,30 @@ public: + */ + UFUNCTION(BlueprintPure, Category = "AssetRegistry") + static FAssetData GetAssetByObjectPath(const FName ObjectPath, bool bIncludeOnlyOnDiskAssets = false); ++ ++ /** ++ * Version FName de IAssetRegistry::GetAssetsByClass. ++ * ++ * 5.1 a remplace le parametre FName ClassName par un FTopLevelAssetPath ClassPathName. ++ * La montee de version a supprime l'ancienne broche des noeuds existants SANS reporter ++ * sa valeur sur la nouvelle : les trois appels de GI (SkeletalMesh, StaticMesh, ++ * StreetMap) interrogeaient donc l'AssetRegistry avec un chemin de classe VIDE et ne ++ * renvoyaient plus rien. Le jeu ne pouvait plus enumerer ni corps, ni vetements, ni ++ * coiffures : generatePerson() sans argument n'avait plus rien a tirer au sort. ++ * ++ * Rien dans le graphe ne le signalait : la compilation restait a zero erreur. ++ * ++ * Les noms de broches reproduisent ceux du noeud d'origine pour que le reaiguillage se ++ * limite a un changement de reference de fonction. ++ */ ++ UFUNCTION(BlueprintCallable, Category = "AssetRegistry") ++ static bool GetAssetsByClassName(FName ClassName, TArray& OutAssetData, bool bSearchSubClasses = false); ++ ++ /** ++ * Equivalent de l'ancien FAssetData::ObjectPath (supprime en 5.1 au profit de ++ * FSoftObjectPath). Rend le chemin sous la forme "/Game/Dossier/Asset.Asset" attendue ++ * par les consommateurs existants. ++ */ ++ UFUNCTION(BlueprintPure, Category = "AssetRegistry") ++ static FName GetAssetObjectPath(const FAssetData& AssetData); + }; +diff --git a/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPNavigationHelpers.cpp b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPNavigationHelpers.cpp +new file mode 100644 +index 0000000..33bba33 +--- /dev/null ++++ b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPNavigationHelpers.cpp +@@ -0,0 +1,18 @@ ++// Portage UE 5.5 - voir LPNavigationHelpers.h ++ ++#include "LPNavigationHelpers.h" ++ ++#include "NavigationSystem.h" ++ ++bool ULPNavigationHelpers::GetRandomLocationInNavigableRadius( ++ UObject* WorldContextObject, ++ const FVector& Origin, ++ FVector& RandomLocation, ++ float Radius, ++ ANavigationData* NavData, ++ TSubclassOf FilterClass) ++{ ++ // Simple reacheminement : toute la logique reste cote moteur. ++ return UNavigationSystemV1::K2_GetRandomLocationInNavigableRadius( ++ WorldContextObject, Origin, RandomLocation, Radius, NavData, FilterClass); ++} +diff --git a/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPNavigationHelpers.h b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPNavigationHelpers.h +new file mode 100644 +index 0000000..81e9922 +--- /dev/null ++++ b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPNavigationHelpers.h +@@ -0,0 +1,48 @@ ++// Portage UE 5.5 (2026.9 beta) - remediation R-04. ++// ++// UNavigationSystemV1::K2_GetRandomPointInNavigableRadius est deprecie depuis 5.1 au profit ++// de K2_GetRandomLocationInNavigableRadius. Les deux ont EXACTEMENT la meme liste de ++// parametres et le meme retour, mais l'ancien est BlueprintPure et le nouveau est ++// BlueprintCallable : echanger la reference de fonction sur les noeuds existants leur ++// ajouterait des broches Exec non connectees, ils seraient elagues a la compilation. ++// C'est le meme piege que celui traite par ULPAssetRegistryHelpers lors du portage 4.27. ++// ++// Cette classe re-expose donc la version NON depreciee en BlueprintPure, avec des noms de ++// broches identiques a ceux du noeud d'origine, pour que la commandlet ++// LPFixDeprecatedNodes puisse se contenter de reaiguiller la reference de fonction. ++ ++#pragma once ++ ++#include "CoreMinimal.h" ++#include "Kismet/BlueprintFunctionLibrary.h" ++#include "Templates/SubclassOf.h" ++#include "LPNavigationHelpers.generated.h" ++ ++class ANavigationData; ++class UNavigationQueryFilter; ++ ++UCLASS() ++class LIFEPLAY_API ULPNavigationHelpers : public UBlueprintFunctionLibrary ++{ ++ GENERATED_BODY() ++ ++public: ++ ++ /** ++ * Version PURE de UNavigationSystemV1::K2_GetRandomLocationInNavigableRadius. ++ * ++ * Les noms de parametres reproduisent ceux de K2_GetRandomPointInNavigableRadius : ce sont ++ * eux qui portent les liaisons dans les Blueprints existants (Room, Person, AI). ++ */ ++ UFUNCTION(BlueprintPure, Category = "AI|Navigation", ++ meta = (WorldContext = "WorldContextObject", ++ DisplayName = "Get Random Location in Navigable Radius (Pure)", ++ Keywords = "random point navigable radius")) ++ static bool GetRandomLocationInNavigableRadius( ++ UObject* WorldContextObject, ++ const FVector& Origin, ++ FVector& RandomLocation, ++ float Radius, ++ ANavigationData* NavData = nullptr, ++ TSubclassOf FilterClass = nullptr); ++}; +diff --git a/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPVictoryCompat.cpp b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPVictoryCompat.cpp +new file mode 100644 +index 0000000..ee3092b +--- /dev/null ++++ b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPVictoryCompat.cpp +@@ -0,0 +1,80 @@ ++// Portage UE 5.5 - voir LPVictoryCompat.h ++ ++#include "LPVictoryCompat.h" ++ ++#include "Engine/Texture2D.h" ++#include "HAL/PlatformApplicationMisc.h" ++#include "IImageWrapper.h" ++#include "IImageWrapperModule.h" ++#include "Misc/FileHelper.h" ++#include "Modules/ModuleManager.h" ++ ++namespace ++{ ++ EImageFormat GetJoyImageFormat(EJoyImageFormats JoyFormat) ++ { ++ switch (JoyFormat) ++ { ++ case EJoyImageFormats::JPG: return EImageFormat::JPEG; ++ case EJoyImageFormats::PNG: return EImageFormat::PNG; ++ case EJoyImageFormats::BMP: return EImageFormat::BMP; ++ case EJoyImageFormats::ICO: return EImageFormat::ICO; ++ case EJoyImageFormats::EXR: return EImageFormat::EXR; ++ case EJoyImageFormats::ICNS: return EImageFormat::ICNS; ++ } ++ return EImageFormat::JPEG; ++ } ++} ++ ++UTexture2D* ULPVictoryCompat::Victory_LoadTexture2D_FromFile(const FString& FullFilePath, EJoyImageFormats ImageFormat, bool& IsValid, int32& Width, int32& Height) ++{ ++ IsValid = false; ++ UTexture2D* LoadedT2D = nullptr; ++ ++ IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked(FName("ImageWrapper")); ++ TSharedPtr ImageWrapper = ImageWrapperModule.CreateImageWrapper(GetJoyImageFormat(ImageFormat)); ++ ++ // Load From File ++ TArray RawFileData; ++ if (!FFileHelper::LoadFileToArray(RawFileData, *FullFilePath)) return nullptr; ++ ++ // Create T2D! ++ if (ImageWrapper.IsValid() && ImageWrapper->SetCompressed(RawFileData.GetData(), RawFileData.Num())) ++ { ++ TArray UncompressedBGRA; ++ if (ImageWrapper->GetRaw(ERGBFormat::BGRA, 8, UncompressedBGRA)) ++ { ++ LoadedT2D = UTexture2D::CreateTransient(ImageWrapper->GetWidth(), ImageWrapper->GetHeight(), PF_B8G8R8A8); ++ ++ // Valid? ++ if (!LoadedT2D) return nullptr; ++ ++ // Out! ++ Width = ImageWrapper->GetWidth(); ++ Height = ImageWrapper->GetHeight(); ++ ++ // Copy! ++ // 5.1+ : UTexture2D::PlatformData est prive, on passe par GetPlatformData() ++ void* TextureData = LoadedT2D->GetPlatformData()->Mips[0].BulkData.Lock(LOCK_READ_WRITE); ++ FMemory::Memcpy(TextureData, UncompressedBGRA.GetData(), UncompressedBGRA.Num()); ++ LoadedT2D->GetPlatformData()->Mips[0].BulkData.Unlock(); ++ ++ // Update! ++ LoadedT2D->UpdateResource(); ++ } ++ } ++ ++ // Success! ++ // NOTE : comportement repris tel quel du plugin d'origine. IsValid ne distingue que ++ // le fichier introuvable (false, sortie anticipee ci-dessus) du reste (true), y compris ++ // quand l'image est illisible et que le retour est nul. Volontairement non corrige : ++ // les Blueprints existants branchent sur ce flag, changer sa semantique changerait ++ // leur comportement. Voir Docs/Architecture/VictoryPlugin_Architecture.md (R-14). ++ IsValid = true; ++ return LoadedT2D; ++} ++ ++void ULPVictoryCompat::Victory_SaveStringToOSClipboard(const FString& ToClipboard) ++{ ++ FPlatformApplicationMisc::ClipboardCopy(*ToClipboard); ++} +diff --git a/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPVictoryCompat.h b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPVictoryCompat.h +new file mode 100644 +index 0000000..0a71bf5 +--- /dev/null ++++ b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPVictoryCompat.h +@@ -0,0 +1,51 @@ ++// Portage UE 5.5 - remplacement des 2 seuls noeuds du Victory Plugin utilises par LifePlay. ++// ++// Le plugin d'origine (VictoryBPLibrary, 9327 lignes sur 17 fichiers) dependait de PhysX, ++// APEX et ApexDestruction, supprimes d'UE5. Un releve exhaustif sur les 8562 .uasset du ++// projet n'a trouve que deux fonctions appelees, depuis 5 assets seulement, plus ++// l'enumeration EJoyImageFormats. ++// ++// Detail complet : Docs/Architecture/VictoryPlugin_Architecture.md ++// ++// Les noms et signatures sont reproduits a l'identique pour que les noeuds Blueprint ++// existants se rebranchent seuls ; le raccordement se fait par les CoreRedirects ++// declares dans Config/DefaultEngine.ini. ++ ++#pragma once ++ ++#include "CoreMinimal.h" ++#include "Kismet/BlueprintFunctionLibrary.h" ++#include "LPVictoryCompat.generated.h" ++ ++class UTexture2D; ++ ++/** ++ * Formats d'image acceptes par Victory_LoadTexture2D_FromFile. ++ * L'ordre des membres est celui du plugin d'origine : il est serialise en octet dans les ++ * valeurs par defaut des broches Blueprint, toute permutation les corromprait. ++ */ ++UENUM(BlueprintType) ++enum class EJoyImageFormats : uint8 ++{ ++ JPG UMETA(DisplayName="JPG "), ++ PNG UMETA(DisplayName="PNG "), ++ BMP UMETA(DisplayName="BMP "), ++ ICO UMETA(DisplayName="ICO "), ++ EXR UMETA(DisplayName="EXR "), ++ ICNS UMETA(DisplayName="ICNS ") ++}; ++ ++UCLASS() ++class LIFEPLAY_API ULPVictoryCompat : public UBlueprintFunctionLibrary ++{ ++ GENERATED_BODY() ++ ++public: ++ ++ /** Load a Texture2D from a JPG,PNG,BMP,ICO,EXR,ICNS file! IsValid tells you if file path was valid or not. Enjoy! -Rama */ ++ UFUNCTION(BlueprintPure, Category = "Victory BP Library|Load Texture From File", meta=(Keywords="image png jpg jpeg bmp bitmap ico icon exr icns")) ++ static UTexture2D* Victory_LoadTexture2D_FromFile(const FString& FullFilePath, EJoyImageFormats ImageFormat, bool& IsValid, int32& Width, int32& Height); ++ ++ UFUNCTION(BlueprintCallable, Category = "Victory BP Library|String") ++ static void Victory_SaveStringToOSClipboard(const FString& ToClipboard); ++}; +diff --git a/D:/Game/LifePlay-master 4.27/Source/LifePlay/LifePlay.Build.cs b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LifePlay.Build.cs +index bcdaa8f..4252313 100644 +--- a/D:/Game/LifePlay-master 4.27/Source/LifePlay/LifePlay.Build.cs ++++ b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LifePlay.Build.cs +@@ -7,9 +7,23 @@ public class LifePlay : ModuleRules + public LifePlay(ReadOnlyTargetRules Target) : base(Target) + { + PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; ++ ++ // Portage 5.5 : le module a une structure plate (pas de sous-dossier Public/). ++ // BuildSettingsVersion.V5 desactive les chemins d'include legacy, il faut donc ++ // exposer explicitement le dossier du module aux modules qui en dependent ++ // (LifePlayEditorTools inclut LPAssetRegistryHelpers.h). ++ PublicIncludePaths.Add(ModuleDirectory); + + PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "AssetRegistry" }); + ++ // Portage 5.5 : necessaires a LPVictoryCompat (remplacement du Victory Plugin) ++ PrivateDependencyModuleNames.AddRange(new string[] { "ImageWrapper", "ApplicationCore" }); ++ ++ // Portage 5.5 (R-04) : ULPNavigationHelpers re-expose K2_GetRandomLocationInNavigableRadius ++ // en BlueprintPure. Dependance PUBLIQUE : le .h expose ANavigationData et ++ // UNavigationQueryFilter dans sa signature, et LifePlayEditorTools l'inclut. ++ PublicDependencyModuleNames.Add("NavigationSystem"); ++ + PrivateDependencyModuleNames.AddRange(new string[] { }); + + // Uncomment if you are using Slate UI diff --git a/Docs/Migration/correctifs/P02_Source_LifePlayEditorTools.patch b/Docs/Migration/correctifs/P02_Source_LifePlayEditorTools.patch new file mode 100644 index 0000000..2fd65f7 --- /dev/null +++ b/Docs/Migration/correctifs/P02_Source_LifePlayEditorTools.patch @@ -0,0 +1,1940 @@ +diff --git a/D:/Game/LifePlay-master 4.27/Source/LifePlayEditorTools/LPCheckMeshAssignmentCommandlet.cpp b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPCheckMeshAssignmentCommandlet.cpp +index 61d6490..7f6e486 100644 +--- a/D:/Game/LifePlay-master 4.27/Source/LifePlayEditorTools/LPCheckMeshAssignmentCommandlet.cpp ++++ b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPCheckMeshAssignmentCommandlet.cpp +@@ -67,7 +67,7 @@ int32 ULPCheckMeshAssignmentCommandlet::Main(const FString& Params) + AssetRegistryModule.Get().SearchAllAssets(true); + + TArray BlueprintAssets; +- AssetRegistryModule.Get().GetAssetsByClass(UBlueprint::StaticClass()->GetFName(), BlueprintAssets, true); ++ AssetRegistryModule.Get().GetAssetsByClass(UBlueprint::StaticClass()->GetClassPathName(), BlueprintAssets, true); + + int32 Total = 0; + int32 Disconnected = 0; +@@ -108,22 +108,40 @@ int32 ULPCheckMeshAssignmentCommandlet::Main(const FString& Params) + Callee = FString::Printf(TEXT(" [%s]"), *Fn->FunctionReference.GetMemberName().ToString()); + } + ++ // Un noeud ne nous interesse que s'il porte au moins une broche orpheline. ++ bool bHasOrphan = false; ++ for (const UEdGraphPin* Pin : GraphNode->Pins) ++ { ++ if (Pin && Pin->bOrphanedPin) { bHasOrphan = true; break; } ++ } ++ if (!bHasOrphan) ++ { ++ continue; ++ } ++ ++ UE_LOG(LogLPCheckMesh, Warning, TEXT(" %s :: %s -> %s%s"), ++ *Blueprint->GetName(), *Graph->GetName(), *GraphNode->GetName(), *Callee); ++ ++ // On dumpe TOUTES les broches : l'orpheline porte l'ancienne valeur, et la ++ // broche de remplacement dit si la migration l'a reprise ou laissee vide. + for (UEdGraphPin* Pin : GraphNode->Pins) + { +- if (!Pin || !Pin->bOrphanedPin) ++ if (!Pin || Pin->PinType.PinCategory == UEdGraphSchema_K2::PC_Exec) + { + continue; + } + +- ++Total; +- if (Pin->LinkedTo.Num() > 0) ++ const bool bOrphan = Pin->bOrphanedPin; ++ if (bOrphan) + { +- ++Disconnected; ++ ++Total; ++ if (Pin->LinkedTo.Num() > 0) { ++Disconnected; } + } + +- UE_LOG(LogLPCheckMesh, Warning, TEXT(" %s :: %s -> %s%s | broche '%s' %s"), +- *Blueprint->GetName(), *Graph->GetName(), *GraphNode->GetName(), *Callee, +- *Pin->PinName.ToString(), *DescribePin(Pin)); ++ UE_LOG(LogLPCheckMesh, Warning, TEXT(" %-22s %-3s %s"), ++ *Pin->PinName.ToString(), ++ bOrphan ? TEXT("[X]") : TEXT(" "), ++ *DescribePin(Pin)); + } + } + } +diff --git a/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPCheckStreetMapCommandlet.cpp b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPCheckStreetMapCommandlet.cpp +new file mode 100644 +index 0000000..32fc3d5 +--- /dev/null ++++ b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPCheckStreetMapCommandlet.cpp +@@ -0,0 +1,186 @@ ++// Portage UE 5.5 - voir LPCheckStreetMapCommandlet.h ++ ++#include "LPCheckStreetMapCommandlet.h" ++ ++#include "AssetRegistry/AssetRegistryModule.h" ++#include "HAL/FileManager.h" ++#include "Misc/FileHelper.h" ++#include "Misc/Paths.h" ++#include "StreetMap.h" ++#include "UObject/UObjectGlobals.h" ++ ++DEFINE_LOG_CATEGORY_STATIC(LogLPCheckStreetMap, Log, All); ++ ++namespace ++{ ++ /** Ce qu'on a trouve dans une ville. */ ++ struct FCityReport ++ { ++ FString Name; ++ int32 Roads = 0; ++ int32 Nodes = 0; ++ int32 Buildings = 0; ++ int32 Waters = 0; ++ int32 Parks = 0; ++ int32 NamedBuildings = 0; // batiments avec un nom non vide ++ int32 WithAmenity = 0; // batiments avec un Amenity non vide ++ int32 DistinctAmenities = 0; ++ bool bLoaded = false; ++ }; ++} ++ ++ULPCheckStreetMapCommandlet::ULPCheckStreetMapCommandlet() ++{ ++ IsClient = false; ++ IsServer = false; ++ IsEditor = true; ++ LogToConsole = true; ++} ++ ++int32 ULPCheckStreetMapCommandlet::Main(const FString& Params) ++{ ++ TArray Tokens; ++ TArray Switches; ++ TMap ParamsMap; ++ ParseCommandLine(*Params, Tokens, Switches, ParamsMap); ++ ++ const bool bVerbose = Switches.Contains(TEXT("Verbose")); ++ const bool bDumpAmenities = Switches.Contains(TEXT("DumpAmenities")); ++ const FString CsvPath = ParamsMap.FindRef(TEXT("CSV")); ++ ++ UE_LOG(LogLPCheckStreetMap, Warning, TEXT("=== Verification des assets UStreetMap ===")); ++ ++ FAssetRegistryModule& AssetRegistryModule = ++ FModuleManager::LoadModuleChecked(TEXT("AssetRegistry")); ++ AssetRegistryModule.Get().SearchAllAssets(true); ++ ++ TArray Assets; ++ AssetRegistryModule.Get().GetAssetsByClass(UStreetMap::StaticClass()->GetClassPathName(), Assets, true); ++ ++ // Ordre stable : indispensable pour diffing entre deux executions. ++ Assets.Sort([](const FAssetData& A, const FAssetData& B) ++ { ++ return A.AssetName.LexicalLess(B.AssetName); ++ }); ++ ++ UE_LOG(LogLPCheckStreetMap, Warning, TEXT("%d asset(s) UStreetMap trouve(s)."), Assets.Num()); ++ ++ TArray Reports; ++ Reports.Reserve(Assets.Num()); ++ ++ int32 LoadFailures = 0; ++ int32 EmptyCities = 0; ++ ++ for (const FAssetData& AssetData : Assets) ++ { ++ FCityReport Report; ++ Report.Name = AssetData.AssetName.ToString(); ++ ++ UStreetMap* StreetMap = Cast(AssetData.GetAsset()); ++ if (StreetMap == nullptr) ++ { ++ ++LoadFailures; ++ UE_LOG(LogLPCheckStreetMap, Error, TEXT(" ECHEC de chargement : %s"), *Report.Name); ++ Reports.Add(Report); ++ continue; ++ } ++ ++ Report.bLoaded = true; ++ Report.Roads = StreetMap->GetRoads().Num(); ++ Report.Nodes = StreetMap->GetNodes().Num(); ++ Report.Buildings = StreetMap->GetBuildings().Num(); ++ Report.Waters = StreetMap->GetWaters().Num(); ++ Report.Parks = StreetMap->GetParks().Num(); ++ ++ // Amenity est le mecanisme par lequel le jeu identifie bars, salles de sport et ++ // commerces : c'est la donnee dont la perte serait la plus grave. ++ TSet Amenities; ++ for (const FStreetMapBuilding& Building : StreetMap->GetBuildings()) ++ { ++ if (!Building.BuildingName.IsEmpty()) ++ { ++ ++Report.NamedBuildings; ++ } ++ if (!Building.Amenity.IsEmpty()) ++ { ++ ++Report.WithAmenity; ++ Amenities.Add(Building.Amenity); ++ } ++ } ++ Report.DistinctAmenities = Amenities.Num(); ++ ++ // Les comptes seuls ne prouvent pas que la donnee est la bonne : on releve les ++ // valeurs pour pouvoir les croiser avec les types de lieux du jeu (*.lpworld). ++ if (bDumpAmenities && Amenities.Num() > 0) ++ { ++ TArray Sorted = Amenities.Array(); ++ Sorted.Sort(); ++ UE_LOG(LogLPCheckStreetMap, Warning, TEXT(" --- amenities de %s (%d) : %s"), ++ *Report.Name, Sorted.Num(), *FString::Join(Sorted, TEXT(", "))); ++ } ++ ++ if (Report.Roads == 0 && Report.Buildings == 0) ++ { ++ ++EmptyCities; ++ } ++ ++ if (bVerbose) ++ { ++ UE_LOG(LogLPCheckStreetMap, Warning, ++ TEXT(" %-24s routes=%-7d noeuds=%-7d batiments=%-7d eaux=%-4d parcs=%-4d nommes=%-6d amenity=%-6d (%d types)"), ++ *Report.Name, Report.Roads, Report.Nodes, Report.Buildings, ++ Report.Waters, Report.Parks, Report.NamedBuildings, ++ Report.WithAmenity, Report.DistinctAmenities); ++ } ++ ++ Reports.Add(Report); ++ ++ // Sans cela, charger les 280 villes fait exploser la memoire (CentralLondon pese ++ // 33 Mo de donnees a lui seul). ++ CollectGarbage(RF_NoFlags); ++ } ++ ++ // --- Synthese ++ int64 TotalRoads = 0, TotalBuildings = 0, TotalWaters = 0, TotalParks = 0, TotalAmenity = 0; ++ for (const FCityReport& R : Reports) ++ { ++ TotalRoads += R.Roads; ++ TotalBuildings += R.Buildings; ++ TotalWaters += R.Waters; ++ TotalParks += R.Parks; ++ TotalAmenity += R.WithAmenity; ++ } ++ ++ UE_LOG(LogLPCheckStreetMap, Warning, TEXT("=== Synthese ===")); ++ UE_LOG(LogLPCheckStreetMap, Warning, TEXT(" villes chargees : %d / %d"), Assets.Num() - LoadFailures, Assets.Num()); ++ UE_LOG(LogLPCheckStreetMap, Warning, TEXT(" echecs de chargement : %d"), LoadFailures); ++ UE_LOG(LogLPCheckStreetMap, Warning, TEXT(" villes sans donnees : %d"), EmptyCities); ++ UE_LOG(LogLPCheckStreetMap, Warning, TEXT(" routes : %lld"), TotalRoads); ++ UE_LOG(LogLPCheckStreetMap, Warning, TEXT(" batiments : %lld"), TotalBuildings); ++ UE_LOG(LogLPCheckStreetMap, Warning, TEXT(" batiments avec amenity : %lld"), TotalAmenity); ++ UE_LOG(LogLPCheckStreetMap, Warning, TEXT(" plans d'eau : %lld"), TotalWaters); ++ UE_LOG(LogLPCheckStreetMap, Warning, TEXT(" parcs : %lld"), TotalParks); ++ ++ if (!CsvPath.IsEmpty()) ++ { ++ FString Csv = TEXT("Ville;Charge;Routes;Noeuds;Batiments;Eaux;Parcs;BatimentsNommes;AvecAmenity;TypesAmenity\n"); ++ for (const FCityReport& R : Reports) ++ { ++ Csv += FString::Printf(TEXT("%s;%d;%d;%d;%d;%d;%d;%d;%d;%d\n"), ++ *R.Name, R.bLoaded ? 1 : 0, R.Roads, R.Nodes, R.Buildings, ++ R.Waters, R.Parks, R.NamedBuildings, R.WithAmenity, R.DistinctAmenities); ++ } ++ ++ if (FFileHelper::SaveStringToFile(Csv, *CsvPath)) ++ { ++ UE_LOG(LogLPCheckStreetMap, Warning, TEXT(" CSV ecrit : %s"), *CsvPath); ++ } ++ else ++ { ++ UE_LOG(LogLPCheckStreetMap, Error, TEXT(" ECHEC d'ecriture du CSV : %s"), *CsvPath); ++ } ++ } ++ ++ // Code de retour non nul si une ville n'a pas pu etre chargee : exploitable en CI. ++ return LoadFailures > 0 ? 1 : 0; ++} +diff --git a/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPCheckStreetMapCommandlet.h b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPCheckStreetMapCommandlet.h +new file mode 100644 +index 0000000..2d54589 +--- /dev/null ++++ b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPCheckStreetMapCommandlet.h +@@ -0,0 +1,27 @@ ++// Portage UE 5.5 - verification du chargement des assets ville apres migration. ++// ++// Charge chaque UStreetMap du projet et compte ce qu'il contient reellement : routes, ++// noeuds, batiments, plans d'eau, parcs, et amenities non vides. Le but est de prouver ++// que la fusion du plugin StreetMap n'a rien perdu, sans avoir a ouvrir l'editeur et ++// inspecter 280 villes a la main. ++// ++// Sortie CSV optionnelle, pour comparer une execution 4.27 et une execution 5.5. ++// ++// UnrealEditor-Cmd.exe -run=LPCheckStreetMap [-CSV=chemin.csv] [-Verbose] ++ ++#pragma once ++ ++#include "CoreMinimal.h" ++#include "Commandlets/Commandlet.h" ++#include "LPCheckStreetMapCommandlet.generated.h" ++ ++UCLASS() ++class ULPCheckStreetMapCommandlet : public UCommandlet ++{ ++ GENERATED_BODY() ++ ++public: ++ ULPCheckStreetMapCommandlet(); ++ ++ virtual int32 Main(const FString& Params) override; ++}; +diff --git a/D:/Game/LifePlay-master 4.27/Source/LifePlayEditorTools/LPFixAssetRegistryNodesCommandlet.cpp b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixAssetRegistryNodesCommandlet.cpp +index da20732..fb40e85 100644 +--- a/D:/Game/LifePlay-master 4.27/Source/LifePlayEditorTools/LPFixAssetRegistryNodesCommandlet.cpp ++++ b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixAssetRegistryNodesCommandlet.cpp +@@ -14,6 +14,7 @@ + #include "Misc/FeedbackContext.h" + #include "Misc/PackageName.h" + #include "UObject/Package.h" ++#include "UObject/SavePackage.h" + #include "UObject/UObjectGlobals.h" + + DEFINE_LOG_CATEGORY_STATIC(LogLPFixNodes, Log, All); +@@ -80,7 +81,8 @@ int32 ULPFixAssetRegistryNodesCommandlet::Main(const FString& Params) + AssetRegistryModule.Get().SearchAllAssets(true); + + TArray BlueprintAssets; +- AssetRegistryModule.Get().GetAssetsByClass(UBlueprint::StaticClass()->GetFName(), BlueprintAssets, true); ++ // 5.1+ : GetAssetsByClass prend un FTopLevelAssetPath, plus un FName de classe. ++ AssetRegistryModule.Get().GetAssetsByClass(UBlueprint::StaticClass()->GetClassPathName(), BlueprintAssets, true); + + UE_LOG(LogLPFixNodes, Warning, TEXT("%d Blueprints a inspecter."), BlueprintAssets.Num()); + +@@ -190,8 +192,16 @@ int32 ULPFixAssetRegistryNodesCommandlet::Main(const FString& Params) + + UE_LOG(LogLPFixNodes, Warning, TEXT(" -> sauvegarde vers %s"), *Filename); + ++ // 5.x : les arguments passent par FSavePackageArgs (Conform n'est plus implemente). ++ FSavePackageArgs SaveArgs; ++ SaveArgs.TopLevelFlags = RF_Public | RF_Standalone; ++ SaveArgs.SaveFlags = SAVE_None; ++ SaveArgs.bForceByteSwapping = false; ++ SaveArgs.bWarnOfLongFilename = true; + // GWarn et non GError : en commandlet, GError rend toute erreur de sauvegarde fatale. +- if (UPackage::SavePackage(Package, nullptr, RF_Public | RF_Standalone, *Filename, GWarn, nullptr, false, true, SAVE_None)) ++ SaveArgs.Error = GWarn; ++ ++ if (UPackage::SavePackage(Package, nullptr, *Filename, SaveArgs)) + { + UE_LOG(LogLPFixNodes, Warning, TEXT(" -> %s sauvegarde (%d noeud(s))."), *Package->GetName(), NodesFixedHere); + } +diff --git a/D:/Game/LifePlay-master 4.27/Source/LifePlayEditorTools/LPFixAssetRegistryNodesCommandlet.h b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixAssetRegistryNodesCommandlet.h +index 781d3a6..427776f 100644 +--- a/D:/Game/LifePlay-master 4.27/Source/LifePlayEditorTools/LPFixAssetRegistryNodesCommandlet.h ++++ b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixAssetRegistryNodesCommandlet.h +@@ -1,11 +1,11 @@ +-// Portage UE 4.27 (2026.9 beta) ++// Portage UE 5.5 (2026.9 beta) - correctif introduit lors du portage 4.27, toujours actif. + // + // Commandlet de correction ponctuelle : remplace les noeuds Blueprint appelant + // IAssetRegistry::GetAssetByObjectPath (devenu impur cote Epic) par la version pure + // ULPAssetRegistryHelpers::GetAssetByObjectPath, puis resauvegarde les Blueprints. + // + // Usage : +-// UE4Editor-Cmd.exe \LifePlay.uproject -run=LPFixAssetRegistryNodes [-DryRun] ++// UnrealEditor-Cmd.exe \LifePlay.uproject -run=LPFixAssetRegistryNodes [-DryRun] + + #pragma once + +diff --git a/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixAssetRegistryPinsCommandlet.cpp b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixAssetRegistryPinsCommandlet.cpp +new file mode 100644 +index 0000000..7aa6146 +--- /dev/null ++++ b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixAssetRegistryPinsCommandlet.cpp +@@ -0,0 +1,319 @@ ++// Portage UE 5.5 - voir LPFixAssetRegistryPinsCommandlet.h ++ ++#include "LPFixAssetRegistryPinsCommandlet.h" ++ ++#include "AssetRegistry/AssetData.h" ++#include "AssetRegistry/AssetRegistryModule.h" ++#include "EdGraph/EdGraph.h" ++#include "EdGraph/EdGraphPin.h" ++#include "EdGraphSchema_K2.h" ++#include "Engine/Blueprint.h" ++#include "K2Node_BreakStruct.h" ++#include "K2Node_CallFunction.h" ++#include "Kismet2/BlueprintEditorUtils.h" ++#include "Kismet2/KismetEditorUtilities.h" ++#include "LPAssetRegistryHelpers.h" ++#include "Misc/PackageName.h" ++#include "UObject/Package.h" ++#include "UObject/SavePackage.h" ++#include "UObject/UObjectGlobals.h" ++ ++DEFINE_LOG_CATEGORY_STATIC(LogLPFixARPins, Log, All); ++ ++namespace ++{ ++ const FName DeprecatedClassNamePin(TEXT("ClassName")); ++ const FName DeprecatedObjectPathPin(TEXT("ObjectPath")); ++ const FName AssetDataPin(TEXT("AssetData")); ++ const FName AssetDataStructName(TEXT("AssetData")); ++ ++ const FName GetAssetsByClassFunction(TEXT("GetAssetsByClass")); ++ const FName ReplacementEnumFunction(TEXT("GetAssetsByClassName")); ++ const FName ReplacementPathFunction(TEXT("GetAssetObjectPath")); ++ ++ /** Broche orpheline portant ce nom, s'il y en a une. */ ++ UEdGraphPin* FindOrphan(UEdGraphNode* Node, FName PinName) ++ { ++ for (UEdGraphPin* Pin : Node->Pins) ++ { ++ if (Pin && Pin->bOrphanedPin && Pin->PinName == PinName) ++ { ++ return Pin; ++ } ++ } ++ return nullptr; ++ } ++} ++ ++ULPFixAssetRegistryPinsCommandlet::ULPFixAssetRegistryPinsCommandlet() ++{ ++ IsClient = false; ++ IsServer = false; ++ IsEditor = true; ++ LogToConsole = true; ++} ++ ++int32 ULPFixAssetRegistryPinsCommandlet::Main(const FString& Params) ++{ ++ const bool bDryRun = Params.Contains(TEXT("DryRun"), ESearchCase::IgnoreCase); ++ ++ UFunction* EnumFunction = ULPAssetRegistryHelpers::StaticClass()->FindFunctionByName(ReplacementEnumFunction); ++ UFunction* PathFunction = ULPAssetRegistryHelpers::StaticClass()->FindFunctionByName(ReplacementPathFunction); ++ if (!EnumFunction || !PathFunction) ++ { ++ UE_LOG(LogLPFixARPins, Error, TEXT("Fonctions de remplacement introuvables (%s=%s, %s=%s)."), ++ *ReplacementEnumFunction.ToString(), EnumFunction ? TEXT("ok") : TEXT("NULL"), ++ *ReplacementPathFunction.ToString(), PathFunction ? TEXT("ok") : TEXT("NULL")); ++ return 1; ++ } ++ ++ UE_LOG(LogLPFixARPins, Warning, TEXT("=== Broches AssetRegistry perdues a la migration 5.1%s ==="), ++ bDryRun ? TEXT(" [DRY RUN]") : TEXT("")); ++ ++ FAssetRegistryModule& AssetRegistryModule = ++ FModuleManager::LoadModuleChecked(TEXT("AssetRegistry")); ++ AssetRegistryModule.Get().SearchAllAssets(true); ++ ++ TArray BlueprintAssets; ++ AssetRegistryModule.Get().GetAssetsByClass(UBlueprint::StaticClass()->GetClassPathName(), BlueprintAssets, true); ++ ++ int32 EnumFixed = 0; ++ int32 PathFixed = 0; ++ int32 Unhandled = 0; ++ int32 BlueprintsModified = 0; ++ int32 SaveFailures = 0; ++ ++ const UEdGraphSchema_K2* Schema = GetDefault(); ++ ++ for (const FAssetData& AssetData : BlueprintAssets) ++ { ++ if (!AssetData.PackageName.ToString().StartsWith(TEXT("/Game/"))) ++ { ++ continue; ++ } ++ ++ UBlueprint* Blueprint = Cast(AssetData.GetAsset()); ++ if (!Blueprint) ++ { ++ continue; ++ } ++ ++ TArray Graphs; ++ Blueprint->GetAllGraphs(Graphs); ++ ++ int32 FixedHere = 0; ++ ++ for (UEdGraph* Graph : Graphs) ++ { ++ if (!Graph) ++ { ++ continue; ++ } ++ ++ TArray Snapshot = Graph->Nodes; ++ for (UEdGraphNode* GraphNode : Snapshot) ++ { ++ // ------------------------------------------------------------------- ++ // 1. GetAssetsByClass : la valeur de classe est restee sur l'orpheline. ++ // On bascule sur l'enrobage FName, qui la reprend telle quelle. ++ // ------------------------------------------------------------------- ++ if (UK2Node_CallFunction* CallNode = Cast(GraphNode)) ++ { ++ if (CallNode->FunctionReference.GetMemberName() != GetAssetsByClassFunction) ++ { ++ continue; ++ } ++ ++ UEdGraphPin* Orphan = FindOrphan(CallNode, DeprecatedClassNamePin); ++ if (!Orphan) ++ { ++ continue; // deja corrige, ou noeud sain ++ } ++ ++ const FString ClassValue = Orphan->DefaultValue; ++ UE_LOG(LogLPFixARPins, Warning, TEXT(" [enum] %s :: %s -> %s | classe='%s'"), ++ *Blueprint->GetName(), *Graph->GetName(), *GraphNode->GetName(), *ClassValue); ++ ++ if (ClassValue.IsEmpty()) ++ { ++ ++Unhandled; ++ UE_LOG(LogLPFixARPins, Error, TEXT(" orpheline vide : rien a reporter, reprise manuelle.")); ++ continue; ++ } ++ if (bDryRun) ++ { ++ continue; ++ } ++ ++ CallNode->Modify(); ++ // La broche orpheline doit disparaitre AVANT la reconstruction, sinon ++ // ReconstructNode la conserve (garde-fou d'UE contre la perte de donnees). ++ Orphan->BreakAllPinLinks(); ++ Orphan->DefaultValue.Empty(); ++ ++ CallNode->SetFromFunction(EnumFunction); ++ CallNode->ReconstructNode(); ++ ++ // La fonction de remplacement a une broche ClassName de meme nom : on y ++ // remet la valeur recuperee. ++ if (UEdGraphPin* NewPin = CallNode->FindPin(DeprecatedClassNamePin, EGPD_Input)) ++ { ++ NewPin->DefaultValue = ClassValue; ++ UE_LOG(LogLPFixARPins, Warning, TEXT(" -> GetAssetsByClassName(ClassName='%s')"), *ClassValue); ++ ++EnumFixed; ++ ++FixedHere; ++ } ++ else ++ { ++ ++Unhandled; ++ UE_LOG(LogLPFixARPins, Error, TEXT(" broche ClassName absente apres reconstruction.")); ++ } ++ continue; ++ } ++ ++ // ------------------------------------------------------------------- ++ // 2. Break AssetData : la sortie ObjectPath n'existe plus. On insere un ++ // appel a GetAssetObjectPath alimente par la meme structure, et on lui ++ // transfere les liaisons restees sur l'orpheline. ++ // ------------------------------------------------------------------- ++ UK2Node_BreakStruct* BreakNode = Cast(GraphNode); ++ if (!BreakNode || !BreakNode->StructType || ++ BreakNode->StructType->GetFName() != AssetDataStructName) ++ { ++ continue; ++ } ++ ++ UEdGraphPin* Orphan = FindOrphan(BreakNode, DeprecatedObjectPathPin); ++ if (!Orphan) ++ { ++ continue; ++ } ++ ++ UEdGraphPin* StructInput = BreakNode->FindPin(AssetDataPin, EGPD_Input); ++ UE_LOG(LogLPFixARPins, Warning, TEXT(" [path] %s :: %s -> %s | %d consommateur(s)"), ++ *Blueprint->GetName(), *Graph->GetName(), *GraphNode->GetName(), Orphan->LinkedTo.Num()); ++ ++ if (Orphan->LinkedTo.Num() == 0) ++ { ++ // Personne ne la lit : la vider suffit a la faire disparaitre. ++ if (!bDryRun) ++ { ++ BreakNode->Modify(); ++ Orphan->DefaultValue.Empty(); ++ BreakNode->ReconstructNode(); ++ ++PathFixed; ++ ++FixedHere; ++ } ++ continue; ++ } ++ ++ if (!StructInput || StructInput->LinkedTo.Num() == 0) ++ { ++ ++Unhandled; ++ UE_LOG(LogLPFixARPins, Error, TEXT(" entree AssetData non connectee : reprise manuelle.")); ++ continue; ++ } ++ if (bDryRun) ++ { ++ continue; ++ } ++ ++ // Noeud de remplacement, place juste sous le Break. ++ UK2Node_CallFunction* PathNode = NewObject(Graph); ++ PathNode->SetFromFunction(PathFunction); ++ PathNode->NodePosX = BreakNode->NodePosX; ++ PathNode->NodePosY = BreakNode->NodePosY + 120; ++ PathNode->CreateNewGuid(); ++ PathNode->PostPlacedNewNode(); ++ PathNode->AllocateDefaultPins(); ++ Graph->Modify(); ++ Graph->AddNode(PathNode, false, false); ++ ++ UEdGraphPin* PathStructIn = PathNode->FindPin(AssetDataPin, EGPD_Input); ++ UEdGraphPin* PathReturn = PathNode->GetReturnValuePin(); ++ ++ bool bOk = PathStructIn && PathReturn; ++ ++ // Meme source de structure que le Break. ++ if (bOk) ++ { ++ UEdGraphPin* Source = StructInput->LinkedTo[0]; ++ bOk = Schema->TryCreateConnection(Source, PathStructIn); ++ if (!bOk) ++ { ++ UE_LOG(LogLPFixARPins, Error, TEXT(" source AssetData incompatible avec la nouvelle entree.")); ++ } ++ } ++ ++ // Transfert des consommateurs de l'orpheline vers la nouvelle sortie. ++ if (bOk) ++ { ++ const FPinConnectionResponse R = Schema->MovePinLinks(*Orphan, *PathReturn); ++ bOk = R.Response != CONNECT_RESPONSE_DISALLOW; ++ if (!bOk) ++ { ++ UE_LOG(LogLPFixARPins, Error, TEXT(" transfert impossible (%s)."), *R.Message.ToString()); ++ } ++ } ++ ++ if (!bOk) ++ { ++ ++Unhandled; ++ PathNode->DestroyNode(); ++ continue; ++ } ++ ++ BreakNode->Modify(); ++ Orphan->BreakAllPinLinks(); ++ Orphan->DefaultValue.Empty(); ++ BreakNode->ReconstructNode(); ++ ++ UE_LOG(LogLPFixARPins, Warning, TEXT(" -> GetAssetObjectPath inserE")); ++ ++PathFixed; ++ ++FixedHere; ++ } ++ } ++ ++ if (FixedHere > 0 && !bDryRun) ++ { ++ ++BlueprintsModified; ++ FBlueprintEditorUtils::MarkBlueprintAsStructurallyModified(Blueprint); ++ FKismetEditorUtilities::CompileBlueprint(Blueprint); ++ ++ UPackage* Package = Blueprint->GetOutermost(); ++ FString Filename; ++ if (!FPackageName::TryConvertLongPackageNameToFilename( ++ Package->GetName(), Filename, FPackageName::GetAssetPackageExtension())) ++ { ++ ++SaveFailures; ++ UE_LOG(LogLPFixARPins, Error, TEXT(" chemin introuvable pour %s"), *Package->GetName()); ++ continue; ++ } ++ ++ ResetLoaders(Package); ++ ++ FSavePackageArgs SaveArgs; ++ SaveArgs.TopLevelFlags = RF_Public | RF_Standalone; ++ SaveArgs.SaveFlags = SAVE_None; ++ SaveArgs.bWarnOfLongFilename = true; ++ // GWarn et non GError : en commandlet, GError rend toute erreur de save fatale. ++ SaveArgs.Error = GWarn; ++ ++ if (UPackage::SavePackage(Package, nullptr, *Filename, SaveArgs)) ++ { ++ UE_LOG(LogLPFixARPins, Warning, TEXT(" -> %s sauvegarde (%d noeud(s))."), *Package->GetName(), FixedHere); ++ } ++ else ++ { ++ ++SaveFailures; ++ UE_LOG(LogLPFixARPins, Error, TEXT(" -> ECHEC de sauvegarde de %s"), *Package->GetName()); ++ } ++ } ++ } ++ ++ UE_LOG(LogLPFixARPins, Warning, ++ TEXT("=== Termine : %d enumeration(s), %d chemin(s), %d Blueprint(s) modifie(s), %d cas non traite(s), %d echec(s). ==="), ++ EnumFixed, PathFixed, BlueprintsModified, Unhandled, SaveFailures); ++ ++ return (SaveFailures > 0 || Unhandled > 0) ? 1 : 0; ++} +diff --git a/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixAssetRegistryPinsCommandlet.h b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixAssetRegistryPinsCommandlet.h +new file mode 100644 +index 0000000..95ef029 +--- /dev/null ++++ b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixAssetRegistryPinsCommandlet.h +@@ -0,0 +1,50 @@ ++// Portage UE 5.5 (2026.9 beta) - correctif du 2026-09-28. ++// ++// SYMPTOME : pendant un evenement, l'homme s'appelle toujours Tyrone et la femme girl ou ++// Meihui, tous nus et au meme visage. generatePerson() sans argument doit produire un ++// acteur completement aleatoire ; il retombait sur un personnage par defaut. ++// ++// CAUSE : UE 5.1 a remplace ++// IAssetRegistry::GetAssetsByClass(FName ClassName, ...) ++// par GetAssetsByClass(FTopLevelAssetPath ClassPathName, ...) ++// FAssetData::ObjectPath (FName) ++// par FAssetData::GetSoftObjectPath() ++// La montee de version a supprime les anciennes broches des noeuds existants SANS reporter ++// leur contenu sur les nouvelles. Releve par LPCheckMeshAssignment : ++// ++// [GetAssetsByClass] ClassPathName [TopLevelAssetPath] VIDE ++// ClassName [orpheline] defaut='SkeletalMesh' ++// ++// Les trois appels de GI interrogeaient donc l'AssetRegistry avec un chemin de classe vide ++// et ne renvoyaient rien. Plus aucune enumeration de corps, de vetements ni de coiffures : ++// le tirage aleatoire n'avait plus de population ou puiser. Le chargement par chemin ++// explicite (GetAssetByObjectPath) fonctionnait, d'ou les seuls personnages visibles : ceux ++// que les scenes nomment explicitement, comme Tyrone via generatePerson(bggw_tyrone). ++// ++// Aucune erreur de compilation ne le signalait : 103 Blueprints compilaient a zero ++// avertissement. Seul le drapeau bOrphanedPin pose par le moteur le revelait (5 en 5.5, ++// 0 en 4.27). ++// ++// CORRECTIF : reaiguiller vers ULPAssetRegistryHelpers, qui re-expose les deux API avec ++// leur ancienne signature. Meme patron que LPFixAssetRegistryNodes et ++// LPFixEditableTextBoxFont. ++// ++// Usage : ++// UnrealEditor-Cmd.exe -run=LPFixAssetRegistryPins [-DryRun] ++ ++#pragma once ++ ++#include "CoreMinimal.h" ++#include "Commandlets/Commandlet.h" ++#include "LPFixAssetRegistryPinsCommandlet.generated.h" ++ ++UCLASS() ++class ULPFixAssetRegistryPinsCommandlet : public UCommandlet ++{ ++ GENERATED_BODY() ++ ++public: ++ ULPFixAssetRegistryPinsCommandlet(); ++ ++ virtual int32 Main(const FString& Params) override; ++}; +diff --git a/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixDeprecatedNodesCommandlet.cpp b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixDeprecatedNodesCommandlet.cpp +new file mode 100644 +index 0000000..e54c698 +--- /dev/null ++++ b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixDeprecatedNodesCommandlet.cpp +@@ -0,0 +1,323 @@ ++// Portage UE 5.5 - voir LPFixDeprecatedNodesCommandlet.h ++ ++#include "LPFixDeprecatedNodesCommandlet.h" ++ ++#include "AssetRegistry/AssetRegistryModule.h" ++#include "Components/SkeletalMeshComponent.h" ++#include "Components/SkinnedMeshComponent.h" ++#include "EdGraph/EdGraph.h" ++#include "EdGraph/EdGraphPin.h" ++#include "EdGraphSchema_K2.h" ++#include "Engine/Blueprint.h" ++#include "K2Node_CallFunction.h" ++#include "K2Node_VariableGet.h" ++#include "Kismet2/BlueprintEditorUtils.h" ++#include "Kismet2/KismetEditorUtilities.h" ++#include "LPNavigationHelpers.h" ++#include "Misc/PackageName.h" ++#include "NavigationSystem.h" ++#include "UObject/Package.h" ++#include "UObject/SavePackage.h" ++#include "UObject/UObjectGlobals.h" ++ ++DEFINE_LOG_CATEGORY_STATIC(LogLPFixDeprecated, Log, All); ++ ++namespace ++{ ++ // --- R-03 --- ++ const FName SkeletalMeshPropertyName(TEXT("SkeletalMesh")); ++ const FName DeprecatedGetterName(TEXT("GetSkeletalMesh_DEPRECATED")); ++ const FName ReplacementGetterName(TEXT("GetSkeletalMeshAsset")); ++ ++ // --- R-04 --- ++ const FName DeprecatedNavFunctionName(TEXT("K2_GetRandomPointInNavigableRadius")); ++ const FName ReplacementNavFunctionName(TEXT("GetRandomLocationInNavigableRadius")); ++ ++ /** Decrit une broche et ses liaisons, pour le rapport. Copie du motif de LPFixEditableTextBoxFont. */ ++ FString DescribeLinks(const UEdGraphPin* Pin) ++ { ++ if (!Pin) ++ { ++ return TEXT("(broche absente)"); ++ } ++ if (Pin->LinkedTo.Num() == 0) ++ { ++ return FString::Printf(TEXT("non connectee (defaut: '%s')"), *Pin->DefaultValue); ++ } ++ ++ TArray Targets; ++ for (const UEdGraphPin* Linked : Pin->LinkedTo) ++ { ++ Targets.Add(FString::Printf(TEXT("%s.%s"), ++ Linked->GetOwningNode() ? *Linked->GetOwningNode()->GetName() : TEXT("?"), ++ *Linked->PinName.ToString())); ++ } ++ return FString::Printf(TEXT("%d liaison(s) -> %s"), Pin->LinkedTo.Num(), *FString::Join(Targets, TEXT(", "))); ++ } ++ ++ /** Vrai si la classe proprietaire du membre est USkinnedMeshComponent ou une de ses filles. */ ++ bool IsSkinnedMeshOwner(const UClass* OwnerClass) ++ { ++ return OwnerClass && OwnerClass->IsChildOf(USkinnedMeshComponent::StaticClass()); ++ } ++} ++ ++ULPFixDeprecatedNodesCommandlet::ULPFixDeprecatedNodesCommandlet() ++{ ++ IsClient = false; ++ IsServer = false; ++ IsEditor = true; ++ LogToConsole = true; ++} ++ ++int32 ULPFixDeprecatedNodesCommandlet::Main(const FString& Params) ++{ ++ const bool bDryRun = Params.Contains(TEXT("DryRun"), ESearchCase::IgnoreCase); ++ ++ UFunction* ReplacementGetter = ++ USkeletalMeshComponent::StaticClass()->FindFunctionByName(ReplacementGetterName); ++ UFunction* ReplacementNavFunction = ++ ULPNavigationHelpers::StaticClass()->FindFunctionByName(ReplacementNavFunctionName); ++ ++ if (!ReplacementGetter || !ReplacementNavFunction) ++ { ++ UE_LOG(LogLPFixDeprecated, Error, ++ TEXT("Fonctions de remplacement introuvables (GetSkeletalMeshAsset=%s, GetRandomLocationInNavigableRadius=%s)."), ++ ReplacementGetter ? TEXT("ok") : TEXT("NULL"), ++ ReplacementNavFunction ? TEXT("ok") : TEXT("NULL")); ++ return 1; ++ } ++ ++ UE_LOG(LogLPFixDeprecated, Warning, TEXT("=== Noeuds deprecies : SkeletalMesh (R-03) + GetRandomPointInNavigableRadius (R-04)%s ==="), ++ bDryRun ? TEXT(" [DRY RUN]") : TEXT("")); ++ ++ FAssetRegistryModule& AssetRegistryModule = ++ FModuleManager::LoadModuleChecked(TEXT("AssetRegistry")); ++ AssetRegistryModule.Get().SearchAllAssets(true); ++ ++ TArray BlueprintAssets; ++ // bSearchSubClasses = true : couvre aussi les UWidgetBlueprint (CharGen, Inventory, ...). ++ AssetRegistryModule.Get().GetAssetsByClass(UBlueprint::StaticClass()->GetClassPathName(), BlueprintAssets, true); ++ ++ int32 MeshNodesFound = 0; ++ int32 NavNodesFound = 0; ++ int32 MeshNodesFixed = 0; ++ int32 NavNodesFixed = 0; ++ int32 BlueprintsModified = 0; ++ int32 SaveFailures = 0; ++ int32 Unhandled = 0; ++ ++ const UEdGraphSchema_K2* Schema = GetDefault(); ++ ++ for (const FAssetData& AssetData : BlueprintAssets) ++ { ++ if (!AssetData.PackageName.ToString().StartsWith(TEXT("/Game/"))) ++ { ++ continue; ++ } ++ ++ UBlueprint* Blueprint = Cast(AssetData.GetAsset()); ++ if (!Blueprint) ++ { ++ continue; ++ } ++ ++ TArray Graphs; ++ Blueprint->GetAllGraphs(Graphs); ++ ++ int32 FixedHere = 0; ++ ++ for (UEdGraph* Graph : Graphs) ++ { ++ if (!Graph) ++ { ++ continue; ++ } ++ ++ // Snapshot : on cree et on detruit des noeuds pendant l'iteration. ++ TArray Snapshot = Graph->Nodes; ++ for (UEdGraphNode* GraphNode : Snapshot) ++ { ++ // --------------------------------------------------------------- ++ // R-04 : reference de fonction a reaiguiller, rien d'autre a faire. ++ // Signatures et noms de broches identiques -> ReconstructNode conserve ++ // toutes les liaisons. ++ // --------------------------------------------------------------- ++ if (UK2Node_CallFunction* CallNode = Cast(GraphNode)) ++ { ++ const FName MemberName = CallNode->FunctionReference.GetMemberName(); ++ const UClass* MemberOwner = CallNode->FunctionReference.GetMemberParentClass(); ++ ++ if (MemberName == DeprecatedNavFunctionName) ++ { ++ ++NavNodesFound; ++ UE_LOG(LogLPFixDeprecated, Warning, TEXT(" [R-04] %s :: %s -> %s"), ++ *Blueprint->GetName(), *Graph->GetName(), *GraphNode->GetName()); ++ UE_LOG(LogLPFixDeprecated, Warning, TEXT(" RandomLocation : %s"), ++ *DescribeLinks(GraphNode->FindPin(TEXT("RandomLocation")))); ++ ++ if (!bDryRun) ++ { ++ GraphNode->Modify(); ++ CallNode->SetFromFunction(ReplacementNavFunction); ++ CallNode->ReconstructNode(); ++ ++NavNodesFixed; ++ ++FixedHere; ++ } ++ continue; ++ } ++ ++ // R-03, variante « appel explicite du getter deprecie ». ++ if (MemberName == DeprecatedGetterName && IsSkinnedMeshOwner(MemberOwner)) ++ { ++ ++MeshNodesFound; ++ UE_LOG(LogLPFixDeprecated, Warning, TEXT(" [R-03/appel] %s :: %s -> %s"), ++ *Blueprint->GetName(), *Graph->GetName(), *GraphNode->GetName()); ++ ++ if (!bDryRun) ++ { ++ GraphNode->Modify(); ++ CallNode->SetFromFunction(ReplacementGetter); ++ CallNode->ReconstructNode(); ++ ++MeshNodesFixed; ++ ++FixedHere; ++ } ++ continue; ++ } ++ } ++ ++ // --------------------------------------------------------------- ++ // R-03 : acces direct a la propriete depreciee. Il faut remplacer le ++ // noeud, pas seulement sa reference : un K2Node_VariableGet ne peut pas ++ // devenir un K2Node_CallFunction. ++ // --------------------------------------------------------------- ++ UK2Node_VariableGet* VarGet = Cast(GraphNode); ++ if (!VarGet || VarGet->VariableReference.GetMemberName() != SkeletalMeshPropertyName) ++ { ++ continue; ++ } ++ if (!IsSkinnedMeshOwner(VarGet->VariableReference.GetMemberParentClass())) ++ { ++ continue; ++ } ++ ++ UEdGraphPin* OldSelfPin = VarGet->FindPin(UEdGraphSchema_K2::PN_Self, EGPD_Input); ++ UEdGraphPin* OldValuePin = VarGet->GetValuePin(); ++ ++ ++MeshNodesFound; ++ UE_LOG(LogLPFixDeprecated, Warning, TEXT(" [R-03/propriete] %s :: %s -> %s"), ++ *Blueprint->GetName(), *Graph->GetName(), *GraphNode->GetName()); ++ UE_LOG(LogLPFixDeprecated, Warning, TEXT(" Target : %s"), *DescribeLinks(OldSelfPin)); ++ UE_LOG(LogLPFixDeprecated, Warning, TEXT(" Valeur : %s"), *DescribeLinks(OldValuePin)); ++ ++ if (bDryRun) ++ { ++ continue; ++ } ++ ++ if (!OldValuePin) ++ { ++ ++Unhandled; ++ UE_LOG(LogLPFixDeprecated, Error, TEXT(" broche de valeur introuvable, noeud laisse en l'etat.")); ++ continue; ++ } ++ ++ // Construction du noeud de remplacement au meme emplacement. ++ UK2Node_CallFunction* NewNode = NewObject(Graph); ++ NewNode->SetFromFunction(ReplacementGetter); ++ NewNode->NodePosX = VarGet->NodePosX; ++ NewNode->NodePosY = VarGet->NodePosY; ++ NewNode->CreateNewGuid(); ++ NewNode->PostPlacedNewNode(); ++ NewNode->AllocateDefaultPins(); ++ Graph->Modify(); ++ Graph->AddNode(NewNode, false, false); ++ ++ UEdGraphPin* NewSelfPin = NewNode->FindPin(UEdGraphSchema_K2::PN_Self, EGPD_Input); ++ UEdGraphPin* NewValuePin = NewNode->GetReturnValuePin(); ++ ++ bool bMoved = true; ++ ++ // GetSkeletalMeshAsset() n'existe que sur USkeletalMeshComponent alors que la ++ // propriete depreciee vit sur USkinnedMeshComponent. Si la cible du noeud est ++ // typee sur la classe de base, le deplacement echoue : on le signale au lieu de ++ // casser le graphe. ++ if (OldSelfPin && NewSelfPin) ++ { ++ const FPinConnectionResponse Response = Schema->MovePinLinks(*OldSelfPin, *NewSelfPin); ++ if (Response.Response == CONNECT_RESPONSE_DISALLOW) ++ { ++ bMoved = false; ++ UE_LOG(LogLPFixDeprecated, Error, TEXT(" Target incompatible (%s) : reprise manuelle necessaire."), ++ *Response.Message.ToString()); ++ } ++ } ++ ++ if (bMoved && NewValuePin) ++ { ++ const FPinConnectionResponse Response = Schema->MovePinLinks(*OldValuePin, *NewValuePin); ++ if (Response.Response == CONNECT_RESPONSE_DISALLOW) ++ { ++ bMoved = false; ++ UE_LOG(LogLPFixDeprecated, Error, TEXT(" Valeur incompatible (%s) : reprise manuelle necessaire."), ++ *Response.Message.ToString()); ++ } ++ } ++ ++ if (!bMoved) ++ { ++ // On remet tout en place : le noeud d'origine garde ses liaisons. ++ ++Unhandled; ++ NewNode->DestroyNode(); ++ continue; ++ } ++ ++ VarGet->DestroyNode(); ++ ++MeshNodesFixed; ++ ++FixedHere; ++ } ++ } ++ ++ if (FixedHere > 0 && !bDryRun) ++ { ++ ++BlueprintsModified; ++ FBlueprintEditorUtils::MarkBlueprintAsStructurallyModified(Blueprint); ++ FKismetEditorUtilities::CompileBlueprint(Blueprint); ++ ++ UPackage* Package = Blueprint->GetOutermost(); ++ FString Filename; ++ if (!FPackageName::TryConvertLongPackageNameToFilename( ++ Package->GetName(), Filename, FPackageName::GetAssetPackageExtension())) ++ { ++ ++SaveFailures; ++ UE_LOG(LogLPFixDeprecated, Error, TEXT(" chemin introuvable pour %s"), *Package->GetName()); ++ continue; ++ } ++ ++ ResetLoaders(Package); ++ ++ FSavePackageArgs SaveArgs; ++ SaveArgs.TopLevelFlags = RF_Public | RF_Standalone; ++ SaveArgs.SaveFlags = SAVE_None; ++ SaveArgs.bWarnOfLongFilename = true; ++ // GWarn et non GError : en commandlet, GError rend toute erreur de save fatale. ++ SaveArgs.Error = GWarn; ++ ++ if (UPackage::SavePackage(Package, nullptr, *Filename, SaveArgs)) ++ { ++ UE_LOG(LogLPFixDeprecated, Warning, TEXT(" -> %s sauvegarde (%d noeud(s))."), *Package->GetName(), FixedHere); ++ } ++ else ++ { ++ ++SaveFailures; ++ UE_LOG(LogLPFixDeprecated, Error, TEXT(" -> ECHEC de sauvegarde de %s"), *Package->GetName()); ++ } ++ } ++ } ++ ++ UE_LOG(LogLPFixDeprecated, Warning, ++ TEXT("=== Termine : R-03 %d trouve(s) / %d corrige(s), R-04 %d trouve(s) / %d corrige(s), %d Blueprint(s) modifie(s), %d cas non traite(s), %d echec(s) de sauvegarde. ==="), ++ MeshNodesFound, MeshNodesFixed, NavNodesFound, NavNodesFixed, BlueprintsModified, Unhandled, SaveFailures); ++ ++ return (SaveFailures > 0 || Unhandled > 0) ? 1 : 0; ++} +diff --git a/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixDeprecatedNodesCommandlet.h b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixDeprecatedNodesCommandlet.h +new file mode 100644 +index 0000000..0c6aba4 +--- /dev/null ++++ b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixDeprecatedNodesCommandlet.h +@@ -0,0 +1,39 @@ ++// Portage UE 5.5 (2026.9 beta) - remediations R-03 et R-04. ++// ++// Deux familles de noeuds Blueprint deprecies subsistent apres la migration ; elles ++// representent a elles seules la quasi-totalite des avertissements de cook. ++// ++// R-03 USkinnedMeshComponent::SkeletalMesh (propriete) et son BlueprintGetter ++// GetSkeletalMesh_DEPRECATED -> USkeletalMeshComponent::GetSkeletalMeshAsset() ++// Les deux rendent le meme type (USkeletalMesh*), le remplacement conserve donc les ++// liaisons aval. Le noeud d'origine peut etre un K2Node_VariableGet (acces direct a ++// la propriete) ou un K2Node_CallFunction (appel du getter) : les deux sont traites. ++// ++// R-04 UNavigationSystemV1::K2_GetRandomPointInNavigableRadius ++// -> ULPNavigationHelpers::GetRandomLocationInNavigableRadius ++// On NE pointe PAS vers K2_GetRandomLocationInNavigableRadius du moteur : celui-ci ++// est BlueprintCallable alors que les noeuds existants sont purs. Voir ++// LPNavigationHelpers.h. ++// ++// Usage : ++// UnrealEditor-Cmd.exe \LifePlay.uproject -run=LPFixDeprecatedNodes [-DryRun] ++// ++// -DryRun n'ecrit rien : il liste les noeuds trouves, leur Blueprint, leur graphe et l'etat ++// de leurs broches. A lancer systematiquement avant la passe reelle. ++ ++#pragma once ++ ++#include "CoreMinimal.h" ++#include "Commandlets/Commandlet.h" ++#include "LPFixDeprecatedNodesCommandlet.generated.h" ++ ++UCLASS() ++class ULPFixDeprecatedNodesCommandlet : public UCommandlet ++{ ++ GENERATED_BODY() ++ ++public: ++ ULPFixDeprecatedNodesCommandlet(); ++ ++ virtual int32 Main(const FString& Params) override; ++}; +diff --git a/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixEditableTextBoxFontCommandlet.cpp b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixEditableTextBoxFontCommandlet.cpp +new file mode 100644 +index 0000000..80058af +--- /dev/null ++++ b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixEditableTextBoxFontCommandlet.cpp +@@ -0,0 +1,255 @@ ++// Portage UE 5.5 - voir LPFixEditableTextBoxFontCommandlet.h ++ ++#include "LPFixEditableTextBoxFontCommandlet.h" ++ ++#include "AssetRegistry/AssetRegistryModule.h" ++#include "EdGraph/EdGraph.h" ++#include "EdGraph/EdGraphPin.h" ++#include "EdGraphSchema_K2.h" ++#include "Engine/Blueprint.h" ++#include "K2Node_BreakStruct.h" ++#include "K2Node_MakeStruct.h" ++#include "Kismet2/BlueprintEditorUtils.h" ++#include "Kismet2/KismetEditorUtilities.h" ++#include "Misc/PackageName.h" ++#include "Styling/SlateTypes.h" ++#include "UObject/Package.h" ++#include "UObject/SavePackage.h" ++#include "UObject/UObjectGlobals.h" ++ ++DEFINE_LOG_CATEGORY_STATIC(LogLPFixFont, Log, All); ++ ++namespace ++{ ++ const TCHAR* OrphanPinName = TEXT("Font"); ++ const TCHAR* TextStylePinName = TEXT("TextStyle"); ++ ++ /** Decrit une broche et ses liaisons, pour le rapport. */ ++ FString DescribeLinks(const UEdGraphPin* Pin) ++ { ++ if (!Pin) ++ { ++ return TEXT("(broche absente)"); ++ } ++ if (Pin->LinkedTo.Num() == 0) ++ { ++ return FString::Printf(TEXT("non connectee (defaut: '%s')"), *Pin->DefaultValue); ++ } ++ ++ TArray Targets; ++ for (const UEdGraphPin* Linked : Pin->LinkedTo) ++ { ++ Targets.Add(FString::Printf(TEXT("%s.%s"), ++ Linked->GetOwningNode() ? *Linked->GetOwningNode()->GetName() : TEXT("?"), ++ *Linked->PinName.ToString())); ++ } ++ return FString::Printf(TEXT("%d liaison(s) -> %s"), Pin->LinkedTo.Num(), *FString::Join(Targets, TEXT(", "))); ++ } ++ ++} ++ ++ULPFixEditableTextBoxFontCommandlet::ULPFixEditableTextBoxFontCommandlet() ++{ ++ IsClient = false; ++ IsServer = false; ++ IsEditor = true; ++ LogToConsole = true; ++} ++ ++int32 ULPFixEditableTextBoxFontCommandlet::Main(const FString& Params) ++{ ++ const bool bDryRun = Params.Contains(TEXT("DryRun"), ESearchCase::IgnoreCase); ++ ++ UScriptStruct* EditableStruct = TBaseStructure::Get(); ++ if (!EditableStruct) ++ { ++ UE_LOG(LogLPFixFont, Error, TEXT("Structure FEditableTextBoxStyle introuvable.")); ++ return 1; ++ } ++ ++ UE_LOG(LogLPFixFont, Warning, TEXT("=== Rebranchement de la broche Font (EditableTextBoxStyle)%s ==="), ++ bDryRun ? TEXT(" [DRY RUN]") : TEXT("")); ++ ++ FAssetRegistryModule& AssetRegistryModule = ++ FModuleManager::LoadModuleChecked(TEXT("AssetRegistry")); ++ AssetRegistryModule.Get().SearchAllAssets(true); ++ ++ TArray BlueprintAssets; ++ AssetRegistryModule.Get().GetAssetsByClass(UBlueprint::StaticClass()->GetClassPathName(), BlueprintAssets, true); ++ ++ int32 NodesFound = 0; ++ int32 NodesFixed = 0; ++ int32 BlueprintsModified = 0; ++ int32 SaveFailures = 0; ++ int32 UnhandledLinks = 0; ++ ++ for (const FAssetData& AssetData : BlueprintAssets) ++ { ++ if (!AssetData.PackageName.ToString().StartsWith(TEXT("/Game/"))) ++ { ++ continue; ++ } ++ ++ UBlueprint* Blueprint = Cast(AssetData.GetAsset()); ++ if (!Blueprint) ++ { ++ continue; ++ } ++ ++ TArray Graphs; ++ Blueprint->GetAllGraphs(Graphs); ++ ++ int32 FixedHere = 0; ++ struct FPendingLink { UK2Node_BreakStruct* Break; UK2Node_MakeStruct* Make; }; ++ TArray PendingLinks; ++ TArray NodesToReconstruct; ++ ++ for (UEdGraph* Graph : Graphs) ++ { ++ if (!Graph) ++ { ++ continue; ++ } ++ ++ TArray Snapshot = Graph->Nodes; ++ for (UEdGraphNode* GraphNode : Snapshot) ++ { ++ UK2Node_MakeStruct* MakeNode = Cast(GraphNode); ++ UK2Node_BreakStruct* BreakNode = Cast(GraphNode); ++ ++ const bool bIsTarget = ++ (MakeNode && MakeNode->StructType == EditableStruct) || ++ (BreakNode && BreakNode->StructType == EditableStruct); ++ if (!bIsTarget) ++ { ++ continue; ++ } ++ ++ UEdGraphPin* FontPin = GraphNode->FindPin(OrphanPinName); ++ if (!FontPin) ++ { ++ continue; // deja corrige ++ } ++ ++ ++NodesFound; ++ UE_LOG(LogLPFixFont, Warning, TEXT(" %s :: %s -> %s"), ++ *Blueprint->GetName(), *Graph->GetName(), *GraphNode->GetName()); ++ UE_LOG(LogLPFixFont, Warning, TEXT(" broche Font : %s"), *DescribeLinks(FontPin)); ++ UE_LOG(LogLPFixFont, Warning, TEXT(" broche TextStyle : %s"), ++ *DescribeLinks(GraphNode->FindPin(TextStylePinName))); ++ ++ if (bDryRun) ++ { ++ continue; ++ } ++ ++ // Topologie relevee sur CharGen et StatMenu : ++ // [Break EditableTextBoxStyle].Font -> [Make EditableTextBoxStyle].Font ++ // La police n'est pas construite, elle est recopiee d'un style vers un autre. ++ // Les deux extremites etant la meme structure et le champ ayant migre dans ++ // TextStyle, la correspondance fidele est TextStyle -> TextStyle : aucun ++ // noeud intermediaire n'est necessaire, et le reste du style suit. ++ if (MakeNode) ++ { ++ for (UEdGraphPin* Source : FontPin->LinkedTo) ++ { ++ UK2Node_BreakStruct* SourceBreak = Cast(Source->GetOwningNode()); ++ if (SourceBreak && SourceBreak->StructType == EditableStruct) ++ { ++ PendingLinks.Add({ SourceBreak, MakeNode }); ++ } ++ else ++ { ++ UE_LOG(LogLPFixFont, Error, ++ TEXT(" source Font inattendue (%s) : rebranchement a faire a la main."), ++ Source->GetOwningNode() ? *Source->GetOwningNode()->GetName() : TEXT("?")); ++ ++UnhandledLinks; ++ } ++ } ++ } ++ ++ // ReconstructNode conserve une broche orpheline dans DEUX cas : si elle ++ // porte des liaisons, et si elle porte une valeur differente du defaut. ++ // C'est le garde-fou d'UE contre la perte de donnees. Il faut donc lever ++ // les deux, APRES avoir releve la topologie et AVANT de reconstruire, ++ // sans quoi la broche Font survit et l'erreur persiste. ++ FontPin->BreakAllPinLinks(); ++ GetDefault()->ResetPinToAutogeneratedDefaultValue(FontPin, false); ++ ++ NodesToReconstruct.AddUnique(GraphNode); ++ ++ ++NodesFixed; ++ ++FixedHere; ++ } ++ } ++ ++ // La reconstruction invalide les broches : on la fait en bloc, puis on relie. ++ for (UEdGraphNode* Node : NodesToReconstruct) ++ { ++ Node->ReconstructNode(); ++ } ++ ++ for (const FPendingLink& Link : PendingLinks) ++ { ++ UEdGraphPin* From = Link.Break->FindPin(TextStylePinName, EGPD_Output); ++ UEdGraphPin* To = Link.Make->FindPin(TextStylePinName, EGPD_Input); ++ if (From && To) ++ { ++ // Idempotent : une seconde execution ne doit pas doubler la liaison. ++ if (!From->LinkedTo.Contains(To)) ++ { ++ From->MakeLinkTo(To); ++ } ++ UE_LOG(LogLPFixFont, Warning, TEXT(" %s.TextStyle -> %s.TextStyle"), ++ *Link.Break->GetName(), *Link.Make->GetName()); ++ } ++ else ++ { ++ ++UnhandledLinks; ++ UE_LOG(LogLPFixFont, Error, TEXT(" TextStyle introuvable sur %s ou %s."), ++ *Link.Break->GetName(), *Link.Make->GetName()); ++ } ++ } ++ ++ if (FixedHere > 0 && !bDryRun) ++ { ++ ++BlueprintsModified; ++ FBlueprintEditorUtils::MarkBlueprintAsStructurallyModified(Blueprint); ++ FKismetEditorUtilities::CompileBlueprint(Blueprint); ++ ++ UPackage* Package = Blueprint->GetOutermost(); ++ FString Filename; ++ if (!FPackageName::TryConvertLongPackageNameToFilename( ++ Package->GetName(), Filename, FPackageName::GetAssetPackageExtension())) ++ { ++ ++SaveFailures; ++ UE_LOG(LogLPFixFont, Error, TEXT(" chemin introuvable pour %s"), *Package->GetName()); ++ continue; ++ } ++ ++ ResetLoaders(Package); ++ ++ FSavePackageArgs SaveArgs; ++ SaveArgs.TopLevelFlags = RF_Public | RF_Standalone; ++ SaveArgs.SaveFlags = SAVE_None; ++ SaveArgs.bWarnOfLongFilename = true; ++ // GWarn et non GError : en commandlet, GError rend toute erreur de save fatale. ++ SaveArgs.Error = GWarn; ++ ++ if (UPackage::SavePackage(Package, nullptr, *Filename, SaveArgs)) ++ { ++ UE_LOG(LogLPFixFont, Warning, TEXT(" -> %s sauvegarde (%d noeud(s))."), *Package->GetName(), FixedHere); ++ } ++ else ++ { ++ ++SaveFailures; ++ UE_LOG(LogLPFixFont, Error, TEXT(" -> ECHEC de sauvegarde de %s"), *Package->GetName()); ++ } ++ } ++ } ++ ++ UE_LOG(LogLPFixFont, Warning, TEXT("=== Termine : %d noeud(s) trouve(s), %d traite(s) dans %d Blueprint(s), %d liaison(s) non geree(s), %d echec(s) de sauvegarde. ==="), ++ NodesFound, NodesFixed, BlueprintsModified, UnhandledLinks, SaveFailures); ++ ++ return (SaveFailures > 0 || UnhandledLinks > 0) ? 1 : 0; ++} +diff --git a/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixEditableTextBoxFontCommandlet.h b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixEditableTextBoxFontCommandlet.h +new file mode 100644 +index 0000000..c8039a7 +--- /dev/null ++++ b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixEditableTextBoxFontCommandlet.h +@@ -0,0 +1,32 @@ ++// Portage UE 5.5 - rebranchement de la broche Font des noeuds Make/Break EditableTextBoxStyle. ++// ++// FEditableTextBoxStyle::Font est devenu Font_DEPRECATED en 5.1 : la police vit desormais ++// dans TextStyle (FTextBlockStyle). Les noeuds Make/Break existants gardent une broche ++// orpheline "Font" qui fait echouer la compilation, et donc le cook : ++// ++// La broche "Font" n'existe plus sur le noeud "Break Editable Text Box Style". ++// ++// La commandlet retablit le chemin via TextStyle : ++// Make : source Font -> [Make TextBlockStyle].Font -> [Make EditableTextBoxStyle].TextStyle ++// Break : [Break EditableTextBoxStyle].TextStyle -> [Break TextBlockStyle].Font -> consommateurs ++// ++// UnrealEditor-Cmd.exe -run=LPFixEditableTextBoxFont [-DryRun] ++// ++// Sans -DryRun, les Blueprints modifies sont recompiles et sauvegardes. ++ ++#pragma once ++ ++#include "CoreMinimal.h" ++#include "Commandlets/Commandlet.h" ++#include "LPFixEditableTextBoxFontCommandlet.generated.h" ++ ++UCLASS() ++class ULPFixEditableTextBoxFontCommandlet : public UCommandlet ++{ ++ GENERATED_BODY() ++ ++public: ++ ULPFixEditableTextBoxFontCommandlet(); ++ ++ virtual int32 Main(const FString& Params) override; ++}; +diff --git a/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixOrphanBoundEventsCommandlet.cpp b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixOrphanBoundEventsCommandlet.cpp +new file mode 100644 +index 0000000..cbfb64c +--- /dev/null ++++ b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixOrphanBoundEventsCommandlet.cpp +@@ -0,0 +1,200 @@ ++// Portage UE 5.5 - voir LPFixOrphanBoundEventsCommandlet.h ++ ++#include "LPFixOrphanBoundEventsCommandlet.h" ++ ++#include "AssetRegistry/AssetRegistryModule.h" ++#include "EdGraph/EdGraph.h" ++#include "EdGraph/EdGraphPin.h" ++#include "EdGraphSchema_K2.h" ++#include "Engine/Blueprint.h" ++#include "K2Node_ComponentBoundEvent.h" ++#include "Kismet2/BlueprintEditorUtils.h" ++#include "Kismet2/KismetEditorUtilities.h" ++#include "Misc/PackageName.h" ++#include "UObject/Package.h" ++#include "UObject/SavePackage.h" ++#include "UObject/UObjectGlobals.h" ++ ++DEFINE_LOG_CATEGORY_STATIC(LogLPFixBoundEvents, Log, All); ++ ++namespace ++{ ++ /** ++ * Reproduit le test que le compilateur applique lui-meme : le composant referencE par ++ * l'evenement doit exister sous forme de FObjectProperty sur la classe squelette du ++ * Blueprint. UK2Node_ComponentBoundEvent::IsDelegateValid() est prive, d'ou la copie. ++ */ ++ bool ComponentStillExists(const UBlueprint* Blueprint, FName ComponentPropertyName) ++ { ++ if (!Blueprint || ComponentPropertyName.IsNone()) ++ { ++ return false; ++ } ++ const UClass* Scope = Blueprint->SkeletonGeneratedClass ++ ? Blueprint->SkeletonGeneratedClass ++ : Blueprint->GeneratedClass; ++ return Scope && FindFProperty(Scope, ComponentPropertyName) != nullptr; ++ } ++ ++ /** Compte les noeuds atteignables depuis la broche Exec de sortie de l'evenement. */ ++ int32 CountDownstreamNodes(const UEdGraphNode* EventNode) ++ { ++ TSet Seen; ++ TArray Pending; ++ Pending.Add(EventNode); ++ Seen.Add(EventNode); ++ ++ while (Pending.Num() > 0) ++ { ++ const UEdGraphNode* Current = Pending.Pop(); ++ for (const UEdGraphPin* Pin : Current->Pins) ++ { ++ if (!Pin || Pin->Direction != EGPD_Output || Pin->PinType.PinCategory != UEdGraphSchema_K2::PC_Exec) ++ { ++ continue; ++ } ++ for (const UEdGraphPin* Linked : Pin->LinkedTo) ++ { ++ const UEdGraphNode* Next = Linked ? Linked->GetOwningNode() : nullptr; ++ if (Next && !Seen.Contains(Next)) ++ { ++ Seen.Add(Next); ++ Pending.Add(Next); ++ } ++ } ++ } ++ } ++ return Seen.Num() - 1; // on ne compte pas l'evenement lui-meme ++ } ++} ++ ++ULPFixOrphanBoundEventsCommandlet::ULPFixOrphanBoundEventsCommandlet() ++{ ++ IsClient = false; ++ IsServer = false; ++ IsEditor = true; ++ LogToConsole = true; ++} ++ ++int32 ULPFixOrphanBoundEventsCommandlet::Main(const FString& Params) ++{ ++ const bool bDryRun = Params.Contains(TEXT("DryRun"), ESearchCase::IgnoreCase); ++ ++ UE_LOG(LogLPFixBoundEvents, Warning, TEXT("=== Evenements de composant orphelins (R-05)%s ==="), ++ bDryRun ? TEXT(" [DRY RUN]") : TEXT("")); ++ ++ FAssetRegistryModule& AssetRegistryModule = ++ FModuleManager::LoadModuleChecked(TEXT("AssetRegistry")); ++ AssetRegistryModule.Get().SearchAllAssets(true); ++ ++ TArray BlueprintAssets; ++ AssetRegistryModule.Get().GetAssetsByClass(UBlueprint::StaticClass()->GetClassPathName(), BlueprintAssets, true); ++ ++ int32 NodesFound = 0; ++ int32 NodesRemoved = 0; ++ int32 BlueprintsModified = 0; ++ int32 SaveFailures = 0; ++ ++ for (const FAssetData& AssetData : BlueprintAssets) ++ { ++ if (!AssetData.PackageName.ToString().StartsWith(TEXT("/Game/"))) ++ { ++ continue; ++ } ++ ++ UBlueprint* Blueprint = Cast(AssetData.GetAsset()); ++ if (!Blueprint) ++ { ++ continue; ++ } ++ ++ TArray Graphs; ++ Blueprint->GetAllGraphs(Graphs); ++ ++ int32 RemovedHere = 0; ++ ++ for (UEdGraph* Graph : Graphs) ++ { ++ if (!Graph) ++ { ++ continue; ++ } ++ ++ TArray Snapshot = Graph->Nodes; ++ for (UEdGraphNode* GraphNode : Snapshot) ++ { ++ UK2Node_ComponentBoundEvent* BoundEvent = Cast(GraphNode); ++ if (!BoundEvent) ++ { ++ continue; ++ } ++ ++ const FName ComponentName = BoundEvent->GetComponentPropertyName(); ++ if (ComponentStillExists(Blueprint, ComponentName)) ++ { ++ continue; ++ } ++ ++ ++NodesFound; ++ const int32 Downstream = CountDownstreamNodes(BoundEvent); ++ UE_LOG(LogLPFixBoundEvents, Warning, ++ TEXT(" %s :: %s -> %s (composant '%s' introuvable, %d noeud(s) en aval)"), ++ *Blueprint->GetName(), *Graph->GetName(), *GraphNode->GetName(), ++ *ComponentName.ToString(), Downstream); ++ ++ if (bDryRun) ++ { ++ continue; ++ } ++ ++ Graph->Modify(); ++ BoundEvent->Modify(); ++ BoundEvent->DestroyNode(); ++ ++NodesRemoved; ++ ++RemovedHere; ++ } ++ } ++ ++ if (RemovedHere > 0 && !bDryRun) ++ { ++ ++BlueprintsModified; ++ FBlueprintEditorUtils::MarkBlueprintAsStructurallyModified(Blueprint); ++ FKismetEditorUtilities::CompileBlueprint(Blueprint); ++ ++ UPackage* Package = Blueprint->GetOutermost(); ++ FString Filename; ++ if (!FPackageName::TryConvertLongPackageNameToFilename( ++ Package->GetName(), Filename, FPackageName::GetAssetPackageExtension())) ++ { ++ ++SaveFailures; ++ UE_LOG(LogLPFixBoundEvents, Error, TEXT(" chemin introuvable pour %s"), *Package->GetName()); ++ continue; ++ } ++ ++ ResetLoaders(Package); ++ ++ FSavePackageArgs SaveArgs; ++ SaveArgs.TopLevelFlags = RF_Public | RF_Standalone; ++ SaveArgs.SaveFlags = SAVE_None; ++ SaveArgs.bWarnOfLongFilename = true; ++ SaveArgs.Error = GWarn; ++ ++ if (UPackage::SavePackage(Package, nullptr, *Filename, SaveArgs)) ++ { ++ UE_LOG(LogLPFixBoundEvents, Warning, TEXT(" -> %s sauvegarde (%d evenement(s) retire(s))."), ++ *Package->GetName(), RemovedHere); ++ } ++ else ++ { ++ ++SaveFailures; ++ UE_LOG(LogLPFixBoundEvents, Error, TEXT(" -> ECHEC de sauvegarde de %s"), *Package->GetName()); ++ } ++ } ++ } ++ ++ UE_LOG(LogLPFixBoundEvents, Warning, ++ TEXT("=== Termine : %d evenement(s) orphelin(s) trouve(s), %d retire(s) dans %d Blueprint(s), %d echec(s) de sauvegarde. ==="), ++ NodesFound, NodesRemoved, BlueprintsModified, SaveFailures); ++ ++ return SaveFailures > 0 ? 1 : 0; ++} +diff --git a/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixOrphanBoundEventsCommandlet.h b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixOrphanBoundEventsCommandlet.h +new file mode 100644 +index 0000000..7bf014a +--- /dev/null ++++ b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixOrphanBoundEventsCommandlet.h +@@ -0,0 +1,31 @@ ++// Portage UE 5.5 (2026.9 beta) - remediation R-05. ++// ++// Trois evenements « On Clicked » restent lies a des widgets qui n'existent plus dans l'arbre ++// de leur Blueprint (UI/TopRight::StatButtonL, UI/CharGen::ButtonPreviewErect et ++// ButtonEyelashColor). Le compilateur emet « n'a pas de composant correspondant valide ! » et ++// le delegue n'est jamais branche : le clic est deja mort a l'execution. ++// ++// Cette commandlet repere ces UK2Node_ComponentBoundEvent orphelins et les supprime. Les ++// noeuds situes en aval sont CONSERVES tels quels : ils deviennent simplement inatteignables, ++// ce qui n'a aucun effet a l'execution mais laisse la logique visible pour qui voudrait ++// recreer le widget manquant. Le rapport indique combien de noeuds passent dans ce cas. ++// ++// Usage : ++// UnrealEditor-Cmd.exe \LifePlay.uproject -run=LPFixOrphanBoundEvents [-DryRun] ++ ++#pragma once ++ ++#include "CoreMinimal.h" ++#include "Commandlets/Commandlet.h" ++#include "LPFixOrphanBoundEventsCommandlet.generated.h" ++ ++UCLASS() ++class ULPFixOrphanBoundEventsCommandlet : public UCommandlet ++{ ++ GENERATED_BODY() ++ ++public: ++ ULPFixOrphanBoundEventsCommandlet(); ++ ++ virtual int32 Main(const FString& Params) override; ++}; +diff --git a/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixZeroScaleActorsCommandlet.cpp b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixZeroScaleActorsCommandlet.cpp +new file mode 100644 +index 0000000..c1d5e9c +--- /dev/null ++++ b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixZeroScaleActorsCommandlet.cpp +@@ -0,0 +1,223 @@ ++// Portage UE 5.5 - voir LPFixZeroScaleActorsCommandlet.h ++ ++#include "LPFixZeroScaleActorsCommandlet.h" ++ ++#include "AssetRegistry/AssetRegistryModule.h" ++#include "Components/SceneComponent.h" ++#include "Components/PrimitiveComponent.h" ++#include "Components/StaticMeshComponent.h" ++#include "Engine/StaticMesh.h" ++#include "Engine/World.h" ++#include "GameFramework/Actor.h" ++#include "Misc/PackageName.h" ++#include "UObject/Package.h" ++#include "UObject/SavePackage.h" ++#include "UObject/UObjectGlobals.h" ++ ++DEFINE_LOG_CATEGORY_STATIC(LogLPFixZeroScale, Log, All); ++ ++namespace ++{ ++ /** Seuil du moteur : FMath::IsNearlyZero sur chaque composante avant creation du body. */ ++ constexpr double ZeroScaleTolerance = UE_KINDA_SMALL_NUMBER; ++ ++ /** Decrit le maillage porte par un composant, pour pouvoir juger de la valeur a remettre. */ ++ FString DescribeMesh(const USceneComponent* Component) ++ { ++ const UStaticMeshComponent* MeshComponent = Cast(Component); ++ if (!MeshComponent || !MeshComponent->GetStaticMesh()) ++ { ++ return TEXT("(pas de maillage statique)"); ++ } ++ ++ const UStaticMesh* Mesh = MeshComponent->GetStaticMesh(); ++ const FBoxSphereBounds Bounds = Mesh->GetBounds(); ++ return FString::Printf(TEXT("%s demi-dimensions locales (X=%.2f Y=%.2f Z=%.2f)"), ++ *Mesh->GetPathName(), ++ Bounds.BoxExtent.X, Bounds.BoxExtent.Y, Bounds.BoxExtent.Z); ++ } ++ ++ /** ++ * Visibilite et collision : ce sont elles qui dictent la valeur de remplacement. ++ * Un bloqueur invisible tolere une epaisseur quelconque ; un mur visible non. ++ */ ++ FString DescribeRendering(const USceneComponent* Component) ++ { ++ const UPrimitiveComponent* Primitive = Cast(Component); ++ if (!Primitive) ++ { ++ return TEXT("(pas un composant primitif)"); ++ } ++ ++ const UEnum* CollisionEnum = StaticEnum(); ++ const ECollisionEnabled::Type Collision = Primitive->GetCollisionEnabled(); ++ ++ return FString::Printf(TEXT("visible=%s cacheEnJeu=%s collision=%s profil=%s"), ++ Primitive->IsVisible() ? TEXT("oui") : TEXT("NON"), ++ Primitive->bHiddenInGame ? TEXT("oui") : TEXT("non"), ++ CollisionEnum ? *CollisionEnum->GetNameStringByValue(static_cast(Collision)) : TEXT("?"), ++ *Primitive->GetCollisionProfileName().ToString()); ++ } ++} ++ ++ULPFixZeroScaleActorsCommandlet::ULPFixZeroScaleActorsCommandlet() ++{ ++ IsClient = false; ++ IsServer = false; ++ IsEditor = true; ++ LogToConsole = true; ++} ++ ++int32 ULPFixZeroScaleActorsCommandlet::Main(const FString& Params) ++{ ++ TArray Tokens; ++ TArray Switches; ++ TMap ParamsMap; ++ ParseCommandLine(*Params, Tokens, Switches, ParamsMap); ++ ++ const bool bFix = Switches.Contains(TEXT("Fix")); ++ double Replacement = 1.0; ++ if (const FString* ScaleText = ParamsMap.Find(TEXT("Scale"))) ++ { ++ Replacement = FCString::Atod(**ScaleText); ++ } ++ // Garde-fou volontaire : PowerShell coupe « -Scale=0.1 » en deux arguments si on ne le ++ // guillemette pas, et la commandlet recevrait alors 0 sans rien dire. Voir l'en-tete. ++ if (bFix && FMath::IsNearlyZero(Replacement, ZeroScaleTolerance)) ++ { ++ UE_LOG(LogLPFixZeroScale, Error, ++ TEXT("-Scale lu a %f : valeur nulle ou argument coupe par le shell. Guillemettez \"-Scale=0.1\"."), ++ Replacement); ++ return 1; ++ } ++ ++ UE_LOG(LogLPFixZeroScale, Warning, TEXT("=== Composantes d'echelle nulles (R-06)%s ==="), ++ bFix ? *FString::Printf(TEXT(" [CORRECTION -> %.4f]"), Replacement) : TEXT(" [RAPPORT SEUL]")); ++ ++ FAssetRegistryModule& AssetRegistryModule = ++ FModuleManager::LoadModuleChecked(TEXT("AssetRegistry")); ++ AssetRegistryModule.Get().SearchAllAssets(true); ++ ++ TArray MapAssets; ++ AssetRegistryModule.Get().GetAssetsByClass(UWorld::StaticClass()->GetClassPathName(), MapAssets, true); ++ ++ int32 ComponentsFound = 0; ++ int32 ComponentsFixed = 0; ++ int32 MapsModified = 0; ++ int32 SaveFailures = 0; ++ ++ for (const FAssetData& AssetData : MapAssets) ++ { ++ const FString PackageName = AssetData.PackageName.ToString(); ++ if (!PackageName.StartsWith(TEXT("/Game/"))) ++ { ++ continue; ++ } ++ ++ UPackage* Package = LoadPackage(nullptr, *PackageName, LOAD_None); ++ UWorld* World = Package ? UWorld::FindWorldInPackage(Package) : nullptr; ++ if (!World || !World->PersistentLevel) ++ { ++ UE_LOG(LogLPFixZeroScale, Warning, TEXT(" %s : monde illisible, ignore."), *PackageName); ++ continue; ++ } ++ ++ int32 FixedHere = 0; ++ ++ for (AActor* Actor : World->PersistentLevel->Actors) ++ { ++ if (!Actor) ++ { ++ continue; ++ } ++ ++ TArray Components; ++ Actor->GetComponents(Components); ++ ++ for (USceneComponent* Component : Components) ++ { ++ if (!Component) ++ { ++ continue; ++ } ++ ++ FVector Scale = Component->GetRelativeScale3D(); ++ const bool bZeroX = FMath::IsNearlyZero(Scale.X, ZeroScaleTolerance); ++ const bool bZeroY = FMath::IsNearlyZero(Scale.Y, ZeroScaleTolerance); ++ const bool bZeroZ = FMath::IsNearlyZero(Scale.Z, ZeroScaleTolerance); ++ if (!bZeroX && !bZeroY && !bZeroZ) ++ { ++ continue; ++ } ++ ++ ++ComponentsFound; ++ UE_LOG(LogLPFixZeroScale, Warning, TEXT(" %s : %s.%s"), ++ *PackageName, *Actor->GetName(), *Component->GetName()); ++ UE_LOG(LogLPFixZeroScale, Warning, TEXT(" echelle : X=%.4f Y=%.4f Z=%.4f"), ++ Scale.X, Scale.Y, Scale.Z); ++ UE_LOG(LogLPFixZeroScale, Warning, TEXT(" maillage : %s"), *DescribeMesh(Component)); ++ UE_LOG(LogLPFixZeroScale, Warning, TEXT(" rendu : %s"), *DescribeRendering(Component)); ++ ++ if (!bFix) ++ { ++ continue; ++ } ++ ++ if (bZeroX) { Scale.X = Replacement; } ++ if (bZeroY) { Scale.Y = Replacement; } ++ if (bZeroZ) { Scale.Z = Replacement; } ++ ++ Actor->Modify(); ++ Component->Modify(); ++ Component->SetRelativeScale3D(Scale); ++ Component->MarkRenderStateDirty(); ++ // Recalcule le corps physique avec la nouvelle echelle. ++ Component->RecreatePhysicsState(); ++ ++ UE_LOG(LogLPFixZeroScale, Warning, TEXT(" -> X=%.4f Y=%.4f Z=%.4f"), ++ Scale.X, Scale.Y, Scale.Z); ++ ++ ++ComponentsFixed; ++ ++FixedHere; ++ } ++ } ++ ++ if (FixedHere > 0) ++ { ++ ++MapsModified; ++ ++ FString Filename; ++ if (!FPackageName::TryConvertLongPackageNameToFilename( ++ PackageName, Filename, FPackageName::GetMapPackageExtension())) ++ { ++ ++SaveFailures; ++ UE_LOG(LogLPFixZeroScale, Error, TEXT(" chemin introuvable pour %s"), *PackageName); ++ continue; ++ } ++ ++ Package->MarkPackageDirty(); ++ ++ FSavePackageArgs SaveArgs; ++ SaveArgs.TopLevelFlags = RF_Public | RF_Standalone; ++ SaveArgs.SaveFlags = SAVE_None; ++ SaveArgs.bWarnOfLongFilename = true; ++ SaveArgs.Error = GWarn; ++ ++ if (UPackage::SavePackage(Package, World, *Filename, SaveArgs)) ++ { ++ UE_LOG(LogLPFixZeroScale, Warning, TEXT(" -> %s sauvegarde (%d composant(s))."), *PackageName, FixedHere); ++ } ++ else ++ { ++ ++SaveFailures; ++ UE_LOG(LogLPFixZeroScale, Error, TEXT(" -> ECHEC de sauvegarde de %s"), *PackageName); ++ } ++ } ++ } ++ ++ UE_LOG(LogLPFixZeroScale, Warning, ++ TEXT("=== Termine : %d composant(s) a echelle nulle, %d corrige(s) dans %d carte(s), %d echec(s) de sauvegarde. ==="), ++ ComponentsFound, ComponentsFixed, MapsModified, SaveFailures); ++ ++ return SaveFailures > 0 ? 1 : 0; ++} +diff --git a/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixZeroScaleActorsCommandlet.h b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixZeroScaleActorsCommandlet.h +new file mode 100644 +index 0000000..975b6a8 +--- /dev/null ++++ b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LPFixZeroScaleActorsCommandlet.h +@@ -0,0 +1,39 @@ ++// Portage UE 5.5 (2026.9 beta) - remediation R-06. ++// ++// /Game/Scenes/CentralLondon:PersistentLevel.Wall.StaticMeshComponent0 porte une echelle ++// (X=0.000, Y=12.562, Z=5.750). Une composante nulle produit un corps physique degenere : ++// le moteur emet « has a component set to zero, which will result in a bad body instance » ++// a chaque cook, un MapCheck: Error, et l'inversion de la matrice de transformation declenche ++// un ensure « TMatrix::InverseFast() ... results in NaNs » en session d'edition. ++// ++// La commandlet parcourt les cartes de /Game/, signale toute composante d'echelle nulle avec ++// le maillage concerne et ses dimensions (pour pouvoir juger de la valeur de remplacement), ++// puis corrige si on le lui demande. ++// ++// Usage : ++// UnrealEditor-Cmd.exe -run=LPFixZeroScaleActors (rapport seul) ++// UnrealEditor-Cmd.exe -run=LPFixZeroScaleActors -Fix [-Scale=1.0] ++// ++// ATTENTION sous PowerShell : « -Scale=0.1 » non guillemete est coupe en « -Scale=0 » et ++// « .1 », la commandlet recevrait 0. Ecrire "-Scale=0.1". Le garde-fou sur la valeur nulle ++// est la pour attraper le cas. ++// ++// Le rapport est le mode par defaut : contrairement aux autres commandlets du projet, la ++// valeur de remplacement est un choix de niveau, pas une equivalence mecanique. ++ ++#pragma once ++ ++#include "CoreMinimal.h" ++#include "Commandlets/Commandlet.h" ++#include "LPFixZeroScaleActorsCommandlet.generated.h" ++ ++UCLASS() ++class ULPFixZeroScaleActorsCommandlet : public UCommandlet ++{ ++ GENERATED_BODY() ++ ++public: ++ ULPFixZeroScaleActorsCommandlet(); ++ ++ virtual int32 Main(const FString& Params) override; ++}; +diff --git a/D:/Game/LifePlay-master 4.27/Source/LifePlayEditorTools/LifePlayEditorTools.Build.cs b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LifePlayEditorTools.Build.cs +index 438d0c9..da7afda 100644 +--- a/D:/Game/LifePlay-master 4.27/Source/LifePlayEditorTools/LifePlayEditorTools.Build.cs ++++ b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditorTools/LifePlayEditorTools.Build.cs +@@ -21,7 +21,19 @@ public class LifePlayEditorTools : ModuleRules + "UnrealEd", + "BlueprintGraph", + "KismetCompiler", +- "AssetRegistry" ++ "AssetRegistry", ++ // Portage 5.5 : LPCheckStreetMapCommandlet lit les assets UStreetMap ++ "StreetMapRuntime", ++ // Portage 5.5 : LPFixEditableTextBoxFontCommandlet manipule ++ // FEditableTextBoxStyle et FTextBlockStyle ++ "SlateCore", ++ // Portage 5.5 (R-04) : LPFixDeprecatedNodesCommandlet reference ++ // UNavigationSystemV1 pour identifier les noeuds a reaiguiller ++ "NavigationSystem", ++ // Portage 5.5 (R-05) : LPFixOrphanBoundEventsCommandlet traite les ++ // UWidgetBlueprint au meme titre que les UBlueprint ++ "UMG", ++ "UMGEditor" + }); + } + } diff --git a/Docs/Migration/correctifs/P03_Plugin_ModdingExtra.patch b/Docs/Migration/correctifs/P03_Plugin_ModdingExtra.patch new file mode 100644 index 0000000..47f17e3 --- /dev/null +++ b/Docs/Migration/correctifs/P03_Plugin_ModdingExtra.patch @@ -0,0 +1,61 @@ +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/ModdingExtra/Source/ModdingExtra/ModdingExtra.Build.cs b/D:/Game/LifePlay-master 5.5/Plugins/ModdingExtra/Source/ModdingExtra/ModdingExtra.Build.cs +index 15a3995..37ef520 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/ModdingExtra/Source/ModdingExtra/ModdingExtra.Build.cs ++++ b/D:/Game/LifePlay-master 5.5/Plugins/ModdingExtra/Source/ModdingExtra/ModdingExtra.Build.cs +@@ -1,5 +1,6 @@ + // Some copyright should be here... + ++using System.IO; + using UnrealBuildTool; + + public class ModdingExtra : ModuleRules +@@ -11,7 +12,7 @@ public class ModdingExtra : ModuleRules + + PrivateIncludePaths.AddRange( + new string[] { +- "ModdingExtra/Private", ++ Path.Combine(ModuleDirectory, "Private"), + + // ... add other private include paths required here ... + } +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/ModdingExtra/Source/ModdingExtra/Private/ModdingExtraBPLibrary.cpp b/D:/Game/LifePlay-master 5.5/Plugins/ModdingExtra/Source/ModdingExtra/Private/ModdingExtraBPLibrary.cpp +index e6fa5b0..5a6f0d2 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/ModdingExtra/Source/ModdingExtra/Private/ModdingExtraBPLibrary.cpp ++++ b/D:/Game/LifePlay-master 5.5/Plugins/ModdingExtra/Source/ModdingExtra/Private/ModdingExtraBPLibrary.cpp +@@ -2,7 +2,9 @@ + + #include "ModdingExtraBPLibrary.h" + #include "ModdingExtra.h" +-#include "Engine.h" ++#include "HAL/FileManager.h" ++#include "Misc/FileHelper.h" ++#include "Misc/Paths.h" + + // Instrumentation temporaire (diagnostic randomisation, 2026-09-28). + // Presente a l'identique dans les arbres 4.27 et 5.5 pour permettre un A/B. +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/ModdingExtra/Source/ModdingExtra/Public/ModdingExtra.h b/D:/Game/LifePlay-master 5.5/Plugins/ModdingExtra/Source/ModdingExtra/Public/ModdingExtra.h +index cd97167..f69b35d 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/ModdingExtra/Source/ModdingExtra/Public/ModdingExtra.h ++++ b/D:/Game/LifePlay-master 5.5/Plugins/ModdingExtra/Source/ModdingExtra/Public/ModdingExtra.h +@@ -2,7 +2,8 @@ + + #pragma once + +-#include "ModuleManager.h" ++#include "CoreMinimal.h" ++#include "Modules/ModuleManager.h" + + class FModdingExtraModule : public IModuleInterface + { +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/ModdingExtra/Source/ModdingExtra/Public/ModdingExtraBPLibrary.h b/D:/Game/LifePlay-master 5.5/Plugins/ModdingExtra/Source/ModdingExtra/Public/ModdingExtraBPLibrary.h +index d92c985..42eb686 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/ModdingExtra/Source/ModdingExtra/Public/ModdingExtraBPLibrary.h ++++ b/D:/Game/LifePlay-master 5.5/Plugins/ModdingExtra/Source/ModdingExtra/Public/ModdingExtraBPLibrary.h +@@ -2,6 +2,7 @@ + + #pragma once + ++#include "CoreMinimal.h" + #include "Kismet/BlueprintFunctionLibrary.h" + #include "ModdingExtraBPLibrary.generated.h" + diff --git a/Docs/Migration/correctifs/P04_Plugin_StreetMap.patch b/Docs/Migration/correctifs/P04_Plugin_StreetMap.patch new file mode 100644 index 0000000..53578d5 --- /dev/null +++ b/Docs/Migration/correctifs/P04_Plugin_StreetMap.patch @@ -0,0 +1,1436 @@ +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/OSMFile.cpp b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/OSMFile.cpp +index 6a8b808..9a60b58 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/OSMFile.cpp ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/OSMFile.cpp +@@ -1,11 +1,12 @@ +-// Copyright 2017 Mike Fricker. All Rights Reserved. +- +-#include "StreetMapImporting.h" + #include "OSMFile.h" +- ++#include "Misc/FeedbackContext.h" + + FOSMFile::FOSMFile() +- : ParsingState( ParsingState::Root ) ++ : ParsingState(ParsingState::Root), ++ CurrentNodeID(0), ++ CurrentNodeInfo(nullptr), ++ CurrentWayInfo(nullptr), ++ CurrentWayTagKey(nullptr) + { + } + +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/OSMFile.h b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/OSMFile.h +index 2b1aafd..3c31d01 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/OSMFile.h ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/OSMFile.h +@@ -1,9 +1,6 @@ +-// Copyright 2017 Mike Fricker. All Rights Reserved. + #pragma once +- + #include "FastXml.h" + +- + /** OpenStreetMap file loader */ + class FOSMFile : public IFastXmlCallback + { +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapActorFactory.cpp b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapActorFactory.cpp +index 774e2e8..9222a1c 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapActorFactory.cpp ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapActorFactory.cpp +@@ -1,18 +1,9 @@ +-// Copyright 2017 Mike Fricker. All Rights Reserved. +- +-// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved. +- +-#include "StreetMapImporting.h" +-#include "AssetData.h" + #include "StreetMapActorFactory.h" ++#include "AssetRegistry/AssetData.h" + #include "StreetMapActor.h" + #include "StreetMapComponent.h" + #include "StreetMap.h" + +- +-////////////////////////////////////////////////////////////////////////// +-// UStreetMapActorFactory +- + UStreetMapActorFactory::UStreetMapActorFactory(const FObjectInitializer& ObjectInitializer) + : Super(ObjectInitializer) + { +@@ -32,17 +23,6 @@ void UStreetMapActorFactory::PostSpawnActor(UObject* Asset, AActor* NewActor) + } + } + +-void UStreetMapActorFactory::PostCreateBlueprint(UObject* Asset, AActor* CDO) +-{ +- if (Asset != nullptr && CDO != nullptr) +- { +- UStreetMap* StreetMapAsset = CastChecked(Asset); +- AStreetMapActor* StreetMapActor = CastChecked(CDO); +- UStreetMapComponent* StreetMapComponent = StreetMapActor->GetStreetMapComponent(); +- StreetMapComponent->SetStreetMap(StreetMapAsset, true, false); +- } +-} +- + bool UStreetMapActorFactory::CanCreateActorFrom(const FAssetData& AssetData, FText& OutErrorMsg) + { + return (AssetData.IsValid() && AssetData.GetClass()->IsChildOf(UStreetMap::StaticClass())); +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapActorFactory.h b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapActorFactory.h +index a45a707..15c2f39 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapActorFactory.h ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapActorFactory.h +@@ -1,8 +1,6 @@ + // Copyright 2017 Mike Fricker. All Rights Reserved. + + #pragma once +- +-#include "CoreMinimal.h" + #include "ActorFactories/ActorFactory.h" + #include "StreetMapActorFactory.generated.h" + +@@ -11,9 +9,8 @@ class UStreetMapActorFactory : public UActorFactory + { + GENERATED_UCLASS_BODY() + +- //~ Begin UActorFactory Interface +- virtual void PostSpawnActor(UObject* Asset, AActor* NewActor) override; +- virtual void PostCreateBlueprint(UObject* Asset, AActor* CDO) override; ++ //~ Begin UActorFactory Interface ++ virtual void PostSpawnActor(UObject* Asset, AActor* NewActor) override; + virtual bool CanCreateActorFrom(const FAssetData& AssetData, FText& OutErrorMsg) override; + //~ End UActorFactory Interface + }; +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapAssetTypeActions.cpp b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapAssetTypeActions.cpp +index 16dd2e1..b7e026a 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapAssetTypeActions.cpp ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapAssetTypeActions.cpp +@@ -1,10 +1,7 @@ +-// Copyright 2017 Mike Fricker. All Rights Reserved. +- +-#include "StreetMapImporting.h" + #include "StreetMapAssetTypeActions.h" + #include "StreetMap.h" +-#include "AssetData.h" +- ++#include "AssetRegistry/AssetData.h" ++#include "EditorFramework/AssetImportData.h" + + #define LOCTEXT_NAMESPACE "StreetMapImporting" + +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapAssetTypeActions.h b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapAssetTypeActions.h +index 294936d..50d6f2d 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapAssetTypeActions.h ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapAssetTypeActions.h +@@ -1,6 +1,4 @@ +-// Copyright 2017 Mike Fricker. All Rights Reserved. + #pragma once +- + #include "AssetTypeActions_Base.h" + + class FStreetMapAssetTypeActions : public FAssetTypeActions_Base +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapComponentDetails.cpp b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapComponentDetails.cpp +index a201f2a..f3365a9 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapComponentDetails.cpp ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapComponentDetails.cpp +@@ -1,29 +1,19 @@ +-// Copyright 2017 Mike Fricker. All Rights Reserved. +- +-#include "StreetMapImporting.h" +- + #include "StreetMapComponentDetails.h" +- +-#include "SlateBasics.h" ++#include "AssetToolsModule.h" + #include "RawMesh.h" + #include "PropertyEditorModule.h" + #include "DetailLayoutBuilder.h" + #include "DetailCategoryBuilder.h" + #include "DetailWidgetRow.h" +-#include "PropertyCustomizationHelpers.h" + #include "IDetailsView.h" + #include "IDetailCustomization.h" +-#include "AssetRegistryModule.h" +-#include "DlgPickAssetPath.h" +-#include "IDetailCustomization.h" +-#include "SNotificationList.h" +-#include "NotificationManager.h" +-#include "AssertionMacros.h" +- +- ++#include "AssetRegistry/AssetRegistryModule.h" ++#include "Dialogs/DlgPickAssetPath.h" ++#include "Widgets/Notifications/SNotificationList.h" ++#include "Framework/Notifications/NotificationManager.h" ++#include "Misc/AssertionMacros.h" + #include "StreetMapComponent.h" + +- + #define LOCTEXT_NAMESPACE "StreetMapComponentDetails" + + +@@ -254,9 +244,9 @@ FReply FStreetMapComponentDetails::OnCreateStaticMeshAssetClicked() + + const FStreetMapVertex& StreetMapVertex = RawMeshVertices[VertexIndex]; + +- FVector TangentX = StreetMapVertex.TangentX; +- FVector TangentZ = StreetMapVertex.TangentZ; +- FVector TangentY = (TangentX ^ TangentZ).GetSafeNormal(); ++ FVector3f TangentX = StreetMapVertex.TangentX; ++ FVector3f TangentZ = StreetMapVertex.TangentZ; ++ FVector3f TangentY = (TangentX ^ TangentZ).GetSafeNormal(); + + RawMesh.WedgeTangentX.Add(TangentX); + RawMesh.WedgeTangentY.Add(TangentY); +@@ -278,17 +268,16 @@ FReply FStreetMapComponentDetails::OnCreateStaticMeshAssetClicked() + if (RawMesh.VertexPositions.Num() > 3 && RawMesh.WedgeIndices.Num() > 3) + { + // Then find/create it. +- UPackage* Package = CreatePackage(NULL, *UserPackageName); ++ UPackage* Package = CreatePackage(*UserPackageName); + check(Package); + + // Create StaticMesh object + UStaticMesh* StaticMesh = NewObject(Package, MeshName, RF_Public | RF_Standalone); + StaticMesh->InitResources(); + +- StaticMesh->SetLightingGuid(); ++ StaticMesh->SetLightingGuid(FGuid::NewGuid()); + + // Add source to new StaticMesh +- // 4.23+ : SourceModels est prive, on passe par AddSourceModel() + FStaticMeshSourceModel* SrcModel = &StaticMesh->AddSourceModel(); + SrcModel->BuildSettings.bRecomputeNormals = false; + SrcModel->BuildSettings.bRecomputeTangents = false; +@@ -306,7 +295,7 @@ FReply FStreetMapComponentDetails::OnCreateStaticMeshAssetClicked() + StaticMesh->GetStaticMaterials().Add(FStaticMaterial(Material)); + } + +- //Set the Imported version before calling the build ++ // Set the Imported version before calling the build + StaticMesh->ImportVersion = EImportStaticMeshVersion::LastVersion; + + // Build mesh from source +@@ -325,7 +314,10 @@ FReply FStreetMapComponentDetails::OnCreateStaticMeshAssetClicked() + FNotificationInfo Info(FText::Format(LOCTEXT("StreetMapMeshConverted", "Successfully Converted Mesh"), FText::FromString(StaticMesh->GetName()))); + Info.ExpireDuration = 8.0f; + Info.bUseLargeFont = false; +- Info.Hyperlink = FSimpleDelegate::CreateLambda([=]() { FAssetEditorManager::Get().OpenEditorForAssets(TArray({ StaticMesh })); }); ++ ++ UAssetEditorSubsystem* AssetEditorSubsystem = GEditor->GetEditorSubsystem(); ++ Info.Hyperlink = FSimpleDelegate::CreateLambda([=]() { AssetEditorSubsystem->OpenEditorForAssets(TArray({ StaticMesh })); }); ++ + Info.HyperlinkText = FText::Format(LOCTEXT("OpenNewAnimationHyperlink", "Open {0}"), FText::FromString(StaticMesh->GetName())); + TSharedPtr Notification = FSlateNotificationManager::Get().AddNotification(Info); + if (Notification.IsValid()) +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapComponentDetails.h b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapComponentDetails.h +index 4967bbf..2fb24bc 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapComponentDetails.h ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapComponentDetails.h +@@ -1,7 +1,4 @@ +-// Copyright 2017 Mike Fricker. All Rights Reserved. +- + #pragma once +- + #include "IDetailCustomization.h" + + class FStreetMapComponentDetails : public IDetailCustomization +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapFactory.cpp b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapFactory.cpp +index 3a289bb..865d98d 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapFactory.cpp ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapFactory.cpp +@@ -1,11 +1,8 @@ +-// Copyright 2017 Mike Fricker. All Rights Reserved. +- +-#include "StreetMapImporting.h" + #include "StreetMapFactory.h" ++#include "EditorFramework/AssetImportData.h" + #include "OSMFile.h" + #include "StreetMap.h" + +- + // Latitude/longitude scale factor + // - https://en.wikipedia.org/wiki/Equator#Exact_length + static const double EarthCircumference = 40075036.0; +@@ -41,7 +38,7 @@ UObject* UStreetMapFactory::FactoryCreateText( UClass* Class, UObject* Parent, F + + if( !bLoadedOkay ) + { +- StreetMap->MarkPendingKill(); ++ StreetMap->MarkAsGarbage(); + StreetMap = nullptr; + } + +@@ -54,7 +51,7 @@ bool UStreetMapFactory::LoadFromOpenStreetMapXMLFile( UStreetMap* StreetMap, FSt + // OSM data is stored in meters. This is the scale factor to convert those units into UE4's native units (cm) + // Keep in mind that if this is changed, UStreetMapComponent sizes for roads may need to be updated too! + // @todo: We should make this scale factor customizable as an import option +- const float OSMToCentimetersScaleFactor = 100.0f; ++ const double OSMToCentimetersScaleFactor = 100.0; + + + // Converts latitude to meters +@@ -77,9 +74,9 @@ bool UStreetMapFactory::LoadFromOpenStreetMapXMLFile( UStreetMap* StreetMap, FSt + const double RelativeToLongitude ) -> FVector2D + { + // Applies Sanson-Flamsteed (sinusoidal) Projection (see http://www.progonos.com/furuti/MapProj/Normal/CartHow/HowSanson/howSanson.html) +- return FVector2D( +- (float)( ConvertLongitudeToMeters( Longitude, Latitude ) - ConvertLongitudeToMeters( RelativeToLongitude, Latitude ) ), +- (float)( ConvertLatitudeToMeters( Latitude ) - ConvertLatitudeToMeters( RelativeToLatitude ) ) ); ++ return FVector2d( ++ ConvertLongitudeToMeters( Longitude, Latitude ) - ConvertLongitudeToMeters( RelativeToLongitude, Latitude ), ++ ConvertLatitudeToMeters( Latitude ) - ConvertLatitudeToMeters( RelativeToLatitude ) ); + }; + + // Adds a Park to the street map using the OpenStreetMap data, flattening the road's coordinates into our map's space +@@ -212,6 +209,9 @@ bool UStreetMapFactory::LoadFromOpenStreetMapXMLFile( UStreetMap* StreetMap, FSt + case FOSMFile::EOSMWayType::Road: // @todo: Consider excluding "Road" from our data set, as it could be a highway that wasn't properly tagged in OSM yet + RoadType = EStreetMapRoadType::Street; + break; ++ ++ default: ++ RoadType = EStreetMapRoadType::Other; + } + + if( RoadType != EStreetMapRoadType::Other ) +@@ -334,7 +334,7 @@ bool UStreetMapFactory::LoadFromOpenStreetMapXMLFile( UStreetMap* StreetMap, FSt + // we get as much precision as possible. + const double RelativeToLatitude = OSMFile.AverageLatitude; + const double RelativeToLongitude = OSMFile.AverageLongitude; +- const FVector2D NodePos = ConvertLatLongToMetersRelative( ++ const FVector2d NodePos = ConvertLatLongToMetersRelative( + OSMNode.Latitude, + OSMNode.Longitude, + RelativeToLatitude, +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapFactory.h b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapFactory.h +index a9df2ff..1b86bd4 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapFactory.h ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapFactory.h +@@ -1,10 +1,7 @@ +-// Copyright 2017 Mike Fricker. All Rights Reserved. + #pragma once +- + #include "Factories/Factory.h" + #include "StreetMapFactory.generated.h" + +- + /** + * Import factory object for OpenStreetMap assets + */ +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapImporting.Build.cs b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapImporting.Build.cs +index d353906..3f2d3bc 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapImporting.Build.cs ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapImporting.Build.cs +@@ -7,8 +7,6 @@ namespace UnrealBuildTool.Rules + public StreetMapImporting(ReadOnlyTargetRules Target) + : base(Target) + { +- PrivatePCHHeaderFile = "StreetMapImporting.h"; +- + PrivateDependencyModuleNames.AddRange( + new string[] { + "Core", +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapImporting.cpp b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapImporting.cpp +index 4115829..86460f9 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapImporting.cpp ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapImporting.cpp +@@ -1,12 +1,9 @@ +-// Copyright 2017 Mike Fricker. All Rights Reserved. +- + #include "StreetMapImporting.h" + #include "StreetMapAssetTypeActions.h" +-#include "ModuleManager.h" ++#include "Modules/ModuleManager.h" + #include "StreetMapStyle.h" + #include "StreetMapComponentDetails.h" + +- + class FStreetMapImportingModule : public IModuleInterface + { + +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapImporting.h b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapImporting.h +index 07df060..45dcbb0 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapImporting.h ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapImporting.h +@@ -1,5 +1,3 @@ +-// Copyright 2017 Mike Fricker. All Rights Reserved. + #pragma once + +-#include "UnrealEd.h" + +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapReimportFactory.cpp b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapReimportFactory.cpp +index 94b1bed..37fb947 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapReimportFactory.cpp ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapReimportFactory.cpp +@@ -1,9 +1,6 @@ +-// Copyright 2017 Mike Fricker. All Rights Reserved. +- +-#include "StreetMapImporting.h" + #include "StreetMapReimportFactory.h" + #include "StreetMap.h" +- ++#include "EditorFramework/AssetImportData.h" + + UStreetMapReimportFactory::UStreetMapReimportFactory(const FObjectInitializer& ObjectInitializer) + : Super(ObjectInitializer) +@@ -17,8 +14,9 @@ bool UStreetMapReimportFactory::CanReimport( UObject* Obj, TArray& OutF + if( StreetMap != nullptr ) + { + OutFilenames.Add( StreetMap->AssetImportData->GetFirstFilename() ); ++ return true; + } +- return true; ++ return false; + } + + +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapReimportFactory.h b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapReimportFactory.h +index 1218746..1f1e587 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapReimportFactory.h ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapReimportFactory.h +@@ -1,11 +1,8 @@ +-// Copyright 2017 Mike Fricker. All Rights Reserved. + #pragma once +- + #include "StreetMapFactory.h" + #include "EditorReimportHandler.h" + #include "StreetMapReimportFactory.generated.h" + +- + /** + * Import factory object for OpenStreetMap assets + */ +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapStyle.cpp b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapStyle.cpp +index ed9df1b..950813c 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapStyle.cpp ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapStyle.cpp +@@ -1,9 +1,7 @@ +-// Copyright 2017 Mike Fricker. All Rights Reserved. +- +-#include "StreetMapImporting.h" + #include "StreetMapStyle.h" +-#include "SlateStyle.h" +-#include "IPluginManager.h" ++#include "Styling/SlateStyle.h" ++#include "Styling/SlateStyleRegistry.h" ++#include "Interfaces/IPluginManager.h" + + #define IMAGE_BRUSH( RelativePath, ... ) FSlateImageBrush( FStreetMapStyle::InContent( RelativePath, ".png" ), __VA_ARGS__ ) + +@@ -13,7 +11,7 @@ FString FStreetMapStyle::InContent(const FString& RelativePath, const ANSICHAR* + return (IconsDir / RelativePath) + Extension; + } + +-TSharedPtr< FSlateStyleSet > FStreetMapStyle::StyleSet = NULL; ++TSharedPtr< FSlateStyleSet > FStreetMapStyle::StyleSet = nullptr; + TSharedPtr< class ISlateStyle > FStreetMapStyle::Get() { return StyleSet; } + + void FStreetMapStyle::Initialize() +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapStyle.h b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapStyle.h +index 831666d..bfaf846 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapImporting/StreetMapStyle.h ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapImporting/StreetMapStyle.h +@@ -1,5 +1,3 @@ +-// Copyright 2017 Mike Fricker. All Rights Reserved. +- + #pragma once + + /** StreetMap Editor Style Helper Class. */ +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapRuntime/PolygonTools.cpp b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapRuntime/PolygonTools.cpp +index 5f115cb..d2ca47c 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapRuntime/PolygonTools.cpp ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapRuntime/PolygonTools.cpp +@@ -1,9 +1,5 @@ +-// Copyright 2017 Mike Fricker. All Rights Reserved. +- +-#include "StreetMapRuntime.h" + #include "PolygonTools.h" + +- + // Based off "Efficient Polygon Triangulation" algorithm by John W. Ratcliff (http://flipcode.net/archives/Efficient_Polygon_Triangulation.shtml) + bool FPolygonTools::TriangulatePolygon( const TArray& Polygon, TArray& TempIndices, TArray& TriangulatedIndices, bool& OutWindsClockwise ) + { +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapRuntime/PolygonTools.h b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapRuntime/PolygonTools.h +index 72e2bed..dd028c0 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapRuntime/PolygonTools.h ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapRuntime/PolygonTools.h +@@ -1,9 +1,7 @@ +-// Copyright 2017 Mike Fricker. All Rights Reserved. + #pragma once + + class FPolygonTools + { +- + public: + + /** Triangulate a polygon given a list of contour points, then places results as indices into the original polygon array. Does not support polygons with holes. */ +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapRuntime/Public/StreetMap.h b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapRuntime/Public/StreetMap.h +index c89f500..fba6972 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapRuntime/Public/StreetMap.h ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapRuntime/Public/StreetMap.h +@@ -1,10 +1,7 @@ +-// Copyright 2017 Mike Fricker. All Rights Reserved. +- + #pragma once +- ++#include "Math/MathFwd.h" + #include "StreetMap.generated.h" + +- + USTRUCT(BlueprintType) + struct STREETMAPRUNTIME_API FStreetMapCollisionSettings + { +@@ -44,17 +41,17 @@ public: + + /** Roads base vertical offset */ + UPROPERTY(Category = StreetMap, EditAnywhere, meta = (ClampMin = "0", UIMin = "0"), DisplayName = "Road Vertical Offset") +- float RoadOffesetZ; ++ float RoadOffesetZ; + + /** if true buildings mesh will be 3D instead of flat representation. */ + UPROPERTY(Category = StreetMap, EditAnywhere, DisplayName = "Create 3D Buildings") +- uint32 bWant3DBuildings : 1; ++ uint32 bWant3DBuildings : 1; + + /** building level floor conversion factor in centimeters + @todo: harmonize with OSMToCentimetersScaleFactor refactoring + */ + UPROPERTY(Category = StreetMap, EditAnywhere, DisplayName = "Building Level Floor Factor") +- float BuildingLevelFloorFactor = 300.0f; ++ float BuildingLevelFloorFactor = 300.0f; + + /** + * If true, buildings mesh will receive light information. +@@ -65,48 +62,47 @@ public: + + /** Streets thickness */ + UPROPERTY(Category = StreetMap, EditAnywhere, meta = (ClampMin = "0", UIMin = "0")) +- float StreetThickness; ++ float StreetThickness; + + /** Street vertex color */ + UPROPERTY(Category = StreetMap, EditAnywhere) +- FLinearColor StreetColor; ++ FLinearColor StreetColor; + + /** Major road thickness */ + UPROPERTY(Category = StreetMap, EditAnywhere, meta = (ClampMin = "0", UIMin = "0")) +- float MajorRoadThickness; ++ float MajorRoadThickness; + + /** Major road vertex color */ + UPROPERTY(Category = StreetMap, EditAnywhere) +- FLinearColor MajorRoadColor; ++ FLinearColor MajorRoadColor; + + /** Highway thickness */ + UPROPERTY(Category = StreetMap, EditAnywhere, meta = (ClampMin = "0", UIMin = "0")) +- float HighwayThickness; ++ float HighwayThickness; + + /** Highway vertex color */ + UPROPERTY(Category = StreetMap, EditAnywhere) +- FLinearColor HighwayColor; ++ FLinearColor HighwayColor; + + /** Streets Thickness */ + UPROPERTY(Category = StreetMap, EditAnywhere, meta = (ClampMin = "0", UIMin = "0")) +- float BuildingBorderThickness; ++ float BuildingBorderThickness; + + /** Building border vertex color */ + UPROPERTY(Category = StreetMap, EditAnywhere) +- FLinearColor BuildingBorderLinearColor; ++ FLinearColor BuildingBorderLinearColor; + + /** Buildings border vertical offset */ + UPROPERTY(Category = StreetMap, EditAnywhere, meta = (ClampMin = "0", UIMin = "0")) +- float BuildingBorderZ; +- +- +- /** Water vertex color */ ++ float BuildingBorderZ; ++ ++ /** Water vertex color */ + UPROPERTY(Category = StreetMap, EditAnywhere) +- FLinearColor WaterColor; +- +- /** Park vertex color */ ++ FLinearColor WaterColor; ++ ++ /** Park vertex color */ + UPROPERTY(Category = StreetMap, EditAnywhere) +- FLinearColor ParkColor; ++ FLinearColor ParkColor; + + + FStreetMapMeshBuildSettings() : +@@ -122,11 +118,10 @@ public: + BuildingBorderThickness(20.0f), + BuildingBorderLinearColor(0.85f, 0.85f, 0.85f), + BuildingBorderZ(10.0f), +- ParkColor(0.00f, 0.55f, 0.27f), +- WaterColor(0.26f, 0.75f, 0.98f) ++ WaterColor(0.26f, 0.75f, 0.98f), ++ ParkColor(0.00f, 0.55f, 0.27f) + { + } +- + }; + + +@@ -222,6 +217,17 @@ struct STREETMAPRUNTIME_API FStreetMapRoad + { + return bIsOneWay == 1 ? true : false; + } ++ ++ FStreetMapRoad() : ++ RoadName(), ++ RoadType(EStreetMapRoadType::Street), ++ NodeIndices(), ++ RoadPoints(), ++ BoundsMin(FVector2D::ZeroVector), ++ BoundsMax(FVector2D::ZeroVector), ++ bIsOneWay(0) ++ { ++ } + }; + + +@@ -234,11 +240,11 @@ struct STREETMAPRUNTIME_API FStreetMapRoadRef + + /** Index of road in the list of all roads in this street map */ + UPROPERTY( Category=StreetMap, EditAnywhere ) +- int32 RoadIndex; ++ int32 RoadIndex = INDEX_NONE; + + /** Index of the point along road where this node exists */ + UPROPERTY( Category=StreetMap, EditAnywhere ) +- int32 RoadPointIndex; ++ int32 RoadPointIndex = INDEX_NONE; + }; + + +@@ -297,29 +303,29 @@ struct STREETMAPRUNTIME_API FStreetMapBuilding + + /** Height of the building in meters (if known, otherwise zero) */ + UPROPERTY( Category=StreetMap, EditAnywhere ) +- float Height; ++ double Height = 0.0; + + /** Levels of the building (if known, otherwise zero) */ + UPROPERTY(Category = StreetMap, EditAnywhere) +- int BuildingLevels; +- +- /** The amenity of the building */ +- UPROPERTY( Category=StreetMap, EditAnywhere, BlueprintReadWrite ) ++ int BuildingLevels = 0; ++ ++ /** The amenity of the building */ ++ UPROPERTY( Category=StreetMap, EditAnywhere, BlueprintReadWrite ) + FString Amenity; +- +- /** The building type */ +- UPROPERTY( Category=StreetMap, EditAnywhere, BlueprintReadWrite ) ++ ++ /** The building type */ ++ UPROPERTY( Category=StreetMap, EditAnywhere, BlueprintReadWrite ) + FString Building; + + // @todo: Performance: Bounding information could be computed at load time if we want to avoid the memory cost of storing it + + /** 2D bounds (min) of this building's points */ + UPROPERTY( Category=StreetMap, EditAnywhere ) +- FVector2D BoundsMin; ++ FVector2D BoundsMin = FVector2D::ZeroVector; + + /** 2D bounds (max) of this building's points */ + UPROPERTY( Category=StreetMap, EditAnywhere ) +- FVector2D BoundsMax; ++ FVector2D BoundsMax = FVector2D::ZeroVector; + }; + + +@@ -342,11 +348,11 @@ struct STREETMAPRUNTIME_API FStreetMapWater + + /** 2D bounds (min) of this water's points */ + UPROPERTY( Category=StreetMap, EditAnywhere ) +- FVector2D BoundsMin; ++ FVector2D BoundsMin = FVector2D::ZeroVector; + + /** 2D bounds (max) of this water's points */ + UPROPERTY( Category=StreetMap, EditAnywhere ) +- FVector2D BoundsMax; ++ FVector2D BoundsMax = FVector2D::ZeroVector; + }; + + USTRUCT( BlueprintType ) +@@ -366,11 +372,11 @@ struct STREETMAPRUNTIME_API FStreetMapPark + + /** 2D bounds (min) of this water's points */ + UPROPERTY( Category=StreetMap, EditAnywhere ) +- FVector2D BoundsMin; ++ FVector2D BoundsMin = FVector2D::ZeroVector; + + /** 2D bounds (max) of this water's points */ + UPROPERTY( Category=StreetMap, EditAnywhere ) +- FVector2D BoundsMax; ++ FVector2D BoundsMax = FVector2D::ZeroVector; + }; + + +@@ -386,7 +392,10 @@ public: + UStreetMap(); + + // UObject overrides +- virtual void GetAssetRegistryTags( TArray& OutTags ) const override; ++ // Portage 5.5 : la surcharge TArray& est depreciee (C4996) et ++ // disparait a la version suivante du moteur. FAssetRegistryTagsContext est declare ++ // par UObject/Object.h, aucun include supplementaire n'est necessaire ici. ++ virtual void GetAssetRegistryTags( FAssetRegistryTagsContext Context ) const override; + + /** Gets the roads in this street map (read only) */ + const TArray& GetRoads() const +@@ -681,8 +690,6 @@ inline float FStreetMapRoad::FindPositionAlongRoadForNode( const class UStreetMa + { + float CurrentPointPositionAlongRoad = 0.0f; + +- bool bFoundLocation = false; +- const int32 NumPoints = RoadPoints.Num(); + for( int32 CurrentPointIndex = 0; CurrentPointIndex < PointIndexForNode; ++CurrentPointIndex ) + { + const FVector2D CurrentPointLocation = RoadPoints[ CurrentPointIndex ]; +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapRuntime/Public/StreetMapActor.h b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapRuntime/Public/StreetMapActor.h +index e8bae48..7435f91 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapRuntime/Public/StreetMapActor.h ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapRuntime/Public/StreetMapActor.h +@@ -1,7 +1,4 @@ +-// Copyright 2017 Mike Fricker. All Rights Reserved. +- + #pragma once +- + #include "StreetMapActor.generated.h" + + /** An actor that renders a street map mesh component */ +@@ -12,7 +9,7 @@ class STREETMAPRUNTIME_API AStreetMapActor : public AActor + + /** Component that represents a section of street map roads and buildings */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "StreetMap") +- class UStreetMapComponent* StreetMapComponent; ++ class UStreetMapComponent* StreetMapComponent; + + public: + FORCEINLINE class UStreetMapComponent* GetStreetMapComponent() { return StreetMapComponent; } +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapRuntime/Public/StreetMapComponent.h b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapRuntime/Public/StreetMapComponent.h +index ea7ebb1..875a1d1 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapRuntime/Public/StreetMapComponent.h ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapRuntime/Public/StreetMapComponent.h +@@ -1,14 +1,11 @@ +-// Copyright 2017 Mike Fricker. All Rights Reserved. + #pragma once +- + #include "StreetMap.h" + #include "Components/MeshComponent.h" + #include "Interfaces/Interface_CollisionDataProvider.h" +-#include "StreetMapSceneProxy.h" ++#include "MaterialDomain.h" ++#include "../StreetMapSceneProxy.h" + #include "StreetMapComponent.generated.h" + +- +- + class UBodySetup; + + /** +@@ -141,10 +138,10 @@ protected: + void GenerateMesh(); + + /** Adds a 2D line to the raw mesh */ +- void AddThick2DLine(const FVector2D Start, const FVector2D End, const float Z, const float Thickness, const FColor& StartColor, const FColor& EndColor, FBox& MeshBoundingBox); ++ void AddThick2DLine(const FVector2f Start, const FVector2f End, const float Z, const float Thickness, const FColor& StartColor, const FColor& EndColor, FBox3f& MeshBoundingBox); + + /** Adds 3D triangles to the raw mesh */ +- void AddTriangles(const TArray& Points, const TArray& PointIndices, const FVector& ForwardVector, const FVector& UpVector, const FColor& Color, FBox& MeshBoundingBox); ++ void AddTriangles(const TArray& Points, const TArray& PointIndices, const FVector3f& ForwardVector, const FVector3f& UpVector, const FColor& Color, FBox3f& MeshBoundingBox); + + + protected: +@@ -171,18 +168,17 @@ protected: + + /** Cached raw mesh vertices */ + UPROPERTY() +- TArray< struct FStreetMapVertex > Vertices; ++ TArray< struct FStreetMapVertex > Vertices; + + /** Cached raw mesh triangle indices */ + UPROPERTY() +- TArray< uint32 > Indices; ++ TArray< uint32 > Indices; + + /** Cached bounding box */ + UPROPERTY() +- FBoxSphereBounds CachedLocalBounds; ++ FBoxSphereBounds CachedLocalBounds; + + /** Cached StreetMap DefaultMaterial */ + UPROPERTY() +- UMaterialInterface* StreetMapDefaultMaterial; +- ++ UMaterialInterface* StreetMapDefaultMaterial; + }; +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapRuntime/StreetMap.cpp b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapRuntime/StreetMap.cpp +index a998c3a..537e8bb 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapRuntime/StreetMap.cpp ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapRuntime/StreetMap.cpp +@@ -1,14 +1,11 @@ +-// Copyright 2017 Mike Fricker. All Rights Reserved. +- +-#include "StreetMapRuntime.h" + #include "StreetMap.h" ++#include "UObject/AssetRegistryTagsContext.h" + #include "EditorFramework/AssetImportData.h" + #include "PolygonTools.h" +-#include "Runtime/Engine/Classes/Engine/StaticMesh.h" +-#include "Runtime/Engine/Public/StaticMeshResources.h" ++#include "Engine/StaticMesh.h" ++#include "StaticMeshResources.h" + #include "PhysicsEngine/BodySetup.h" + +- + UStreetMap::UStreetMap() + { + #if WITH_EDITORONLY_DATA +@@ -20,16 +17,18 @@ UStreetMap::UStreetMap() + } + + +-void UStreetMap::GetAssetRegistryTags( TArray& OutTags ) const ++// Portage 5.5 : voir StreetMap.h. Meme corps, la seule difference est que le tag est ++// pousse dans le contexte au lieu d'etre ajoute a un tableau fourni par l'appelant. ++void UStreetMap::GetAssetRegistryTags( FAssetRegistryTagsContext Context ) const + { + #if WITH_EDITORONLY_DATA + if( AssetImportData ) + { +- OutTags.Add( FAssetRegistryTag( SourceFileTagName(), AssetImportData->GetSourceData().ToJson(), FAssetRegistryTag::TT_Hidden ) ); ++ Context.AddTag( FAssetRegistryTag( SourceFileTagName(), AssetImportData->GetSourceData().ToJson(), FAssetRegistryTag::TT_Hidden ) ); + } + #endif + +- Super::GetAssetRegistryTags( OutTags ); ++ Super::GetAssetRegistryTags( Context ); + } + + +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapRuntime/StreetMapActor.cpp b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapRuntime/StreetMapActor.cpp +index 735f8a0..991f6b3 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapRuntime/StreetMapActor.cpp ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapRuntime/StreetMapActor.cpp +@@ -1,10 +1,6 @@ +-// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved. +- +-#include "StreetMapRuntime.h" + #include "StreetMapActor.h" + #include "StreetMapComponent.h" + +- + AStreetMapActor::AStreetMapActor(const FObjectInitializer& ObjectInitializer) + : Super(ObjectInitializer) + { +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapRuntime/StreetMapComponent.cpp b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapRuntime/StreetMapComponent.cpp +index fa8f9d4..6b3a669 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapRuntime/StreetMapComponent.cpp ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapRuntime/StreetMapComponent.cpp +@@ -1,21 +1,16 @@ +-// Copyright 2017 Mike Fricker. All Rights Reserved. +- +-#include "StreetMapRuntime.h" + #include "StreetMapComponent.h" + #include "StreetMapSceneProxy.h" +-#include "Runtime/Engine/Classes/Engine/StaticMesh.h" +-#include "Runtime/Engine/Public/StaticMeshResources.h" ++#include "NavigationSystem.h" ++#include "Engine/StaticMesh.h" ++#include "StaticMeshResources.h" + #include "PolygonTools.h" +- + #include "PhysicsEngine/BodySetup.h" + + #if WITH_EDITOR +-#include "ModuleManager.h" ++#include "Modules/ModuleManager.h" + #include "PropertyEditorModule.h" + #endif //WITH_EDITOR + +- +- + UStreetMapComponent::UStreetMapComponent(const FObjectInitializer& ObjectInitializer) + : Super(ObjectInitializer), + StreetMap(nullptr), +@@ -242,7 +237,7 @@ void UStreetMapComponent::GenerateMesh() + + if( StreetMap != nullptr ) + { +- FBox MeshBoundingBox; ++ FBox3f MeshBoundingBox; + MeshBoundingBox.Init(); + + const auto& Roads = StreetMap->GetRoads(); +@@ -279,8 +274,8 @@ void UStreetMapComponent::GenerateMesh() + for( int32 PointIndex = 0; PointIndex < Road.RoadPoints.Num() - 1; ++PointIndex ) + { + AddThick2DLine( +- Road.RoadPoints[ PointIndex ], +- Road.RoadPoints[ PointIndex + 1 ], ++ FVector2f(Road.RoadPoints[ PointIndex ]), ++ FVector2f(Road.RoadPoints[ PointIndex + 1 ]), + RoadZ, + RoadThickness, + RoadColor, +@@ -291,7 +286,7 @@ void UStreetMapComponent::GenerateMesh() + + TArray< int32 > TempIndices; + TArray< int32 > TriangulatedVertexIndices; +- TArray< FVector > TempPoints; ++ TArray< FVector3f > TempPoints; + for( int32 BuildingIndex = 0; BuildingIndex < Buildings.Num(); ++BuildingIndex ) + { + const auto& Building = Buildings[ BuildingIndex ]; +@@ -323,12 +318,12 @@ void UStreetMapComponent::GenerateMesh() + + // Top of building + { +- TempPoints.SetNum( Building.BuildingPoints.Num(), false ); ++ TempPoints.SetNum( Building.BuildingPoints.Num(), EAllowShrinking::No ); + for( int32 PointIndex = 0; PointIndex < Building.BuildingPoints.Num(); ++PointIndex ) + { +- TempPoints[ PointIndex ] = FVector( Building.BuildingPoints[ ( Building.BuildingPoints.Num() - PointIndex ) - 1 ], BuildingFillZ ); ++ TempPoints[ PointIndex ] = FVector3f( FVector2f(Building.BuildingPoints[ ( Building.BuildingPoints.Num() - PointIndex ) - 1 ]), BuildingFillZ ); + } +- AddTriangles( TempPoints, TriangulatedVertexIndices, FVector::ForwardVector, FVector::UpVector, BuildingFillColor, MeshBoundingBox ); ++ AddTriangles( TempPoints, TriangulatedVertexIndices, FVector3f::ForwardVector, FVector3f::UpVector, BuildingFillColor, MeshBoundingBox ); + } + + if( bWant3DBuildings && (Building.Height > KINDA_SMALL_NUMBER || Building.BuildingLevels > 0) ) +@@ -341,22 +336,22 @@ void UStreetMapComponent::GenerateMesh() + { + const int32 RightPointIndex = ( LeftPointIndex + 1 ) % Building.BuildingPoints.Num(); + +- TempPoints.SetNum( 4, false ); ++ TempPoints.SetNum( 4, EAllowShrinking::No ); + + const int32 TopLeftVertexIndex = 0; +- TempPoints[ TopLeftVertexIndex ] = FVector( Building.BuildingPoints[ WindsClockwise ? RightPointIndex : LeftPointIndex ], BuildingFillZ ); ++ TempPoints[ TopLeftVertexIndex ] = FVector3f( FVector2f(Building.BuildingPoints[ WindsClockwise ? RightPointIndex : LeftPointIndex ]), BuildingFillZ ); + + const int32 TopRightVertexIndex = 1; +- TempPoints[ TopRightVertexIndex ] = FVector( Building.BuildingPoints[ WindsClockwise ? LeftPointIndex : RightPointIndex ], BuildingFillZ ); ++ TempPoints[ TopRightVertexIndex ] = FVector3f( FVector2f(Building.BuildingPoints[ WindsClockwise ? LeftPointIndex : RightPointIndex ]), BuildingFillZ ); + + const int32 BottomRightVertexIndex = 2; +- TempPoints[ BottomRightVertexIndex ] = FVector( Building.BuildingPoints[ WindsClockwise ? LeftPointIndex : RightPointIndex ], 0.0f ); ++ TempPoints[ BottomRightVertexIndex ] = FVector3f( FVector2f(Building.BuildingPoints[ WindsClockwise ? LeftPointIndex : RightPointIndex ]), 0.0f ); + + const int32 BottomLeftVertexIndex = 3; +- TempPoints[ BottomLeftVertexIndex ] = FVector( Building.BuildingPoints[ WindsClockwise ? RightPointIndex : LeftPointIndex ], 0.0f ); ++ TempPoints[ BottomLeftVertexIndex ] = FVector3f( FVector2f(Building.BuildingPoints[ WindsClockwise ? RightPointIndex : LeftPointIndex ]), 0.0f ); + + +- TempIndices.SetNum( 6, false ); ++ TempIndices.SetNum( 6, EAllowShrinking::No ); + + TempIndices[ 0 ] = BottomLeftVertexIndex; + TempIndices[ 1 ] = TopLeftVertexIndex; +@@ -366,9 +361,9 @@ void UStreetMapComponent::GenerateMesh() + TempIndices[ 4 ] = TopLeftVertexIndex; + TempIndices[ 5 ] = TopRightVertexIndex; + +- const FVector FaceNormal = FVector::CrossProduct( ( TempPoints[ 0 ] - TempPoints[ 2 ] ).GetSafeNormal(), ( TempPoints[ 0 ] - TempPoints[ 1 ] ).GetSafeNormal() ); +- const FVector ForwardVector = FVector::UpVector; +- const FVector UpVector = FaceNormal; ++ const FVector3f FaceNormal = FVector3f::CrossProduct( ( TempPoints[ 0 ] - TempPoints[ 2 ] ).GetSafeNormal(), ( TempPoints[ 0 ] - TempPoints[ 1 ] ).GetSafeNormal() ); ++ const FVector3f ForwardVector = FVector3f::UpVector; ++ const FVector3f UpVector = FaceNormal; + AddTriangles( TempPoints, TempIndices, ForwardVector, UpVector, BuildingFillColor, MeshBoundingBox ); + } + } +@@ -381,10 +376,10 @@ void UStreetMapComponent::GenerateMesh() + const FVector2D Point = Building.BuildingPoints[ PointIndex ]; + + FStreetMapVertex& NewVertex = *new( this->Vertices )FStreetMapVertex(); +- NewVertex.Position = FVector( Point, 0.0f ); +- NewVertex.TextureCoordinate = FVector2D( 0.0f, 0.0f ); // NOTE: We're not using texture coordinates for anything yet +- NewVertex.TangentX = FVector::ForwardVector; // NOTE: Tangents aren't important for these unlit buildings +- NewVertex.TangentZ = FVector::UpVector; ++ NewVertex.Position = FVector3f( FVector2f(Point), 0.0f ); ++ NewVertex.TextureCoordinate = FVector2f( 0.0f, 0.0f ); // NOTE: We're not using texture coordinates for anything yet ++ NewVertex.TangentX = FVector3f::ForwardVector; // NOTE: Tangents aren't important for these unlit buildings ++ NewVertex.TangentZ = FVector3f::UpVector; + NewVertex.Color = BuildingFillColor; + + MeshBoundingBox += NewVertex.Position; +@@ -423,8 +418,8 @@ void UStreetMapComponent::GenerateMesh() + for( int32 PointIndex = 0; PointIndex < Building.BuildingPoints.Num(); ++PointIndex ) + { + AddThick2DLine( +- Building.BuildingPoints[ PointIndex ], +- Building.BuildingPoints[ ( PointIndex + 1 ) % Building.BuildingPoints.Num() ], ++ FVector2f(Building.BuildingPoints[ PointIndex ]), ++ FVector2f(Building.BuildingPoints[ ( PointIndex + 1 ) % Building.BuildingPoints.Num() ]), + BuildingBorderZ, + BuildingBorderThickness, // Thickness + BuildingBorderColor, +@@ -438,7 +433,7 @@ void UStreetMapComponent::GenerateMesh() + + TArray< int32 > TempIndicesW; + TArray< int32 > TriangulatedVertexIndicesW; +- TArray< FVector > TempPointsW; ++ TArray< FVector3f > TempPointsW; + for( int32 WaterIndex = 0; WaterIndex < Waters.Num(); ++WaterIndex ) + { + const auto& Water = Waters[ WaterIndex ]; +@@ -462,12 +457,12 @@ void UStreetMapComponent::GenerateMesh() + + // Top of Water + { +- TempPointsW.SetNum( Water.WaterPoints.Num(), false ); ++ TempPointsW.SetNum( Water.WaterPoints.Num(), EAllowShrinking::No ); + for( int32 PointIndex = 0; PointIndex < Water.WaterPoints.Num(); ++PointIndex ) + { +- TempPointsW[ PointIndex ] = FVector( Water.WaterPoints[ ( Water.WaterPoints.Num() - PointIndex ) - 1 ], WaterFillZ ); ++ TempPointsW[ PointIndex ] = FVector3f( FVector2f(Water.WaterPoints[ ( Water.WaterPoints.Num() - PointIndex ) - 1 ]), WaterFillZ ); + } +- AddTriangles( TempPointsW, TriangulatedVertexIndicesW, FVector::ForwardVector, FVector::UpVector, WaterColor, MeshBoundingBox ); ++ AddTriangles( TempPointsW, TriangulatedVertexIndicesW, FVector3f::ForwardVector, FVector3f::UpVector, WaterColor, MeshBoundingBox ); + } + + } +@@ -485,7 +480,7 @@ void UStreetMapComponent::GenerateMesh() + + TArray< int32 > TempIndicesP; + TArray< int32 > TriangulatedVertexIndicesP; +- TArray< FVector > TempPointsP; ++ TArray< FVector3f > TempPointsP; + for( int32 ParkIndex = 0; ParkIndex < Parks.Num(); ++ParkIndex ) + { + const auto& Park = Parks[ ParkIndex ]; +@@ -509,12 +504,12 @@ void UStreetMapComponent::GenerateMesh() + + // Top of Park + { +- TempPointsP.SetNum( Park.ParkPoints.Num(), false ); ++ TempPointsP.SetNum( Park.ParkPoints.Num(), EAllowShrinking::No ); + for( int32 PointIndex = 0; PointIndex < Park.ParkPoints.Num(); ++PointIndex ) + { +- TempPointsP[ PointIndex ] = FVector( Park.ParkPoints[ ( Park.ParkPoints.Num() - PointIndex ) - 1 ], ParkFillZ ); ++ TempPointsP[ PointIndex ] = FVector3f( FVector2f(Park.ParkPoints[ ( Park.ParkPoints.Num() - PointIndex ) - 1 ]), ParkFillZ ); + } +- AddTriangles( TempPointsP, TriangulatedVertexIndicesP, FVector::ForwardVector, FVector::UpVector, ParkColor, MeshBoundingBox ); ++ AddTriangles( TempPointsP, TriangulatedVertexIndicesP, FVector3f::ForwardVector, FVector3f::UpVector, ParkColor, MeshBoundingBox ); + } + + } +@@ -527,7 +522,7 @@ void UStreetMapComponent::GenerateMesh() + // Park border + } + +- CachedLocalBounds = MeshBoundingBox; ++ CachedLocalBounds = FBox(MeshBoundingBox); + } + } + +@@ -646,46 +641,46 @@ FBoxSphereBounds UStreetMapComponent::CalcBounds( const FTransform& LocalToWorld + } + + +-void UStreetMapComponent::AddThick2DLine( const FVector2D Start, const FVector2D End, const float Z, const float Thickness, const FColor& StartColor, const FColor& EndColor, FBox& MeshBoundingBox ) ++void UStreetMapComponent::AddThick2DLine( const FVector2f Start, const FVector2f End, const float Z, const float Thickness, const FColor& StartColor, const FColor& EndColor, FBox3f& MeshBoundingBox ) + { + const float HalfThickness = Thickness * 0.5f; + +- const FVector2D LineDirection = ( End - Start ).GetSafeNormal(); +- const FVector2D RightVector( -LineDirection.Y, LineDirection.X ); ++ const FVector2f LineDirection = ( End - Start ).GetSafeNormal(); ++ const FVector2f RightVector( -LineDirection.Y, LineDirection.X ); + + const int32 BottomLeftVertexIndex = Vertices.Num(); + FStreetMapVertex& BottomLeftVertex = *new( Vertices )FStreetMapVertex(); +- BottomLeftVertex.Position = FVector( Start - RightVector * HalfThickness, Z ); +- BottomLeftVertex.TextureCoordinate = FVector2D( 0.0f, 0.0f ); +- BottomLeftVertex.TangentX = FVector( LineDirection, 0.0f ); +- BottomLeftVertex.TangentZ = FVector::UpVector; ++ BottomLeftVertex.Position = FVector3f( Start - RightVector * HalfThickness, Z ); ++ BottomLeftVertex.TextureCoordinate = FVector2f( 0.0f, 0.0f ); ++ BottomLeftVertex.TangentX = FVector3f( LineDirection, 0.0f ); ++ BottomLeftVertex.TangentZ = FVector3f::UpVector; + BottomLeftVertex.Color = StartColor; + MeshBoundingBox += BottomLeftVertex.Position; + + const int32 BottomRightVertexIndex = Vertices.Num(); + FStreetMapVertex& BottomRightVertex = *new( Vertices )FStreetMapVertex(); +- BottomRightVertex.Position = FVector( Start + RightVector * HalfThickness, Z ); +- BottomRightVertex.TextureCoordinate = FVector2D( 1.0f, 0.0f ); +- BottomRightVertex.TangentX = FVector( LineDirection, 0.0f ); +- BottomRightVertex.TangentZ = FVector::UpVector; ++ BottomRightVertex.Position = FVector3f( Start + RightVector * HalfThickness, Z ); ++ BottomRightVertex.TextureCoordinate = FVector2f( 1.0f, 0.0f ); ++ BottomRightVertex.TangentX = FVector3f( LineDirection, 0.0f ); ++ BottomRightVertex.TangentZ = FVector3f::UpVector; + BottomRightVertex.Color = StartColor; + MeshBoundingBox += BottomRightVertex.Position; + + const int32 TopRightVertexIndex = Vertices.Num(); + FStreetMapVertex& TopRightVertex = *new( Vertices )FStreetMapVertex(); +- TopRightVertex.Position = FVector( End + RightVector * HalfThickness, Z ); +- TopRightVertex.TextureCoordinate = FVector2D( 1.0f, 1.0f ); +- TopRightVertex.TangentX = FVector( LineDirection, 0.0f ); +- TopRightVertex.TangentZ = FVector::UpVector; ++ TopRightVertex.Position = FVector3f( End + RightVector * HalfThickness, Z ); ++ TopRightVertex.TextureCoordinate = FVector2f( 1.0f, 1.0f ); ++ TopRightVertex.TangentX = FVector3f( LineDirection, 0.0f ); ++ TopRightVertex.TangentZ = FVector3f::UpVector; + TopRightVertex.Color = EndColor; + MeshBoundingBox += TopRightVertex.Position; + + const int32 TopLeftVertexIndex = Vertices.Num(); + FStreetMapVertex& TopLeftVertex = *new( Vertices )FStreetMapVertex(); +- TopLeftVertex.Position = FVector( End - RightVector * HalfThickness, Z ); +- TopLeftVertex.TextureCoordinate = FVector2D( 0.0f, 1.0f ); +- TopLeftVertex.TangentX = FVector( LineDirection, 0.0f ); +- TopLeftVertex.TangentZ = FVector::UpVector; ++ TopLeftVertex.Position = FVector3f( End - RightVector * HalfThickness, Z ); ++ TopLeftVertex.TextureCoordinate = FVector2f( 0.0f, 1.0f ); ++ TopLeftVertex.TangentX = FVector3f( LineDirection, 0.0f ); ++ TopLeftVertex.TangentZ = FVector3f::UpVector; + TopLeftVertex.Color = EndColor; + MeshBoundingBox += TopLeftVertex.Position; + +@@ -699,15 +694,15 @@ void UStreetMapComponent::AddThick2DLine( const FVector2D Start, const FVector2D + }; + + +-void UStreetMapComponent::AddTriangles( const TArray& Points, const TArray& PointIndices, const FVector& ForwardVector, const FVector& UpVector, const FColor& Color, FBox& MeshBoundingBox ) ++void UStreetMapComponent::AddTriangles( const TArray& Points, const TArray& PointIndices, const FVector3f& ForwardVector, const FVector3f& UpVector, const FColor& Color, FBox3f& MeshBoundingBox ) + { + const int32 FirstVertexIndex = Vertices.Num(); + +- for( FVector Point : Points ) ++ for( FVector3f Point : Points ) + { + FStreetMapVertex& NewVertex = *new( Vertices )FStreetMapVertex(); + NewVertex.Position = Point; +- NewVertex.TextureCoordinate = FVector2D( 0.0f, 0.0f ); // NOTE: We're not using texture coordinates for anything yet ++ NewVertex.TextureCoordinate = FVector2f( 0.0f, 0.0f ); // NOTE: We're not using texture coordinates for anything yet + NewVertex.TangentX = ForwardVector; + NewVertex.TangentZ = UpVector; + NewVertex.Color = Color; +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapRuntime/StreetMapRuntime.Build.cs b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapRuntime/StreetMapRuntime.Build.cs +index 2a5b5dd..cf7cdb9 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapRuntime/StreetMapRuntime.Build.cs ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapRuntime/StreetMapRuntime.Build.cs +@@ -7,8 +7,6 @@ namespace UnrealBuildTool.Rules + public StreetMapRuntime(ReadOnlyTargetRules Target) + : base(Target) + { +- PrivatePCHHeaderFile = "StreetMapRuntime.h"; +- + PrivateDependencyModuleNames.AddRange( + new string[] { + "Core", +@@ -16,15 +14,9 @@ namespace UnrealBuildTool.Rules + "Engine", + "RHI", + "RenderCore", ++ "NavigationSystem" + } + ); +- +- if (Target.bBuildEditor == true) +- { +- //@TODO: Needed for FPropertyEditorModule::NotifyCustomizationModuleChanged() +- //@TOOD: To move/implement in FStreetMapComponentDetails +- PrivateDependencyModuleNames.Add("PropertyEditor"); +- } +- } ++ } + } + } +\ No newline at end of file +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapRuntime/StreetMapRuntime.cpp b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapRuntime/StreetMapRuntime.cpp +index 1b41c09..4a6de7c 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapRuntime/StreetMapRuntime.cpp ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapRuntime/StreetMapRuntime.cpp +@@ -1,8 +1,5 @@ +-// Copyright 2017 Mike Fricker. All Rights Reserved. +- + #include "StreetMapRuntime.h" +-#include "ModuleManager.h" +- ++#include "Modules/ModuleManager.h" + + class FStreetMapRuntimeModule : public IModuleInterface + { +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapRuntime/StreetMapRuntime.h b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapRuntime/StreetMapRuntime.h +index cf30db0..45dcbb0 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapRuntime/StreetMapRuntime.h ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapRuntime/StreetMapRuntime.h +@@ -1,7 +1,3 @@ +-// Copyright 2017 Mike Fricker. All Rights Reserved. + #pragma once + +-#include "EngineMinimal.h" +-#include "Classes/Engine/Engine.h" // For UEngine +-#include "EngineGlobals.h" // For GEngine + +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapRuntime/StreetMapSceneProxy.cpp b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapRuntime/StreetMapSceneProxy.cpp +index 3a1c4f5..c1b31b7 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/Source/StreetMapRuntime/StreetMapSceneProxy.cpp ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/Source/StreetMapRuntime/StreetMapSceneProxy.cpp +@@ -1,18 +1,15 @@ +-// Copyright 2017 Mike Fricker. All Rights Reserved. +- +-#include "StreetMapRuntime.h" + #include "StreetMapSceneProxy.h" + #include "StreetMapComponent.h" +-#include "Runtime/Engine/Public/SceneManagement.h" +- ++#include "Materials/MaterialRenderProxy.h" ++#include "SceneManagement.h" + + FStreetMapSceneProxy::FStreetMapSceneProxy(const UStreetMapComponent* InComponent) + : FPrimitiveSceneProxy(InComponent), +- StreetMapComp(InComponent), +- CollisionResponse(InComponent->GetCollisionResponseToChannels()), +- VertexFactory(GetScene().GetFeatureLevel(), "FStreetMapSceneProxy") ++ VertexFactory(GetScene().GetFeatureLevel(), "FStreetMapSceneProxy"), ++ MaterialInterface(nullptr), ++ StreetMapComp(InComponent), ++ CollisionResponse(InComponent->GetCollisionResponseToChannels()) + { +- + } + + void FStreetMapSceneProxy::Init(const UStreetMapComponent* InComponent, const TArray< FStreetMapVertex >& Vertices, const TArray< uint32 >& Indices) +@@ -87,9 +84,9 @@ void FStreetMapSceneProxy::InitResources() + } + + +-bool FStreetMapSceneProxy::MustDrawMeshDynamically(const FSceneView& View) const ++bool FStreetMapSceneProxy::MustDrawMeshDynamically( const FSceneView& View ) const + { +- return (AllowDebugViewmodes() && View.Family->EngineShowFlags.Wireframe) || IsSelected(); ++ return ( AllowDebugViewmodes() && View.Family->EngineShowFlags.Wireframe ) || IsSelected(); + } + + +@@ -98,18 +95,16 @@ bool FStreetMapSceneProxy::IsInCollisionView(const FEngineShowFlags& EngineShowF + return EngineShowFlags.CollisionVisibility || EngineShowFlags.CollisionPawn; + } + +-FPrimitiveViewRelevance FStreetMapSceneProxy::GetViewRelevance(const FSceneView* View) const ++FPrimitiveViewRelevance FStreetMapSceneProxy::GetViewRelevance( const FSceneView* View ) const + { + FPrimitiveViewRelevance Result; + Result.bDrawRelevance = IsShown(View); + Result.bShadowRelevance = IsShadowCast(View); +- +- const bool bAlwaysHasDynamicData = false; +- ++ + // Only draw dynamically if we're drawing in wireframe or we're selected in the editor +- Result.bDynamicRelevance = MustDrawMeshDynamically(*View) || bAlwaysHasDynamicData; +- Result.bStaticRelevance = !MustDrawMeshDynamically(*View); +- ++ Result.bDynamicRelevance = MustDrawMeshDynamically( *View ); ++ Result.bStaticRelevance = !MustDrawMeshDynamically( *View ); ++ + MaterialRelevance.SetPrimitiveViewRelevance(Result); + return Result; + } +@@ -121,33 +116,16 @@ bool FStreetMapSceneProxy::CanBeOccluded() const + } + + +-void FStreetMapSceneProxy::MakeMeshBatch(FMeshBatch& Mesh, FMaterialRenderProxy* WireframeMaterialRenderProxyOrNull, bool bDrawCollision) const ++void FStreetMapSceneProxy::MakeMeshBatch( FMeshBatch& Mesh, FMaterialRenderProxy* MaterialRenderProxy, bool bInWireframe) const + { +- FMaterialRenderProxy* MaterialProxy = NULL; +- if (WireframeMaterialRenderProxyOrNull != nullptr) +- { +- MaterialProxy = WireframeMaterialRenderProxyOrNull; +- } +- else +- { +- if (bDrawCollision) +- { +- MaterialProxy = new FColoredMaterialRenderProxy(GEngine->ShadedLevelColorationUnlitMaterial->GetRenderProxy(), FColor::Cyan); +- } +- else if (MaterialProxy == nullptr) +- { +- MaterialProxy = StreetMapComp->GetDefaultMaterial()->GetRenderProxy(); +- } +- } ++ FMaterialRenderProxy* MaterialProxy = MaterialRenderProxy != nullptr ? MaterialRenderProxy : StreetMapComp->GetDefaultMaterial()->GetRenderProxy(); + + FMeshBatchElement& BatchElement = Mesh.Elements[0]; + BatchElement.IndexBuffer = &IndexBuffer32; +- Mesh.bWireframe = WireframeMaterialRenderProxyOrNull != nullptr; ++ Mesh.bWireframe = bInWireframe; + Mesh.VertexFactory = &VertexFactory; + Mesh.MaterialRenderProxy = MaterialProxy; + Mesh.CastShadow = true; +- // 4.22+ : on utilise le uniform buffer du proxy (CreatePrimitiveUniformBufferImmediate a change de signature, UseEditorDepthTest a disparu) +- BatchElement.PrimitiveUniformBuffer = GetUniformBuffer(); + BatchElement.FirstIndex = 0; + const int IndexCount = IndexBuffer32.Indices.Num(); + BatchElement.NumPrimitives = IndexCount / 3; +@@ -156,19 +134,20 @@ void FStreetMapSceneProxy::MakeMeshBatch(FMeshBatch& Mesh, FMaterialRenderProxy* + Mesh.ReverseCulling = IsLocalToWorldDeterminantNegative(); + Mesh.Type = PT_TriangleList; + Mesh.DepthPriorityGroup = SDPG_World; ++ Mesh.LODIndex = 0; + } + + +-void FStreetMapSceneProxy::DrawStaticElements(FStaticPrimitiveDrawInterface* PDI) ++void FStreetMapSceneProxy::DrawStaticElements( FStaticPrimitiveDrawInterface* PDI ) + { + const int IndexCount = IndexBuffer32.Indices.Num(); +- if (VertexBuffer.PositionVertexBuffer.GetNumVertices() > 0 && IndexCount > 0) ++ if( VertexBuffer.PositionVertexBuffer.GetNumVertices() > 0 && IndexCount > 0 ) + { + const float ScreenSize = 1.0f; + + FMeshBatch MeshBatch; +- MakeMeshBatch(MeshBatch, nullptr); +- PDI->DrawMesh(MeshBatch, ScreenSize); ++ MakeMeshBatch( MeshBatch, nullptr, false ); ++ PDI->DrawMesh( MeshBatch, ScreenSize ); + } + } + +@@ -184,8 +163,13 @@ void FStreetMapSceneProxy::GetDynamicMeshElements(const TArrayEngineShowFlags.Wireframe; + +- FColoredMaterialRenderProxy* WireframeMaterialRenderProxy = GEngine->WireframeMaterial && bIsWireframe ? new FColoredMaterialRenderProxy(GEngine->WireframeMaterial->GetRenderProxy(), FLinearColor(0, 0.5f, 1.f)) : NULL; +- ++ FMaterialRenderProxy* WireframeMaterialRenderProxy = nullptr; ++ if (GEngine->WireframeMaterial && bIsWireframe) ++ { ++ // 5.5 : RegisterOneFrameMaterialProxy renvoie void (il renvoie le pointeur a partir de 5.6) ++ WireframeMaterialRenderProxy = new FColoredMaterialRenderProxy(GEngine->WireframeMaterial->GetRenderProxy(), FLinearColor(0, 0.5f, 1.f)); ++ Collector.RegisterOneFrameMaterialProxy(WireframeMaterialRenderProxy); ++ } + + if (MustDrawMeshDynamically(View)) + { +@@ -197,9 +181,16 @@ void FStreetMapSceneProxy::GetDynamicMeshElements(const TArrayShadedLevelColorationUnlitMaterial->GetRenderProxy(), FColor::Cyan); ++ Collector.RegisterOneFrameMaterialProxy(MaterialProxy); ++ } ++ + // Draw the mesh! + FMeshBatch& MeshBatch = Collector.AllocateMesh(); +- MakeMeshBatch(MeshBatch, WireframeMaterialRenderProxy, bCanDrawCollision); ++ MakeMeshBatch(MeshBatch, MaterialProxy, bIsWireframe); + Collector.AddMesh(ViewIndex, MeshBatch); + } + } +@@ -207,7 +198,7 @@ void FStreetMapSceneProxy::GetDynamicMeshElements(const TArray ++bIncludeInShipping=False ++bAllowExternalStartInShipping=False ++bCompileAFSProject=False ++bUseCompression=False ++bLogFiles=False ++bReportStats=False ++ConnectionType=USBOnly ++bUseManualIPAddress=False ++ManualIPAddress= ++ +diff --git a/D:/Game/LifePlay-master 4.27/Config/DefaultGame.ini b/D:/Game/LifePlay-master 5.5/Config/DefaultGame.ini +index 82a8443..aef0629 100644 +--- a/D:/Game/LifePlay-master 4.27/Config/DefaultGame.ini ++++ b/D:/Game/LifePlay-master 5.5/Config/DefaultGame.ini +@@ -2,7 +2,7 @@ + ProjectID=543F4F9E4DE525696C82F5A52303C15C + ProjectName=LifePlay + ProjectVersion=2026.9 beta +-Description=Portage UE 4.27 - assets integres depuis LifePlay 5.9 Full Source ++Description=Portage UE 5.5 - assets integres depuis LifePlay 5.9 Full Source + + [/Script/MoviePlayer.MoviePlayerSettings] + bWaitForMoviesToComplete=False +@@ -12,7 +12,7 @@ bMoviesAreSkippable=False + [/Script/UnrealEd.ProjectPackagingSettings] + Build=IfProjectHasCode + BuildConfiguration=PPBC_Shipping +-StagingDirectory=(Path="D:/LifePlay_Build/topright") ++StagingDirectory=(Path="D:/Game/LifePlay_Build_5.5") + FullRebuild=False + ForDistribution=True + IncludeDebugFiles=False +@@ -47,4 +47,9 @@ bSkipMovies=False + bNativizeBlueprintAssets=False + bNativizeOnlySelectedBlueprints=False + ++[/Script/McpAutomationBridge.McpAutomationBridgeSettings] ++bEnableNativeMCP=True ++NativeMCPPort=3000 ++bLoadAllToolsOnStart=True ++ + +diff --git a/D:/Game/LifePlay-master 4.27/Config/DefaultInput.ini b/D:/Game/LifePlay-master 5.5/Config/DefaultInput.ini +index e28b8f3..e7b60c7 100644 +--- a/D:/Game/LifePlay-master 4.27/Config/DefaultInput.ini ++++ b/D:/Game/LifePlay-master 5.5/Config/DefaultInput.ini +@@ -1,4 +1,5 @@ + ++ + [/Script/Engine.InputSettings] + -AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) + -AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) +@@ -6,6 +7,8 @@ + -AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) + -AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f)) + -AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f)) ++-AxisConfig=(AxisKeyName="Mouse2D",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f)) +++AxisConfig=(AxisKeyName="Mouse2D",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False)) + +AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) + +AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) + +AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +@@ -29,13 +32,58 @@ + +AxisConfig=(AxisKeyName="Gamepad_Special_Left_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) + +AxisConfig=(AxisKeyName="MotionController_Left_Thumbstick_Z",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) + +AxisConfig=(AxisKeyName="MotionController_Right_Thumbstick_Z",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="Vive_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="Vive_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="Vive_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="Vive_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="Vive_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="Vive_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="MixedReality_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="MixedReality_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="MixedReality_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="MixedReality_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="MixedReality_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="MixedReality_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="MixedReality_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="MixedReality_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="MixedReality_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="MixedReality_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="OculusTouch_Left_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="OculusTouch_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="OculusTouch_Right_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="OculusTouch_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="ValveIndex_Left_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="ValveIndex_Left_Grip_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="ValveIndex_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="ValveIndex_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="ValveIndex_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="ValveIndex_Right_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="ValveIndex_Right_Grip_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="ValveIndex_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="ValveIndex_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="ValveIndex_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +++AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) + bAltEnterTogglesFullscreen=True + bF11TogglesFullscreen=True + bUseMouseForTouch=False + bEnableMouseSmoothing=True + bEnableFOVScaling=True + bCaptureMouseOnLaunch=True +-bDefaultViewportMouseLock=False ++bEnableLegacyInputScales=True ++bEnableMotionControls=True ++bFilterInputByPlatformUser=False ++bEnableInputDeviceSubsystem=True ++bShouldFlushPressedKeysOnViewportFocusLost=True ++bEnableDynamicComponentInputBinding=True + bAlwaysShowTouchInterface=False + bShowConsoleOnFourFingerTap=True + bEnableGestureRecognizer=False +@@ -112,9 +160,10 @@ DoubleClickTime=0.200000 + +AxisMappings=(AxisName="CursorY",Scale=1.000000,Key=MouseY) + +AxisMappings=(AxisName="PenisRotation",Scale=1.000000,Key=PageUp) + +AxisMappings=(AxisName="PenisRotation",Scale=-1.000000,Key=PageDown) ++DefaultPlayerInputClass=/Script/EnhancedInput.EnhancedPlayerInput ++DefaultInputComponentClass=/Script/EnhancedInput.EnhancedInputComponent + DefaultTouchInterface=/Engine/MobileResources/HUD/DefaultVirtualJoysticks.DefaultVirtualJoysticks +-ConsoleKey=None + -ConsoleKeys=Tilde + +ConsoleKeys=Tilde +- +++ConsoleKeys=² + diff --git a/Docs/Migration/correctifs/P06_Projet_Target_uplugin.patch b/Docs/Migration/correctifs/P06_Projet_Target_uplugin.patch new file mode 100644 index 0000000..3faf78a --- /dev/null +++ b/Docs/Migration/correctifs/P06_Projet_Target_uplugin.patch @@ -0,0 +1,99 @@ +diff --git a/D:/Game/LifePlay-master 4.27/LifePlay.uproject b/D:/Game/LifePlay-master 5.5/LifePlay.uproject +index 86fdbdc..6968ad2 100644 +--- a/D:/Game/LifePlay-master 4.27/LifePlay.uproject ++++ b/D:/Game/LifePlay-master 5.5/LifePlay.uproject +@@ -1,8 +1,8 @@ + { + "FileVersion": 3, +- "EngineAssociation": "4.27", ++ "EngineAssociation": "5.5", + "Category": "", +- "Description": "LifePlay 2026.9 beta - portage UE 4.27", ++ "Description": "LifePlay 2026.9 beta - portage UE 5.5", + "Modules": [ + { + "Name": "LifePlay", +@@ -18,33 +18,6 @@ + ] + } + ], +- "Plugins": [ +- { +- "Name": "ModdingPlus", +- "Enabled": false +- }, +- { +- "Name": "SteamVR", +- "Enabled": false +- }, +- { +- "Name": "MultiTask", +- "Enabled": false +- }, +- { +- "Name": "VictoryBPLibrary", +- "Enabled": true, +- "MarketplaceURL": "http://www.ue4code.com" +- }, +- { +- "Name": "VisualStudioTools", +- "Enabled": true, +- "MarketplaceURL": "com.epicgames.launcher://ue/marketplace/product/362651520df94e4fa65492dbcba44ae2", +- "SupportedTargetPlatforms": [ +- "Win64" +- ] +- } +- ], + "TargetPlatforms": [ + "WindowsNoEditor" + ] +diff --git a/D:/Game/LifePlay-master 4.27/Source/LifePlay.Target.cs b/D:/Game/LifePlay-master 5.5/Source/LifePlay.Target.cs +index c74f460..17d2fff 100644 +--- a/D:/Game/LifePlay-master 4.27/Source/LifePlay.Target.cs ++++ b/D:/Game/LifePlay-master 5.5/Source/LifePlay.Target.cs +@@ -8,6 +8,8 @@ public class LifePlayTarget : TargetRules + public LifePlayTarget(TargetInfo Target) : base(Target) + { + Type = TargetType.Game; ++ DefaultBuildSettings = BuildSettingsVersion.V5; ++ IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_5; + + ExtraModuleNames.AddRange( new string[] { "LifePlay" } ); + } +diff --git a/D:/Game/LifePlay-master 4.27/Source/LifePlayEditor.Target.cs b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditor.Target.cs +index fbf31bf..7e735e4 100644 +--- a/D:/Game/LifePlay-master 4.27/Source/LifePlayEditor.Target.cs ++++ b/D:/Game/LifePlay-master 5.5/Source/LifePlayEditor.Target.cs +@@ -8,6 +8,8 @@ public class LifePlayEditorTarget : TargetRules + public LifePlayEditorTarget(TargetInfo Target) : base(Target) + { + Type = TargetType.Editor; ++ DefaultBuildSettings = BuildSettingsVersion.V5; ++ IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_5; + + // LifePlayEditorTools : module editeur du portage 2026.9 (commandlets d'outillage) + ExtraModuleNames.AddRange( new string[] { "LifePlay", "LifePlayEditorTools" } ); +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/ModdingExtra/ModdingExtra.uplugin b/D:/Game/LifePlay-master 5.5/Plugins/ModdingExtra/ModdingExtra.uplugin +index 2240a42..ff9a2ad 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/ModdingExtra/ModdingExtra.uplugin ++++ b/D:/Game/LifePlay-master 5.5/Plugins/ModdingExtra/ModdingExtra.uplugin +@@ -10,7 +10,6 @@ + "DocsURL": "", + "MarketplaceURL": "", + "SupportURL": "", +- "EngineVersion": "4.27.0", + "CanContainContent": true, + "IsBetaVersion": false, + "Installed": false, +diff --git a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/StreetMap.uplugin b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/StreetMap.uplugin +index 7f1b8bc..e8f033c 100644 +--- a/D:/Game/LifePlay-master 4.27/Plugins/StreetMap/StreetMap.uplugin ++++ b/D:/Game/LifePlay-master 5.5/Plugins/StreetMap/StreetMap.uplugin +@@ -10,7 +10,6 @@ + "DocsURL" : "http://github.com/ue4plugins/StreetMap", + "MarketplaceURL" : "", + "SupportURL" : "", +- "EngineVersion" : "4.27.0", + "EnabledByDefault" : true, + "CanContainContent" : true, + "IsBetaVersion" : false, diff --git a/Tools/RunCommandlet.ps1 b/Tools/RunCommandlet.ps1 new file mode 100644 index 0000000..6891f71 --- /dev/null +++ b/Tools/RunCommandlet.ps1 @@ -0,0 +1,63 @@ +<# +.SYNOPSIS + Lance une commandlet Unreal sur le projet 5.5 et archive son journal. + +.DESCRIPTION + Journal complet : Saved\Logs\portage\__.log + Resume (lignes Error/Warning dedoublonnees, lignes de la commandlet) : + Docs\Migration\etat\__.txt + Retourne le code de sortie de la commandlet. + +.EXAMPLE + .\Tools\RunCommandlet.ps1 -Lot L1 -Commandlet CompileAllBlueprints + .\Tools\RunCommandlet.ps1 -Lot L4 -Commandlet LPFixAssetRegistryPins -Args '-DryRun' +#> +param( + [Parameter(Mandatory)][string]$Lot, + [Parameter(Mandatory)][string]$Commandlet, + [string]$Args = '', + [string]$ProjectRoot = (Split-Path $PSScriptRoot -Parent), + [string]$Engine = 'D:\Game\Launcher\Engine\UE_5.5\Engine' +) +$ErrorActionPreference = 'Stop' +$cmd = Join-Path $Engine 'Binaries\Win64\UnrealEditor-Cmd.exe' +$proj = Join-Path $ProjectRoot 'LifePlay.uproject' +$stamp = Get-Date -Format 'yyyyMMdd-HHmmss' +$name = "${Lot}_${Commandlet}_$stamp" +$log = Join-Path $ProjectRoot "Saved\Logs\portage\$name.log" +$sum = Join-Path $ProjectRoot "Docs\Migration\etat\$name.txt" +New-Item -ItemType Directory -Force (Split-Path $log -Parent), (Split-Path $sum -Parent) | Out-Null + +$argLine = "`"$proj`" -run=$Commandlet $Args -unattended -nopause -nosplash -stdout -FullStdOutLogOutput -abslog=`"$log`"" +Write-Host "> $cmd $argLine" +$t0 = Get-Date +$p = Start-Process -FilePath $cmd -ArgumentList $argLine -NoNewWindow -PassThru -Wait -RedirectStandardOutput "$log.stdout" +$dur = [int]((Get-Date) - $t0).TotalSeconds +Remove-Item "$log.stdout" -ErrorAction SilentlyContinue + +$lines = if (Test-Path $log) { Get-Content $log } else { @() } +# Retire horodatage et numero de trame pour dedoublonner +$strip = { param($l) $l -replace '^\[[^\]]+\]\[\s*\d+\]', '' } +$errs = $lines | Where-Object { $_ -match ': Error: |: Fatal' } | ForEach-Object { & $strip $_ } | Group-Object | Sort-Object Count -Descending +$warns = $lines | Where-Object { $_ -match ': Warning: ' } | ForEach-Object { & $strip $_ } | Group-Object | Sort-Object Count -Descending +$own = $lines | Where-Object { $_ -match 'LogLP|LogCompileAllBlueprints|CompileAllBlueprints|Success -|Failure -|Blueprints? (compiled|failed)' } | ForEach-Object { & $strip $_ } + +@( + "Commandlet : $Commandlet $Args" + "Lot : $Lot" + "Date : $(Get-Date -Format s) duree : $dur s code de sortie : $($p.ExitCode)" + "Journal : $log" + "" + "=== Erreurs : $(($errs | Measure-Object Count -Sum).Sum) lignes, $(@($errs).Count) signatures" + $errs | ForEach-Object { '{0,6} {1}' -f $_.Count, $_.Name } + "" + "=== Avertissements : $(($warns | Measure-Object Count -Sum).Sum) lignes, $(@($warns).Count) signatures (100 premieres)" + $warns | Select-Object -First 100 | ForEach-Object { '{0,6} {1}' -f $_.Count, $_.Name } + "" + "=== Sortie de la commandlet" + $own +) | Set-Content $sum -Encoding UTF8 + +Write-Host "code=$($p.ExitCode) duree=${dur}s erreurs=$(($errs | Measure-Object Count -Sum).Sum) avertissements=$(($warns | Measure-Object Count -Sum).Sum)" +Write-Host "resume : $sum" +exit $p.ExitCode