From 510654f8a196640bc9da4036ac9b02937781e6bc Mon Sep 17 00:00:00 2001 From: guus Date: Sat, 11 Aug 2018 16:46:35 +0200 Subject: [PATCH] HAxis sos --- .gitattributes | 3 + .gitignore | 13 + Config/DefaultEditor.ini | 8 + .../DefaultEditorPerProjectUserSettings.ini | 40 + Config/DefaultEngine.ini | 180 ++ Config/DefaultGame.ini | 16 + Config/DefaultInput.ini | 43 + MatchMaking/matchmaking.hpp | 46 + .../CustomBlueprints/CustomBlueprints.uplugin | 24 + .../CustomBlueprints/Resources/Icon128.png | Bin 0 -> 5261 bytes .../CustomBlueprintsEditor.build.cs | 39 + .../CustomBlueprintsEditor.cpp | 45 + .../CustomBlueprintsEditor.h | 7 + .../CustomBlueprintsEditorPCH.cpp | 1 + .../Source/CustomBlueprintsEditor/Globals.h | 11 + .../SpawnActorBaseNode.cpp | 560 ++++++ .../SpawnActorBaseNode.h | 119 ++ .../Content/AnimNotify_FMODPlayEvent.uasset | 3 + .../FMODStudio/Docs/FMOD UE4 Integration.chm | Bin 0 -> 3008226 bytes ...Spatializer for FMOD Integration Guide.pdf | Bin 0 -> 152246 bytes Plugins/FMODStudio/FMODStudio.uplugin | 29 + Plugins/FMODStudio/Resources/Icon128.png | Bin 0 -> 4009 bytes .../FMODStudio/Classes/FMODAmbientSound.h | 26 + .../Source/FMODStudio/Classes/FMODAsset.h | 37 + .../FMODStudio/Classes/FMODAudioComponent.h | 218 +++ .../Source/FMODStudio/Classes/FMODBank.h | 30 + .../FMODStudio/Classes/FMODBlueprintStatics.h | 208 ++ .../Source/FMODStudio/Classes/FMODBus.h | 30 + .../Source/FMODStudio/Classes/FMODEvent.h | 30 + .../Source/FMODStudio/Classes/FMODSettings.h | 157 ++ .../Source/FMODStudio/Classes/FMODSnapshot.h | 27 + .../FMODStudio/Classes/FMODSnapshotReverb.h | 34 + .../Source/FMODStudio/Classes/FMODVCA.h | 30 + .../Source/FMODStudio/FMODStudio.Build.cs | 237 +++ .../FMODStudio/Private/FMODAmbientSound.cpp | 65 + .../Source/FMODStudio/Private/FMODAsset.cpp | 27 + .../FMODStudio/Private/FMODAssetTable.cpp | 274 +++ .../FMODStudio/Private/FMODAssetTable.h | 39 + .../FMODStudio/Private/FMODAudioComponent.cpp | 647 +++++++ .../Source/FMODStudio/Private/FMODBank.cpp | 22 + .../Private/FMODBankUpdateNotifier.cpp | 57 + .../Private/FMODBankUpdateNotifier.h | 24 + .../Private/FMODBlueprintStatics.cpp | 409 ++++ .../Source/FMODStudio/Private/FMODBus.cpp | 22 + .../Source/FMODStudio/Private/FMODEvent.cpp | 38 + .../FMODStudio/Private/FMODFileCallbacks.cpp | 109 ++ .../FMODStudio/Private/FMODFileCallbacks.h | 12 + .../FMODStudio/Private/FMODListener.cpp | 48 + .../Source/FMODStudio/Private/FMODListener.h | 61 + .../Private/FMODPlatformLoadDll_Generic.h | 12 + .../FMODStudio/Private/FMODSettings.cpp | 91 + .../FMODStudio/Private/FMODSnapshot.cpp | 16 + .../FMODStudio/Private/FMODSnapshotReverb.cpp | 9 + .../FMODStudio/Private/FMODStudioModule.cpp | 1080 +++++++++++ .../FMODStudio/Private/FMODStudioPrivatePCH.h | 11 + .../Source/FMODStudio/Private/FMODVCA.cpp | 22 + .../Source/FMODStudio/Public/FMOD/fmod.h | 718 +++++++ .../Source/FMODStudio/Public/FMOD/fmod.hpp | 604 ++++++ .../FMODStudio/Public/FMOD/fmod_codec.h | 178 ++ .../FMODStudio/Public/FMOD/fmod_common.h | 1687 +++++++++++++++++ .../Source/FMODStudio/Public/FMOD/fmod_dsp.h | 850 +++++++++ .../FMODStudio/Public/FMOD/fmod_dsp_effects.h | 1118 +++++++++++ .../FMODStudio/Public/FMOD/fmod_errors.h | 113 ++ .../FMODStudio/Public/FMOD/fmod_output.h | 88 + .../FMODStudio/Public/FMOD/fmod_studio.h | 233 +++ .../FMODStudio/Public/FMOD/fmod_studio.hpp | 388 ++++ .../Public/FMOD/fmod_studio_common.h | 754 ++++++++ .../FMODStudio/Public/FMODStudioModule.h | 155 ++ .../Source/FMODStudio/Public/FMODUtils.h | 190 ++ .../Classes/FMODAmbientSoundActorFactory.h | 23 + .../FMODStudioEditor.Build.cs | 58 + .../Private/AssetTypeActions_FMODEvent.cpp | 152 ++ .../Private/AssetTypeActions_FMODEvent.h | 55 + .../Private/FMODAmbientSoundActorFactory.cpp | 66 + .../Private/FMODAmbientSoundDetails.cpp | 119 ++ .../Private/FMODAmbientSoundDetails.h | 23 + .../Private/FMODAssetBroker.h | 43 + .../Private/FMODAudioComponentVisualizer.cpp | 45 + .../Private/FMODAudioComponentVisualizer.h | 13 + .../Private/FMODEventEditor.cpp | 187 ++ .../Private/FMODEventEditor.h | 80 + .../Private/FMODStudioEditorModule.cpp | 872 +++++++++ .../Private/FMODStudioEditorPrivatePCH.h | 9 + .../Private/FMODStudioStyle.cpp | 56 + .../Private/FMODStudioStyle.h | 20 + .../Private/SFMODEventEditorPanel.cpp | 375 ++++ .../Private/SFMODEventEditorPanel.h | 45 + .../Public/FMODStudioEditorModule.h | 35 + Plugins/Mantis/Mantis.uplugin | 21 + Plugins/Mantis/Resources/Icon128.png | Bin 0 -> 45697 bytes .../Source/Mantis/Classes/MantisSettings.h | 70 + Plugins/Mantis/Source/Mantis/Mantis.Build.cs | 29 + .../Mantis/Source/Mantis/Private/Mantis.cpp | 332 ++++ .../Source/Mantis/Private/MantisPrivatePCH.h | 12 + .../Source/Mantis/Private/MantisSettings.cpp | 7 + Plugins/Mantis/Source/Mantis/Public/IMantis.h | 27 + .../PolishBuildings/PolishBuildings.uplugin | 24 + Plugins/PolishBuildings/Resources/Icon128.png | Bin 0 -> 43015 bytes .../Source/PolishBuildings.Build.cs | 54 + .../BuildingsProxyTool/BuildingsProxyTool.cpp | 128 ++ .../BuildingsProxyTool/BuildingsProxyTool.h | 25 + .../SBuildingsProxyDialog.cpp | 614 ++++++ .../SBuildingsProxyDialog.h | 75 + .../Source/Private/PolishBuildingsModule.cpp | 162 ++ .../Private/PolishBuildingsPrivatePCH.h | 6 + .../PolishBuildingsTool.cpp | 149 ++ .../PolishBuildingsTool/PolishBuildingsTool.h | 35 + .../SPolishBuildingsDialog.cpp | 520 +++++ .../SPolishBuildingsDialog.h | 86 + .../Private/SPolishBuildingsToolbar.cpp | 219 +++ .../Source/Private/SPolishBuildingsToolbar.h | 83 + .../Source/Public/IPolishBuildingsModule.h | 33 + .../Source/Public/IPolishBuildingsTool.h | 43 + Plugins/SkillTree/Resources/Icon128.png | Bin 0 -> 5261 bytes Plugins/SkillTree/SkillTree.uplugin | 28 + .../Source/SkillTree/Classes/DynamicHexMap.h | 42 + .../Source/SkillTree/Classes/HexMap.h | 80 + .../Source/SkillTree/Classes/SkillObject.h | 28 + .../SkillTree/Classes/SkillTreeObject.h | 25 + .../Source/SkillTree/Private/SkillObject.cpp | 7 + .../Source/SkillTree/Private/SkillTree.cpp | 32 + .../SkillTree/Private/SkillTreeObject.cpp | 8 + .../SkillTree/Private/SkillTreePrivatePCH.h | 11 + .../Source/SkillTree/Public/ISkillTree.h | 27 + .../Source/SkillTree/SkillTree.Build.cs | 34 + .../SkillTreeEditor/Classes/SkillFactory.h | 21 + .../Classes/SkillTreeFactory.h | 21 + .../SSkillTreeEditorViewportToolbar.cpp | 33 + .../Private/SSkillTreeEditorViewportToolbar.h | 23 + .../SkillTreeEditor/Private/SkillAsset.cpp | 63 + .../SkillTreeEditor/Private/SkillAsset.h | 29 + .../SkillTreeEditor/Private/SkillFactory.cpp | 29 + .../Private/SkillTreeAsset.cpp | 58 + .../SkillTreeEditor/Private/SkillTreeAsset.h | 29 + .../Private/SkillTreeDetailsCustomization.cpp | 147 ++ .../Private/SkillTreeDetailsCustomization.h | 55 + .../Private/SkillTreeEditMode.cpp | 9 + .../Private/SkillTreeEditMode.h | 20 + .../Private/SkillTreeEditor.cpp | 72 + .../Private/SkillTreeEditorCommands.cpp | 20 + .../Private/SkillTreeEditorCommands.h | 30 + .../Private/SkillTreeEditorPrivatePCH.h | 13 + .../Private/SkillTreeEditorViewport.cpp | 532 ++++++ .../Private/SkillTreeEditorViewport.h | 71 + .../Private/SkillTreeEditorViewportClient.cpp | 333 ++++ .../Private/SkillTreeEditorViewportClient.h | 78 + .../Private/SkillTreeFactory.cpp | 29 + .../SkillTreeEditor/Public/ISkillTreeEditor.h | 27 + .../SkillTreeEditor/SkillTreeEditor.Build.cs | 23 + .../Abilities/AbilityEventGroup.cpp | 165 ++ .../Abilities/AbilityEventGroup.h | 85 + .../UnrealProject/Abilities/AbilityFilter.h | 17 + .../UnrealProject/Abilities/AbilityInfo.cpp | 56 + Source/UnrealProject/Abilities/AbilityInfo.h | 96 + Source/UnrealProject/Abilities/AbilityState.h | 37 + .../Abilities/AbilityTriggerBase.cpp | 221 +++ .../Abilities/AbilityTriggerBase.h | 71 + .../UnrealProject/Abilities/AuraTrigger.cpp | 31 + Source/UnrealProject/Abilities/AuraTrigger.h | 26 + .../Abilities/BlueprintAbilityLibrary.cpp | 326 ++++ .../Abilities/BlueprintAbilityLibrary.h | 59 + .../Abilities/BombProjectile.cpp | 58 + .../UnrealProject/Abilities/BombProjectile.h | 30 + .../Abilities/BossBarageBunny.cpp | 97 + .../UnrealProject/Abilities/BossBarageBunny.h | 36 + .../Abilities/BossTargetBunny.cpp | 43 + .../UnrealProject/Abilities/BossTargetBunny.h | 26 + .../UnrealProject/Abilities/ConeComponent.cpp | 110 ++ .../UnrealProject/Abilities/ConeComponent.h | 26 + .../UnrealProject/Abilities/ConeTrigger.cpp | 50 + Source/UnrealProject/Abilities/ConeTrigger.h | 27 + .../Abilities/DealDamageProxy.cpp | 67 + .../UnrealProject/Abilities/DealDamageProxy.h | 28 + .../Abilities/HomingProjectile.cpp | 47 + .../Abilities/HomingProjectile.h | 22 + .../Abilities/HoverProjectile.cpp | 22 + .../UnrealProject/Abilities/HoverProjectile.h | 23 + .../Abilities/IngameSkillTree.cpp | 103 + .../UnrealProject/Abilities/IngameSkillTree.h | 45 + .../Abilities/IntimidatingAuraTrigger.cpp | 60 + .../Abilities/IntimidatingAuraTrigger.h | 42 + Source/UnrealProject/Abilities/Modifier.cpp | 477 +++++ Source/UnrealProject/Abilities/Modifier.h | 122 ++ .../Abilities/NativeModifiers.cpp | 704 +++++++ .../UnrealProject/Abilities/NativeModifiers.h | 683 +++++++ .../Abilities/PreCastAbilityEventGroup.cpp | 69 + .../Abilities/PreCastAbilityEventGroup.h | 26 + .../Abilities/ProjectileBase.cpp | 174 ++ .../UnrealProject/Abilities/ProjectileBase.h | 78 + Source/UnrealProject/Abilities/ScalingGraph.h | 12 + .../Abilities/SpiralProjectile.cpp | 34 + .../Abilities/SpiralProjectile.h | 22 + Source/UnrealProject/Abilities/TrailActor.cpp | 28 + Source/UnrealProject/Abilities/TrailActor.h | 21 + .../UnrealProject/Abilities/TrailTrigger.cpp | 93 + Source/UnrealProject/Abilities/TrailTrigger.h | 40 + .../Abilities/poisonAuraTrigger.cpp | 52 + .../Abilities/poisonAuraTrigger.h | 28 + .../Creatures/AnimationProxy.cpp | 37 + .../UnrealProject/Creatures/AnimationProxy.h | 22 + .../BehaviorTree/BTTaskNodeClimb.cpp | 64 + .../Creatures/BehaviorTree/BTTaskNodeClimb.h | 36 + .../BehaviorTree/BTTaskNodeJumpFence.cpp | 56 + .../BehaviorTree/BTTaskNodeJumpFence.h | 25 + .../BehaviorTree/EnemyAIController.cpp | 178 ++ .../BehaviorTree/EnemyAIController.h | 56 + Source/UnrealProject/Creatures/BossBase.cpp | 96 + Source/UnrealProject/Creatures/BossBase.h | 28 + .../UnrealProject/Creatures/CharacterBase.cpp | 300 +++ .../UnrealProject/Creatures/CharacterBase.h | 94 + Source/UnrealProject/Creatures/EnemyBase.cpp | 190 ++ Source/UnrealProject/Creatures/EnemyBase.h | 60 + .../UnrealProject/Creatures/GeneralEnemy.cpp | 237 +++ Source/UnrealProject/Creatures/GeneralEnemy.h | 40 + .../Creatures/IllusionCharacter.cpp | 189 ++ .../Creatures/IllusionCharacter.h | 46 + .../Creatures/MainCharacterAnimation.cpp | 69 + .../Creatures/MainCharacterAnimation.h | 43 + .../Creatures/MiniBossCreature.cpp | 113 ++ .../Creatures/MiniBossCreature.h | 34 + .../Creatures/MinionAnimInstance.cpp | 61 + .../Creatures/MinionAnimInstance.h | 66 + Source/UnrealProject/Creatures/NPCBase.cpp | 349 ++++ Source/UnrealProject/Creatures/NPCBase.h | 109 ++ .../Creatures/NetworkCharacter.cpp | 1232 ++++++++++++ .../Creatures/NetworkCharacter.h | 324 ++++ .../UnrealProject/Creatures/NetworkGhost.cpp | 91 + Source/UnrealProject/Creatures/NetworkGhost.h | 44 + .../UnrealProject/Creatures/NetworkPlayer.cpp | 474 +++++ .../UnrealProject/Creatures/NetworkPlayer.h | 155 ++ .../Creatures/NetworkPossessable.cpp | 106 ++ .../Creatures/NetworkPossessable.h | 35 + .../Creatures/OffensiveEnemy.cpp | 140 ++ .../UnrealProject/Creatures/OffensiveEnemy.h | 24 + .../UnrealProject/Creatures/PlayerKeyType.h | 16 + .../UnrealProject/Creatures/RangedEnemy.cpp | 136 ++ Source/UnrealProject/Creatures/RangedEnemy.h | 26 + Source/UnrealProject/Creatures/TouhouBoss.cpp | 175 ++ Source/UnrealProject/Creatures/TouhouBoss.h | 60 + .../Creatures/WiebertAnimation.cpp | 62 + .../Creatures/WiebertAnimation.h | 42 + .../UnrealProject/Doodads/BaseSkillObject.cpp | 15 + .../UnrealProject/Doodads/BaseSkillObject.h | 70 + .../Doodads/CharacterCarousel.cpp | 256 +++ .../UnrealProject/Doodads/CharacterCarousel.h | 70 + .../Doodads/CharacterSettings.cpp | 66 + .../UnrealProject/Doodads/CharacterSettings.h | 47 + Source/UnrealProject/Doodads/FixupUtility.cpp | 74 + Source/UnrealProject/Doodads/FixupUtility.h | 25 + .../UnrealProject/Doodads/NetworkDoodad.cpp | 11 + Source/UnrealProject/Doodads/NetworkDoodad.h | 23 + Source/UnrealProject/Doodads/NetworkDoor.cpp | 91 + Source/UnrealProject/Doodads/NetworkDoor.h | 40 + .../UnrealProject/Doodads/NetworkSwitch.cpp | 92 + Source/UnrealProject/Doodads/NetworkSwitch.h | 41 + .../Doodads/NetworkSwitchComponent.cpp | 108 ++ .../Doodads/NetworkSwitchComponent.h | 21 + .../UnrealProject/Doodads/NetworkTrigger.cpp | 123 ++ Source/UnrealProject/Doodads/NetworkTrigger.h | 52 + .../UnrealProject/Doodads/ParticleEffect.cpp | 40 + Source/UnrealProject/Doodads/ParticleEffect.h | 29 + Source/UnrealProject/Doodads/Prefs.cpp | 37 + Source/UnrealProject/Doodads/Prefs.h | 33 + Source/UnrealProject/Doodads/Shrine.cpp | 44 + Source/UnrealProject/Doodads/Shrine.h | 28 + .../Effects/AbilityIndicator.cpp | 241 +++ .../UnrealProject/Effects/AbilityIndicator.h | 101 + Source/UnrealProject/Effects/Effect.cpp | 166 ++ Source/UnrealProject/Effects/Effect.h | 74 + .../Effects/EffectFunctionLibrary.cpp | 185 ++ .../Effects/EffectFunctionLibrary.h | 42 + Source/UnrealProject/Effects/TeamData.cpp | 20 + Source/UnrealProject/Effects/TeamData.h | 36 + Source/UnrealProject/External/Events.hpp | 171 ++ .../UnrealProject/External/HeatMapMetrics.cpp | 96 + .../UnrealProject/External/HeatMapMetrics.h | 27 + .../External/InputDeviceBases.hpp | 46 + Source/UnrealProject/External/InputEnums.hpp | 285 +++ .../UnrealProject/External/InputManager.cpp | 688 +++++++ .../UnrealProject/External/InputManager.hpp | 95 + Source/UnrealProject/External/Metrics.cpp | 362 ++++ Source/UnrealProject/External/Metrics.hpp | 71 + Source/UnrealProject/External/TeaCallback.hpp | 137 ++ Source/UnrealProject/External/TeaVector2.hpp | 91 + Source/UnrealProject/External/TeaVector3.hpp | 149 ++ Source/UnrealProject/External/append | 146 ++ Source/UnrealProject/External/timer | 106 ++ .../GUI/CombatText/CombatTextText.cpp | 22 + .../GUI/CombatText/CombatTextText.h | 29 + .../GUI/CombatText/CombatTextWidget.cpp | 106 ++ .../GUI/CombatText/CombatTextWidget.h | 54 + Source/UnrealProject/GUI/EventHUD.cpp | 19 + Source/UnrealProject/GUI/EventHUD.h | 47 + Source/UnrealProject/GUI/EventWidget.cpp | 19 + Source/UnrealProject/GUI/EventWidget.h | 18 + .../UnrealProject/GUI/HUD/AbilityButton.cpp | 61 + Source/UnrealProject/GUI/HUD/AbilityButton.h | 42 + .../GUI/HUD/ButtonBarSwitcher.cpp | 160 ++ .../UnrealProject/GUI/HUD/ButtonBarSwitcher.h | 58 + Source/UnrealProject/GUI/HUD/HealthBar.cpp | 126 ++ Source/UnrealProject/GUI/HUD/HealthBar.h | 53 + Source/UnrealProject/GUI/HUD/IngameHUD.cpp | 347 ++++ Source/UnrealProject/GUI/HUD/IngameHUD.h | 93 + Source/UnrealProject/GUI/HUD/KOTHHUD.cpp | 13 + Source/UnrealProject/GUI/HUD/KOTHHUD.h | 16 + Source/UnrealProject/GUI/HUD/KeyDisplay.cpp | 14 + Source/UnrealProject/GUI/HUD/KeyDisplay.h | 16 + Source/UnrealProject/GUI/HUD/StatBar.cpp | 192 ++ Source/UnrealProject/GUI/HUD/StatBar.h | 49 + Source/UnrealProject/GUI/HUD/Timer.cpp | 49 + Source/UnrealProject/GUI/HUD/Timer.h | 44 + .../GUI/Lobby/LobbyCharacterSelect.cpp | 285 +++ .../GUI/Lobby/LobbyCharacterSelect.h | 65 + Source/UnrealProject/GUI/Lobby/LobbyMenu.cpp | 204 ++ Source/UnrealProject/GUI/Lobby/LobbyMenu.h | 63 + .../GUI/Lobby/LobbyPlayerSlot.cpp | 4 + .../UnrealProject/GUI/Lobby/LobbyPlayerSlot.h | 16 + Source/UnrealProject/GUI/Lobby/LobbySlot.cpp | 125 ++ Source/UnrealProject/GUI/Lobby/LobbySlot.h | 55 + .../UnrealProject/GUI/Menu/ButtonHintBar.cpp | 4 + Source/UnrealProject/GUI/Menu/ButtonHintBar.h | 13 + Source/UnrealProject/GUI/Menu/GameList.cpp | 246 +++ Source/UnrealProject/GUI/Menu/GameList.h | 75 + .../UnrealProject/GUI/Menu/GameListItem.cpp | 53 + Source/UnrealProject/GUI/Menu/GameListItem.h | 41 + .../UnrealProject/GUI/Menu/GraphicsMenu.cpp | 103 + Source/UnrealProject/GUI/Menu/GraphicsMenu.h | 32 + .../GUI/Menu/MapSelectionScreen.cpp | 161 ++ .../GUI/Menu/MapSelectionScreen.h | 40 + Source/UnrealProject/GUI/Menu/MapSlot.cpp | 14 + Source/UnrealProject/GUI/Menu/MapSlot.h | 26 + Source/UnrealProject/GUI/Menu/MenuAction.h | 32 + Source/UnrealProject/GUI/Menu/MenuButton.cpp | 147 ++ Source/UnrealProject/GUI/Menu/MenuButton.h | 48 + Source/UnrealProject/GUI/Menu/MenuEnum.h | 9 + .../UnrealProject/GUI/Menu/MenuItemBase.cpp | 92 + Source/UnrealProject/GUI/Menu/MenuItemBase.h | 83 + Source/UnrealProject/GUI/Menu/MenuScreen.cpp | 337 ++++ Source/UnrealProject/GUI/Menu/MenuScreen.h | 135 ++ .../UnrealProject/GUI/Menu/MenuScreenBase.cpp | 122 ++ .../UnrealProject/GUI/Menu/MenuScreenBase.h | 52 + Source/UnrealProject/GUI/Menu/MenuSlider.cpp | 139 ++ Source/UnrealProject/GUI/Menu/MenuSlider.h | 61 + .../GUI/Menu/OverlayMessageBox.cpp | 78 + .../GUI/Menu/OverlayMessageBox.h | 46 + .../GUI/Menu/OverlayProgressBar.cpp | 24 + .../GUI/Menu/OverlayProgressBar.h | 23 + Source/UnrealProject/GUI/Menu/ScoreBoard.cpp | 78 + Source/UnrealProject/GUI/Menu/ScoreBoard.h | 34 + .../UnrealProject/GUI/Menu/ScoreBoardSlot.cpp | 4 + .../UnrealProject/GUI/Menu/ScoreBoardSlot.h | 19 + .../UnrealProject/GUI/Menu/ScreenOverlay.cpp | 195 ++ Source/UnrealProject/GUI/Menu/ScreenOverlay.h | 104 + .../UnrealProject/GUI/Menu/SelectButton.cpp | 10 + Source/UnrealProject/GUI/Menu/SelectButton.h | 22 + .../UnrealProject/GUI/Menu/SkillSelector.cpp | 130 ++ Source/UnrealProject/GUI/Menu/SkillSelector.h | 54 + .../GUI/Menu/SkillSelectorItem.cpp | 76 + .../GUI/Menu/SkillSelectorItem.h | 50 + .../UnrealProject/GUI/Menu/SplashScreen.cpp | 96 + Source/UnrealProject/GUI/Menu/SplashScreen.h | 45 + .../GUI/Menu/SplashScreenItem.cpp | 104 + .../UnrealProject/GUI/Menu/SplashScreenItem.h | 52 + .../GUI/Menu/StartPromptScreen.cpp | 10 + .../GUI/Menu/StartPromptScreen.h | 26 + Source/UnrealProject/GUI/Menu/SubMenu.cpp | 319 ++++ Source/UnrealProject/GUI/Menu/SubMenu.h | 127 ++ Source/UnrealProject/GUI/Minimap/MiniMap.cpp | 20 + Source/UnrealProject/GUI/Minimap/MiniMap.h | 325 ++++ .../GUI/Minimap/MiniMapIconWidget.cpp | 10 + .../GUI/Minimap/MiniMapIconWidget.h | 22 + .../GUI/Minimap/MiniMapVisionCircle.cpp | 15 + .../GUI/Minimap/MiniMapVisionCircle.h | 26 + .../GUI/Minimap/MiniMapWidget.cpp | 393 ++++ .../UnrealProject/GUI/Minimap/MiniMapWidget.h | 89 + Source/UnrealProject/GUI/PlayerSlot.cpp | 58 + Source/UnrealProject/GUI/PlayerSlot.h | 33 + Source/UnrealProject/GUI/SizeBorder.cpp | 16 + Source/UnrealProject/GUI/SizeBorder.h | 28 + .../GUI/SkillTree/EffectSelector.cpp | 130 ++ .../GUI/SkillTree/EffectSelector.h | 52 + .../GUI/SkillTree/EffectSlot.cpp | 31 + .../UnrealProject/GUI/SkillTree/EffectSlot.h | 31 + .../GUI/SkillTree/HexagonTile.cpp | 22 + .../UnrealProject/GUI/SkillTree/HexagonTile.h | 30 + .../GUI/SkillTree/SkillTreeState.h | 155 ++ .../GUI/SkillTree/SkillTreeWidget.cpp | 678 +++++++ .../GUI/SkillTree/SkillTreeWidget.h | 155 ++ .../GUI/SkillTree/SkillWidget.cpp | 843 ++++++++ .../UnrealProject/GUI/SkillTree/SkillWidget.h | 191 ++ .../UnrealProject/GUI/SkillTree/SpellInfo.cpp | 65 + .../UnrealProject/GUI/SkillTree/SpellInfo.h | 42 + .../GUI/SkillTree/SpellInfoDisplay.cpp | 36 + .../GUI/SkillTree/SpellInfoDisplay.h | 29 + .../Submenus/CharacterDependentSubMenus.cpp | 61 + .../GUI/Submenus/CharacterDependentSubMenus.h | 50 + .../GUI/Submenus/CharacterSubMenu.cpp | 164 ++ .../GUI/Submenus/CharacterSubMenu.h | 65 + .../GUI/Submenus/CustomizationSubMenu.cpp | 5 + .../GUI/Submenus/SkillBrowserSubMenu.cpp | 114 ++ .../GUI/Submenus/SkillBrowserSubMenu.h | 67 + .../GUI/Submenus/SkillTreeSubMenu.cpp | 5 + .../UnrealProject/GUI/ToolTip/ToolTipText.cpp | 14 + .../UnrealProject/GUI/ToolTip/ToolTipText.h | 27 + .../GUI/ToolTip/ToolTipWidget.cpp | 108 ++ .../UnrealProject/GUI/ToolTip/ToolTipWidget.h | 37 + Source/UnrealProject/GUI/TransitionScreen.cpp | 8 + Source/UnrealProject/GUI/TransitionScreen.h | 24 + .../UnrealProject/GameState/AbilityBindings.h | 24 + .../GameState/DefaultGameInstance.cpp | 557 ++++++ .../GameState/DefaultGameInstance.h | 107 ++ .../GameState/DefaultGameMode.cpp | 381 ++++ .../UnrealProject/GameState/DefaultGameMode.h | 65 + .../GameState/DefaultGameState.cpp | 32 + .../GameState/DefaultGameState.h | 27 + .../UnrealProject/GameState/DefaultPlayer.cpp | 119 ++ .../UnrealProject/GameState/DefaultPlayer.h | 47 + .../GameState/DefaultPlayerController.cpp | 1335 +++++++++++++ .../GameState/DefaultPlayerController.h | 212 +++ .../GameState/DefaultPlayerState.cpp | 121 ++ .../GameState/DefaultPlayerState.h | 68 + .../UnrealProject/GameState/GameStateBase.cpp | 201 ++ .../UnrealProject/GameState/GameStateBase.h | 106 ++ .../UnrealProject/GameState/KOTHGameState.cpp | 31 + .../UnrealProject/GameState/KOTHGameState.h | 38 + .../GameState/KOTHPlayerController.cpp | 47 + .../GameState/KOTHPlayerController.h | 23 + .../UnrealProject/GameState/KOTHTeamState.h | 18 + .../GameState/KingOfTheHillGameMode.cpp | 131 ++ .../GameState/KingOfTheHillGameMode.h | 35 + Source/UnrealProject/GameState/MapData.h | 26 + Source/UnrealProject/GameState/MapList.h | 11 + .../UnrealProject/GameState/MatchMaking.cpp | 78 + Source/UnrealProject/GameState/MatchMaking.h | 53 + .../GameState/MenuController.cpp | 332 ++++ .../UnrealProject/GameState/MenuController.h | 71 + .../UnrealProject/GameState/MenuGameMode.cpp | 160 ++ Source/UnrealProject/GameState/MenuGameMode.h | 42 + .../UnrealProject/GameState/MiniMapVolume.cpp | 14 + .../UnrealProject/GameState/MiniMapVolume.h | 18 + .../GameState/PlayerControllerBase.cpp | 397 ++++ .../GameState/PlayerControllerBase.h | 122 ++ .../GameState/PlayerSetupState.h | 79 + .../GameState/PlayerStateBase.cpp | 110 ++ .../UnrealProject/GameState/PlayerStateBase.h | 52 + .../GameState/SessionManager.cpp | 488 +++++ .../UnrealProject/GameState/SessionManager.h | 115 ++ Source/UnrealProject/Items/ItemBase.cpp | 125 ++ Source/UnrealProject/Items/ItemBase.h | 44 + Source/UnrealProject/Sound/MusicPlayer.cpp | 127 ++ Source/UnrealProject/Sound/MusicPlayer.h | 41 + Source/UnrealProject/Sound/SoundEffect.cpp | 59 + Source/UnrealProject/Sound/SoundEffect.h | 27 + .../Sound/SoundFunctionLibrary.cpp | 50 + .../Sound/SoundFunctionLibrary.h | 25 + .../UnrealProject/Spawners/CreatureSpawn.cpp | 354 ++++ Source/UnrealProject/Spawners/CreatureSpawn.h | 54 + .../Spawners/CreatureSpawnComponent.cpp | 244 +++ .../Spawners/CreatureSpawnComponent.h | 22 + .../Spawners/KOTHBossSpawner.cpp | 41 + .../UnrealProject/Spawners/KOTHBossSpawner.h | 26 + .../Spawners/KOTHMinionSpawner.cpp | 78 + .../Spawners/KOTHMinionSpawner.h | 30 + .../Spawners/KOTHSpawnerBase.cpp | 132 ++ .../UnrealProject/Spawners/KOTHSpawnerBase.h | 70 + Source/UnrealProject/Spawners/LobbySpawn.cpp | 20 + Source/UnrealProject/Spawners/LobbySpawn.h | 25 + Source/UnrealProject/Spawners/PatrolSpawn.cpp | 259 +++ Source/UnrealProject/Spawners/PatrolSpawn.h | 39 + Source/UnrealProject/Spawners/PlayerSpawn.cpp | 26 + Source/UnrealProject/Spawners/PlayerSpawn.h | 25 + Source/UnrealProject/Spawners/SpawnerBase.cpp | 476 +++++ Source/UnrealProject/Spawners/SpawnerBase.h | 126 ++ Source/UnrealProject/UnrealProject.Build.cs | 68 + Source/UnrealProject/UnrealProject.cpp | 77 + Source/UnrealProject/UnrealProject.h | 73 + Source/UnrealProjectDev.Target.cs | 22 + Source/UnrealProjectEditor.Target.cs | 25 + UnrealProjectDev.uproject | 29 + cursor.cur | Bin 0 -> 4286 bytes 480 files changed, 54126 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 Config/DefaultEditor.ini create mode 100644 Config/DefaultEditorPerProjectUserSettings.ini create mode 100644 Config/DefaultEngine.ini create mode 100644 Config/DefaultGame.ini create mode 100644 Config/DefaultInput.ini create mode 100644 MatchMaking/matchmaking.hpp create mode 100644 Plugins/CustomBlueprints/CustomBlueprints.uplugin create mode 100644 Plugins/CustomBlueprints/Resources/Icon128.png create mode 100644 Plugins/CustomBlueprints/Source/CustomBlueprintsEditor/CustomBlueprintsEditor.build.cs create mode 100644 Plugins/CustomBlueprints/Source/CustomBlueprintsEditor/CustomBlueprintsEditor.cpp create mode 100644 Plugins/CustomBlueprints/Source/CustomBlueprintsEditor/CustomBlueprintsEditor.h create mode 100644 Plugins/CustomBlueprints/Source/CustomBlueprintsEditor/CustomBlueprintsEditorPCH.cpp create mode 100644 Plugins/CustomBlueprints/Source/CustomBlueprintsEditor/Globals.h create mode 100644 Plugins/CustomBlueprints/Source/CustomBlueprintsEditor/SpawnActorBaseNode.cpp create mode 100644 Plugins/CustomBlueprints/Source/CustomBlueprintsEditor/SpawnActorBaseNode.h create mode 100644 Plugins/FMODStudio/Content/AnimNotify_FMODPlayEvent.uasset create mode 100644 Plugins/FMODStudio/Docs/FMOD UE4 Integration.chm create mode 100644 Plugins/FMODStudio/Docs/Oculus Spatializer for FMOD Integration Guide.pdf create mode 100644 Plugins/FMODStudio/FMODStudio.uplugin create mode 100644 Plugins/FMODStudio/Resources/Icon128.png create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Classes/FMODAmbientSound.h create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Classes/FMODAsset.h create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Classes/FMODAudioComponent.h create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Classes/FMODBank.h create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Classes/FMODBlueprintStatics.h create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Classes/FMODBus.h create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Classes/FMODEvent.h create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Classes/FMODSettings.h create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Classes/FMODSnapshot.h create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Classes/FMODSnapshotReverb.h create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Classes/FMODVCA.h create mode 100644 Plugins/FMODStudio/Source/FMODStudio/FMODStudio.Build.cs create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Private/FMODAmbientSound.cpp create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Private/FMODAsset.cpp create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Private/FMODAssetTable.cpp create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Private/FMODAssetTable.h create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Private/FMODAudioComponent.cpp create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Private/FMODBank.cpp create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Private/FMODBankUpdateNotifier.cpp create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Private/FMODBankUpdateNotifier.h create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Private/FMODBlueprintStatics.cpp create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Private/FMODBus.cpp create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Private/FMODEvent.cpp create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Private/FMODFileCallbacks.cpp create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Private/FMODFileCallbacks.h create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Private/FMODListener.cpp create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Private/FMODListener.h create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Private/FMODPlatformLoadDll_Generic.h create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Private/FMODSettings.cpp create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Private/FMODSnapshot.cpp create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Private/FMODSnapshotReverb.cpp create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Private/FMODStudioModule.cpp create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Private/FMODStudioPrivatePCH.h create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Private/FMODVCA.cpp create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod.h create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod.hpp create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_codec.h create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_common.h create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_dsp.h create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_dsp_effects.h create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_errors.h create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_output.h create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_studio.h create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_studio.hpp create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_studio_common.h create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Public/FMODStudioModule.h create mode 100644 Plugins/FMODStudio/Source/FMODStudio/Public/FMODUtils.h create mode 100644 Plugins/FMODStudio/Source/FMODStudioEditor/Classes/FMODAmbientSoundActorFactory.h create mode 100644 Plugins/FMODStudio/Source/FMODStudioEditor/FMODStudioEditor.Build.cs create mode 100644 Plugins/FMODStudio/Source/FMODStudioEditor/Private/AssetTypeActions_FMODEvent.cpp create mode 100644 Plugins/FMODStudio/Source/FMODStudioEditor/Private/AssetTypeActions_FMODEvent.h create mode 100644 Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAmbientSoundActorFactory.cpp create mode 100644 Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAmbientSoundDetails.cpp create mode 100644 Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAmbientSoundDetails.h create mode 100644 Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAssetBroker.h create mode 100644 Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAudioComponentVisualizer.cpp create mode 100644 Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAudioComponentVisualizer.h create mode 100644 Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODEventEditor.cpp create mode 100644 Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODEventEditor.h create mode 100644 Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODStudioEditorModule.cpp create mode 100644 Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODStudioEditorPrivatePCH.h create mode 100644 Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODStudioStyle.cpp create mode 100644 Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODStudioStyle.h create mode 100644 Plugins/FMODStudio/Source/FMODStudioEditor/Private/SFMODEventEditorPanel.cpp create mode 100644 Plugins/FMODStudio/Source/FMODStudioEditor/Private/SFMODEventEditorPanel.h create mode 100644 Plugins/FMODStudio/Source/FMODStudioEditor/Public/FMODStudioEditorModule.h create mode 100644 Plugins/Mantis/Mantis.uplugin create mode 100644 Plugins/Mantis/Resources/Icon128.png create mode 100644 Plugins/Mantis/Source/Mantis/Classes/MantisSettings.h create mode 100644 Plugins/Mantis/Source/Mantis/Mantis.Build.cs create mode 100644 Plugins/Mantis/Source/Mantis/Private/Mantis.cpp create mode 100644 Plugins/Mantis/Source/Mantis/Private/MantisPrivatePCH.h create mode 100644 Plugins/Mantis/Source/Mantis/Private/MantisSettings.cpp create mode 100644 Plugins/Mantis/Source/Mantis/Public/IMantis.h create mode 100644 Plugins/PolishBuildings/PolishBuildings.uplugin create mode 100644 Plugins/PolishBuildings/Resources/Icon128.png create mode 100644 Plugins/PolishBuildings/Source/PolishBuildings.Build.cs create mode 100644 Plugins/PolishBuildings/Source/Private/BuildingsProxyTool/BuildingsProxyTool.cpp create mode 100644 Plugins/PolishBuildings/Source/Private/BuildingsProxyTool/BuildingsProxyTool.h create mode 100644 Plugins/PolishBuildings/Source/Private/BuildingsProxyTool/SBuildingsProxyDialog.cpp create mode 100644 Plugins/PolishBuildings/Source/Private/BuildingsProxyTool/SBuildingsProxyDialog.h create mode 100644 Plugins/PolishBuildings/Source/Private/PolishBuildingsModule.cpp create mode 100644 Plugins/PolishBuildings/Source/Private/PolishBuildingsPrivatePCH.h create mode 100644 Plugins/PolishBuildings/Source/Private/PolishBuildingsTool/PolishBuildingsTool.cpp create mode 100644 Plugins/PolishBuildings/Source/Private/PolishBuildingsTool/PolishBuildingsTool.h create mode 100644 Plugins/PolishBuildings/Source/Private/PolishBuildingsTool/SPolishBuildingsDialog.cpp create mode 100644 Plugins/PolishBuildings/Source/Private/PolishBuildingsTool/SPolishBuildingsDialog.h create mode 100644 Plugins/PolishBuildings/Source/Private/SPolishBuildingsToolbar.cpp create mode 100644 Plugins/PolishBuildings/Source/Private/SPolishBuildingsToolbar.h create mode 100644 Plugins/PolishBuildings/Source/Public/IPolishBuildingsModule.h create mode 100644 Plugins/PolishBuildings/Source/Public/IPolishBuildingsTool.h create mode 100644 Plugins/SkillTree/Resources/Icon128.png create mode 100644 Plugins/SkillTree/SkillTree.uplugin create mode 100644 Plugins/SkillTree/Source/SkillTree/Classes/DynamicHexMap.h create mode 100644 Plugins/SkillTree/Source/SkillTree/Classes/HexMap.h create mode 100644 Plugins/SkillTree/Source/SkillTree/Classes/SkillObject.h create mode 100644 Plugins/SkillTree/Source/SkillTree/Classes/SkillTreeObject.h create mode 100644 Plugins/SkillTree/Source/SkillTree/Private/SkillObject.cpp create mode 100644 Plugins/SkillTree/Source/SkillTree/Private/SkillTree.cpp create mode 100644 Plugins/SkillTree/Source/SkillTree/Private/SkillTreeObject.cpp create mode 100644 Plugins/SkillTree/Source/SkillTree/Private/SkillTreePrivatePCH.h create mode 100644 Plugins/SkillTree/Source/SkillTree/Public/ISkillTree.h create mode 100644 Plugins/SkillTree/Source/SkillTree/SkillTree.Build.cs create mode 100644 Plugins/SkillTree/Source/SkillTreeEditor/Classes/SkillFactory.h create mode 100644 Plugins/SkillTree/Source/SkillTreeEditor/Classes/SkillTreeFactory.h create mode 100644 Plugins/SkillTree/Source/SkillTreeEditor/Private/SSkillTreeEditorViewportToolbar.cpp create mode 100644 Plugins/SkillTree/Source/SkillTreeEditor/Private/SSkillTreeEditorViewportToolbar.h create mode 100644 Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillAsset.cpp create mode 100644 Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillAsset.h create mode 100644 Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillFactory.cpp create mode 100644 Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeAsset.cpp create mode 100644 Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeAsset.h create mode 100644 Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeDetailsCustomization.cpp create mode 100644 Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeDetailsCustomization.h create mode 100644 Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditMode.cpp create mode 100644 Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditMode.h create mode 100644 Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditor.cpp create mode 100644 Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditorCommands.cpp create mode 100644 Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditorCommands.h create mode 100644 Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditorPrivatePCH.h create mode 100644 Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditorViewport.cpp create mode 100644 Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditorViewport.h create mode 100644 Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditorViewportClient.cpp create mode 100644 Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditorViewportClient.h create mode 100644 Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeFactory.cpp create mode 100644 Plugins/SkillTree/Source/SkillTreeEditor/Public/ISkillTreeEditor.h create mode 100644 Plugins/SkillTree/Source/SkillTreeEditor/SkillTreeEditor.Build.cs create mode 100644 Source/UnrealProject/Abilities/AbilityEventGroup.cpp create mode 100644 Source/UnrealProject/Abilities/AbilityEventGroup.h create mode 100644 Source/UnrealProject/Abilities/AbilityFilter.h create mode 100644 Source/UnrealProject/Abilities/AbilityInfo.cpp create mode 100644 Source/UnrealProject/Abilities/AbilityInfo.h create mode 100644 Source/UnrealProject/Abilities/AbilityState.h create mode 100644 Source/UnrealProject/Abilities/AbilityTriggerBase.cpp create mode 100644 Source/UnrealProject/Abilities/AbilityTriggerBase.h create mode 100644 Source/UnrealProject/Abilities/AuraTrigger.cpp create mode 100644 Source/UnrealProject/Abilities/AuraTrigger.h create mode 100644 Source/UnrealProject/Abilities/BlueprintAbilityLibrary.cpp create mode 100644 Source/UnrealProject/Abilities/BlueprintAbilityLibrary.h create mode 100644 Source/UnrealProject/Abilities/BombProjectile.cpp create mode 100644 Source/UnrealProject/Abilities/BombProjectile.h create mode 100644 Source/UnrealProject/Abilities/BossBarageBunny.cpp create mode 100644 Source/UnrealProject/Abilities/BossBarageBunny.h create mode 100644 Source/UnrealProject/Abilities/BossTargetBunny.cpp create mode 100644 Source/UnrealProject/Abilities/BossTargetBunny.h create mode 100644 Source/UnrealProject/Abilities/ConeComponent.cpp create mode 100644 Source/UnrealProject/Abilities/ConeComponent.h create mode 100644 Source/UnrealProject/Abilities/ConeTrigger.cpp create mode 100644 Source/UnrealProject/Abilities/ConeTrigger.h create mode 100644 Source/UnrealProject/Abilities/DealDamageProxy.cpp create mode 100644 Source/UnrealProject/Abilities/DealDamageProxy.h create mode 100644 Source/UnrealProject/Abilities/HomingProjectile.cpp create mode 100644 Source/UnrealProject/Abilities/HomingProjectile.h create mode 100644 Source/UnrealProject/Abilities/HoverProjectile.cpp create mode 100644 Source/UnrealProject/Abilities/HoverProjectile.h create mode 100644 Source/UnrealProject/Abilities/IngameSkillTree.cpp create mode 100644 Source/UnrealProject/Abilities/IngameSkillTree.h create mode 100644 Source/UnrealProject/Abilities/IntimidatingAuraTrigger.cpp create mode 100644 Source/UnrealProject/Abilities/IntimidatingAuraTrigger.h create mode 100644 Source/UnrealProject/Abilities/Modifier.cpp create mode 100644 Source/UnrealProject/Abilities/Modifier.h create mode 100644 Source/UnrealProject/Abilities/NativeModifiers.cpp create mode 100644 Source/UnrealProject/Abilities/NativeModifiers.h create mode 100644 Source/UnrealProject/Abilities/PreCastAbilityEventGroup.cpp create mode 100644 Source/UnrealProject/Abilities/PreCastAbilityEventGroup.h create mode 100644 Source/UnrealProject/Abilities/ProjectileBase.cpp create mode 100644 Source/UnrealProject/Abilities/ProjectileBase.h create mode 100644 Source/UnrealProject/Abilities/ScalingGraph.h create mode 100644 Source/UnrealProject/Abilities/SpiralProjectile.cpp create mode 100644 Source/UnrealProject/Abilities/SpiralProjectile.h create mode 100644 Source/UnrealProject/Abilities/TrailActor.cpp create mode 100644 Source/UnrealProject/Abilities/TrailActor.h create mode 100644 Source/UnrealProject/Abilities/TrailTrigger.cpp create mode 100644 Source/UnrealProject/Abilities/TrailTrigger.h create mode 100644 Source/UnrealProject/Abilities/poisonAuraTrigger.cpp create mode 100644 Source/UnrealProject/Abilities/poisonAuraTrigger.h create mode 100644 Source/UnrealProject/Creatures/AnimationProxy.cpp create mode 100644 Source/UnrealProject/Creatures/AnimationProxy.h create mode 100644 Source/UnrealProject/Creatures/BehaviorTree/BTTaskNodeClimb.cpp create mode 100644 Source/UnrealProject/Creatures/BehaviorTree/BTTaskNodeClimb.h create mode 100644 Source/UnrealProject/Creatures/BehaviorTree/BTTaskNodeJumpFence.cpp create mode 100644 Source/UnrealProject/Creatures/BehaviorTree/BTTaskNodeJumpFence.h create mode 100644 Source/UnrealProject/Creatures/BehaviorTree/EnemyAIController.cpp create mode 100644 Source/UnrealProject/Creatures/BehaviorTree/EnemyAIController.h create mode 100644 Source/UnrealProject/Creatures/BossBase.cpp create mode 100644 Source/UnrealProject/Creatures/BossBase.h create mode 100644 Source/UnrealProject/Creatures/CharacterBase.cpp create mode 100644 Source/UnrealProject/Creatures/CharacterBase.h create mode 100644 Source/UnrealProject/Creatures/EnemyBase.cpp create mode 100644 Source/UnrealProject/Creatures/EnemyBase.h create mode 100644 Source/UnrealProject/Creatures/GeneralEnemy.cpp create mode 100644 Source/UnrealProject/Creatures/GeneralEnemy.h create mode 100644 Source/UnrealProject/Creatures/IllusionCharacter.cpp create mode 100644 Source/UnrealProject/Creatures/IllusionCharacter.h create mode 100644 Source/UnrealProject/Creatures/MainCharacterAnimation.cpp create mode 100644 Source/UnrealProject/Creatures/MainCharacterAnimation.h create mode 100644 Source/UnrealProject/Creatures/MiniBossCreature.cpp create mode 100644 Source/UnrealProject/Creatures/MiniBossCreature.h create mode 100644 Source/UnrealProject/Creatures/MinionAnimInstance.cpp create mode 100644 Source/UnrealProject/Creatures/MinionAnimInstance.h create mode 100644 Source/UnrealProject/Creatures/NPCBase.cpp create mode 100644 Source/UnrealProject/Creatures/NPCBase.h create mode 100644 Source/UnrealProject/Creatures/NetworkCharacter.cpp create mode 100644 Source/UnrealProject/Creatures/NetworkCharacter.h create mode 100644 Source/UnrealProject/Creatures/NetworkGhost.cpp create mode 100644 Source/UnrealProject/Creatures/NetworkGhost.h create mode 100644 Source/UnrealProject/Creatures/NetworkPlayer.cpp create mode 100644 Source/UnrealProject/Creatures/NetworkPlayer.h create mode 100644 Source/UnrealProject/Creatures/NetworkPossessable.cpp create mode 100644 Source/UnrealProject/Creatures/NetworkPossessable.h create mode 100644 Source/UnrealProject/Creatures/OffensiveEnemy.cpp create mode 100644 Source/UnrealProject/Creatures/OffensiveEnemy.h create mode 100644 Source/UnrealProject/Creatures/PlayerKeyType.h create mode 100644 Source/UnrealProject/Creatures/RangedEnemy.cpp create mode 100644 Source/UnrealProject/Creatures/RangedEnemy.h create mode 100644 Source/UnrealProject/Creatures/TouhouBoss.cpp create mode 100644 Source/UnrealProject/Creatures/TouhouBoss.h create mode 100644 Source/UnrealProject/Creatures/WiebertAnimation.cpp create mode 100644 Source/UnrealProject/Creatures/WiebertAnimation.h create mode 100644 Source/UnrealProject/Doodads/BaseSkillObject.cpp create mode 100644 Source/UnrealProject/Doodads/BaseSkillObject.h create mode 100644 Source/UnrealProject/Doodads/CharacterCarousel.cpp create mode 100644 Source/UnrealProject/Doodads/CharacterCarousel.h create mode 100644 Source/UnrealProject/Doodads/CharacterSettings.cpp create mode 100644 Source/UnrealProject/Doodads/CharacterSettings.h create mode 100644 Source/UnrealProject/Doodads/FixupUtility.cpp create mode 100644 Source/UnrealProject/Doodads/FixupUtility.h create mode 100644 Source/UnrealProject/Doodads/NetworkDoodad.cpp create mode 100644 Source/UnrealProject/Doodads/NetworkDoodad.h create mode 100644 Source/UnrealProject/Doodads/NetworkDoor.cpp create mode 100644 Source/UnrealProject/Doodads/NetworkDoor.h create mode 100644 Source/UnrealProject/Doodads/NetworkSwitch.cpp create mode 100644 Source/UnrealProject/Doodads/NetworkSwitch.h create mode 100644 Source/UnrealProject/Doodads/NetworkSwitchComponent.cpp create mode 100644 Source/UnrealProject/Doodads/NetworkSwitchComponent.h create mode 100644 Source/UnrealProject/Doodads/NetworkTrigger.cpp create mode 100644 Source/UnrealProject/Doodads/NetworkTrigger.h create mode 100644 Source/UnrealProject/Doodads/ParticleEffect.cpp create mode 100644 Source/UnrealProject/Doodads/ParticleEffect.h create mode 100644 Source/UnrealProject/Doodads/Prefs.cpp create mode 100644 Source/UnrealProject/Doodads/Prefs.h create mode 100644 Source/UnrealProject/Doodads/Shrine.cpp create mode 100644 Source/UnrealProject/Doodads/Shrine.h create mode 100644 Source/UnrealProject/Effects/AbilityIndicator.cpp create mode 100644 Source/UnrealProject/Effects/AbilityIndicator.h create mode 100644 Source/UnrealProject/Effects/Effect.cpp create mode 100644 Source/UnrealProject/Effects/Effect.h create mode 100644 Source/UnrealProject/Effects/EffectFunctionLibrary.cpp create mode 100644 Source/UnrealProject/Effects/EffectFunctionLibrary.h create mode 100644 Source/UnrealProject/Effects/TeamData.cpp create mode 100644 Source/UnrealProject/Effects/TeamData.h create mode 100644 Source/UnrealProject/External/Events.hpp create mode 100644 Source/UnrealProject/External/HeatMapMetrics.cpp create mode 100644 Source/UnrealProject/External/HeatMapMetrics.h create mode 100644 Source/UnrealProject/External/InputDeviceBases.hpp create mode 100644 Source/UnrealProject/External/InputEnums.hpp create mode 100644 Source/UnrealProject/External/InputManager.cpp create mode 100644 Source/UnrealProject/External/InputManager.hpp create mode 100644 Source/UnrealProject/External/Metrics.cpp create mode 100644 Source/UnrealProject/External/Metrics.hpp create mode 100644 Source/UnrealProject/External/TeaCallback.hpp create mode 100644 Source/UnrealProject/External/TeaVector2.hpp create mode 100644 Source/UnrealProject/External/TeaVector3.hpp create mode 100644 Source/UnrealProject/External/append create mode 100644 Source/UnrealProject/External/timer create mode 100644 Source/UnrealProject/GUI/CombatText/CombatTextText.cpp create mode 100644 Source/UnrealProject/GUI/CombatText/CombatTextText.h create mode 100644 Source/UnrealProject/GUI/CombatText/CombatTextWidget.cpp create mode 100644 Source/UnrealProject/GUI/CombatText/CombatTextWidget.h create mode 100644 Source/UnrealProject/GUI/EventHUD.cpp create mode 100644 Source/UnrealProject/GUI/EventHUD.h create mode 100644 Source/UnrealProject/GUI/EventWidget.cpp create mode 100644 Source/UnrealProject/GUI/EventWidget.h create mode 100644 Source/UnrealProject/GUI/HUD/AbilityButton.cpp create mode 100644 Source/UnrealProject/GUI/HUD/AbilityButton.h create mode 100644 Source/UnrealProject/GUI/HUD/ButtonBarSwitcher.cpp create mode 100644 Source/UnrealProject/GUI/HUD/ButtonBarSwitcher.h create mode 100644 Source/UnrealProject/GUI/HUD/HealthBar.cpp create mode 100644 Source/UnrealProject/GUI/HUD/HealthBar.h create mode 100644 Source/UnrealProject/GUI/HUD/IngameHUD.cpp create mode 100644 Source/UnrealProject/GUI/HUD/IngameHUD.h create mode 100644 Source/UnrealProject/GUI/HUD/KOTHHUD.cpp create mode 100644 Source/UnrealProject/GUI/HUD/KOTHHUD.h create mode 100644 Source/UnrealProject/GUI/HUD/KeyDisplay.cpp create mode 100644 Source/UnrealProject/GUI/HUD/KeyDisplay.h create mode 100644 Source/UnrealProject/GUI/HUD/StatBar.cpp create mode 100644 Source/UnrealProject/GUI/HUD/StatBar.h create mode 100644 Source/UnrealProject/GUI/HUD/Timer.cpp create mode 100644 Source/UnrealProject/GUI/HUD/Timer.h create mode 100644 Source/UnrealProject/GUI/Lobby/LobbyCharacterSelect.cpp create mode 100644 Source/UnrealProject/GUI/Lobby/LobbyCharacterSelect.h create mode 100644 Source/UnrealProject/GUI/Lobby/LobbyMenu.cpp create mode 100644 Source/UnrealProject/GUI/Lobby/LobbyMenu.h create mode 100644 Source/UnrealProject/GUI/Lobby/LobbyPlayerSlot.cpp create mode 100644 Source/UnrealProject/GUI/Lobby/LobbyPlayerSlot.h create mode 100644 Source/UnrealProject/GUI/Lobby/LobbySlot.cpp create mode 100644 Source/UnrealProject/GUI/Lobby/LobbySlot.h create mode 100644 Source/UnrealProject/GUI/Menu/ButtonHintBar.cpp create mode 100644 Source/UnrealProject/GUI/Menu/ButtonHintBar.h create mode 100644 Source/UnrealProject/GUI/Menu/GameList.cpp create mode 100644 Source/UnrealProject/GUI/Menu/GameList.h create mode 100644 Source/UnrealProject/GUI/Menu/GameListItem.cpp create mode 100644 Source/UnrealProject/GUI/Menu/GameListItem.h create mode 100644 Source/UnrealProject/GUI/Menu/GraphicsMenu.cpp create mode 100644 Source/UnrealProject/GUI/Menu/GraphicsMenu.h create mode 100644 Source/UnrealProject/GUI/Menu/MapSelectionScreen.cpp create mode 100644 Source/UnrealProject/GUI/Menu/MapSelectionScreen.h create mode 100644 Source/UnrealProject/GUI/Menu/MapSlot.cpp create mode 100644 Source/UnrealProject/GUI/Menu/MapSlot.h create mode 100644 Source/UnrealProject/GUI/Menu/MenuAction.h create mode 100644 Source/UnrealProject/GUI/Menu/MenuButton.cpp create mode 100644 Source/UnrealProject/GUI/Menu/MenuButton.h create mode 100644 Source/UnrealProject/GUI/Menu/MenuEnum.h create mode 100644 Source/UnrealProject/GUI/Menu/MenuItemBase.cpp create mode 100644 Source/UnrealProject/GUI/Menu/MenuItemBase.h create mode 100644 Source/UnrealProject/GUI/Menu/MenuScreen.cpp create mode 100644 Source/UnrealProject/GUI/Menu/MenuScreen.h create mode 100644 Source/UnrealProject/GUI/Menu/MenuScreenBase.cpp create mode 100644 Source/UnrealProject/GUI/Menu/MenuScreenBase.h create mode 100644 Source/UnrealProject/GUI/Menu/MenuSlider.cpp create mode 100644 Source/UnrealProject/GUI/Menu/MenuSlider.h create mode 100644 Source/UnrealProject/GUI/Menu/OverlayMessageBox.cpp create mode 100644 Source/UnrealProject/GUI/Menu/OverlayMessageBox.h create mode 100644 Source/UnrealProject/GUI/Menu/OverlayProgressBar.cpp create mode 100644 Source/UnrealProject/GUI/Menu/OverlayProgressBar.h create mode 100644 Source/UnrealProject/GUI/Menu/ScoreBoard.cpp create mode 100644 Source/UnrealProject/GUI/Menu/ScoreBoard.h create mode 100644 Source/UnrealProject/GUI/Menu/ScoreBoardSlot.cpp create mode 100644 Source/UnrealProject/GUI/Menu/ScoreBoardSlot.h create mode 100644 Source/UnrealProject/GUI/Menu/ScreenOverlay.cpp create mode 100644 Source/UnrealProject/GUI/Menu/ScreenOverlay.h create mode 100644 Source/UnrealProject/GUI/Menu/SelectButton.cpp create mode 100644 Source/UnrealProject/GUI/Menu/SelectButton.h create mode 100644 Source/UnrealProject/GUI/Menu/SkillSelector.cpp create mode 100644 Source/UnrealProject/GUI/Menu/SkillSelector.h create mode 100644 Source/UnrealProject/GUI/Menu/SkillSelectorItem.cpp create mode 100644 Source/UnrealProject/GUI/Menu/SkillSelectorItem.h create mode 100644 Source/UnrealProject/GUI/Menu/SplashScreen.cpp create mode 100644 Source/UnrealProject/GUI/Menu/SplashScreen.h create mode 100644 Source/UnrealProject/GUI/Menu/SplashScreenItem.cpp create mode 100644 Source/UnrealProject/GUI/Menu/SplashScreenItem.h create mode 100644 Source/UnrealProject/GUI/Menu/StartPromptScreen.cpp create mode 100644 Source/UnrealProject/GUI/Menu/StartPromptScreen.h create mode 100644 Source/UnrealProject/GUI/Menu/SubMenu.cpp create mode 100644 Source/UnrealProject/GUI/Menu/SubMenu.h create mode 100644 Source/UnrealProject/GUI/Minimap/MiniMap.cpp create mode 100644 Source/UnrealProject/GUI/Minimap/MiniMap.h create mode 100644 Source/UnrealProject/GUI/Minimap/MiniMapIconWidget.cpp create mode 100644 Source/UnrealProject/GUI/Minimap/MiniMapIconWidget.h create mode 100644 Source/UnrealProject/GUI/Minimap/MiniMapVisionCircle.cpp create mode 100644 Source/UnrealProject/GUI/Minimap/MiniMapVisionCircle.h create mode 100644 Source/UnrealProject/GUI/Minimap/MiniMapWidget.cpp create mode 100644 Source/UnrealProject/GUI/Minimap/MiniMapWidget.h create mode 100644 Source/UnrealProject/GUI/PlayerSlot.cpp create mode 100644 Source/UnrealProject/GUI/PlayerSlot.h create mode 100644 Source/UnrealProject/GUI/SizeBorder.cpp create mode 100644 Source/UnrealProject/GUI/SizeBorder.h create mode 100644 Source/UnrealProject/GUI/SkillTree/EffectSelector.cpp create mode 100644 Source/UnrealProject/GUI/SkillTree/EffectSelector.h create mode 100644 Source/UnrealProject/GUI/SkillTree/EffectSlot.cpp create mode 100644 Source/UnrealProject/GUI/SkillTree/EffectSlot.h create mode 100644 Source/UnrealProject/GUI/SkillTree/HexagonTile.cpp create mode 100644 Source/UnrealProject/GUI/SkillTree/HexagonTile.h create mode 100644 Source/UnrealProject/GUI/SkillTree/SkillTreeState.h create mode 100644 Source/UnrealProject/GUI/SkillTree/SkillTreeWidget.cpp create mode 100644 Source/UnrealProject/GUI/SkillTree/SkillTreeWidget.h create mode 100644 Source/UnrealProject/GUI/SkillTree/SkillWidget.cpp create mode 100644 Source/UnrealProject/GUI/SkillTree/SkillWidget.h create mode 100644 Source/UnrealProject/GUI/SkillTree/SpellInfo.cpp create mode 100644 Source/UnrealProject/GUI/SkillTree/SpellInfo.h create mode 100644 Source/UnrealProject/GUI/SkillTree/SpellInfoDisplay.cpp create mode 100644 Source/UnrealProject/GUI/SkillTree/SpellInfoDisplay.h create mode 100644 Source/UnrealProject/GUI/Submenus/CharacterDependentSubMenus.cpp create mode 100644 Source/UnrealProject/GUI/Submenus/CharacterDependentSubMenus.h create mode 100644 Source/UnrealProject/GUI/Submenus/CharacterSubMenu.cpp create mode 100644 Source/UnrealProject/GUI/Submenus/CharacterSubMenu.h create mode 100644 Source/UnrealProject/GUI/Submenus/CustomizationSubMenu.cpp create mode 100644 Source/UnrealProject/GUI/Submenus/SkillBrowserSubMenu.cpp create mode 100644 Source/UnrealProject/GUI/Submenus/SkillBrowserSubMenu.h create mode 100644 Source/UnrealProject/GUI/Submenus/SkillTreeSubMenu.cpp create mode 100644 Source/UnrealProject/GUI/ToolTip/ToolTipText.cpp create mode 100644 Source/UnrealProject/GUI/ToolTip/ToolTipText.h create mode 100644 Source/UnrealProject/GUI/ToolTip/ToolTipWidget.cpp create mode 100644 Source/UnrealProject/GUI/ToolTip/ToolTipWidget.h create mode 100644 Source/UnrealProject/GUI/TransitionScreen.cpp create mode 100644 Source/UnrealProject/GUI/TransitionScreen.h create mode 100644 Source/UnrealProject/GameState/AbilityBindings.h create mode 100644 Source/UnrealProject/GameState/DefaultGameInstance.cpp create mode 100644 Source/UnrealProject/GameState/DefaultGameInstance.h create mode 100644 Source/UnrealProject/GameState/DefaultGameMode.cpp create mode 100644 Source/UnrealProject/GameState/DefaultGameMode.h create mode 100644 Source/UnrealProject/GameState/DefaultGameState.cpp create mode 100644 Source/UnrealProject/GameState/DefaultGameState.h create mode 100644 Source/UnrealProject/GameState/DefaultPlayer.cpp create mode 100644 Source/UnrealProject/GameState/DefaultPlayer.h create mode 100644 Source/UnrealProject/GameState/DefaultPlayerController.cpp create mode 100644 Source/UnrealProject/GameState/DefaultPlayerController.h create mode 100644 Source/UnrealProject/GameState/DefaultPlayerState.cpp create mode 100644 Source/UnrealProject/GameState/DefaultPlayerState.h create mode 100644 Source/UnrealProject/GameState/GameStateBase.cpp create mode 100644 Source/UnrealProject/GameState/GameStateBase.h create mode 100644 Source/UnrealProject/GameState/KOTHGameState.cpp create mode 100644 Source/UnrealProject/GameState/KOTHGameState.h create mode 100644 Source/UnrealProject/GameState/KOTHPlayerController.cpp create mode 100644 Source/UnrealProject/GameState/KOTHPlayerController.h create mode 100644 Source/UnrealProject/GameState/KOTHTeamState.h create mode 100644 Source/UnrealProject/GameState/KingOfTheHillGameMode.cpp create mode 100644 Source/UnrealProject/GameState/KingOfTheHillGameMode.h create mode 100644 Source/UnrealProject/GameState/MapData.h create mode 100644 Source/UnrealProject/GameState/MapList.h create mode 100644 Source/UnrealProject/GameState/MatchMaking.cpp create mode 100644 Source/UnrealProject/GameState/MatchMaking.h create mode 100644 Source/UnrealProject/GameState/MenuController.cpp create mode 100644 Source/UnrealProject/GameState/MenuController.h create mode 100644 Source/UnrealProject/GameState/MenuGameMode.cpp create mode 100644 Source/UnrealProject/GameState/MenuGameMode.h create mode 100644 Source/UnrealProject/GameState/MiniMapVolume.cpp create mode 100644 Source/UnrealProject/GameState/MiniMapVolume.h create mode 100644 Source/UnrealProject/GameState/PlayerControllerBase.cpp create mode 100644 Source/UnrealProject/GameState/PlayerControllerBase.h create mode 100644 Source/UnrealProject/GameState/PlayerSetupState.h create mode 100644 Source/UnrealProject/GameState/PlayerStateBase.cpp create mode 100644 Source/UnrealProject/GameState/PlayerStateBase.h create mode 100644 Source/UnrealProject/GameState/SessionManager.cpp create mode 100644 Source/UnrealProject/GameState/SessionManager.h create mode 100644 Source/UnrealProject/Items/ItemBase.cpp create mode 100644 Source/UnrealProject/Items/ItemBase.h create mode 100644 Source/UnrealProject/Sound/MusicPlayer.cpp create mode 100644 Source/UnrealProject/Sound/MusicPlayer.h create mode 100644 Source/UnrealProject/Sound/SoundEffect.cpp create mode 100644 Source/UnrealProject/Sound/SoundEffect.h create mode 100644 Source/UnrealProject/Sound/SoundFunctionLibrary.cpp create mode 100644 Source/UnrealProject/Sound/SoundFunctionLibrary.h create mode 100644 Source/UnrealProject/Spawners/CreatureSpawn.cpp create mode 100644 Source/UnrealProject/Spawners/CreatureSpawn.h create mode 100644 Source/UnrealProject/Spawners/CreatureSpawnComponent.cpp create mode 100644 Source/UnrealProject/Spawners/CreatureSpawnComponent.h create mode 100644 Source/UnrealProject/Spawners/KOTHBossSpawner.cpp create mode 100644 Source/UnrealProject/Spawners/KOTHBossSpawner.h create mode 100644 Source/UnrealProject/Spawners/KOTHMinionSpawner.cpp create mode 100644 Source/UnrealProject/Spawners/KOTHMinionSpawner.h create mode 100644 Source/UnrealProject/Spawners/KOTHSpawnerBase.cpp create mode 100644 Source/UnrealProject/Spawners/KOTHSpawnerBase.h create mode 100644 Source/UnrealProject/Spawners/LobbySpawn.cpp create mode 100644 Source/UnrealProject/Spawners/LobbySpawn.h create mode 100644 Source/UnrealProject/Spawners/PatrolSpawn.cpp create mode 100644 Source/UnrealProject/Spawners/PatrolSpawn.h create mode 100644 Source/UnrealProject/Spawners/PlayerSpawn.cpp create mode 100644 Source/UnrealProject/Spawners/PlayerSpawn.h create mode 100644 Source/UnrealProject/Spawners/SpawnerBase.cpp create mode 100644 Source/UnrealProject/Spawners/SpawnerBase.h create mode 100644 Source/UnrealProject/UnrealProject.Build.cs create mode 100644 Source/UnrealProject/UnrealProject.cpp create mode 100644 Source/UnrealProject/UnrealProject.h create mode 100644 Source/UnrealProjectDev.Target.cs create mode 100644 Source/UnrealProjectEditor.Target.cs create mode 100644 UnrealProjectDev.uproject create mode 100644 cursor.cur diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..2299507 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +*.uasset filter=lfs diff=lfs merge=lfs -text +*.wmv filter=lfs diff=lfs merge=lfs -text +*.mp4 filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..895a382 --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +*.dll +*.pch +*.lib +*.a +*.so + +*.obj +*.exp +*Intermediate/ +*Binaries/ +*.dylib +*.pdb +*.exe \ No newline at end of file diff --git a/Config/DefaultEditor.ini b/Config/DefaultEditor.ini new file mode 100644 index 0000000..c54030e --- /dev/null +++ b/Config/DefaultEditor.ini @@ -0,0 +1,8 @@ +[UnrealEd.SimpleMap] +SimpleMapName=/Game/ThirdPersonCPP/Maps/ThirdPersonExampleMap + +[EditoronlyBP] +bAllowClassAndBlueprintPinMatching=true +bReplaceBlueprintWithClass= true +bDontLoadBlueprintOutsideEditor= true +bBlueprintIsNotBlueprintType= true \ No newline at end of file diff --git a/Config/DefaultEditorPerProjectUserSettings.ini b/Config/DefaultEditorPerProjectUserSettings.ini new file mode 100644 index 0000000..0935f0f --- /dev/null +++ b/Config/DefaultEditorPerProjectUserSettings.ini @@ -0,0 +1,40 @@ +[ContentBrowser] +ContentBrowserTab1.SelectedPaths=/Game/ThirdPersonCPP + +[/Script/EditorStyle.EditorStyleSettings] +SelectionColor=(R=0.728000,G=0.364000,B=0.003000,A=1.000000) +PressedSelectionColor=(R=0.701000,G=0.225000,B=0.003000,A=1.000000) +InactiveSelectionColor=(R=0.250000,G=0.250000,B=0.250000,A=1.000000) +KeyboardFocusColor=(R=0.000000,G=0.000000,B=0.000000,A=0.000000) +ColorVisionDeficiencyPreviewType=CVD_NormalVision +bUseSmallToolBarIcons=False +bEnableWindowAnimations=False +bShowFriendlyNames=True +bExpandConfigurationMenus=False +bShowProjectMenus=True +bShowLaunchMenus=True +LogTimestampMode=None +bOpenAssetEditorTabsInNewWindow=True + +[/Script/UnrealEd.EditorPerProjectUserSettings] +bDisplayUIExtensionPoints=False +bDisplayDocumentationLink=False +bDisplayActionListItemRefIds=False +bAlwaysGatherBehaviorTreeDebuggerData=False +bDisplayEngineVersionInBadge=False +bShowFrameRateAndMemory=False +bThrottleCPUWhenNotForeground=True +bMonitorEditorPerformance=True +bAutomaticallyHotReloadNewClasses=False +bKeepAttachHierarchy=True +bUseCurvesForDistributions=False +PropertyMatrix_NumberOfPasteOperationsBeforeWarning=20 +bSCSEditorShowGrid=True +bSCSEditorShowFloor=False +SCSViewportCameraSpeed=4 +bAutoloadCheckedOutPackages=False +bSuppressFullyLoadPrompt=True +bAllowSelectTranslucent=True +MaterialQualityLevel=1 + + diff --git a/Config/DefaultEngine.ini b/Config/DefaultEngine.ini new file mode 100644 index 0000000..6b0f69d --- /dev/null +++ b/Config/DefaultEngine.ini @@ -0,0 +1,180 @@ +[/Script/EngineSettings.GameMapsSettings] +GameDefaultMap=/Game/Assets/Levels/Menu +EditorStartupMap=/Game/Assets/Levels/Map_KOTH_Darko +GlobalDefaultGameMode="/Script/UnrealProject.DefaultGameMode" +GameInstanceClass=/Script/UnrealProject.DefaultGameInstance + +[/Script/Engine.Engine] ++ActiveGameNameRedirects=(OldGameName="TP_ThirdPerson",NewGameName="/Script/UnrealProject") ++ActiveGameNameRedirects=(OldGameName="/Script/TP_ThirdPerson",NewGameName="/Script/UnrealProject") ++ActiveGameNameRedirects=(OldGameName="/Script/GameName",NewGameName="/Script/UnrealProject") + +[Core.Log] + LogNet=verbose + LogOnline=verbose + +[/Script/Engine.GameEngine] +!NetDriverDefinitions=ClearArray + +NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="OnlineSubsystemSteam.SteamNetDriver",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver") + +[OnlineSubsystem] +DefaultPlatformService=Steam +PollingIntervalInMs=20 + +[OnlineSubsystemSteam] +bEnabled=true +;SteamDevAppId=233250 +SteamDevAppId=480 +GameServerQueryPort=27015 +bRelaunchInSteam=false +GameVersion=1.0.0.0 +bVACEnabled=1 +bAllowP2PPacketRelay=true +P2PConnectionTimeout=90 + +[/Script/OnlineSubsystemSteam.SteamNetDriver] +NetConnectionClassName="OnlineSubsystemSteam.SteamNetConnection" + +[/Script/HardwareTargeting.HardwareTargetingSettings] +TargetedHardwareClass=Desktop +AppliedTargetedHardwareClass=Desktop +DefaultGraphicsPerformance=Maximum +AppliedDefaultGraphicsPerformance=Maximum + +[/Script/Engine.CollisionProfile] +-Profiles=(Name="NoCollision",CollisionEnabled=NoCollision,ObjectTypeName="WorldStatic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore)),HelpMessage="No collision",bCanModify=False) +-Profiles=(Name="BlockAll",CollisionEnabled=QueryAndPhysics,ObjectTypeName="WorldStatic",CustomResponses=,HelpMessage="WorldStatic object that blocks all actors by default. All new custom channels will use its own default response. ",bCanModify=False) +-Profiles=(Name="OverlapAll",CollisionEnabled=QueryOnly,ObjectTypeName="WorldStatic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Overlap),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldStatic object that overlaps all actors by default. All new custom channels will use its own default response. ",bCanModify=False) +-Profiles=(Name="BlockAllDynamic",CollisionEnabled=QueryAndPhysics,ObjectTypeName="WorldDynamic",CustomResponses=,HelpMessage="WorldDynamic object that blocks all actors by default. All new custom channels will use its own default response. ",bCanModify=False) +-Profiles=(Name="OverlapAllDynamic",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Overlap),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldDynamic object that overlaps all actors by default. All new custom channels will use its own default response. ",bCanModify=False) +-Profiles=(Name="IgnoreOnlyPawn",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Pawn",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore)),HelpMessage="WorldDynamic object that ignores Pawn and Vehicle. All other channels will be set to default.",bCanModify=False) +-Profiles=(Name="OverlapOnlyPawn",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Pawn",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Ignore)),HelpMessage="WorldDynamic object that overlaps Pawn, Camera, and Vehicle. All other channels will be set to default. ",bCanModify=False) +-Profiles=(Name="Pawn",CollisionEnabled=QueryAndPhysics,ObjectTypeName="Pawn",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="Pawn object. Can be used for capsule of any playerable character or AI. ",bCanModify=False) +-Profiles=(Name="Spectator",CollisionEnabled=QueryOnly,ObjectTypeName="Pawn",CustomResponses=((Channel="WorldStatic",Response=ECR_Block),(Channel="Pawn",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore),(Channel="WorldDynamic",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore),(Channel="PhysicsBody",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore),(Channel="Destructible",Response=ECR_Ignore)),HelpMessage="Pawn object that ignores all other actors except WorldStatic.",bCanModify=False) +-Profiles=(Name="CharacterMesh",CollisionEnabled=QueryOnly,ObjectTypeName="Pawn",CustomResponses=((Channel="Pawn",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore)),HelpMessage="Pawn object that is used for Character Mesh. All other channels will be set to default.",bCanModify=False) +-Profiles=(Name="PhysicsActor",CollisionEnabled=QueryAndPhysics,ObjectTypeName="PhysicsBody",CustomResponses=,HelpMessage="Simulating actors",bCanModify=False) +-Profiles=(Name="Destructible",CollisionEnabled=QueryAndPhysics,ObjectTypeName="Destructible",CustomResponses=,HelpMessage="Destructible actors",bCanModify=False) +-Profiles=(Name="InvisibleWall",CollisionEnabled=QueryAndPhysics,ObjectTypeName="WorldStatic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="WorldStatic object that is invisible.",bCanModify=False) +-Profiles=(Name="InvisibleWallDynamic",CollisionEnabled=QueryAndPhysics,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="WorldDynamic object that is invisible.",bCanModify=False) +-Profiles=(Name="Trigger",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Ignore),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldDynamic object that is used for trigger. All other channels will be set to default.",bCanModify=False) +-Profiles=(Name="Ragdoll",CollisionEnabled=QueryAndPhysics,ObjectTypeName="PhysicsBody",CustomResponses=((Channel="Pawn",Response=ECR_Ignore)),HelpMessage="Simulating Skeletal Mesh Component. All other channels will be set to default.",bCanModify=False) +-Profiles=(Name="Vehicle",CollisionEnabled=QueryAndPhysics,ObjectTypeName="Vehicle",CustomResponses=,HelpMessage="Vehicle object that blocks Vehicle, WorldStatic, and WorldDynamic. All other channels will be set to default.",bCanModify=False) +-Profiles=(Name="UI",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Block),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldStatic object that overlaps all actors by default. All new custom channels will use its own default response. ",bCanModify=False) ++Profiles=(Name="NoCollision",CollisionEnabled=NoCollision,ObjectTypeName="WorldStatic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore)),HelpMessage="No collision",bCanModify=False) ++Profiles=(Name="BlockAll",CollisionEnabled=QueryAndPhysics,ObjectTypeName="WorldStatic",CustomResponses=,HelpMessage="WorldStatic object that blocks all actors by default. All new custom channels will use its own default response. ",bCanModify=False) ++Profiles=(Name="OverlapAll",CollisionEnabled=QueryOnly,ObjectTypeName="WorldStatic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Overlap),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldStatic object that overlaps all actors by default. All new custom channels will use its own default response. ",bCanModify=False) ++Profiles=(Name="BlockAllDynamic",CollisionEnabled=QueryAndPhysics,ObjectTypeName="WorldDynamic",CustomResponses=,HelpMessage="WorldDynamic object that blocks all actors by default. All new custom channels will use its own default response. ",bCanModify=False) ++Profiles=(Name="OverlapAllDynamic",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Overlap),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldDynamic object that overlaps all actors by default. All new custom channels will use its own default response. ",bCanModify=False) ++Profiles=(Name="IgnoreOnlyPawn",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Pawn",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore)),HelpMessage="WorldDynamic object that ignores Pawn and Vehicle. All other channels will be set to default.",bCanModify=False) ++Profiles=(Name="OverlapOnlyPawn",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Pawn",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Ignore)),HelpMessage="WorldDynamic object that overlaps Pawn, Camera, and Vehicle. All other channels will be set to default. ",bCanModify=False) ++Profiles=(Name="Pawn",CollisionEnabled=QueryAndPhysics,ObjectTypeName="Pawn",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="Pawn object. Can be used for capsule of any playerable character or AI. ",bCanModify=False) ++Profiles=(Name="Spectator",CollisionEnabled=QueryOnly,ObjectTypeName="Pawn",CustomResponses=((Channel="WorldStatic"),(Channel="Pawn",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore),(Channel="WorldDynamic",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore),(Channel="PhysicsBody",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore),(Channel="Destructible",Response=ECR_Ignore)),HelpMessage="Pawn object that ignores all other actors except WorldStatic.",bCanModify=False) ++Profiles=(Name="CharacterMesh",CollisionEnabled=QueryOnly,ObjectTypeName="Pawn",CustomResponses=((Channel="Pawn",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore)),HelpMessage="Pawn object that is used for Character Mesh. All other channels will be set to default.",bCanModify=False) ++Profiles=(Name="PhysicsActor",CollisionEnabled=QueryAndPhysics,ObjectTypeName="PhysicsBody",CustomResponses=,HelpMessage="Simulating actors",bCanModify=False) ++Profiles=(Name="Destructible",CollisionEnabled=QueryAndPhysics,ObjectTypeName="Destructible",CustomResponses=,HelpMessage="Destructible actors",bCanModify=False) ++Profiles=(Name="InvisibleWall",CollisionEnabled=QueryAndPhysics,ObjectTypeName="WorldStatic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="WorldStatic object that is invisible.",bCanModify=False) ++Profiles=(Name="InvisibleWallDynamic",CollisionEnabled=QueryAndPhysics,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="WorldDynamic object that is invisible.",bCanModify=False) ++Profiles=(Name="Trigger",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Ignore),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldDynamic object that is used for trigger. All other channels will be set to default.",bCanModify=False) ++Profiles=(Name="Ragdoll",CollisionEnabled=QueryAndPhysics,ObjectTypeName="PhysicsBody",CustomResponses=((Channel="Pawn",Response=ECR_Ignore)),HelpMessage="Simulating Skeletal Mesh Component. All other channels will be set to default.",bCanModify=False) ++Profiles=(Name="Vehicle",CollisionEnabled=QueryAndPhysics,ObjectTypeName="Vehicle",CustomResponses=,HelpMessage="Vehicle object that blocks Vehicle, WorldStatic, and WorldDynamic. All other channels will be set to default.",bCanModify=False) ++Profiles=(Name="UI",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility"),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldStatic object that overlaps all actors by default. All new custom channels will use its own default response. ",bCanModify=False) ++Profiles=(Name="Triggers",CollisionEnabled=QueryOnly,ObjectTypeName="Trigger",CustomResponses=((Channel="WorldStatic",Response=ECR_Ignore),(Channel="WorldDynamic",Response=ECR_Ignore),(Channel="Pawn",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore),(Channel="PhysicsBody",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore),(Channel="Destructible",Response=ECR_Ignore),(Channel="EngineTraceChannel1",Response=ECR_Ignore),(Channel="EngineTraceChannel2",Response=ECR_Ignore),(Channel="EngineTraceChannel3",Response=ECR_Ignore),(Channel="EngineTraceChannel4",Response=ECR_Ignore),(Channel="EngineTraceChannel5",Response=ECR_Ignore),(Channel="EngineTraceChannel6",Response=ECR_Ignore),(Channel="Units",Response=ECR_Overlap),(Channel="Players",Response=ECR_Overlap),(Channel="Ghost",Response=ECR_Ignore),(Channel="GameTraceChannel7",Response=ECR_Ignore),(Channel="GameTraceChannel8",Response=ECR_Ignore),(Channel="GameTraceChannel9",Response=ECR_Ignore),(Channel="GameTraceChannel10",Response=ECR_Ignore),(Channel="GameTraceChannel11",Response=ECR_Ignore),(Channel="GameTraceChannel12",Response=ECR_Ignore),(Channel="GameTraceChannel13",Response=ECR_Ignore),(Channel="GameTraceChannel14",Response=ECR_Ignore),(Channel="GameTraceChannel15",Response=ECR_Ignore),(Channel="GameTraceChannel16",Response=ECR_Ignore),(Channel="GameTraceChannel17",Response=ECR_Ignore),(Channel="GameTraceChannel18",Response=ECR_Ignore)),HelpMessage="Needs description",bCanModify=True) ++Profiles=(Name="Units",CollisionEnabled=QueryAndPhysics,ObjectTypeName="Units",CustomResponses=((Channel="Trigger",Response=ECR_Overlap),(Channel="Projectile",Response=ECR_Overlap),(Channel="ProjectileUnitsOnly",Response=ECR_Overlap)),HelpMessage="Needs description",bCanModify=True) ++Profiles=(Name="Projectiles",CollisionEnabled=QueryAndPhysics,ObjectTypeName="Projectile",CustomResponses=((Channel="WorldDynamic",Response=ECR_Ignore),(Channel="Pawn",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore),(Channel="PhysicsBody",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore),(Channel="Destructible",Response=ECR_Ignore),(Channel="EngineTraceChannel1",Response=ECR_Ignore),(Channel="EngineTraceChannel2",Response=ECR_Ignore),(Channel="EngineTraceChannel3",Response=ECR_Ignore),(Channel="EngineTraceChannel4",Response=ECR_Ignore),(Channel="EngineTraceChannel5",Response=ECR_Ignore),(Channel="EngineTraceChannel6",Response=ECR_Ignore),(Channel="Units",Response=ECR_Overlap),(Channel="Players",Response=ECR_Overlap),(Channel="Ghost",Response=ECR_Ignore),(Channel="GameTraceChannel7",Response=ECR_Ignore),(Channel="GameTraceChannel8",Response=ECR_Ignore),(Channel="GameTraceChannel9",Response=ECR_Ignore),(Channel="GameTraceChannel10",Response=ECR_Ignore),(Channel="GameTraceChannel11",Response=ECR_Ignore),(Channel="GameTraceChannel12",Response=ECR_Ignore),(Channel="GameTraceChannel13",Response=ECR_Ignore),(Channel="GameTraceChannel14",Response=ECR_Ignore),(Channel="GameTraceChannel15",Response=ECR_Ignore),(Channel="GameTraceChannel16",Response=ECR_Ignore),(Channel="GameTraceChannel17",Response=ECR_Ignore),(Channel="GameTraceChannel18",Response=ECR_Ignore)),HelpMessage="for projectiles",bCanModify=True) ++Profiles=(Name="PlayerOverlap",CollisionEnabled=QueryOnly,ObjectTypeName="Units",CustomResponses=((Channel="WorldStatic",Response=ECR_Ignore),(Channel="WorldDynamic",Response=ECR_Ignore),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore),(Channel="PhysicsBody",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore),(Channel="Destructible",Response=ECR_Ignore),(Channel="EngineTraceChannel1",Response=ECR_Ignore),(Channel="EngineTraceChannel2",Response=ECR_Ignore),(Channel="EngineTraceChannel3",Response=ECR_Ignore),(Channel="EngineTraceChannel4",Response=ECR_Ignore),(Channel="EngineTraceChannel5",Response=ECR_Ignore),(Channel="EngineTraceChannel6",Response=ECR_Ignore),(Channel="Units",Response=ECR_Overlap),(Channel="Players",Response=ECR_Overlap),(Channel="Ghost",Response=ECR_Ignore),(Channel="GameTraceChannel7",Response=ECR_Ignore),(Channel="GameTraceChannel8",Response=ECR_Ignore),(Channel="GameTraceChannel9",Response=ECR_Ignore),(Channel="GameTraceChannel10",Response=ECR_Ignore),(Channel="GameTraceChannel11",Response=ECR_Ignore),(Channel="GameTraceChannel12",Response=ECR_Ignore),(Channel="GameTraceChannel13",Response=ECR_Ignore),(Channel="GameTraceChannel14",Response=ECR_Ignore),(Channel="GameTraceChannel15",Response=ECR_Ignore),(Channel="GameTraceChannel16",Response=ECR_Ignore),(Channel="GameTraceChannel17",Response=ECR_Ignore),(Channel="GameTraceChannel18",Response=ECR_Ignore)),HelpMessage="For Player only Overlap",bCanModify=True) ++Profiles=(Name="Players",CollisionEnabled=QueryAndPhysics,ObjectTypeName="Players",CustomResponses=((Channel="Trigger",Response=ECR_Overlap),(Channel="Projectile",Response=ECR_Overlap),(Channel="ProjectileUnitsOnly",Response=ECR_Overlap)),HelpMessage="Players",bCanModify=True) ++Profiles=(Name="Ghosts",CollisionEnabled=QueryAndPhysics,ObjectTypeName="Ghost",CustomResponses=((Channel="Units",Response=ECR_Overlap),(Channel="Trigger",Response=ECR_Overlap),(Channel="Projectile",Response=ECR_Overlap),(Channel="Players",Response=ECR_Ignore)),HelpMessage="Ghosts",bCanModify=True) ++Profiles=(Name="GhostOverlap",CollisionEnabled=QueryOnly,ObjectTypeName="Units",CustomResponses=((Channel="WorldStatic",Response=ECR_Ignore),(Channel="WorldDynamic",Response=ECR_Ignore),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore),(Channel="PhysicsBody",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore),(Channel="Destructible",Response=ECR_Ignore),(Channel="EngineTraceChannel1",Response=ECR_Ignore),(Channel="EngineTraceChannel2",Response=ECR_Ignore),(Channel="EngineTraceChannel3",Response=ECR_Ignore),(Channel="EngineTraceChannel4",Response=ECR_Ignore),(Channel="EngineTraceChannel5",Response=ECR_Ignore),(Channel="EngineTraceChannel6",Response=ECR_Ignore),(Channel="Units",Response=ECR_Overlap),(Channel="Players",Response=ECR_Ignore),(Channel="Ghost",Response=ECR_Overlap),(Channel="GameTraceChannel7",Response=ECR_Ignore),(Channel="GameTraceChannel8",Response=ECR_Ignore),(Channel="GameTraceChannel9",Response=ECR_Ignore),(Channel="GameTraceChannel10",Response=ECR_Ignore),(Channel="GameTraceChannel11",Response=ECR_Ignore),(Channel="GameTraceChannel12",Response=ECR_Ignore),(Channel="GameTraceChannel13",Response=ECR_Ignore),(Channel="GameTraceChannel14",Response=ECR_Ignore),(Channel="GameTraceChannel15",Response=ECR_Ignore),(Channel="GameTraceChannel16",Response=ECR_Ignore),(Channel="GameTraceChannel17",Response=ECR_Ignore),(Channel="GameTraceChannel18",Response=ECR_Ignore)),HelpMessage="For Ghost only Overlap",bCanModify=True) ++Profiles=(Name="ProjectileUnitsOnly",CollisionEnabled=QueryAndPhysics,ObjectTypeName="ProjectileUnitsOnly",CustomResponses=((Channel="WorldStatic",Response=ECR_Ignore),(Channel="WorldDynamic",Response=ECR_Ignore),(Channel="Pawn",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore),(Channel="PhysicsBody",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore),(Channel="Destructible",Response=ECR_Ignore),(Channel="EngineTraceChannel1",Response=ECR_Ignore),(Channel="EngineTraceChannel2",Response=ECR_Ignore),(Channel="EngineTraceChannel3",Response=ECR_Ignore),(Channel="EngineTraceChannel4",Response=ECR_Ignore),(Channel="EngineTraceChannel5",Response=ECR_Ignore),(Channel="EngineTraceChannel6",Response=ECR_Ignore),(Channel="Units",Response=ECR_Overlap),(Channel="Players",Response=ECR_Overlap),(Channel="Ghost",Response=ECR_Ignore),(Channel="GameTraceChannel9",Response=ECR_Ignore),(Channel="GameTraceChannel10",Response=ECR_Ignore),(Channel="GameTraceChannel11",Response=ECR_Ignore),(Channel="GameTraceChannel12",Response=ECR_Ignore),(Channel="GameTraceChannel13",Response=ECR_Ignore),(Channel="GameTraceChannel14",Response=ECR_Ignore),(Channel="GameTraceChannel15",Response=ECR_Ignore),(Channel="GameTraceChannel16",Response=ECR_Ignore),(Channel="GameTraceChannel17",Response=ECR_Ignore),(Channel="GameTraceChannel18",Response=ECR_Ignore)),HelpMessage="Needs description",bCanModify=True) ++DefaultChannelResponses=(Channel=ECC_GameTraceChannel1,Name="Units",DefaultResponse=ECR_Block,bTraceType=False,bStaticObject=False) ++DefaultChannelResponses=(Channel=ECC_GameTraceChannel2,Name="Trigger",DefaultResponse=ECR_Ignore,bTraceType=False,bStaticObject=False) ++DefaultChannelResponses=(Channel=ECC_GameTraceChannel3,Name="Projectile",DefaultResponse=ECR_Ignore,bTraceType=False,bStaticObject=False) ++DefaultChannelResponses=(Channel=ECC_GameTraceChannel4,Name="Players",DefaultResponse=ECR_Block,bTraceType=False,bStaticObject=False) ++DefaultChannelResponses=(Channel=ECC_GameTraceChannel5,Name="Dash",DefaultResponse=ECR_Ignore,bTraceType=True,bStaticObject=False) ++DefaultChannelResponses=(Channel=ECC_GameTraceChannel6,Name="Ghost",DefaultResponse=ECR_Block,bTraceType=False,bStaticObject=False) ++DefaultChannelResponses=(Channel=ECC_GameTraceChannel7,Name="Hover",DefaultResponse=ECR_Ignore,bTraceType=True,bStaticObject=False) ++DefaultChannelResponses=(Channel=ECC_GameTraceChannel8,Name="ProjectileUnitsOnly",DefaultResponse=ECR_Ignore,bTraceType=False,bStaticObject=False) ++EditProfiles=(Name="OverlapAll",CustomResponses=((Channel="Units",Response=ECR_Overlap),(Channel="Players",Response=ECR_Overlap),(Channel="Ghost",Response=ECR_Overlap))) ++EditProfiles=(Name="OverlapAllDynamic",CustomResponses=((Channel="Units",Response=ECR_Overlap),(Channel="Players",Response=ECR_Overlap),(Channel="Ghost",Response=ECR_Overlap))) ++EditProfiles=(Name="IgnoreOnlyPawn",CustomResponses=((Channel="Units",Response=ECR_Ignore),(Channel="Players",Response=ECR_Ignore),(Channel="Dash",Response=ECR_Ignore),(Channel="Ghost",Response=ECR_Ignore))) ++EditProfiles=(Name="OverlapOnlyPawn",CustomResponses=((Channel="Units",Response=ECR_Overlap),(Channel="Players",Response=ECR_Overlap),(Channel="Ghost",Response=ECR_Overlap))) ++EditProfiles=(Name="Spectator",CustomResponses=((Channel="Units",Response=ECR_Ignore),(Channel="Players",Response=ECR_Ignore),(Channel="Dash",Response=ECR_Ignore),(Channel="Ghost",Response=ECR_Ignore))) ++EditProfiles=(Name="CharacterMesh",CustomResponses=((Channel="Units",Response=ECR_Ignore),(Channel="Players",Response=ECR_Ignore),(Channel="Ghost",Response=ECR_Ignore))) ++EditProfiles=(Name="Trigger",CustomResponses=((Channel="Units",Response=ECR_Overlap),(Channel="Players",Response=ECR_Overlap),(Channel="Ghost",Response=ECR_Overlap))) ++EditProfiles=(Name="Ragdoll",CustomResponses=((Channel="Units",Response=ECR_Ignore),(Channel="Players",Response=ECR_Ignore),(Channel="Ghost",Response=ECR_Ignore))) ++EditProfiles=(Name="UI",CustomResponses=((Channel="Units",Response=ECR_Overlap),(Channel="Players",Response=ECR_Overlap),(Channel="Ghost",Response=ECR_Overlap))) ++EditProfiles=(Name="BlockAll",CustomResponses=((Channel="Projectile"),(Channel="Dash"),(Channel="Hover"))) +-ProfileRedirects=(OldName="BlockingVolume",NewName="InvisibleWall") +-ProfileRedirects=(OldName="InterpActor",NewName="IgnoreOnlyPawn") +-ProfileRedirects=(OldName="StaticMeshComponent",NewName="BlockAllDynamic") +-ProfileRedirects=(OldName="SkeletalMeshActor",NewName="PhysicsActor") +-ProfileRedirects=(OldName="InvisibleActor",NewName="InvisibleWallDynamic") ++ProfileRedirects=(OldName="BlockingVolume",NewName="InvisibleWall") ++ProfileRedirects=(OldName="InterpActor",NewName="IgnoreOnlyPawn") ++ProfileRedirects=(OldName="StaticMeshComponent",NewName="BlockAllDynamic") ++ProfileRedirects=(OldName="SkeletalMeshActor",NewName="PhysicsActor") ++ProfileRedirects=(OldName="InvisibleActor",NewName="InvisibleWallDynamic") ++ProfileRedirects=(OldName="UnitOverlap",NewName="PlayerOverlap") ++ProfileRedirects=(OldName="projectiles",NewName="Projectiles") ++ProfileRedirects=(OldName="Ghost",NewName="Ghosts") +-CollisionChannelRedirects=(OldName="Static",NewName="WorldStatic") +-CollisionChannelRedirects=(OldName="Dynamic",NewName="WorldDynamic") +-CollisionChannelRedirects=(OldName="VehicleMovement",NewName="Vehicle") +-CollisionChannelRedirects=(OldName="PawnMovement",NewName="Pawn") ++CollisionChannelRedirects=(OldName="Static",NewName="WorldStatic") ++CollisionChannelRedirects=(OldName="Dynamic",NewName="WorldDynamic") ++CollisionChannelRedirects=(OldName="VehicleMovement",NewName="Vehicle") ++CollisionChannelRedirects=(OldName="PawnMovement",NewName="Pawn") + +[/Script/Engine.UserInterfaceSettings] +RenderFocusRule=Never +DefaultCursor=None +TextEditBeamCursor=None +CrosshairsCursor=None +GrabHandCursor=None +GrabHandClosedCursor=None +SlashedCircleCursor=None +ApplicationScale=1.000000 +UIScaleRule=ShortestSide +CustomScalingRuleClass=None +UIScaleCurve=(EditorCurveData=(PreInfinityExtrap=RCCE_Constant,PostInfinityExtrap=RCCE_Constant,Keys=((Time=480.000000,Value=0.444000),(Time=720.000000,Value=0.666000),(Time=1080.000000,Value=1.000000),(Time=8640.000000,Value=8.000000)),DefaultValue=340282346638528859811704183484516925440.000000),ExternalCurve=None) + +[/Script/Engine.RendererSettings] +r.MobileHDR=True +r.MobileNumDynamicPointLights=4 +r.MobileDynamicPointLightsUseStaticBranch=True +r.DiscardUnusedQuality=False +r.AllowOcclusionQueries=True +r.MinScreenRadiusForLights=0.030000 +r.MinScreenRadiusForDepthPrepass=0.030000 +r.MinScreenRadiusForCSMDepth=0.010000 +r.PrecomputedVisibilityWarning=False +r.TextureStreaming=True +Compat.UseDXT5NormalMaps=False +r.AllowStaticLighting=True +r.NormalMapsForStaticLighting=False +r.GenerateMeshDistanceFields=True +r.GenerateLandscapeGIData=True +r.TessellationAdaptivePixelsPerTriangle=48.000000 +r.SeparateTranslucency=True +r.TranslucentSortPolicy=0 +TranslucentSortAxis=(X=0.000000,Y=-1.000000,Z=0.000000) +r.CustomDepth=3 +r.DefaultFeature.Bloom=True +r.DefaultFeature.AmbientOcclusion=True +r.DefaultFeature.AmbientOcclusionStaticFraction=True +r.DefaultFeature.AutoExposure=True +r.DefaultFeature.MotionBlur=True +r.DefaultFeature.LensFlare=True +r.DefaultFeature.AntiAliasing=2 +r.EarlyZPass=3 +r.EarlyZPassMovable=False +r.DBuffer=False +r.ClearSceneMethod=1 +r.BasePassOutputsVelocity=False +r.SelectiveBasePassOutputs=False +vr.InstancedStereo=False +r.WireframeCullThreshold=5.000000 +UIScaleRule=ShortestSide +UIScaleCurve=(EditorCurveData=(PreInfinityExtrap=RCCE_Constant,PostInfinityExtrap=RCCE_Constant,Keys=,DefaultValue=340282346638528859811704183484516925440.000000),ExternalCurve=None) + diff --git a/Config/DefaultGame.ini b/Config/DefaultGame.ini new file mode 100644 index 0000000..10e23d3 --- /dev/null +++ b/Config/DefaultGame.ini @@ -0,0 +1,16 @@ +[/Script/EngineSettings.GeneralProjectSettings] +ProjectID=D0D6694C4B67A9CEF3373094611BE2F1 +ProjectName= +CopyrightNotice=Project Lab - NHTV Igad + +[/Script/UnrealProject.DefaultPlayer] +RespawnDelay = 5.0f +[/Script/UnrealProject.KingOfTheHillGameMode] +MaxGameScore = 120.0f + +[/Script/UnrealProject.DefaultGameInstance] +MenuRevision = 123299 + +[/Script/UnrealEd.ProjectPackagingSettings] +IncludeCrashReporter=False + diff --git a/Config/DefaultInput.ini b/Config/DefaultInput.ini new file mode 100644 index 0000000..8c89de6 --- /dev/null +++ b/Config/DefaultInput.ini @@ -0,0 +1,43 @@ + +[/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)) +-AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) +-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="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)) ++AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False)) +bAltEnterTogglesFullscreen=True +bUseMouseForTouch=False +bEnableMouseSmoothing=True +bEnableFOVScaling=True +FOVScale=0.011110 +DoubleClickTime=0.200000 ++ActionMappings=(ActionName="RightMouse",Key=RightMouseButton,bShift=False,bCtrl=False,bAlt=False,bCmd=False) ++ActionMappings=(ActionName="ToggleMenu",Key=Zero,bShift=False,bCtrl=False,bAlt=False,bCmd=False) ++ActionMappings=(ActionName="ToggleMenu",Key=Escape,bShift=False,bCtrl=False,bAlt=False,bCmd=False) ++ActionMappings=(ActionName="CastAbility1",Key=Q,bShift=False,bCtrl=False,bAlt=False,bCmd=False) ++ActionMappings=(ActionName="CastAbility2",Key=W,bShift=False,bCtrl=False,bAlt=False,bCmd=False) ++ActionMappings=(ActionName="CastAbility3",Key=E,bShift=False,bCtrl=False,bAlt=False,bCmd=False) ++ActionMappings=(ActionName="HoldPosition",Key=LeftShift,bShift=False,bCtrl=False,bAlt=False,bCmd=False) ++ActionMappings=(ActionName="CastAbility4",Key=R,bShift=False,bCtrl=False,bAlt=False,bCmd=False) ++ActionMappings=(ActionName="CastAbility5",Key=One,bShift=False,bCtrl=False,bAlt=False,bCmd=False) ++ActionMappings=(ActionName="CastAbility6",Key=Two,bShift=False,bCtrl=False,bAlt=False,bCmd=False) ++ActionMappings=(ActionName="CastAbility7",Key=Three,bShift=False,bCtrl=False,bAlt=False,bCmd=False) ++ActionMappings=(ActionName="CastAbility8",Key=Four,bShift=False,bCtrl=False,bAlt=False,bCmd=False) ++ActionMappings=(ActionName="LeftMouse",Key=LeftMouseButton,bShift=False,bCtrl=False,bAlt=False,bCmd=False) ++ActionMappings=(ActionName="ToggleSkillTree",Key=P,bShift=False,bCtrl=False,bAlt=False,bCmd=False) ++ActionMappings=(ActionName="Attack",Key=LeftMouseButton,bShift=False,bCtrl=False,bAlt=False,bCmd=False) +bAlwaysShowTouchInterface=False +bShowConsoleOnFourFingerTap=True +DefaultTouchInterface=None +ConsoleKey=None +-ConsoleKeys=Tilde ++ConsoleKeys=Tilde + + diff --git a/MatchMaking/matchmaking.hpp b/MatchMaking/matchmaking.hpp new file mode 100644 index 0000000..dac5082 --- /dev/null +++ b/MatchMaking/matchmaking.hpp @@ -0,0 +1,46 @@ +#ifndef _HEADER_MATCHMAKING +#define _HEADER_MATCHMAKING + +#include +using std::wstring; + +typedef unsigned long long NetID; +typedef signed int ChannelID; + +enum class ConnectionState +{ + Invalid = -1, + Disconnected = 0, + Connecting = 1, + Connected = 2, +}; + +class MatchMakingImpl; +class IMatchMakingInterface +{ +protected: + IMatchMakingInterface(NetID netId); + +public: + virtual ~IMatchMakingInterface(); + + void Tick(); + + ConnectionState GetState() const; + bool IsConnected() const; + + bool HostMatch(ChannelID channel); + bool DestroyMatch(); + + virtual void OnConnect() = 0; + virtual void OnDisconnect() = 0; + virtual void OnForceJoinSession(NetID netId, ChannelID channelID) = 0; + +private: + MatchMakingImpl* m_impl; + + IMatchMakingInterface(const IMatchMakingInterface& other) = delete; + IMatchMakingInterface& operator=(const IMatchMakingInterface& other) = delete; +}; + +#endif \ No newline at end of file diff --git a/Plugins/CustomBlueprints/CustomBlueprints.uplugin b/Plugins/CustomBlueprints/CustomBlueprints.uplugin new file mode 100644 index 0000000..fab1f10 --- /dev/null +++ b/Plugins/CustomBlueprints/CustomBlueprints.uplugin @@ -0,0 +1,24 @@ +{ + "FileVersion": 1, + "Version": 1, + "VersionName": "1.0", + "FriendlyName": "Custom Blueprints Plugin", + "Description": "A plugin for ability system blueprint nodes", + "Category": "Abilities", + "CreatedBy": "Guus Waals", + "CreatedByURL": "http://www.tdrz.nl/", + "DocsURL": "http://www.tdrz.nl/portfolio.html", + "MarketplaceURL": "", + "SupportURL": "http://www.tdrz.nl/portfolio.html", + "Modules": [ + { + "Name": "CustomBlueprintsEditor", + "Type": "Developer", + "LoadingPhase": "PreDefault" + } + ], + "EnabledByDefault": false, + "CanContainContent": true, + "IsBetaVersion": false, + "Installed": false +} \ No newline at end of file diff --git a/Plugins/CustomBlueprints/Resources/Icon128.png b/Plugins/CustomBlueprints/Resources/Icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..46699950888b7948815effcc7198d6ed2319dc42 GIT binary patch literal 5261 zcmds*)mPLHw8g(P4DchQQyQg91qK+pQ86H|L+ju|I=<+n_&Q;GE`TR zH-s%7WfMVZj4=Ip0%BtCDuUfpn^J^Oub`q9BjN&8P)$$1mqfkP%M>0qv}pi^yb=VL zTF;moS6QzIPj5p`oJD% z$CVN+Z;D(pygx87dMufnS1*v>4B@%=O zZ<`}Wi*!~b0(<|99w9-baM@{cv`lBk9*}HCnvdj!je!8&stCPRN~F_&a2_*7-UOmm zF=DvmA5#~;h-l|q5E-CZM*W!+pah8ExDf2eSc!ld@c-rPNCNT-ZV@L=M8K`ZRV~m@ zQ+z>IM7Fz{laig}tBkGpUo7kTA;re7af88Ygq@PaKkM(mI1hqJe2Jd^c%ZX_O6yF+ z351&q0AZ(MxzSicKhBK>*jL)_{U(m zoA}9xxVs|s%i_{|^M%_r@b%6-v+_7=!G5>wo>|ZnU0)dy6L;z|*3joqrQ$&?X`fQ| zTi#Co?Y*GdN2&4MX6Fc!yIvY-qFI_94D>v4zIbh$Xh;V|i~hP(m$SUmq`xcx;CXBD zYrph&SZSjVYpChWWM==MwHE{aJpCaFn_EY*G!^fi$@rPg^`k~47JV*mR}Ov#YGWA^ zL)OkMSc!qi{zLU`nYD~m*n+-r_el>Mp@-}#nlvF*SuvU+Y-o^Hw>{l^KMONtG#9${ zTo1bQcJckD_}%T?xh+=Y@Ib+Uo3!)Faci=%QgBt^`|Z^_J2Gfd*ax|!!JLC3U)MRu zBet|yS4&oeOuNBhwU$Hh(1aaGxSXfMTF2^zbut^poGrmz_knupKD}7$wDj6JZ245=EvcKB z<3btQ8Y*JQ;SVr_4>&D?rAg~!*`FcL(Z*K>-t;J>!u>>@xaSc~cF;jl_K@VbkiTlg zCaIwihp1z3xE;Rqd_4QG{@O$$sx9B009`OwfH^>;52h@6aI^x(JA!2XEZw(K(Su8$ z$FayJI+|LHhe*Dp64Kk(Y=+QQXgI9a9~W5*lQiz$cHuunkfM4hJHL#4>H0E2Ia;4r zQuZe~Qs8x2IK3e;e5y;?{^(HQZIC7}yM(sqj7xhZqo4S84|B0xqcC*(H`G7i6^qf> z5J%cq+>C~vTn2Z^l0BE^bMVh={%`poD}1h1BdU0KgxptAn!~d^ycu{OH-PRYA ztC1Yz7}d4JUPxUxi;JhPXcr5A`ge?MO_tv-u4XwqJ%UL~TbobOTZ)AMARN0Oa^15| z<&0pu9gV6-#Zl{-CYX0H=O_z*2!IyH4PJXT7KGk#Ywma-rh zXew7shHGV4+O6g9Fx;!qy;bx$_%9|yM=ne?1>8TM;(Js~-J-P?{BSo1gT67=kXnks zyn0fWv%94$d2(8Va9#MD63;B%_89K(4Vb3$F-jX`pWgcMGq&am-|`^u5K&Qs6@7hu zV|?L7!G9x4se8MCuOcW_^ES4qXLs+d(vKEnYU+0XTR_Pvib#w7?Zwo6R`Scjg~88Y%DX5ymyT`84&erO4oVC%ixhF@VkK9=Qf* zi!3%9iVE<5Aq3#=C~6PB9rECEBBZ=y3jN@7CksteKFi|q$fXc}yX`9;qKMN2n`xa< z8B65N5DnngrkB$iWX?u^oxMz!skw0+vfMdr^J-)1*^1S*$8f)8*B!+3b* zmvYX|6(_#M$!U-@AC*PPM;O(=EqRS4jL23;siNB4XDtpTD|*~|{F+Xm#OsKI#f|5j zyp^y=y)c{{Ij$5ifLqge2w-w58Y`R*nA%_Q5 zPq`EXG{$=Weg^4xW}fnXWwHDiCA;?E8aJ(p8M}5f+in%r8YJa+bA3HsG$`(w+G^|l zBe%EQ2LvH~mfa?;c1SeD0JmW|*09Q>%YBDe$*Yo1w#~IABn4RCq6mWSOg>#4P0kbQ zyCy@Ptt#9f;&nPjPJE@;FJJB3NkYt>MlRQ2S%Wa=N^}t$B3qwBiFEU(u=EqkFm^pQ zpTCdoY+X0HEj8w!Op>jTP|Up%ip)0hxhs1#Q_%1bC?a)Z`(wUv_vG%XXDtDo3%l@0 z8BNonHJ2b>YQfGg@Vbu64!^T$SM)k+Jv+l8C2qz+dmKRSn0IFTJqhOKT92dmYX||1jF^r z#XK|v3rao9WA z%QH(D+gHvqH#~Mk03EdXaKxx413t-%zV;DzLbWI8Hx@aV8>T1aP{7ZM17V)Q^N z#Q)_^F^f5#0Ym+!8BNcu66~W2al%oRpFBU89whp3V}QFTzNfzXeqvWx|vi{7-5!Ja$YwW5l#> zq{p1I?sRVhMxNu~Gcnjm+_S=fo`>}?rQ*#`T(%uQ8Lzy64>%pu3r45F0G2DyyZRUI z`#;9HF8)gqb9ev152!3ws*(gVG5a9rjwm1b(5LRZ7B<>S=oL6dhF-3#@H3lDkW(Zu z!44{^?^nVxEv>Z|m-M87$l>Cz{rZK`wEJIaw|J-~m%r*IqsT9Wjh;T*maP)m2Ej7b zhJ^YZ@*ncR06d84CduFT;BPghlZ56Teqo8~Gttb%g?ZQ8oCuC@Z(W4nJ1XJu^(Wr+ zOtMW6Oa>Vh>NlR$MxF0ePikk)Wno`D7tQ>N#T*x*y8y}#-`7LW*9bE>Fus}0e}}!~ zz<~tzUzk$Lf&dV1<+d`XPvw>z@-DGhY_`1o1Z4@k;i{k6eRk&uc?pRQYcXlh^uFY8 ztX4(mULiXh4-l)h?-S%LZ3;pacSqy|D~*N`zp>y!ADSJ4|DLL1f$?|vM?u)ulVyBe z_6%!lR;h;ix@P)c33VCzm$cP34Vm4|BumcjNBILx31s`JibEZWOXoPFsIe6=WPw>k zhnJ;3@;J+MW794J#I+Z@mG$vYO>Kp#&i8e{t|(a`Avt;i`{Q`p&ti&)-&$d;`~^>; zZ7&9+ejhvHj7W>xKOoL9XSuA%oXi3gfE4SMP^#>gIm7X&i3q{{52&@baf~5h>A$36 zSDU|0G?~e!t+t?HKgFjS$BHD6P;R&NIhn<2U`={t1r?ZCWp35FG!CU$q(3bg5uY~cXeot=7(1UXjQi~6ji(*4R${wV zcFSMRFWu&CjE$m?+02>4_pUyklTcY*KZvL+yY1w!;hn&;IEx%1F4*NzQz;j)!uPLu zr(cQGo-)Qa#_)Y*1m}9cB?w5SnPCr_q%P#|n%zx(0_?xLl9}F+2dwi*8`qYtmM?2d z4&d0N30SFS+`J_*TbZX#t=(&xhL*uz`kqqzqn0+kAC{uNxD$gDo|G0U$I!Uvu}l@I zCzW&Y5xm(nRsa3Fqv}A3`sqe*sbZQq3sCWij!N;wIlZ0Cfqn%!MQimVFzLV7J}37! z=Q~yPhV9R@p9wk7?@ip~Pyr||RzWIw`Yg?Euy?j|*=Z~pF5ov+v6aPO5+g}zG);GU zhrz`)&E;q}82(e$LdjLtvzydLYm5C>Zk$(_~{H(Gt}zL#?R ztSu2Gdb>?pUMFaS^6;Ulj)A?K9DEucSnLvqRJy;A)i>}R<9toO+#32`G<|G=KzH{0 z6?tE=e@{@;>0kjk=0>Eu@?~yR2VGP9H=Gft#|l>BanVy#`ZJ zh?fNE>3&PiqmnkL$;woUFZkYA_IiuWpXro(N z`CL?V>3i!QSGQ47%DJAoXT;r0X(ao^(>kV8 z+H)+iQ{iqyI@lMFJJxl-AI&35m6I@>H~QUujB2n)WkSQ&o`ryIB8*AKwetM?y7ESa zP#!$&`NzO66TSx46eVPE=?9L|7oEgRnqb$!7VqQOqCt}0M_G)+Rw51GBm6#^$hp63 zw`$@>f8vWM8Rs;QDEP7%d*j`&MUB#3k1Ovjh)4)S2yObdygzcGs=M~5@Cn@57qBMS z@S%wjJ^*g4!F7~;Mu6T62>VBk$0Qv*4IxW>Iz1g`pl)A+6*~T9&S-TcigaEMK2#>K7wG#&RZR^+@8!h3!u9#$V!qPAp{MLa0uLui}%27o+3h;8C)Sc!E!`ip9PvUrL4`#EIOT&Ya)8p<~QMJiqrE2<}gB zNIu`?k~+bRZaxSXbx2>7cjl4p3hYRcP9OA~uP=H8D_1s<+Cb0m@kme*VVX_lj5L;7 zB{2w1LS2u9jcXV|NREmv*h+9)inV>CtLLy1Uvblxm6MJMTHExP{52rs^1i}xh)jyd zn`*>`ZJaOGXb*#)Dq(b58;BG9D-;?X+`p<9P;Fa11qt}|$<)q{iGo@?-!2 literal 0 HcmV?d00001 diff --git a/Plugins/CustomBlueprints/Source/CustomBlueprintsEditor/CustomBlueprintsEditor.build.cs b/Plugins/CustomBlueprints/Source/CustomBlueprintsEditor/CustomBlueprintsEditor.build.cs new file mode 100644 index 0000000..7675e9d --- /dev/null +++ b/Plugins/CustomBlueprints/Source/CustomBlueprintsEditor/CustomBlueprintsEditor.build.cs @@ -0,0 +1,39 @@ +namespace UnrealBuildTool.Rules +{ + public class CustomBlueprintsEditor : ModuleRules + { + public CustomBlueprintsEditor(TargetInfo Target) + { + PrivateIncludePaths.AddRange( + new string[] { + "Editor/BlueprintGraph/Private", + "Editor/KismetCompiler/Public", + } + ); + + PublicDependencyModuleNames.AddRange( + new string[] { + "Core", + "CoreUObject", + "Engine", + "InputCore", + "Slate", + "EditorStyle", + "AIModule", + } + ); + + PrivateDependencyModuleNames.AddRange( + new string[] { + "EditorStyle", + "KismetCompiler", + "UnrealEd", + "GraphEditor", + "SlateCore", + "Kismet", + "BlueprintGraph" + } + ); + } + } +} \ No newline at end of file diff --git a/Plugins/CustomBlueprints/Source/CustomBlueprintsEditor/CustomBlueprintsEditor.cpp b/Plugins/CustomBlueprints/Source/CustomBlueprintsEditor/CustomBlueprintsEditor.cpp new file mode 100644 index 0000000..5684f82 --- /dev/null +++ b/Plugins/CustomBlueprints/Source/CustomBlueprintsEditor/CustomBlueprintsEditor.cpp @@ -0,0 +1,45 @@ +#include "CustomBlueprintsEditor.h" + +class UClass* characterClass = nullptr; +class UClass* abilityTriggerClass = nullptr; +class UClass* abilityGroupClass = nullptr; +class UClass* projectileClass = nullptr; +class UClass* modifierClass = nullptr; +class UClass* libClass = nullptr; + +void LoadDependencies() +{ + libClass = FindObject(ANY_PACKAGE, L"/Script/UnrealProject.Lib"); + characterClass = FindObject(ANY_PACKAGE, L"/Script/UnrealProject.NetworkCharacter"); + abilityGroupClass = FindObject(ANY_PACKAGE, L"/Script/UnrealProject.AbilityEventGroup"); + abilityTriggerClass = FindObject(ANY_PACKAGE, L"/Script/UnrealProject.AbilityTriggerBase"); + projectileClass = FindObject(ANY_PACKAGE, L"/Script/UnrealProject.ProjectileBase"); + modifierClass = FindObject(ANY_PACKAGE, L"/Script/UnrealProject.Modifier"); + //printf("\nhoi %p\n%p\n%p\n%p\n%p\n%p\n", libClass, characterClass, abilityGroupClass, abilityTriggerClass, projectileClass, modifierClass); +} + +class FCustomBlueprintsEditor : public IModuleInterface +{ +public: + /** IModuleInterface implementation */ + virtual void StartupModule() override + { + auto module = FModuleManager::LoadModuleChecked("UnrealProject"); + FModuleManager& moduleManager = FModuleManager::Get(); + bool ok = moduleManager.DoesLoadedModuleHaveUObjects(L"UnrealProject"); + + LoadDependencies(); + // Class'/Script/UnrealProject.Lib' + // Class'/Script/UnrealProject.AbilityEventGroup' + // Class'/Script/UnrealProject.AbilityTriggerBase' + // Class'/Script/UnrealProject.ProjectileBase' + // Class'/Script/UnrealProject.Modifier' + + } + virtual void ShutdownModule() override + { + } +private: +}; + +IMPLEMENT_MODULE(FCustomBlueprintsEditor, CustomBlueprintsEditor) \ No newline at end of file diff --git a/Plugins/CustomBlueprints/Source/CustomBlueprintsEditor/CustomBlueprintsEditor.h b/Plugins/CustomBlueprints/Source/CustomBlueprintsEditor/CustomBlueprintsEditor.h new file mode 100644 index 0000000..b9dcb93 --- /dev/null +++ b/Plugins/CustomBlueprints/Source/CustomBlueprintsEditor/CustomBlueprintsEditor.h @@ -0,0 +1,7 @@ +// Project Lab - NHTV Igad + +#pragma once +#include "EngineMinimal.h" +#include "ModuleManager.h" + +void LoadDependencies(); \ No newline at end of file diff --git a/Plugins/CustomBlueprints/Source/CustomBlueprintsEditor/CustomBlueprintsEditorPCH.cpp b/Plugins/CustomBlueprints/Source/CustomBlueprintsEditor/CustomBlueprintsEditorPCH.cpp new file mode 100644 index 0000000..d59ae4d --- /dev/null +++ b/Plugins/CustomBlueprints/Source/CustomBlueprintsEditor/CustomBlueprintsEditorPCH.cpp @@ -0,0 +1 @@ +#include "CustomBlueprintsEditor.h" \ No newline at end of file diff --git a/Plugins/CustomBlueprints/Source/CustomBlueprintsEditor/Globals.h b/Plugins/CustomBlueprints/Source/CustomBlueprintsEditor/Globals.h new file mode 100644 index 0000000..d948693 --- /dev/null +++ b/Plugins/CustomBlueprints/Source/CustomBlueprintsEditor/Globals.h @@ -0,0 +1,11 @@ +// Project Lab - NHTV Igad + +#pragma once +#include "EngineMinimal.h" + +extern class UClass* characterClass; +extern class UClass* abilityTriggerClass; +extern class UClass* abilityGroupClass; +extern class UClass* projectileClass; +extern class UClass* modifierClass; +extern class UClass* libClass; \ No newline at end of file diff --git a/Plugins/CustomBlueprints/Source/CustomBlueprintsEditor/SpawnActorBaseNode.cpp b/Plugins/CustomBlueprints/Source/CustomBlueprintsEditor/SpawnActorBaseNode.cpp new file mode 100644 index 0000000..c03e95f --- /dev/null +++ b/Plugins/CustomBlueprints/Source/CustomBlueprintsEditor/SpawnActorBaseNode.cpp @@ -0,0 +1,560 @@ +#include "CustomBlueprintsEditor.h" +#include "SpawnActorBaseNode.h" +#include "Globals.h" +#include "BlueprintEditorUtils.h" +#include "BlueprintActionDatabaseRegistrar.h" +#include "BlueprintNodeSpawner.h" + +struct FK2Node_SpawnActorFromClassHelper +{ + static FString WorldContextPinName; + static FString ClassPinName; + static FString SpawnTransformPinName; + static FString TargetPinName; +}; + +FString FK2Node_SpawnActorFromClassHelper::WorldContextPinName(TEXT("WorldContextObject")); +FString FK2Node_SpawnActorFromClassHelper::ClassPinName(TEXT("Class")); +FString FK2Node_SpawnActorFromClassHelper::SpawnTransformPinName(TEXT("SpawnTransform")); +FString FK2Node_SpawnActorFromClassHelper::TargetPinName(TEXT("Target")); + +#define FMT_TEXT(__x) FText::FromString(FString() + __x) + +UK2Node_SpawnActorBaseNode::UK2Node_SpawnActorBaseNode(const FObjectInitializer& ObjectInitializer) + : Super(ObjectInitializer) +{ + NodeTooltip = FMT_TEXT("Oh Nooooos"); +} +void UK2Node_SpawnActorBaseNode::AllocateDefaultPins() +{ + const UEdGraphSchema_K2* K2Schema = GetDefault(); + + // Add execution pins + CreatePin(EGPD_Input, K2Schema->PC_Exec, TEXT(""), NULL, false, false, K2Schema->PN_Execute); + CreatePin(EGPD_Output, K2Schema->PC_Exec, TEXT(""), NULL, false, false, K2Schema->PN_Then); + + // If required add the world context pin + if(GetBlueprint()->ParentClass->HasMetaData(FBlueprintMetadata::MD_ShowWorldContextPin)) + { + CreatePin(EGPD_Input, K2Schema->PC_Object, TEXT(""), UObject::StaticClass(), false, false, FK2Node_SpawnActorFromClassHelper::WorldContextPinName); + } + + // Add blueprint pin + UEdGraphPin* ClassPin = CreatePin(EGPD_Input, K2Schema->PC_Class, TEXT(""), GetActorClass(), false, false, FK2Node_SpawnActorFromClassHelper::ClassPinName); + K2Schema->ConstructBasicPinTooltip(*ClassPin, FMT_TEXT("The " + GetObjectName() + " you want to spawn"), ClassPin->PinToolTip); + + // Transform pin + if(SpawningFunctionHasTransform()) + { + UScriptStruct* TransformStruct = TBaseStructure::Get(); + UEdGraphPin* TransformPin = CreatePin(EGPD_Input, K2Schema->PC_Struct, TEXT(""), TransformStruct, false, false, FK2Node_SpawnActorFromClassHelper::SpawnTransformPinName); + K2Schema->ConstructBasicPinTooltip(*TransformPin, FMT_TEXT("The transform to spawn the " + GetObjectName() + " with"), TransformPin->PinToolTip); + } + + // Result pin + UEdGraphPin* ResultPin = CreatePin(EGPD_Output, K2Schema->PC_Object, TEXT(""), GetActorClass(), false, false, K2Schema->PN_ReturnValue); + K2Schema->ConstructBasicPinTooltip(*ResultPin, FMT_TEXT("The spawned " + GetObjectName()), ResultPin->PinToolTip); + + RegisterAdditionalPins(K2Schema); + + Super::AllocateDefaultPins(); +} +void UK2Node_SpawnActorBaseNode::CreatePinsForClass(UClass* InClass, TArray& OutClassPins) +{ + check(InClass != NULL); + + const UEdGraphSchema_K2* K2Schema = GetDefault(); + + const UObject* const ClassDefaultObject = InClass->GetDefaultObject(false); + + for(TFieldIterator PropertyIt(InClass, EFieldIteratorFlags::IncludeSuper); PropertyIt; ++PropertyIt) + { + UProperty* Property = *PropertyIt; + UClass* PropertyClass = CastChecked(Property->GetOuter()); + const bool bIsDelegate = Property->IsA(UMulticastDelegateProperty::StaticClass()); + const bool bIsExposedToSpawn = UEdGraphSchema_K2::IsPropertyExposedOnSpawn(Property); + const bool bIsSettableExternally = !Property->HasAnyPropertyFlags(CPF_DisableEditOnInstance); + + if(bIsExposedToSpawn && + !Property->HasAnyPropertyFlags(CPF_Parm) && + bIsSettableExternally && + Property->HasAllPropertyFlags(CPF_BlueprintVisible) && + !bIsDelegate && + (NULL == FindPin(Property->GetName()))) + { + UEdGraphPin* Pin = CreatePin(EGPD_Input, TEXT(""), TEXT(""), NULL, false, false, Property->GetName()); + const bool bPinGood = (Pin != NULL) && K2Schema->ConvertPropertyToPinType(Property, Pin->PinType); + OutClassPins.Add(Pin); + + if(ClassDefaultObject && Pin != NULL && K2Schema->PinDefaultValueIsEditable(*Pin)) + { + FString DefaultValueAsString; + const bool bDefaultValueSet = FBlueprintEditorUtils::PropertyValueToString(Property, reinterpret_cast(ClassDefaultObject), DefaultValueAsString); + check(bDefaultValueSet); + K2Schema->TrySetDefaultValue(*Pin, DefaultValueAsString); + } + + // Copy tooltip from the property. + if(Pin != nullptr) + { + K2Schema->ConstructBasicPinTooltip(*Pin, Property->GetToolTipText(), Pin->PinToolTip); + } + } + } + + // Change class of output pin + UEdGraphPin* ResultPin = GetResultPin(); + ResultPin->PinType.PinSubCategoryObject = InClass; +} +UClass* UK2Node_SpawnActorBaseNode::GetClassToSpawn(const TArray* InPinsToSearch) const +{ + UClass* UseSpawnClass = nullptr; + const TArray* PinsToSearch = InPinsToSearch ? InPinsToSearch : &Pins; + + UEdGraphPin* ClassPin = GetClassPin(PinsToSearch); + if(ClassPin && ClassPin->DefaultObject != NULL && ClassPin->LinkedTo.Num() == 0) + { + UseSpawnClass = CastChecked(ClassPin->DefaultObject); + } + else if(ClassPin && (1 == ClassPin->LinkedTo.Num())) + { + auto SourcePin = ClassPin->LinkedTo[0]; + UseSpawnClass = SourcePin ? Cast(SourcePin->PinType.PinSubCategoryObject.Get()) : nullptr; + } + + return UseSpawnClass; +} +void UK2Node_SpawnActorBaseNode::ReallocatePinsDuringReconstruction(TArray& OldPins) +{ + AllocateDefaultPins(); + UClass* UseSpawnClass = GetClassToSpawn(&OldPins); + + if(UseSpawnClass != NULL) + { + // Reassign class pin + UEdGraphPin* newClassPin = FindPinChecked(FK2Node_SpawnActorFromClassHelper::ClassPinName); + newClassPin->DefaultObject = UseSpawnClass; + + TArray ClassPins; + CreatePinsForClass(UseSpawnClass, ClassPins); + } +} +void UK2Node_SpawnActorBaseNode::PostPlacedNewNode() +{ + Super::PostPlacedNewNode(); + + UClass* UseSpawnClass = GetClassToSpawn(); + if(UseSpawnClass != NULL) + { + TArray ClassPins; + CreatePinsForClass(UseSpawnClass, ClassPins); + } +} +bool UK2Node_SpawnActorBaseNode::IsSpawnVarPin(UEdGraphPin* Pin) +{ + const UEdGraphSchema_K2* K2Schema = GetDefault(); + + UEdGraphPin* ParentPin = Pin->ParentPin; + while(ParentPin) + { + if(ParentPin->PinName == FK2Node_SpawnActorFromClassHelper::SpawnTransformPinName) + { + return false; + } + ParentPin = ParentPin->ParentPin; + } + + return(Pin->PinName != K2Schema->PN_Execute && + Pin->PinName != K2Schema->PN_Then && + Pin->PinName != K2Schema->PN_ReturnValue && + Pin->PinName != FK2Node_SpawnActorFromClassHelper::ClassPinName && + Pin->PinName != FK2Node_SpawnActorFromClassHelper::WorldContextPinName && + Pin->PinName != FK2Node_SpawnActorFromClassHelper::SpawnTransformPinName && + Pin->PinName != FK2Node_SpawnActorFromClassHelper::TargetPinName && + !IsAdditionalPin(Pin)); +} +void UK2Node_SpawnActorBaseNode::OnClassPinChanged() +{ + const UEdGraphSchema_K2* K2Schema = GetDefault(); + + // Remove all pins related to archetype variables + TArray OldPins = Pins; + TArray OldClassPins; + + for(int32 i = 0; i < OldPins.Num(); i++) + { + UEdGraphPin* OldPin = OldPins[i]; + if(IsSpawnVarPin(OldPin)) + { + Pins.Remove(OldPin); + OldClassPins.Add(OldPin); + } + } + + m_cachedNodeTitle.MarkDirty(); + + UClass* UseSpawnClass = GetClassToSpawn(); + TArray NewClassPins; + if(UseSpawnClass != NULL) + { + CreatePinsForClass(UseSpawnClass, NewClassPins); + } + + UEdGraphPin* ResultPin = GetResultPin(); + // Cache all the pin connections to the ResultPin, we will attempt to recreate them + TArray ResultPinConnectionList = ResultPin->LinkedTo; + // Because the archetype has changed, we break the output link as the output pin type will change + ResultPin->BreakAllPinLinks(); + + // Recreate any pin links to the Result pin that are still valid + for(UEdGraphPin* Connections : ResultPinConnectionList) + { + K2Schema->TryCreateConnection(ResultPin, Connections); + } + + K2Schema->ConstructBasicPinTooltip(*ResultPin, FMT_TEXT("The spawned " + GetObjectName()), ResultPin->PinToolTip); + + // Rewire the old pins to the new pins so connections are maintained if possible + RewireOldPinsToNewPins(OldClassPins, NewClassPins); + + // Destroy the old pins + DestroyPinList(OldClassPins); + + // Refresh the UI for the graph so the pin changes show up + UEdGraph* Graph = GetGraph(); + Graph->NotifyGraphChanged(); + + // Mark dirty + FBlueprintEditorUtils::MarkBlueprintAsModified(GetBlueprint()); +} +void UK2Node_SpawnActorBaseNode::PinConnectionListChanged(UEdGraphPin* ChangedPin) +{ + if(ChangedPin && (ChangedPin->PinName == FK2Node_SpawnActorFromClassHelper::ClassPinName)) + { + OnClassPinChanged(); + } +} +void UK2Node_SpawnActorBaseNode::PinDefaultValueChanged(UEdGraphPin* ChangedPin) +{ + if(ChangedPin && (ChangedPin->PinName == FK2Node_SpawnActorFromClassHelper::ClassPinName)) + { + OnClassPinChanged(); + } +} +FText UK2Node_SpawnActorBaseNode::GetTooltipText() const +{ + return NodeTooltip; +} +UEdGraphPin* UK2Node_SpawnActorBaseNode::GetThenPin()const +{ + const UEdGraphSchema_K2* K2Schema = GetDefault(); + + UEdGraphPin* Pin = FindPinChecked(K2Schema->PN_Then); + check(Pin->Direction == EGPD_Output); + return Pin; +} +UEdGraphPin* UK2Node_SpawnActorBaseNode::GetClassPin(const TArray* InPinsToSearch) const +{ + const TArray* PinsToSearch = InPinsToSearch ? InPinsToSearch : &Pins; + + UEdGraphPin* Pin = NULL; + for(auto PinIt = PinsToSearch->CreateConstIterator(); PinIt; ++PinIt) + { + UEdGraphPin* TestPin = *PinIt; + if(TestPin && TestPin->PinName == FK2Node_SpawnActorFromClassHelper::ClassPinName) + { + Pin = TestPin; + break; + } + } + check(Pin == NULL || Pin->Direction == EGPD_Input); + return Pin; +} +UEdGraphPin* UK2Node_SpawnActorBaseNode::GetSpawnTransformPin() const +{ + UEdGraphPin* Pin = FindPinChecked(FK2Node_SpawnActorFromClassHelper::SpawnTransformPinName); + check(Pin->Direction == EGPD_Input); + return Pin; +} +UEdGraphPin* UK2Node_SpawnActorBaseNode::GetWorldContextPin() const +{ + UEdGraphPin* Pin = FindPin(FK2Node_SpawnActorFromClassHelper::WorldContextPinName); + check(Pin == NULL || Pin->Direction == EGPD_Input); + return Pin; +} +UEdGraphPin* UK2Node_SpawnActorBaseNode::GetResultPin() const +{ + const UEdGraphSchema_K2* K2Schema = GetDefault(); + + UEdGraphPin* Pin = FindPinChecked(K2Schema->PN_ReturnValue); + check(Pin->Direction == EGPD_Output); + return Pin; +} +FLinearColor UK2Node_SpawnActorBaseNode::GetNodeTitleColor() const +{ + return Super::GetNodeTitleColor(); +} +FText UK2Node_SpawnActorBaseNode::GetNodeTitle(ENodeTitleType::Type TitleType) const +{ + FText NodeTitle = FMT_TEXT("Spawn " + GetObjectName() + " from Class"); + if(TitleType != ENodeTitleType::MenuTitle) + { + if(UEdGraphPin* ClassPin = FindPin(FK2Node_SpawnActorFromClassHelper::ClassPinName)) + { + if(ClassPin->LinkedTo.Num() > 0) + { + // Blueprint will be determined dynamically, so we don't have the name in this case + NodeTitle = FMT_TEXT("Spawn " + GetObjectName()); + } + else if(ClassPin->DefaultObject == nullptr) + { + NodeTitle = FMT_TEXT("Spawn " + GetObjectName() + " NONE"); + } + else + { + if(m_cachedNodeTitle.IsOutOfDate(this)) + { + FText ClassName; + if(UClass* PickedClass = Cast(ClassPin->DefaultObject)) + { + ClassName = PickedClass->GetDisplayNameText(); + } + + FFormatNamedArguments Args; + Args.Add(TEXT("ClassName"), ClassName); + + // FText::Format() is slow, so we cache this to save on performance + m_cachedNodeTitle.SetCachedText(FText::Format(FMT_TEXT("Spawn {ClassName}"), Args), this); + } + NodeTitle = m_cachedNodeTitle; + } + } + else + { + NodeTitle = FMT_TEXT(GetObjectName() + " NONE"); + } + } + return NodeTitle; +} +bool UK2Node_SpawnActorBaseNode::IsCompatibleWithGraph(const UEdGraph* TargetGraph) const +{ + UBlueprint* Blueprint = FBlueprintEditorUtils::FindBlueprintForGraph(TargetGraph); + return Super::IsCompatibleWithGraph(TargetGraph) && (!Blueprint || FBlueprintEditorUtils::FindUserConstructionScript(Blueprint) != TargetGraph); +} +void UK2Node_SpawnActorBaseNode::GetNodeAttributes(TArray>& OutNodeAttributes) const +{ + UClass* ClassToSpawn = GetClassToSpawn(); + const FString ClassToSpawnStr = ClassToSpawn ? ClassToSpawn->GetName() : TEXT("InvalidClass"); + OutNodeAttributes.Add(TKeyValuePair(TEXT("Type"), FString() + "Spawn" + GetObjectName() + "FromClass")); + OutNodeAttributes.Add(TKeyValuePair(TEXT("Class"), GetClass()->GetName())); + OutNodeAttributes.Add(TKeyValuePair(TEXT("Name"), GetName())); + OutNodeAttributes.Add(TKeyValuePair(TEXT("ActorClass"), ClassToSpawnStr)); +} +void UK2Node_SpawnActorBaseNode::GetMenuActions(FBlueprintActionDatabaseRegistrar& ActionRegistrar) const +{ + // actions get registered under specific object-keys; the idea is that + // actions might have to be updated (or deleted) if their object-key is + // mutated (or removed)... here we use the node's class (so if the node + // type disappears, then the action should go with it) + UClass* ActionKey = GetClass(); + //// to keep from needlessly instantiating a UBlueprintNodeSpawner, first + //// check to make sure that the registrar is looking for actions of this type + //// (could be regenerating actions for a specific asset, and therefore the + //// registrar would only accept actions corresponding to that asset) + if(ActionRegistrar.IsOpenForRegistration(ActionKey)) + { + UBlueprintNodeSpawner* NodeSpawner = UBlueprintNodeSpawner::Create(GetClass()); + check(NodeSpawner != nullptr); + + ActionRegistrar.AddBlueprintAction(ActionKey, NodeSpawner); + } +} +FText UK2Node_SpawnActorBaseNode::GetMenuCategory() const +{ + return FMT_TEXT("Ability"); +} +FNodeHandlingFunctor* UK2Node_SpawnActorBaseNode::CreateNodeHandler(FKismetCompilerContext& CompilerContext) const +{ + return new FNodeHandlingFunctor(CompilerContext); +} +void UK2Node_SpawnActorBaseNode::ExpandNode(class FKismetCompilerContext& CompilerContext, UEdGraph* SourceGraph) +{ + Super::ExpandNode(CompilerContext, SourceGraph); + + if(!libClass) + { + LoadDependencies(); + if(!libClass) + { + CompilerContext.MessageLog.Error(L"Dependencies not initialized yet"); + return; + } + } + + FName BeginSpawningBlueprintFuncName = GetBeginSpawningFunction(); + static FString ActorClassParamName = FString(TEXT("ActorClass")); + static FString WorldContextParamName = FString(TEXT("WorldContextObject")); + + FName FinishSpawningFuncName = GetFinishSpawningFunction(); + static FString ActorParamName = FString(TEXT("Actor")); + static FString TransformParamName = FString(TEXT("SpawnTransform")); + static FString CollisionHandlingOverrideParamName = FString(TEXT("CollisionHandlingOverride")); + static FString OwnerParamName = FString(TEXT("Owner")); + + static FString ObjectParamName = FString(TEXT("Object")); + static FString ValueParamName = FString(TEXT("Value")); + static FString PropertyNameParamName = FString(TEXT("PropertyName")); + + UK2Node_SpawnActorBaseNode* SpawnNode = this; + UEdGraphPin* SpawnNodeExec = SpawnNode->GetExecPin(); + UEdGraphPin* SpawnWorldContextPin = SpawnNode->GetWorldContextPin(); + UEdGraphPin* SpawnClassPin = SpawnNode->GetClassPin(); + UEdGraphPin* SpawnNodeThen = SpawnNode->GetThenPin(); + UEdGraphPin* SpawnNodeResult = SpawnNode->GetResultPin(); + + UClass* SpawnClass = (SpawnClassPin != NULL) ? Cast(SpawnClassPin->DefaultObject) : NULL; + if((0 == SpawnClassPin->LinkedTo.Num()) && (NULL == SpawnClass)) + { + CompilerContext.MessageLog.Error(L"Spawn node @@ must have a class specified.", SpawnNode); + // we break exec links so this is the only error we get, don't want the SpawnActor node being considered and giving 'unexpected node' type warnings + SpawnNode->BreakAllNodeLinks(); + return; + } + + ////////////////////////////////////////////////////////////////////////// + // create 'begin spawn' call node + UK2Node_CallFunction* CallBeginSpawnNode = CompilerContext.SpawnIntermediateNode(SpawnNode, SourceGraph); + CallBeginSpawnNode->FunctionReference.SetExternalMember(BeginSpawningBlueprintFuncName, libClass); + CallBeginSpawnNode->AllocateDefaultPins(); + + UEdGraphPin* CallBeginExec = CallBeginSpawnNode->GetExecPin(); + UEdGraphPin* CallBeginWorldContextPin = CallBeginSpawnNode->FindPin(WorldContextParamName); + if(!CallBeginWorldContextPin) + { + CompilerContext.MessageLog.Error(L"World Context Pin not found"); + return; + } + UEdGraphPin* CallBeginActorClassPin = CallBeginSpawnNode->FindPinChecked(ActorClassParamName); + UEdGraphPin* CallBeginTransform = nullptr; + UEdGraphPin* CallBeginResult = CallBeginSpawnNode->GetReturnValuePin(); + + // Move 'exec' connection from spawn node to 'begin spawn' + CompilerContext.MovePinLinksToIntermediate(*SpawnNodeExec, *CallBeginExec); + + if(SpawnClassPin->LinkedTo.Num() > 0) + { + // Copy the 'blueprint' connection from the spawn node to 'begin spawn' + CompilerContext.MovePinLinksToIntermediate(*SpawnClassPin, *CallBeginActorClassPin); + } + else + { + // Copy blueprint literal onto begin spawn call + CallBeginActorClassPin->DefaultObject = SpawnClass; + } + + // Copy the world context connection from the spawn node to 'begin spawn' if necessary + if(SpawnWorldContextPin) + { + CompilerContext.MovePinLinksToIntermediate(*SpawnWorldContextPin, *CallBeginWorldContextPin); + } + + // Copy the 'transform' connection from the spawn node to 'begin spawn' + + if(SpawningFunctionHasTransform()) + { + UEdGraphPin* SpawnNodeTransform = SpawnNode->GetSpawnTransformPin(); + CallBeginTransform = CallBeginSpawnNode->FindPinChecked(TransformParamName); + CompilerContext.MovePinLinksToIntermediate(*SpawnNodeTransform, *CallBeginTransform); + } + + ConnectAdditionalPins(CompilerContext, nullptr, CallBeginSpawnNode); + + ////////////////////////////////////////////////////////////////////////// + // create 'finish spawn' call node + UK2Node_CallFunction* CallFinishSpawnNode = CompilerContext.SpawnIntermediateNode(SpawnNode, SourceGraph); + CallFinishSpawnNode->FunctionReference.SetExternalMember(FinishSpawningFuncName, libClass); + CallFinishSpawnNode->AllocateDefaultPins(); + + UEdGraphPin* CallFinishExec = CallFinishSpawnNode->GetExecPin(); + UEdGraphPin* CallFinishThen = CallFinishSpawnNode->GetThenPin(); + UEdGraphPin* CallFinishActor = CallFinishSpawnNode->FindPinChecked(ActorParamName); + UEdGraphPin* CallFinishResult = CallFinishSpawnNode->GetReturnValuePin(); + + // Move 'then' connection from spawn node to 'finish spawn' + CompilerContext.MovePinLinksToIntermediate(*SpawnNodeThen, *CallFinishThen); + + if(SpawningFunctionHasTransform()) + { + // Copy transform connection + UEdGraphPin* CallFinishTransform = CallFinishSpawnNode->FindPinChecked(TransformParamName); + CompilerContext.CopyPinLinksToIntermediate(*CallBeginTransform, *CallFinishTransform); + } + + ConnectAdditionalPins(CompilerContext, nullptr, CallFinishSpawnNode); + + // Connect output actor from 'begin' to 'finish' + CallBeginResult->MakeLinkTo(CallFinishActor); + + // Move result connection from spawn node to 'finish spawn' + CallFinishResult->PinType = SpawnNodeResult->PinType; // Copy type so it uses the right actor subclass + CompilerContext.MovePinLinksToIntermediate(*SpawnNodeResult, *CallFinishResult); + + ////////////////////////////////////////////////////////////////////////// + // create 'set var' nodes + + // Get 'result' pin from 'begin spawn', this is the actual actor we want to set properties on + UEdGraphPin* LastThen = FKismetCompilerUtilities::GenerateAssignmentNodes(CompilerContext, SourceGraph, CallBeginSpawnNode, SpawnNode, CallBeginResult, GetClassToSpawn()); + + // Make exec connection between 'then' on last node and 'finish' + LastThen->MakeLinkTo(CallFinishExec); + + // Break any links to the expanded node + SpawnNode->BreakAllNodeLinks(); +} +bool UK2Node_SpawnActorBaseNode::HasExternalDependencies(TArray* OptionalOutput) const +{ + UClass* SourceClass = GetClassToSpawn(); + const UBlueprint* SourceBlueprint = GetBlueprint(); + const bool bResult = (SourceClass != NULL) && (SourceClass->ClassGeneratedBy != SourceBlueprint); + if(bResult && OptionalOutput) + { + OptionalOutput->AddUnique(SourceClass); + } + const bool bSuperResult = Super::HasExternalDependencies(OptionalOutput); + return bSuperResult || bResult; +} + +UClass* USpawnGroupNode::GetActorClass() const +{ + return abilityGroupClass; +} + +UClass* USpawnTriggerNode::GetActorClass() const +{ + return abilityTriggerClass; +} + +UClass* USpawnModifierNode::GetActorClass() const +{ + return modifierClass; +} +void USpawnModifierNode::RegisterAdditionalPins(const class UEdGraphSchema_K2* K2Schema) +{ + UEdGraphPin* TargetPin = CreatePin(EGPD_Input, K2Schema->PC_Object, TEXT(""), characterClass, false, false, "Target"); +} +bool USpawnModifierNode::IsAdditionalPin(class UEdGraphPin* pin) +{ + return pin->PinName == "Target"; +} +void USpawnModifierNode::ConnectAdditionalPins(class FKismetCompilerContext& CompilerContext, UK2Node* last, UK2Node* dst) +{ + UEdGraphPin* dstPin = dst->FindPin("Target"); + UEdGraphPin* srcPin = FindPin("Target"); + if(dstPin && srcPin) + CompilerContext.CopyPinLinksToIntermediate(*srcPin, *dstPin); +} + +UClass* USpawnProjectileNode::GetActorClass() const +{ + return projectileClass; +} \ No newline at end of file diff --git a/Plugins/CustomBlueprints/Source/CustomBlueprintsEditor/SpawnActorBaseNode.h b/Plugins/CustomBlueprints/Source/CustomBlueprintsEditor/SpawnActorBaseNode.h new file mode 100644 index 0000000..55e650a --- /dev/null +++ b/Plugins/CustomBlueprints/Source/CustomBlueprintsEditor/SpawnActorBaseNode.h @@ -0,0 +1,119 @@ +// Project Lab - NHTV Igad +#pragma once + +#include "KismetCompiler.h" +#include "Runtime/Engine/Classes/Kismet/GameplayStatics.h" +#include "SpawnActorBaseNode.Generated.h" + +UCLASS() +class ATestObject : public AActor +{ + GENERATED_BODY() +}; + +UCLASS() +class UK2Node_SpawnActorBaseNode : public UK2Node +{ + GENERATED_UCLASS_BODY() + + // Begin UEdGraphNode interface. + virtual void AllocateDefaultPins() override; + virtual FLinearColor GetNodeTitleColor() const override; + virtual FText GetNodeTitle(ENodeTitleType::Type TitleType) const override; + virtual void PinDefaultValueChanged(UEdGraphPin* Pin) override; + virtual void PinConnectionListChanged(UEdGraphPin* Pin) override; + virtual FText GetTooltipText() const override; + virtual void ExpandNode(class FKismetCompilerContext& CompilerContext, UEdGraph* SourceGraph) override; + virtual bool HasExternalDependencies(TArray* OptionalOutput) const override; + virtual FName GetPaletteIcon(FLinearColor& OutColor) const override{ return TEXT("GraphEditor.SpawnActor_16x"); } + virtual bool IsCompatibleWithGraph(const UEdGraph* TargetGraph) const override; + virtual void PostPlacedNewNode() override; + // End UEdGraphNode interface. + + // Begin UK2Node interface + virtual bool IsNodeSafeToIgnore() const override { return true; } + virtual void ReallocatePinsDuringReconstruction(TArray& OldPins) override; + virtual void GetNodeAttributes(TArray>& OutNodeAttributes) const override; + virtual void GetMenuActions(FBlueprintActionDatabaseRegistrar& ActionRegistrar) const override; + virtual FText GetMenuCategory() const override; + virtual class FNodeHandlingFunctor* CreateNodeHandler(class FKismetCompilerContext& CompilerContext) const override; + // End UK2Node interface + + + void CreatePinsForClass(UClass* InClass, TArray& OutClassPins); + bool IsSpawnVarPin(UEdGraphPin* Pin); + + UEdGraphPin* GetThenPin() const; + UEdGraphPin* GetClassPin(const TArray* InPinsToSearch = NULL) const; + UEdGraphPin* GetWorldContextPin() const; + UEdGraphPin* GetSpawnTransformPin() const; + UEdGraphPin* GetResultPin() const; + + UClass* GetClassToSpawn(const TArray* InPinsToSearch = NULL) const; + +protected: + virtual FName GetBeginSpawningFunction() const { return "BeginSpawning2"; } + virtual FName GetFinishSpawningFunction() const { return "FinishSpawning2"; } + virtual FString GetObjectName() const { return "Custom"; } + virtual UClass* GetActorClass() const { return AActor::StaticClass(); } + virtual bool SpawningFunctionHasTransform() const { return false; } + virtual void RegisterAdditionalPins(const class UEdGraphSchema_K2* K2Schema) {}; + virtual bool IsAdditionalPin(class UEdGraphPin* pin) { return false; }; + virtual void ConnectAdditionalPins(class FKismetCompilerContext& CompilerContext, UK2Node* last, UK2Node* dst) {}; + + void OnClassPinChanged(); + + FText NodeTooltip; + + FNodeTextCache m_cachedNodeTitle; +}; + +UCLASS() +class USpawnGroupNode : public UK2Node_SpawnActorBaseNode +{ + GENERATED_BODY() + + virtual FName GetBeginSpawningFunction() const { return "BeginSpawningGroup"; } + virtual FName GetFinishSpawningFunction() const { return "FinishSpawningGroup"; } + virtual FString GetObjectName() const { return "Group"; } + virtual UClass* GetActorClass() const; + virtual bool SpawningFunctionHasTransform() const { return false; } +}; +UCLASS() +class USpawnModifierNode : public UK2Node_SpawnActorBaseNode +{ + GENERATED_BODY() + + virtual FName GetBeginSpawningFunction() const { return "BeginSpawningModifier"; } + virtual FName GetFinishSpawningFunction() const { return "FinishSpawningModifier"; } + virtual FString GetObjectName() const { return "Modifier"; } + virtual UClass* GetActorClass() const; + virtual bool SpawningFunctionHasTransform() const { return false; } + + virtual void RegisterAdditionalPins(const class UEdGraphSchema_K2* K2Schema) override; + virtual bool IsAdditionalPin(class UEdGraphPin* pin) override; + virtual void ConnectAdditionalPins(class FKismetCompilerContext& CompilerContext, UK2Node* last, UK2Node* dst) override; +}; +UCLASS() +class USpawnTriggerNode : public UK2Node_SpawnActorBaseNode +{ + GENERATED_BODY() + + virtual FName GetBeginSpawningFunction() const { return "BeginSpawningTrigger"; } + virtual FName GetFinishSpawningFunction() const { return "FinishSpawningTrigger"; } + virtual FString GetObjectName() const { return "Trigger"; } + virtual UClass* GetActorClass() const; + virtual bool SpawningFunctionHasTransform() const { return true; } +}; + +UCLASS() +class USpawnProjectileNode : public UK2Node_SpawnActorBaseNode +{ + GENERATED_BODY() + + virtual FName GetBeginSpawningFunction() const { return "BeginSpawningProjectile"; } + virtual FName GetFinishSpawningFunction() const { return "FinishSpawningProjectile"; } + virtual FString GetObjectName() const { return "Projectile"; } + virtual UClass* GetActorClass() const; + virtual bool SpawningFunctionHasTransform() const { return true; } +}; \ No newline at end of file diff --git a/Plugins/FMODStudio/Content/AnimNotify_FMODPlayEvent.uasset b/Plugins/FMODStudio/Content/AnimNotify_FMODPlayEvent.uasset new file mode 100644 index 0000000..1bde713 --- /dev/null +++ b/Plugins/FMODStudio/Content/AnimNotify_FMODPlayEvent.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c2640e344ea5943eb62950991b3140ae7158ed1e76f90c897391bbe4b327945 +size 213809 diff --git a/Plugins/FMODStudio/Docs/FMOD UE4 Integration.chm b/Plugins/FMODStudio/Docs/FMOD UE4 Integration.chm new file mode 100644 index 0000000000000000000000000000000000000000..ec118960dc88d71d7df9d4de99a10d6505d0ca7b GIT binary patch literal 3008226 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�p426Z()}bZlZvE{L|*3u%74>lzYb{ve43$Xj% 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%0Dl# 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%0AMGB{(HC#}aX zG9_-+jJ&)hNXz=lv)V{~Y}M-J+?Z;5T8+(KxIb?hoTK~)?L9;+P=YTW({K}${XM|W zi7SJ=7i-twKmbl2mX@4C)WYi5DO+~Xjc zivn98FpWN6qn19}%)QeotQ+S!h9}&sHf_Vj2MgZozgP69Eh8G^pLk<41J)sob}+|f zR55nrchDdtjk>SFv#3MeAF0S#zn zJWh&=2xV;`!{1Y^Kk_}=ddGr`(DIKv=3=NKqYjHCuQGhZPY$tW@rcSAOCReW<(7yC zt#wn>%Bz}hw&YA5;oLky+xUm%v9$_afE6avMjD2Dg*?KxPiYU0158ZZyyNh_7(U-< z+qw2a4KwU-3>)OzA(WS@U+A9uh-?Dpu~BDBKAvk14`;P7v@YvLC9Ew62@5b~xhsPl zd1e!rho_#1#E{SH=l42#@e!xy91{S~>$S_HXE9E#vvS%<^g(EDxv_2@Gpi)-0$t`_ zosl}Vy>L_LxMNLm@bFIqHs0@5+wym3k0yX0Bh8G) zKhZ_o4EM!Xh3a3c_pjLasK+9Qajh+Vt#Y>+m_NecD}+81NiuaHMgpPwr6B8t7ULmq zWOP^y%_|`^SZ_c4^}|nTnhQw2#6T$j!T^gM`<{u>G0^ewPFI&YI88khifZ4{t&-;r zE6m8hccZ7S`%h@{=D;}&xL8Jp8~%G2Z5vi~sKQDCxnl?asJWwtT$dkT8*NkwwaR4Q zZv(=g57iZ>Qu5}Sl>;wrI~;`vwFza#yO9gL45?8QG3ArVaXDY0laImV8L}mD_gh8} zN9U>j{97%$VCR|R4mC!k7Pa6%Z;i29FWb}XftG!#F}DGSD$#K@`H0_e3y81sjsky6RP_5cokIte@(*W{zLG~m@20ZHNakt zKjetcvAKgsLWiP3c=$BZqkGv1e@@H`DEz1FenQjO0Y&fgKGU45rYMLet3u=lBa0|c zF5m9J{@EZU{E~O-`&<8tiBHVa>%V-6u~QZEv@F-Oz)cAM>uq5df+1}WD354Z-c_-l z#d71qf|n#~u#P-q?6NC}L@25u#1B{y+?XH_Oe{&|m(I-#B{}_msAoWyOZ18(!Dwy% z=WKOV+O_Ag0QF`HyhFutnoxyxIfKUlcE(x¥@n0)a(*vGIbu<3(1N#34RVP}`=s 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�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%0AEBt7HoUX=W{X^;YeJNK$dXSjC1$*L= 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 z z#9W&5XEs zUA43wU?|^bkMDX{v;3x5(Wfe)I@c(p6Ppa@;>8zCi4Nr6%!<8I##hY-G>T1nuQfAu zLKgbvY{JHU-ijAP^sD7tdVa>Ni7OIy&U|}?S1Ahf9tZQ`C(a#dh~Q?g7Q_%gZAh5M zX3@H=dWOB7U;q4r3U^)NSWRmG8*Dvc#w7YNf9T_=AGPW;Z{3cXSKH>2Er}`NPi8f- z+|xZ#?D`!HRnB`eAxQqj*PPvkf)Bcs*ZlHb?VD|C2|HJ$|l1=KaR3Kg0lxi^|AF z_=?m?_{(*^FfsgrjsyOdVVNvD6e8uH#9f{cylYWkG1q#>j;F*XUUg+?yQ6u@z>l`~ zVzptBPj^QR?yC%~z*RzFVt!n6J$#d4{*ED$6XwoxbPd}EMA}8_=0*3?Olpj;)Ou6u z#Q3s4DGh7tMY?>qxkibLgf!o4(Rwmc&@}*#pp<+6&?FAU1To}#BpsVCREWoB<@A4o zH>E*Iw8JTE>E`&nQumF=bet})qooOqr0g;KtLDT#>D8)o>l3Qn$f_ru!THX z9@jgoz}#F`|7Kzd%f4nBYWYCRWL1xPlG4(m^XA&yoNq~820~?B@Xr35VZ>KK^GD4y zt6Eyf{MB`HvapN(A7{7>UHF$~dJqOX839~0bR+3?*v8{f_ak2qRSbB?=+9+p198hp zg%G!s7`b2!);0-ykYo;PJg~pcj%5ryvg~aeg+=9es_M6oJnl5$f+1c zkSpp0CYT;MTQsbL2zM4|tB3wf3Nm&ouVB>Pf9+q-tUREhi@0>*I{3B_m7cs?f$X z+)E%Hu-J?(E@3aO&m@1a4YM_9$$9!x8GAJs5m6NmVmz>&(fntk$}wx6;i!xmUbjO_ zc=lr`L9?{+SM_6o4Qw)2|HNs3aCgyW>JXm1n^8q7w!9E8U&)L4bcnumXh}LyEXlYPqXYd27jlNgdVTlfbKo2bu_KKPycN=*Qh191q%aN3i_8gRf5Bj_EwX4(Rq$njS3O^$;g$|XI&#|Yc zUs^{SN+}*qZsa=(R`m^zV%sVF-lDoV>^_3BGX6ObeHm^Z7v~x?(i(M!bPGFL>p6i$h=K z`Fg%*nF!z2=(qD?*s9uIpccu|nxjhAT`=!0y}SlZaY^&2JB;A=mn?ooxOBwV#eAJ5 z!DN{de@^UNf4kQ+Q5f;qOsZdQe}DeMzZ$C1toxHJp$rXP!A=?t|79CBskpr2Y{Q68 zHjC)79j2cB1xfM9PQypjeGrHNgS_!MG3VOfyghWxLcf_u5A={T)&5L>fXDlp?+RZu z06epQv^z=BzrFM|rt#YCw)!B6@&m>_8(Lzz1gts_E&h-CP$$l>aZ4yrhqRJ>r3f z;)<>I|3fthUNb(%@fyC#z1PlLqJH44WeaGx%A6R0f6+JRh2+6P72hM~fpV+LyqJ5Q zVx$XInI0OoXLgq0`LG=B8ANO0z0E!2-o#I{$oWTA`f^-NnGVPX8^i!7X!AkQ+;W~EQPl}ih`6)!b% z7Rb0@dw{{(+T0NkzPHEhL`ZTxUwyX}B=2q^-YXr&p&c zy-S$IbbinsTj>i=-Q1Hfb}8wE_cz9Kv)Fs5p@@Wf(^r!0Kw|%GV20%t#tIIfIOX0r zl^23No2tmQ-&i1VBI?z2$$A~>`1l~9ud8?hh@$woJ(t8oKvm;r;4^0}Q&+)r*4|>C z7OOp4JGxk)gXWhUW1eQQXf&bxoY9E#d?nuP*D54Q-tppyR=w0zRWB}tFm^3p&qe%> zH`l?9p}$}8SN}a9QhCuHr%Rp{cgtuuI2YCN%(R=l`O&*r%}Bd-cfS(yIWo&Svth%r z3nmQeGoe#PdS>$e=7PEUiyf?RpX|Ku%nx6%gLqWo&=}^sm@;-thQI6=G|w8pX_@J^ z11p0X+im6d-{t;!RTTO4&TK;3%%!(yxu2GC#`xC`dzN#plTj&U=MT~5go2dnp^q!1 z6!xz%2@v}ZmCPWN!12DOdu6ekE+I}+FZIS65dI_h9s8B9wwG8l`y1+hJAUWR6nJc3 zTqo+z?Z6&7ciGF`^(7=?h#%+_vN56Ox>EQzh(%bhUycuRcB;*(`bA@mi6-vKzTKj{ z0?oepH-)eun-7PS=TX7zilE@NcS}wW?d|onT)N(p=`5!|FX#1`ZECZDT@WDvD4?b( zX03W@%b%$&KL}kpaVXOi0ger$jo?0qU6239mOwG@rZL&-@ugwJvg03>A9dw4EOe?? z66YmGhlObr^UU>B_MGvB6(68-6w^$$PM;gKY`<@M{=sM#&ua9X@06 zU+=#{v)JEYoK-QjNE0MH)oormy7?rsO(1H}8lro$}1l90NaS;^#pq#@8_Nb^~FT?U^LQ8~58+8&3^ z3XN{2Tz03g^odIsJ*Pg~mx_GnYOY4OCcU{-Qgaj_(&^1cp=R9@zA=a_Efkb2H%(~w zLgHv*v<*#?^vXfXvh4;^*<48juMbJNGbkj)AFoArO)MW=1-C`^U;^JkhUVs zL=pF4q||(7A{306eVt69B1uixz0D;h)Gs}(^%kik9VN%opTRvGqic>=xgY#EKRHypKtrbY^?#~_nP zT-MEN!yTwENyj85&3+}XMciODzV=hhu7AuErXN@=><7zt3Rp{D4 zsq1t|J|$>aa_G|8i$xQ+ng{m|U5OJlatDp#F>IlnSwuN{ZZK?y;kVDrh#XsuP9nJT za+FHNYK~?4ARjL7gXU8w&RaL^*E#;~n9gN6H zCv{SqPfq*enm~1Ir0yqNmOuo z*Ix;>86|@)v_>s?M{O4}djq^Yx(2o;IAf}$m6yb%?FGB4=S_>MPju=QD4?by;=wns zd5EjUTGtp*7E{C0!fdWZRRc`<|AgEyrIli zuCUqiR)G6unfzHYu~}XvZ$%%<z#`RRe9Q%J!;XQR_ozq=S2L^~#FoQzNo}v{;1EcRhM2+>&%Xc?1#^X?{LF<} z)l;>O{HcR(rs3OiXlhQw;Wr!;?>u47vP;s6tdb4q5=PRiy@iITTuyx_&Sh zsn1ng!?$P%Y(Z4-#xBTqFnaI;_N5vGGL=Ele(pT& zpvEcYp<|fYdTE>lQ>=w{2clMrz%6$#%jBcR)KBMb0 z+|DN@8{%5zOjlfwOo3p9pbukP88wHVb+wPu8%X{QFpeu^b~2O|qT5lC)a1?B{47*j z=}vbSJfu7*uW@GBqM*f_!yn8g1~5@cf6mlOWhLYBlW^>AK`Dh zCI5MVzURK5E!4C{g`c@Ro7b6Nrr`wF4>g;nME@^x6Uo5hAB4ipm!Qb56ojDo7w%)9bm5PnjHq z@hFaV=(Hk$wIjsdSjp`^5;?H}pnHPnQA62<45;2{k!+{yhD2FyDFHw#4sX( zo;C+wbYUjdTeXF-J63ZVbKN1R!szx^F;trN#W3n9guh zyzMk$CY6DcBn+HX(npCzNimn}M7@%6!51hh@kmPY{Z9J4V*&Jb5#Dh@JggX}7~aO0 z7$u_Q^F>p6^DZ1xw$47NUj1Zu`fNJTbuw3V+?ztRewknd!a#du3-Bw}=6ZyG$}ug` z(@j!{5-%giJ1_H~2S+teE3070d$}q4$`M^lPHGC``wau;Gx2rrbdu634T$boIz$q+ zxtr7FA{-_&KcOq)?G|$0mPlsEV&TYH1Jjfwn_+i;Yt3k;s9srEyO?;@^D5I;32*l7 zx*T%s(YA#o4PHPo<87xp-TH!>Vy+(90-6UBbn915LY}>88ky}zw@UBtG$5FG^@UO6 zszg+>ZcxVMhmQcgT0#_oBzu#Cg;XuPOqmOo;!}S6h1r}{=>h5?H$BDcw!MrdTjV&D zr5z!I8!d2zQT<$(bRiX)kZ2pft*6s7@D$XAqEjS6=pZq^lpZ{s(Y?hKVZ{C68 zOV@)^eZEVbkv$wR9S8OEyQaj##-L~M1Dz&mCED{cb8OjHV;M@hUBQ^U1ow6knt=qg zgv;)_$KzUyJd+7`{(wbNs5#b6$fDySRK8pg8SHc03=*h;mZpvHW~y4&A8~2WyRo!A zkxBq7#po9+Eh4=rI^9BPIvy>SWR#1zyL{*pqRLj$$60hfWb~LeOL4$7*f}hUKq-7w ztyg|7MN$*24kwl((n$t!IR=R9MNT3k$;1uMgT_4f>d3u4@4jiPG(i-BD2uLKp>)Qr zZB9^A@sYEJr^JJ?wq%Q0x^}flW^PsR^q4)kM*F>xkC`IFT^4h)K*BJ_GZEaGHIK)I zVX_$)f36dfZ(0zLVEU5O|4eoO`#S7-gOix-LP>=*)qFB0QA6GNVx*HBm8{Q8q$U{@ z5y19_ph)RNIPA5%>sCdq%;hRF_Tg#iyakXbdQ|T#=8QM~4Z)wUfEXN%z<7v>sk6~0 zd7%wFpBObNz~l-mT=Na}Oi0twGV*`9qbh1mVnV&6-|bZhichKg z^j110_#*`_~i^=YOc$+pIBh`hRB?*!^|<`sY=SE-X$Bft*=EzV&qzQa8z>y(cf2I*9mvAYo*^3-Fl9W zy8t8Z09JfH*DbP~ieD%cG$FuL60Am*p`2#Xl1W4iU;NByUK(z*AVbl0Niov*Z}U<$ z&b3$c1}&{?V~Y;Tqc+#Zp0;`qmUl2KJXNX7^{6WX+uJ?IDrh4l9{=+vQaSeb0 z%hgWlWLHtT0a%XxNJ`CIZ`V`Fn&uyq_`MxkE1qN|l|J&2Bt|q@X6{D(hpjmCh*WaC zXC4d)v<3#nZy<`oJM)dN82KaU8MT(Wdt0<+<*FE+g47$7|H4WvQlUsM?Of(2I` zr-ox6*y?#s29yOC9ra0{0bmn=VHIng>Z|$otRAD3tTTgX3vpQ1n0LGBL`uDah3!@D zivx=pGb?qUUqa2Hw~n|pZy3aMSCh(v4qgVx2~(Bzblq;s`(Z@(}0tz zml9dFEHLn0qcb1T{+P;*BULUnz?R@0g_pk?qdCTng zLs=5t`?ns`b>$}2L$|3bv0z{q;Gvd}D&}qML;-M0xz(lx!3O%iKql3^vZj8#>T|n%QgBFk- zX^9$9)s6EWz69Z->BB^pCQG|1Bxh7eaLR|jnWtxm7aHfI*MH8Fb~-r3vb9``*?+Ki zJJjvQ(W2psL4yhPnt26HM!Dt13`YmZLPEyyLiUu}-FmSql?g2air}C;- zs2y#{njqn~R3oCe*lEhpREz`i)bCYo`AeVh^dQYPGfPpLuHH(7#omhCt>TZQR9v+v z!WM7Od@h5u{x?Kevrt`ERIyGXz%BlLnn3R&B;lnKm19HZiK_Y*M9fQzUw?RidvCB} zzT(ctmj=;m*x%RQZ>7SiuOaLe4Yz4pFUmSE?H*~$Qumcx3s}m7ZWw^p(YD)Fy}@1z z`Xvx|$YL}0htXZftUY_V8VlgPM!r1}w)X4dr$PTpU_F(z9YUWUn{2+49C@ zW!BN8>qkl*?t1#CK7u{SU7EWRWo*J_vNWk;^a^>IYu=fik>HRgWZJN5W6T6TZ4eF7 z$>mj)`%;V33!lbFuc$+s(K)e-t7-~kVvwo357{F?VCQ)`iKj5tEnylamU4HK@@Y2a zq7OzxMEemP@&ebC*f+4v>1(TQx)k7&BR{6klC!w>c%i^3n4Y}|=+}0?!wJ!Z_3A|i z=*-VKv*=|zzMO7sEdy9jv5EBfL?yuYYCZ}(V*=tSld>3MDRXc0RNA{MVnUfnMtUpK}eh5qKyz4fI|oq}xwM{K5P zqzp*KZ#Vedd^yl1REndVI2StE`1#MZcYTnr>QD;3Xo8Y)nO zBsn5iBNr}&ym~9&N!x2g3i7Zy&HP-~%Qw?lL>X8aRVboSnkFY$Qn(KZL5w%}MKHT|%_($_97cNqd`w)ZK8H>6s+IjC+#q zo`Xdv%4f{?dF9%d`8|dC`J_dkWRi!@jgW`WJ+56)WY3&c+ApN} z$haszFRFB9@&eMrttu7Z|wy%C*=h@PE%by=6fgIZF~xT9Zv#A3U9w$<&5PA<|DIQn^le}kQC`Oh~# zWZGp+!XY5;*HI;ys`rdKc)icQ5?jx9=#!NOsytejQPb^tv{!Ap7TaOJ*WZ)DQR4~D z&ZCb(O@~^eG-7J7ViS0lY(x&(_c;&%DSW&bjxY~DXMl!sd1Iz-k*{}d+0G0S$=!k5 zm2~^)(zDUG_u-`6(iW7&PK)+^M z)qmnmfET*nhB)ZocSJ^K$>f_5wBCwd{o$2|9SyjAHEZn z3Ga5u)nm9K1i}$nZT&(_?u8G*y`W>3fNy}!BRDCF6vHbU*u8xBWO%TP-En%cKQ54C ztSW8G=*rZoPcM;Qk~a|dPY0ij>@LMrNwPywV0=yEAqTpc)LG~`@NcM8-q#W9-8GXe z!Wh6I3NPyK$N~;ekZrzn3Sw{ZWo?_tU>HrdQ~S@BS|3r5@r(*2?1+Hyi+>n-s~8W4 zR_K%zHkPE5R(M7$m8Y{$kHkMVx%IHByiNspEH83l zs1sKi8Y&Z?!MG>a$3x9QyYQSN^lrJmvnDpjMXkEG7$r2>WfBsXWAMg-mJGu10?}3x zkCIjueDR65L)J=X(o+xrV`ROMH-{GoY%77hX511)096nW000000ssII001fga+mJz z?(Xj5?(Qz`#qQnR-QC>X>@MA1-Q5w~q8YF<00062X8_;`8G&EI3vp+{x&YH41vuc* zfi@r`{GyrgPk2T!34i(q7ote~{!9ufift^@8xl$&foiZ1Pf3QT)gJW#1H2HKlRdbA z4)7XrneY(6000005ds33OBm*DJaYsEAWpv>zrXUoUYnbG1QIz2c#?}#l)H6_YndXAH zp5kPPlg#!_CBEZ9e#)TAAX9^Jvyoc{Z$KR&3eI>sJMMeRLp~f?UFhQ$a5stvqS^Jk z!IeBS?q*7>+FgqbLvFPgR%=kgA7_d3whZ#?&7~g+TAHctwh(3{RQ` z#x9s)O0*xb>Tv zP^i|f#%&I`HO_MnQP*azI8U+ef8%_6dnU#;VToS}OG{kwPP`8!`p9glk5bHG2SUxC z?0Gv}-esF;@nQ-&3ktrv;~3Zd+guR@RPNk`seDkZ*c>`er@o=3U&&B5qi}w=_RO3e zQiNfqAO;%v!s2enfNO_5he$`A^5F6vE+650ldWEDVEE1O_Vq>xlN$t)MmIS2tYTH> zg@cz{Vk&&#hm(1X>a5d3m|kpfq(0kh?bgIFKjlJ$r>nU5{s(=hWz?Aa{H{=nm3nKZT@WsM^!#FS_ zHpEoUvcw8mcWF^YT_+MVz%KS>C0K|AKj>8A(8`T18FZgB4SX{z#3I-30Ol!$FA~k9!d~ zSY%sHx{(WtYgE=P%tB_-(x3ekrywi3U%_hZZ5lg#42Q9n&;_-|WVrjg^VO!=4`#s4 zxp~zyaNoe#wXaYlrhiW|th+m$M-WrS%^D~BfiQv^pmv&~gYdg>&x`;4Upb*b^ishs z$SuyE1cl}umPg`g;(hl&hr9p&f_*wed1-V;cj28q3bR0BZ)-g?_@l`V)9!Igsf22= zY_#93kV_vzY%i1m8WoyM&|MNWXDq&-bBv4lLjS6EdMq-mK$*Y}!>12yn)-9QQF*Qetj?yj!wEtWZ4gY=ry?{+Rl*;rr)!!<{+_*Rt zYf`Z>5|aBMI>bh=3NhjS2n1dzL;{7mu@J@ZWs+_x=?CzNXDAEt^fq^2J6jw2DCB%B z_kn3D^Mf^xsp0#-|8nbx;}GN)BJwBLgTWew5kh(xS?nbiTUGy+ywg9Y8R@CCyl?!38nuGZp} zdg$#tH@LwkIy;)7umlep-F0YJ-=`hnEB>-kpT%VQ1~)r`iuU(Vc|BHxvb#?QU@^7c zr?`7TeyF|@P@TX@Ijm7)osnG!Q}i`KLmbFRr!uWYv$3}A;mGpqRn}etO!hkbO|lF+ z11g(fJ_F3+1{YTuJr(3cz31}FILAW#w=Fe3|9Yhrs%pE@h4Ty?&t}ZZyK2+k)Xto? zcBTA;`#3eBnpbLUk+r?tR6sm^q#4vH0nE4!sb*Up#$o(jg(fZ(0zfn|{Kc`OED4Hj z6EDrC))bcQ5U!6g<1)O+I7%6TA%yO@=?z&H=6K)#Qnm(^;yk3}d3f%@kC2&P(arwJ zpvGuu@w3zjyISimbNYA6O6*wQR#VjP?DOhZ(K*rmikHFt<4u3D$+ANSEQyx7i5eO; zGqUM9eP%xhOZk@m+2xS?CxXG_82kW^$PFJ$j^+PBe^<7$22Gc6vzb3i7>_$JQz4-5?L&35Ff3VCS&m(Z3GNYO&4fZ=*pH>h1o)awt^O8j^6lSy0 zY;f|cP_o~f%C*bO*IRwL?^7JQ%2U4luI)!ItrIHAtb8|kV59~O)h zb6E<$btHn2T*iE#yuIYHiP6nlsiw(k`@mxP8OIp1A^|sFa~cd7Moyaw6JW*uY~-Ojne0O-Wr;PaB_(}z4E)zuoZX-PZa?or^cu|6x6jRq{-Sdr!W>!D>Ha5+y<99Q8@m?bR*j`Q^pFbOV(&7IbXK!; zOo|>xFG66~E`CDFrj=&ByTT?q7x41k6nugnkNVl@_(lHX9^sKMm@ z%=Yt%)>N(h^W26A7IEOe9fM5(w04lJW!}z-eykw9wYayk0R-Pk5+;f3Fg___yqHOL zJ4n{Gdb!EnuJyU2&!V+tN#;0Ucbiyt*i9pa0R$ub_-LAv3?Rc}& z^2r8sOO)%Gp6d8V>>m4w&u0qijH14-FJii^m~rJ$#wK>!d}#l9`N$(gaLwyhj-OIz9bmw@621?Lbt*;66Krud}(rC~R#?epLP8lnhTVZ-JA z(%k!K=gd4Q8$vD0ciEGHCM~s>>1lrX?tEuJk;~#B17MB+={A3cY8S81lYovrcHF;X zhOH4J8aLPT4~OXU_AhOY?=CkT8qtvSjkwMB$J=kQC<3m5gj+F^@~JvcXv4DLDCx(q zZhEI3T{Qv2o0&*VvAFQ|QOowk!W+Y}V3qNaN3Sk}b&h+4iF803Ol~yQXwRFqzgfW* zZNQ||{hnw!5bsF(R*v-U9Rx&N@poWDcS?Kop^e4kH?#jA2p;w|DuR?{Qi)5yuM&nn z3bn$R)GiW_oX$Cxj|3j27uy(oM8dVfIo<9SqQyS4biYOtqwFR4y zwxb%!;q)q(rGRNS{Bw;Hf??Bqo(E2~PgatL|Hl9b7FlpcKASBE6o!}e#uy3*-2!;S z{(c>gRbMxU!xAokq-$LkQJB(A?n88a39FYQE^BrpF0Xp-=35cgeX#?0#1bu~3ZL7R zN#rZvv!KAJC0Js?k-?QOhJLGL49w-FLW)9PHQNL_8ASK-Ph@38bZ@k7AehP|!b+U!Y=4 z8UNAa->|FCl_tLBJ-P!Tzn@GFC&?sJ7`u4fn;qQKX}A9k@0z#&VIsRi|DF{BbvTT= zYE!c**6EZ^XZeAPKF$Zb1a0N%v{Vrk!~>GeQ?rAUuI6q6iFa9l3#lT@hLNhuy}CEI z?mH%Xi9@_sWUn@}+kJU(o3a7Ju*9qC>ZW6DT!2~SaER^6n3zzO9kEAe@bF&&#utND zL9Ns00iOCGuH1DC=>=`~!! z72V(=9?(XNaEI0G$YzdEaj!gct{mFy>G-d&N|&?#*4!_}4rjzK*JbaRaz0)^eugVr zhlVGMz06g=rN{UfXP5e@m0)Hf+#{AL4B{{T{GQW}>z^*|?IbZxKB0!C&Yyh0@5bb= z=Yy$8rANJC)>~k6IT?ZgtYy#Hmtg>nN}-=_LgrcRR&D}ttLXEWo<4ZUDLoj}iuzLr9*A8mkieL0t!wG`^+(B+4cw`!(IJQFa zy4eW;g{`$kc0AemRPzZZMJ8PjIv^fto6CdlWCf=R%(8W9M_&F-Or?*d)rE#whENU2 zT)4ya8aWy!!QwuYLxUeisHe*}9PX_w(c^~JflfWxJd^57_pu66um@$}66vS<=3h5N zzRHNS_Px6pbouv@0^Ka|079eCXsho!U~|V}=B5A{?1{!8y1fstCm+-w%|pYg2ZiC^ zr?!_l70e}|EW@%iH#JWo}d*Bk>S~p#_rydht42sm5CY8EaSp78ft}i!ZtV(jh9Ku4hvfpHBl}tX*F9!Ou2PrT5QTXF)AVHql z7saC_*?f&7-}hAg5)X)p_6tAk`LFOi4e*=#KmKi&YBa1nQh7|tqInManbT=c+3>O~ zwSHKsA^JWS)5E8*vow}H4*5>`!X+kDSMGWI(VHN!c z1$Ol$e+i|5-#jrT$}auJq}Y2T3SlxhcdYNXP#%%@kdNO)&3Po*;Zf(aj>fD#z+%!L zds7{<_ofYHKcQkqyDh>CdLMe-lnca#i7@3|Tdl@gbDa`{_0n)ua3EgNjM zYPe51RG6h?WW(ol!!A$YV^ek<2g-)WtJr$mc={gI+2Q^2S@}9o_Dmp)n3(dp{v|yl zB}{*3ioh)m+X+oa3}kCn71aU7<{3)>@141llNJs-eFhRn1`h#;Lm1*BbNLD0#w_d< zfQx|0|NLI$3M`|QO^q!l&>zR9??C}%aw#M_yJ3oHa%?j z0V&e5MBr!8Mb%*{{Xm=~waT0dbqD)f^qoNiib^nQoE;&8pxFiI?3rICaA4F#Q`=(a zyFb9xWoN6A+3BHPhm2JI!fSI{i{6@J?m}#LVe~^4yW(t1lLr@DiIIpf%}(c-Z9V+r zYz(Px#b(l~3{R&_hluVE(|gU?>+NI4kZs1oqb`-& zwlk}2x7l^xqmhRZf7Snd7A_wwsO0#QX7GXkOGX|K#BIHe`JtI!veQy+=8vZ@#gKor z^5wL?JGmn=#Su7`3RU}n)JtaG$CZCH%?DS-gN-^94Cs{i#ZyiBd!a-M>{z7FGXO?yp#JX!AQLO`#^5_=`RE4%R}U81x;N zPmteRM(&J16S=dfjBRbx#NG*a@1~@lZw@dEF@V>nk)EthY<5~?%LG*2E>fmnk_(d? z{26{9y;L>Lpr#F^u769*{x>G#c#6N~<2mndJbosmf`;~u1!rER53Qm2K;f@19=6Jp z&%8cs#(>>U^)tB!N)z&>vsj;`ul7pmHy@WyJSfs3zw|tVy#Js}pE83LT@YdK$_$HP zt_My0E2L_QWm#ES+3F40TWf4t#Z0}_7y=w-X0vL2Yv<2=v#vls#ODlObm#mYD4QR5 z8v@!hMCJ+}UCo7lcY&1{mYmnt&s9CVun*bv^omDeXz=K_9`~d>(YAk}CHE*6Ln!EC zRna^@I5GdsE{1$ub-tnh7?S-*>z>IGXRK3-P0-C#y=m$I0pW$2xq?@g7;W$w+0un~(>w^cy1f zDJl%;*J&x>efbxL{;>R{v`o&h7M)N(b5iJHxbz#g;Nh6oE>wXW@nC7LrOoR9Up2u4 ze7zMmi&S!Zg!hDg+BN!aT&4fqbt>De;obs@=FttPU(bEznB#Z`Z*`l!+Hy7r;%@Pu z6Kfqa^UQE~-_sICv?jvrAepjefH@m5|6}crZeHQmc^e81r6n9?iN;Hkky*E|uXqN@ z_6`H}&AY$f5zy=Yv>t?rCX0~Oj=!a6dhY6fN5|gsHtte$P^CyDVPC#sdl)kM6PyLh z8GMIp(tfFrt){8g1TFjJ6$)AX$jSc5qK^biAbDzFRw}m67a``}UqSWpe|rE?vPs*~ zrpf-8$ixN76UqD`*=gmkFZW6QbA%z8JiFunj&8ks-AvrD`I1RQ3Q2679&P*ZU@brQ zJi2j!YAngz=-T`qw|HQb-)HXQ@kAaHT+iW+O-*UZkIRR*wBnpM-JEW}6M=CzP%BiW zR}d?L@^>_Gu2&RgXRhKnpqZ8b#p*e_3kBTDTG%mm`6VSu{c2BKA0P%Fouuk<8dsa< zbPLevMlw!KoS3D-tZSj4=B@3(#rC>?yuC@!UtGL6JRVMAVhCGVn4r3Il*Mf+c-^^F zuKdZgJ&WbIwNjtE^LhdUcm=u2j!kLMjv#)cG>dbARtPd>9K1~#A&|Mul2zpjAnfp< z&kgqnq<6Wl45eMQBU|pzc3l4{$~|7Gi^9crzn&k3kN%WE>zMNOo$5$`aC!{tygViZ z=D}ar84Lo*@d&?_g}u08tsTM_j|(;Fu-Z@eazc0KC=+_sRVmi<=la0m7U$$J25%h8aew{pUmZH^7*T#_#I%GN6p@A%OV-aBw`NbU1?r;hQ>4Kwia`i~;oUFjuAC995!FkHX=X|edz`^!Wdt$nqDia zy-Qb1xKEzp3LY3w==jg&wbYCjQC{xoZthWR`K%k!SCy;t!yC|sZwEp9QighJR6iXf z0N{A~!;meF0tzAy^|d>g?XYyzaj9JAI$hm7$6G&|mrOYmGj%jb58J!XZjfYM zcn$IOU)B2uGGYnlqedK0<^Yu2p@Cc1>`n!b{6E{Zs%~}TsRz%TL2BnZ!wYLH=cA}r zFTgY!!%ZmsOu+yBw66&;P9%OCWj&Dc%H?;WirV3G3GlNJberA2QvJofYHl&XzIT~t zHAQ+flRU7gfkk%BIbN0y|%=%1n`o- z@%KT7exh;bKN>t4-;Y%wCx$}cVfIL${$zCpD-9pFJK4BS%AfVyc7t+IeIQMk-FDC2 zFnPE*v<;}@o9UCZUrIMrkkwU@^zudQJowkP0ja~h%S3fc=&+fk7zIu_j{`UDxrQ#-{6DJwff`WL= zm`xAIt?Hr{_7sY}P@N-)pj3_$Y&SZO9eO)Xdx{ym%>u^ens34f)7fff^bJ$`SdjB#{B0T+8tk24`3(GkL;kYu< z?lHc?3S99v_Dtd731Y6^97!&S6b$BEU*@2Pkjcx7*?eN3Au!o1YqX-boMgXw;}C4Z z`jfpxYwksrA3?p=H1U&4dwWxE{B!>jI?%GQd*BIdCbN2-EZ6ZHbB|t>{?SW9{(JRN z-aI^P{MtGxvGOg}9&0I{-8?S~N)Nm~XXI~(L>=$)r}(6dIS%G1|5_Qe z{k|bUZd+FJ#rdi656ALoBm~Gt_NO{JSmPQ+*8OSvwDEWxWLUiqj^o{6X#bP3B0OiH zJUevf5a?RkZc{cU{xjSbG!k3(S2d3f2vq5dVa0(H7Ji4=n-$m{s3ro-Bqu0jL}HS zS(&36%|fX>8W};eu&~$g3)s`yVPs)s)-5apn!Eq|rHwHj&;^a^hMoA^ z^AiE{+VVOgeTi2La)h3={C4fB7z_GM=*~W z|1#*-3u-J<-dcg0HVUV)oT)ct?pyaYk)>5FAL{!#doAk&!X5*WVaG;V01W%)+*Y#| zHW0C0D9xsfz8leDwEvacNop^aC-d!;le}3<4JtE(64JP5cJ=k~wwXq%vS53v$MI|0 z?LY%DF+n0=!WziPwv$#t`1MBR# zUv0TtKZXGRxBb+IWL#V97~B{^e`g$okwDeAXCaKeRmdIezkst4?#l9+FE{xO;_)OR z9}x~`EM?6Y2n@I!y<#RAYZ`dwA{Znt_KM2;*ge;bn%lR53FHW9RD_kXE%tc zh93b%b(UN1)#6O5a0adNk${nZ!hPySzE0+m$f0|_3Y)9R!H3f?B!j8Y$xX>)z@D%B z0Cy>JArYDv#FS%;#_{ZTp)PD(9E_fCo$q!k0BsZRun6IXK_f>H$gMEBwlB&j-m z1%JMtxy{HsH#&j*nucO3YhgrRSrXBz^m~jv+6o5iX3UZRWY&_1cHc^N5Z(>U$;tTY zTCGQ^eK!!Rs*b2NsH8*EmntrP6&C#U@<`(Z~#>a=>L+s-dj$i+vk5+CaQcvNW3o@TTX2*BOnH%AKB<^}Ql10^U*0iek^@=XsIE7*L5T9$<`KograFoxL7b*wkyua>uJS z{Ov4^t@*)rod^;#HxEUC8a zAcm6unCiX`=ZWTcpxY{wt4O!^ooKRwZSACGnmmCPXeJq{~J}Ho%&3gy&li_fC#=a9yvTM6?$^5^FNkI9|63$Ivm}m!t^Rm z+>vTD(*of#GAW&|d;!g;pGN^GroN!P>O;REF=X*sMBJc^jl|MdDP<%L$o}NN1mVU3>JolE-Ek8N7c&9?ehHzo_8EcOx!C+4f@)K1sQ8SR(T#b^tNs2D zOcwB-Z3{x-IQ>anBWMedw%P66GV+K~uP5~&%ITSu^x+TXr4&d>kSW>%YKL)f@@9nj za+erVxKCwT8hCSsK?vlOnIxCWG#-OvtyyXtVj*F#1JERu3w!l~C zXF>Q_wW?W#a5MQV9E?Hy?IJ}?LvR7^N%6+rqq_CRYb@ECl>~<}7YQC0`w>tBYvKp- z_=*Z6+(YEd+TCajTgR!u^u@UqDR@)RA5sJ}h@Me0T@%{bS|E#ZcwPhQ=+ktP_?RP# z_fQT z4?c{t$B*CWc#%xpfo;URiA_cZh$b+4qRk#C*R>~ADD7{LjgU9&Yp6?|uyX7K`gtR#< zZ))?ojZWC!J6>W}KwuX#1>{K}SY6pw2+VAbf4(SIqF^*D^{Y;qy!6HJsU|%)=I}g| zx`jLS_Q%>F;YhRp_k#pP!>n9h87e906D{2&5xUy|GeFG0YtwO_Q(>kC1Fi=?zZcYi zb+%?J&T8~1_;Gb0ZnLDSu(8p@^CCTKa+UKWl_TKOahrj{oHmNAr95Z;q((Nw$yew_ zDr5sRK;M(SREXP;l(=bKq|)|Q+HR{?R!WVa+ffB~c42E2Xz*k<@$yR#1Mjd9p0Z!2 z|AT6!U!TwDeW5PldZ<=9H_uGHL-lUTOrT;~Z1kEd*F!B7`0D@U3h-}Fanc)T4MMP6 z;4Mn}p=L)n&zLsaAdML~y8!iB6`&+ZHX!HZ`gdf5*wHr85i-ULGP}0bOlNZ}KWY%B zJGFDrH@)D5SF9f68>X%scD-ARdIzS42{ndhl|;%<)u(ux2tBT?Hkfle;)))#Ra{P{~AP;E=*8iuQ<1SUk;CJ zwS!{&-Q_H0o8)ZaA0c;u6kDHYr7KnL=DneNYNNg%6@4D%w2g%?OOv`NzaN_I)32{qo?Z^m~u`C@P}1Zo|*u*!D= zHrireq&0x+l!Af)qOZ%UA(!yzSNR3ZQCu|6N?1^d%3;Dycf{GpJMw5xX5vjGd1!Tn*~Z@`Q!@Ttuuhdv+#}>@=$yFKErMO1 zEh+umhPSmeJ&ZRr^B(lWy!@k_`3e3y9rF_0w~BPG^+>>F8}%ecK`|G4WkmmUYAnb> zZ*xL>03B!bvD=nsEtM~~9uJryJ%d=%%0e6rN6_CVl8rdYEfb_GH=I2y#%%Xg8i_Tr z2Ft|xwdA5#PUFmCU+3_nqkf+V9EH5&vm#4*TBhLWk(SxUIpeP4C5{DK#p`v%Tdqi) zMo&B{&Pp!{Dr~v$L+j{Ap|3`ZJKG|2mO0*dmsFtec!FEsk)3KK~(=Ny@op3nTtNE__ zuZl=R(n=HivuNkveQ*RXS|dv~1&FZIEH;9xFy9Y2pFzxi@RwF~_@@Ja80S)-PlXw0Fl*%cFa?Qz1%^+?qXo&YA_rm) z3Qpw~)B592^sYa&?fd#{sDEdWv6CD@Au5NRK1HQD5K{mq1 zP?a}_&AjbyE>uMRn{<(=o($&%yq^Rpy{8oi26cO3n4^yu4;^Tg-FHVwr7+=#@NU~a z*b_=0N&oD!BSgt%U?kHCP-SH3?R&_}4N{UXGM_u{Fwe;_U_Ll}!#*WrJtgmS+M(HR ztI=wW4c_FJuum+@ALmk@JFzUgzy5TR`;6yz6+^$r&1jtJ>12*8D~m=A3#Q0eq#`3D zB{wAj~H@k~)DXLP6bUAmSC+g@y?2WLko?%0+ zdJn_aZKyi^-@xc``tB~($O z#d7mb7LTD(r9zh~z(S4blfP8CE`yhyxA0!%7j$+>E>OS5rH8~jT)bwh5OBF(r{+|S zz6j~IYZ094EaV+Ww*=Ll-4hj1xpg}7j6m*x$6bl&g;xulS1(kqc#v&Lo9_H;S6#Hk!roWgw z!gkzPOPl(yMasQ73CAlf4g<$vuFd%-4xc+IK7kZ=?ekx<-QFV<$BBOFG1!ht>3XgD zF#Nps7dMUJWyZjVd=VJorDU-1oXq88mfe6nk-K%84LSrxL`oKVty=}){%F7)=(#@8 zJap1>(XY?-h(4>joZURV&dC{YMmU{s(l2v)VQ;8QQ_fC{oGy;}&cV!QNgXhY!O7^q zh=-_=)6TAJKBUmwY<_eiV}&ho@-n+Wf;-yDDnfc|K`&owd6Jg~lF|H(P&881ll}c@ zGJ{t3PqJld2xFyi6&vs8ixn-T#H57Dr)O(bHGz2ZZIveYKf7e%EWvcOD!(R{{;vQI z2J5tzf}dOAI*_Mo^3zYsBwWSA5-ADAHaazWpvT=jtSdw$Ren(D1=V6X%VwZ{)^+5r z@HwL``7rH)v6KiDhBij0(m;NsDT%n%sQtx-ikiGecZyAC{sP8(9m5-jpwP7kwFZXZ(U=08Ix{lce~SS zz%;?>_Urb3R^!S1di)kNG9?`+G?y|FxZ9#XpyN@I%vP7*v-2}h8VQ3vKf++dp6rq_ z6enDjehzb#72i8x-$+N6it2it8A3CM*Fbh&+=$U%l}kY-Sb^}6O8DDn(Y-^&ElRd4Qv$ZXClE&0|@%9d3@^V?_IWI93=G-!uIEZshhhp*GK)V3DK!b_6iu)zoO15wA-_Ni(YTjcz+%1}oAiMn z`W`eSKOuuIeA~E!k>%3Of%>TLaCp;ke@;!v57Ykr3@Fa7=*$Ok@v0GHMPhYC9sg%< z@E>MBPrtChHda=3BT5s={7yH1em%`U_vwcR#G(|lVoknJJKiSKt2+9pgN(xYqos`P zMOe5M(9MEfDTGSJe z$-R|k{pG0B3HGb~h}IoDLZhrGlLQ2}!EefA+yC zL<@S4%&urKgWrTE7M@T`Pl5>_v#fI4-{?Aj=Piy`O!Asn3v*4G^V$v~YES@9`IJ*B zL8a>hDZ(0kMmne^!Js(oq&%9?eEIN`izC1A@8^nYO4>u&GFRye>Slb1$pFq_>?V(W z*5LFZl;}Wdkl~sgaAhzVw?yjsR4clGN2ozjk?@=b?Y6v+GAdWn30V#<2u8DJ>@`zrMSo7#RHWl zsk`^e^EG0mN!wK#x=9uG2;6tlpmfe9C2C-0kZ9cCmJ#v#K~RL7EL=;zwa1|veu-np zXBV)aw-4n_HRm;%Jym^0s(1%&{Zuw^`l>)i4c`WTPV?T)#|;9;=z5z^J=2UPVQ|^C zmX`wsEued5T2U6Sc<^5O8A|Q&;P2lKeXEp#D7>6U$h&pGetE~@h8D>p`_$j}`Oada6VY#-*ZUeAny#hesBig@K2n?nur z`jLf`lvVsk&-tBvt=e_ZtP%7cZk^5pzG1-LajG}~wjPfsJmN9{&^bonoQED-mB1N z3Ts+A^=@ufVBXDlzw;)(h2QBZK8^Uc_sBbc?QV=b6zuhp0a#pmRR(3FtzjWIjlp+@ zj+=+o!P2CvR*Qu6#or&1P0ZP)7o()?yw|t*6p|%%;~65;;PHf z!2hk@S-N5KlFqSAL2(7bIlXW$+3msQW9PqND&sx@;<(?W{v@^oTzUSVjA5Wl9~5U; zgAXzo7a*gax0Q9r@HjiIZ$fjr$AzD_DWc_BMjIKlI!9KbyJkI4#MY2q|JB%Sc@^1; z-A^Au{Nyq=NQ+$Pp)wx$lZDb&Hh^A_8jm>7yKjkdK}4*GtoZ4-bxz6+=|+gk`rJ!r zrR_`1p;B#J_j%^)R5db6JQPzMN%8qYLu;N`5bl{FH^Rk=_IgD z4MT3V2R&rfV3BcXl^~OOjOpHMnTuZCQw-7h2Qb*s!Ds?E>ulzkJ%c;DuofD9pO5G> zOx5T51a|t=+v>E`a297NrTZ2p@pOLm1X=5fzH*o$#!CVqE&@pkhF07HVwBmyzWg|i z0{G`g%9VD32CWuiGn-r1SCp-*o2K@e#(<17n(zZaZEW#V=gB*8V$?e!A$P=!&E-Vg z>2By4;Q>P0@R!9PRQDs?I8#PY@g=yG^L1AqoSLGR>c}>6x|Bcyb>{RTSZ0?=)Aue) zox90I+$9D7XKZxl5zOKsm@$kcK9_*$IAX!*sD%VDLP4ej&=vh-q5w(6zsiK=`Fz>L zW(uogCp*and}7WeHLKR6?JRz&WodGCP|6aT?}F^NwX9{IG%8xD4~tUEX6FsL-M zLpDc1ti~)UzTh2T{xGbyD|eScbs7e#(7Qt;zqe}NKi(olK6d}_U&gnm3ns?)o*#za zK35SG7j@?vR8s;InL(aP(A^h=Y;4@ev)oO6*GUODy}q%nylDresbAW~YtAkyLZ+vn zI5pu`3+MOTdTXNM>x*Nwlth)-*>pmsz0gnZqUSQnJdW~+9JF&+XVbhrNx0Ulyi@|?IiZ*S2e0AX9Wx^SBlMh*ZB|kyW6%g>}QNlj^II?lrzIC zqs>NKfZMlD>Y8W{Zvgj;K$;3T=cA1t4YSYLC;+0@8_Syg_OYq1F$$Y}CdF_y@sh;D z&uP0G(28rqQHcXJWDSt%!Jb#O_S>NR*na5@81LJ2L{9(Bce1g45&dgiu(=)R=?#c4 zRQkWQr>ytWZ17_&xVt$>=sK1TEQvc==<_q@O}v^!a$gheRboYYb!N|viR(GhXJqaP z^bU6(L%l#IK!OKdAmf);^+f>oMgBcFoGx2V+1I=Ffs9FY z;bI1sEWn~(+GhcB@i9H@-CTw0r~3Q^8I*!r4G*R;AIyF=&@tfFsXvPwvQW^?bWSLq zNh{6RX@XOn{OT<27nQ^;d(m}7@wFUm1%Y=oVMpQ=dZ>$6zQ%@Etno)M>%-ThJ~jmm zyZo8Iv?%a>XiUfk_=6z-zWdDnH`5ZC%8>99z!)@Y=3H$!FtaK`kNx{%u=MWG)>@1$;c(R}H!+w5lF_UO3B--ZXlfgID5 zot*)Az$=vY^}bt7z`@DH81(YTAvo_k)fZDfUlvVCotjL_j=ivYX2e5x4apge*WE?s zh3Ncy4lMNRXKvx;{NUdP;j3;WM3^v_w=(l(BH@H$%Fvbf7aGGCALbw*yyS?P+LE}G zLvZE*ei#Okw)RZGP!>2OB)6vbzVUNtGWBgur4B)_BAv5z>Kkr4c7 zAV<*CSHl%op4^pYNrc;3rL@|c&e&JOygIsEJVOu1LW6%4gO)N89(SL7-1hU2R9IAK zbddzh)OtLcdoFJLT zzPR5eC!DVAT#*{68lOQO$0EWc+tJZ6J0v6{T{^gGiu%|}j_w@ivUYK5Z@_<9w(m5Y zwExAHrauNiWNf3njYQ;wbs9I3Dw_GBRvB?sB;-OJc@h`gUSYc{e&sExfkPefJ4C7N zcb}|r&0k4ytSP?*KJF>W_W4r_wf>FS(SZ>cQ}y#Q{8A#7GZ{HK@S#rDu(1j*qoc!t z_8BwR__Ab{3T3x%?WU1YlpH@6@+)IRT`q>nmmZ0&-2Y2#bcYK2`Rk zcn?0!J`KIYD?2cG>ob<$CVPcP&kJ#&T`!5`4hMNyo(I$!*c5f_;lg0>mKiv_9Gj{X zjBTokfU}GeHbkc!k_tWsu9!>F-oY;2ppx^2J!o(!U!2t!KlDk=5jmauB&s$=ipXgc zktb+~4r#x7IQ@r= z44jOXM_GF1Cz<-`HA&cMVd$(zE8f8e_@S3G$Yj2F0UBO-riPyFmM55ykw%`su#A?9&bHF=(WiRLSy~DuSZIFy5#iZ6|2553i?+=Na#x z9#Ubmx%eJvi*wstlM*op6|; zMCW4;-g|TQrS=N`C>{^D-BjHT*y+!WXNj-q>n>P`BP`=eT zR5sq@Qm)W_rV ziy%2idaEf$@SlAZsc`W@rBGOBA>go_MxLDAzjwy$&oGYo)~47^!G7ZBB-*kr&x!>T zix*zNR#d@SP~Bh-GGSz4v3Zh!Foi!V~9a^{~Mw=y=y3lA<|{)IE8!OX*XHEZZeV!*(x>Dhn2p zk{-5*t3D$*?$5;QUq86g<_t5%UhhL~F0;t{?39DiY2Puccdu117Wl;QzMLX{=;L1P zm`Y9A#>@e-L2ENw$vDpzsK<;2DeM&hK2`p%P5p`|W8bGTdi-XemzLb+%k zQhG!YOwlB?xCYNRyZUy+$ob^nrYvUFEF{QS)RP@ua}9^ zJL-LwZ;0vcZQ-sAM>a8S+23EnLf@ld;SyfIO)QU-vJ@0uUWdSHC40tL(0D4^p1C<% zprdxFW)7JSkDE8;v*1`F_0nPn4zeK#f)YeI`^UhX?Ti;HPxgqoXizP~kk(gqh4FJR z!sJyhEfC>DiepCd$M7GXh2W{TWe$U;;iqZrg~{vq;bEM~KQkSRUUUBjt`zpk6X_=k z(Pld)RJMRM#uXA7j8dvWr%FeX`^d-m>4UCjd8QdMgEoOqIPMP~c`H>D3DzrzLbg2a zUd?(w{|4}WC{)k2!C=Bphz3lytln#$F0N_egYd6h^Bd(_nFXAODe3*ves-T@OBw`& zO4sVMcjp1lXq7$;w14>dx8}SwVRa0lcWd}REEln<7m7r0}Bwm0^) zi}0-)>glq=DanKb{~F6ZniUCDlI1Jw$u^J>c=OZ+Vs+FUXm(g0;qJ8Y;NNkvt?mR* zKh9JX4aw6%l&RM!8xx};mh2K)WrT+Jls9SRZWhgy%RCb-1c_77G5Ew)t<2Y2Q2PN= zhEC=%gk1-*$5o4jFy#vEoH2l)K~(EHCxI-eRiSd7p`Ij#KJBEBHINPguTR~RGlml5LhXQ zebJyC7G~>cV};^te_5mV@yVUb0xK1oVL!S|+RSs3^!^j~0G9AM9Lo{sQh+5$X6iWq zKrI(Xug=5z93--sSA6c<5H2gYLH4)3hA@@{hBHOH%0tvX8 zNP8F!G#*Qguf$@)4tSSx$e3%ee33$DK2+bL1K)uImcn*MN=17vLip5@paaC0NA)$- zhENf4>9aArUta#Rl7S=qE(3)1fdw4=FL8ht5E`EqTkLGd%zvrn0~Pw`YH^1q;X*Cp zV&nI^cD)0$AYgg-_9GGJVzzHQy!6i(XuQQZre=9?NZZ(-qn(#{#i)WR;+8IH{6oe4 zDvF6+W;ax^-80?N=i$@8Nn0RZ-e`;}+yg_jzdlLLw}H*gutFr|P3rsS{WH|DWNDWm zc*I}$-NuR^xsc86y;3Kfd&Lb0uqn=o|v4CM`PgY#tn^pPdB5zql!xnAcsL zY59XxcyPR+_$r`{d+A)?)rxT)OxpyN*M z^VB3GR)?>r?*$~n0+xalG|zb-e-@!`YRK2eGibC5tcGl$P|udt+BBn1h-5SHRb~2K z7NcLERTZDuB`vU;CfL*4YLPup4tueq0v?9blhuQ)+p6}7NC1G(;jkJxKJw#MlNrR? z@30p$3fec7Fo8%XjCJe>Pv?(Iyz!_EKoXUxF01yzAe6D;-Z0(a6BB=I^|>L|XFONZ zJxykoSN|$dXMO1E80y2aBhm{sV23t~Tn~x<93;;d(dt1VBkm1=HI<|6 z;fYGKpUFLY**>TC*lvEK;6;;eCCnqY5dMvJcRyfpwmYQMe6(;hjm>}E%$MCtP%QP{n5Od)#X#{JrDUlRUfRU#rqSM7? zewRNw(x{h}l@aUrfo&&x^cnK+Z41Y6xiV5!E{f&?Nk=gSF9+L`g_B;RNJk14`;XAy zDs>nB4MYLqM}AbK+c-@;%L@7^-5gs%baEN*Z1;5<9v~#A0Wz@iK3Lhbh*;UPX9sV% zpfz;$tUZ4-B0rB54Y6gR&%<1)&;GEU*rX6C{d%bRf8nj^(JSw$i|44opylg4+&<(3 zW19)1DrL)q6wm6K{67>Een-?1aN&_q!tOKsm45=*Mx1{C$13Un9%F7lA8jS3Dl(e>QM&aVSi+Fg*9(88pVXIql$c+nM#(!E&wcZr9$zdnlRB|F?uYgE@D zF>G@vr8`u7Pmh4$66EJ&@wMjo*!{#E%f})x;=(=D%SCw#GESVDt8p zvJ-p}K7W3qHpo*mGt(!<&8zUVVJaS?JotuLJ5GOLRU&*Ll(^Y`=4j}tsj;K96QXXQV

^?S?4<1Kya= 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 ?8K+9>K!Mu#djXJj3ld#R%>ykrt^cd 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

KIEbg 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 z zmIhao;Hog}3D_>_&E(fZ%Yksw_fWrb_|(!+z8Kq=aDn zcq^u3w1^(_Fi|BUbhaN?`F8W5o?{#uZgI6$M0rBBM(ofn^`9Z`AT%I!-ZrM6?LqHaU`B6t@-b_pTmaZa zKvWZtv}M1x{I9JDw7ykHn{2E-oyh6%&CtTZ?_^O2No3*Y*XW%nt*SNG$IjJ8J&1A@ zI)u<|i^$UOGk?F~s4M?o%_w%&?|ifRXt@1w-o4~n$yYaG*3GjZ=bv(FoT}0uiK(0W|4(-KUS!^OUX>7{+h4f6es(-1v!}I3X5$vlD=FZ{9sM*_4 zQ-?}>K!+JG$doxLFNH#alwsV`pJSFave9u+n<*LJK>m8m4%02&yzQ*wDAw8CsUdkF zO3BZ%ZSb`BUGNbFJ`#68T(RQQ41c@)9~n1Ec6wtdjT6C*pS^m@t4aFU7MdHc5%o4N z!k&<|-i|4Qjqh$&;pjC=b-C*Ew&_{BEzNV2QXwc2ZPtvu&7DtNCuM=`_z8Mjb_*QK z7@MSUO>{LLmzpbR&d#nJHUOyGCU9M#kJqHHWp7ro9JWHjV3~z@%y$aN3f5Z@7sml| zh9)Q)UN8jC37ET-qy>7Y-40pQxE7p*|LB>YIeUZd`ZFM7))MV>iiJ@A z3A~*ht+L11xiFp$^^b=jwSE;=AxdP%e297^VOJ*wrj-1VrZ1LAYVlYz)LX-IGx%W17bd~qrLt1OqL5e z^x4O1?i~F#Yz_)++tl3%s|aoW##9)4o_?u3ZymI8&CJE)ifi4XCdAfP%;BIZC1m#qBk0l6*Bq|j{oHHE~MD%Rjpn6 zqXTXun)FX5P?*lGFlWh5Q}H(Z=ZcIMXC7_^8k~8w*f2NJR58gzZ4C{7Nd&)EWb4t> z8fhqVv)T}^E?!X^@&w&LGJ9>qlkIW65x^gA59No|)IYnR@XnBV}pf>5j5k4^SE7>TXfoeYZBQWCKoyUD* zAZ5mO3`ClB)VHdp`9h)unhHAXn$K%ul8oO9IcMwc8Nu0Vv@$m69DeZi^1%E}HJ4Lf zP;tYfdxE4nx3XwBuU)=;tq1c8&I}a>Qe~N;>|XUKYJe!hB7C!&3e@9AJx!-Az|1}w z?Bf1_rAX>FAJZzYRo%Or#>SsAa?bBSF>ZjkNH?Kb1Bz5aBkfJ9V6f1}c>ZSU)TCx=cFx!Sh_ViIeF4JD;RvfX&1u}10=UQz zB9)&?YjTaoQ~u+XbFMY4tYUo`FaN5klx4?lF_v2cRX5$RLX4@|uvPKNb8K)~0-6*L zW9wZ>es4)v`iuy?p)2WqlKx0=A>l=l&xACmB#pu$xT^CjH^pVfZJZxz231Y=wbbUt zf^m#NcwhrmqC4e0y9I|v`4`#)DWOtAeq@rjk99!^vkZuVpq-d%Ti+pH9CC_~xl^P{ zt7D7W>oY*h9q%G7rhBePJ33@*Q^`Y7L()4;;E~lmG@BK9I5C&vgd*y2T?U2^j@#hK$pH?9Z|+IgFB1$t0P*-N?3s^ zN77|>jR$MtmGImI<MTP%teJm8@>|0X8E`}sU@kHAPtDw^3sj$ z>FFM9KXiy%{NEvAUzJ zTC#f?^pZKPowLUq+RF=pQGj9ET${d-WkdL!VNm&?%IiK}&ZFWqulhI9!^5sJlbYm2>tnY#Iq z*A|F29Q5SBqqL6upbuqDZjJ!iviMCq1Dsz1qL1O%oZQDgO_jOUX*J*FH`sAmd(e8n z=yrEP=?N4m9^k~H`A+SWgUCh|j^zFM_HC<7iz3(g5jwFr6t{g&LFfT{4Bie0NwV$9 z>b+J27ToB&UC?^I%L%HM6kvbPH)LCj=j>+#TxQRZ-Q|U`zP4~Pl zx(_KORUo?igmwJ4c=wMmqoYw8sdTrgymVONsd7Z`T$Qx~{ZK{VBEzhe*@c5tN;Or@ z)E##x23`#Eq-o0f$v2iuGpD9g1Z281E&2r9Q3Px7_{06KF;Y_Y!D12YK<47M<=fHd z?y0@{uIL4o96mOwSPP;RwQDM8BYbl1va9N`Ntr?Di?X!SV9zM8xw|^r#igmC(Oyr{ z2*A)9CnrBm=)IhL4kEbD$G|5fm*9=(0)Iwx-y+MKE`cklpL&rRlnJHKACa-rZHeU6c_r1dxEV- zJ)8nhZn{lKD?6Z1$uDe=sTji|(O~MQu3Sazf`p6k5Rzj^-94X(2tQH; zd}Yr~6U~(8&h$z@yp8P7Yv5WV`c1?zT7Sp0XCiW3lZX+PA0$Ma=eL%KN37iT#p@1k zAcMw6&aAo&S23qi4~0GrkJB%^J)?+U&ZQV)TZX14gTPS!cq_fA)KQr)UR+nF*?=DIaah4}B0?$=@&PqrzAtRwD+4>dtHs z<>ffSI``fwd$PKA#+CmhKYHGk$Z+#xh*aj8yYmR8arceNRkv#Cqa#dv`ZNwRzUYK{ zSX7%B2s^ORga6IlsCR~%z$=;T{fj$Y>E#qqe;vWHWjd@noNuO9wx(g}bzvxAb)*!- ze3DbGWXvx&4Oz|Ve%8MJ>qhvYypR=ajkxMAK}s&0@5z@xx$-C6YHX1kE;s7b7niR^sZLz zrxa5~f&L}m?jhgaT7t;J@*VU99cfQzyb?siKFUg+>nLl%+cMVFWFNX>{oC>PK+ku= zVf++QGa<%yT4cN?=}yM^%JhWXrXER{n~@%TzsXqhJWDjZ^TT_3V_j3c=XkM{;RQLv zerwWwZI6X-yn~6SrJ1E#+z>7xyJUT4YH(HNGeK_%%=QR3AT^lOaR}TnSyc9Y_k54; zwn@JhITFCu$s<5?FyZC-B-1=49g@8Bb9^YKHuq#cPOV33JgYhh(w!;99Hzv$3QK1E zCqR|A3p=o1Z{Cb3lYl%NWqQ}rE#mcC-F@ZdTRqAU-fs_2vi zxX9}I)}wGHt6Fy&oS(U4G&(9Mo*el$Bjzt;Slqpvs7zNi75C$|&q{RSCiRx|?e|B= zF!O*A^9=(z*{CkGu*iW=Inh4~d^`ajt{&1p|rlIe5547BLh1y(HCtB$D$(xj=lt3R@#%if1o$Y z^~upkfH+CscoHAq?gk@gEh7ys7G9%HX>%CK0maCPBaS8Z-EcMG`hKaD+4W0RENr?u z8Lm${Q}@Fwd^=pfLCCjYoJ%AStaBmuY$?}3ZPG!?3(tyH99?B|QdYGri} z32Tg64K>7cJG z8vB&KQz6gwrThiq{UtDX|Exv~&EWu@a^F(dllqL_24I$A}XlT{#JKS&~RSe7D}wfUtWC^?+#P(3sSuHsF(+vvdiw( zhB^k?ouha{?T-4bG%S04R7#DQn8Y%w85!~w19awAyiLg|8B9?PWvlr6_Zq+TX=(>* zlJ0QZBLq4c93@+)-V5h=N49dXz0Llfl%adbamm2)%fTdWIu-uI#4x_gZ06 zM5aAdW&141-D~5ms^hFKI`>P){X9CT6U>ubkU$g6ST?M?m0<-nYEaVQTYJv=R}iEr zDZBEa^@Qu4jM4PjN3O4wDT_^R`tb!aV(t7M-wf^yO4_%lEQWerx3$d(W;VG@VoRg; zh8=lzZiS1xjcGNlB-$KUey=hu27Y* zprGieI>TxlZwqIrE*g82nLsYu-fyVXoVAHDWwhX921o_a-LS%Jw8RH zBBWw~FLwTk@w-4zsr6(Xl7F6wfnFIAG8W8@CSU3wH{_&nAsmtThHLokgug%wtGaWe zb(@x$z7AUP9-Z$`s+2&C(q^;pgNk?x$?9gw>pukLrap!v<)*dgSJh=x>w{n}^wx{~ zP%xCvI4VXx#H4CYsRv4M_dTEX8YX`E z@D8bRbU#XF2E@W6B->M7zIR^ux}O$i9(vHe9bLbKp8tsU6)VGBAGYJB`*}=&QsVOO)57j+;+B6PL4^VC!k z9qw|=&sG;n4f#I;52-Eq8c%;>w+NO7hI|BQ!R3JZbf&-oP$saD@CC<1{Gz3nDL+aee4l9PleS@_t6du9Aj2P$gffGCMO~rd z3w@#Ze+R|Y_Cn$+s%t)_i)qz?N7V!ETIs8~AXo`OW^lD|!7`#3?LdRMvd!@zGCkK1 z%qKNCNL!tIcDy&OIyiz%f!tklLmXpX>Ffe~y!fMmdMzNNj#f&e0v0M6oQ>FGk$s}a zA-%3psDiU{aX)3l9X1xVXX5B2XoxD5VoE_KWE-w4ZgM)4jqNC8t1tOwi-Oao8^TYC z^giATMlQh~4{=MVSM8bWu?bRyPMmV5c!Ukt&F)r7LF~JNBl|G$u;ZYZ)NB*_%D##W zd)eGPZ>#>Gp7mt6vYFlVz}8?q+*9MyJymUlyuj0jYiS~NhrI|BO=i+Rv@6s@tK$O` zIyE|8jz8&C3#i|&So$5%pgpY(@607%7&6^>4)@C@Nq_-A$I7_(v^Z-c@S--lARe5@UTo zF`{D(!inh*8Ydz)PTRe51enzM1MiV^wL_Z0l1V`0jF7PGmj)7gO2&{M`*u9U2OsG5 zE$^UkcqyC9Wagrj>l~Y>_br0oBu2GBgV;^w-L z0$%*(+?^m6!4}i**_|Q@bKv9Rzg~46Lyhym(~#KA0v$d%-pSO_(?lE!YXjgf$i> zyz9vxu}ju_y(R~XemlkP;5p4yxg6|x)wFf$c-Mh+hxXJaVM!M6e_&{B!D5oxR@%CK z>RYLN7yO|c+%`0We(VjqHzSAy=bj<%DxWH$Ivcqo@>`Q#s?R$y2_h{JMZ&qS6PR9G z30;1#qi07=E$fFBNNC%I+l0)W>*uK+c)oSF?OA(iXoaIzN@d3O{=bJSXAA*=*hD=)pv$+ zWn|4*TjI{4838tT+ZY|&@BTdlzew=vK<*h0RT;$_&G7tn47lp%7?lbjxsP@lMfVR8 z=QlF?7z@V=>&+jw?Fq}+q3c;6m-!B<%Y2sZ%d#o9wn1(cpZLZ|y2lYS-Wy?N9h8^5 zOO|*iumh+I2Fctx-P@Q9iz6S!D;yy<(X!KqPRD^6$!yWN`+Q_bisqec^CrIR0$3PK z&5tEVWXShlO`?rj@LKZ7i&SY5IU6*Pxtp`&f}>omy~uHUpO82mlxt&-9n@)<^Z~_- zyJG}uz$}Zggc7b&zv*dW2cf9qUTslx=(9#MbZj2Hj!ZERhDkyUD-Pqw?(Wn2uovDYG! zLu@SXs_U@LCH&RtasK)kO*LfM%(QWPj@m3hx~d)Y`m+$9{EMuZCwvdGHrK;Z4NAg$ zHTD*J9m5LoD-ksusd~7`QgpS7nP?=uu4ELUO+LhHD z(x1KC-LK6A6{u|2i=SU!)u+nV!Iq8kQj*?(i2Aj-Z~|>Zv%5^M3Pf;7K-;q4f=#2M zj;O2Nb49o7Tl~_dX+?#2cdN(uavHD6+!&8{lN*g>?TtSEkBppL1K;c zlqI&uv!5Ohc6DROD6y_SN7j+I-09?Om}ak5cl_JvUtPwmwtTg3_FxAe!dIXo z|9c@h0|)KJYdaoenZKa8AeBvIqwYXx%M-sUz$)tZBzsElrVw)x_wy(B8}3vj_XjP| zDf-;3>wT+Q$pj#|l{n42O$$Vt%9Uf!I#-PAtQFci#~>t}zc7t>D00^=Pa&be!Ja(d z2FWlNTcz~>a{#bMVhj$}@qV1rKU0{wY5f++_IF6Bt}NKCc(*{!K)8IWg~3xYje0O$ zg2{K!DhM-vr3YA7x(HS?V;AcKSR3xpVK6J1(u@wt@}a$$5hwBG6p#XDc?_pxMe0<_ z`+rrfNHt9;@TbSiDx@`>J$8(mHFG+wRj}z+yozsQ75uQr1ElG+Gfo;bXZ%9$k{xuP zDs&3lzA@3M<2vxKDLmHsdw& z9Vq+h5ERg0dz(N*snhUxgcDYV7qlAZSqXEru6v}z(JlQl_UAt3H zujz}p#k*E_q4y27*o_h?y7Y<k%_coM-_%l z|2?j@!#BIN z#d!l8>J{V~m)|MM%^mcSrc~X^RcE!;_I=CMygwO4SpQn`fJ@B)^HitbXh_xZKUI#R z(HEK3s6;`0=jw8x5ZGe@{UdZk!4gfg_U;!FUCZnnJ*~N+*2@~`Rp7*A!EKPG+EZl# z60ITObZ%fbLlFB|70Pz$ZPnCyl{%LYfuSEiIGoL`_a;-L#2$b`)iL`H=|@4ZX1G|2 zEE`{)U;AD;dyex=GY-h1n=U;n_4DU25UfC2{~PBk%`<()Y)$2{My`7roA`bzUcE-1 zheofXPb7Z=rwo@-bLmq}hBixG4v`@{BILew_NkJg+5(k=9EOXk0fp6rWu!RG`d5~M z?$z|nu*KY2w!I9AXKBkct8}V0i-<)J@|f(_AEe|Ku}ElIF%1-_Ayr`$XyZO|oRFn9 zZ3FzTDEK*@DE{V6xNk0R+Ggv(dxOeB>Cm3tCYDvnt&pU#bR?BK>$@U9gn%4dj&gP< z&hFT<=;(j82f;rzk#T1_LP z>Q*YI@!rNpiL=LW5@j5L3%fWNG=~zX9R;_N?oo2sjRwFMCaV){dVFT``!9l=nG8;b6_SG4%)5-xgW$UuOl)l&Ro$h#%p2GPVAPD zbes8-`8t9r?PoaXBQ3TD@#kxW(;vU;IO#gE25iUt4%1$yg5jPXw#sTh+E{nv&>YF4 z>#C4ICcxb!`_qYtGM^k1aqY7HE9VdJ$5U|c%`n|#Xb^5(_}Qwy4Fmqy=e{@9Yw08C z4Ho%)PP)d{hzmBxDA5?Y>#rR4u$9e)a#mM@4SkS^%jDPGSb+jbjr_Y)Vj=5UQA$lUyxFrge3&rU>Z$Vi@?WHY(#|7vd^LNXRffcG9UVYwfhm>c$ zu13NItI7AFXV6av(~Mp4-Wbx+K4<9%mVuJ1RY`H5!x;%@*`(MfO#RV#vef6{aG&D2 zMjmdqaP7DW@Gc2U=g}D7iy9hU3>c=B+BqEVxlyToX#hrOTERRtSQ41*b}F~vdpP}-c*hD>V#BV0N&p>5D6 z4Cdk6cl^(JA-NUf%f2kO3KtQYhIgI6tINGjJ;UBAbmqmiCf%OO*tHhqscB(M&0_es z=Z+!!gMRANGzKi!z%S5Ci}$%jY}C(PJ)J3&lqrc}KdoKY9@kWqr&5Q$%aZbWEfhqU zSl}y4{4p3p-Dx#@d#xlC#E!qzhf&~WXXql`KI$_Sg44X3l=ku`)dOOrPUH5gE}-p| zm+%bIQEsy{(@>v#M^&gqjM>dxqP)dr_{2t)TlSi;S{65D6EGZi4-|AQtX-(H1(^nQ zesjq(Z?1ApxA4Wl?sj-}xo;5LnGO!Gp<4D<&p>Q)Y?yO>{U*6Q!-@OTS>Yn72TWX=c;-W}> znIlKvB6VX7+ky1{leDEtHXhzm#tKwh`5V5^tLfdC&mzZ2;mU6^UHJU0}AfUe)??TfhBU zM&;!c4bLGHy|$;}Obum^Q2f2x33d1nyJw!`z89y>NGa2%tF^Yb|45otn;VkAJTnB7 z2=w5%<%yOf!k$udO`|u9Cis@p>9za0cl?{Jbz5)nu&0sUG&xBvc-X&UieKn6(dR&H zO>#>g4g$057)3c#*6B9untEMn;DG4IO&%FF=@6J*6}49GpIvLL+ltqoE%`<-S~>H4mFp&xG_XKP_BGA_^WeS}0K*r_UIyh!S7HUcrru4P;Clvyq(PB6n)G)q#>tr!P z5YXm$&U#g5gHYh5To9eXk2~Q%8TND2)&Q?GXUL+xSwl; zs3Ty9+{HnT@$T9+oAy>~@{|sPe(LINiWiTqdNq@G2N&K0`r-R2u)NjE?|8%jby**f z9wxp%g3l3NwSdvIT5mib96~fZW5F?ab1Lr3UTAOTD~*z!_jYV?o7F+G`Xr{jPO%F| zDgI|0W#%HChC?`C?Phs2IsX$?UMKTk?Uo_tN==Q5;eK_+9MZ5n{01nx-qp}j-WADC z|H{XXemY#mf{Anbjo-3}twu-7%3xt^6;7aELlavz2)`N#|lF9tFo9PrZkRofN z(Lsi%xV8_fZn`b3t9Mg^hJVRU+@oaN8NbLs%N){Nmy<_m?r4yNLS;1G&Du|q5PVaG_Pht;r zH65F%^PvB8PSx{~rdP>V@QKRTV2yKCmtR=%0S)^$Rw5CByUj|+LsE)A!18yj`861d z#?rPlZWRwML*WW*0xr>g>MFBVAW@toSiL>InyBuaUq0gyqY2vFFjp1O& zpZbn)e|z?8js7cD>tB<4b=G;xT(d7!Db^LhS8c{TNK5K!gt)s&i{LN2=q@4Fi)M$~ z&e}jb9d>u(7EbhPSR9Dm^7(-f>->X$))kX_446Oob| z#vVW15D*Bw%Si*jiOV8hX<@m(xAM4(9j7uu>QMwz68~wY%Dz?IL)94^%4P^1$$6e} z5A>)mE*^_~Vi4WW|73Uvpy!J$MHoK336`Ox%CT1=vJXdW6m*5qpot-G>S&&JRS(tvNabZ6vREqC@F$Q(}EU;Z_oK;bity?8f}F=k8N3~(}8E{)cfPxhr_ucO=k))Xn6l`?Nt z>%lXnX7;PGHJCxcDm@YS+TN-$uDg9BGYEHK%!5KctM`Lba-VYgbzPrtco+G6l_ix0 z92&E$lQ%U9-Q%7;McVw^L=mb$9;Aof+KooA=cisL?v+99S`$T$p?24ok`vCpf{bB+@UXbz8-6^1ONJKtGBKc42B0$(&S zDYER1ZmZ0VQaMI!iq@C>WK#@PG{;aqv4DK$sPS%GWu**TP*uW0Tt9b|GbOU6#`=(1 zW)Sb~)`iQ^52FEZ4!0QOsM=XT=JRUNi%r9aIE6lgwP2^2N!i5`!w}!VLzr$OdX+#l zA);B50fWdw=TsN6(Id!HsvC4cHuzg}E52Tr48p0{&#IFJr=H-WrFs&RR2b0eEJgD8 zM)t+tGOD2|H(!c)TX6}7k2)MQYyDf21FwSy;SPN$*e%iR4UD-FwS14Rxmdox5T#fA zy8)59#CL$LYS`W3c59*zA!0bXTpwm9Rb*im(SME;2u&+kainH>e7q8;Kj3UgK?!C6@~%*B8+C zrj2OC%3A*fbC^cWHDUIl&6 zTJI0u@WKZ{kh#VBCwjz=5|s|C3d+4&c%_y{wRZa}=P?`7D3f5-htZ7=e#e&&EF?_* zHnf#4@5!-g#b2(0RgOidJ0BHel*=yp*t+96{1fOT`D2yT{gei&8Up&?inY0|%pJ1_ znmfDdwULt;1kvysf#gB3uGTSdOP5&D5lr@QvSzt z)uL1Q#Y;bx(I~DZ#8#QOiAKkGIEu2ds!fj+eVT)f8TXf)tqybwZZH1(2vQBD*DOmM z(xvIuk(*BAvEg+ON%at9af^FF0;C4`Z*w zD1TV9dNTUhNc?rl-E0WdeHYBVbi=r%nBW@J)3_EiImyu;3i2>gz3tU%3m1GGAsE=s zgLtt1A)CQErUm(nW7sS10GwQ)g54f@@-^yGY+<2_XKQiCWt{{uRU!U|->WjDHv?a8Otx#OK3m96j zEf-;;>Og!>)i$>J$wB$V^R;TaU!bvnZ5yZ9_c1=pVRW#=)GSi~yNy;BWpGVU_uBW3 zqa)V3%FwfxmwFHByUZgPDB>1#RDj%U0;wKsL|#F3i}pYswk!^1)}MbmO=)Ydaa3## z;XQYg!xJI@c=C;@p@`vJK>S1-g<_rcHcd_*j)y1l0X!GtHS~LVU80}z_|ks;y&W*` z++BzR=Rg&CL367m`&6^@PxBRU#!fic%DZFI(B=GZKGwWm^;5YG1u1`{t62Vs5v@*D z>XtnEjQ#N1zcUk3^8)}kl*{FBY;eh0hNNqt5X&>IqhRXolEbtlYp`Ls^gQ>0 z$oS=25@u%f{;*+Q-fBlVN)v0OYUu!SQ2yKX6LzhMeC{H2!cxLLXqr2pNE$ORsVeW= z+sDSZX4q}!GU#cuict7SEFBTy#`~Ri*e8F#ddq+nJ@RVRaP+xxB-({;oO&8u4P=-6 z{k2`eN~;hZ8nV4S8mU(wI9Hiwg1T*aq+)fud1~IDS7-!4__x^xKULG?DB$IWe@&$_ z5!0Hkx)g|7{Ryl5eSj$-ND6%Y%p75jaCY-497?S7^?qU~Of$n^p0x4_nG<1GzB3?o z$tAu{uk_O`7ZoiNoysOvnPi?*cl*{`cep>lo3AX ziS#I9txk>^RLSNJ`gF7oR&*_@U)kvmtMcAcvT)CNPU~hjsJ-$65ozks>^vHhEiV#i=qOsOg08Iyg{>T(W{spPux8kLZg{`ck)#IkHZwU0LLg%<86j}dJz7F@Auvz^~ z1YOUWAX7lEXSMGx+PY#S$j%Z!Ij=f%R9ddK^_eTNVqrsHhNjm#bz}nOc3o6+LoZk; z17FQO%~r3YMVKaSxz>95o{WGPD(QS&ZF3Xw_O-xWW^6UCOc;{=Zn(WVnu3%CC|>ou zqE&)i>_-w=doMZ7y^vP$oM&tpRGe@;*2YU_O*CvX-y`tUuGG;i1(*O(?#sBAR(Sm7 z$d6-ihWX8_H)(0-oKdy7vRUhy15z#KSlhf`=2;kp$-<4wt6>rrkUAm0lk*)?rd(L) z*9ovmNQKUfW_RCx7=jhsbusz$HWHo)<)mT`LX8CVD)o{&@L&n?WYZ*Qhx#|ruqg7| z@I3rZwSo({PD2(DH|mQV$dubDy<;{cB$&RBHkXwoqxix(_TXpn#50rkaMJ!P!$Vs} zzL_=W$Cb4#!bG&HJdSYl*fEAe$XQD`$0bf9#;r?4}O)J zr8nwi(tdq&3Tm8t_3mb&)+ipR**JMBIT7Q(&}9QTB%TnUPk2Solu(--gLR3aBj3{k z?iR1o_O00LRxPIsRqGT5Y(@`bed!m9S4}=~C6I*D-im&=w{Z-)L33hj_2}>*aC??` zzp(GEeIkCuJG$HbysZ&e51B9p%5uvR)^BGo1nQ3OUqUiCrflMfsjHyzTGL{3n@*oQ z>cco-Ni)@OKxUHK8P!U&LsAMx65g1Zd z^7bd9b_F3i#$!o%7 z9R?MIG;_UQCLNaV1AiRhG`>^~mNj-jnm0Vn7ZW^!>`!5+)ZnA&?mQUu>U+3#VIeC? zK8WJr9~Nk;Ro@pvA-s9-z@pUnsz!KyFZ8bEPOyD3NQYzu#CrddEpKD$&dsQD)nDJC zQ{>~S(!F`C16UtJ+oIyhwTzuo_9h8I*Tr=doE?0Z<|h+C0kokOFhZw#hn zYn=Y;r9GB0$Ek<{nd}|ocH<_9-6D|=RrrbMZ&hGuAz{|EGh%65-HU0d*2rT`hE^$r zYdU5>Zk|>T!0Lm>JIGv990O zpkAUMDk**J@F>?G>k;QFS|O2hn6r`kMDXcoaEXs#TkIb*xgQTA$?VMlJ3z$0uFU<< zW^oZT0{EJ}L(vw?vpDeS!@DrXD0(Y+B(@$HIE@-bT#7;%P2R?S;6G8wqvv&otoz4) zvlQ5KUG@kJ!|9*GKISWQcF{_AhFuwSv#7StbH}Ln;356kFRlm3W=Xv5{p^!CJNnp7 z{6BexUkW)>Qo0}|tS$tD3=*NXTm{ zn%l7R!WIJC6}wbvC@-;;oQHY?XB@de9bV>P=mq*i3G*hs)!@y*W?VDW4fr1a)sGSrBS>~GwjA3WjD6`zWzD=Fx{eD5z!4}$*Hs;`&& zrHs=WB_;O4#Y|!GjM?D>EEa?gfQtV98J)>*;_MC;gQVV2kMkq->iS)==#R5~{tFqb z*v%sAUOcrx>+$`2XBO}{5l%0W>B3F7X2=0#`SwXu22N}kca%QP(Cj*{44E-1W)hd$ znFkK_?C0gg4TKJ^i;TWHnUS_DR(J+%5x#^zPwbXK)gLC8%J)?7`N}<3Q3tc%;=F`% z`;OXzydTkI@erZomOWAhMc~JDjHXFw=83(hsHZ9~1^L3u<)$B2(UzWVj8-YI`a2)@%T>D0r%hKpqh42gF#}i! z-&8;!I+!X=2`tLJ&0TIjmx9>eqDp$~+=UyzL$zi)ENJuH)<5C#lSj3zgCy!*w?)|r zjtVKy>3+nWxgx?QiDvyPyW<)8ZB^k9c0~%OK8&{x#J&MP0jB=$M)ozP? zHZaA67$cTd)3z0ix#h1x-j98@S2m@1=-t4_NMPhg+>hO8doe9QP`=p!AS!xzPr?IX zUNfjtvrPnspJygoi-%6s5G?YFqjh{#+*H+zl6I>{j>cs{6ZJ|URwkSDySltlvwtMo2j ztndKKO}j?xJ{{@r#xl!|ULB7@%OW?+E~A2Wbyhn3OfF36<(&Rex1zI&g9U4o{}(R^ z3g6IADEk=!-piHrW)K57qshc@Y*bIR)$tfbnEjOP>T^bRDmN}7QgbU??RLqUJ7f8n zI-`-g@TWlBOaRnH+mH;eS6Jagb&Sk3VP|=;zD2V&qsRpH-nOK3?z!V^wl!_vrdFcD zlI&HwBc}p2Ehut&9G^S;{V}u?XaRzL>}&qC2#DS!8z=`yUqli<4iRnlOA73z^HbA~ zB#z8&%)-R+)oNjmBkI0v{d86>hSj%g#F2sGp1dq{97@~kgaB}YGJChxw4M~CoB)H) z9R(XD^{2bx@yICMMuO}T(rijG*Wa#+p2&uc`S zHxnS)cEnW|JF6RE_BDc`x+SOvan!1stY!&!1x;_45NPcJ7w2AWm-H0uaT@e^2;3qn zFE+O@{Za6WR+uN}bg+GXIg&8#dJeX*7K)18&>jT^4&?sEi@}hD{cU};wvb3=JboSu zb|Z5OU@j&u5x}V?yEtH8cgl)Pj1?@Oq(>BqrlHIhKesa8Amg_8^wFkk+jVWIT9`*r zCq}UyGZ<)kH0d%cu)}mBs;BF>l-ZpcFqunX6{Sg|(U5B3dtKOv>R(>7LJz;^*0h`| zVWUMpK|@$-S)eGM=0-^eF-lS@6l+V=tB%m%9FdmLtQEB-YtuPv<9H+Z8|HegSEIep zU*r`xMsJm>E5B&+NjaaW_@c+58q4Vff~ywS)~!@a;?M{$Ov#GR@p+ua7*YzAvK9(T^LAz zNG;HS25m&B8_?XJc~X*CjjO25-S$7fJgg-uq)bN|w>Bh$cVdC~#lpI7!)`{(gy=60 ziKuZpR9Ujhgw!3H;27otW13dqgZ;I;c+@MnCO4znDq@aI497X9TFq$$P@EhRN)8IW zMJd=meNYQKs|@h)qK3J-?liGFe~NDh_iI{}fI3kQms>!wI5WDOClPt3K=y-={_Zl% ziVBJo;gHu~^UHMrjM&6PiJqDfm-A;UQ|uYq9A?sS_R~lM`aRaQ4d`b8vB$+&V2pb3 zO)`sPTJHXqLHrKP=>u$eIeN=+I2ay}nj&M`oHNss&guFS8ZF+lt=S=Gm~DRbglr<) zo%u|+l{l|Gd>TuoPs;(U>ECl*GgGU+`3n_2bIlO6fVOJ))%yOK-j?s(EUQ>{u#fQu z3?laT8vqCN;?MwKnhe6>M6LtX_s#7NQ!+AG?9~EjpjR#AS^d>Keix5!P4>s$@~mm1 z>TqA(wYzR0x>zQixS;qA{^Yc?@KE@@xd+=85$`DCMIT|2sq<-jrqGiQqD`o#ka++c$4qZC%(%rBP-|+o(;l9W6mgOknY<0VlDfQ#+9ap8kMlJzX zx=Vs3hl;7U)%mZBF6~X@zHV9Jl6=}4ByukS4X(U)0gYSs26Ed+9{D1LjE}H#_o)+2bRExR;o^dgG;8-`?2l9{Y)KJ+|P6m$@^ zdV?p|-Oz)0F$e$&C6|LFAGAxtskLD{Unl2sTxFkXDiAZ$(_)J1TItl2ZBIGLG{&iA zH5Kq^19DJy0r)s9VI=_OI_gKT&dnmJ0!CGDRvs0=I_tATpl_1)g=wUk3;(F8f&R96 zyK_%L|Mem(=gM8);=iCrV7n04DXAYO>CRa8ud~5FRcm6B|Dgsit1MfthkuhH8p6_p z;GeDwG&ht)eS#2qAEl>+rYW|Ufgn+NsVNCr2)a*%W-K8A6ldrg2`>!=#zEWFa4Q>g8J!GXOM3ig8#HLY`T~>!YZYVlrrU;YFKOf5b{-ee z{5c@D5auwU^Nd^Yzy0~Z!uo&fj9wR42-)xx74`@1m6v3ii(TTuZ$!x?R^cH{rv>l{y$XI-x-g~bYidSGF7Hn%j&S1TwxoY-xkr? zkHI-MS8{K!kag}pYq#dkTCl9%q|tl+@15v7z(pt}2u}`4e}B_t^UwV7w`e=vP4fTf zZUQzBTg=ieI{GJqP?#N)cH5dJ^);$thrP#bIFW*;TTc(Fiv~CQ?_n50~C2Qp33arDfFg5eQx8)s+0F7w;G^;s!mB&}VstQ#4&1>~}wqHyG4{ z)u>=-eYD!cLM$!vG4aGbzU{sJ&fmh7i{LlN(|6ei^zLQJZCXRu`vz*IvioiHl^UMy zb5F2=Uvae*d_}$51hlSeyjJi3AwRY9OI+hjOi}tR=qZ$R0D5~C_ps<@W27p1SEKzT zK2OEMa>eM_$Y|?#<%Y#onD>Kot~lb?dv;`-)V8RUf8i^r3`HNErL;xkL|s-z#>7R~ zQH=>WLclLT>AZ{dGT|Acqo5V*Xcs~m#~}rTP|Jo3?|toW@3k_{W>XKIIBfu*uHFe@ zKc^%)#z;b6hMgfDqo78l0GTR^6q@mczx%GEBpLe?*)G3Yt+Eux9Qy<_3WGbNZRupR zyssuw5O~||Zg{_TWg^7K=0ir^c@VYcnQI|UpIq(=;*d%WU1)fY<;68cYKCo{u^gy7 zjg{`X0KKaHvBn$A)?ONAHbDyhAoA=HdzAzU9n1604(sMKsKr_`B%dY5N}TR|mU{{| zQ;iu}K#y9&o^Zr7N z-OMaUK6^Pqm|jPHWKv=s#(BXNubgohmYL(6leiZxg>n$frqM-sPPFp+r9)E zZAZb+6MSEw`}K^ZLr-KPLzWgeX#54!N?o)LigiT6c$aY18RtC-@{}3l*tk~q#HBvv z0!&{80UrpZb?B(-$IMihiz3iC)axw1w3f9gDPI zSQW04iAS%}E;`{D(N+wOf4&2CHi|F8e}n`ju?7-sS_xOfw#Grx*~=a_W!oJF zL_AKNZd8-*@p}H2?}<00JCfCoqbPJ$MUz*uGpmwuKdBMwd<&ML>eI$u5y3cq*A%m~ zcOTu_DdaBD>w9fgd(<5;a$0(BT13-&fGN7*I(uPD%nMJI6hKuLO#@($LXlS$OU0@b zD_fyHUrA4m%?AR!lG3qY?st2e7MXPx0NRXHlTFZd0>4YRVJ& z)8Z7@^~cX=y!Ijd)YT6i21&qT`RrFElC;ORaR_kGE4C^cKK4T>=GZfw{Hpusq(8Nj z_5`na+0z@}D*Yd@a$Fr=iD^F`?5=BzgXGBwnQL-f#qyEeNM%ZfLc9#E8F#|MMWvIy z*$PDlNkmS@*2AEH!4);|kP{m#+P~#%HMR;+d)wPkxK?MP$K-0|VUK6Mldy^A^_%8W zkhQN_QN69XF#K!Zd6<$b3DRCTCL{Ik_s^b%_KHt0Ty2(D0nQ0{ongu%N4`qvJ9mm+!H#3u9he|z~p=a#qsei~e6fHYy&L=_=t>^YEYIpdtVbFU-a z4_*f&)a1l_P*rOM8?$txJY&yID_$@orzAWoU^YWEIRL`4_0%4Mr)__aU}Rn{pe^0# zg-!@;t}F={q#VKq{-#x2tMxsiDWdR0;DZEN4uN)wNkVe`(RW7gzu!P(z5{NertzcR@zM4b z+>A#~k^=JN!PEf{k#u^;AM+aVzl_DR;@2<4L~K0$xUj7%$3f%|hWDWTO8;k~@hVz8 zM5Hl;n$=0QVA?4)eiE%4=g4e6T#I@v~Q`>WH=SK6Q2LU@Fj`W=D4 z3Lc}X_*zvvT)|;VVpy7HsG#w=8507aB-rL|Oq(uB4nY3k|ES-5JyLO{sny#Yf=@El z1(VJ9IU1{=qCr15d{>`92pRcQ|72Qr-1Og`JQ|b3X04*T3VBd;97E%UbU_I}a=7>o zd%8$lx4LI(Y?JE5TK22aW?{(eNSY&jrSbWMDD^#BX|9@|<`$NdjqAJ4j`G==Wib7>A36)~3@y}1x9_7E`Q(9w{ z*a;QJAZhu+PhvH3sukKQmw(DKrSGbMzSh4u<3{?VjE?C|DIme(sfp~c=-r}J6U)L8 zKeFWt{p`v&=%-{_H$-*|Q*Cw^T5q0fa&26Wk>@ZjC4#{~%$!1GcBx>`%#IClW$2Pe zz`N*2$o4ioE=keJ$S5wNX8ajrG9aM#>mYRr@(WTTdQ8`57keDi(Ma5Z2mK5E;;KZU zSz8ZBtj0t2%@GqdBeK#TJS9}#6GD|wYYf@;F4L{mrggA*`SI%vd-T-m7bwZ!61{AN z^yqf48!KOeph1wu_3}PcJoJZl6Jx|`o6*xw=E=-KS}W^DpDd~i)}3L~lI1~KoV08N zsu6@Tb?U6uD%UgDG3F0AfZf6;Fy2;mt3FayV-|8nDsx--E^8;Zr74=l%C?qqUv(rc zC>*?D=KtEDJp1c&hzm3w6>aZRq;WV5{mg4oz0yK@zb2)65ceEeEaXMpbyZ~-DQk;- z;XmaQ^I#N}+`e!>j-7h^Q|9}%-2C(9cMr-0JT=WQN;%y+IsH7-0@Ax~db~RS-W37d zgsCpOfp06xK%=>=<-3AOuHkcmapeI~-z0IPg?#@v;~`k4DK+CrPiUZ=hdzMEzi!~~ z-ChHM9w}A=YedSKA70kacy-bw)7t-;x}eU^n#-^k0ifZp>T=iHsOHSv!Q0SAk{U~Y z*D86Y8LvIUT|7=21T%*11Tj_Eb}Yg)Ec4!tLsg+nn2 zp~DL=$nw*b@`_QCtK$u0Xoyk@8)eLSFJSQMO3;WYPrXn#C1zSLzmr+KlaSN_fwFUL z4fqhc-*L?bD)NXEW1&-6j%Kml^=J6BN+AWXn*~DWK(#fmNsX>X+Zb;4a*VF8@qf~3<|hWP2$78yOdJiKYRr;|Tzk*2$i<}CM>I#idoH($^9 zyW=eoAJTH0s51=;8ar%rE?PL%1G7jRKe5r5g)*|Z-6?qH*sIAbRmz^d3P0tEPtasv zty!OqR_mhPqgmsp{yn8@FP;T$iIip0FFx~cxk?^ceF&AjUDmBCsNRo1tb{J$FV`7Y|P#u(nHZgdJ&ev+m03)Dxy z=nrCRroXI3-vG)*)p88ZVRS8Vo?j6qwGbn(yXk)a#f?jgEtlh<%6-!Pma^lv`1XLv zPO`Zr@0xzLPa~ps?>cGtx_@39QJ*8~v|)|2D|~lNCO#_*8#$M-{=j ztrk>hcmIV1$IsM9YP)e=qFI+Dg7^5l(IOx20ghT#`YS5vF;-Uy(9fYpUAcDdiT3-C5j*bx<~UA{)>*(7hFOxH=?$K5bwC^};>5YpwT zi?`JD3A6gNm|UNb%dE-CQQ;8Bn6{NwXJY>J^eX=qZy0)W<8Z-*jp?V2YkkpGe8Y$R zQM_kNPi+1Yv`$Y-IeqMvvFHgfpR2!YMj89PRdG%ZMDm@nb9C5r@YJ%8oaICHSe&(u_BAbXk{4sK6VBh>^WO@qIK=v^S z3gT5a$LDPq-$ZWooZV=?`Ji%$*41$`JZ@xPrQJUrx($~Dg6RfLNmk>PpmdCv_qJQ| z9IUV@!p%1tk|6;cpAyF}T8k7s^!kSN%;&V%h`pcs!28wD?ruui$WuT;u9Azwl}Q^> zO)f&{MzMB`Zu;ChU6(tl;^^S&^9o@b`ps7gmw6WMeaaYy%n$~+MH|l~)^`8LqXq?b z=;-fR3@^OJ?Nk-SwxhQWwSHciL=CWGqw*u<4P9DZt$lpeoe-(g>_8y8ySiJ z`-2g3Yyy2;_^*Y2)Vz}J^mIGOknqR{d(inXv5rkrut^_E3AtR4EoeOsQnz6!9kB^p z3S<0O6RQZ=EuHB2|597g!khMN)tj!ukGgMqZnTdVkCVfu3h?;wSHgs{RDz~l8rpj7WfkgeS?#B@P%aT{EX$uU8fE^@3!@J?1mOD)e zhJ-cHk}>&j&aerxJk7S9V=$ZVRJvm%GP6aDC)!tD9-$pLs5{=K$Hn~la~mBh8p1k= zjmeVJr>heWbbF0(&I371&YNDNSF6}wsr#6O6Cu7n{$=nl-0#y0bDA;BqC<2xkM|2) zR&8qkc>7+f!A;s}oDFlgcwrO89FbPA{LPk7p{wIg-iHb9KS<|p*Vm#Kx=V9xBU`s zRa@6Ax)D>oKY7t?O%R^~7@2hSf9(S2>=6)8eg+ZnvVJexS<%CE2_w zkJm>96-EX2V(ld{bOxd=jfWqypbjJPYM_(SRndDGkT8hM`%#ML1tNs~9}OUR7yP?2 z^yIUwCpJ84kCw`4p5kcwUJciuAMZ#TrwM9gM$5LP^(SPitf~NDEj!SD(^Y#wx6Z7u z_aIJlsgRoD)d_lr&6^^ieSxM38i%6CPgOirMjsG`jlZ6`z|#GQ2z?dA$Es*_}b-7E%R**+E4BW`{~#hp)F5BMmKnUn3$^ za-0`Tto;MhtNH}VvNPjM(jSVg%32bI|4eU<*6+xG2S7Y9SqzPD=tgc>uJ&Q4oAf|< za>K7v4(hbjfe~k^2i-^S>?qhwCOA&xH;5amRA0-WT@+7pQqB%<45wewjLEz6TmBwy zH6gq2F0bNDpcA)|KZTzA-&3`H8Lsil@Ozj)`=_rm{rQ#FPO^vfRbndq*2onQ-g-n`N4&Dbg$n5nGX)!0jr2w}sJ{J6F|+M3$3cFVF}P=C3b zS8c4x>f=?)90c)hG9(k~A&s%eM^vFeH0%K>dcyR#h3z2?)0yulX|BnF`!B(2MWwUV z+ISPO$mH+=$FmGyw2%l;-$pX5Q({cj;9 zo52(0a4v*RdY7!Jz*8MY7hc5|*mJ^K)8X;-5+7btl+zGmoPn~h(e=1a5@If(1m?0w zNjdvBcyJ~)FOrvIf{hrc$%_H0RHoBb(Xc_*=HFvv>#46Xosc&StR^a}rpO$mt$$a%%m51Xh zT$;D)h&~)5=m!r=A3tCac$N)h5ghdxXbW~@(=9HEMtF9ASGH6}mi!MuC#7KXrZ7Sz zTAY@y_3%ZPKZQo^^Lf!+8z%)t^s2o>P>}ewIEdmWHnptso4_v!Zdd%;BS5i>E0n4$ zU#+!1Z6nCn!s#Nxo$bA`q8p%@yr2+~Q&ad18ubCof{))@n?itw$lqc5f5eK_d^P(5 z6-lAk#6<3WjBj<+1gx7U??pH2m2^q&4pzn`F9ay@D}$L zb855Qdva7NAU)pyJnQ6Y8wnVjA9&{cNK4zx_l7r#AIazCf7>ffdlCp((=?ix&j@P@ z0M4_#Q|^{sUDV|GK4;XoNHj#Ygf5P7NyTbsC;DSVX&K)Y(9K=*t9@ExTW;Q5&-^rp zEPuHvt09<{zf?5UMp=jHCH1a~J_NE7M1?7?Qh&!#dQy915q4jd9@!q(2n7`{B@vWI z0|W^Dt=}x!#^(HL7m55QlP$@2x8~lsbV-XYQeiHsWQJNA^mH)gUp9Vs#D3KO-KT1( zAjTChkjN~eS?aid`0b4xajNx2jqWh%h;3?;mr%w3k}7sjlyhIRXQaNJlg9@M8y;^4 zN(X8Kjom3_uKF`t%~y@>ZPE)(Zz&a4XCt1&NFA7}QF}fE*nnzg?s_d{o}wx<#w~iB zkL~2wtaOOoNq(%LRp8r(E0|{F9|7j4{^t%-h0?*syJ6%sG}>FHM(@MHaFe*4;CDJX z(o+{)s=9>5iyv%I67Zr>k+%26Pi2(;&}rfGtFOQh+%H_~l=!~e^Nl}A#VS2PI?Di5yURD1V6r^+f#qAI@|P+@I`I?BD7=tEkb~9_KwL zuzbQSfchf(9!WPc&6`zme|818zVlMufBC9>sycyDe)9(}GCgCvM^XO}O1npTs|8lD zDo2kz5Vwi=U87CVx5`JeJk#gN)MJ|Cy#15Kj~&D;m&&{KXxX>Qp_ZJw1?!_gek|+M zXkW@JN%PnD%JxYJ(td8i>F3Zn6Zg1cG<4P6*69Z(4Tc!mZP$;B+#E1ZGtXRn+I6x1 z_LgB`PDM>rbBrock@*FHOPZ08t<<=z-~D3(lk|VKu9z~B8Xh-c-F62SBh$&uR8?nX zdmGC8MQe=Wi&lq}Niqa^LvsOXL!A^evFxz2^siNwkg@K*Ve&C%bJ)8fl2}M`= ztR5b9zEK*(j5RcF4R98O46-Orl;u7hj?vq+{=*V$5SFHB@FOIqg_~&+n!2|wk%D=^ zfBsB%xDQggXmhM9WOJ|R0#XP0)fTdtZ!EYLuD+=fzZatD9fLOz1_)qJKvUs>iZ#Js z^ON}0-Mp^ymX_*C!b7uHMjs7E^T&k$X6Zv-ZaiA(o+<%8T5R*kjZ4i;WLlRtw9iGB ze6luD#*<4MG&r@F^Xj%-(KeC#7!Si(Fmfv19S6axxOM^jVN3DE@KOeszt*i|LlwX5 zzrYkW!y^3+Umke!>!!|o*!D^xV0M!tLVpr>&tp#KhWHTNVd|}E+;)BOUj9KyEd3t? zM>l4CMQvZ+-LB+g$F6$`;ISL^A$3^Hg0FQs?eVHc&4I z-VA3%qeH$>Pf2Z!8h4g|GI_LIXdA|o;5ZyM(Hoy#^bc@mo4U(?KNSzUSZF;BuD#w+ zcN@*x8;#zA-HftkIzfwtl`G3I$EPbyER+woD9oRROxa{20(y9bVU9yl%idaf(Pd&s zX#ia7j-|LrI%k;-zozm4k(D<7%>H#}2lYJYL!s$9vJ0v1haZ+P&-~1SNotw9u|Oov zWXTE8{K$`wzS9%wa)nTpHAoLnF>${r?bKMIBcTTu)WQkt&*S&ZbWq8293gr;f>C{G zgHIEj5c`3rEwX=^;{>+3ZdbB<6VMmOBYyQK*esG?huI;h@?VMDE;AXZYKMiBR4T^6 z=`(Ir@}>n(e>0$xTm8S1oBHsBc9JVHr^P9o8P;AW0)Rtq*m2G9)$M;%k{vv&cZ7i0 z7^LA|Q@sItQ6h`g2-kkTJ7*866qZd*W*X zeP1Z#Z*OrbeZJcl;gz)sVE#S|71Zhu2p(dC5SwYR4s!EGSiLBievJ@9soXIJAwbDc zesVI>*qn1`ksR%sva~~e1Xlg{ocUwX0s=jTjfTIw^ffEwrhXc8Ci2SC#zHy5j3=+F zWI+9cz>NO?Q}y_es^da01{K>RvVSxYn23||<9qvL+tK9slWeaZ9ztZN==m3rZUv&a z0HG?u%@O^wHff$$2jjem71&^(Q(x6+0$jP%sl&l(R`qg!wHeuzH4%8v1=-2PPJs4K z4t#)zg|7he4V_lqIW6{_m${J9B|5Cfa{DIWJ=AkZWATutgv{fB6dPiQe@Ity3GRi* z6=QW>u_Hm3t1)1wdYpW~7z^&qG|Gs=)>bSQ?p9x-Gc0F!lg5@c-r9K(mMW^*#NHlK$sy8%$-3pvoWK~Bmt2-SYKM=y_lGa08{E2;tJ|cl(~+c0Qc(G16O&s$ zJebRPL{`~45y<E!zOy1jP$v|Uh zaEeU@HisMn!9pqK<=91lat0}BQRMH%4!wwsynhr^siBMA0@*$IV+6l}VjKSZMK>wX zPJ?1GGU_MCf}{qtvYv~C4uk$_fGkcqc8;j+DFbafoybhv)t#FF{EBhY6At|y9+qW9 ztgbKK!h$GlN*>SVMtfvxl&AVu$STO)-#ptGBA%FH3_OZB2kUkwk|0uv0O2iHU+ZAV zupPtnee?JlCzg7D&@aEc112cexWLH-o=uI^xA1^5tKFA|O}N3h9|cp*=qL;F4hZo% zOwj42KOK9I*!9n~tmVA;_!!kLa({OPfhj=24Q_!}&iN^}HKwfNsG|r&vJwW{##{@! z!G~z3w|Uo8Vjpe?d0Io2NhdVcqa=$3(@a+B`B}v_TnY3unIE2nO5*-0TlaqiZ(2Hc zT(5G0kAc|76u6fM`+8x!jc>#KoEsF}1OLB+f-~Ef{evg*IB3AN8TFO38;;MHzE7^z zo`qHAi_;H6{jW=l2Ehu#)@6HhLi}_TtsJVj8t#wn(a`g6A{Xr``TzV5z9`e$2Sa%f z99hNX3}a1RJ&U3&B1jW*`QEd?b~KeD&~w{jL>9fo7scciYG#E6T@ncuBTXnQ&)UuC z4fgOdE|Ti3coJV68v`X(I8|D>MGE=8tWV;2_M4j(Sf;c{re76&fx!fqOUbnkZOVYh zw>2fwK;fq2$1{l@0TaRzpWIc>-eo3bFfaE%k&rQ~-gLL2AXD^Xl}9@O!)f%{IVi-3 zcR9%DbOGv%Q3w3E`*%|}j73Ioj;B;=i@kLua(M8g*55iQ8g*MJ6~ll?3}JxKUwm+I z&47=Du&y!lYD0-j&+s7OmO}!}sK=-Bd*h9K)~VawNzis9r@z`@gyEH}BG|60CpL-O z0FD}fs1^7D$(CKC;Z*(IaN#uB_&XRBHiqq-Ck0HdI!qb>sQojIzd07NB&r}zS<~bO z>jH$h*?_nj@302b@I^G2&|5z$dt*!o7G8}a(D&r5V>C$WzrX;oUh|d;@o0qSvW zm{~7D6}z3sm=&Fc&K>LEAgLXI0AcukbJ-J)nM6Pq` z%+bfO6vG(lchb4kb%3*VMD+BwHP-Z|_K`(-%H^eda(H4`7()~7Gec5mQ-i&i`ae?~ zx>Q6m3Z_yp)79KneHxNG>UXn_oZMU@c41IhmJQGZ#Q7tH;pJ_w-{f(v%a=b`N|nN^ z9>OZ}&2-f9C0V3;_$8tV@#yI-@PO;4mQ`sS?XWgn{X*^&)cC&h@ZO8=kvP!>nZdhX zSOQF1+@YS|w?I(qm^*-&K|lz@hYv-c12Dh7G6sX4J{J(c<;T_>Gn+Rq9+&cM0C0|P zt^C}=K((GyMsIIqLE$VHob4EM=}kQ+m>_8}V~0uK%nl^}B%SRRF--Q~xW+(cNh)Rr@Xm zHPY7Y#dX8647X%!2k)T;2LQWndWV+fo`EW?%mamN7rO{Xm>dXc9(TP3T(8e}IOaCP z?f@FEgPyAt<=8>P{zsA}v`UCm0iT2vQwwCMMDF;IH~q*X>jaZBOfDBH{^*k~MO-Rb zeSuD|9Xa(Xw^`uAa#$cm$M=!I{iZ7CA3oGKCHiASdhAyJ=}P@5h^{_w_Kt;SM_$Ck z`&B{GO7BS#oQ~qg1;t-@=%GoA>IMyyNm-a6QnpD%bI)-adUdI}PRz57JQ&?lta9Wr zeb70D0U9e%{KipxEENp$AohBerIHzmI}`Q+eRE1|dIfoK`d}cU3gAa8Fy5;6dOAzB<`}6Sku@v>dofGq-<84*>Z0`xhx^7^Kp-Z}Svc@yJUe3Np zmiv&n_$2C*ljF^YXsm{QG==_RUk3gwqH_+)UCOUE%0L2j!)H%>(`Yl5;va{sn9;M} zm4??Z@$T=P((E}~0^E4V{A+-YDqF9KV|K=sjK<1NK8MWKHmCRJlZGcr9-2d%u%foZ zFo0Qi)xRbd%Q&G(@i=!mlc|)xD`e$XFyb}tct4xM`Sv^J7QZsVH?zZ<*pv-^FL+G^ zfWPZTR6NO|GZohj!HsZE@$J#)e={T<*sQddN?53%Q7OmPRDZ;ES`ZeH&3 zp=R@m^%@Vo-$Kt9q8y%64bkb1J1`gka@7t6UeAG zlWar>e2S_=^)P)H!B**>x`2CVO;#TFrhKkvNMw)s4SdzD(quv=BDPM&mIH}QCnJ&3 zCQT@pbl49m?vFwtP5T1g07kv&B0L(6SiF)Tq44NVwAkc41N&UkgrYa}%(AG9@Tabax!t*(46>!*F~j$&jk~Z{4nLtM z703X5vjlEP;Wqmnz8MFw9i3-`5tL&O64B0L-Mw!Ah30W&mQN9XN3aB~-y{3HFN!>c z4j6Z?yVv-th5qUKvwI;Fuf9TEjvPAw2Lp0afPe16&ztU_Yy0rfUd>g)ak;yoY+#5# zN@DoQcTohLkhp0*v%m(f(Ao9}sbjCO$2Gbfgys9V`Z@l3N1_}Ii0*JVyQ@bNPKg1{ z4Ls~{P$#1443ZcuL;NAAly7CA#TwSD=pHEYOK7r)8nzj)Xbl$OHabvfgd2UjPgodu zeQF#Zapa6pCbMLEEl6UF8|+jU*+pe8ob z6rDl_-&@B9UC3n^&*i{5gQ$d3WAT>qKRY|-`URz3Wa4l|=H3BhFLkzde5H6~=e%o5 zne)olL?Cno2j@R=T`zuk4)k#Z561U&peRNe)N5AqEy=4zu zMc!kmK?;ruT7SxBH4>7Cdp)c2i5BF999^S1Y z<=(3xV+(h;wm+PH#);gzgYsbqp%r~hXEn2$ryQp{WA2EX;2E9yn|D(s>$INfJK2_eb?f1&7&o|rP{@-}L<00WXa&x?{cIZb* zg2dEqpUKa(hfiZ;o)C3|-oNY>7W9d6Z4=#Jn|Xu2Th&N9J~C~_X*60$3M;f^ zZd@ZA58WF_^D48W!sEE!p(MEDVoS zQ@{VtwPZ>|opSEu?$MO2ncP&o$*Z|AD@vn%ndV8`JzMaJH4Up$N%5~Yj?I(tq&jRO zyt-B_C1U*JONts!^3ikqBXIblnO+d@+gy_}6|mL)q8wRlDK1n+5yR6p&St@-IwSER2{4qsp7#)>REoPGzprNZ}B>^JGOe3X;jz|o)-Dn^h9^|&x$__Amm z9LikTsW)c8NA|Ma3Se_NbH;HUuJps(>$T-A6a9c5*nH#z5gem&Br!tt>lbt;zEPxt zEiEhKY-vicR^jg&p7X+dK*kg4Fl*q z{Bv_cPw9|wId}#n`&vvA;U##MP{s&%pbbt~k=-|4EDM~Y_^*+QLM?E9vD=V1=^W_! zaY_C2Zr-A6#F7}0Tq5RCTnd62cg(m0ce#;H1FQjm3p$|v*ikzC? z{qUZgTLIQ4(LReZ;CYAV>@}3g7Q*OGm- z+#x>e03j3_bd5hpriX1a^VL{%rEWUzufxz*Q;PF}Jw_FJdX3@!0`1{m(T=;qrA$eh zds1S`pz&E#K+$52UIWLJ<)$7eR~FTFZx6@CWD@YGs-eHvmucIdV#-BNy>Q*wuXahD z;3rG}{>K{~j-WWg5;iN5)G5rbu+7^tORni36sz{@yS>G}Sngtx8_cgl2?64keImbo zg^iegpa~V{?|WY1>4s5vui|MPt`V(d%aLmjh|u#dTG@X&xsemUzUR-QNB!k-%3N%b z^lm9y5r#$>vbmK+_FZbqPs}m0S7fiX^P8L(TOpPP#R`(2-Ay~ zF_}ST)zU-6`6K~H4YAb@wY*EV7v2n?gE9?q_r;p#d62O()%V%!>Jc(PkJ;-di$9@4 z=Nm?~{^2iPCzTQKg2R?BeAB@3vh51&%Q&?#ett|(vk#F+4(A0@9*OX0BU*!`noAL{CqU!9@rjJ@R`R{*f}*C(l>nk ztUC~}xhe4JT8azWWT8F@^NQriaC)KnX4hcsR z@v&`!MGN#5|pvYQ4{K_o8RnGOU-w`doxZm_D6)b)usnhnh{ zKi;VgpE{m(EvH=Inz3R&&zXc=!rNr!|LzZE6tX6e-e|- zSM3^gFPdm0Rm<#fmRIx0U3asyS1dd8WsF#RSvrm04A+H_Z4}U!M{S3C#_X!3L-eyzxI;fJDo) zY!!ywD~Hhwf-25}<1{WwUvAAz;2p006Gc3BWjuwAYN7|_N-@j>zAgsubzC9MwNzu} zA@1;~#6f4L*Xz%CG@?k`wLlme>7JKe142!TyMbP7`>wT3TB6dNuWlTFcO)mu23)X%BAUz{~ANTJj z{)mVG>yW8AXBP1dPB^4qmx%M50tdn|dbdD?lGK*<9%8uk40Nd0oOm(*U63M#4vp@1 zpSp12WQ#uezm9`iPk{Ua9kwcklwJ5jZ+#8@iGePaVSUAEu{n_*iC_+6LG#0gk%w(E zB33Jn$T|CtGJ)hC@N3<4RnPg|{P1GTINr$!DoQ|%(B>xvdpQ_eWV{deQU&8b@V^ zda1y4>a@_lKN_?I=CM!|Dho*Bw)i1VYGfFQ7(4pF%rPhEp|N3xEv-p5Ft1NfJbg7x z>JTO@^5ETL9H|{Fy_meD==1IPSI!)+&z!nP2x_pWH$4~aaLi+EKqIcb;Igfg4i0x| znGfH(+bg}$A$j9H7MOB9dxS}?@ocfGe?7e&y%ce3-AoI1T#Ok|GoEH-Vgo99yN?7u z2DcXn%US2)Vw8x*0|$iFjy(_>hx+RM26ytpSaP{A6>>kRVgJ{|H> zdRHPJZTXvBxcw}QW^P#S9)TZnFVyH$-|x=`nLWQOjcp@QGk?M@6itH{C73`)Ystk# zqB2EVpE;+flc~V4czrp*vyzUDKQpJk$Hd^Ra@q z48f6Jkg~Yby>@0SsDWYKsW?q*!Fvwu=ly!)=5%eE#o9ghyLVQpL5Gu(a^^ayksh8- zF2}e$?Zf|cc32NmZi-(S2g*i>_=s~gmZOeFvJ0ti@E_j9&U^8TP!M*im$ZVro#K9X z!h(8)7LcNz->DMKtv%f_TB1WZdoZoIAzyHb;5gU2T!V_VLOEl22M&B#9;(Kt&;xsY zXmShTiwo5vt=U~0fDwk3p%Uj7aG9wJIOy9_;UVBkp-%%l7wN1uoH`I%WN>Bw^;X1R z-On|n>d2m6S6jB>9N6!hvHtXmL-w#;Z;?6iP*1 z60A3Kq}uF=HILekRkR~YROzxL=*@v`#7(=%C$}4}(i@5o@ZNlwaKcG2;-v{c?+-t2 zE1W1ZQ~0m01@Y#G6LPsd(Wh+kM~4t2kTTCKCjfg~WbgwF76sOWt{6^sfC|GJcSMR= zfqaBC_3bf*PI_Z!8z|?byYVF2wy~I$)8v#CBqY}BXFs0oP2yO2Y(;ijb_q4l5Jq&Y zaC_uReM9!bI;5!02{*6fEfD*2K$PX_U*tc1ywmp=P3@!=yxAjJ-(g3vQ%9P083`c)fJ6lU`jV=7DCk*CS!+6J1#v!Kaa-ljq+fCC0G8T+65;Whz zGMyxIaa4!vaUW(0r%)Ef_J+EI8w*Ra!rNHH*~9hO%gr!&`qh;MrP?)$Qt(bM2q&@Y z@~SV8wknww;jqt}&awnfe*j75Qg7i(LAD$77MBAKj`jrGFkgkuVRCM!e+77~pq)Cr zGy&mmqUMc>4;dYz+9E6@IfZ!JtW$xmqD-P#3r}$j>>9$EDNGMd| zcc3V_d;QH%ufVQ(G%e`6)^=ptFA%WN3FRAf0rjj~dh!X!>&ypZS$sKSFblc``Z~aW zE=lw(Z~yY8nC#`O^Sn#XGK7#sL{PX@e=C6<=l;(6ZYiEG++=ZiuY>HrgOR2FMGKvz zb{hR(QJ<%~e}1>)ls(92NJP9ajFA{9l??e^fxzo8EVs{eW=C!ILOJ`a{mJmHz*mZI z#D1m44L7G#ij|qm8jeEM8FQ3{oKbU3PS|O}76&oP#={UtoMF44$8m&NL};9aqqXSW za_hirGgIB-l-P12zxr^&VYYTOro%_yC+R|dh@$rAo+a`Pa0_&|IMMQvXDw(VywTnj z+=pe9=wbd?lw^r_bh>m5vY+^3$B{P9V|Tdr1>m0q`<-QDT36O_vtEU)K#vO&3}@bHNQ*x1b5`!^jvtJ;DbHOn7!-fcwO1rM2V7(rf-JNZo<1vz%)c(pkv`8z5FovDqVs+YSB1dR-dl8bK zUA@`IQfDt>L)b5mX8Ud!46$d7z_Z7u`qY20X%rbOj}RQHQg%5Xt@mUa$8YYp0(HOn z@H|ViHsqtf1tdPVHv%R$dKIzm`y`}$QqSo`ch8Wx=0W%rl&{?HcZ#~>^FRh7R9xHy zID-Y#zh8IC2;{^MF*%_uVAf%ZwA+af1Q4dK7FWL{AhqO83$F5`Gyz;TlyPn!S+}Sb zUUz<{Y&HBPj|FVt-8-FF^?6SaTAKNR7#n_nhk1j_M(c`1+u&89rx8;h_`D9*M)dp- zcTFDHrHe)LVzY|u1;nit*&nhZosXaJQP1GTP9w%AjF9t5nY#{i7IJ|JjVxFA$T!m$ z{a(j=nDwQ159C2%Hl{w~BzU>3c~pTF;b|YGClSpyv>*I6bxv3<2e8q-p8l8?X%(m} zh4&Xi>MeCX^YAx_+BHFW9_M)YAH>B!Ots4e=*vb*H|%r%o7fI9B5P#ADfskJDoB-4dl@1R-tKv^leDhR>v9%cNkGM%q{#%{NY}4ACG0qg%wgE&U;K83&5vRg zvG>(PH~$+u9(N2-mh7MfvsAx!u(VG~an`kO%KN9TeSzL1OyDy%w{kN+jE*^o{|Nr2 zf3YVOtlQ|Ld%H%}wUSkAlWr}Kuf3=eyXHyI4esCs1=~nZ94)bQW~naM+ctJ$Q=M#_0Xl6OP zfSFnD;sEEZ3yt=S-Yz4j$Im0NK#seT1wvD}UzVEpV?de>8##1F_fV~VK6ITmPcL^u zK<;dgisWGjpa#_bX>mL{tm~uPIE7qbEF{OV`q@a0@;y@%v6Z~37;fKvM^H^hW4GFC zI`6^lahm$8X%Hc9?5q_BcrjnK>o<>_XSJPOnER$~5xTqkopGqOdwv4*JkK{HSq}@* znl9KQw5sP)x-is6$z16FC1LZIoqKY#&8M6RETR5g36i_YxPO{nc#Dtn89Xc+KBiW< zSe+KA=1OOqVR0YjUqToBrZTaQdN=%zX5N4taJ^%UHAWdS{WimbMDd;OVdQ%SKNyh| zp^lU1lNy2lD!KV$qh%Dq2wEc;tb9gCK|b^VbC4q6B1o<;$N61;D94%jf7g9)A88;$ z=rJWBW;-xYLkavZG%FT};=lFkFE^0{>J-Jcod%T-kPzM94|dhxJtQ$D34o7=78XmL zzIMd{V#?)&T}&9E4qdl9AY$*r#3x|E*CW*Tr7nF!whmp3#ZZz}c)pN>lp;;xJG8nz=+guYsFz-ShN=xpg>nY4NJcF~Fm8tb1)=1KI?;62ey_ z`)=VV_J9g1v&>?mA(d1NmD8AC2qIsrG1(mqbE-cjPq6?Z6(v3u2qP~leIjP`L0kwY z2Q#V!)`VV4lr=vLSG}7{a(bFKlNu|({fYN_5AYIn(!Q^t8Y7H}FrBSBoZ1U+bUO0) zCMdg`@stDaOs$-t=4#Ne*t)2=`mc5Z21$_&7gOIk&S(=D-cP8R}jve_NPc(geW_`lrGRY zJ(5$@^4=8$CO@K$ZwBg!mE8#gMp!7EDcezqJ_y*W7KU$r{Z-NkyhyPP zX*|Bt5N9|l#171skRuq(|G&lJ)z!*cO3}f`1IW~xsmUg5J*Hndp1#Kbl&n+Ziva56 z8u;|rUA?*_pF3e=28_y(IksX85%IAvL z@hc`w1yozicF$D2aDtM}1uCHK<%PKFFJY7Al^~iE!CsJ`P4-?wQ!mae2}!T2*xyai z@Meb|AXxh)KjADPMHc{~*>;M9JW3Y7?taG&AVtG?qK5v@@28}BV3sVDuKP_;DBqAm z2X#UG%HtkVWOo44u%vxx_mBtE18enmCwUr-ONO)4mG3+PtSm6W^Zvx72`JWxazw3L zc=#KmP@E7yXmh0@uM8q6cnYT+-jF|F>F(>)p`-54VKe}riG4$p;}ho{;oioq$YiE8V{;kS zsz_2uc-SOngP8xZAB*F4%N1#7-;>mGks&l>_R$pSN90xx-x%n`T01cq6o9~J`NU~i zi=q-U6)(K*VV%BMJqX^U)8LZyElR}CY;) zyF|>U)a|g2+*Sg8b$#8|DlaQsQ&I_bcrd(ou1Ihp~%GCJ;!-tU*GCk>i13h zH^1g%xZi!KyE&aS67E}3sxuOR25ar9ajGwJy#W-Ocv!%P{)9~xfER*tv$yU1pzBQm zJ=xS9*kG@V+CvBt=1xFE0M&1^4aa2X>W5Ut3!Wp~%FwXO2eIlxa?h3?%e@Eb-WR=w zcEbqGE@PAP-eeII`g!Cao+CxzH=8^^?BnG6mup^IQ?i3T9pv*A3&y&;5%IM2O6NWpbb#Yu9z?Yw(&p8OOQIP- z%Y$s#MMy^;H!)C~y*I!HQ8Aa7nR4IB$|?D?S*+cb~-wcOv>>_+oIjbA$`0OaY90J&c(^!aU-E` zi~lBX{1IaKif;8D`r-UweULRvPwOzoodG`FT*UFGiEaa4S8$PNbePBWiFu()zs1qM zOiE$gjex7lF);P_fhWHJd04)HW7x`)^UZ1(aP5f^NU~dcNR$n0y;yz>5NUk=D}k1D zTs>6sZ}N9|Hh=PPV?k!Y&<+{-Ko92XehsADadJh&k3V9ZKeMGP!yRjy#LJO>nY?OI zMRw;EWroZ~{=!}jXjICPzFQY5A7nBCK|+nhbjNnSO7oGo!AoD)f%fsmK^Id>-0^Mb z*OwhkS0!$-t(P-mmzgBlwNl*c!8gj-qz!gMv+4rDrb8&L<*P+HWxJ=E(Nq8zhEHdg ze5X6nYW?~}+tQLw2M3nohgR3Ed_M~MtmA<+QmM<_BSe{XnQks}irCPLIHFdo@7es% zfe>Z+Mi)T036zj{YVO@-$=DoA<%CS|&+kdg(Z1z+y z$KqX|*>x$)b-n5E_=9{q1WpA_y8&XgV#8HXNp}kdM^4=vsb&Q?TKEu1En@gUbiyjn z{czB;AQN(iUbp8ABke}aR4!{^vG7XgRS~j>a-lWg{~rDCe@ea5x^k9tg5?M z#<21q$o*@u{gG|YX;t?bV~-X_-&Jc1YFp-GSvig;8t8!oV|wNSbVDp0nqNEyMKx_j zT&PS=k?8~PiN};L!__>O=BR&3gO=z0y31UiU@v!0m1lr#Z+=AUb}n$~By5nCA--%76HlG^D0DFD#wE_=vAICmC`!>W5Y{iJjG z@PGItNwb@5$uZ0kSK%dy;ESgc@`)??c`|9653crz{y|^S1fHYoycsD`;a*$QFEl+# z*~6Z9K^v|3e09I-LpR%*#$S}-$GJmc1ef`EdVEy7{TQDSk-G-khLrpRA2G~O0sset zt{C-~ZyhbyvhVaMfpgf%Pf{+-FM6h&G9+xXu;z{se@(bkA;RG2-<}-XNOII&jw@!$ z%%=*Olt`t4#sBVy#*4RPLX2iWSqcTG&~as{=eQJbcIz4Fyb#_<&Pgo%6Kv!_g?Zwt zR12T-;!b2F%%y+EH{k};iXdJ5f> z-P--ofy8XMpUFmi;(HudR{0ftF>FX)^5p_X3qh_iZvRBtL|DLmI!E$&QI|1Nl_fF2 za(WtCsQ>MXf;M;fdFK>^-353#uR6TlN5~HN=`oyj)j8*g>Ajypt(sn$MGv~{#2twr zpW5oGtUn!|r*RKP3!(G>)m129Q7Bfv4cm*^V(kOH<`wr1;3Exp(6@{lny*^pY$KP4 zQTj;FIc9Tt=&!|v%KAiiMtfNcd^4AjW%FLV)FG4Nv!6VmXK`hH?X^H}a1cpz=wo1*jM~W#-p|2t;lj& z6bN^4R&b51%D;@qSmY;=N>Iv$)7=V)6`Nhq&Z3!6qd9eddvYJ+=ZE#GiE8MYBFZYV zrMfK`(~hS<-_x`5s>sGK7YgjOx)z7)XcBk|XNM*Qb84T0iR}I^pZ@y&QQyN z<0HX(vP*zZ4$$e%P{qj{wSBmS$hE%LZE%O*((9b_9Po>zbx@3T7&I`8mnhK}B>EW{ z{e$xYq{%uZLxa0ybYt5E;`iqz1<=bVoNJMMzYUHR|I1DHr-x&)gV(5;=+NGbIZRut ziVa_8H@P+ZW~2@QGn8?ne~6qTIaa^|;I~?yy+La6Hn}}`p+AEzUnzIEH%sX3n3ogM z!tnT(Lzg!t;IZ3qv9+A}+#Uyk2j>cr zs_1*zZI!5Jexqp6pMoE`Q0TvdTzuy8Wa#&FU9xRItu!|M{}(DX_IeZUde_Ph{eCVczkS2J zmHehvf5?a~KPW2&z`I@$#%p-_L+E1miIOCW(p)VmcppSD>}jP60GB?HhuRR(3vEch zc4#;Y(J|iMW^Quvit{u`Az@#1bgGqDQdHSZ|6Ux%>-ZWWv;_O^Yhe%uAio+F%QvJt zdBPM_uB>b;H;qNg61Dz9ggz-D6n|KsKpct;TU%aaXlJ*ug)U|-$X-m4D z#ug9Zw#cj!MO>-NL^H2i*YhI1CsPIvpzQZ4mTPp(A64PHRwi@kE^bFds<=v`;OLxO zuT^_~={OxiYQ|ET+E{-bk?*%|zWr`6281vk)q7LbmRRqP-``M*p$vPS;#?Y^cwjO3z+p%sWI+MX z7HFqKK0^|(*U2Pj8d`97?B~<6J-ZZ9!RF67jt8B@)_+k=-hWWaHM^%FPIy2~2MXA^ zSlQ;5ln$N6o45|9MDc@3iWn5;@>^3Agy-GoNjI)+mB@o8=iBu04~dt4($ks!LHvw= z$iG(%IwnH|Rz*dQ$wEC1)hjZrTSX}zRj6sb9?KFk^mu~Ry-iQkggM^F?Ju9IL3Mx? z+3IfOjWom@R$FAur`kZlC$%nJ7k>!`LQzD=*jlFRh zt906&2z)V@OCZmt?Eu+a8o#+3k@BK@RRYnXstEwsCeZ>1522+|Sa91}b8!dYOx3y7d~hco&_v`MrAK=@v^3MSbEBp7 z-B!^Hj(Fu6U5qw0?EK7DsLyLtI}kLrSUtdDkzAN5THbfzb^7XlyS) z0~z@EGbmLoq{brl!c$KA2S8Kx2VCe+Md)cco(WTrlkiDGHeCW8(14f3JjKj5Tf_Yb z#W&}Fw-W#V1_tTR^#K*QyoD3jkhcEp@zKscZHW}S&s6p0yX@$#l$m+`ekBfH_60Ve zXIcbF5Cf4Q|JP4=R3@u6vMs_Yr1fcx>w?ex+(v_(A-psTfhc8Vnl z8be42Rq##JXMDlC(FOYf+-rZSl?)e{snIPp?egoSiB^gMi_PNxBcyy+qW2*+@3Xe% zzR0B4>sB6QSI2{c!Cs}GdHeoX_c*@S8cZ3r8Y1vo>bsZ~s9c$&Y(l(z$pQ8UTor$TjNmS zJzZK4DHUhbuD)!|>JBo*5?se*7c z#QbAUg3+>UPzGIEM{<6gV!oe@lXej+f;^u_hg@PY^P2JPP7YTwvZ^0MU9y|W4;MAJI0veWDSbYise z$Jy185sv5FA;`F~$XiF6(NntGO8A8k7qk+gFAxOLxEHO4s8dD*Pei^%dIhNtzrRE% zEymS84vSXL&P}|?cTA8#hUe|zALzRHuM{r&^wFw-Bh4j7q7=GS>buR~%UjoQcUw9y zq7V+2cCp@bTP2YG{hDKc&7%^*nbVkQxB_y$3LH%r7OPB_nHO`eH&snHaWPuB`P`ql z$HC28PTf!mMSNX;X5%#YM2dSg$V%z<(xp8GRjTWRt1LnULHGlT30_=ze+*YWpV=@M zH#RaUv1dyNcPe3sXuW)Qv>SIeonD8&>MCgG9h80!gon`>T3P*^}v;cALW;n=l)Us|ES9t-E!Wp0u?MLHJ8v4&CVe=3m8^(Qtqkjx`Ym%Jf#@M_#j`O~8R!9!}VZbyH zYz}h)p9mn;nj@pcZ(Tk)Pk}{YDmq-A+H;iJxC+PL@E`Rs$21rx$~F9q-Y!t})VdO) znPp<~Ai1u1s!C=I@8dIWu0|y6{*uJHLyM$-gZ_T<XdMvmyz*vVC5z2(7#$|7b~2 z_vY46f`+&5K_772C$x0|q^c&fn*papg@u;}dvDPF1L5t>d%yO==Ii}zbngpBBrm?! zUq63z>3E7C|N1tKI*dN=?IW_4w@CO3s9Fs~CpEc=xN1%o<~2=_@;^Pt)#qW^5B}j7 zVH>UI=%W{kAt+mBNMf|@+2_n^BpdD=%=>D9*%dm7go4`%w+I18fhJko0Xs`3JBNjT z3^Ozq#84grU035o!v|e~tf}O%KF{yR_QRan6dgX)uQTozr6KZjv|dLe%@R;`rw?B% zEZ^zrPeZv1X~ZV~PEvp9X``KVU_n2@$^IU~LjlfjGWZHws=>&lzbi|8xZfj|4y?}L#4WM&ud7(az#I54ohU(m9M{{+AlLQnV>T*h?9hz} zh)c9jbGSdcV1P*Ub?|8EEBPSWsmh*szHb+7XyUNvO0tA+&VCw8L(=-w*uscY z_t+wRG0Q#JU=n79dh#wGiGwrpa&?UX0ohi+?V%YU)4aew-*+LO8h7TX)~VKil~?Bq z3rWIE*O!q~)N+sOJf8cTzJJ7$t+nUq_BvD;rmK)9*5Fa3>zE>(-Aax(y>?E=eQOtY85SDsi2iE(%N zrM=M(o&r?AIYSzY1xDNPnYMeSXS2zNqqW`7Zs2_Qj`L7j`mvAzdQ# z6EzD%s@wM&vtrqnwGegU=mj9(!rG#_*5makMFn zQMRCP@#^9|kTUMW5bEjN-wiHL>%`edzlIaiPhewM#m)%K zV2>=Lga0-pe6n6^IACUD$NG7pEEJ7U0X+5LKuf!fP<){}+JQ;J+uCr|YYB5o058{G zG;qGsLExz+AqLcNkdp)rg@KDwBNzh4R)#6;2Dn0EM2q*{|RN!=*n9Q>}LLjHlM}eswX%1|pb75+KK!-zy&jo-e4pl=oTkQkq?owHh z;;x(P@(_+^4NcrGu~#v{JrzMOP~8C0QgSXici_Qn(5V%-jI^<4Ww{q8c>ur5B~g#` zKw$d{A*SoaxO;4b(6{&WFF6ih0y9Zj)GZz(NrCDYz6sOpW#TeH3Vv)z48HhP-L8Q? zs*y1TB2Vvo$n_V+$2}LR2@wL;JAsHCr~f22%bgKULIQbl91zuuV&~UHN)qL<@k?^$ z@v)u*5QpcUn{i5(9bfn!3-6`Yk`na)QMYnzG(nJc(0G&NsJe>)t22%TXUEsjUfY!! zI)!<9p)ea(4E4hx%my_S{O<9_>xX0;42|A&u%~csUIH22;AZ3GJg}$K!30QGa6riu z8*lntJYvMw9I`?CS5Bd9unn>*E%P9H=k*1VNcd323NB^xNa>@D=+V z#QMkjmVA7vV0E4_F|u!@IOw7&4^ICiK%{4+NGAZViy2syI$7!Y7lHhpi5GSZJo`vV zuS^f}1sMmxtp--ezwPtUZJkKfbja`CZM!?>Xbx&+JPlY2e zD5dW$GnCMmFc%q%*(!R#QMwB2CNfWoid84W1u#GEz=_)#<1JBO<^AK8|Gnp*EyJ&s z1E1B~-HV6A3%UNUpjz5~eF^l5BS&N54Gqz0Ktshvg*1HM=KA$>9=s~raWgV-4gV^q zlz%AEm(whM{zavG=Rs-rj>mRRMHul)aG30(K3u&lMa|n(cjIdY9IC#}n9341wrPJW zIySSR(D3k`DX$w1f)`4n zA**t1m25E}iz!e0#{8&Bhm45Wg#dT6z@e2X4M{pglYdFk&Rm9;5kYRJ2O`(M7YA1h z&{oPpN~O|(BBJH(keqI@fhx3!E02?{@bi2faEGudGZp8vc^{M_T$^5qDil3<2#9?g zy`fL1)5;Cepf{en?t9No4VZg!`Fi*IosxkZ#FE|o^eGj`<%e%r*&I6 zO0%NkpJm0Fk=Jez7{IQmf^xKM9|4PIR0UdII@TD{+&BIN6FN0<&ZHLKL3_asdBFnJ zPdc4d!pdEMz@2fiJ>Rq3LIoUdg}O0a*Zl9aY}>al!jW=I!29!yH7^BRxACqy#RiFY z4y5K{6&2_Nk=|OE#yGcU%-;J8>F!`-&1xw@47s9lYRd?!LA2 zJ|X#d!<2wDg7mHe94Y5TcjCN3Fm$=^TRkyj)L4=BiX2jFV2TFKN`Jtve|CRPd~T8E zwUwCpK}KawJVprjaWz8YXNp}=lVPj{-{bQ2*L%cI(+NKQhrH-bA}^bsBl`u%qbFUn z(||5*&yC)xD3Xtihd_DDH30?2%Ddj;Ig7@3Tzrf=9`rKp`Mf()LYa2tIBfcK6=nDy zm|+UI7W{ZRIF6>iytJ(yU51zN?{$B}c~ClNRJ8ozHT^?HwgsG8UgDbi;blxI^CcjZ z{4!qO4NCw0FN2RHiZXRvlh!tvO=-o3;$p+Z$j}2~PNR+s9dR7bQf1_WLIs?+av-n7 zc%LXBqV9}epeVV5Wn_~@SYOwuBl964>h=j(EqIX_`=Xjkio$`zvMc%&M0C9!Y$J9! ztzV68eFYq)4$SbQULQlH=wza)7hnuzMVK<8V5S~b@SSKcU=E^}^d{M{XC5V?`A=4l zUVZ>tr-!B1ynG;RcEa-Opq|Vd&Gt$Jk76K!(5p_+&d~Aq;5GX$JUN{c2dt*#%T4uz z!0zutHZLMWWe@@VbXo_Hb%U^YaH+TD!DnGkgF=wa>Tl{4YyL+F@ULLYMj^L?>`dz) z7MAbQjUQAk+c=g)2h!51vpB$Z1H{#2M+l^#7K{B{-o{+!ra4+9S$i8yw_`{0woGKd zqFuC7TMKj5TAIiQl7}@=I)qfwOjFr>2(KbFnE$XAbg#%;2~>2V2g6s1a!ZdN@=PiD zxm<5u$a&0QHQUL$NzScKo;i2N8oP(Wb=aIV0$STZpCpI=&}|oC!v-}_@^!@1als}d zl+SX3f9_S2PhW>go*&pdaQCvS8f}Rt)yLoHcz{po2|3OAp}B<{jnmG4`qBI(Z|Ity zeg1}vkQ#65YT4waMB`hc(qaF&#Ymqe{Ez%YsNd{EIkLR3$6JKO2)wGtbYY=$cTQoY zc+JUY3&B5)3TU{C>Vw^hpUe!P8I5wMC`X35U>_(35sf0oXUr8=s&grn?=xgWeQ3Yf zU%p-XhXwf!U0}g2X zDHX6??%>ijXu8|Ly}Il7q~Xc$K_&|ev^zP4vT=hk3d6z5qrcQGZw!kggIx$^ma74|ILtyH(f_o>Q)}h_R#m|}KL}mJ6V#njfvUyC zYQ#iuB(FQV1mSz+E;{t<5moSNeU}H8?DbkJkRG*L5PV3dt3!V=QT^)|^g>d7lNGJ( z(m1MGKDMMM^=zixNk({aab0n&fh`J=l^#h3cn;f^_+Y_+lvZoDcDY*`vfx!C2$V_$ zl5Bn~fNn{`y^eI7pG^ZM1RIn02MQEthtVDLzAY(1j-R>Ttj4J)+UuwJoVw_Fkuiqn zlfoGS%a0Wk#E~?$=puh?Qt@;62T>~pWf5t)7chA3Y*Uc3F_K>9AJBJZ+Ti@8&?`W>?c9S7@Xp_QyA3_T2l7kYz5iV0aZ;2pXDz>xtCaHI z7}>{Uu6IZsVfA+?s`q7i6THeWN0^du4f})m5;-QkXzx52@pb^Z01(~Odlx{pA#GW|7By&^Q+Hy9X8K zGg6KDkp5J#O0vmaon6X9qEag`v7(mEK1zvm)#C;D@#q_p+#5+xOao-# zgeMk{qzzM(Q14KFyW6)iy2($+HPa`QCGjDfQ4is50*1xVzeZU5p3z6Y!g?O)#&e!q z69V6b{Bvs+339QHtO#CK4>lIT z0qV(obKkSDkInV*f3f`Px#Tcy#dJw-IF@(nwF;E7LYLzN_N0pw;NAtUX)FO3uBG{M zjjE?)j@?FDISukzszgDN??J@aag=YruCi=kCa>ddd1=JwQ$##1Pwc~R_?(=wbU|+u zW-Q9TY3QJ#UF_|5()gLI*STsFJ3;O=sk^_AQDprOCm z!tLK3dBF|McnuX{%IiYVgiMw%Ie@#B`q$LLU~{$Ym)@;pxJ;ClIM~%*`l!+A8-Kq_ zLz0Wo#zOUc;eVNRI4ROswBcIOdI6bc-I&t^HWPhUN$3^1@ZxU8)6@6q_Gq-66r}X) zR<+G(J@8nMp;(({Jbgaa=tT4a?w_xm>q4b|sohQ)8sC((6e@B}?PMuls4ZH&A-t4bTVfBtF8#;$ zlmX&%p)Ev*FXkEl&zR&~#oFP=EqljZg4`sCW+TdFpU7HqqAzPz!@R_)cY8NZ z2v6PRlVcMa$%9}!WGC|Z9+L0Y^6{V;@Gxz*Ksk-YTrXnSE4S0%s9{XyH+^a`ketdM ze51iGRKxD(GF{=dW#P$f7r5@d0f^N4jIc?7rZlQL-OpAfdK;(nhj1GaWw}YxOZ%Vx zc7oPa(>zB`cu#&(5tjbj*aLes+&V8qmzwzF{`1XSQ!r$oJ~3KQRmT@K6a|@h>(yiENKj@hZe2oT1mRWL{9}pq$E19PZ;;!prTcYj%PPQNb zzgYS9ZB1rGf2B_w$u%~x(jGJ}XNvo0&2GwFg_<0XYtjV;&AA)T&rm~`XXo1M4Sewv z*xSi*Bjhi(SN;&q& z-}0+_tXNV`4_ZX81x6kNnCzNtbQcs-=&9?TW^)sCFJvKh8-|qB_Z{Q0CSGLmO1N? zAL}^rZ3_emFXEyX(1^2E0X%o$O!)qXTjoy>ffK0TlQXPmsOR%H>{e%`cymeS^nO{D z{Fvv&(94YO7WI3ar)i*{qU|yzdJQ^T%rYxBoe&Z5+;X0E>L|!)II%Se-O%fcFYh1YmBr1myRsAqk&O-BLBbat?c!PUEq#$V2dJJ7uxRRk?@1ZCgNBa7k;tX zrTUGxNotzJqKc$z3%>)H#xkL?wj<4;>D)%&oosdcT_lB+5hcLh3Y>hXZ)=v5V}Q@P zL6>KRu&pBTvqo%Alx?PQnAgI7=&KepK&M@2-O!?6XpvI<{LuQCca9|IM1-}^(T4AX zk;YNXk4=Zk{=O~vRAtU%7lqz|s{+TVf&{pPC|UM4^k2l~QY7>lN6j?O;PLG++Nj6} z|AE4!41n}d_gB3F311_ zUJ3lo%EX3OfrtT3Ci%gE`++rIfA-K(S4m-upOz@>CP-FEaogPIP(j3v#J?urPpDJ$ z1tW%;>=Vah)KFmS3-__p4dgbEp%|1zMFHg*NL2swoZaQ6O>Jpt}Tv4-tDx>Z`Hm+$Z@j1 zxXb7^4I3ViOC6E{xJ!pfX7Uicy#vR5c{v&Xj<$%&_wA1O%Jz&r4(-Kku0_H=NZ6a0 z#~Mo~Ki74zSmK1%OE882H<1p!FW5|FIAhMujgTDZ_FJEr#QVKIkWKdCNZ|11@P1gF z$nnQS{FMGy*UBqpbNB83N%Xcu_Ku9dNour(TYAE3$;6GAHbT z2Pt+IwS4VOuQjlKUVq&6y&d1@0K29h*GRo@Ehbs+{C8^hR-& zaIr`ORp;tJlF=^L>+VF0-~^mm!F`mnRnVNVg7m=3NdLj!QH9UZ%F)D+3v^c|(|SqwB+B>(D(Utbl7N0woWp-SqAUbRWyCsh`FFevM(GotJ-oyK~C; z!K+pjH_rh>?&EBjwZAJ4{@v)JRC7DF(S@R7v^$SR?Cft?qhCeSB(m=KmozwF zP_~ycG7%}?r>B1w1DSRAi;oQG0{7>QGD~ECTKWK@2SSR*@2->A8uoH+MH5nHfU9>66&?rtOEuo78=t79D2Z+1Fm_~T+nW!b6{o-to0Rh;F9#={gP>7 zC6HkuA5E_$o9U{TWV#t$5PGF$mbZMFE5b6HttYTGj(^HMl;RCsgkCAa2FZ%VtC;QY z9)+F<8R8PT?XO$4*XYGIm=6N@!t@INwF;^Y4p_rjWw1lvVH%$|^9!l&V&|CFePTg@ z!gI*OKvLS6zyiRjKedS;TR+w4eC#JPLi6S}Q`I_)>#<_5hf7t+&YBc8hU9D3M-yz@ z4MW;!MuXj%W!1Cy8h$Y^c6W$?g1q6djemE}sewq&#}v3$0S4of=Qg1aYB;mYx#qVc zBv*~(vnx^UWXGJlFI&_Mf9_&J|L-X4*t0^z3Vqh1$0|2r*r?dDd0p9)EXg?)^eQWj zCKZ!AH%9ok2Nl3Bpma>Hyb5S?GQ|@9t{`M4{v<{Z`DpRl(n=^*rRlOVG$ ze%lA4%R+5s=aRwfaDKcLx}qcv55K+dyL-LQl|`b%sk{)M+Q^F2Y9kfDnEuZk7w$gp z+{a+Qz~AY(Is|?mM}OsY-tE2^Eq<4sT9V#Mf`-jHn(p44hV50kT*cs8DXjyFAv^hfs}-6bKfe(bQOc00WN+g(UI<7iIq zZe^dRD=+YRR(2(Up)$cv*Kid3{cpej69E06%u)Y>iqB8VaLT`|pJ;P4rDx6CyV~G^ z96^%at^!`+pSVJ4_w(5HbpB_4^6Q}HgEp(@hr9jvw*Wdo#lQB`K;=?R4t26P4mDy9 z(KzJL8vSm93;&;vk3J#(j9FRIFt;Lmfw?k`y``O{Du{ekt3u~4E#niBb`&+#QurLB zUb!F4#SqsdzAqpF!#QVrheQk?jqIlswW$y6gy3klL zj{(+)2ZCHOpNw6cWTWCf!JERt?!XqE9`Wr1RT|@+2FLHkqwYD77`@XrPKT@*6Y>c$ zJ2}4odX09R?wBQs%^=LUT*WAMa9huIsNy7yLsu^C93Whv;o8^Vk%Da^#$Gn(=&c|w z`Ss7&F?Jy&1L938cCB%1Q=sw-u?pKn9M40g+&pq;CerR8b9(R6L?zkD6QC`)OJVZ$ z0G^7p!p@jr7X*ozp;Elu;-@K2=iR127Ym9Ek1L?Tf&)(-Pf0-H$54!{;B`o>>c>DX z+U<{ZVj|TT8JGfFuuMW-&!h$}gBXAg8!w!dp(YY4U($;Yzp>1S7R9o)^e&n)XY$g| zrv-8b$>hgW%2=xh#OR1zYI@GuLU&D9=H`cTW^XF}{CYum*q8}goEv*hvrFzOXB=Bm zN~ixKVwIZx87t7!`h$RoDZ|(xj^aWqO4!>?0^jBsi&rMMp&t$GsQG@W8r5OP&XNpc z?_Yol;3j~cK8|3#58JyTJaXsSejsv^7haTcW;pc?wC>>ITbP z2KC0`m#em$cENUY+~?&E9#Vi5iY(rJhj!FRcHNod(*cMrp0Haq9a z|8q6|AGQW(X%qb2^WB#3I7T(q-7I94n*YCXhcFG4w`*RQ6tIb%n&-H>0Ez&*gG{Y_ zt=r@6p2yMyJc`V;&UHh&EPZ>nHdr7UH+8F=noKwue_J_0M{&U~z!yXKlKfb@*8UqD zZtYh0u4T_IlXxYUmlVj1ZKSfUIE>rGm)GI5dYglx0$CR|m_syy!}^c|!**t)-kmn( zIfz9vt>0cc6~MQ1>Pl+*Ft&Pz)~B28cK5G(KC(X(e@DM-h8bhA%VS}=WEBjO zIO6dnhOB!H`Pv zXTx~KZSjy|crH@BD;zd11c@QYn@cYsMeMF+JDV-wKFMa!m-C|Ie?Es>?D!=3aI^`V z7`zt1%IgEy^7MA(Tokt?@az^$|5JI^KMSIk@O9zPvwd;xl26MLC4_ z4oDMAqBI}gje}#llUb?7Bu7gOHCh*ibXo*uz?LUVjuF*Gvp1U4D%VF(ct%xxspZoN zGR7K*Yz9SdIpyQe-x>Mo^wtA$FB`xa2jfFSl+M0B&})X4$3g4Z;%;JspLs`PvcR5> z$0*Ui66wWqY$PfnlebJjjUilE;~ZKC8+PXf1-T-JqpQy~nsem9IWNJn*HZa6)|~D7 zGThVeqGif=WkI#J2IA(1-yBi-o55zg06suF!&k~e9R}|N-a}hS!IAs7j%jl24!9>; z=<&?zqECdf+cK+G68NmHii;qD4FFsNo1|yq|5RbM_*LN{mZZA7|8YZN?E-P{rN%sz zRR1XN?UbD30U){mb`0iyDTV8wna#ON=|*?`&&NH~X_)d4aiIt-D+x-mj$gMsQ)Qja zfFDtHCxCFE+piI)tpEB2vNVjnpQGVDj@H7v=qEiXCI5)0y?$^kHk2sM98WzcwH&=I zJMBO+D9yxH4uzDP%x0Fv@eYtp|II$KuyKTmUsKfs0guR1b&NWD)zyFUn(aK|!74^75da2`NDI7Y$gTK~nbCc%P zgGTZe8IAZ7iAy+_j0-{;-@}LVYhIIO=eX?>1$+Lu-(n6CyZ8DodwjjLGt)+O2v@ta z64SFhK5rrxg?R78eJUno7dGU?e_ zeN}!9cDS>vxC=70DP^7z3_{KNPH)% z{Kx;!5V7e?-f>TH(e1RO%J1B`RB(nV=Uk4=4h+{yFSD^(Zv?Zw^dIpB_4sS2t@BRt z<0uKp)~QBee?N`VKkeMD!g^Mr)FOVDc))TkES^7f(&)%^)tL7D1;_17B(v4yxgq2y zQ%CpVl}1(eh#pG5sq52B8{B}TkK5(-iQ{@<$tF91rPk( zU4Q|^*fx}MlH#3V@y(Kf<87?q*$LB{-LHPhscikv_qJ6^o+6=5|DDMCqpka{f2M5x zl(X@a1yfXZQRiOEK=_mCdq?0}S~EX_Z~j`-YU~Pni+FDrmJv0g-g!XdZ>|6T3Li8b zFVOK(wNoEK%-f_!$ksj3EDn5xREVge+evE}mzXa-B=f^as}}(QE+R90UL?Zs#;u2X z=#?LsjH{2#_)=Oa_@hnAGxE!L2~p(xOPjb<*iY5YF}oE9sud!`XxUudj~bN_ z?9!tlO=}h0R>*jKF@=C4eR6zn3|oHJ_>5UeV#6ZjLv)?d4Vwox%7UT8rTxnNK1T8t z9TeBAXSz#?ighaZ_O?Ve1dO6WBaS(a=bC_q6gC&kQ+>Dz5&1*RHZi>TS zd0?<};SzF_Uc_Na@}5V@bH zWdu>|W?M#%}jGt|~iP zc(@uZ4hl3@tTkj1z_y{AvtlHGz^s0KX#W$P!|V^F^0C}=fA%OQ?~fO!->Nsm4SxT~ ztbXd;gu5Z^Dntt(_@~jcDu-}Snh|07)!m+9S<88>fkM6|UKjpEVxZ<5+W)c~m(tof zfzN;UP;w6iXN=UBAP91(oN7@q{jqQ8^{IWT3XgAbDhOq){7?OA#oj}*?p$U6Tnq}G zCLIfkN!svEWs<-I7__0@<&Z(UQRd|Fsj7j+2^ks@KpzQ;_jsV2>u8i!Q%SyK3l&&I zy&X5#4p$bKd45@KvzvZUQkG8jxI1I0td5KjHMRr>`xuK8eJJ(=NLuv9Hrn`r^YAY6 zQXtG7(=qpl3ve9~2WD5*CYupc5yrG*qn$eCC){000mW000000{{RM z001ZeGh>Y%PmN{_hQS^hn5k{-qlQ&g`a=h!HHM8jRZTTiQ&m;fM-Q5Ssv-ch000;O zzy=bPDU&EUNx7oTAm%7_C_9wB>=~b+k3cU<7p05RMfs%sAla06N?hy??x1(ky=YUk zLAmVicMoS^YP4v3*)z&T00IC200093B1Am^Fat(%e!uqp4+#~R;Pj;MqO>vzuzq10 zhY>!eSI^j>gZ`Kx*x>4`!I53iI-cuf9^W*ZO5)Eg-J7#XqV0o1KCmAiQgoDaPlMM@ zG+>HmbJSZ+GUWHv^oXMCv<(MjHL+0P10V^*Ab(%PZ@YvL?%`ju({26msIW8>z!4M# z_Nph$`wID~)(zk47NQb~CSbWo?C5Dl7?fHkuOh*C`Cc~Glf6X#TU2>t%}FxxtOmvC z0oIE;PmjA0z8yhJ^76NO_GW*#ci%Ej&gOG7A?2%xRfjk|0tZwI#McGQdq(e{pRY)5 zQOQATH=(&aDjC6d=`V`eg$77U1qQpN%X_2Gt9PGxW2Py`&LzH~I$X7hi6f?44+?5K zH1B3}SaZCt3yAN@1{XJ%RER)1^{ucZMmMoZO^-b08sP#)ySAOJuzsh?-i_fJ6W9&d ziAWfC=im>`?Ga|9z)&d}w>JocuUGfvQuE2qO7_F$nFtgsO9$CGNoo4rp^vgFP<=C(?vj+FeuQ&!` zyJcRM*a|Bpgsqc3+u@myz|>0zafCz;UL>17N~N0ft=^`_nyE-Z`f^ZA#GCs{9T}^@ zZjEnGi=#L_o>ty1eW)-9c^!_{LQ6DZo-p({*yijn=B-F_`to@**<|2p!3b%B>*ibF zuPW6QGih8OyE8hq$Fb(u`=rH8f>A?NfQ5UUXc46!u#t^+-n%`rV%O{2kPj#8%(z#Ad^x)PHyXz-zVz zh>_!g&!&U-u4y$BS|Lb_9QG<>(U|jMB;qlonlGF{rA8VCq*3=<1|EB%`=0;iE8^nu zc?u*e0K8WRfwFKhKe*H@l$RtDPEcfOaKE!nH@Sofj( z(qEwB0Q~8oB+(7JUnZVp2|vpklTJeRaKdWW8v3u}R`hN*6Vl zx%=C9{Q{d!&aM=Qt6}B&XuJxAPxKf^=>Y(%W35i=Zgn;B z^j6_&ms}Y|c&mDr>HRHMLDju-4^!*V6bMH2^KcIKs!qH8vv0Af3&5vxy(}g+ph!aW zB05E1eC~0m4!HAfPAT$xh3D9?P>KLPU&|VmcQ7?MoN*M)Eo+X#|1f`zxjT z_s0k0iS7<#Fsw>tv%cRp8bwvTdEo;{A9n*C?tS&dGynG|8WBbCyH+^G*?1>Xm^+JH z1<-PGeM7zvJ9^>W|CNiZb7yP_l09~=7Qz63TMuW43KGk5m&>h#2m~eb%nDweoV9}m zlj*^Q0gJF)OYy|6`RGmU2dy@CO}{851fxp$cJ?SB6(UdVCjfm8h6uc>XRpt#vmWm> ztK}Tco*!>I&Dr~f&%5OE<~2Q*lCpT9cdq4RTbZrJNf!efe)r{Zq+xG z?%lt6gKP$y02uL1Kb(VZhE=|i*V<`X6}avLeN7h*4312z_nWOJdIEh8|Gi$Sw_9&E z{OJ}!t3mCT2<&?+qMu20z*RS!T}SfLE|?WUSo2ekwYEFZPG&0V<5ZIL0lb}U0syar z3HAg0*T1)K<+`)DIZ&jR%U7@Ah2W)X>TE-_wCT=aq9S(Ibv(VL?9JutJ`dgF-Tj7N;N2v14>XU5x?PUpX7!ABy{dEya63#ee3j7#4xP=9}cIk=c51HmkC;=FvrFp$q zpJ<;#V#}~EKb_BJG3Vv6N@JlkU8oay@or*96^|lb9Gw|Kz(B!>J#@T_c4tY?!r#kn zT`icQS9`1e?+NAoUEazzieQ+su1Yh|{ISW;7p3t$tuz`pQ`nvB4`fZDx3jI6i(?Tj zqzkHXp@D6BzkHkag3hY<#R>|5qcv=Gs*UP!`7>yDZGy11-=;S8>+=BqGCn|^bl^NI z$j!sMFVMC2(9FO5XX8ORrsSV_^7i3+jhYLcK`_@_T5GdRuVoTg!RskCLIT~ z-gd~BIGE&8>gF$0^~i#e(KE$L^Eu?xHK#FPuc)GD7^^I7!L7uuH35D{ldA$TA(8m!{2HFbdhu ze68!oo-GBAwskm;-V6@_dGJWuiMAYXR`;QSDv)>aB^2u#20bsMNZEX#w{`M&&MfVD z1q29c!73KWxtpz^))9I3+kA?qGc}1mhvAjy{kJLGT(u-GV~m~ERqOxf8OQbAp&$GC z=2N@o+00wyRw;?C?W9cKCtIMDK#er0BY}(6(;|E7AB}^dJz{A)B2x2&qWR-fEuM&6 zwCIiAnV>3!JFFI6_#)A`4WH6o12Wim?UW-X=02e~YPncw#=CmqO`R5GN(4zg()~I9 z8h-1@UatK6HUnMSK0UlG4q9$xq4XNd&$OC>54Mo@R>s{8J}}hs>+QY1?hJi%%MB#S zHIc7}GuTYTcI~**beWdrIdblSy`0rr-otH4_#@n{3M%3jPol(EH-HD&&rRbNv0iKh zUd9*2VY9LnT!gN+rBm19(@WEizLt`OS8=m4`WbCL&TG9@jPhh>Rn+4e56Agx2$*iK zD2!YVU{N9HuFRccq~gpdtno=JZhU^oRTbX--LAYNWVc?9ubzfphde;$=v|lJ(QHZ3 zRuMLZ&)tug1-_<(;>@CJS5OkkzcuOm7fY&0_99@paeqq5%LXPR(OeF8q7f$E97RKY z9(zf7sr%T!dwv|rQh7Uum~uLPRW}5k$n3te79^b>w%_FVft(|A##9psJ|koa+AFf9?KXGfcV~Kg zwL)g&;Y(=THQn#s^l;0Irs=e$aLAO|ZRklljr<02<8JV+Xu&4BIJ06LdnxW6QTh==wQ!4?Wj?I^%$gmfS#SqdsryA^|@es@YN zI>o-|3ywvvb((H-K%?9*dVr`p_XjV!yY)`3zPAQgey4((5pkeb;Om+&*z+0)pPOz+GY`_zT; zP>rHbr9QP(Fg}rG+YIDAVEFXA+ef)*CRa6FZqPLH>39@2w0>=nHAWwKrfCCWQrQDw zg+w9Y7oa(_ib{DS^#$YXg;}M%C?BRk*yBY2jdnKLm}OKaSis@ua?Wh0>?}#qD$%ME zU|~61X2Zqq?V``hThOe(saX-XqX%DV zbf;f6u%$1?t3W2XwpSfwvJqzs!fACj{@C<;4>YCi;epj=l)yH-wT$*FRih#H3y4d#t+)Y5NlMiW)* z8mOu1Y*Q|LRwsozzXcxKEmqdPYPr;8yN|^di(qK&_(=m0ivbav5M3c`%P_g5&~C9< z8dxNm<&yejTIESt+$X^xLSvN#4l_XVPt{Z2LBfe$0gIcpdD8W1cQ#7UV+(wdX*)O(9OCMQf;oOm8#5^U(w2_B}pB`?4PFqhH~+6)mA=0q~m zO{^DRb+;zb2`I#B4f-g{J96>Lb}j@tc(d& zf*KEYz$4QmB?+0xAC!R`qaY`)8JyzEkM)4Z7f;F7q+>XO#7!M&Lxk@o_Y|5DfAMe$ zqF%A%3e|K!YvGE$ zEWu!DLNe1&E8)3t^8Uwz1q4LbQ^9|9?vKw2q2;sHZ(WI9!iF!k>_FKqKIFgl;D ze6HM08#n28(JPar>n9-njJ2BCSAztb_Q4JH3}Wlt`UP~)G`R|@X<_pi@$yu4d)tDP zjXce1M!N_zp5ImG{LO%CBci}`mlaJv>fO8+2tAx*6_*qpItwp4GjhR`mz{Jnfn(ei zKHuNg3gjU27_V;mwV!4SKsytwgJK(S*d3lg04ZreSg8erR?0Tuk zncd}l><$l4*AfO_7m|Ka@n*Fpw3MPgFR%gQCZG^u1zq%XaZXhxc6&47b> z)kF6om)O&M2hWAMdw~tAb1ZQnjgk@12S5sgvGh<9BmHstn`KJ#6IrPFueAyhzO&4_ zndYdF$35WE6&wv!sQT)$%MT_2dBjN*tn6a1^dP?k%ZQd}Orl zQk8fKy!gDd^_MjHkrx|Mz&!F=xz4gNb!KukEsky6sgDd+1AveLRq8Vk;1{z6ErX1F zKDW?#Ys(w!pW)dwJukv=o%y{DVsS~OP>rf4yv&{{HB`(b!l%x+gcKEAWKTj`!MLwpZylln3@~b*1Z)Fxf9ZJ@u^_-cj;<4X3KSn% z0J*mbbGP>v+3=+ViFZjI$r3z9Y$vnQqHkyMrX-axY|q< zj7EmnacXwB7uU*M9E2BKtAUXA&adG6#<2xj-2Ib)w^sHZB5z12Y(>tg_OwFHKw)z$ zkng^=1)1a6Cf46o^;%%6*0RTA!yAW!UsIJqzldYtg0*-X_V^TRqI92^EAGDTNM7Rv zyOD;ZuN9kTL045u>-x9Deac9Ew6@&NURL)xiZ)K`M9!+csy_)~%&ut1sswIR7$`_s z@GEKckbm6@!ZRw8rLBv>c#B36ujT7k z+%L2_#Zc(aRl6Q}m>f1k*zS=%{bs%Rdd(jorJW&r^G7k@Ac2z=Z)@>8+Tkr$rv6Xp zbTw%2OI#I0eWj@-bPt)^^_Oe+BuoKsn(p?<>Por7VMD-+gmFsgKU}VjDN5?dPz9oah|7f!G?;v|w zy1nF;xo}`zeMg8YFT;K)uNJb0%czU)FEsm%Op)ce?JoAd@~*R;tJ8;tC%P>ytW>e; zEf2O96aMMoVZo%Oye`T?Su0)HZEQUMHfpJ2`Qg2<1uCw_1QAPIWg;_Q8qtM3o(ei# zr2!afA2b1{*z3tP!SL6-IK%B?r{WL+{TiUCuLYg__>UXh`284^wY{QtMEQL!P^nB4 zEJ&4a!~2~&`eg2BBfkdgIi|kbzWlM~pU*^pboN;yPhS_xU|Ej^h$mYJqoYm%gthO= zrGIwTF|PV2)kMir>N@b80kRj=w7|`P7sT#k-qS({gOy-5L-6c|TU=1pZX#a>QIj)D zJGwr)#^Jbg?lQAV3a889xwY>or{wPxhSRnF>Ac9aF9PaVWMV;c-B0+z;%~&7D7$*` zmYczER+bfKn+`6C%g4|-a6e!dDxhOi3cW|-Jr_gK^v&WNb~yzq@3r~dPvNJU&?ssK zD|fDI;Nth!-~)N%1u@cZCp06&1unxoc^9Q3u`D!n`yg&Is1ouz-u4eFtY4Rw-iYvz z+YqOhOA<-EN`%qc1KnM};j8m!mNb`DycaC3)9m%nHdfCRed1>ORKFM!O z{Wa!y2JiNh0O_aw0;|#R8yFFwdC76Rup^|%7j1`sjHxyNR(~{d2<(HS50+wr(Ec7V zAkF!i2_S{dV?}59#lrt98x?-{hD(1_cb%No4B8x4BZFFIo87?jBg+aLtQMekG_BgB z9=va|O&@>AdG|FbY9l`J5wmpXefF~CijzOl1}aK-4ifeKBp2PuCiLw_4{*x+UD|{F zmWLg(cEM5T8r0*A{Aq6_lB5D}A&Rqk*m6SZ(U4lN)5_|9UO%ZcrTM>g1w}}XAo_i5 zP6l#?dLj{fUwJZ`SU^mZr%w1q1dA2-eW;&3jwNlfPsg;8L$=zN>ergfW|SV5-CneR zM8m000^s|5!#1cWYB+%r?RbHNIWdFwHy$W~Xdh~xy#nsAM6S7|mT5FbTB2zu88!Fq zTwa_PRItor>@!{Y%pOTr?nvd}?l9vqY()Do(?urFg8zbEm!83uqZrCoFM8f!acnA} z7|UtBMu7M_lqntY%{`mKp5c75Q>{|X304ldf**r&?=R(LlcPx9)jD&U>gkQGCqn(w zqx~i|)_wel2mL+N+W?XJ0BUo-SUZ2fN zpX(MDQEqDE9fxr$79R_u(#HX2fqA|R<~)bIU$7MgvOtgrimsmzDDBg?gFKa3nKu|A>O*zVRT@_1)&u?R8vT!eFbyOrxhR8&5h*Jairx;#i-_a!t%%TaQ%> z^7~L@0pwFrFOdb6cuTy-yA>;ytR9rG}QA?FuQ{pQ_EI{vfXcePIu_A&*cT#qcutiX9DP@JF@%tzG zTp<&DMNADbU=%mCzW)2Eb8Z=+|;(>u=lI>~xTx^l1R80vp(MT;9th+A{xeC&!bs7s8`gk&Wu3K(#- zNCXk)cA7fm<~lF}y2O&P$fJ5yb&%-%0$zn|925rI)(9Z<`}KREdTu+~K-IwW%muF{ z;?Db7dM=QeyKTc2Grw;}g0R4RJ;BJ&zxUM7YgJ!Arq@x(&`S9U5Bwxurv1wts+U*4 z@^$`tkdN*@p7Ye9l>=6H_F_L_?flTT4AB5f?*j>yKcQ?w;jcd6JLiL^Wy7DX#dRQ^ zbvJ{-%75L=q;c01ObtATl-Tex67*!m0k5;&u*vVJsHpM&j@2dc`{VD|611C5WnbZJ zb+7>Q_JbC!J`JoY>?sl#0}PP&J*?&d;5MWR+B|eixSj;~eznk88$3HC!|?;sb)l>M z;9**{3(8j%5qM?j`etas($J?i>4t$Pa#P5Bd4L7XLnXH~#MDU@22@`_`F33nLmobp{s>5r&+pHQ+!?jM}*-`qPV1Ac#hwKa`MvJ%)Ymtfc z_`%_wDo@_%@1|Er5Rs_)wT24!+z{_!=41P7KCl04#sUHv%A0z_TK*Y4$w;ecErL_@ zirS?CBj$qD8i;iEFi2KwrQNgtwlw zL5`=wqeTJ+kOS6m<`(}F{e9^TsK{U?;-#N~#(q4JH{ zU7cRZ1dKH&m}x>@POo3cmg2#OS7`|&DXP;#&mCLICg>ICsUb+OBZm0FewPHKQ~2`A zm!910xM>Fl^h|b|N$Ep4n&&BSUBoT0ro)|&GW~tgY|>oR-?&I(GXpQizfc4o9NBP! z6bFc>YgUwz!V#yO>l1xC(E0Qg2ysX{-Tp+?Q?s$JyvGcG;SG`?d!%ke1F`89UJZBwNH7!MQP5n zHghKbKZ*p=LHCKffQmz6$>?&l=&6(UP!=3mtbwzS^`p=z7msG3DTZBjhZjqL>i zC4U4p|CAFVxQq*E+%JNC<*DmEgWbFw+x2(BFSMOnefaf-@;8)x<-b*&tX;o|-sIHs zWcUHkM}GPUj8bAM&u|RfX=KN+Be7T#%(Mf4@pmckSRimX+rx)F=5ZfEpO$?z)Roh& zpiT7^x%JJ;#@<*Tv6U(GNU~|3`bM5;T&?i*1=U%AF%3%f@4ZC2xWXTb8_qD=AAo2l z^a})q8`uNIEEuIz^Ksl0r+;%iY`X60N1D_2Iy_nN2B%6)33``N(y;mmU*!LNraW+v z3|GKiuKzmRq{?skQB3#JEU0({n1Ks8?`=wD+YM*?f~cPVgw{7(E^NeKDA~$$@mx)j z#^VGG{6=pp+m4lZppEGTiqPwgn0>bb0eqX0RC$uDS~VY-O#jN0n{nZju>r2np4*=M30i)%$G(|$-#BU58cmm z;)sCBlfA3gG?HFbfBC)3A>L9a@y)~u)J=)>04|v$#FwERu+weAFHqAmRKpwAxDv8V z&Yn&;DBW8zTK7EFMNf*)bmBKEW8arqUG+)}eNP>%$s|&J9V--+=|i&NgFB+_L~F&B zW(JqnOL}g0;wlUL8l!0wg{=6R;eJta^u;aXI0_B>ctsf#8M~#}ze!@9D@$$Sd2Gta zr?=gX@!R#`$;P=&JVM9tI5|lv(XE6U9K}cx@>X7DOpvIEOn+Ikz^I;WBwJf5{fz$O z2tj*VrJ0pxSfe@qXB?)YQMb{-d1LfX){uRRi+VC`$oiap|NpC;Z;pQ58CXUG07MKyJl(2UAO>VqHLEJ8yJnoBB5~@`;9`+td4vaM2&-k_fbcF9_RKh-A)OL0)#2`uZxIKK(k6hixzL^4QzAoS&VW)Jl95=q|GLA_NO3pw2ogcu4 zxnp9gvcGQ(>%xp+^ms)y8>KK}w!!X*ue5hIBm9;SC;IirU_vU{SdbJP<>`WjQ+LKnc=l&~JDV2K)?8}C zYFZXB<_Dx%2(b>T@WJ^Nntl^sb$D`r{DQ7f!-vnEa_MLT;L_3XAB#0N%e1V1%-irlFxbJLCSC7cheMR%*yl~V>_y*FxqcV|qMyMgBj=8M7bgVvIa3X#+@ifF7 zdtUINy6vfEEQ3aBtXy3DEp&MXb=0kBOhA(N)1z>3p7QJK-{kFG9*!Fpc!AngN+2V! zBRiO|wUp6IZ*trRG<46Tv+)tM=*ndH0(UEt#$X`pj&O>tn^FJ1yFC*6i?x_5fpU)DU3L85FGJ8A{U3IJf3J>AeNRF6uMZ7LaQyogt1U4wZ3Bu3{IYCJqioLw1}P9g|wUI2}CviEdWv^pQGC#`@S0B&Q;nxXcnPUzOrl1j(Wb5n_B;Ukoszxt$FiJ>SuYmWYIa^ zUgKOcH^_49Qwc;ro}^|Ec^ahE?rJ|bX%oYk#?c}%Nt&Yz)RM=4uDwZ#9Y7k*%Wsz! z(~~(Hfiqwqa3j)FB^s0I*T@bnRV(%r>ObAZa6hpqgnt1~KC)C#x2kGqQwY#0dgj?W z;ow$h=kBwsBQS102HG_-aHr~9)o(-j^b6qgMlS)B2_nUlI#zYM`0&Ia)n9|k9^zkG zU90_wr$)`IhJot^une}(>3c2aOKwH1p7XS@W#OW;@1<$p|BlM<+gbBU$m82&rf*+5 z9Ox+)n8$-Mar<~3WTRq5FcY&2v8et~V30P3WG+{R76?l9`oL?!L%4pUw5=p#IKb*$ zhkk|gWIm@hb>^=u)N?&lm2}!-z+iNsUMP3@a}P{DhRO=%4ACuFkb|h&^YImM7EU z1w3z_cptk7$hXaAr&Fqo8IqlM>z?0`vz0ZchJIOW9HP$WZ)0(aHG0$>46#A;;H_?2 zYIxH65OdM6y4;Q;;bW^7>yxi}7~4)f21Jx>Y?VQq5c@EL&2ewo;~SaU5PZVgP8t-a zh$g>TZzRI{>LC7~4_z(yAS(LMbFqq(<j;o$hM`cP_y#{O-cF<+NXY z-3_ktXlcGUYr9Knss!=&j!)jTd*^3q&AqpuZ3Lxd(2DAq|S6^|O)Mu;!{a{8q z!7}d0=r;E{>Fpj;T(I9x4Slt&@xdun|2B~@ze6}!DObv|uSJodZ;qnZpl+^qi1=Vz zXh9*H+L`i252zRscoq_B-yR5X27P1={yRmzZoq&1#V}%ML$Hf9W5Mdynw{CGL=Sk% zY(J>E5MbPyt@(lgtO=Zf1;}C^NAu_ME+K_b6J|T{iBDMg!oIulqdUtrOq&nM?j=7A z+g4B(r0>IG1pmMiW{0wSU33RFHts}4VsI2yZ$^83pj&A_K=>8g@(N^RH+clvnjb<7 zT56ma1Q$9G?p?e};|D=(w^z@6dL07K{U$s+x%TQGo1LVO;%;1bE3AAWUIu9TAo`pZe7NeD>+RIu6oQ2)( zZ=1}+%YS#?f%~T&|EbU^Ii4X-u}Lv)wmJcM)(wQU6p;)aejJcEqk-! zTMD|F;f$jdJ4Z?YH$LwjZ^BiBnaV-A%6=U-6GJs}S#a`X-*a3*JmXcJEmMO07;|{` zQ*F5+QexhYEd+Y66%nSHijI#+u)RQ!!WgYeM%C)vs$JI%B2TkD6>;7H(x-UB)4ZAC z9lC(QMUo!aiw@!k$H493vTrCcu`>|6u7zZtbk;z)@LbMkP1Ox>T*5Zan<6P$`f4c9 z9bkuYZ|eTJ^#*==Pf-ddP~RvPkp4jU^yl0#n3Kp*Z6~FhcFNy^>3!?UF@mGq<|V$} z_W6wH%7nB+(q(5?`z5%pf{@WYciCOKq|5b~YeI~wie&ccxnRKPygP6+&?MUh=_5zL zT1UXY9)#0qYT}D4^fPZ8Qj%egb!ulTul3ryAS$`MNhAor?)O_PedFF((Bx8$b6c(J zeX0UpM345Q$W~r#pRUSlcKcCxczOrI8Pq)gaAW%cOaGv6bp zm%UfgB-G%l4(TTZKQuUdBrrWdce%!1c2rFC9zJ#Xt40?z(K!&WOpj#$7-G1#kpFwz z1EZ}_<)c>$Cz!G)$BDt!vkR83lklX>pF!Mm_{}S8h2j%A@;z3I!h1_J7U{&kC3x7Mu z_HP+eRFmB3E1V*WEpc&yWA!~pfB}9>gY4T`Uiegw z84U9dFw?BF`N_@~EiQS_Q};(VAO`v}JZ?Nzw7BjLLLU#2@^LnvU(k{BQz%bA?h3Kg z`D=V#<0Vxe(8;`Ci7^Jym)=%vJ2z>0oW;dXtQ8pilOhEUcgsz!Mm>dej+%3u&=&r^ zDpZTxD1-?6*l2uDB#nu$V-mi)rJLoeD@_0vM0sPlf2_!Gdwd=9WlAV7ldiHd;06Yp z*bT5?Y+V2J00PQ62Y&Z?twTmLAWaZ~bQWL&>$8Ai?P-90(RB$J%emvlZKaL7Q|Ct# zV!`LruDWdgdL>rw7Su=Br3+hSHp0f?tT+N-3pid~v?8;6vA`)s0aE0T(rOPKH*l9+ zDnG=QvdaaSkyw`?U@=5fm=lt@2b{ubl4|f$g2QKP(4MaI(HVVBZK(=wpR=)SY6E zSkGcdW+xL6VG$O(;~JR8SdSFJec$6*oVNFTcXlTyRin$gYTcc%r#EQytQothtc4>1 zVLSEceR{l}!{7q$R8_hbUw&UQKr}^ZM69X@V$iFNrf-gVH{EUrOsi9ne$&n~1s39# zwZ+A}`8TwH&@K2>T02?%uTIqMVI251{~hnmTI=`aeDQGrIdI=ZZjI7?HMUm^kxW|0 z=A`%ZgX~gQ(B0!-+^Tf#;IB6oMq7m+yaax&uwQnXYM07^sjmU|WoY_Rv{t0x+^Bx2 zhOcgr^F9(#hQN!yjS<$_XH0^?AxL{i&)T@!8%2oZ)<;aOSOS2Y6U>&ztJ6^}05L$$ zzm82%ObWZdvX+8wKt$+36VZH$m1V!=PdyoJo6d>g#5D<}^G4(*mZ#zLj2Bk7IY*j8 zTkiiceS{tWGtz`1-QAVxu&}$uLE7$aYDDo%Xcf{rA79}gZscyKB~R=(wng3)z)x;o z{lX-_7Q?2#laRACg9A09K*O;6$;JKX=9cGGqj3&g-F<5vju9GbSFJl8t-O7W0r^*J zOk8kIl(8(x8y$wYyD3-@9-aN9Fyb4#atw$>x#G@Vrur%dz8jCX1v4E%&2eYeNP#WP zZ5G2>6t^yO<{n#_wESt=)KC3z4;pL6Wn-yteHr!~=pR;I!AkLR2zRT#UA@~4A^Uc| z@r7Eo?Ol0dz+#)FtPEc+KlO4%$Sg;-n|`YB)Q9OrCivwhzrzz1Jil^d8y*!wHfHo= zcfO|;((~MH+KTk6`JucY(Pvq}WpR@ZK8znzk~SY_+7p*Oyrf^G{m2aSs?zQ+zGc5; z!js2$Ezu98)*S_X?o>35Fz)5`@wWbQ6eG~h&4ACN1ch4`jyW1*i3gcprgp`zo7G0w z!%{<$Ijg1DeWq}{+EN~g_wDJXZwpWLM9S}YDfAg2M8Y;( zFdRcdO}dZXy&g7&E+{MK=`hQ z>*I5)>iNHO%Ncu?+ru_^w>a7)F|AQgD}sPIBNmuSqk2ErKGkkW%;A#Sjhe-cbf-3n zfne{?G-2PYCFtzdK?Rn^SP>cZo^?G1fqEvHC@?MbiI!T=BAI7XN#T`Zw@@wMPl({0 z`Du@l=U5$2QleZ_jUn5W~|~g9wES8bq@4B^t4O^S6itK*@o)BBbVu$gxGFGRp#2f@F>IjXZ9n{V-TBn zTk^F2Qb&?e#8G=~#-vkD?=Ry^H;$hJ09(jkd+HUN6nP{=@*w9s19)u2 z!3l!AxcC|DdWr8&#T-w@9Z0Ts8vx#P`-Nl934(7XKCj^Tk_k;yv;}2X3c}cRBt|F0aG56hqDURgD#!CGOqFQ*T#oLQ+Xl4{-)WL$`6yAuYHk zUk2J1xal9I-Eoy!8N(S5D1#xFwnapi=ekifF3b``xo4K2z+*i;HDz>CZhPLcfIlo6 zf9xt@YbA&0yAxO%6Q$2?Z^ET}B*?dBC87pUw_nvH%pU(hsjYZOxv|(l5|ow61|}9) zVg8!aN0(|kaNH~y%Ac_AuMn3an|iDEPf@%l~6dvDjQ1$j5+sRR-@`MFSmv!4XpY{qvo%Ko|pKX=3)y94-&_;j2 za(5K+l)94p z#caE?r9$$(WJu>zmrb5Ho!$DyI(OYn#=ium`6F5NFWrl7)RcF3#?a-H#Q!lrA5kDe z&ronOW@Om$9yJ6%al>YAr}$Bwm;a^Rw<7i*8er-=rAum3AwHNpHDTVJkL~^lZP@%* z*gfIH*D$Cc6})jMM|=ZJ`nYt^!Pk7xt21)m;XRMyBjMA2MC$H6;o@mYLHy5~trlK= zMah8!I>;pr8%WC*o3&HoDRtCpHkN7Ft#Od|_W8w`JSTzUMzudG~Jhl zOd~t(rq<$9NjQeRoY-#BOy8U_FF9t6h0l&O4=4|NwTRr?*P~0!n<;!3*o#tF#I`b~ z*qjc9o-jFOPIO51;74=IhG=wA1sL)4eizG%hF-@fY|#NZ@?yD}iqw9|X3FkznJ<%9 zlOPt~>QYcyv>}wnaZ+lSUQJh}vv+voG$uF2YAD^MGJGOE4B0Z$+ypbc8Qsr=H^i%1 zt5jZ!#J{cYSpkhp@H@w$DOYqdCj>`3dSw^OnBhC;;b^&~R7^p0aUN?K5{ML@m7nIR ziEvYO{6c-o=s~$h*#{p8VLO+x>WsCESRRDXj)DJrPiwygu?5yDE8o4A}{m=(m=S z!tzw&yJ!*1etJ+>uFg9HExC8AlG&rs(1lnb?P>Anl3eyKDnayKFv&G){M?t$oVt zzhP~W++8FY&6+$N>fErDc{x3r=2P=9{QBgF=I(1t>uo2&{d;r!)LS|pw|(?EKg+~G z^-`&CD;q*BogF4*y`vd_I)sAe>B`&c_}a;rkhnDQq&xC&zv~osO$oiX`72pP6|<4) zFakE`0CH;pN+w~_Rf0D^eucid*Oy%B;r^F1Bjwe8XY`R zlWLB1p=_@(YN;|bemAy*C@Ahn(L^>D2Y6LAA}JLaen-tsRz38aeFqks>bHR1ICl3W zP5#{JNN=B)p4a7m0pFj)x#aWlvm@#4a!AYZ8wmTaZ}3|bZVJk;Ev~A40!qL|IQcI} z0f5RPXjzm|&Iqq8Vp>&WozVa)J1C$Kl?4vew~X-zabDrKP3*Y}VsHf-K1@>|ms@KO z&2K(ohbVEqc#!L0RF}GKAWXwi#y>nP>-Icz`f{Y#vMZwzpiVcJ!*G!7xs4?#jq z9Nq$pCOj0)*bh+n4Ok+jMiVRU16;k?U0)hl%6^Wc_BD1JxbBL($-eyDTIgt7(;Khy zr#`Y#ucGu0s&X?NZA9>>f_qt*pWI*`iA;Aiz$5A4d#j=ObdVMEI0vvZI2bar-IQNX zHPb@YGZ$%1fe=2{0E4#@#7GeAm|(1~w%EJ46_47Havawm@U5=rd1u`p9R`QbtT^3qNVc z4&p!Eoq8q$FyUHYU$$YeP>Ft#F6JcYvN_J@DM}PK0+Obq!CD^yrvfH35B{pW0JyD$ zJ|0=&u#fwvgIE~WJRRQq_B8l^Hx);xYJG+Uw?JLd?kcYZb3x^&&2XM>HnVln%N_pH)1=H92n`9I{v>?(kT;t!281$%F z+Db^77|J&WGonKzh0ZS+ASQB;= z;H~#}?96=taY!m3R~~4F2}#F!A`=XMJ2x_*yCsu{$9*WVJ#y2!-n_qa9HGgjx{0*p z9J5*gI}9!5?#^p#`CHf}gY3#iTgYF3JJx`Ia=OEMrHlpd6N9;1!f)x|!|gkb6f_Kx%UnwQnc6!#%~3<72Hy@i!!tv&Ik^$znq-291O zKTXd~c^vF+um^|?A~fXY$i5;3JVaY6E6~TA!BAm~ZHM0UHN7QTNC;6TgI;EF7=zE* zHuQls#by$CdMHuzs1Ao(8nudvZjGJpsW#Z!dqJjqB@#;wACN5)CBdei37$F~j|?fc z`z+QlIXkOxvhP6Y+1NLf~)y8%HR5kAE zARQqHI~qURc30}1UbfH-hM8(T!p4@R6ryYA=aA_vbZ-DSq=uejY^rY4 zD`}+X>gUzLEIwLs_RH2ZLiyl%4@13utV69q-Pg=J%lB;|X@04H9#x_6(EfT;@qq-j z&W6J~N%?HMnwL}|DGw>Cf$!LXT_fl3Jit(LJ0fz@RRs!aMqvcs9%8aNmU+9S3qCYY zo=K!@{bzUa=->2lpFm}eDQ~Q%2^;A#hb%9{!-me2Wv8@lUuW^W^GR1ec?0Gip!sSI z8&m3>u2Qm5&X)J)^3J8;>=ks;I-1YP_TiLkpSiq|yQUxZ;ZTFu&058L3Z^@GSLsYT z@;mI$$iN#;1wi*JD;yJZw+JkrfIqvtt64W*o+Td<{ zTbx1Iwr{}eWA_j@7hZrBul(>2^f+EsPa^Yhe}E(ZDqY|xk34;0g7fa`et(^<`u{oI zL{{kap;}V6cxJc>>_F_*%K)5@ z(^VVco*n=IuLFKou=bi9SL2%AmSn>QH=Z*AMao&g4!Het{x1sx3YYJ*emlW4LnFyi z@|p)@g@Rt&n^nla+>&}1D#*zyr~unBikHRivt_8Vczae|3_Zdkfu=)R>^7#9H@e~+BoBvJ@%q3$E=Uh{Pcd?Rn#%>SVo#&i3gDfb3U*bjhb|%E)-OEz4*qL; z2$V@{RHPrtGmgt(jrm156_udjq`&F_)3UvNgx-<;^>xf6V(5F;c=vX>Qmf1eQ3$r2 zedqW4yx;BG1{2F#V7I$lYft?Rg#DRTn4UZlKRVbQOX`e&&&YqUC#}6Y7-BIevMj%o~iD# ziGM^9x~!g!TG(eu#i5ie=1~I#<<;qR`B9f?oYf_gx9eEBV8ty+;6}JwCeS6{x;v|q zJGeH2*7E(4gOl-3$a7f-hb|p@Y?D_Jc|D#sDKZRR!~ZS}auTJE^adb68Nd1qcf>N0BBbKs=(&GMm_#oecgf=jcxS0)GT zKMb}YgR5nE3L?)&ZgAll7$1v0=YF>xLei_)t)H0>I#zySfK$kWYSL$LH924ByMMeE z>RKlsWNrl4z+jv&h@`l##r8!8+9B|uFDP)ztKgQw$j{vh!P1eg-l~kcOvhN5=B?Wx zebp-Qe&+)T7tGRHRh45UgRC|n?5;nFkw#-r4 zlO)qR`Ss(Tz4lav(c<(7QNoBhBXtIBO7Twxz-O!|{`-=ucvyetCb)NAZ-dTlMVU8l zS8f$~_Ztk2&iICir5VsynC^ij%>zZE{od(lbY}c0UafdvG*#JD)3;Q|}(`5LU@h zr&rp7oQ~vdkvqDsqpf1~Y5)Qv%~4gL7xmT0h>2{=&KY*=(>9O=kc&Q+rnZ%R*$)t5 z$)>KC^9PrgfJJ^dYAP;yYP^d7bmV8d0@+JB$XV4v=I_DiD^u3@^OJsg(xKSviiKHg zuU);?A{iHlevWZ`eWx|82zY1hN~wm_^mtEPRVeIp(GCq|GTeG~5rnX2>yzEzRAUx? zjLY*0yNFS^dPIknp;zm`aNG6YA&*d(wkLt@@^x5l?W<$tfq9I+TzDwEmSY82wNNwd%Y0G&w)nYdZJZuhtL`jqduRGxhxmQMpme$F z9_=diH##ilurJsN_&;7X-K#9Q@-gZ8Nj8=$!cP@)v9G zfgbd7pWCt8&1Mh4snb;zzDI8Ta_QuR2xj7IZB4xPOGI!8u;d`I<%YgTvFIm#aWm=` zOudJQwAp|NB3|S*(CFpQIrE_Dgt8T2saWd+V{doP5jxWL+9J38HevyvOSannLH~Zx zjU(L0|TDuI9x2=>oiR#^-jh*~`*C-%Xa~`wnPq!|Y@J7C>nd{<8 zefZnNLQdIx0{`}&6;)4F*)w3}CaIReOZHvTWT{l)lh%>;^D1RTE~G~uwjeiBpqP14 zILVcCHgcAl#0yQBpdX&h$&+W=c*7&V0AAEM_0xPJST>b2QG^g?iH%g@yp|lJ%*c)3u!hB5A?=A>}tGlOgUiM zy`81fORqB#7^v<0YteNzyV>h6Xa4f8NDNu`m@;pJ%B*;hXs=XQJM03}jjP*18En&P zp9IaZL|Hn#Q7@E3IAp-vA37u@V`1Y;5c~Dri8MY46`c+grb9u^YJ5oNs2-Xr@BSIm zxi;KO$A71NH-oyAK(27H2L{;Jn!CmVHA&`An>J{-Ym3Mf_2qM)6S2L(#zFWluYOb^ z7dO}uL|Mpcr@!si6Q};Uon*HTn&$SLiUTtoH(6K5)K(1!z01Tje9j%2w}8?Ry|(s3 z`nrbO*|@+;^gx*p&$Ym^`YP1yKr+cm(UaK+<(TRjGb}1ydaS;P+?Q< z0B1TQS#ykf04M$I84I2-PS za6$n?4$FC?ak#(Dx7g5Ld{{5%ebGjJBNjfb`w?#Dhv-Q1t51qtLC3}5D5kftCAH>- zv~Ow9mQ??p!|S{9Vyd%e9_Yog`*}S;UJsqhz@4xBHRVs8{T2)?fc_oI{;tiJX;XoI zGd#zT@hLS_)@mf~2YIeNlQnHUJhg%iiDm*h883FbWEEQEwcn#xI%%}31OA;-=S$XWcTLq&zK)IAfaMmCh}#EIYYd19jjx^(oa{|LkkH_L~9 zRlv|PMbC}k;?)}P<;*Ik(J*}PW4L32&G}?v*d8zY{5MLM64B_O!nLWS6%SxMLbdo~PQUm~H^)kvi@}G1lVrwm)qjHw zs@5o}=H>tUXxM!`)NU@?MtD-R7Bm{jSxQp&byMmC=2K>kPP05NrVDR5bb|A##N=pM za)c2&EBHm6@v`2?n>+-uk^0x=GwQ%WInJRf2YJyz7p1iXd_$`sLYaydvT)z%T4Oc*gQOiw&qry>>`+ zK>DulrjHwp5TB&>P>fgk0+Gx(G=?^Mb@N6(rJ`95$pL%l&w6lG5$MR&Ve&dg`8$XY zqE3v3(&-uJVNC#b;RpJ>fY$mM!jW~iEj0wTpo~)Q9WeGj+(l-d_!y{;=*#HJo-JLj zawFp}8~moZ%l6*SOCkR9yezaJT2xf%IY}=uqT151pc!m;Owf)o@d|x3X2=?fsC@c3 zbHx;Dv*t8V551mB2;%t2FCe2f|`aJP)@2#^H&j$vy5I$_{5pGjVmDG2MR8=-0Qj z=RGAS6IDL9nCUC%ZuZ$@3c188_Q;*-(Al5s;ng6+dI)$6Pf=pn(dJV{*i=Ie~S`*mxBSl;ZDEE*tK$S>)x=dk*eRzgOlv>)r2D+WM-mAdP+EzP8}cYfbA-Xsr~ zfL+<_7!u66`@Cb+=+5)Prmq1s-hVxj3HF@+HS)X$$$kr}|0(4u62 zRI;%6HMkJE-b8LXN0R1UrR(7Mnngi{kKzxkCareMyB;pSNALy(ncRo!yVF|l7`!v< zIrRs92ik-iMyM%Qw}3lT_0ip&4qi*74v$-8Q7stJt@t!G(Uz2I><@5hRB`-OyZ_++ zbuwhKR&}`FFcyk%CW8a37Z3Ci%W&3QOR?|Yms0vZYvoBOx^-P&U>>RsVwG~KBT@vR z52%~v3j^*qa=4nsNxsaOC#CNpq)8vm%`M-wKi{))*X3|cUbVh0CIf1o$yUNG1*M05 z&f8HAV)wp$!YQ;*%}^wT?X%0u(Jb-fedp5APA)dm8SfbJo=VaXk<*_t?ZgKFs*ium z>GdtZLZEbMRj2HEqvJjA)2GrjR@QjgUgw!<1s;Os*KR2$bmwj|#OY6msZ*b}00ZB0 z6R%RjC-SG{bd}9G#;LnYx@O5A-bY|~nN!$auOjmM5lZzp4&(C$a@5lW8{p zGXSb|>&7Qd73bwegIogXUA`J`f2ncX;m@N3@Y&{d*i75^;HtM$tzs~o`S9^?Z7x%L~e^ldmIwVl1j z7yTjaDEf)&2smusQu?}x^H3E6cQE2<+P|0)KaiWZo=BRSr)hc|3$`r0?W=?KP%5sN zMAZTnSRH5P!0=yF>Fh@Q@^Ci87r$L^pjo{?F?T=szj`o4xj{j&)7JzDLY>=XGpD>> z;Kb>=c`M10ea=G%j(s1Lj2!dXZ0OW}+d9$qPC=5@?Y(4Z@DYmv5+?`7!gNAm+t~( z4lqsbBWt>iA=Lx}VcJK*a`&aJ-<16{?C^nO{@X&U`tOZdb!4v zh#(J0SlbQKM-?CpGgLLW$~;lR=L5DA9#H=1hH)DK2Vzys{}iF-`8VJp?yZfpD9hbW}2z$-NQ z4d5aDp>6jy;3u8&gI2s+iIzVLeBzgEHspfZS#&o}xg3AbLEIPV=(^`}pW&~Ck_~_C z-0a@4>N3jbAgA@zy8*;#@t!5Db2q-|2awDE*EEtNGW5?rdy{%U$CBSkBY}9A zWuqsTO{g5r+44JqF@nqcF9VyK2a0cW&v!#y^iGHEg<$^BCR&&tzIVFwn=49N2(kV@ zsc99lD_lzk%Eo3bC-8Q!RS!^Kukb~9#r@8nEgHw9o-fJQqi=CL2;1Q|{rf|$ZAF}^ zGq}^9)op-yv1QbP1q$Z+GNo7?eMoZ0H)PetXrhBxIf;c_pmAK-6do}130`JCCC|RDQ@vI z80V*=jamW8*ZP!WQc#&MNWdODH^WqQR}FKe(l@cO@yzH9c1p5+Lo4!6{onO zRoYT^PB%;!_%@%~QI^8zcD#(2M?zz{j7@ub1jb(I7S|w&+f7De<8`;d6P?MIwN_`^)8!r3lEt+n#N;;`qNG(0?W!ZxBDI3p(R9e9OIFm*@am0^@BegEctdT zG5GDXjGp|qk`Vz}z#QYvzBCRD-+w!|M=dK?Z`YQtEM6oLR`t^00;(*65K4&#i&>|( zD0+kat@3ECmA{uR_)CLYpFX|pjtDYTny!3%9|uwMg(;le!Db@(c(bQK_cz3O7~H6! zPPNZ`w!WX(NVfMPzqR?h5KmYQ8nV<6b~;WIzx$V*`G>^O`^N-x+H-J>;5xMjhv<`*(o*4>X}B3vzK8K;eh0kY z)5|+)Zd@#KLW|fw1($o8E(i^whBY1Ag1F9;^+gyVA;@vHnCSw&?m~qvTl=Rw=U(f7 z+SljRP5Y6UGf5_T>v~(=%E^&S#r$`b|GG=M2HFD`go!&y;G#8yw1N})=BE1nYM zqD^I2dT}Zoedq-4Z8`dN3mZRl&g$W2!bHZSewtK zS0bE%@Vl>1PLJd2e1kOCAx!WQvcq9Zy8d37+Z2>y_H}CFmbLKnj+txHaz%2i`p80k zvA4)U-2&>^CDJH5-e;P~7-sNV`^7iO6pUjR>I71Vn-x!Qq;rXfXr>ThFOiW(Xz2QR z?^ki7I=`)gmUAqT-^ccq`$2ELC_S~@^`0tvA^AJupQl@fnRB;y$Lf{an&BliWci{8s)Tp%B<*({=ePJd?JwuDaSz?2a z7HDOI4~5&}y{;yV6K3T>$=bsRD(@4%h!D3wJ_yrQaSL5OM=cFnWMd9S(esV(Ecn}8uqP980_w@ zknrsxvtX3O{ji51@&+Vpu8+vX<)N+hB!pJk*Jt+T;?ULaYC37{zkEW_r(BKVp z?8z$te^?!yg0NTb^M+f1bSNB4gIM1sNL1z4Z|;%`m3a!E>r$%BZ<_*(L?Gx{*PMHg zz~oYX$&-O42WVU@$~6_gdGQcN*IAK#y3V%=81+zUjbK z0D>3PIO)Z6N65!f&T`>;b#eyDNksebpc&2Gq-u@n?rZcyg%q@)kut2Z4|BV;vkS*Y z)Y;`A%k`mru5PYF`YVRltg>O_kR)R?kj!+qv6sJdYb1V+4it*)uv%Q>1 zdq=@&c42N-?jH00e-ER6yZ4^OOc2jqRr_G0ha*qIZ`S83}~ z8u^Hmd&r3h^U*$b#%AK0uQN|FiS1I`8w+Zv-^w9S_)H0;V3E=!I6IZoz#w76^$wWQ z4XB*0S`GabE?fn~(F`o*bDfML(A;LJYwe0H;ks4swOW2q9xgj{MIhurwdouA0mXW2 z%?nIC9)_oM4h%_P`d*bq%yU_WOn2ei^`T$>dL&yq<5IoEn0lRVJUy1GOZ4VIl~K&I zr>N}ea9Q+Nj{YM5IW`<{Kj|`p^@&hPr(1u|JJ^C7b)Uk7uZ2@|IBylMmkmqfA^Xi2 zCtMjndU|3RkqP*G>+lprV?bwrg|GWQ>?lvccc}>j00miw$0w|TfI9~PwS~e}q_*f% z_HQ}Ih^Mb)3R7Q%vIYsiMUy}MZ!d1r(RLnN!eWQ>xlA^14jVG?`sy>2pYM}X3D$j8 z`(j5A*K`H$S^0L`{2m9-tQY%dd-z33*hfT ziZ7c0wt@l_6hPa<@;iKiuv>8RpDdW#+;O2HSNC=#b&8!1D2T(?Sho`FF%5Q64`c81T3V7lzl}4aRH~e?SiLQ*VV$XGfcP zHdX@3-v-r#pP>e4xZhPy&@EAZXpG;vo@q@YbzvI7LG2e`ak@fU`ev^!T>-41yj+xB zFefExNm1OGUmIItb)hXINmr9YTs{UAGRISQOUSGacG0nX)EO^-d74o_kS(&Srgn6^ zeFOe%{9vSB5>hHjj`_QILwhIV5p_|jcyjn(Kj8*?`ojO}@L*%fJ!{KPGdQYQlvh8o z32QwD_nX#<$z-+q;ADwk`Isi(0;e-XRJ zSW|;(&L4Ci$q`+X-gMukAIF)k^1|w@%UNZxhMX5uS901*;9Og)$=lZnBQ~mb+qDfj zZjT&Yvt+oBv%g3`eyLc4?w{Qq=kZ&iOt;s8R?dUGDdKd~;Xq9UR77&9#&^~!0~-WTAB_O5YhH-x!lk&bXvfK&Yp4DRf28&wOh}MI$zp z9y0F?4+|<~8Bgu-9zGsGgA&hQ9EdDG z!#lM<*;o8GFZ_MG_vb+6Ymb=bUE#|$G~!FY9YNu8;HW&Uv4LS2z7o{ct>VR(OM5#{SENY<;jk@pVnwx*VpL z8`}P<{0dEoAyMw+bL)*k@rQON!y1+bL;pl3-Xo5J;q|WeaMuLY+U0ZST6Ceix%@lm z@=)=S{Ld5RAYD_?}Vh+ zD1K}qbH`R5D@;|#!_u>~_LJ`?2|Mm@8NROBD>kFR)QmZ%>TqBD+@Q0xZ%>LT=C$p7 zzW$SJRofkd0;f*)^Hc&c_cor{X!??aNb+So_sh2abU_saKU;m)|NElHMflH2=1n+S zSN{Wa1JFZTCs5nmcQ;KACA7%{x$;J9XPh0>|s@NA056a)U(eEFU+k==tH+D%?Sa*70;lE zcg);%)6u3K8F_)ewMk2qmIV^zZD%OH_Gucu!MDwYgn#){4rR6;;Kx&^4>;i8a8y2B z86^qB6WA!NYB!D^y<%7Q5kNL22hZu&6h0XJQPoUhy4?EWh&{pwFHILjEXtx@H$y8; zqp`iLTq^-kS+R(>@j>-ZQ!PfO=#2JLx%o!h84>Y1rBC-0>ryg&F~6yq!fuEuXVi1u z)LW^0EJa2A8^~53V3XHBj@c40KX|TQFh|G2iOXID7?ffEJ2xk#X5B(BfSFt5`v33j z)KtlhKYL-?{z)(Hy-p1p#V;3+wEB)hcT+F zB}!>#WGVJN^e7J5B3036h^jKavA}=tagsYq>;Zt*1q$28*7HaD2TBBonx6;Mx%^%h z1Y^EGnZmH4HpAU>(RaY@=!=hf#^6S+W;f=p$Vxp(1yqI%x;_JHnDgy@ZaF?&Y#@(h zK6ox!$X2IJ@7VUBWq*E=L6v@rl@KpCRfhWlut5r zBEE*lCKoAKXYPAhUWJiT)vDX^*7Lq>GZOuiv;u_%1nrW@wBa^9?XY)|KX zr8g7`ZCst)l~zi%SO5lmAAsMvO_mpoZqf<|U473BfM5y(j;&5-?9Gf@_nkDNwH>&4P4KC3DuO@H! z$qT<<`scnrZ;l|koAjsospXB;O61OHVf{FXznkU}pXBw?>5a&54sRFw|Jm&%u0|YM zP`&Ze3`?t28xyud5?bW4C0Oy6?9mAg(ybnXON{_^EpXxLoUjNEOTP#H5od766VPKeEgHgD0lu z3AjCVRi4ydEHc&bt6P4)UDf2;|V)0%07^4gc+dA#?}+9=Iui*#4Bj8@lT-k?uvpinl~@myY1b-1Aw2F zIR?e>&G{Kdb$+J02y{9Mt4-Ox<%ZJ0)s^;c8hRUicU8=(w`_Q{E_6paez5^bKPw6- z)Xv5%Ss8B>@5U155L|}Qp(pbRgHjHRzGyS^q;R~

NnO9}Wxd7Fs6Lt3JPDth-O+ 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

K`OXFkiwy6@0dVJtm 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

r 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⁡W{VKi`OS0NWh60_K+IM3Wc=bh=b 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 z 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

p5C$(hwP4EcI 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Ⓢxp^IPNa(>A9!sr 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%0A20l%UYr167c0WF7Wlv** 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®{H?q6ZF?=NBti@z`$5 z8UKE`?(Ev-lHis({>mg=q8EG*ZClaaHb=ofHkBqBe|nVF@BfGvI+A3DTF=6Q4)yQ0 zgX6Lz4aaRVTCASEGFwIoGM^!mdng&xz)nC z-B4|}!Hc^vr_MR8YD4w5s8m5=I-lw8zdX-Y=|m31*y}`HVDiuKaO5|6D=XI5SKjig zyPq#v8MI$t#un*f7LB*AJIc<~>2iN!L{Zo3qNX5&J7wAUw^3oa8@66Y#GX)(DSMuP z>MCez=xjsB?CU+JTS!q{n3#ekydW$Slb05l4W)&*`17mtzC{^}WJ&*}cG}$TFF_`!$SC>@}-@8=y9+#W{PdQ9$>nWg$C_ZNFm-jzM$v?M+vEGSs zJ$n1yZy#b1lBevnf!yV6PqD<%E8gh9qk-+N(w($jMW~jW?q|d>opsV$Z3fW)RFWe2 zFUZrWcBw_5*C%66zEI9^lUKX5r9z}EIh_1PJgHsdo=VyE^k^{P7#L$KJt?Dxw%HoO z=Q7{Mx>`C5XtnM}mHy;pN0f1QH~W@fAE3!DgKYSn3bNjnM!lWb&>qN-|9yxUHig|F$vesLT}jN_kuIjy(6`DvVL#{!o$k5;d7Ib<dWKS z`BL`3x*^l=?jHFvbP2|%;_9>Onn?o%bW+O8FhtHTXJ}{*!IEY#d&OcwL8>1HueD39 zTFl;-g;mu~aCVFMB zP9Xy%g+Z&p;BvN>@blE{fITDuz)V!}&HLr$>279 zAOrt+pw5U6k4L{aGN{l#zK#gANVGX7_6q+=3(nv-{%Vd=SUbpi`KIkVouS40nImbp z`;9G;pY}AeWmcATMui(q%H~t3lDfDf=N65p7LL7uJMqH~-kWhw#{k8*i z?Ydp#pO%Q(CpJ^opuX?rL>*ieTDc{f653pVC4&{EZ4+#oSKZ))%!kp!)i+f)Tt7QW zXd{Px86%=CqBMwFWyO5r|nwZm$6C?1Xt7{#LWKNlzwS6Sp;Q znFxjw%Hk0l{TSsu;sm|_;>n}l0uf_6n~(PVx?tghpXb~B8r&5CMaTq`HiQ|wW|}Ij zcC1FpV=Qqt!CEaW!<1qhTm_RBe*5 z~XGnL#9p$4Ge zz6>A#^D|}p(!Edt$(Tc!LkO2rOsH@o^@>b=5vG9t?0zWbx`+vcHUZ=I>=4F2CP;Ws zkfpUsIRP5G0|lpePQKijJo5Ff`8g)_XI`AuM1gjmcNN%0Q@r5NzdAyJJc1X0jzYP7 z-Z|~q{o@6KEL!B4Cp43ZKs{^fdUW^ruJfI9RX?#NH3U_1C$VllrpDfQODKsCYQKS8 zKI4IZxe>L#h6UM1#CKu~+f4q!`eQmbeuW2OXP+EYW?|%FUX(_&!Y37^+$JjP8{P*37PElS$l}Trj8YY`L#Q2fygb7VH zO|k6!(@|db-pqIe9zl2Z1JNM!T}844L~ls+N^Wn*W-snJSfNw45!)uwR0!H6d6dL= zZ+<|Fi=S_Xj!~w6_u;0JOxeoEH`0+&kuUM*KtBh?j{28vEfRq3+!vhOcRb6qtmxHy zhBMc6BfyTWHXEeyuL6Dm=sekCgSjE|$E!bA@E*L+j=8jQp0wuY0%W-MKn4D3$}wq5 zVP-!|yUbG8zby9l^>y>R4pBQS08$8;gddth80a=F8_o5WZupv1t1IQS!TFWq7?~4v>wL<`8e0vV{xv+@ffrbC0|k4N>sJ)*tV!9wW#TvAw=mQWYqZ9 zg%lnbLC;kpKf-!XnHbzMz0fzuxH#on!hN(D@WAf>$2gn_7xPIY<1??O9sy%xux&%+ z7rnW>(ONXAf^Xw50|(6D%oWH!K!jg+0T63G)Tgghb{8)lo_7zT_+W19%Oyv{oph^} zD3&_~Z8l$iT(~BfcAEDL>-Yfh9ueVyKpF|aP)r?X^sYr=$F@)aue)nn1==d=Rm}jW+HM2F*95tb ztDEuK&E-It13<5^xX*e}$KpHIY+mDXQSW-y?JG-XRSR?F@e>}9zrwo>6gHHTV3hX0 zf6_ik03{E;kyFG*;|~nWr?`{z^=h=ly*^MY9Faolq1)H^B@d82Nfqk;zzW1{J;BxL z_sALn{TSiF?T2>>Q=TDHFsM7ssxNTW7Lmhz1MP&veTNwflNw5vt?}u@qV+?F0sjpE ztC0cf(yfL7l9rd?x>sLYuMQm7uw!s_imV3n02L`fK?>YYCl86;0k_N1zcd8uU1W&n zl4rb)1jW@ogBAsq6J*_(;9jsSFkiq8YQPjLid+SmLQzRMXL?vQ&4d zuHDn(f_Nf;jeJ9ANs3_ zbGtHkOUeqMKDh@c#(V4c`c&27_K$O0$UV4N2I!y4;%*IGLBXG=j6@O@(KL?m{M#Hi zTZ2cF&K@r4n5JwWCzdDLU4XpUuGd|oEbDj%Zbxq~j>AcYM3m?QiVud1ZNdZDUh7T! z%?BLWE%K++{BhF{%1^#u8^sgP$Z6ssW1Odzjk~GtVuAETU+4UmjB>Se+MUPCRgduXxC0L`e~3A!efPrb+;y4Z_7wmwt5tYl zIU&l#YX%gb5j@fwm+u+tCqaWm zP=%8OVO2CEp1>2GnhuGG1@>JWkqR#ogEN_b5yVe8c1AgYex_^@sP;=ve5x%cHF0iPGvjH zn;4%}pN=M3|C%Q`9}T5C>XA808!%GNHr~6Lh+n?Nc3qmCu4yzF1uDlB7 zQ;d47M3*QXS1cA<{lyt7k3X&nr7glc4$kI0C|1Mk6rX*MfF>5$CFUe9FD!vxIIA+0 zGjNw0cJ<9RiQFhdQeGD-&eHw6Nc-F5X;;Tmj#j*we}B(W;yNBAQx(5CcAxy)w{}a? z>n>E6H;?{;78dAJUvo?bIPx+yAdIHNnb+Q1(W;fB?RF6Mlf`N7)j6s5(`5KkieINC z7O2)&@jJX?-E)ASwC0T*lrE_7=ql$70TK`VR+0Yx)vkfijnnAo0bIuK^|AnFpGVz$ z0^sLS>X|lAR#7Lnq*6|HIjT`Ad)=?_Kc9qspY!$$R=X`yUiwE}RyH3eGJL-IGWU7M zAWPGlTYPPHHotg%p!AdDeDNgs{3&k?uA#FGXr`+tx2xd^3V`&{<+ijzQ_|BMM*rbe ze?eGlnEx`nNSk_{;I@k1jD`vj$J=ofQ!bBZAXE&uL?Ffr<|7}s=_bd7T-1HlY+BC}EOOzt;O(g9r{ zS3+6Am$?DO^c%<|ST0Zt5n`!iF%Hkj+!dKEv?UD^I%}r2=cB*a0lHIiL?#7MMe7G@*%RnsU~pAcen_Qy-FtSRrUxj`pfbg|72D zq^FIRIvT2~)++1%?hsxDzq)&q-hR~PlyVpU*Zh`=}i0I6>t8Cey|+QiiRX zt5er4?ev-yx3!2jCR5!8l~OOw8YHwceo!(DtVXo-Cp2`=Dl5_Q!O@@qU@q2-)@vf@ z7Q(jBXr||Pm@?g5uNJ>bzhMctBj!a4uRG#NW!Wa#R6UoaT$LG%oe?{n2MHMPm3DL6 zdaQ7ATgS_R6_UEp%|Xr=}&mXu*|EN=$od2ib-_V7>Jxoj<)pKb-6wgKKGEPmB zi~~P6oEMX#cN0pJAznj@c{EbhtK$edku6hvx*eW~9`m#eu__rUr` z%SBEW1+^QG`G;|*2aaPhq%KER$skQe?;=Yr`1=oS4)clGRE)PMDPVy2yj>D?}hKlIhD~w z8pFD06CwSk_;$E*f7cecXq&{Zw!v72m%x3@I)Yhxk=3htGj<&?;o*LQ&(5!048+^~ zjBl~*4;%1KOoI;@lno^SNm$e4rbf1zLTCV%7nO3eFGu-k#*+4f)>e><^qoTFe9S)X ze|lQobKJJ`%@CvJ`HC#HI7K*)`OQTs;jDd+86K5oK&=4rXGz z-lC|)n+1^LJ3_{T6aYWMrpWe++OCO-?l83ztrF{} z30f7dV95J!TP9ydjt)(xJ=8rVc-^dnphM;$qWe%E}JX20Vb_%95fj`e$fg%6=Luu3TQ$^r9hih0VyA1jRI* zeU(QkOKa*uFMGOuS#fMx5(-q~z~Z(&$7bOnC$r~`0_Nb-W{W2sr|wjgytIf~F;Wq* zy0KS8btp}`->~~RanDbwMfcrec?!jTU>DV{)sWJZ4=o9W`9ERnJMJe^Al(x`R5uJl1oI& zy3%g-(1c*fm(JU|;>Cg6ZdnL^!E$MUNX)a(zsrg^X6TDNDRe0{oyZ z#RuaGQl?iG)#gbBpEmJ&`UEUI4>a`5f&DH-oE_vclk<|Nv-4@QrTn>2#c!3%Z^Is0mahb~s|GY$_%j`qtk9evbcO|_JQc7H0!_pqGt8IFG)0^0FtCr?nc4_26 z7xufy$FkPq02^z2bc@)fw`I7wE-aHUcp$7S;zV@AhW%`_vAbu}g+cY?*K=X&w$^TQ zr1Ea+)@l;%Hy`a;ry!cVAn+IU^K75Y?KnhOJRTGzSy{j`S%i*^xNyzWgpjt+o+l0AuxJ?e2v;P9`R6OfR(E!b@q z_NS_5q*mq>Xx+Um24xg4@)94le~MP@J2ntC?B%x4o@&UialfjuHa^>>B@rXcKCZ;rSp$-O7}^J5jh|UI&JIE9m^c)6rKhrW28cDxs&H(#njG= zKD8nE7fN)g)MXoiCleGLGIF+S)7FDzNkqmKdK&j&DIBaGjtUx1#EC>fabNQDJSCHB zni9LZFFFt;1?bO1&v#bofk1eXIOo4aZIx}BIxj+*Qo<}j*W`+D-DsKgASfLKiACxv z=?GkzC&Z#CC83PL|YjjZLI#> z&iXE@ZwGG|&JO%<#G}D>GVbTQvBbXq7!4W4$U!-6mfrtKp(wgmKOU>02jaU2#pycf z6167}U)gAQ^yes@8GM#dT?Ej(w-RO^dMv6e(VR%_nvgbM?Mj4dyQ)Z$CP#%g=us#A zNLdsIPbfEh#b88>jqEsakBrCGuXxDz!8ox^8Z1nm$D_vdrHQPRBJun2zH}TDBpwff z0smgk7+_X6G}KNoUy6@Jp<|F=B})YO zfq2*T04=1X!sgp*xgcA%KUHs0Okft~25A|1^gr%y%kSDP;6yw{SdX3L@bYE(Mh-$B zqvYbH_|4K$+uKb0sQ0ry!k+(yLRp-kL2%gi_)?Aj*+h@S=+s(^jU)&mBk~GE$8xUV zp9&xV=wSlItTG{wA=sN+u0a)@f$l;@xOY|5N3NN!q`3!OtB0dH=y8EXUBxPgny%8w zeJ#CL{ER#GV(X!F0Y5|@|3dNqUF|>y$zcc@hjjFZT!(h(2M&scd{nmEJn_V;pt zAnngL+jqrCz97>*oy!5@19$$%r75K}DjJHK-F&T`GB~v9t1$`o{L({u^|i7yzk>a7 zj*et*;NsIi3tTY-GoHz&bo{YNB$kMP)psWmY0e-YJKVL9mzvtl5*+M0}O z#*|1x^-PJ_usAFtlq_HrX0vlX8R<+Uc3g%jA<3PPl$tGPBk;u0K33D(Tl?7hZ)|P0 z#q?tWPw^za5gQ5#@WIZUbT84=Yt=SII5>Ucd#jUUG5^O+pD10d?n|bd@pT&jx#K8> zc?wd&X1)^e#R1h-X){ji=U2*Ao$!~|pF!Q&$lK)3c??TKLQ0`JPu_gZdzIFV%Wy`C zTIpM6K}BsSPU7`+Vw9$3|7$2L*>VOv?z4V0sgnzfj*b|zZ~Oi6 z56fO{1T`<7df1w>2F9Gg6GVUurCezi|3PI=L%;fDoVU-W+OFW#ShG)!HdogVC%fe| zXWUqZG7IGT#%$Vvwj4`~;x!iMvG^n74?8e_o?BBlkF8yi=>4bZ_Od|q5$6ldm$ai` z$Cl9ZcxXW&I|9~Y3wgh}8jk&A^TdqbPZWEOsqCn`=P<)4`BuDxs+{F!$7GE${ndu4 ziFvg4s?Ps+C}o}lv7_TG|L>$y53}TqjeP;R%zvfzz)nnvFELXV=)UxTV;mu?c4U*m zLlK5s>5Y!*Rms!62AFhl6fVh$*id(I+r)nQA3w;-d_0HYoaA=Vvr}UWPUEL`mK3Wb zot7lY&P;dOcED;&+CA+~_awwa)dzkVpv+is5sC%*D{ zJ=DdU+*A|>(RdpxTw;cxV-aX!(Aknxb;ACh#eEd^5j|myJo}e%3_{ENhQO?Qy8B@@ zfD7SyQvf8f!5eUX!(eTc-0gTn*yX{?+?}O$ZSRxDziQXQ)BR_}2UG=-+IC(*t13&1 zp1(y-qqCiNmdnOBx4*}qiIW@L29$v#{soW>CO5jCUl#sy_AfVI@J(+(ZrRn`O-2ouDuljil68SEu&d%5CApAg40c74MwUvpnP zw#T`(w_74wH#X%Szt*QsNJp#-zXr!5FRFi6hgC(d=1sKPas=JUd{w}U3o}L=$==qo z-v2VF-8MkX7Ee~+&?1`!=r(7=wR~E2MBsr4jgXJ<3qwFrfIwYO9B+cxElv!-FVM>$ zzI&OuaX5zQf6ZL~h3(G{M9lPPq9m@MpiOKP=(9c|`m8~=semYKng8WQli@_5+Kg9M z>yl`!68n%h@+1zwsDOOgpX{F`_g(bhsrkHHFp1ZyPN<3 zIY7q0pi4K`DWd;7oAU>zzr*h!hIDAj<^~EAD{=bu=cH?|o#cMo`&$8=5T!sr_LxU6INp3qzqCtJiy zah`yk?qnROnX28Mlplr4?sh%Kb6JGp{-pctgLu)0a6(^I9*z?N_N-ID5#U;$?@iTc*oRX z?{IMK`gq0r{22!GnQLwGT^6~4czJxBG$DjNIuzXF&I0eVqcKQ}k%1~=oE=`!#S7Ps zMr}GBS?@^H9Q8puU{sbh`U%6_-A%R&lG9vW0VS=lykn-i8yTti(ynxowjH$E^NsIb zYmqpX=&Kx|KPcM2zWudpTE5Ln<9@f|hObrDuRj;@K(ei>6#d51YXFR4l;M4YxACr# z9SJ8X5y|JhE->!Me2=oaN}B-e7a@0FPP%VQ2$~gzg#Y%NMY`|X1E&?oF=qU6a#J>* z)>4POa=v6QDnb0wN`c=>u>Th?2zsPjhQnY8sVw4|dLIr*bGJ$zz)bKS|L7yEOY4Bu z^FD(_`y`RE(BBBp1Pu=XPd>>NWU7*GuhaO85cWuy%%#V(Ef8--ib!dv0ZL+ivND0y zLS|U~%?kP!1}sxsTnpEh4vu=eENdn#1VdIcK!^gv%mXUE4&GYV0|3~}PtVeL^iJD< z41Nds0)Ub2cFZx=E&P!xNapirx?KFtYV9G|*svg`=k`5+)!wJUmoNY8~pJVf+56)OQltYD8%_<%jL?!Cb6g;K!Mdx2Jw2-bvJT%T=v$l?60H>{2{lI>%5-%u(N&P zUPw06&Vjn{#Q3WQz(oFVp~u`-cy8S*HGboJjywArKO1d@2?z+uCTt2XAfw(fTfXjY z8n}x!!`$Qey-WqCJKQudr8S4&tQs&5mLOP$y=|vtw#|MTKThc>#Eh5@3|H=BI&6&O z8MwIP=tEO8Nvn+XMz)j9Z%#H2U9o*#3T`5l7?iYZHoQr^GtUuyZ-HMA`xOeNLyL9i zUHgreQ4SWmM(K%@)tK!ra=vsaiK6d;7yFkp_%QIsFP%2ue6_ZGOy{}Znfb#zxKQ(A z^v@qN%?QBo2UO>CTD%{So>I%4(EB>{JY^UYU;6-ZRqba*!R-t4{&WIB;A$WRfQcpFCS2a4Vl}3FCLjojK~UQ=7&)dx;Q1g5 z3CJj?QzgEr5!8qtKO=6k_0AiT5}KU%cB_LV|8`~9S((@x@+%%8ww*i%((}2dsKNyi zT6K#n=p9^5uoR1T&re;TwsBQv7$+99({9vC(6nMC-m_p%om6HM%p4BWMq=Z0OD~EB zti*)G6Zo|jE4JINHQuiVF4ORe2XL0eF$^WWX*rvDfs zVg(MFj8%=_^7bwxv_jaBs4fgA96lRaE85wK3|{M|M`*4rLPXygs7{BtSs7ZMbZv_U z!&`7MWmR$7OUZK}VwcGp-dhn?njuJt3%1Hp8}7x%fuyqy9J*P*xZ&Uqt~Pj19-{3h zIgwZ>p4eFIF1>=sY7zeC8Z({cukcPe^YNziXq~ka5b|oOucd+LJlOF-$kiKaZ(N6; z&6T6vl$e5SLQnh5aeTX9`m4LCy@%DVB5zEsKG_5rulc&42lwEScTVfDt@3_ ziZ?)WiHP@I)__xkyb8qa&kWZ+rL)A#El)s%ETyjS?*D0tJ9SDn$5Pn#*E}HbkW-RUQZ-LWNnzi@4Oe{dS0bVTvD74&*t$Q33t+`wqM=$}iL6&aN*# zg^CpB#@SnlaM6G5l_}c{&LoU0I?;ylkbrX65pser468e-@ln_`i_0nMc3ufa8%^(g z`&Ib~4L&*_+F@PQuKV;JzaM@`tP?#%>AHDQwxPY;Fak|Y%mzKjUvMaYhathYoR=l; zb^~ZF7q_`HN8iCeo%UF9ZL9@^nq*{g9B)~<)L7&|InN^lsEM#TEISyl@x`Z4YlD&M zs@KWCR+AJmO>V+gmT{KEDHAkZ3~jIW&OAP2Oi*!>lQXpDQ$3M-jkNZ$tIj&T`u$v+ zOLH5+x~SxhB4oL(k@dOW@^BMN_bW(QPDtjeV8Fn1j zpz!Tf|GJ_#y-!!H%I$%!GVrt<9k+`=;|$t4df#{ZbkOf}hCM}!R~g0?8*~x)-%$AF z*!~$atL^k@Y3yh_6hqCAaQ-spcj|CwPC~ekJe{L%2c7iOhGJ6Uzpxf!9V`BOLa>-v zr6_$| zj&hb<-Di*_fq%5iXO>U5f>|AAIik3+rX@hMITF_SmlzimZ6k%ewFK=DNNv)w?uxiY z!}e5IJrc9b)JkKS zZran1$&8#W$VKLa1j))YAl+psz@O>nqg&mJX8f+ACR%4@jZ0QE64CBA!Pbs84&#h1 zw~_tgX4;_44%;JbP6)LshB~`yHE#6e7FWeEeZ%34R6t_Euszveb%a2zBfBuMCo+R| zg4GloOW8Tn*RiA|L1-ExB>OqcjJ>=Iy^v;}2O@21o}$y(oCl+Q6DR4OTh4CGnjfq9 z6mR)ZN1vq^!hBs*(z9a7Ef9{`ved`R3m zex_Zg;=DD9pIprQ*w6o>PQ_r@War*wa&+Uw6>u)?62Q7A1uH4DEibA4 z0pBxBPXe7|tp_F@OWsz+677`DtT3Bb3tnwpVPijb@^+&!;jGs(HZ_3Vr4C?9&2`#p z-^7LvXOtG3R{Gu6jSj;tYU zR^n!#scq->ou>&F7{nNMkyub4cjUzR`7H!lXYR~j!4u>&JZAa%Teh}L^MZuCdU$Z; zcg+X?yljFi%`c3E9H0mO8at8rR#_UG@=bNx&A7^MUKWwst0CtY7kG|- zLLLS^$6nv)o=KJUbqcQdz~mW#9mDps8($f{)XdKFTE9e=tkkuw=1H+j-4YGQNTe*# zJ(8Qyrr~PELwgC4Tt2=apAGPWqpp(t(W?+*ul!4=b^r8duH9g3fNvZZR4OWDT$`>1}VVeUz*YmLGGpA_vpK|4qgfcjBQ z8Ala_s8MR`*lI!<`O|sZx9P@p7kPpi_E7Pts#yfEFx)UH0^KS`4v`qx@-5U>=>Ej# z!hUAwf;Dl=nuZpyB@K_{dcgbWO$km~kw+*TUvrhlRiW@8adR#Q$Yu-C(<;}G_ZeYp z%dz>RMFuH zH{|VTWUN%Bp>U>G`~CpT>%h8}y*XtO^4y7O(CK;=t(q18bj~vK{xKy44U}2jB_K-% z%ASdJe@Ii@BP~okbfJ{7_#W0(e?*;18)8ZLB9O%P#_^9wfPO$J=@gT)mT0KSW-VHe ztmlcsopBs9P{ITH6ygd$!bT~Y$-w23LDbZ7A`PX$HNL%szMYMB!Jx5s7(rJgr zssGq$9^FMP+dcFGIxE9Blwl~16S+U=pfS6%5zG)OktUV0Ib3m}rKzc~psKKnstnvX zI7>+Pw*{$yTm9A33T3@+S_0$BdyW1**mW0k(yK(WjT&*ovY)xv@>fuJc&NqVU9MGm zGn`JM+HN{RAC? z5cB!-)I;<_TlchpbjVPeeBPA%?205)QsyGr(5-v)R%7%|uqO%U%9-9TcL_izWSX zaKaxC>ic<4V(OXKTT03`a8s7`8jr12bOw(U7DYuK#%q~f7kwA*?wJ0fd9wEv8iQ?b z`NNl#ImVHybAlaNJEs%bQa$(HKt(=PlF`5OO%Q@oNOOk$qp*R$sx2I!jdxc9s{H)( zK-wkCW}9~LoWM*+A$nNE&v!AolZemjr+b2ppS|5T+cD|fax?v426C+uGvk}B?4_3_vwLeookC<8jLt>gbv*00qQ)kV-+n~z)~S?< zrFx+5Huq|MWpto;43-}Q?egn#b}7%l%e94j0p_ScoHI6 z6SzAX>zcbQ;r@KEM*^fIL|j1eij`pB{3p7YL?)L9|3+`NE^$qY>!R%sD&#KVR8tvM zy=2!n+m5j5d#Yl{*->f+vr9VO@D%tK7Qv;T9bTk9nyCFS33)z5%Cm;*px6Ap{U5&e z_+P;S!EQmqB|ge6ysfn{)w(`vM+wU@Vk>?6yHdaa)?o_VY(LCDj7KLZ?TvHyJ_yAf zJC7nK9-Xq@U!sX$idgT>PR#4?`kq(~xf0H>jIGPPi5ux#jj3M$i21~e2^_b7aUIaq z6gP<(E)-Fi!wI6H4x0lU@vHE|rEgudmmj6rvl`77BISV#H5tE7s^KYq^<(w>EU%vz zsNTky=18TejY1CVsmnv-UzplZ(J#&^P&~nU)=TLqO#*f#^(h@Zob#U;CPc~QRuc`+ zW)+tdC$^#t#=laFdg%CH`B=dipb7F6we5@re0qj2>%I*xewv*gIuHMx zLL^{5LWUwwAyL(G46}kor8zg^X!wG0m?DfLin1ILW*%4)qFtR*XFmDwt>}K04^zRA zZ?Tery2!v2qmtZ$%D9>{Hbl(r`X=XK$i3OdNxMfo2 z+k~KZ8=)5X^Ay-Yq@=zYLKY#Y>w+ByLMQ0btVhq$CpJZv)B&=82=0XV)bMzHzrP>D zC4d+LOMNp>nPm&^0}kVUCr36tuLSc$#pcykG9-P%)s*?UswQJ4fGL=qkn~?_6-k6p z{^XzV7U!GJ7$sEze9b|#y~D?wyJoe&(_2oa$N${gQG>ni#o|t;vdUk-*yFJl3|5VC zMKL~>YUeqtIRh_SbbxQ>R1IThcZuqAOF{t(o#qO;-fi%3jm*0z4=Q(}Kv)g=Rn{}I`_^ct7hX3* z$`D%d?Ieh8@8Lq}GZfWf0yM6|zJUv#&FIO%W&eNl<8EpW0Y4Ovk8_YR_Eweno%Cob zYISKvcF{CE*r_D$Fu8qcc|T>U0fJq|I{gC7e(wCC@8Q$G4`LS>N`Ew@8Rg&b%l=aO z;na1(4v9UI#p)NWbBpYpMm~+O*6jV~L1T%6dZm-Vr4bHl@5Oa=$m4Hk-2-Tw4tJjD zt3BNFbY<;_o_zqo^ z$nNl+?%Z~3-2d~+1Hu?E1KjH1E*p1}p9RgFIMf+oM%3-Hr?yIBc{S4$g9w8BijNTd3R1?F>j=1D)cM51_ML*r}>h+z{_jfc0GQyGE^=z=EG@i0 zYMLRtS&wzLRk6opOJ~GYdP=fuwe06Mc(mt+q~dj1Dt|&pqWt|dK!fTo4JC)|Ypc@U zpA6L>f3eV->Xl`y0lS3@KN_vq>y#VWufN0Hq_e;Bsh$nYz8_Mobh_Nr5b6LWt4j;f zTAQXIE4%06aljX zL-JMSpjvrc|M$EjPm&gjxdb>TG^5L^H@Ba9a`W@)U55PJ-wV}MP2fFC=SJAMQmRkw zt$Om#|6vS7`>&8)S&@ShuAW6?2JWH&D^Z=gth#5Xi6E%GgT`JIra7F>PwZoiMU!rjq03!rWJso|}<9Y%E}PkYJy`{V`N$G#-3Xlf_OisL+SnPjPj76qv*8N7~$0Qv9V>Hd_d~KdZVi z0OynBOa~9=IFXn#oVlVoEt|C^0V`l;F70oxLtf}wv#%6sx~7Y~w`Rqv8?`C8ASh@Z z`PMJ$^36A65#A^zg4M!FJ1P_WMu_V4*YWvFfXztX?~H`WJU3P~RpBt+jL#U1`s#_h zpz*zx`hErDlx;V#cHTHtx^b@Orr@Is?AtBkbi=~j-g&kC=K7oo$?%_(SG4(gvS{XN zxTsJxaXZRlaMPdaG^AR*&H^$V=%pGWKy&O|pJ%8IvDulhNqYP6gIx-V zirDBW@W75^6Nwov8#c$vv{2QC+->6i@o^>UYQoDnfH^s~Y3uSB4Bz$dH|=W+dX~K2 zJ64vJlJTj=;3g(`hz0%fm}<5F>zEwF*kQd=Njta%qao|Ood=-q5QR?&a6EO5+u!^{y3HT-vlrDG5^)nBJzp#__5Gq98dBfXH(n1oxL zv36enr?h4#=Bwl)4rzY0FjOvUsnQ+w-wE3uw=y|A9s2=`<5^V@3sR{DD~higL>Geq z=u{|L2aSxXkF!+$U);Vcu<)cN;7w7FhuvGhS=MH=0Goz^UZ9IxM0s_eOB$RW)0+cX zhezcI6vlD>y%uQU_zMVW=(BGh-ND9ra~+-V!!H|x$LHV|32$pj4!oCl$(?+g;|^9GbAgIyKH18xYl`Euk-uClSPp4FJH^%KbBB?cMJ$VBgv13)b@2d zr8GG?Wgb05#{~>_YfpX&uDtS8q~jREkvVJ{GmF3CL)2^1xZZ8RpP?%p|KfV->b=yV zO@E#+2V26jb{2tXjw=7i zF*)Es6$E|)YyCGV7KfLjrZ{KkOHMhES!t{if|@@+ATNDIK8uE zvm^;$kCFQj*q8$tuX=FHE-rF>S?e6XHBxMdU1+)$V{*CrtDoxd77XQW{0&~;amLRH zB7bSgg%YtR1t;8QKk#FNeEBjvy1*fVb;csfrrBxba*yxsmcf6v+QTe~gjlLBGHWmz zo4CTehH(}n>3E{Z)LA7K9Dk_rR4c`s!wAFNNGxL<49!!FC1&!2?8CI=%d;VEmr>be+=Mhy9TTi zCaS#pTxu)By@-0Y4kTk$3MTZI2%`wn2L~l7)>k3Ts&!-2P8zh(V6aKc2*ZS%E%{6N zDGcO5mYJZz0+MnS__B0DKYS*($Ld(zdA;ofyyP4UsZOc;9-tH67%k^)uUc{Y0UA;2 z#A@|kGD&snxfIbl5LT^&ur@rEHewoQ#tD8VaUmOySC&2QsSeaAI@CX*H^nv-HvW&! zOhD;^rw2=rSa~h$xvR$fF4`qjPL70slmhGHe=TaVd99D(B#)v@V#$T37yJ~8QYB#a z&qo;9p9z_gv7-Ijnuye`pd*So7X=&y2zVvR?BEoe%p15aR4)FwqlA&Ww^c#y>4lKH zL|6(ZHEWqAIAb<|5Hy_`S$huS%PpvQcg-TnZ5css|9=?lWO#AWZ>VrdBJ`ijcU@9a<8S>^%0b19Wf^=6)%wUWSX>N+h6i_WdSLtNR-we2;6JlGVr2=DN8~bj9aQ z$^0%+>Z#^KlC|nrLaRgnr=Vl)plYkIOuamN!5PA6Dhi(JI&_bbB+CYwZKHt>k}ul} zCx@Q%@0EPLXnD{7YmQ#S9VKvhk){GR*LdT3_sXuL&x3NeYA+*Akrp{AR@jrAVOEGq zY-rR5UK#vOn@eF@V_b1G+Gidww7;tEf9a2PaW^_L6k=&_tC+bxHeBjMpm_y;HWjqk zN1i`cWaABZ-eTq?XP9UQR=)|}HTA7wX3qzxK%tP1qnM$^4+U}=%WE994}~^r_`?Q1 zM(>2J;6kVG|No(QLGF8Yrm~3ixhFGfZ@*(A*YF`OijVk8IMSge=k2Y@;YjwH$n%S_ zrxf96XS_tY6CjZ3h8SJ3ANM23%hP1iOPDnR@Y^xA#}~(TR{CB;slpx%^Ft0HB_+>f zXjE;(w#7;-k6_^m6q~;Dp@UK!5;3|L#ysOxisqw7)y$WSfpI**c>8;bpCZ-`5&&|XApbA^ z5B89eTmJ~M=uqIef6V_Y1lIpgpu|`I8&v>HXk7mfzCI||zg^%@INs~HNF@O(pz{r2 zQkYe6So|+kgrpQx3a8~Cs8WJ(7}!|%UvlUoDsKWo?Y{`V*B~L@|FJ%EGWdT@fr?1K zZ9b^~?*~9s7&#tr`?j?6Gl&0)!Q`jg(%b#5SN9iN4`WjUOEMb}_>L2zdJNiBPO?i`bAu)WZ~zHv`)7;a4r|yWP8z zZFk=+%&3v{3#riqs+v2q4EKFx?7DCcNDIb%p@+`LKe^8y(=v zzu6!s9FXq07ZlES`iS$t1Ln< z2L%um>wsSZKsjQg0#U_5f-U?4FJKkBM*=tf&0gfBiip5Z1^HbN!!kq*q+joe?hlXv zrOrT0fKp#KGA9rZ$S?mcxCHjRf<3Wf>j1btAG92vN`D;)>*xZG%X1{$p&K3x)@+@A=q1&%x|wow!xy&rq&u!_fvR(-O@ z!|7H}j7`!1K?;cB6>aAoLSgH-GRq#AKQ~b7zbFzzwg8{G2Jr=jBNz#NkRk0vxDy5> zgWvTEz!9dzBcd557$?Eh`UertxdGeX4UpAhtbPt&ps&~K7c(@!2uhvaVQonLVflpH zs1)L7$a~pg`v@_^XCEFH-|pLljNKR)v)+~;-5XSe6)r{8 z;879LhK*jR(}K}J*)H|e;(j>!e%qiLg*XFxAIH|{{S=>yk7`!`By_CEkUUG&C>1C& z@tou;iXMHMtV_h~x^rb<+VTG@M9U+F6D|~V5kG)6yAvcofs^(_*dl^W)Z?e)iDRKA zwC|D76&XnlBE^yCUox+R)WsY6mA=ZmubVPkH#;VqBRnLb>Wgybp1!&5)M9@FZZIOy z*3pj8mi#)mf1%zYHKm&{KO~+EXMLzKNt;@jOg{f)C?eg4Z!Y$aib**cGd7Sg#Ms46 z$MURi5u*tT2a`)E=xAr?bQD7rI#V#H;S(0Aos>{h3@Em; z0%&6>ls;t%9Erm;%rgh{?=vhZ?X&0VZcu*eAW3&g7xQP5X$$ohJHB_tu&U7#rxvp6 zQ06C@@7bM3HFF+$tCUTUf0Xsz83YZv!HW5cF;bO8Zvk6I=zGL$U&)^V6LBp%IHldU2;tuV@WP9~-uj2e-+;-gLvxY^~F;dpi7eWY*5nJ_> zV4h+4_e7KAz$C=!$mu(NJW`1#Y$r-mPPspaeTRjIGa#2FXJK~jnUdUD{aTXCm5xe< zDzkO9_2}z6wUa7*sJ^_w1*CdODnd%TTuUn9DeEby1gfN5DI2zas@rPX z`r!(Fs^6^CyR5aY^=!+7D>V$1*Ic(&aZZsg)=%HCBjrrSlL9F}z9N5eRS4c}`7L<$_%J8TKzagc28<<^&F z)8!l1)U2dA0#x0{|gi$P}D%)bZ_MiHu>SJw&9!5*D7g6f^ zyGv=X`EJ&i5tlA0L}pUgQ#elcQ1UGv44!pMHXdvpZ0QT2td z;){jD>-!JQPW;G>NH9j<_r8N)?jhK1Zw_wU>76wF^-1;i_^K7+1B^EuVc}+?joW^K zsDa*r8YHJ+!f%#XOlFLEQd&ZF$ZMWuVtZm*dZ)mZg_QB4_#?BMj+B;~(la#bTJd;4 zbjs_7YdUO441Jf{Ri>OSF<*LxXA9`cL?h10eF+fJM!tL!@$s2LcyV3=M^IQRx9gD- zmh2)-V+?5Z(~)AX^g?u(l%6om5X|_JkC$ zRH?69Fu-9O;L*mFO7US;VQ65QL-NT0OB3P~xrx@Ctw(+=QurR)?XpqS8#SG1x$Fgc z3!jQXl+Nhjt4gc#S?H3KxT&MA}MoXi+KwUEzp~XJ+4yi{sEv`?Lj&hFx711%llx_B#gl2ASTfWPGR$ZQOQy zaCSg_c6L~eq8DFUSAh<8bh97HLbUF}{@ZHx^Zc6r^%*AW$=ZBMe|mqXc|IQIm(FaA z)-i5N$Fn{hE(NVVTO-f=%LQFE0GtF2rvIg11g;9&!x~ub9pBh>21I&xrYpW&;9qcp zAo?)N+?)*Tp|o?@^s;OOuKO?x;yGVOPQU^{;}7MXq`B@=8eX~F2c*(y1SYtyCWXfDhz15_&S+|x?Up|Yp5 z^H8fvU$EWFp9T{-%b&oKjxNn-&E2Q(#Xrt}(ml%aRn5`Sj_5JUAtNWWk|2TE`ro0}V+>v^_#Zy(S4;wBpym6`Lw^BAQr7wvc8%EZi%#+b(E zj*5{~*Yyge znz8Vzz>|Xg<9f_(PwM!_;mQO`DA+HQtV5~ z*$LMy@Y71b-S9~4&p|+L;Qleci+q0qkYHdL^7e@U5~`&hUTp{X$z-w3I;=pr?!QQ! zF?4@&D+Rm+#Bag5zP2DdatGSFCM@x^5cQiV>umxJ0xB?|3Y8m|2OKbL|AB=?Aik9X zh}FG^R+d7b@1R9T?IDjyi@YZT^XOI|-e{cv1L?v5`}i-Rc^7>Q0#*ZB2J*E6udz~ zIFzHo=`rl`9vh{2ZQZKMZU4xU$VM)QyA2dg(OC3ChL7%u`JY~dektd<{{Y?SXit(q zf(moRn_oc*;#q zD0}@k22eV>tRb)GC|ipRt;v0_x&iCD0SPM2nUNb39>+u6mSVp2+WsT*4*MHK@d&D| zh$Zp;5J3pkjcQ(STp3FOk?3%3_Z$2FUiKzm@cueNM531Qp)|O&GRE^;uiHfX6e^y2 zrcT-ZQ|01BC=gC~+dHm9A6Q!6l%GEmQg4Eph2TSh%npklBs*GmR&cre?qAcsPe6Ql zPO|X=7Mjm<^g8oEPhyCQl5i*!;Z=~#CjT45sj5;I1 z>s(1XlnPMA+i@$)E3D zmkx99E|2V?p@U@7{n5+K%w;RbseatQ2M2*~P%>73C*sv?5gCevx!(@_{}^#4ea8F0Zq{hV3pw;j{BuikYWCTf%fCi zV%l*|i82RMonQs*9?HL%4A`A9cS7VB5wi$L{GLn0Pa!dAk{iuzwq^YskJPrz+0Igv zN0O)0k9wODDAzuMvIq>EQeuMYNgo%!g;% zo}?Pmg!d0mVjxC2a-AYZV=~Cb^udHM^9UVUC`hMz^#ve=FLU3LU z*5X}O!O_zy8=gcQydfQKB)G}<($D7o2N zF!j~G-bpcum$mZ~i>0yT^jh7GbZi&jnYT$0Za-cLNtE+%A4h!YYEcV~P>c5O+ zp-k4`|A7<__*jhkd4z^}pas`YnUpJG-xF=*p$7Okf3~9pWV$L#^&f~Bejdvf8U`I& zL$`Bv;$yO=p$Q4*D>`dYJ^!}F4g~O)!Duv80xI|&6i$36Uwu@o=dTqhTa4gQ&bM_F zgTipn2@EXJLD|KOKjg^@4z10u7xwL0ZJf0_j#teqw!I3E=VDpG2=JP?ta+G>rvsMS zE_p7)SqEJDeGuTuc<|^{uTdi*=f97;N&9EQsBrlda;t2DnNxO^$^-V%p* zgpA*X(2eL;YygdIvZ8MItlj+DhC!^h}?tG2lvMDe=SDuqWKIUpbYBIDlPVWaA zQqTiJ?2#1EoZm{uR-N#zV0PHC{53CcZ(YgY|M~kN$9YyJcA6nfJ@gL+#)2Hx(DT^$ zmb*R-dY9W4GzGj1fZp2fKA1W@u8h{7-hxvhulJ@>f;n0XKbnr`{zAuc$3V-&-z-B@ z?~uypCyq#NTmA|V?rte$G1Xe}nD(n`}r!-2Lf)g$a?wSMN zz0sjroy%*DNLO$2o-$n^M1s?U%VV8G%jBkzrOfYY^h8Vmn`U|3YTE_#w*t&Z0?{w>zm8|$~1o3L}zk=aR(>;FdVzGZcaa`N!W#hq~er|?#=yvAf zrtY8{^n@e259$bYIa=3S$q;I+h2a{rae7PUBbwc+4U=Gmr}+FnG@s6TU&cJJtD*J) z`vKCPNhnop=TQ9{Gq;^2=u#b@d`jj#eL{2P<8Ul>hSJ1goe$ZvItXE-|E@DNn!5M; z<+E8G4<)pR-F&nczMiI)fn5ORRcCNnHChh(8+!?+`E*Mr>UD6!=2)g#>0~>UwL{J@ zJ=bB2$j#UCH!-( ztMuHHHN5aI!#Z*cC7ugw0V7Cmxzt*bAQ+3#!&l5@IAuVkx^!5tmY)VVgTq?#^L53wj=Neh@>tOaaBHV&Ogvwr)Wu71{HGc*`5J?}~3g_Ao)} zR<;&@V~&JMtpvU4lpmJaxu`yV9zPonA>X$sAJWRXgQ_CKV@sI{pIM2yT>sKy4T;By zW8iRD9Fi8V8KIt}C9l$@nd#(1iXP>)1mK%etr^e)Dk$Mjt<<~0ui9I-%+2SQDzWzO zN(WNqrQD=h;WO~`J-XIy^ zQRhpoekxQs>u0*}kIho_0y);y)eWP9D%ZR5&5W`Fqz~zBM`~?d zsYoFKc#QLUlE@jP8+!X6Q_Pf@QunYT*j_EEjK&vP;lU8RYilo7TC=i-`gd&eqAU)` z){Wn)SzyQ3JS{T-UHf|yJ7huW8#IgfxTaHK@4x*gI!*KceE@&W%7C@c!k?ddM1g79)A2>fJpK;vZ{QWjBC>$3 zNwA&G!Kz3#UJpMEe>yrI>z=@JRrSLJ!@D>q6gQHtevH-5ZGyN zwMavgcIsh?`EMe|+MrgN%Xcb~rmsh>g6k>PpnfXJL6=0az!=#HHGA9V6b&c#V>~@) z{swIs>A#52qVqj&>Ep>DWcbNGruh9HjmeZV)rJbctc5lSpuGIMV zuCtpdpjh5I;Qx`&rw(s`BT@~~@M=SecS&y5GSHfB`CjGn413l392?-TJ%p9v3Rnm3 zxON$B)+s6dL*60|Tp`%hkp<53SXcaGUA~pye+`x0U03gfKXnEYWE$CUdJVSCv{jk- zODQ~AKpnPe7~zntwb|Pnt+7~8974Pf51T2Ueu9sXDEO6II%qgL{Uu~)gJs>h;l5ndr_?N2(CyfMh`4276AH3MS`b$48cKg!&HPY2w=Fb#RQ$3jJ zPLQ1@?a}Pld<6Ayf`~vGDqT44j>v^E!iv+j8>=+gw_ka78b)ePS4XY(cx~&dJ_k%o zItL*Az`z}aTPL^LXtx9NPkvRC#RsQ8^xeXIg_Ktm6he&b z@$`wC!w!&lDb0NmAYF&pdueGF9Bqc53ax+!+sE-VUu*uZW9+-aI=a)v)ppAHxB%>a zEwj;`eTSD_cXhZ9UL&}|4fzY2wpkpKzOhs*mP&q<7?_#AF`j$k4z-5wulSv%E4hAn z;!}BIMr@P>TSwByi}Etd9bGo%%J@gIETZ5LN)5daXl-2%yTH&_pgXZI3Q)8-63+iw z!1nL{6Bd(!{jBKmw$$`+JFq0yKCQ6<$`fq*{D|&u2#G+IEghS zAlb}8Z}PP86DqmOalKW(yYFCbDYg`-@9yB1(Y%yR11juQpltKCIrxeq=C8fm1y{qT zq~m9BU9@p5eVqJjB$+O4zHGf^Mt_|}Wh2qz$A^*DZL|eC&v|}|6-`-osjI_PX5RhY z_v$;L1|3ScelKNE_y;&sBxIjLw% zN{d88Dm)JI2#y||w^MjAJQ;l<{y&ecYNlCLsQ<0RPiQJl%4b6yJIKrC*p_cuWQF&# zbLJ|~gOi#0GfS7xcaZ#YHVP%Ql|leM9&zh7Y7p{f6f9f;g`etVL!&I8#W@hjV#~Ep zK_UhoUKIJ|@1{OQw{5q9-L9rw-GRUoyRTt zAPh`5tfgkNWxRL0YX9=TrTCF|a5=zo=(0(I_i1tBvocsG6u_XYj%cX+cc?D6#vciH zC55pi|B3ABw1C7Qu9NO_qUuY!oI?-ke*yFkSq(cZ8j8;AsM4LtnQ2{kGs?f%Oo9tn!5S zG))1F?3QU{2NQb-NB~nntiLl8vfnTgMOJSpPiQ^{Ov~e0+9DT-rTyYAvrf-d)(SzV zNrrsc`PbaeRwc|%lzuofwDg+nxF)qGBtqeR$N(P;D0YO*)2iW#nM6foii8j~x_XJ> z*~B^&BET(_zULRf6m{^$&#wN=ahU>Dh)>OL(qt-c-(^Qg12`R_S>oi`062|p;d|rx zSVbY@X~?dbgN%a9a>2o#Qdb97^&z-w)nQiFBHWM?)PhZ^-_c(ns7fKQs@;>z`zENO zs82vHEZwDitw7Fp|DBtlka#zvS^V=O(C_$9D4D^F7bvH6v88*MFB~Ug+0c>*vrD9t zh62e$U?=h0)Z^cOl=|fPrl_$hZWnb>4=!}Y!X2c}@5|=*P2WF8IAK=%Xfk@fLQ#VV zr4?qJURMs~jh+zu6!cNYS_kJBv#VUr&U(?`hwI~6?a%i;cl{UO9KWdMQcC?6mcB6p zW*)oINC1#G@`Y?{$Wb6Jq)0Q6Wpkcb{{(w32)dGMD>B3v7)+vBXLxzx@1LCu8fiN3Ey z0S2zWj{QC|qjbI5Rod(Ut9EO^VY8X1|C}y(1H7T*bdp2rv>#D8YeZn2J&>_PPg=tH zPoAR$`_Oe8-L}>|Jjc+M&0`e&Lf*=&lh9pe$^7SMx58d|q6?8bg z{73Jf`Hxp6s38F61Pc4W!w*hf#kX_+j?xqKvi|lDJ?6vKtzX~z`mL?s-}?Hkt>54J z1FwGuSJh@!%oXz*ki^(iR-*X4GIgUwX9EJh`#?|jotp1d`?|r#erv#QD#aKPCH=t; zej;bQnf*nEDS{A@_M|UHL33Pvk@-Zl>Wrm;g<|>P@lv)z6r0&+n>KSZ{w>A9!GY1f zlb4SYxSM8|22gIJe%Y7gs3Qjn2#3%V`n=4t`?=0vPzG%EwtkO1Ja%R27uIvH3+6fu zhz>4e(s_urS?-Y~KTp}^s4ul;y8`EZoYyr(WCHal-o>kUgeq?mZ+4}mlJM!5T-4Ph zaFiWrj?3IUM%FVWK01U)07$I8%wm6x{gT}tPuEH_OoykLlIr3I53mrl2THV%2|knR6!&23Mx(6*>3)xaWJwnbJyBfLTSX;eShY)rdx; z%D<(ts@8ASr)V!Hg)A^dz`-_4&k*8Qx4(kwM*c$*D5S;~4qCnp?0q`zF_YvZ81rUe zH1*kOXu0D9)y!2Ifqg#e(=2wp^q}2p`Ac~@1y>m9B)d?&fi(GXtGocISDiKV0wEwI zphR=Q+lA8Fbz~y5sA((1GCDpGTDCf>l$!t4Qo1(uaU&Uuf?wmAZx2~Gs^XG~SB_8w zLIeJD<>uuwx7ZWM#pxfZY4$xmXhJ}xE|dgNfXND(Wdae7kw(3I8}fQ zD5iooLeJrHhL=4+!Vixtx#bki~f%+)#m}^k&LNy#Zcsu=u_C+Ni_C(C@WN?+n6k+_XkFDAbqb3k7!Rgs^@qm8<|W zr(iiFP4q?!s{ZXp`!uKF@VurHxH&pIwIV|Zh#P~6X6^?ZP4$Dk-BZPv&4I><=+?=p zh#39eME+h3(}u2|xz@khV5vhS3J69hAhp=(EYoLk#n;Rw&O~p#Q$$f!;;7Sr1DB}J z+qk8q@nwec%+ZKQ;*)_3tq$HhJhkg}yqXa(mz?*DNCmta53HR!c3pEt219u;{_YWM zG`p7j7-a89crW8r^*>VG4xsg%w(zj4%B7cEI~Oo5mGarLJ1gH#w>L8$AIi0byn6a~ zd2#c%148iy7sK}DvBx2N`k%7JVr>QVD&cB37>(ChE@AKs=<4&?Ch@3!z2-N4+`Nl8 zykSc&rf^;8jce3Pr``>esU8|>7XI#7&OU$qsU+rQy74!m#TDtI+FefU_HMh@&NiQV z&J2EI3%nov=38g2W+kr1-)u*M>uz8WDty0AVC^jVFT$#cCzisA`#OEvM%E-PeHzYt zj@!<5RtK;baqy)BKIo^0N)sd_UuEi)Fab{~LF83pJ?e6g?$v!AW@IYn`AGCeNB3iV zpu>ZZOCbDOb}U?ea(4h^kx-WUx6AWuJaDwlo4Ov|J_ld`yjVA!f6%m?ZCllRWQPca zWb!-tSsWU9J2Rjsbyn|C2cBNLLK3H%%j==bmw!kRnFlHQuFTwL-t#0{aKDD!wa1G$i-!rWaln!U;D}P zaqmfeX1+&0pyht9npgmc13!zwVNxSJP+*(vqV**)S}AW=>7i_ZD8ga{e;bx!lbJp2 zu+OF=VkKNhaLur@&2%62Jp8;F9hgP{m)$s;7YGG0t9*W%@*GZ_wNg=zuC+YB&7bJc z7~>zCMnP>AA585Bk1aWr?}a@t->T8eg#F7W(R%W(ppd|YFKGi?l* zyB`U`OGc}q3=ESHmKCg6CWf&Rc81n;2ig{p8o+-vElT}aTzCD9;GgArHam&?O{1Mf z=mN(}Ig`*eyS}u>@bqQDzv@7)fk`W!6o2hyu|dop<&RKa(#5^Sgt{}U-KgDI^Vx-M zrLC(U>u%z&6VGDu5Mi;;;d9Vm&}wTob=)xHtXkwf#pgMKhK zA<=6e%PLU=G8$gzxu7$t|9U73 zFXawaH9Gz(DOaoGtM@P5-p#ZI-`>@i~?+%^dA*ruN?*3bA?v`%c=?{#lHxl?XtDB;Vyv+sZsNmxa3rTx z`?yB4VZ*;P>wtV!OZ_6nQ#mR@JW4sI6EcRnHrMxr_QTY<2C$Qu_e>5eLj?NBz`sX@spkwm<6QjdO6>Ps5z(k0+9dq^ z+D1z2>={>NSgyhb3L!f4FlsYMy~PhNYUoK1KLiQLp#)6zy_?LB5kWHg{j#EJXpr}y zKi=*cBKD$?_hb0)8m+ z4?Q&5855G(f=)UfrsEB_%h*zHFLJiz*HDUSvcF}m+20T!`f+=$@AiGn zXK~xe1i(k&D`zfK3E0zZ_mP7yo{eZlaq$u_j4EZYVH3XIq0|#&?6M`+{uk*n+4a+J7adv|Hb`pV@*|r@WN+ z>-*&~IpEq2LM86;H*pH>e@sn_7elO+oshUXCa_gzjCyzhLi1#`U{w2(&j{uPR zXXN_dV{%JeO_)Wa4aeoZ3J`)pKJ2LwZzW|-o68)_iY zCm%9DKZ3UOuvBw$_%HP^@nlGZCqypHlU1T{yJr#H7Id0^BytQA3w=i9qFDY*-|Qp< zehe?h1Tj%KGS$twRS;vMbTv~Q+#6cmIyEq@+*t!?anjlo@)vCYf^dfvv3W1yuJln? z1@!XLvjB(er1xPsfAvVf$bkz20I_FI*uLU{<}I`cHQr3PvY?$EXUTns+`Xr1S&dpY z6dEC5Aut+LPyiGnEevR`dbrt9V1II2w19vijJj%~?KU8e>B_>Gj>EpO@FI z`ICe$`?O)q{IDoS`>rtuCa`F1QE3}S2LQ_OEAfcZ_dX78&93$l-Rw+irXgY_n8$xj zGf>eoiHJc4XFMUQfZkciVfrKf{(UVW9_Vr>zAN2`n7S5s#eQ1+1wH8NY{$ujEd$IT zHTlx|jw+%6`QESKqFJblJ^0Gl?R`7H_Nbj9Bi(pQ)G9!50FPoe#B zE**5phXHK4Pc+Hfv6(a{xWM>W@FU^?7v~-9O)Wp>1BF;H4ny%lOa3zY9rO!vYyq5x ztE!hoWFp-(O%z%&C(!u#WQq$8P6ljzO(;2F5=NkKCED(}Aw8fOas2$Ew3m{Rr+$C=jDJy#(f|h#i(Wk7C%h}vU8wg zb+O=y6)_ZxRo+d(C_3AB&`NS?RR7Bqfzb{$!6b+7-MNa^bvjHW{`XF)9lGjABdB~L zK8N%P#_cm`@})Y5!591$;7X-=%Z_J|xq_Rw_vYh4sbJ#b&w8p`j`KC|yO|)95sk%v ztq8O`00}I%k2j4Rnnk{nBV~HS=jz-w(2tEPFvaA<1)5bSUlMKWOCOgB|Bqcuw#j0( z>@iQohjjpYv_LcY)l@m5#(ix5N^{Yj)Err(egvD=7u`@lSP{gOi#`0N$@sX!iWQ5- z!5Ty@AbM3;F`(7U);UOdV&_b2`lLJ`^a^Y$BG?@MJW239?DmcyDJIBHSU zk4g@5Y}VgYWq&Q&D0D4$$0U7xTo%{_vf9Z#RGMah&^5c^4w{43jTv zA#OsioxV${Riz5+eDI#$6`!iRm>I~R0{xfntOB>xSNhJz=Y`~^DDN4Sl=ISIvA-<& z&~N8s&2#xO0a~d%c}w*`a9I{&>k>XdURv;%KtK^kv!=}by%lnVEjmg}tM_+PpDB@7 zVxGqv4&cZ58mbD5e08{T|3V4Q_j5zr!HL((bK<0z_x5*+zVq+YW-gFtoL#g@vMADS zQPOl%*^r8{zizVSJC#^xWn~?~lcLm9jmyh7eQ9PewPQ;i^Bo2(ba^e2=dNo#uIc|j7U^h6Ixjg?pe+Wrcb1^=uwmavxGu=N zdZpuDGN&>}%}q%-Vc9}t6-);9!o$mZt*UKGlsMU{uSv@*dt^9F1aA->U)fmaPwz8U zjFT~A4@5+Z8KPFZDBf)W1jNG~m_RC)`L9x@q*8XO&T8S(M$0LvZCG@p4X*s^JPLJr zm~XtSM~nP(U4?hub4}ZEj>S$tkiL(#Hy>I>2V^z;jx!kD+pZw_&Kt))#3Pnm?QTw$ zJhYb&z)&)r7be+W+Zn6_cKM~RJ!TMY6~zb*NFXQh-MBfu{=DpG+S~q!89~RR_jmJH z7`MOTAv$ZIRmOEfsJTzas78?%Nba(EIohYj9z}m!o;a#IgNMiMtUR8-W6&Sw^%1em zieR)B|2HxSlBqh|_nuKDR7lIu50*|hJufH|Q2K@|ZBdCE#@@Jda>*`1X|Z}!5K=83 z^xkjYJPmgk;mOHivB-u1;vul;sB(Z}8aIxHEQz*2frivub6IS4ZR7E(L)Gk~%pG1?hzK$9FC_C%Aw8tr}>~zN?QS>7jW}dq}48 zvIF~IP;S53!L)5Xip%T@q)fU1e6A<28=o!gPn)(IqJL`U;#76F#Ok#xX-=FyQ)x`6 z&3>u0xKr;PZ=f=kYYYW2NM2Y&=k+C((l$UAAA8X_P09sLa+l$HSt)X#%wTTW8b1cn zw(TpK@S-6LVW@N7dA;$k^xBZ{s=e3e--?XjpwpIHoQ|y*41czp%?0B%5Zffk^1*Y; zQb2H}X}>&F-F)hycNtUOVMjCDX6RMmqS?9V!AYZkZvdmX*5!%lOlrFYaRQ_yZ_{0% zfyTbk#2jgvK?7gQ1v8(Yxt zxM|S9D}TYxaI(DCwtMU!v&}8@Ds7Qc%CUhS31wCuwgm9aA3EsG!r=8IzQE_V@JrSQ8ENh9oTp~sunysqK!%%weI?Oh;UG#-R z1)p}D*`247-s{hf!wrRA%}%V?dBi!^rx~+f&UF~Vej9uon!$?fzzGFyXstc@q*&9g zKfOm#)y4^sy4uni$&)UZ<7H9}=j+Y7vsEBuQah>d#iyVfe!o=NE|l*<0#@lYyri@a zGrh7O4w?bfL)`Gd!JOc)dU|>dJ~ElF&IBIlsjKLcPUE2!JJ$Srxb_BK294U>M(Guf z0$!;_YoGU^JzsG9)kdOr*k2j!uFAl4-VQo}mwUp`%9{TctU^I3GdCG}wkB@_nEqz_ z$L5g4b_&&mo|XAFkLHIngR0iaefdju&I4m>|B=?h*7vz7tKzc2@1CCCs&%ivIzk2$ z`9KiUdKla;<{%Mp^&$TlSD(4JViWT;;h7^Dt%giU=k{OQ7ybLVl6G3nc5L{bhsyRH z2u%64p)sF6_De^cwO5i%k}LBtit}43;>u1viuJ2GiXm)_Z*HQNRxy>9C$Q+lY_72o z2dA<;UT_dvSp`sfVY3B$I{ zFl~q(8VIH>Gj@@dE>35n2C-(;KKp22<^sKGKXk;Qi4m368Z?#0o2cXpuGI1Jqsibo zg>9$!+DHF$&G{Ua@+JEO;8vD@^Dk!2Lapn20wrLRAyGYu=2@?6X}KTnZ&KH+tx8xJ z@(|p)^gkz_09hTrPL6eSblp&()o?reC15-)-oCD;cU$9od$o}-E}g~q|9-Y^tC@f# zcyNEmc34uLr*YbDb+u4^rhgFU4GrSX4y2EWr>IJiXPNfR7f?>)>&^Y5>NgY(+`cq2 z*EC1RRT$3UTc;IZZvye-8D_d}h{dT^^wLVkmS?>9ym~w|IGfHLaya;0`B&6O197!N!*yJ;YERr?D z@s~dhC@@cM5xV0nbi?=fQ0c5wr+H5Xv@qqPO+>Mr1K#1G5*f#RYA(83-KE@`<;v{R zWbF3(KsMF3m@^%*t7@(8kK`ZFn$DsY;^v?M1VOej-AX3A!`o7u(Fsc(yi(;sj*!7o zxLI*(pupv$SDf0mXjZzLVyZ^A?mUsbh>f$(hV#wTn1A{pFmyZSr~=^UxWXD~wd$S~ zt~;Tua8Zsun2I&h+lTxb8>ntQ;tt;^2STaW*G6xD9!F&#E%qI4+`b*Rd=w!9Z0A)+ z3H_2v_q)f-tqBcfzI%D+gNx#ZF=No*eQt)2UN%5b_7grtuFt!zW3xr=&uw1FJ>BGH z45zo5=jb9*%Wp!l%aabbz)N_0SE*UO(y@8KL{;P1%RL8+ejpLk@0SNyp&M)M3-mN! zL^o9EjtnHG&lhRPAmST{B>`~Yw58{y)<-&BeVbfw!X|f!Qgj2l!|p}kW8!Cq&kBOE z5Wx`ykeAoTJUB~d^X0p&rFF)a!*!p09!6C~=G+9E3pA9SxIDyPf#QP{zHR;51aPz? zMy-Wa+25%?S&8ygalzFMTO%jtgC-#n6)7DKsxiW7M-teT^OV=uQj9BZHkrcUphXi$06oz*0&9fqjY@~fY$2gcW)OZ_=;U`805| z92mgp{7^P}FelEx%y$qy%j*s`xLloGAO_)VMm4hU2tl)nq%g`~WZ{Y;nSp67@r$f~ zsN=!hA~A`H^&sVV;b497DK1F{Z~;(SK$B;q5q zK2B6XM13=IZmPd+14wDR4hAb>?Y68~MA8j+ndscYtX@=dyK_rL&>?;;@@gejQ4i8u zdjnaO!;fimgcU-F^@JK;v{h3+av9alt-8kFeLlH{o0PHY#T6=_T9uQ!>yWt7mZ-5i zBK|+|fcsH`h#W;$&v_OCUeHH;TD1*iH+X;?tzfuM#e4h2WG`F;HIjZG19nj42%wEO zyvY8?N`q37m@hOL)IYZknOD{RII~sqpw5a*{zhqX@+OlR`MvZP@7+n^U*q1}I^Njr z9UU{n&v=b1vl9UU>u9pT?*NaO_(KQVfnawpOFtNf>*?ue-iTiHu}B zDwV9wiyy;X>Lz;&wZG`HuVmth18mYiPQHuB)GTB#hqOyv5~5342l2nF5-xz3AP8(% z3hH9I43xi~xw3D7ZhZM(9Cq-3Uf;v?V;V1j1BN*?tdJ%@rhH8-o?27*Do_?*{!fM_ zT6|}sdNtgD{*%Ge1pLTlQIJ33F~1PGU9~^?%IKPa1LVbTpkxxUR;G|+?@D<37ZgAS z7x=B}i(p($=?`R(BlJFfe_SuWY9hxnDdjN;#?ryHceYm27(zX(?7?z@#8?$KYeDTD z3r|3P)omQ^_2z7Tl+Ppo6JgWTDuTxk`Wd?rWPlG8&1D)i5UBx z^tJr${ntNbBGI}-0P(PvUzs%DGpTRA1iX^?__laVwpAh%biuv2Tz-Y=4!F0Szb^8ib5*Tj+iiD5P^Q#@1i3kT7BRlyjUk zjbaLaM;mP2ISBU`@Zrlu1YiDdCk@f^LsoR{2Q|{K@9_53X8bGpCxq)qXJcxr{mIQu zj)s(X|M-Z#`{&;#E%MXqkuLHN1nSV+#0pFeDFA(ayGZDBHvt$B&iX$BQ>Rn$s$I~N zzp)DC{%uTbn?0uZ!dI--eAsq~hAO>Ilbks$7!VIUj6?>c(boxO*WNIHTW@j@$4R`5 z#XCobQ}qPURvGdC3=%DEG9V8(bX>^G-+)-i!`k$mAav_0s^60_ArZ%^$smWwcnHBY zS2ebF+ZC5U(tl~uktE+T5!wf_8$3=wzD^OAUHX(D-Mb;*8(cX4f55T4kMylyZi@IW zcV!OqksLp(r)HiX75}GpKcDtafkEL!Vw#eAWtI>)j9}s&K2gVKeEkXtG^4p{v!UeA zB^*j!Z#xwH?Eg$ihl@nw>M2$I+nA5Ejt6=iqAewroy}BC+e6^oMW7L|-;;H~{{-n+ z?L5B{2h{@yoU>%1@#5(2lErvEa`Uh0nJO83HT6~wVjv=Mjeq#ZhGvH=vaM(N$1h2F z`%Kd?F>pI*uZj;~g%liT__}~|QX>gOzcXetpM%Zz)Q7Eh>y?V#yLub;{u@9Ni6(F2|7tn@1aYVjW3EsMY7igI z4(IsV9nIN_j4L!nl@FX`Ox&9>^*Q53462m}&ExW>$kUle(USEw|>IwAL(WFBpq_a zJES)r%@aXPV?)fqOAR?$f?(F#!JO9Nap{Hy=6GPe6N?rmc0AQw)>N3InrumbIV?LE zi&b25p$CwR8k2B&A4r#OhSR5s?=H63xEwSl02R|4pM-CeLCBz_+@9H`{_-y-NB5Xo z|F1i>$=utZ?#XkMZN#9&O<)m5_XgzuOvC7;eO@nNsbBlB$NR+kp6~jm6&*dq8J z*G8VjrqfO#?%Ay4D(%IXI+=#TbRo|VEmzj4CxPxfMI(tMWiyN>bWS-Tzs~DQ>)qgP z;SWRNd?Yc9H-4|_ks7@(p0#yj$`)?_8L^*xk4&pefJ7VLJ#Pw+CkS-yfJY!rga@M z?JqvO2h&vbJp~`(bdllvKhJ?Kg4mihY5%2*A!{Ne2LvsezuStE&Pe6`M41x;HUjnB zYkCQMaX=b5jf-jyki_1 zYgFHrMC-61-VOF$5pNmP(!O(p1Er-r9sa>=@`5{gvHa?zW*^~@a2|nnF84wn9P*al z<8m4X*7?|``^3p>sLRBLWdVNw(5b$W(!B1m9`E)&3xCl2dTiHjcdrDD4o%?At&(lt z2td+LLUoT>y#IfXPPlZ*&+}uq*A`pxYMK!GVC)QyM*RuEl(@}MP@j1sU0bsmd8M$5y36qVHGgk%09<{^| zeDUvl*@tlrEtCabD%?Z6UrA)*yAC{x5dZu774V#n^%5l?{(EU}{Ka&vNFV`0+kRqR zcJSY;4q3TFPTHEs_MSbK%st*MBW8LGb>FQ(zxr#DB;0358D&eO5XE z1%n8`yCF5)HhzmATU?*H$*tWjl@W+CisOcXa@{lGz55OdhFb+ABS(V!YksSK&!lv+ zJGls$-WXCWo(kRNp)x6nFa(R(R9NHf6 z-JO6Gn%<`y6pGQpUquZwE#vR{Y4pjI2KfN?jT|o|k=;V^A2QQj2}&iHov+s|5NL%>9d7Vkr&~*w};GccG5x-{o5%(E7%mZ>f)rN*d8;!1BfINls``r)$TVh;Ofr#Xx}s1QoCQ zSkDlagy}_-qsge_suo6Nd=m`mDs%m%^X`aZK@EzzVnU(VgDVd#peTBmUL;(dRC*jKEzx!d|hntmHR!-L!(~$H6QKVK4!0Dfw%9+1d=P7P+;CHl)gN? zlThbjqFX~0Z+j0;X6wJZqGa-PsEjB3 z^yyRb{d}G$sV_&^Y|xK1O9QNPUH+IQqW2+p*HbDl`s((rjLt*UY*t&!Gd#zvr!?>% ztmS2a)hl0{D3=|fxFxkUrleurAl>|8QgU@&WHk`*s|N(v5D)+W00093022TJE&!++ zn9cJsH8iLi1~m;0%~VwlHB>PhsG2ouRaL4Qsv4@Q5vZA&yP^Pq0|0vfRc&(ix`~2; z`13DJ+JG}5K(kgCJCTJpBzk%z2*i-~_5%aWj`n^bRPFbZQd#?-iLCAa87rvmts@Ua z25D;@^Z*g4x$gHAuUoAiPbIG1lDI()BxQ(12SSnX0sH^}000>Qpt6TC;(Ht0KoEc= z05ivPa3t?a{_j}_@mcCU4RTIP6SmFd--+9Zur29qJy>Wno4hg3_k^DSz3G@tca9R0 zrhIBVr;)JYr*^R!D5gAJH~4t0B4>W1LC}|_js!2UC@TcmBG;t75s(3xcWTR zHhqznV%qMuXeFwW(Ar`_;|Llt3yN`l8DOftUfTtOqzTGurue}h)vShsUJOtfhQJA8 z57j9!d54Ud4gE)~+UL#Ra;(h1i_FQW-puKs)$s-QT8i+2SDLVsgA3d#2X5SDvg8@} zNf6w#n~xoPc7d?ez&WEewFW>zV0L_Qbq%2IXGWE^;#SrY_OVTwXEZHkC2g;~CwW+= zc87DD`~BM5dhKlaXIw(4Su}$ET;K4nGOcerKtt-0>E&)<5v_zv1)mqoI8ZmkuF7j& zqN^igdvMPPEnF-Vl9JaunH(!P@yrt7K`9VPMD;<87u=#WJmu-N(WNy@podcp)n<*+ zN_V#To^KOs?27Krusw?_OWOH%29bJOa z!PO>ieCoN)rr|C&obpE>7$Tzyf-Y`G4;8hOx}lM28137cjeQR!8>=!xY>Nd~Cxz2S z!Z23u8h;6O(G#-z(-as03(xye_7X&t_S#WKWI)*qhI|%fDL0nnbw*YdZ&SpJZfv0c}B>0G{)Q7-oTiv?F z1~bAoHll}>6O=*~eXW%b-wE0)M3<&)Mcg^}8TaW&GFH_mze9cZeOY+U;KbA0vrqYb z*v>xS&c=1j3+{|Jo23<{)}Q;61U+gk@)BFXkVKS}rqcTQT5`&(272j53eTZ_CCFS$ zct5ck4XZ>W9CkWm)ttuNy7I6Z@VF7poaO`b;rVyb0%o&THdFudhiMcP^+&ohnaecM zy;rhgo(DbDM~TKDwpenL)bPA*v{NDV+Idi=zthTQvt-f~snDfy2TS>hrd2(`qhRxC z3D;TXM-4PId$>QAz+KRW%?isBYts1W~W;Q%(t-U zIJK3ooh}{icSIwOUNEqEee?P@_H``pF$H5uay9juKej189xKuL7sLaOg#xoJvyZuT zT9ND@bRFD8B}6UP^o32g0%MBivD`t-76@@&SGaq1^#LfOb9PPA_Lxev1p(V8|RgTsmalP${gs^g0>+n^2^0z5jE<$0{Ib10>a* zM9ApcuaC*RYbF}v7?b-+7tGHtpJz>8lVt-a`X-o|!P(owdyr5mV_JO1d$w!jP?WlK z3Be@FlXq^3SZd`Zu(qo7-fF|WF={U8xA(itBL0nAmXS@HVNrMKB-EUg`5kAO7Sq<) zca}7f)G$*y;pENUKbaS)({Iy~*~)C1kE>SaU`tHnonPNpoD5PVWD^)0L0hfiqm{O^ zF1^4#o|U6uA4N3LQF5~cm`^GN3C-7+57yo+C)9&x4{xc3=Vuz+Q}V#XS*(MpgE`y8 z5=cgzi@}B;G0{{zhs|5U^rnfLD>gAHC**=i4xQi8R>!ff<6oIIIi^G;S-ihK(zV&Y z07MC1<&3dSf2ln-F;BrTEe(>RpYuZ$V{30gf)`UxOk0f)Ti;SJlH=ZKjBPYk$YHey z%`i2FDcdqZECz{qx9mFaCyWFqE@{Q^P+l|78ZO}zPA@9fqKNQtW%-@lr8=jiHiH2v ziT%7M=bF5_xz!v9r~T9~J!6tSCK8C&;Y6pQts{&m@y>1Th3C~1AFk?7X2axgT9wVy zeQkAQ$~LDAf(^24I4vTWMN?N6}c(cV`x zt#UiGa(K*`UwK0(_r!`N4}p|@a<%D|73+1WA_oTAFdvNu*7{ujnBp#sI4yoF z2QNXUNLQEJ+GJ+AToHrB^5<+r^6Wrt=!k0Jj$^#m;P01x*AMv^DBf4#hNBZysaP%g zI!X3@g-+KH+%uaQ#Ee39PUa{5!giIN{PwLv&X@il=ktHSY9KQZEn2eDHZpu-+TH;v zt46_Q(Fu<;A89$y+y^v)AbSAxJVY~x6O{V@K@h9hzNpV{aNS3 z`a<|okNBCIWZt}_^~r9!$!`@9t{hFE^{)P=A=(G;)Ps^5NO*hCFeSJs%0ccd@C9CJ}TO313sIn7>q|;!HLv*4Rb35 z26+g#LF$&Mk>@?Yryt|bz^QvlZ3v2dQ%;CvkFUBAC#Z@cfAm6@qC(i)u)5|$=2Xtk zQ@sWx?k3jR29CK7O%Jc4$qo*2jIw{qIk7e4V}SMV{bX5`%|yFF+4^pvXz<0rYk>$tn6`i8Rno)H5&>V_j3qiX)5;JLfT{o}m zkZ}Ex0sw+cP}NY*f|*#lo*SzjX;c#YoH2#Y|FstbPONV?{$-c!(R!b3>IKqYB$_{| zyAk>7xkRN8fH}hGoA!1gR83@L%sb)c~tMou{&%jBL70F$V#S_8H z9=wEsCO!k2N-I9=leZ#$q%=~Z;ZN}76j`U3)j)4rAnO3$RnLdkGV>~Dfb}8OX3x&* znCft*(_07h)O3p z|McS(Ll}o2c0jw5^4rM*$D&zT3V|BFsS#i}9Rs{8l9Uv^|Hu=ny%d#R-eMa}pjQg( z)U}qh)_W&QP=wCaO|${igKq=QrUT{ZELfrN#NH|vu(aoLHx$JuvCiG6pzk%Q2BMu? zA(Y0hQ`UDi!>f-kfTz{fdc;Xd!t&Eo?d54?G&ZeAZMZ@{3-BLl$5)|c=||G>+u(As z=Dx;kvR-Ctg1C1^iaZYniKTC7s3LbzGO z$jlg9*I*AUj&QV_yPl))%~+nxkMk^2#%#5ythk-5eIW4H4Le@k`q>_%+tVb4%{7Ot zM4No1f4vz6vacO}q+DOdC8X*wUO!_T=9x(~UTJfGQW#orhi3eh7m}SXJ{+6g$a`6tWT1Xx%E>8v5?8z&)hl1qMzIBKW z!dt7vHUHOGZn~LwAJN2yB>Pn7IsE(6?n;aP(5ITe!ZetoXsXU2O&*f)D16_)1vL!@5E zL6Bo}P=A%PN_OVfVf!nv>je|>r2Xt+b4eXG?i9i*AmK=ObMB&D>_>z9RP&tx9%x_O zqWn^q)KJqF;NHu-&7NV2@Y1|9Wx|>~V}zS|YtON#8bK->$eeiWy1DL? zU+I|K>a&wY8feC&wmpjp7C)`QpIUxTU)-%R+0TEjm@txWd^BQoy5lLH19QK6x@U8( zJCHWANn@bil$66-+u$y5^Vk*lJXu*Qjw0*1K99k8T8>7H|DhMh$GxV>fEuBJ>r2`!15$Z8=hoXP+V%x}imK1`lxp$F zq!&IE(L;dq$gQc2)rg7|=?I}VKceq9r(rXQHGhPLBHMtEdEJOOo)m*b{(tDI1E!X$uW3|4swB*zimQFIb`9O*aok(yACRT!;RaQn|n| z##@7>vB*(PBP*YZ$qZe03O0}uC84te)Vh?rmA~YUf?Ys&CTv@p5|-{4Uun& z9Jy_%-d+0{GGY@ciDJ;mwk-yU9(;y^?fGyYx1!xOf7?jj@A?}r)3RncLh1@TXKNW= z%5d6SNf2HdKhH55qrusQ?n1$p3iG&Z&I#INMe+@RbO0)y*z|~_Lp{#p$8sVXh#tMT zCrg8fHCCN{BU9%Y3-%yY>0X{QPx1`lvKfT2^ig_h+ZVTX4jH~~Nnqta9Y1v(1#^=6j9Znun9wy$h4SY6CBr<>j~D=q}`XPF06z8eWwqkd=h1w|bGuSc|_3 zCn^>|{P0c2VFsZ1hGglD061$n>9{^Fh{m?~e7n;JsitY+o%D@593NL+`BN#e>B)rc zdf3?zTHQn-9QdE+-=A>V`h^U9no>dDfO-{W5&S>w$>!STdZ+=-U-X7OqyFzeC>U8( zeqQ6|sSR@+*7lxd(Gsz{Ylcz(vq=_S1HxP%h_Ato8l|7a{o81eW?%>B3m%&prp>JD zD7@e26x7|+IQklHzU08ffd73snG*=Ot0R@ToVVNiwDF!pP97yQ3VmlPp7LGy`_Af~ z`T9LK_Qo4>%&{-`{OgE?CefH{0kLm@l>Pf_En16Hl0+j zunbyz?CNVMAK#X17r(`Q`F+3vb-y~LT}I$a7#sB?w3&|pKi&9YCq5=7vo(k-3(Y zUzbWn&YwppevlsoCAQKcP~06wLRLw>*mvlBa`B^S3A!97o#^Bm7el{4`FcEHzAk#( zFz|}+Ijn_ohl8X^bYBa+xF3f4+v@Y}affRUvC`2Wxo-opu$b;q(N$Q#CZLa@n&s#( zegINHt-ocbpxuiSv{d=J9AdI9>igZb`N&UPxyF4Ng0bbVP|^s$wzmF>*F)qEy|{i1 zm}g8?iFh7)#?Y%VKmI)xg)%XR=`rt$cXP{RwsIrJxWv7!@1lR$4Lew(9Od z(9nMMecGN;7!64hoaruyYX?M9FTkVcILv!a&JaHOb9GQ&uCA+|wX!S&;g#_zfZGCX z>S50op8FgrVe~7VdwTV92Xo4IHo?ZX^-5mjN4K~K-*r!B6O*!Tj5)-emA7|tG{l_U zucSU`grutjL>hfT#eI7HtcQjFOj7zXVSOCy$&kf^JK7~m6nG&&#IioG=s8uDesZWg z?8^0Vypin|@fyww|3xb;sFcHk6)Z-Phw15$b+6Lp_6x6f9AI$}I)qzCEx$k(t*aTq z7TL>}o&Jh-n5*PpD9k4`pYXi$@kcu|Kj4ILkNMsz{$+li(hrOi^pZOm7OqRJU4g&z zdny2jyraHnPh!!n7*gJ(BYhS3{eSv1dcWqY;P%n85FgyW;DJ1yvgWo5QTKJeh52C) zg&jP>4^P3%at(&sj3@!OqVS7J#Xn<_@n!8c6DUOGQ;3n!vSh%H^nTjiowrK>`{4U= zyZNvf8K)0judh`%GFB%Brj8TYs~7(27jNOm>g{HuhDyACRu!#@aCi3F3s5S>XF=Xg zhlFWz{{%Z3R;y3w%~g!)PVwdebimt@E@ zR`(B!1RdiXFts{p`~vp302dH^8B|%L7P^hSo#&4N%MHo9e(G$}&hkw@h9loQzt}lx z0c=$j1GB9Te=MJ~5d?2}>ni>)Psoi%Bme=phzJs#>4R`}cu`j8mnhJOsf1lweaJ0` z)N!KNm5z?!@@ANOt9y}W0atELX^X$Lc76i+=$#wS3Gm;bz<#Dw39JjKTS2xDkh;MmW5}E)JmakRqTEc_KT? z5$Gl+z2NQ@O#ODig9D*K(2qkShKBIwzJPy<;rAmzqIs!vd!p3AI2$0ov7pA0)p+XA zg-X%v+QlgB&{Y}oWMuD~z36b)UX49&mAofY^|t~QW(*dmf=5PyTC*jPZs(8H7=wdP z6==81_l^)6{Ukj@{i!|{gWptxbQ-z+6|TM`*D&OKmmm47=lvY_#O`^k_TPJVSeQ`f z`ye2p%8^V%+3@GoaLN)D!iH_1ogE#$I~XX?=Y8`4z*3$b-Oa^l4}u}Aw{$sZ+;xR( zjqGF#B${JKK_Q+i8WVC4&p-CAlSx;zp=~=x=T=^{dFe<~R{H;VmBXF?y+9hD zHt!AYFxEnU^H|bIbjh+G!KkyXsaCW0*9O`VFgwbLPqpaI0_EEBy=^6=Vgz=d02yI8 z1w95lfH-B+5FVXs0bXA5mFuH&A#yYL`Oz377N~&OxJ%wfqvyHb?AnM~&_g&U8LaUB zD5GmmZ7dx+=|Oj3Bt@Xn3uE36YQWM+)LCYiF^hzK3hS%)@Rd+XJZC&=E^nUcU3flj z?rz^yjjk)1O@H|QA<2S0#lpX*WrF{ri4Q$VWn(nI*fl`&k zH$CH|g%X}qsB(IKjw`o>54evrciTdL?jciOAt9e}%Zsbl$m%)v2scH&n?5%B>Ozt? zGU+W#4#keOyT>gKv){d&E()+Wi?YGOQsj!K7*s~@W5fZOt6{fk<2UAQ-JlErj>yqk zkn2BQOg}B}7zs2MFf2ctsb_d?i?1QL_^eJ$O6yW0pZg4mMl4DD>OhiA=WX?-i0k8Ms0H z@+(|X`0uUU$ef7n)@hq8w_JfCYV+8xNiTSuhK7`dnqJ4QyjBLf%MU)UBT-EhJ*}{0 zwUd?^CfmhwKo02PiE#(wY^djc76f=tK44PzYJp$Ono=g2?S8L&vIJ*{yYD%UQ)i-D zOQ3N%Z)mjJgMG9p-UT4O#taGA%$@P@S`MP|#LKF8I5lo4PrTPb3m7khtMkIjGI#-m zj0=X;id@QnpW1$K_vXT^=mkA_Qke~;BAADW3*Y2P1guc)HDc#$X;!~VwfPEsfERt~ z!Q`P=?|3`xaAt5|a&^yd-~3xrhQ(xl&q`KpwzEIj>~rPdT%tx$1vKYAQ@jPnG!|Nf zm`GfhbXXV#lL%Ul&7IK;7ne8*vUjcl$~Tj;Id~m1eNv0YL{CDEy)O}VV0#}Dd;Ze zZ`gH~c&KZp|CZ+Q2Hkkr{u0g@D~I+GdyCeKr_WR_B@b_lSg(PrW}dyux7VzLtvL=! zo27BSTcFxmKOnGesokv&N z5k)8SBBATBr|ifYYNOm6hhOqDU0pmgW`fzARpKC&W4ok~9Ks}7jucaU>bFwcHC8aV>;^^2xU$Y)(Qq2Y9^#gJ^t^Nzql+ja5^Miw!_RQ z7v8URkpIx0d6zxDGfhvaL9b~blL-7((RlQ{{(hamCj+27z(ZriW8eCTlR}sx5+;p2 z=`KUh=6sQ|c>fUPJSjNWg37GMsHkg2y07H7;Tp1g3kihiDqWn&6n~KGj~;g^rR#qS z1lHEe_{SF0@b-~tWyON235EQHJF&*GIv0PUTuZm~21viqbYoO_JhETu(UxTdzo-RL zmvF!?YhlxZ>I_Ggs>@TNNP&)2%e{;{*yxj1(ej(h#K&HgVUFjv3(co=u*uab=>={y z%Cm~fWqU9jja#3-5GrKHYn~79q%BH?OwUuUFd0MCHTu}wbi3ISg_o^U66t$+(c7h% z5GbW23bGJWQYza7s=N%#2jPru%pzK<>g1>5pr3AsZ))&Di(%t2_pL8hG<^0dexs^R ziU|!}Jze7~)R!Tfz=+aU88hB;%!cBptmOTPeowO2Cm_I7s0#Y3_LxeX8wq=Gmf+Ml zqSd{7UTRoVTK!PxMFY4-Y(_4f?CBnNePq@bD3|WFt5R?rp&m=u?zp+H*a5#W(LAvA zH~{KzLonCcAJ61~hnD!5zCacv^2ZnY`6Slya$u**V1kbV_1clS7oq}9Ut>V|MH3J? z8W(8Xupwytgg1XsRZ}_(e6RQW7ye&`iumjUB}>UftlmJ~`BLxnygt>H64LY;Ry)=5 zJOKtJJpY&E;1|eq6JLK_pIxnAdxJumkPdvXm zYHY~<-hp>opur!~Us~x=xtRK=wyNFkw!aio5{%rQp0U>>R#HoDQn$1IPje$E9}fFQ zo2wOtsY&8)Hk`GfU4v`VY3!VTx6zMUG|g21S5FnZDxP1#P#x>|J#J(D|@~68qU!0q)Qq!mXXI!%8>T)9DDAz1utDcB9XQfiBY> z!I2yZxg0Qj2e>G2N{1OrBnL2_6kjm&@`5VR>+;uLeF>7o7%~^`3q)43|I@-}SiN+1 z)h^9=wKjlazqNUeyklVEHTVCy9IPBzAO7Ztahu=$P^eNl*N?Ed+Pg<}et3nraW}4W zHC%_qw#8eTWs2GcZ%F~7M@c+V!$A>V((5spfXCRISm-Lq+~*pqPj`jP?IV+&<_-Uo z&ld9=J-dphe0p=IBVUS>Sn{8x`mZaiI4(>#HsNPsl*FOsX$mPZd=t3`Tga6TzT&=I zUVev7HeqP+kRCM%ZIBCH(B%w-B`xJRJ8sHQC6)`?N}H-7Nq24aF$P{r8tn3(ughUbOm&T)F0 zDa(~lr~T$X(|uo2aW}}C%q`7`$axdjx8j2k?OlC4&wsYMF4{m<=Fm*_O}l%?^$FBO zFK3tS`O3?ltW_IkF?O&2^U^7F6zaq2_&k)$2ELQsk9Z0JFN-P7RK9Z$TUA(}Ni$bus*NKoEwN zE=1#NZvT{Hxl*5&5u7@W3CzwEZbQC_37H35#8j?T^;JbmFKwTH0=2G5&1rS#-Q zLz>A;xaif|dnS#<9a;)qUY(2+2qlNY&6?anoAAz>XMMh7P4_;8{qDOMK7&ABv=_AT zp%g^PTM)8p*5;m;Vkw%7_|?emFO2^hPXVEH!!LUVQJJADMI%1{8(~a7s9J50hqAO} zPFMOM*Pr@ANdFI2M=2eWaec=XjD8wEoLl6fp&&%Tpj0J!UYKXR*`5K4dbdCE?#%ON z$n8<&6b#&x;aIPABHxbZ@nbw|>nM}VZ%yde3}`Ykc=tv#-NGuESPEi#Qw4`W6m;L~ zao<(~?g{q(suYp!Db&9v?i9Tb8uP>VE_DO#d>`yLLNd;mL2u+Ksg8%ep7KW46kmJs zb+>|sS$Ww0@4qZI_oU>|Nj?a<$e3VpiuPyo$)Z@S*PEG{-GnM z{Y2lkqJ5guUX?Z?QXil81?nFhoM}Fx!gBiN2oJ}B+|7aL)cA~hwT@ngrw^h_+eUoG zHF#oS56%&Ojax`B`^WM50{6k#KUbjdGC$Lx|M?e!pZ^zsozL`t{r~zs%;n_P z0Zqd7?Uqgek=lPdKRQD=mhn?}JkLCxZ45 z*cg)m{#Os6`SM2rF|nT_h8!*ToU426E9{G-f9qiVAJ&m#U{_yUTKiU`T^#~p9Umc7 zJa^M*6S(8x?%e%GUxn$Bbv%w8j=?9${#f7xlH|DmRTfQ5r0ncw9MHcE?)3EY;8FH> zATo?6_;M)eEiuZ+-@{|qj`bOBKg--nPSe}jT$oL}d75CLfCK2H;>S|y0D%)cu_|X( z?>=rZQHZ-?X8?dykbvKhadeCZ5OMRFnO+|zpa7UfBWTbHP$-0gTC0vIw}Flt#3Oi^ zgF_|ZBXED(D+7?Hc8H^}|9u`0pFRWwjtR@XfROJGij~rU&reLS{1UaA4ebH!uUEuE zcK{%M?bpVRjsUcSbNu*W^Uo-bTuWH9H&*w}LC_ft_S_DFQ&@>oLWz>dhEHvT`XYTm z)ksxxL#ApmnA3h(i8hX(&ELm*FLQsM4U0AjQCn-*QsJp01qxk`aKB#Le+cM zzwFr8jf5QYgbrgt1`7_6yxL>yfFUY|zTaKEB8kxNyxFh`_$*s^AKdYpSN?`C|0*j3 z`Eb;!oRnh7+f=borN))Nxrg!Y7B${SHpgM0w0h#b4^@q{XB~sK)rIr-xwG)k9;bMD z!-jaeuA~0_{$C2EXN!_y(K>p0gzedNM-JZPJcCs{*9^W=j1W#-W6o0kVNesdMqk2$ zN;ar)=ShH)EhD1uV#<7W3@9ZQcy|N5$LH@Vey8RDV(`Ic1Kl50-ga52NJ6knTV%_;L_G>V5YL` zPZ~FuqC-5q-9TOKJtxM^Q^C{A-r*t}p z=3LU|Fcx`l8)V>wDHVG{^s(CvPCOdLmfL2m$>4~ZJ=dI66bomS1ebaV3Tmq+&dE#P z0&G=!rh)Qx(i5ZU9cn<0H(RxqX_tQ|&H;6xW#{Z=9lk;G*$P@6TKDm-r|i{<6$Ri0 zmpOygqID2`-^o4t!95{R|9`hqw3h5he0e*2(I*sZ5;=Dl^*VM3FQPpk3Mnwm{6%U; z&+_DX<#!m8JQPOwtaV_+_P_%)w_p-U{3F(MuZPO3$|}kk${fm0*oO?8@5Znr?-1lz zqfq$r1+v8Q$`!)9ptN1cm~2E$KR{ArnQ7Xr#PU?SG`A~Iq?WD15XjO0R2{h%D|G*} zFj>@E-OiWxWQMOc{sV`VZe??Oo&%i?oX)f!9MkKra#(j4A?AfF1TL^G&IB(WgLN+# z|1tkIw6+mkK+&H?~*;Ie~*I1k`0pCNwP_MNKuh(M?97) zNy$eGk-+t&NkhqW_r_7yQA{K*y-U)S9)tAOXwKw-H_C(>v_rJim_%Qe$|X%$Z&WpH zUXY+{aZNsz)w9Gu)M+!=e%Z}}qZ;G#qe&XYNE{d-l_eFUO}}iLE93+)!9(vMGUkQI zknBKsw>t5pS_D}!LulnCG|4J*>kv>0FlTaT(r2$hK+*Qoe89F_N^c18rMTCnALWcZJBX2HM2cNVf zjdzVhg7j=GIcy@ZJAx5v9cL_9SiZtEW?fINgK~;ip>uAi9I5_}1Nr7~Lm6jzc0A>I z5v^LuPh{-Yu7du2Fnl0?aD}*qpw6iZl{|(#iU-N-^DM0*?Jw=iAWb1}3R!!5TUwabYbDwQHN8Hpw#*)`ab^t+I-RXNW9Iz35Q4@X1_*{bQloa`Ja~JXSo=M5HF8 z(6}}9bx66J3@U8x7&}++aB#C)wVZx^8QnsyMQlf#D7Z2xlEQ>Lrn-8Z^IT+uyVzjz zm%N2WS$*z~C=)BAx$30vq*95qxA7D5%&J?xnq5Oy!<;BwlQNS|>>}2cVs)AQME!gv zlKfheLMf(r%P;ShgO;lV;DCc7@H4=V!^LeEIC+P#shx7z=mp1eTmNddPw4aQq5JfH zZ(k{07N|_k;+KBxo4FfSu$HevtDO$)*30XaaK%g|PjFiUakHaSqO++3(^$H}#R*J3 zV-dz4%hxH?0oDO3Buc@AAu73N0oG)jNN2)bfLBCqL`+(lu6Ab*mwuMqxtQv96N_b+ zSFtIycwP1(vIFv3a*+D`->Rnos(Lls%2YisGocOfnZA2_iLm2pkTKDXc&@ zBX?P7v`S;;Qhety^GTc`4$nSlEM_dTD@s{9D{@UQRwsGJ$->_jZ2ab((!vDEP>AE? z{L+Np8%)T;(o(WLy~U%1iJSx-L7k@EoDYt=m{uE?C!BS5P_0`%w7<`51hco4^HpxX&vs9;M&085V_GDPsY&vQ>4C-R<*D)v`98cjY!%^ z;M6U{xlQ@JdvU!os7cpXxOb(Ug1bp;#!X?8f|3Y!g?6vPt;2u1H!N)>@x7nI0in8v zD#N;5r*aL(4LTA%Awzq+>$w_8GEx3CsepG*2`*;n;*cghz$pgzrvKr&%K0nrL1%VjgjU;D!-1D``yG zK(I)_TJg_5U2Lp8Tff7$!xOjRZ{R7<#pX5Is`%npL}>MygzhokpCVhL1|P%7rSOPUOP2DguuNO06})YOveDLQmijjgl$YU8;DF}T)LdpfPW;+MAu zahL|XbW1I@`@5T>cx|{u%yt}9w(NHrAFAueee#^n%;Qi%4J7wVbC=@gU z{x2A)gXh1jQusWj1{B;h`&8 z|Fp+59hB+DWhoxYhe^zPy8mmnu}bcdc~QJRWc@#< z&+`a-;rB`MPC^T1idi*d|-h~+HmY>hPxD80!84e*7>!J%GW zB51dMqJE=2K?k?g%m+AD%aaoAMSmmu(H27USb>ZG++g%~_01dd33(ua56TM!am z6Y`Oc4XN4v51*9UJIF+Hyj$~;pz#JJIsU#6-DiPju>OuK#vqrY58hejC0vF z7EI8N=H1yN{cxR3kLE77@6(75o5^j|rNiYZ#Ig69mg(wr^r0t&YNZkDQJFTvbLe?w z)`N|g=$e>E#va4BfbiS&4b%Mg!DU6PCKSOM?MZ2?au!5d#*DN!!1P^G<3M@?NVo9= zZw0UVcYna#`YHT-8U}6EV4StdzuUw;n`vy-!-TULEVM!tw5jRkys7-|M=?x}M@(AT zICr#57sTG(tq&ZFx7Op#x(0f%k@$*p+PwH!h#rq#Gm2ErK!|&R4x3y}r|TvV|H3?V zKcDw?G{Pqz<4p05->@+l?)Wz*lMdEVZ-~i$EX+0Yyc&8gbcTa%R-n1;QUZmXESwv+ z5AzwgKa4AL=s9YuGkVr8Ew<9=DLK9x?kM(8%M zdWhCXeL%jrf}~PH$3V-Ol-+MV9NAUCMRY-)^Zndbb(HBVDoeMJDhGi{!q~L1^3v_# zh6XDdaPNT92e#4LOC!LpwVMSDilG$=J9HfUayW5jDU-NYau!6jANy~SLOE1*w{T;L zXK+_lT|1K#YZWP;!~YIkAz*5ns@`QV-4Obhpr2_WwdfdX#~`3v*q1fmcjYmhR5eJr zl7;~ zU13@-b=2(4?bgHLqww038JSw}tEAedXD326#g*66vcz4XZeoojWj~)^XkqscNa3Et z*p7L5nD55!XtbDcSXn-#W5%JX+UCfD#B+w=qvf!4HN~EaosOZazX`5ySkn?Fo8DdX zd}d&Fxt&sgB}nxjyH9(jVgR}~@A4rK_X3-$BQ69}UsEFvJ}x{t+3zOnnwH2ftl%Bukzt%n%}J;NY=1J#6Bc>W4B5O%jx2Mmp$sHWO>P&EGt?d%8R5 zs^NZ>sI&D^*T3v&aBQ3@F9(-|i^wVf40)^zlv`(Ny4SpH+GfJv(`<345pUw*nb>$h zzhd9~=r@}iM4!psUdK5eJXM5d2MzuTGbmv@8oXY5lA zXQG$pWe+f~pWe)il3mH??O(Te4PIb2yh6I}Y1cOu zl9RdbMJhoID`#eNwsgVMyXDSc_outtQ!E>K8s7bYVUs4E?Ywd~vHY?xa_ zcDJ+{lKypYS$DZLe(@f*LVcYPz7|Q1xlMi!SC#D@@lOx^SGEP_ggwVPq^;3TtPQA< zynC9&4L2e@$i%!)+L^WuX_~FUlXJa_(A{S8d1iX6u2T=_Bpm3cgsQ{g-C~qu?xRAD z{AiE@65Z^jtF!_kCj{{FKnsH&a_%(0yJ*M#D$$58AegE9voSh8BI!S9TtL~P40{8n zVi5F^1s-l$I3CB24J&4AHgm^LW?$dA3MYu$mCbOR%wP-L*B4;)`PaCF0owMDf0hvI zBr;dkpGG0uPm`Bn9emcvU$)V9<0v3z+^Q8k*-5`R--E9H5Yfo{&Y-H`IZI~rt^zsV zib@rQDh%ilAE18}R`7?j3t)a9aCK#|fBL&bC|c8PC#79*#{BjxB5bb_q%;`VU~F|- z?Vw25l5nFr3S8JuHhQ}8Hoy+es@6+lyio@2GDCO1R$89glYe2HOtZyJ3(OuxI2t~# zfqkJ*)l%MQURP;#qV<-$8$pXi(qaO3pPxHX;Z}ZlPOg`~-;?BY*X0JR^U02@#}0lk za&blwl4qMFuTc53!Jn~Vo3YPN{u@6cCbFhhgDOReKZ$-j?M6S6x#VO?*6j83W?>9} z-rm;D{zO*|oRb+c4qd-pkIU_WdVpcXq!GK+>U}<8uQ}HL(5Xxga6X0I1N6`1L{EBm>f0%$@6R^>Na5*b4|Ewyl=I%C8p7&Z4DwMrszh86bHzP)HFv z4OlhrFGK02hBXJB6SbE4>F#vljQpmnT2MK@m&f`WNsIY&x7)4o(XU0$I1GfB%A)RzY}&%n_Y7_EEfh1JoxVA)G}2;lJj%2- zu-8f~XfW(I5ZV~;c~20EjBASiJGN9Vdv^6y<{L&vM%go015#=HoVk?2BkO>~iMUc8 z8xao(^Dnl&Y5@1yi+Y>&(a$R{aL{J(rBT!Sw=WQ3MM%!5nbeE0gQfhU2~PlS0fyxx z50;}v&3km%i*-EBWjt0*xn^{3meq0SnmxWtRE)kAR)cGy{9Byr1+N53yV{ z$D1<}Sev5J?lOCpbnmR=HRUSRLH}rLG)VqE?uXh=uL}#)*J01Ui<>30VHGdbO*8I= zw%)D!FNv`!MPg{7kY`Gm7O2TIHFQ|SnyfmwMj*E+XIt0ss4FBp;(>R=5>GhLKC9TW zx0)-UwSM*FGle5qxnrg{3Tz7QRB9KsUrCEw+a1xYbnVvV^mpU--DeefTfB7)v5MHM7WnKrJ{z7!u5D{AksJ6Tcomn`$=(r* zc=NgqH09+4Y?{^Ci)%QyNd2#4`A*(vF-K51z;Hsjg1-FoFeGFDU7{uCa<~7UbOYK-VZuY71j1ptY; z8g}|RwE&?{4Yaq<%U-4Bc2hp-TE=benoj_wj6!s*b%Y%T8jdbu+dXFDE8CO}@0!Fp z7_?EIySMV6+W3hW-uK0^U3Q*>mR^-|yT!%SzpJIG#J`+fw(RL8smt%v;goin&BaG4 zJTzSNE1m)sP6P3WbU~3(bq9Y`X}S5gnM5WENB|ccvTYjPV~>dXSxVWndBd1ec~`9X z`(6Y=R|YE1D(Mbetd?S){0l57{*kRo&-`FNA22F>w`VJMn*N$hZ~P0M#Jh_-m7IMl7c*4H8Lz9dbA`3vS2{1>TG}ud$hFDMi+jl-z9tCY| zYlesOnD@++!J8Pi8oZi1{t}s`T-n6w*!4zm6bkE)1BH;IMy6DT^f)P`Diqps_q1N6 z<->iqE?5i;(s_R#j<;%7j)R}e%E zs-4o{Z3sa^B9C(VTUY-YE%YI_6lSq{WPaCrx-NAK2s^+}gmoT6A4Yd2*3)lgdQZYq zn`}8A8P5JL^d1!Jg-)S^~UvbZ!gNC?_S6Cg-Yv9t}LM9=#(BlqkDI zFL$`EP}#9x-+_*vTN5ABbd3C&E%NcNp^2rW{}lyNy03bt0m&|00*=}>UacqMk#=Xg z8b~@#+WnQwe0Dt+xcb!EsiPfaeQYWBlUl{bOow(Wuew^m9Fz5Y6G zv)(1W&G^)`!}~_Aig=ET6C`O5@Su~tH?diR99EqGu8*5`Ea_ZzI*JKpRwYN6c73@k`H^n!e}P9V0w= zF69UtPSqhTE0YXe59(&x0j)XRRsdDfqBH%`WbZkMtnl?e6-=|yNw(RXyna)eEI zHtkFOe6dh7z-P6z`RSzmtNpb$F`nQ3Yp3_xh1AX0H zlQrfmjO!J*%gi+8ty%e&EAGdOf1z&I2?o*e2ucU~D__O{9BA6)&p$#E>>d*4ZRwSLskMd$FWo!1QKzl#1-R}H>cPM^qw>j>t4 z(X!zHE*sXLo&=JhJ*r`>=$RQ*BsKxth~yF|3$KeMCKHtcv+8C9n;qkY|E3Y`bxj+D z7mA)>L8n{JOT)EmB#A%a+IWjjqY%e)UzUZA3q7yuC01O=$yNvFuF8vnx(j+S$dS+X zQ|$KVAsC;Z?}ZuoANijAjYokXfSR|UPc@!T2gilKLD}7tVb=aZx9;^hM6DVTan`cK zkLzN}!vhF{TU9G3Q&bnS^S5k|kH<#ZY`?h}k8hz*>)8TV{Fm zhd1?_sPm98LRnf&Hq_ov7Bl?3_Q8j&`e@BI1cUyesxf~$G%6zjeDYiLs)E|lemqoc z;IIVNRx)uHU26zgT^8dotUov}S3fjqbyG{%%2h5Tug7CE?FT z@EUzfYAka_2{k#1+DjmG3*HW%xZH0`$8!@OHuFKStqP0h*fYP2i-L#9ss1!I-(kb= z->;gfPX2u?%k&78^4;IMX-nUr({)@bex6A?A7w|&Ntc0GZn#VI(#?5DJLtKpFzfo($dSP5 z9ES8@<5?v=A+yf4bniG2chGFNjxd`Rp^`!#5v%-hoyXDdP25h;hGCHR3v~RyiUoId z-Z>k#v11#~A`!TM=@(&-t4@xMIzC6*SjpllE;LyEWP5b3hFCeR?C_>(9tG6((0UsTnVnayg1cuM9_&?8~LrrO32rO5JJE z^~;w;gVS`($FuGd&dEwpRok%JJC&^!enlAoBrLNnQQK(`TmM=NRI~1{A*c5xgP>|V z(50A{b!jsmPwE<{s94Alp*vSSr$WqRkF>X11c%GvSCK>ZMpu45+p61-HoO+qqxGiZW?tuU+9CV0lilya^DMAiE(l%Bd zj?8GUG^;(yIzC2llslk!HYZ_P9{`kA5_DzB)(@q1{;KuY6=l zpR_UVn)dWQbJ?J^9s&`Nm?-3i!o{ei&$5LRV+iMnRV=d;qIJnv z#u$71WYv0>Y!lKVTM`KfCRzTe3O_o%R_9AMnaVZK68ND{rC}R4S$y}coe-pXyc$1) ztl8PTjn&OVakG4;0e+T`Bt>=NE~IcLW#2Yx!hw<@d#tACE7&wW%Ii2(?*a!aUH6V8 zKV3!(G3S_t>6_7to&I3h=4vQA6a0!vLQbhY?bT9w4s9~z-aizCIwXAs7^$k;?}}3& z{RFbh@~$4UXgR#HzWIEQ`E`$UwJ+#}&Su zN36cG=YH`fHw;M_*g}-}&$oGr)4N3CgGw)9rpb3njK_KvpG+Cc|B-T61)o=e7qvK( zi^bYg|Y!vRl|J#lcE!D(~i32Jba)`7S`=piO3_nHF_wD6lzCi zea$sobi1ORwWXzx#!uIq`srw>k=8}GAHwVbWq% zYw89W!}hdehX_A?oC;hd&htV5%IFFBtA5B_q zbnrf`%`aQXAMh_MdFhF?_%x}`^kOrJSR~q#B0$YyW3C`}@QgX4kN?XLs&-@&=M|tYSY9X8jQ)M52k6I;{x4O76F%~?{?n}}gSS+IHvFyC(I=eZ`lCjOpn`? zp$75CdT~Gh1L$?u?4<+5R39b^R5>ColZ`!on{v{QSbgFE9N5!{KAyJkMG*%pjZ3 z!$qlJAXLjJb6g5HRR?hEs-Y$0?%hV}XBcfCjR*y*Jdd8qogid}L3A-}X-WBm7Mr2VH<_hW#l{1ntjWnqpr z>;{6M@fwC!lBU@!*hWe@k?`RNQSBGnY@Ch#A&;JMfpc(7jq1kL4m^?{s#-l7G@FgG zjSG_SfD-BWh{QE4Wo>EM57;gFI4JL$@Wx@6(|GK^d*mRy|9}O3d3n-^p;Khk-7;15 zOCDNC%U40=ME#t+vKPo%p!l?6Hw5%`WTdj1NnUQZb)~;VB5mnkZ-x5L#^*b;AKBKT zJkE2X0;kuvI+yMNgnlQm;C~$h z97B*nL_5c$dcVxi^NmI8!}vPSGgE!0Mu$$mlWx`VBXHIqPup8XlDyA|-U!fnx2BbM z{J#LdO<|dO7|Himh;xL>dTtis3bY;px&=>um}A@()6_`+Z*x`%qmHPOt$W=+|S-y9az2_93E$Jv~|VV-^VuTm-qO$09o?$a!b>^VBF$kp+J20 zorq;(YZ|JK&)54=rFUCYUcfxWxS`B@(C7iM(d;vq^RirT<;h`DhUmM0^v}DVvw+}#{vcVIoO8U z;$Qd7ORyeoYq`%Z+vDt;L`oJeZ@SIxe;@e&^0ww;k$bF^U8(~*o%=4}|K=O?MVpdK zAQ*pjZ+|LZ1*X8$-6YtU4ZxIAYL9&i3o?Va_Euk9VL(iYYVY}*|By)GZ67K2&k71+ zr|vs$c|Z0$xPC(op@-fg_Sw{}pEvKFw@m3rV-8>ES5yjC#%KP~c43;M`?VfcR6T_$ zUd7oqFZNd`raSw?cS!rSf7l8JPLHF&W=8f9bf9@MapdLeJG$pgaTtrt- zYD3YqvRbZFy-IRE=)D*XM}oJg^t!I0S!XR311KWj#C+}#MV>Y?CVL6kq+IXVXTEP~ zYibijKte52YosKP@rBh>JljFcLLC4nB!GD2Q1YIGD8*!chC#dzCJ^E)QMC6vQIPmH zd#e4+I@*&#>CXmWL^;p3LLUmi?7;-_s0io-rcm+GXoGCuaOCfhBIY&^`MyEA$(#3a zYO}XA55{uSMz{?OTN|Ik@q%oc=uL6?^3iZC65aa;m}uQ@$Od$=YJKJgzk6GA@Wf1G zP+(4{aVdfoXqz_StDNKUj;cFIhT>gQ{(Dt9*{aTV$;*+Q%h7}bsrmlux=LMq42|QJ zE{%4kVS4W7ox@e}pQ6Kg$t*tKO9 z>_-u%{ceLsj9?wV(OV}y!#M46teA@n5>>;$7PnB!6FiaFLFkkov5R0X!9uIed;JqX zOR34)9b9VJu^bS?k^8ptsJ)!KnVQR~a#2wC=o8lDG9l-iXK$=2@2z|<|IJKskyLZo zd#tRr_pFu{-gfp4b;~9?$H$E|@JEi_t(pN2iF#z563@6;iudEFx;N3`b+mjmUPMW( zzMv)u+v=R}> zw<$V+x{!{x2FzI~xbhA)^*GYmUYR^BUtH4%Jx91}N;Pgv4O|{kdV3sYC%Y40V&7?` z&zs$J+#t=@Vr2B^Ey?nr^*in=*TN`GvMteALst~bltkCXK>U-_zF#K{}v0n51 zAr{@yZ2pid-$<&~MOZe|4(`!O5i^hsI~guQQ{2y>@GifXZWJ5Tah2 zt4m%MQN-|js^x#!D8`m_$ra=K>NyGx!O zt#bRAwFyTk%}=znc{FmgbwS*TjZSF&;RV{IFY$g(t-*QyX>q-9o$o2aPf?({9Kh{m ziwpPLt@Dg86{Is@QB1}cPVwsQaON+!(`Y}+9l4~Q=lrgmZ(rkEwfTa;h}PHOJ&OfQ>kpQYwZ~!>cq0un+T_ z{Ja%)Z6aU9?@*1+SYX8GQ|j>s82Z%$J%#YuGBpYV&lv%z~G_HbE(vJ z6qom$--a)p7s=6L-i7Wzm)h0pmv@9uv$h=zpLq@)pl0_St8_6G9_-n?{R|Xa0}%=O z&}+Q@ty*H)r_ZK2Fvu?Rs>LQ;4FTlbLE9Uim@vhQO8qV`I8S(P7g75IkbqueH|B>P z*@5Q~fYkeC)Kg=j`pvsMED`cOsQ@q=-*LA$P?ljCqDQ+KDOOMqJn(XeUTZJ4`fR-I zvzu3FZ7ApzJjCg1vO%f7%cWh$I${D=dLQfsU&dXVj6N*1DDui8T(qE`Ml?+mgJ5@$ z&P2)jG(|Hs*Ol$E)4iJ449^_g@TuWZRY!TKMWmGriyEn2Lzhbu0C7N$zwEeW;aaJ- zL_(rW#aE-k?&!0)G5mHtgt3~zWd_-ht6|zUqVApkD^6@?&Bg*c6+bwm$bpGd<~nVi z3opCTzy4$#13f4{5uOIN{(fE~)956@i-z;8T}G{zD4jKrPyS_Kd36{K$7!P_0i?h} zYkX;{wMim!FAYUqhq7ITu5_ta)38gcZ@X}DZi|`rw3wMK=MB-PPx3VG#doXq0e1_d zvYM$c&0*oN$oob#tJNh~ruBP5S6_;TRVrSi_e2=*v}dYJ2i+9(d?Z&KfnQf?p?+p%g|dBN;&SbSDt4MR?TsysH5=ZV@bOJ?-wOc5c{Q60)oKXj{W#9# zMTeV#G7bn5eFCd@_UdEcBArRNileRa3&&`$Ac&c!uF9%Gu>MvzO|cxt8v{KnHs?=% zEHAhiXvu4wgNW{m3s@wtAg{7xIByw_NqirZb~7NuTKS%aC2twR8Xyh>DY9=*gTV9P zAXvBcHtrAY4M%p9;ezLiw`NltLN%-*T+q15QgR#Xt_R3p9W*35aNvEjSW&I74ot-j z;Bf|BS12ixuN229l{zoYR(!ZfH z-?og)NKjrftjU_;p@(iUxkzeN1G4X;y)KHu4sEmdc(yXp;I~w!G@BZ9h%k)HC}+hS2)-C*&tlTK(g8VXoQ`&DDhCIvxR0PT-R@WiyI? z(}mv@!d8>EBY$>u0Vy7H<4h4>a4X!m}4^PU^uW%)sO8 zygf-+@!cQX&JivyfvILl#4G#apaE-xwR!e54r`{=?SW+AK}C2rjK>ntEl)rm`KV)P zOP^*K9VZJvn}ZAu(!3z7GW(PAcHBVx4XF3+WV#CGO?@)9-wd2@O_rKImHi<%wOwT} zcZLs%uAy#WV}7Xf(Ok=o(VD@5?WWshHAF+6%w^&i+cC&H@mx*l_wcM5B~2x^1E7xX zcfCDy{O=#>#6FZ@CkwhbJK8lCoFNbPmPel-a zQ1OM@K;x%J-%*v<(bK(Q+%EMlk!!u$!Hd>mp%q7Gg^jaC)1f8`^B=nv+Blcm$E_)2R&~S$Dg1tk4A6Ot_LQcQ+`23!E6C$jr2}b7r(Wb9{#jH@T zE?le7N6o8QR=XbBuZ#Dj>9Y|Q>th(|8=Y5Yqab$Y8P}B6oC1wUSTqnT2#o0lCYCtG z&~~^ZXvnhtjEgER)-}PP3&M1o%KUTj+1Q7h44EGq0BUpep3`%a-X zACGF8#SwIp0+iu>l%|Jj`sf>6KdO0PoA-+6z?Aild8&jfu!O_YcgnRtj?H~85>}sL z(DIAQ7|;y$d`L@w-A3wkhiDHml_BKmma=rCk2S-zkPN%^PVim?12l{7)^XlD#*Ez4 z>1}R)e#cW>L{l!|pCaeAow+18tUXIX(od=pV(y_g@0pMvc!WTQ zU1Orv@^_xOpLNc_YwJ)N#pXB9+-n(8RyTBiwLZk^g*w~=$_rzxWDVQH+UfJG%=%i& zx5Dh3(c3d1ImMT#`eINME-x&+`|9>D9aUB8_LpIl%DeB%tWW;|K%Y4eAfo26BDLOuc`K+ zySHpKAN1~4-=6P9KQjGfUG$T|LD$T6!}|F`iY<1fQFIO$jq%5{ z24`B!Z7DvgQ@7c!VeS}0BPsT{enHf9^l?A$%1FE;{f9Q$KR4fr{6sOI(=(bu31Rne zSmzG*R(*0bHYi1w=c*1RmU!uj52{Z18xDxzrTo2lUUBJYj%fxHJcjh=SM5zO+|cT} zUOo9d8MhU|tP3EXME)+eTwQKTqaW=(pYby^3v~l4oRRzrIFWF9y6@Py4MOY+eh?Wn zv;c~ml1Dtoyq%UTwiTwCA>uCWhbMLkI8@K}Jz~->IUC;pR5Jx*|BPEIEF%I5#qELG za6pnbQ(G!ySw)GSudRx9NYniGtDF|Z?-b_eVF&S+4>4?*T9A5AYWfq#H0vnD=YPah z{$|nrHD+9JG=<9?Z4-)+HWu;lCjQ$fq;iX{ zD7L8LKVN)yC+X0uS>h_4cu7sLd6NPD^er)_h>~0lNl;VPWL+^`q2pdBnGxkX%7?KTmC?iKhAQyyVf8;~d9(y^)e52>8XxVe3sK zC+oF{GtpA^T{^Ymqxw$E;Djf_jW#N|Gh3sHhPXq-Fy}-tc&c^=KNrpHpXxc;F7moy zQqI*cN~0Xqs8tMOKdf2XsqxZdFkvNi(^c)PBwECU><86~OEAt_O)UMN3Fl>7`LCmb zYn&e_g5Q*}x<8w%OXaVG+MRDtgX1cZUf09S$oVj+c;R0#^&(qL`r!4pyFdPYAHe`AYLCyx?#}_D-)&F0 ze*q4x`1qz+R;^zRF^t@vy#k`#C z9}H_d7z;hIf84vN>AeGGzMu}8sDIoKAp-N0^^J#0jAPu#+S2kjN#MBe+FAJ9gKFtX zavM)QFApNuAMFs8gK5019@aes+wIiv0L0lrDcE7+Y-J;0{nT_+aVX+9t@lk|a_G`V z+9a}^n;zOekpzn|YrHC_U2#AYh!;b&B6z$29)YAJ+WfA(|HUZyH1ZkU5%D4DzMNKz z%#Ct)M%j~z{65yt!X5<0fC0Iyz~4U0w*IMaBQBd1*LWL`syFh$d^{trevX=78P0GY z^~A1~o#hnui8egR)2LDxVbqQPC@iJ_p)uY@w=MKyX8~Z^P98s@6Diq&At$KflP3z$ z|E;!$Y(z$1j}t+z^!SVf0PgU&k8}q%iCx~C4RETerlB&?PxfqbLyC`IlaMb=9Q=-p#1R=7BQS+Vu_XzMh zbl9SJzS*~KV)}J{h%GsjJL!>mtftBS#sBX3r^)x^T=Ci8KMo|)^0WRAF(*Uk>i-@Y zpL-krP=OzM%KpzWC>NLrmm8Kc;t1ov;pnEp5Wcy@udaUK;TIQve&OL47k+->;TOTs z!$&R>{^8sVxIs!Fkl8JS-ZA32q$poxzl&YcgLZMLf>co#A*+jbLb#xS@5@dP*7TCc zl4w_2BRj+Kbiqjnu%4cBqS!|Qb!wt-`k+UkXba!Hr1S{wrj&IG%I!d#a;zHX>a)>N zbI96H;mM1U)sNjUhPdJ3Yr@I46^KAa^Z$R^w@d%xWhs6Bj8}7z?))(y?}!0Tn4=2h zN%+UmR++_E`F|M>>2`?+%I^9_u9fMz5}&U(p4*3B{XNzFV+D@*(p-_@Hcuzk)628r zxDz8CIJs)Z^ED8bI~<_!;G=of{@s64Dv)Tu?!)%|pL%{mP@wwuSKF&8;=o3syz~^Y z23l`~5T^j&k0Y_Z{J-`lY}I5U$j@=t`E7zuQN!~?rZ@uIjjcb20b$SPA(Q=Ixzok^ z%>=C`vUhBzIVZ+y=~rhMm|xt9$v2%Ska0bS-dTVyaBG=m2Pq|{t9{$X!E{rS$4>d z)Upmo{-oG9pOrDh%3*x3f;L)@qRs>+0X|o59x8JI)CR*JSZ0*`vm!nS@5yr>#Ev2A z@er3Km`4M|sU2>H)7M(HGF;u#O3eTokF{1xU4Q*d+?0bC`?dREX{-Mmn0^DK_8i>N z)_=7$a0mqFn$vBFm&3@)YRMUCt4g`Jj2drCpExXCKv1N_SY9zz$*%mBFo&Bd1(y6i z8p|R|;ZKe`7ysZ(_`q%xqMmnK#xG`o;UW>uy;y|g1Z$72Jomt#e+g2;T8J`lDnIH$ zniF@nu&b?#P<jUpo(FGt*4_S`YCIt&nts_hcgnxR37GuY&E%hagUwU^+S@-q@q?i6r5%uQAKy3oC=+Uq zRpC4NmExOBj90u}oFufKbMfD!_Nsr^VuV}8rYMBs5OWN?QB=$(6y!hP&?H1|f%y7= zD*IQ!U5d1e?d(4BaqQhJ3%C;IGk&Ks*A^S|e3ju5<)3dnXugDwz4x>K{Tiyj$3W>4 z-w-xyTXNkf2@oMrCS~5~HuJk^$rAqm&r!3{R(Gzy|An&tavRHvKIva79`W@#N(X%FS4AuLKk-L_ zn-@%W=9ai_6BRZfhHZL~t?&%%lc((zJ4T@qQSg`k2!J-(?f$JGI(PH`DIJD#yGvWY zQ@$m21rI$av;N^9E;MzXUV>-wZHL!ez3bKiG}yU~5DbWIGkOTJTO?9yw?`+~?nhN8 zR7v)RbL3xQPqV9K(mcHOv*YVNF9$H&5F__Nk}mhjte$1p;NL+y-6||rODcw$Gj+AP z^RyC{^^)1EZ*pN%jA6yR1N$M(>YJC4M_tg_;(xzcnEZbF`kHLoe30uI(ecomyvXOa z3A>kS&QbQ6oPk#Z`yp^k`Iz!|q}J$NsgrQQ-5et3OvU^DRafE|q`oBH+%v(zkUOCit6Ceu+#pq(V7tKe=`&yNP@+R^rBiP`r{Lk4@p#7H==YmZRggQc!uF`l zWS#QO^KluKj_5OF1Zd0cj&KAJ$?oj5CXxpES6!X@Yd1=F6yaol3s-zE`~WljKgsIF zKCVsKyd3+xtvmUtu@3+0!d|kSI#^vgIZdZ3~}>0cxeSB ztVkZYoeAp+0AL#;w03iCXHulssQpqdNdcXLolCVAg49_WGb!Vj;xlsGb;W01;ZZMX z)MpPKTPz=$UOLh0A`v;FRUZ>#to7v|-&oBy;T;*T6^3Bb;NxD>^8fxhoRT|T1o|V- z{aPF`e&>Jk=ze;?<@j2oma`A5s1IdfQrW|f-=MWe)SmZU?uq+ujKNw%)?lWNlBZ7_ z$=4e8{c1q@6}KbXS62>U!cYX)c1ASYSkAhtuX?sDajclEmz*ynB~FVzSFCAhF?yf{`J)$fzBjo8czaq^!Qi{>k{iaJsALI{iimK4p(*(=~)wOdWG0_*J9 zlvTA1i>y0-2MI|2duiUW)W>5!`(x*t{&Vy{)PWp8*#M1~0isyJS7#$x#n^c{>Gsg+#=D9gco@GT7u z)_#XrL16y0zaz86#gzRaqm|*0et@%?=26kEKO;*w_?wOOI;4h4pK#Orf8M{~Yn`wB z2W+3;3W>_aWg??aT5Szwl8N@@)oE7#QRe3zSLc&KM;rW=4&=-FGC-HqFg4<0$x3g& ztaoyc4ujXr>ize|_Pk^;kE~B1tRzuiurxF3ve#pY_PbpHdB0=ZEON*w^yh$Ly87>7 zXqjfg8{RvxFRYQfah~l5m{5p4VRbK#?@ertyUirkXqA>%d>6rmLU>jG$q?uQ&Ds8MNt z1arZ6h}7@i5qwbW58l_5l`^l0bfWu=wG{j0mbj%G=n`e>zV!T~TplNjfZjm=dP)*j zMZS~HI-fn<4YmtEW)gQsILziLP=M&#Y;MHWMukk8kaABCq?sJ-MOnWSdBwqiDG}VJ zvu4q7Uu$+D;)cH78Gf(qO$qefvqS>24Ays3Yp$*9K1{ONaGsw=H}y#fZ3($dxM_Fr zK=n1pts#w&yfm?e@4in(*Qo`q$A0UIsxzTyB9(T__hWcD4YQ)jPAsQ} zT94r|Z)fER1SzqoW7T!PXqA!AOHfpvq9a@_joWEE zF87--gQO`BgH!9*+V>v35cDp~!&COOb3#&A%l{!Dv&dRCa|aofYaIuv?mxU?2RlT> zvEtDXiPho7xr_=<6xl%!=$&aAf~`v+qv7sc@jvxn%BtiGUDRs`M?~*pi-6Qp*U(e@ zGpE6&!+6Mz)Exg7zY%0PWqWQg6n?wG7vP^QLId&b%k^v8hciquI9{&KAQp=X$&yw7 z8EmbTpt&LOr#>$tsgIU*j{^kKS=w$oQm|9m^gekxzl%>{SjYomRQiw2B*i8YIiLy^e!kZ%=A3oo(5c9U2e374B6Bw#_i%_W1*2#U|xs@VGsS z3y$24X1tZ^Iz4VL(dE3;XqJ?oY%(PHwd+u;v4sdIfs*w!ZdrPF`K6RiJJwyqa z-!_pRffpKgDH4GSpA-E8K=O4%Zg;WataI1=*4wL)sJRpN5@Ioo=$L-wZ;Wu~a@o_0JX!Yz{D6 zyCQe^AjK^;Xt)W@7S0G^^bj0ucw^PN@|=Usd?sZIo^y*PXir<*b3SlA7<>C(&Sr6~b3kCb z-8135i}3I8UnAFZS;2qK-%CpZo_(Es4!a0!D2V1Y`_PHP9=GT>fIX9YKK`k}-+n4@ zfTtlKT<}T^+IVShh#gD!V|MR#}6ca|sxi2%uE|pR^d=Zw#U|F_0zr2JyV_~!mr@qaH(X1GutEDWMtVlYn6GOus6ZRR=Z&;@ zX;E^jU)l|oOwgK)HSi^65(0HAU=$W;=4^|9OY3r<@eBO9MzrutNR zJh4YcIBYPoL<7P##wdC>qQj;P)ZIz^L;TJR$)DMH&89S#+a)I1-Yah_XG<6_i0xZ$ zx0z`mE`r^c?=?-5$e8F%2uM^~)#3_rS8UF(fcM%q!p9LTKN^*Ed)!QYO2zi>iyqVJM=<1?%}6X?ns28 z(rFWGS??kcc`Hh;Xx2KjUti&&bB%*xan&oX(n6lT@)Z(n!1+yUZh^*-!*0#dwJ%Sit9giF2TdZ)7Ftj1s)ZNP3emeOZPL@71K*Kb4#pZ+09MUm{0DA9s{*sI@8?3MAJWje9b%hQ`%qcx<^r{-V5rms6DESyyzJ z7t>yhtMC==!rn_fk!4}rXPdG{r_0@k+!gmyboxD9P2lSJP957$*(X`vWNPJ{o*9wK z?EUIGH%0gbz|wlX(d`tp?JPs^{&EL(j-+=7SzXo224KtbOjnuLzCB0D5rV8=x}X9Y za0kga^lO~1aBY!VChVUm_Ezim|y-Q#NrE=-3Tr7Pos}4vgNzdPHBMt@O;a zh3>ZQ5{`0PMARLB+K~WHxOXvZ_F|EMRh4k?Gg9N0{0E-`*#;uYSFX`F&)?kR_|8Te zTMPB`2L6Hn(G|%viVxbs>pGBm>-p-3YK$HIZhFy*0zp3>CkDq&?!0@+g4&Q2E9(tv z=wGF^Y&0(bw$*hQ%ExDuVerZ5KC3z!bV|E8Rz(I@%U;cRtL*!?PKn-g3p!4qEwqlI zQ+s-GK?-Fa&vnZjp-N0CZFHS>@IB|K1vs=o&NGPY>uM74U8%z4yb6Ge`ZGPB*^4^S z?>28)x8i_Ydb&+x^|Cw&8JzGF>J;uMr%Puc zsveR1-grQF=i&Z7x%;b%-)-S&hc1)Nx|E!#1sJZV7&*|1KygLhl-QE2OHKuX*+y?e zq|+L6hnx8I`nTxx^j?30qta3Ke?I=BfN9Os!Rz7~Kt?XjB!=uIkom>{Ct@}IuROUM z?w3VB@xfg4?VL}Sa{>PSFIq*AXcb#FHB6leWq(fc<^*!~fBOlk_Gq_7n_kcX2vj;w zAIL^)73L1~@CSRosZs(@Np=&ft}Yr?Q!qSzF=0e7+mTbB)B{>Y)%N`pDb#Ni;`d9a zx@Wrq{{FjSUArPZA7@;o%u-SIDDd^(?n5z6>k7Zew+uB>dIfJZc|66fPNB z^0C=_8fQnyjM#Jp8b7Uz$=XE1t|WpqPpPJ<$=3w9*JrNyNEt)) z&%nMiw!d~-g}iJCyD&d%?NfQiXITkUmkj7nbi0N6v>dcH|WPC7%AZ zVpj(i@6{3%2!tlxmw5KfNkaUBcRsy1utT}GhV5ce=|f&nG}cEWdGLgrS` zT3a`<7VDX0Oifvk!5d$)SnEbLB;x!MkH|e*mLe-)R9&gp?mifl* z*C=YlzI-)ikLHZk@WkCfaZULtq&~R(Y#D-@F>E4!YK=E?1^zDqx%lPFGNI>@ayh8? zF>`ZKgbU6iAytSq*a;AFvU)6nLH{pD#nzhD7&30X?%h+Q(>FFY^m z^nJ6iCjaHPUQ5B3U6o|ztK|I_Zixc_wJq5F5f9JW_g;~&aoI<@$&j<9iff0#F^HZT z5Gifv(w}IpJ|_GWfT_y(eVUW8CwtAm!`C!-ox0E6C(8d4hcOe2(joE#?OlGcJ2^Ig zKd}LQPvvP2cm_0mP(rIihA4IBZPURV8s8Kk%wr<6`rikhHy(GG;)3K;ePu6a2l;v| zruWV|#{Pd>^d{b$if`1t%!4TNMhG@Cd2~^E-sA{a`W50wSD zqJWB)e;z@Sr)QXc1|?|BPzY^MJa4}8dB@*?FuV`J2d9yLzwv>>CjDjS=cR~=DGfyd zvpPgpw9vYFyt|QFD$rRi+Pfn8QRG&|GV~I^NU7Ja`o+4tKeL0W?Es2F(p0}+XxVh1 zbT$V8)*QK3!tswsPj!}2{?{oa{sk{9K;+`PT_e671^MuX1t4vOuLA$ZUWoscJa}zB z(qA$DM>GkR5nzFy5n6U{4)22e^sqN8Wf3$@IYYbvvEbl`uMX`0<5zMBa6V}#Z!<4%KYh!IEA#U$atNTIG@_#9#@xhs(+=75@ecZDKyMj2G_vVA`#s0g{0m56yF@#I z|2G}u!!+}cWx4t*4?l-00&ovs$_E@9{k+d+(1P`0YmATo2c>8SM)=LgA7c20gt*frdrq)_%rn|(|rIV$5;oaAR z;Y;B%z@Tm8l-xA6dTXKof`R^DZ-?sONIHKwJwO?Z7l-I?lR@$DRh2H{WWz1EWH-bB zXVB6mEpGhhRkrVlpRR>#+d@XeioVwQpH9!Urc<>j$uB*5XRc_{f?GSC<4c7pO13I_ zU;S44c7bRdWv6};&IZGs>yc9+o{SCgH{>nK#!FyTVB6V$pMM|1nq~h-#Tef^u8BNv zTr@(3;g3}4X@f9d474kvs_fM^=+|w5%x+6$cFpd^D*dYtqTFAQLj1p;|x1 z4vodMOi+8=>8;$b+lFiQxW|Te$Nppd_neeZ8PZ1m&3_@y2pvqs<1aloVwY^Ti1ydA zF@R{acntoh8P>JU;fGTcKJTJve`KTmD@NYwyPsl-pDD|U{?W$mvhltWHAxW zmZFkdK$6h`(g9jK0SQ-h$+M%UNFqZT>*FM(d%BHms{9>rC02#`##S$TPv408lagpV z@=*Dqg#L*~R(lT&r^^2|(@*5EL8~cPIixn+Z%e!q{{2rx_f)xHh;gfX9Ll2s4R@EH zfNPPTwqi2P4nd_9F<69(?P=g8p}D?sn-Ah&~yqja)77X{u;FJ`Fk=K97DHtOX61tEPmjqu8q;saWI zSSt0$a@`{bA;?KNCuYBel@m_Temf$G1f9gGe_x4msuKV>DC|u7L4i=v_V_f)3brpi z?``i@hPy?`?U?A*HEbdo&VL_~M#&=qg^W~C$(KAmt6G$?vqWYRyDs~tLKKgI_SjPV zHMU}Y(O}^h$L<@#kCCt50PLOa|8!*N5tF2V)Ozb&Yj5`e$_Flu@oWVl(C*$c6G`GR zbH)|?6v5z{!PCO{r?e&UujeE*d)OFv;7slKaU>MXTZxPvMgJ&b09Vf@AIzmD2p(5a z;bSj{H#jEgA%kHi_o{dRzWW}6;LjLLZje=7-sAMBL)-pF%uD@mk}Yhyy?|1TkA&_C ztkT4z-|-K=977Uv^t+THkveZ z4Cr@&dpKGcQU{Y7gF6LOMRmQwe>3ZqY(_=O`4H@&5>gLab&ZCr!Z#xJ({=7;od+j|2^FHhCH`6!cCKDvfoPj27Hc zvD5c;(bUl>O2dB;0Jn@El3O0pa|>yOb!E_PCrf!2lewv$u1f!g-TFj@^UEY9wjNfC zyo9zPsnYTkg~b2`8drWT3&1Jxepm0`#I0-b#5cdzqGHx|q|=1!L3nQ?t<(SJJLdBn zqiavL#}r+$4JGP*`jzl(AD!9QMECjHfymfEoV01olkN|3qalkgjMJM)DyYqI&?GsR zjtxBuz|*&*cw}xIM;Zbq-Y&WC_07 zwH$<+l^v^#xg0XiffZg-7%f<;iY+BFKbS#YqW@G5g{et%IWMW0V>wg5hMyeZjW0uB z*TsP%Nzd*WBA~y6G*x%{pi|8uqxeqMn-c8{b3`O_9)r612_vjtcFTY5spGGl%E8}9 zp6$Eia4PUrOgVdU9o5)$JQVZHrynFL0Bu9NH-|rkUGI{yDSQ*0T^obXACBYTr>po3 z$tl$j=1*E?Ud%vbLc1q}rHwpv{RUP!*F8DR3Z^km3+$nQOqaB&cnYz0bPp+cNYaG8I_=4tV zl+k?ucP*>9T)e4>9bz7$T{11Wsm*}8xMvyzhsyvIO9Bb@0J&*SmCIJ#j9M1CT|6iw z6plx|z*sSARKM>I(X%TWj@1Gx5;-klSkHDXx~GV_jFD3J&>EY1`ZgCn4m|K$?rq)x z^<0gl(sD_+o^k)2=DKfa4-X*r_^8o*PV2iO3siQ;_O;;R34A??f;up@{8~GWa|kYd z8NC0gc)d`z^Z$Qeu*1!pi>NZOH4`^5){k`|vpmlDc$gG7;<|>YOmd(;BqAt(`1D=y z^mHX^L4tO$)|1Bg)zx(=%LA#5yL{V*_y+FDeVp}Kc;=g`ECB!O{h=?U;yH#PX3=^f zni#hAsg$inrMh?Njiy@~!MjG+%kjwl8l8P`KHZ}g`L$$*Z>nSLJdln7t8Tqy>&9&1 z5$*A^m$iXFh>fq}y9JEe5g6LeI8`XWL{If@H_3r8T`uf49;Sl(0=(&&@HWr;zP1V= ztyJa+?Y12kgF4(b$RH~%jS(yElbg2LiBzDrd%~`rblDzL6dEl;tT zRS3H6+Cq5=tzK=)jqQ);C^!vP+29Mk)SR(YG#vX(Zf;muXIwL6`{yf+4CLnM8oRrR z(c#zb4G*JF8y7w^5=wDac2qC{>D|7kb4y;$--Kln(f_c${oZUQv)N2ztodZgy_Q-I zBX817r|m0F`$hC5VN^JykN4!71fOekYG=FC1@hMmk35MkE$vs?1Sdgagg%?7GN%9; zfi*e;ZHcC1m^aQsRO%2uvEMu5kmF_n(y`NJ`(=8gf=REnbMpMfG`gBvyjc8Vz*QsQ zEhe;wvS)}Rlo=@ObEW5##qN4mN;RQTW%u6W3U~!n7u31&3AlyM{x@lHJrG_idY+eN-L*S*=Da+;G>@9WsGGg8Qhg_lC!> z&FS$mo^AT7?ZDfnu6oD7A~b}NMf2ijVxSefHAJj-11FVz=au7c39@M|XkwDrG|}ME zKc)NgU)akAdvX%UdR#EoU(wOo*7n(~700)o0?peV6#0W1?0M|q3s!q>I?>*x*aj!HzPJLLSj}?y_wBNPlgx)zk0NPsx`9}lS=hUt zg^4GwrN6D%#zCprphBo@tuagL)ap~L)VAVpU%hU&gkYTY8|r9bZ`d4l&$*iFnG8IC zSfG$qpv}`~7Bz@z7M9Aw%jp%&nr>j>?(k2IaMSwiU7H1H3{C)^Ut_9FWwh$QIrkUb zykfM`JlQMeTcxT|J=bO`!CCR0-K-p<5MAyB)@`+D(3v!b?lF1dno>RXuyoqyTaP~Z z{pZXa`*(7FQ>3(LUB6B_j?>%cdZX#$$Lw%@2cHxz`JpOd#?5L zynGf0-La~N*bP-5XK)@jH^l`d%N<2>a2u0f%Z7T9$oJzVp~zT!dXeK(FSz~Nl*{Fy z+v-CkhHPk>en$}vQHVv^AJRhPo400ikjbuy@gDm! z^w{c(8JleJS0cG`&X#iyGazIOG&m7)ZbNAj#Fzx+J<6>-34t%Y zu^R^NT)9n=&NM&JR zM0aA*kve1YKHc`L*v;G16B+NofRom_<+k3S4M4p924->J3NQ6oNX!*Tm!VJ>Ti)NB z4DZi#bY;gy$pI6zypu-#U~lwreP8XOcf$gn{|1lx|WU0Tfjib4@=ARK?D{i(>-Vu2@4u@&=!19NPlvMFJ?(iBlR^8|}BCw|FdyxOg zZNsw389Ur~HOTGea!eZed+!$>Ps;lSwpCKajJ7H~_SG-ql@FIUm(Mbzf5A1urbK#U zcqQc4u~h17SWL`Nn@iDU5QcpLlQXF*+KKmabF(X4a4Ya9 zcFwo;{!Zh#7bVL?@_s{nvEIK~@sy5k}%)Z2nwVfuWPSlBZ-86l3YF&{YP0c!W;B&iF$ebZ}THzqeQxyylq$cc6sZt#?n$c-saOSZPW<< zYr#stN0&fWU!jDzC9#sL&1L_K1~7kP!LX}xk#E}3gm_1_s-c(G2wVbXP=UedQ;1DINR7(${^MgK^Umz(wH{XItwbQHaw%WlS8 z9$9uvBb6*2R^LDZRm)XB(5I8#X}%dVMoYr>dZX#5+6H(X8w1>ck9F;9=0u!ts_p33 zwHRwkDn$k?7#kjbt4WsNHfon7{OSuO|9NqH#_l@Tn{YT58+74TqWUBlFV?VuRWD7- zhx%LiQy!^EgO_WAMxV6zt)*M^0Zw!7wR>ZbK^8kKu85|ER#^ViJfJcHS` z;;i{N`lMuAH<5y+^v?Km+$|eEE^k-mZZaMCGS1HIgI3{N7uoOalPV)gEEn)}A(SG9 z)SVD~t{J_ZG@d!{9=d4PU<@|g!A|E|!W`nSx`o~b$ug=VG0Yqa8kYTQyC1ienZT>- zw0PZ}=QQd|!5rCmi49S(W1ei^=e?hXV&lihE;20v8Mj*BHaE$dEIonIxc8d|@^7;( z_An(-@02CMjQz7*OVgpkONnmO>Lwlylz|&h+ek|OAEMHz<3hdZeAkfs+|yWaVY5Y@ zQw4nuacFFqZY$TyY}(JjWN{8f?U~3mTZ!3Oo%g6AGzrT8d3Fp?}mw z0hD{vTS6Nw^*cRu9Vy(sUHr_tj&b%4=U(>6rM=lT%Cy7zx!Y_@_U5Mg_R| zTmz6v(p-IEFk||Bw;>#SS`dbg${Cj)Qj6cFcNYWf_KBS4;??|T%Moo2V_;*eA~zjq zw>#QMw;?EttXiHN){%K>@wME3S85b{}Z^25rk#yWAAgc!0iOzN^`Y zWQccV*F^5iT7Sm1V?qm%T{ogB8y75{4y$W1y?&a-KZUu0fFYDr#mRikEEJWl$8_rw zHxNDPS+Jus7zj~Py%anN*wyyJAFkJY4kNNz22q}ChicaQ^jBM0;iO%Wj)XxPLwRlytneT^53Zne!XqjC2 zlNwcAoc?2%N@NPS&b|Jl|H-xPo@4yZ${YjMezNxIuCe9c-=YP<*;_Cx7jy)`b?QcNnMpD)s3sYoc}MV z3XRiNZmkO*^k#R|rgzLdKH0CYC>drpsOp_>D^fvKfZLkWOqkM~^QjZvJY6TU8%QQL ztUaxDHzrC|MVJ#Nnu3sA`=QrL1`5qzkqGtc1J~0spy3ZfI@w zALF<7uoIHEGi_`S)+W?%BP!xYCxcpKy|rst$tgY^>$pQokzjBGlQGKRPvQMEnDNj2 zLgE<9@9p1jm*HE5@A`y@k(EtAyMX()8+m8VVdvrJ-EYI(;cpLnJgc%a_bg0p6s=JJ4BP8 zNOc~Hq=s3*pO}_`Y4JEi2^*;%9BUDwYuXyWUuRL(_n(!)jSJ9ntS1o=XH6+~;| z$Bxu+?TUX&%FMKU!De4lRLM48McBu>rdGH!iWOe8kj3DA>ew)tv4e%H)ZXe>hC>4x zk|UIiv!X88@>8S0`lK35QMrdE*r$b$bdq_K6J-9?yN9jT7uP9u=H&iXVJXXQ9|i4UX?}a*g|_UF*{O6h`TxJR zAE^s$eqzc@+kc0yiqVq_w{(Tu^NDnsb`MTZ%x9U05W_)NQTr#QBa7y}^eFxD2MX#M z?$&r&V?g;!Pg>z=P?Db9%Tcyh4`V16CB6Jl_Ut(RC*QxdUXa(9vkGP2iPJi-?C3W%z-^DwP5ag|nD^zv@<$m%E}>8f5314V=7HE@T7 zK)k3L03nl-=Wj`}PLF4QRj=BPZ7^}=Xd&YIqzy3X+wOHf_Awr6y zP3rC#Y?FN4*mB#nJy%-IUTzjnD3X}%wzR&smlwB0!**I;_hvu6sEAqz*d&r{8Wm`U zgwVEIRAgBL)DWlO=qG;9CH zcdp+5hcEXqG9&FlNw?Wlq#N+8u>BFc>bMbq(?3i*++tY28Ra~-z(3&*MNSU>d(6hY zK>1`+OP~DUj&*~pU-vsYZNkotZt*Q;>I#^eW=93V(hk=YRS^D&qiX&S>&+6Di?F2E z9^@&j{qb9A_jFMH@FF7j$3NU=Yjr#pKc0}8Uf8|&LKT?$ z&+HWx5??cjluCIsAZ4 zVr4z!aCbp?kH7t=O9apS=O5{6Tca=h{KCR7FZ}$%!Y?oU{K5h{{C}3V`o#Um`Bv!# zRPn0mB9GVz&WJ+B(1h&p7@f`VYLMeJNL2%~g#%Icr&670Tm=yOFduzPF3ga^u{o(m z99GobETkj6V8PAYu24k#6r9n6taS+(eO#Goq+C=}-6fL5=G{v(yr8$r0H>jw#35QUm{Y1#E>ZK&rnB+GQTt)jhD^8&%4DEnKE8!D;eox!B|ZJ6LYvH^+BIsS_7X?>c*Q zK0e9ss6z|y*a^UdVAtR@dZL`J&>DlEJwz1n>h+o=7M7a%Q_WLbQ2F+ zBfR_Hp_A#RyKbwvHvFBX-vHYXU0D~6mJDL`dQ8h zLonj}YheB?sx0dWwdf0O0QeLG7E9z*Q-cVcra_Q@zyh@KIsga|2YdY7M z$95b_W#W?2pe%b^n}IA$dE<(;?SNz6yj?nW8r4Wdcq`Iwp-QEoI=Wc zoQS3m5Q>j*h+>6r@Z+PbgCBiWbsZ<_ZoMTO+O99rf7V-lL>M<7AJg0PdYK|4#TPI+ z_Mf>!S=l)t>iV(mc0Q(D^KwpAIu|{U&d%MU2~k9m98`=`wPdqoLf!Nr5P5FgWl?p$ zFtQm@MNicd1a<8GoX9!6yHd$qpZWv73R$9e6dIkJt20Ha`iO7v2%u3+LtJ>f5~mTJ zbBfcWM_jLmaYUso8X9QDxdUZU^Y1E*0$9WHsTR8Q_3HvITWm;dNwYJ)NY1EtJTq5( zkP3{Rt3y<$98mUIbq4aas$V4~`{b&ORCl5-oez+kLXF%sosw6)W_hR+PWv*xa;>N5 zOIHkr=yz0NbU0P`RIyJ1iS=Z(&V%Au$0{F_vz4ODeDxKa9xZ5(uVHW-{AVH}BcVqE zS-C&fVJ!zC+aanvmdiXC_J1neug1-M-`N_=%?Jkwt;oa`6_OE=^hR||qoxs4ke zvcA%l2LA!?LDMnf;0Y$dIN$DSRit3aeo?Ko5NxE`lT=^W!$dnC#~9X3nZSI2N1Pz< z_;=XczN11I(vXsfR{<*X$rUKGOm5M2EjIJ)V|P39GJj#=hpQASO`gXP)mi7v;^W0U%s2u^$s_(V&u9RQ0mG_vu- zBewo)!LgjPk?Sd#A;gOfIwg3mB1kl3HetSBAOjF~uxmI^Ml&42sS(sKi#$9cP|*g8FS+QtUsTZF7eMV9{oH^MueMukIV@uuUwm|!$PGcq$szTkSq?D>gE^XCT%- zOUIFlHi79o@$TxVjMcBK$aS0}MvlabA^F=l8=!4)uCX-w8!gf#YhG^x1b41<8_CH$PboSP z-CwoW7*(tIy;-b{zgdsne44U}w8a{jKVk{l6oT2iGe(qQ#URs%TP$*BE+XvuIpV+m z?wZf$dX6e5gqIG8!Or3cxB7hEhC}l=*NpB#mYLJA*dh7&bK0I;0=Mq*GqjlI## zklvJx5d&1FlzQG*Rv3oj(?Fq5k*jugR3sk|MNA9GOXxFnR55`4^+KgZ4JIvf_f4Br z4Q#TC1Or5&(}aTIJzjRLQv71l`bN_G*ACIokLABQs~dS&7%rG*d5=)hdf4#kuuJ){ zy&Bv0aj6?rcL4qEnS53TeEv#C4Ea}FFfiYD_|HJjmLi{M)Y~O=5E~?~YVu85%6pWC zixoa`+ONNDAw-=%H*$-P(2RQOtYX7mi8FnDG6l#}RtVh(C{wgM?E(?myZ|^wHG;vCp~r zhO+J|q)Pyv>-*QtH5l>y3-_~>BtF~Wwml(TPPz-a1xDakxw)1~`2*DqAwq0ASysE( zyJDavoByrxlD)>M#aG2)1#FvfUxBXXYM?;gaye=5c4S)KM>dqk25=4u5!}F~<}VKM zf5%W}t&S!Ic_EH^h7`3^Ud;IIwCX(&?#em?7&d-vJC$h`ji9@BLs>T_ z1uVClGhE%N1$7UM6fL_dKw$}TZ=Gj!wE5VhH;LHjBrHKIydKq&+m&4li<+;?SKLf_ zxxo^8fO#^>z2*3IHKi!4_H;!DyiyKef=iWW3xEY;(ePH z?ljuQ>zJSWb&m^YhrM4NffErHQ|`K6l6RR^l<2e~rsyypx>=m9(pm`{nEBODqq`N0 zCZ~Or2YR4=Vk)^$`~K8=leMU>mMdlN=-;E6Yl2af>WAC~gVi)(SXgqc*s_G9$+0Kj zwySR5UHRbOdQ4{wz3{C<3=!+%D18R5A_5*Qb4HI1fp)YJaAuhB;=L_8DGGG2PxM6geRA)}<4?&0LT7 ztQh*EArYg3>KV=DQeLqPpFP|b<@jybBNNS{Z+0o{c^KNg-AOE2OCB^au6=(aF8i}? zgK6ePcaCcMpk?)GTGP3(cubNqq>kxf-1y|g97fqxQNd^e0FA%QBB%b}GUU4>MZHUN zW!7qzqC!=o+cl`8+wSkhMfF6f6zN2C`KIM}HOtnIws6E>_3$ZII>Co>gzUmpf*sRs z|9W~XI>RAr+|6eGs@tx!cMT?&1|QAV+uZj?XE71Qu1&h#N+IPrt(qyZD7A&myY&-0 zxsuxHfLTe*DijO4*3x-y&dqaOL#yQa&PwV==~a{p|NUP6=BbvPx+YAD+b}9MTw%#* zB7N0#k|*A9Alm>7AN=I&eymV}s3&@gf}C_E0aOb-WLEZifL$x{fd5j@tM(_h@0(Iw zCed#>7JEYCW$x|K+m2d+cnQPmKGOqxfU&`wat+t#qi*a_#NvB-T>L|8EqaXVmo}9TR?I9*pcO}QA>8$X8nE2YWuLt4y&Aj%u z;T~R33*#k-=q>d~K1YaWFdPK5jl|PCbyV|uZ<*;j`9|Ah3kbU&weAG-?W@jHo>EG# zN=+h<+XR}QOETX%r{Y@_WRmW7YG3ZAOAM3gGa~x5N4JTuxO-cEXQg5{MW5Ak@+z60 zxY=$#H5PG|uW*E8q9`20))BS5FoNQjCQCaQ8R`sIs5w6>rAS%zPEZgJB=FB4OxyxpFwX-i^teIxDxQLZ`)q%>zB;$Nz#4g7b}s zw(?Ht9>{YRqc%8=jC@rvy^-;5&*8be3Kw?JkE;mD{H{Atf~8%=V3RmAT&v@2v|1cH zEG6EZDDP4(swF#qQ!CFjztKY!sNhZY9FKX=50^|k=ab8V=u-S(;m3~4J?9-@)YZ;J z^I@g9BlJ=o{cf%p&xWJU4(G)$ug)ry8z*~|2Yz#1_2UTJRo_pQbCBN5#WLcill}(` zzgqQdZ;oqNQW4fNr<3{&cfJKN7+`r^e;X|GjKf&EM@AwWL%fQKy*9?|;Ayc>V#BXb z#xvDpp!~AKJ+lJ}&JUL?$EVN_9%+)c$fEvPwULxMpidt8IIZwLgch_}B_3iUcLWBj3g&u{x&fzS7e z>RQq%A&;@&p=Y6oL%QH2U2aMy%j5w>T#Q+FCc?)@x}<$wp=%)IFuFYpIj$!s9^w%T>< zc3XWkfBoS7H`7XboxC3oN%SW4&NP6YOj{Oxx4k*%1*8**VW_oTN(6c1Rej}AW+7+g zao-8(3p6I{FNC9L>wyCsmoIna6>8%zkxFKxf;Qae<3#A(+0%VT3VMc)On=Q2M(NZe zJt{>WzTuyBI8pKiBd7By&!3}>oUmdzRQ}jy;tLKL4;8}_WjxE&>X8z-kqSrv7cY@H z0bl7xUmti8NTL}q4AMn<(D?l!fbKf)%Tm-n*c{b3!rC-~TfQb#CsB?|wD?6$SV#l? zNQp3jgp8}*jm%Ue*4UW`_{E?01l%iqrJX*b>Q0o-Fg(EWYd@h!kNj2UTOHDj1bI%I z82~Ih$h@o})A?3|1&-Gt>mCgdC8c+%bc(#!O+arM7v8bV>3$Nyra6?blxnbl{V0i>nWU-fC& zOfcD6?T8Esi9?w5p*>DKR4-)zkS`K*d$})A|B8`;unE6X8Y@YxOohkxBLT6khx{i=M5;2e+$q7g1aC}-B zZT;2py-|#~*c6c36|gI}SbKN4b6wVX1g~Bf>>z+5P#=$fixp-`%=vAI8{6u%)Ou$8 z=`!mV(t&sHftekYE5WG(mDxr)-_O=c;^g9iG);~BOrF#Ze!Pb|cK@u|8Rt+85FTAm zPS5kc!Xz1g8p?9?%e$N*Xi~j zDFw~fDz`sau8IPdXmac>Y5``%_Z>sRsFYti`s-kiTsyKr?c5+wB-amdaj>s0w`^#6 zIDdJH{(-G7=^WbU#rUUF(75$_cf?07S~pC5@2Ae>e(ZDwb}AVtOZ0*D0dUHBZb=NI zG-R$8AqVGQNkSds()K!qN&3fbYR4)*hg=S!FX-7z)U3M+hVb2aw(VQ02U*b03m&RJ zdmewfA5-3-^MzUmQIc#VcS1)uo6#_+KgRm8A?oZMS_W<5^jMy&-3C+lza9GEX zH6dG7z+Zny?ymPcr$0avT-AP{=_w#+b`U%PPox1ug)aS7qFpdUM|2q<1M10vKf}XC z?V;DH0O61z_$nUK@f5+u`2l&_3Y)pG&y4%%6jVKx_K{vIq;~VeaJ6yWU6J36jkue% zw@cybo38RaRT%VMb8^*xLWf;;o#UWXcMWgWJraIGdJ9A6*UO7&{?__Ovmk~EwLOeb zz#-{bcz4%a%EY6ezO&kNXnOhCf9^oSXk8%!G6QdPI3pq9_gP``2BZjDkYVEDI&{1=znuI;~?*uHj`V#XA`K6UR@nP4?c+LgZsWO zFulu5&D#fvcr2PUB1x5@U6d`k47ZgoHXX$iLxHM92hZ_%`lni~)m55D+?w4o}-?-1Ondd+lVnA~oW$}~{C!E4eMSZ!bT zZgKn3O>0qdD4uJG(wpOIoq_>A(amQj(j8wX11_^PK};}9J{{cfU_AoF7cFwdwtRKZ z%ZL{zvNGlbjO(_Ksr;GCQ67A4)W~50aRGSVoyAOwXSKfjrL#Y_L1@ z$6sQuiSGxnq4xo5>wXd69s_llKi6O^V)&d(iKuN`X8k8|xJw!rQjtl`Pa|FTaexJ0 zU5Z?Fk}Q31VR4eT^%urMO&D2l@dNGlDN>1{hFJfZRc;(w9cia)Hp z#Zq`AywWA0yqg00`nM>$!`<@4MAla5huYd2L&uej(x#>-c}dAoUSC&|6xc zvoSIQAV1x*STqfa#s?a|q{eG7Nn?ZIHIKUhCgPn^av;U!i`mO2EH7Zs>iYCKX?xWO zZc{g>oFJGp!!qjbd|f;tWK>1}&T&3aXR=C!jDKbh*uPGSuUDgG7yHHkV1ch^_&<;f zg`Wx~E&uKiMATghPI)ZHqo#P0<`#YzR2RV^UR?VMXVq6y(_h%E|@YbOVdOoV3xLFVM$Bj?qxz-Sls8KZy<5@v!{9PrtvF z-;+rfEolaTm<*sx93@jMd(9|347>CEAj`HS7VN9?dL?0DfZ<(mQuVgF+6%RRzZg5y zfYVZ@8U#M;-!o4TCqzQlAWW(1%|;#Dip6AjF<<^oHUBJ_x`J!$Q@5JKF%$>s? z9_5{~6AyCV>1{u{C0jV3gFz9PI!jB)LliBL*|FrbBzvdno4SmQ%y-oL`aB;L4kFGg z5kIfII?7Inpv-@aS+E}ocj(ct+fs3&1ng|gi9U*Hi!ZJY z7>YpOf$-M+Svelx^#h1YR=_*=m8A}XECwc}?g|zzAA=(8K56+bS+&6P!~xtAbPwG_ z4C+~`v6czKeL@lefvl-B)D4JHtd7mwb`&<3$sj=%Nu>L)2czRo2{WS8;t}Rc z9m|TVOG|aM6hm!I%f~T@3pCK#&epp2iU&3F)Y9}prMJXooA>ElEczlbqIG;wr%TRd z0%8^)*~K)#S9Hd{f!8zSlAF@{wnYhG*FmCr$AbDcV%}p`pF@6Xq$s}2y)?Lu(QP13 zGrygL-bcae@6n89B92V8>?AoH)ArRB zh-WeQ+d#%rI973ue&Xxm^v=raR~!2Rwehf+CvL#r4(X5kA*ymrrhtaG)*H4I4ldDb zPSc>pg_^3*@89t&;HdqXM|in$U>(ejZZe=-QaeXOOX9!)#zMLT6v0#o{9~n9JX{ z_NWuE6?AXD(5PD6i>DNii^Zw%a<}05Yo_Y@G-T(F_$EsAbq9qx=&8>N?_zyKb{172 z=RnM3rjgiigWt)}m#NJRgs7@;NMV4TqaP8(^u`(9> zA9spe+Gn(MDWZ{1Ue001aVB^iyX{m685qA5=W+CA>T|xI7fSEZ+{iugta&;?K8vZk zZne!*PBrpw<>oQelAnExOHP{7mtCHUAqHvkP!SOT??ayD|vOKo!RppucUk6!`0l6fRK>K ztBqjy!f{Lsbk|Ph)ldkyy)pb3f7=oAv?~5kh-eR94RM*CXpH!w0;S;1mWao;8$U(l zee_gONa3{-2HevsILvvJ&H~*A^5VJ+%VymbuN2h`<8b!5d`H~^G>b`;&hV@Etp%H} zcdO!@&$i9#dgVC&_L}_bq=hsh8B>9sO1JqiuTM`q&nd~xB2%SC_ZzhZ91$P+Z!tm@ z-Ii<6AraPAt9}XSNb^q%rfhgFT}~7lSs+6~D;Vy3#SE}K`(*xxB3MxBlFXm4nc#m4 z7`@3VW+C=tt}&{<&oJE1bJnl6dzbr5gB)C|cc~T8&Nyu4KB@Mo}VgJj~==&dz(*Jra_8J`UNt__^ZvcZ@%N`025sY9y{)6cG z$%)+-mxW(n`1pl|Utjq6g@s>V_(O+(p0(v}{^oC3lEZns+qG`CF2iC9B>{ck$-xIm zG^%%&?a)Ad(T8SW1z_vvyttnyG}#w5ySQ^U`n{F3~cx?$zSSZFO-+2KJ@hma=zv_ zDbo)Sy7nKA>fb7n=Vp0?hvw<<%nnBl$k?=0A(iO2W5(kEJ{EKwddjQ5;maQ>M5|>M z@n2u&p>Q$YdKzWe+f&x@ky!=5Uyu)N9aRl8i6OBic0UJDEMF?tghwa#^xPC8NcT)7 z0QhF@HaO^8=&GPOa0p(C8yviSH2D&C>BJI$HB_KRwMt<>}U2WS^&}FChmdjtU0EN4PE1x@68|eFwYorOJe}0s@MZpBX zi#pHN#q?|1YBa z1NV#hi_yWP*1enuH|w7Qaxkk4ke_hPMlzY@XzX;Ce&ZKp#b8qO!GCDsBBjivAqPts{Pxj$myGY*H2n#Fg%1Iluug8P`TGH{CG-tlk8o4U0*23F$9z`zag!I=)k?8}4OhX0ghgBUzYG17VS5=u}_$dEaQ(#yz4}WJ=vdCKS_>N{C3$C`2%7Hji}Ywm8$7C3@u2x#PXfD;cNy0kR2 zF|9^kuj&L%kuXmX^b=k>=~jn~cmm<|yZ&=2g4YX$fJ5ece|uXt(J6QgUiMI#?*wV+ z!m`?5i@VMp+QlY1k869m-D?yz5$F{3X9r^FeD>G5Zgz22?qNkb8E+Z8`oZ|M*)Efb zPSc9UCw+YL_0uke*Q2YzCdh|#1 zcwHKlujcZ@T`;C-77C~e0b6gQZ5QrE=QU$*8}5^VFChaM!EF0J%E9CbTnK3)0Rg5v z_;3Pf{noeU-$0P3k`Zo7TuT!3q_A;;?~&(I$~63~KDznBnO$vt5X5p9AYd*7K>TT&2AHUy6n$pnX@)c~I|2n!2u(;-M+yYgVzThzkvP(2 zBL~Ock<-aqmKz$qtKG(rzfEFfCoE+a@D@RO8;1njS%%+{m}*235f}v9+$|NZ*}Bm z^}^`K4+BGXW3G^>xQT;J8S?WlpKFb-dO}F4-YoZa{U_+&`#biX51X0;Vlic}D5p6R+nU^i zZgyk*HfjA_ZxA#paQekiuNA+Ic>nBDhfvq7O%CFqk4%7xHk!xO09q&HT(4=}I-Nzo zy{nh&9l+{k*^jv*t_Fx-rWs_^hkzA~*}io5Q3TQUAT!lWbc((ZM6tWwo z1cAGEB7o%l-RrVY8#Ux?#L+*ud6g(AxYfim?Jde{`Y>Txb@4py4RJ(l7;k-xTc#mP zJNT14ytDk?F~@MoI}WG+q`b>UTs&pjp`We}pt_sRe6?h*emk3Y)S-u1YMdomb6&$g-NpWB^rKX4XvS}FrG6v{7~;auu=rJ;-hbp#hKxp5 zZWMo`(7n#*d>=e;3X31p-8PMx!^kJjq}JNboTFsWK|9q4rycpLdI8T_Zr)7#d;cx2 zS&?d{l`3SICY~@kK6A1Rr?~&iErk|Ql}zp6St}xsvKlmaoP;})64DX9u#s>%`EHF> z)!DOLGfl>QTb;6`I-bCx229qqI&G2ysBG{kXQQVDM%6P#<$g@jt!-ZC@EnlN;1arz zqA})7=&5zIA(Lf7zH{z0s?1|14$7hb=zeUu6q%4sHET?b@6_;KtEZQk(xI!(K7rk5 z*OAWfUHbOr#Rvp6xVu%J_`$oC1qR^T^*T7r`#@vh*%UpuBdb>jjL(_oP~K3i>F?Tr zC)5DJO*Qe8^Oj)a-;y%!VT4s&VFJwYJ&GMIFJoVEWiiQenfq}7bsOOMO4%=`nuKc^ zUL|+pX59t2H16q)@{VC-X+z}I^6ir6lp6JzfwXRh*b?y3!j~?Jb$Zt!tS&czK)v9` zzM$b^{ym7D<4^JTJ)?Fi6it40xrc#qU+D4|-YlW3iDP3|X8PEB5@<_mlA)@BUaQx` z^5AYEkjUg?btpAmrfJ#hX_n3};TyT8QScRS`WkHjjrsVL`{d!is~h@Nko8y=e7cO$ zIuqD8)88CQyKvtK~|) zE9k$np5@6767bk!E7idV!Y&!o@x+Y$PcG)ZnP*ob$enBd-b9RCI-==BC;BK012Vy@ zOR<#%3Mcu|sW&XlG_BdKS($7sw@RaIRGwy-5ph_nHsNkumovojJ@&eBdi7UmJzL2| zZ?F^^C*Zm-?(BA4V~EmA6R1}V))v622&YP0XtMx+7+livCqd|{I!t5F%TPv2FSEYx zES#|nz&5vidS!tEvFL^CHj}#(w66Hm1gDKGr1F08k-{4&v`!@z-wb+Bhibo>ob!6> zprx9$KiYP=DK`iX%IQP5`#Lz&ds-E8f+;G<8ZuZlYu+ zZG{0PIe%!hMz@lSgdVZGlKMdpf_VTa9IWk-{nN5uRI$Uxp^J%9unaNn$0D;!6M$H( zNU&=mO=(|HWg)X7@AS|VPuQh4@hCLRoz&D4^M-jFkXcd*>;J8mL_J{mV0nQ}Mx-}> zl6yg9`S;G9Q9U3f5R=2WkwSqT=*?&1^2UqX>&V&V@}CZrfyd$}^j8fr_Qxf`p}A~t z#VYBf`l`Zaq9X6~z~?O8gEB3TiCC1)7H|bXlQf3og+{WS>z;b*v<{i=v8m#`ZbhC@ zyT1GEK<^sc1mxR$<9-+LVwZ%p&!<9LVtqE61sEJUA zfK`tc(E4?3&V<~)&sj7*$*&4CHKRlU2H4A+)!9ZI*uof;+w8-;B4WfCpfgCF;?J$;oL9le6xr$1x~v< zz77e>^JhY$QCwywXX9E6lYsHX=wi8+r!40cJw&-ha}kl?meJ5wa#Vo1YtK`JGq$1XkR!0oj0^ zB?|_&N<1I=G5xL&aorBFq{kyR+TLBSkDlGl?xQ&dZ|UxnG7okI7<=z(oa*ipuga3m z>`hRBHV_a10000205A{$06YM^5C|^>A@N?pdnGSAf0Uhjq8 zd%X9|2ocSIQ2+pd0k}4m$uTzg$v>SG6Ab(aK-kKy1!RB)5=4%&g$91o*ws%95)#?% z6Go0?`+u+{d-h?G<=L}vY>D-DL{a3(o*fYqmbD#@L~Pr8hg2Nf`)IaEw%Y=tEYr&0 zfFbMv0000*0$^4TMc(_F^XJYOGpWo%h*k*Dl1o|(QC`RQQvLnN7u$?Jy-DyttvN<| z#y$^3d*B;MTQ`)+|G;jKFSeXL&x~ z_dRllH`RORb;)c;c1cPp3n5`=Z>2K|<(|QEiyX9=sQH+XaPRz;J%)w&`1zKE6WczB zVjp7R-0nkADY2HO8$C@hyL1m?Ik80Kd|#qe342TYhVdyGwR^5YOgVqZ^S9=Z1-*5! z(5xI%m@ITngcY^CCjky0zm`=5h2;22ACG#E2F^-_BCx-qpj~aP;w;$Dfy*IX1tWqL zL}y8EcSsa5n|c)Tw$;G8`3E|hR;+Owf$*9AD|rm8Qa`N^SLT{*_rrbFC1q}5RGlqH zpG>sDRBpWNF$rCGd{Ts->R(+Nt;>wk4~6CtFHDKO*!K6vyhUA@8?IeYw|*PY#2e)N zl^${o*R!;knziXx*K#qW@ID3RVb-?%{I(y^d{XqGpQmC+7L>rZ{#9EB$*38gBNY!4 z<990O<_39-J-_B!xKt7@_<+U{+?#5>pz6mjSR_7U_{akeMi!RwGfl{A+fh6-o9y#I z{`IjEAmRro+uCPT?(uOJ{ElA1AKrzudM^OgG&2rp#(aSA#_sNbvj`cl)s}A3bI@lx zP^}sD<&p6qY{0|P?lCzL+LJ6#Fqjh?upb>WW1&wz1#n}Jd3}}VYY+8_@(q-I8hjF@ z{qc-uj9QNRmHRV(|OnOHm+?!h`Y|9fms^*-O@dMUD^Jp>o@vf^5j zf@PR69?(YqdpAvzw5(vKDP_nNs?jZZ*wsu85)jRG2aTG-MgBYaneZoR#HFU7f2gY% zanEjGv2npe(H_ZDzf4R{+*CJLY%=+(gr=v=4^2@}`vM86!(<({?4){trQN!r!$@4C zp4%+iDp~X8-}WpUc+3$boHHi|395@GnYyYr*wXe+>yXQbLvr1`Xg%$7)*~;*^)dUn zZRq{&O<7T9y4RQ^9ub(GmjBnPAI*!^nsCsc??p1^r28U}Da~?$bkDDxDu9+^SCY+* zlHE9$&V2HR|0M+KNa0YkYdkl(F37;t^Y{;7p3vRsG{JYrosT+QX=uc}b?mcW!-DS} zONPu=z1i!`fS)e7N`~t)j|J0)rsNjaTerb~61rXINGo^$_p%MdIF)LDDeb<}3LYZT zcqc?Vl&P7dmFuKNy9uP&!J+ZRID~S@(EirkWmCWF={Ji&$G3tv^Pc;vnxRk`q68ZEGEkB`K^?w>= zih#7ywW>!V{6HbV?+(qeZe4;-SNb|C_tgc?=b(p)=zH4SbNoe;d)$W&@H@1;ldTrd zM5HPXY8VilH zlX*_D_JW&VgyN|7Zfb^ea&I82@5-gA|B-OG*qG9STm&cQg!V*=sTk;WC?WN1*zpQQ zMF^7<mDwXh;y-N0hC0QbHe& zR7jR+U22xKBS8qpi*3XXC;XkS?l=J$rugt=h}WW z$AO7yR0EbTHUGV$6&>GM?@UD5cf|XEp>%3LfncX2Dd|h@lE~c++w}3SR3(pK^(7Lqb>~jZ#}DS65hbc=LYcy-yJ&7aM_5{Zx_bt zeS{ezSN$2c6y87pHJjCSgW3u0ROIUSwR~X2-0{G%A{RgZx_Exv>-CF)APv;gruQDa zV)=20qmvCCir7hpdd5>HFS(ES!h%A?{NU<|t5c;a&9SkptmV5$s;+SniS_Ikm)=UCG z0&Wr&P(x3-hB-X&Eea70cs#ztL5An*PR{zaK?KGbSH1RymeLO~UG)p`;TZ`D5g0c_EnjD0k>^*xBYB;f zN&?%&iO7qZBAt+ORg{9n4B8+5!Zw!C>Z@x|N;qC#qYUt4cYAIp0K7GYCgTxlnYPdODzYJNjDlw$bqo_1eEg0Nq7Kz1S* zchtPA=59zXMAVa7TjjDRRfY~rbhM*0n*S8{nP}oiv$s{nXb;XiaYVo~MbD#e^Iu;V zD7PGHlWJ-~zKFlL4|9?80oNuN$`$pwoXy}sFwgxx3>dza4^=5o{Xb5^i$Ic8NYXsg z+T5&dyw3cej6>}3@5Nu@@dJMa$I}>-XL*|e@5os=y(g*1mi1gFOIQNPvmkWN!7qMt z9-2RZW+ilU^iR#@ffA^#qt{wTxgK7lKgM3tE4$VNt5IZZaptWmY$u58>m2$KB)}nT zDH=7V(U1H8U5rOBp6#y!W@Io*ojfz5Mk)sCuy7eN7DNTXoSn-H;lkz8*1~HB%{vEW z^h-m#lPeMcVoSHJXy?YpGo8imVh-Txy?L<_SynS+nFpmK2`p_ zo#t;GT=yPqHqU9hOor=gd4axPwxv#?3nh`r12}||QT>K6jH;R;Vbuq7y>V~1N zN*V8@=B@%gh-p@TXr=ZO-w6^eN>dtlPriM}Lu9$EeebO&BDs!J+W0=f_w5l#Gqz(% z<8cK|98O~qlE$gs2tf5k@F>LrL2mk@gzHy8K-zdElpMu=H^;DNz5++caH*(*gM#&1 zj?Zh%=Sa@&9e101VF7aeKwDDR9!H)qU1d)BR-0jR@U8pw;ct~YaqFWfb(KPt65-V6 z=F-}|)rIOF8K9#7oy2Er%1b6Ru_kOh(~5|6>If9zcHTj(;@6g1s^(B#gjDz*;B2}K zKl(W-0|z|X*ha0jw{+Z|)GiLg3K3`L1nHzRhbaBz-IO9XQSkyw@GG{At3N*A1AD*z zgk7+BP}kj`qwn{L<`Wp~MNl=j!hNMpG6DpS9X%#yKb+LZZj2VZIBQGb$cgqpy^S*j z*A0_YeKFtH3N<_X4xIs2NIm_*wrv0ap??R`Yweoc26{SlSOmZ`ViK|EPDWNaG`yNk z(4z%hqR?2`geCSh$o#f&lhc~~QCnRgnvGfQ0P)@u)d_s)xC!`sb~w3HBQXVhFBUoz zI>ZJXzFEey@kj;J0QACLFh8eIdf-y+f+&@7+F*jSTmW8`lM%&|9;%`TcG_fde03PY zzyxpdWr^O+yV9#NhU1UckDkaCyvYU=LtwJ$-B3}u=jSmAOGhLB-c4--FzORNj^H5{lVW0(hLj{g~{&O=1Hj1 z`RIYlM;f{v8{E@FkXx+-&+6b`iRO+}X_-xjf9B`Yh3ut#9EvWe1Tnb^ChZcf>_TT^ zU8=!bgS&VmYZ0wVl8S7w47pU}ek$L-;O49A+g%?ffxXxgoau4S*5>AMH?OI-4iyAE zW7into#wbjgpfM@#A*1^GyQENw{M$)hMMILWt;;WBH2=1H@qT?qt=ZPZw|KsC^NvR zx<*eA1HxJW3WK~Yycjj0U~VWkiv`lA-`6NF(#XHt#%?t3?q$QHcg%8Sa$eh4W2qH$ zaa`BoU#D`y6-VTLLj`OM5G&ez{gCl>Z;bwt)q!p7q|)zdn&5mJMEn8*7mU$?)Qer%yo^`2qbS=X7(&D0^2 zAm3b8YvxLkxG1EHO*1;W9PBr zpM)(G<^Q#xNsTwF(UeJQpE;OID%8H+>o}qk5lR;Fn&bHx2X8d9`||Dkw{~OaH(EDY z0j(GRY@^``^BV#|T;{?0-6N`YP8!x##D6bS$b0lOtjz9B`^?r07*Lxey)E#bTP5U7 z7-M<5=yF8zkx60&Ui;xcPLvGM6Ug&>9TRhoMZv{QjJ#{)`DYUSVr19NsYdBoVkU|- z>kOV;Ctf_aOV{aG@*q8`&x16mFS}bv)G%IF)8DK|Ok$KlZ5;Nnk7sNW*E*!p&AB+C z_`MdimtZFhnIP08!2^m1ai3*bM0j1+R_u`QEzJX9aQuOnVC(G zNCqvLM5b_@auDzF}UId73P_ zj!2dhR8*+%B*BE%^x*FXf(?nED?U`z^uSHbat4D*bKJY0{H|38(t>|iR#&@=+3HHU z9r@7TJKf{&hFcYZMh6Lk(H1Eme@B)nD_p@BLmLzijd7hCqGNKh-YGw4#aBeRrL<0;1h$#tILxD#ma6kM5HH&RX)wDa*h#8|8$wL(O zkd6^;#m39ZRN?Z4Aq?8-%qY9X0Mfv%2O4nYTvqNlS9=N|{Wd6TnqvHM#wy=;pmO>5NfqeIf?DQw z1j(DM1kttBT2G0WxFc*kQbt*=Cg!4+vekT)`4=pX-@rUS5GFZKknMvBRU%MzV}nI; zBol4!v=P~EoX*L-;?!#IT*JmkzN2-lX9J;doP{bwW{KZWCsq#U@+q{s)`G?oS@S)Q z1X@{Y%j3UNBH@3CfvO^P#iHmVEor;v-|iL8Qzu6qg8&aEiax^~q2|l-k~5e43Z1~k zewD)3k4;}ma2U+65+*2uCMs#nVN18)Q@+Myomd1UCBN_(nHn$-051xEVh;~N9VeGT zbpWR2lX>p>7`60N?^sYHTi3DMY^Zk^c$TtywcLBuXZLRGrVZFQ{K8zP23{xWX!?$oCNTe9 zw}JJ7kN?U1#}9Cr{TcZ7-!vfj>aTs2->FLS zVo^tn_+GK3ulz_K{8yWG<$4Bidi{CPg?A0Q3&shFAMbjd`RiS9cl_G7%NrCHITIWw zH!>NpI`*(3VeVJbviU5|Z)d<_ue06sv$ zzouei3UZo2X)hM-fx%Kh!6FsXx{Zi%9%iUOI0Aw=GEx~ng`pCA=>X`dGxEgs*blJq zeFQvU;GkD3b}K+}C`f$$zmeD?*$+@#e=QR=WBj1vSDrb*Yr>}vEx>`AWg~ak0Y9uT zMFBdLkbYkmig=RHde%x{{LQiO3=spCU)fIVtE)hlb^w{bWVJ0MH~{^?K;KK$(>9YQ z$r1V{Ko%Rz^G-+l)cvCHAcnM*k+NITArx_P6+=}}BUqZEm{yVz>E4ETtrp#XpYOk- z4TJVw5Q{tc6C0@)^`MM0Fv=2+&kp{wdkh9CuM^n1jclCO5*=}=1E+^j?gf$v04=q3 z&mb-o9rTaaq5Y()FS}J7yu}CkwEf=%LkbQ&pHoe0cIlMt^g-)H>CQQW?^Xi@$ppSK) zVoM#!JdX-pD}ohXOniA#4beGNxiu`)t%IV4wQ*LW!J# z`xbWi{7ff0=sQwAEiNc)CSKVuN9yw2y`H&jP|fmJ?_+c?RGORb>8)DIlrbW zs5#tk=>;e{PaqmTfYshxbKXIq@hoNcrn;d1liAEqQwYs5~ z=bv=U3D47Qc8p6) z6CHgz8xmuVnb?a^sarYiKbP#7T6#N41>y8UbwzpYsFtf1BJ=h4*@W4Yr(V^d=nadY*D!V`PpOeb4WY+Y1B-kMO?9A_Ly9KT{Av;ZsZ1kHbw zi06sxJs2LRL`ft~b;>+lW#X{xD_!^w60%$zPn6h_Y-w*@a%Cw~*pvUgb&&oUF3r2v z2QB|88z`JvIW$+yRKK+9GfKnq{ z`6?G$>f{J{ocvY=rq@SY_QsH_t-rUr( zuW{0yYdyivIoEEA-%SX1rcI_qJxA(_eff9_6|~?yVa0Zth>qy`gLE&O!gP_sg^i(%pFiDAhwjy#33Uk+RuJr-PeHy69n-}g`Kn(P-0&w~4Qtu zXymzQx`=5UXHhz1h7q5rs>iReiLkh^Fo8FNxh%;o`-3o-GkA$=3C$VZJg?%^6v8sL zVswOV0@afHNp~$aDKSPl0$mnLib#Iqeo9I-bvE@GLK@*3nrcp0vT8bNW^5i;*z271 z^wMh6*Q#A)ZfZ`VL7Rp4w)MApzQGc1=^P(+I3PHj$K2d8G!z=_L14mI9B9u7p( zOrVWA)2T%!@oGM27*O*x3+no!^Ef1~-jM_vH%)k4

d)1pIoK=jxhyw6r==c2h@Q3jAyX%0- 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 z%0D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�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

A%$ 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 z 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

giBp$XF;Qro?-$_O65V+_1XuHTak~Un+T6 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 FfbZ>ka)|%{ literal 0 HcmV?d00001 diff --git a/Plugins/FMODStudio/Docs/Oculus Spatializer for FMOD Integration Guide.pdf b/Plugins/FMODStudio/Docs/Oculus Spatializer for FMOD Integration Guide.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f6ba8906286625191e04f5020adcd0a5781d325c GIT binary patch literal 152246 zcmeFZWmJ@J_&2#@x99Bc**ClA?7RK@MvoqzxbOS9u1{UEJd>8?xyvhbmSuKhb@!~`%{w<8 zjIGb!zt5-U>1f8MrEF|%VrJsX_uS3c_2@6;?TjqU_%y9dT`g~l3g6*-Y-VL)>3UO0 zP?YbHgRO(}b4Mc+Gd^iEcPkS!IcFnJzK2$>F3-%IA34}LI@p`pyPmzrCu?QvYUa!* zYis0cCT(WoU~0zq)Xd%jt|%lRASrp)#nsu&$nNaRk=38a&XbXm)qf$O9Vp2!!yo_G zum9h!0FmyMG>`pRGkeqj{d~Zmj*hC(|8ZphZzoVy?jhfEMI#rRn@0y*_5V22{|}G! z|Et5xe@9f{&j0!Nu8foGUT$qzKZteKkW!PTVwMg0d?&AR{?&{6mC7K|V5_@tMAHI9 zU!P%~|9;xM>0Qv-|DIf=`;lpnMc%uSp0K!>oSZzhU$G=Mc(}qN(JwUKU$=(N+aodj z|Mm?0uNVLSVg;g&e&=W>9f;{@@fub>4L(Lj_T@gF@m|Z^A<@W46uCmja|&*Q6ChlL z-)9q-JUt(j$&=8lClf1nA$&)7qFCYET z7oWY|&9ujIMdlqVquCx&r_SpietTvf@0`6b-CN%Js@50V8RxPz+loOUdP8O{;5KX; zYHF@Cd)tdYpX&eZqk%R!ft$zJ-)vq{sjJ-ey#sy+DGC!GO`!67D}i*wUpH3?=4)=8WnAR9_zU6 zh@*Aby3EM9u9BYB0ROU?_k3q{w9F^)-vao4&Bze88+trybVXm>jUHjX66ANNPfJtF zW?aTz#mv-rXi#dp_$`82ymbA`DpydF*zVl?_sX;X9&bJl4QuUy~Fq*qVOFE$!&Q9B~9Ig6L{d+t%Hw+zGbM3y@R*UQv zZ~UHHyLo5Mji>dl?*CSy^9l`3DSo?zH*K%PZfCQBJV9d}kHx^tYHQZiReE6e|6R$F zi<7^n(sd+D8(&;3$Y9Mb*|e0|RsHz!(VKNWQ&EWs_^C15<5gn4T%jtDOAslMu+dS$ zjpL=?(zXM1_jLK$Tc z7)&kqyY?G9{wH%h%ioS+@iGU5ABor=%eSQjC$OuRO7~)sxzArzt_|eYx#2a8jIL(i zHMr-8)YmG1FC*=-?S0!hehyXcyDZFrD+-AIq$xl4^_#;xN)C=se#U(hH5!w4fgkVN zZ_%M-LwT&yWhW-y?on!0TSi#sY4RCr?{fGlf9|Sp&U9DI|BYl|_E_KirmB8jZMtq} zy|>H*Q@5~1M)u6gs>PV=2KI)eYfG5h1;eU=AhCQ(!_4_dGHW$2r``noT(ghq&skzp z4Gj=s!aU}&ku>W;d~&c`p66K_#cyY82A!%|{)qBFM{i5W2xE}Qs-?1@tTZFAxm)&X zbpHwt3i^!_XB%nGO%0BJEBAFRuGd1Z@?}8>qfjHy1cLgI=FsG@)_2;4E#z7(alW&~ zsA079Z+h=>vIn8l)5a92w+DJYy2X7yNtb1uU0iat)Y6L#<+!4X&>KHU2b~Ff-}ID; zvD5mQYn9(Oa&owFMJ`yZOF;osiM97eK-G7sbg27CRdeJ-u~EY(#RU3+oeR1}^DR>i zq182uJFo!El9CfaHamGq;;RPum=vy@Z-j)w{1{{x6px&Q#75lB+aq|a6vM1VW-G?Z z%IeYa|7<-r0{FRae(w`?e1gLlvM9*d-VnETee1Q|)T#5fa(l%aPeJx7P508J)Ge=7 zm2_)&_tJ42(&mgD7xL_6p;gozq`DVW(0M~^oh)_TrlcoKVZt_sxo?#m96lfCNC(du&`el9qLCVn9ukJd0C2EM;m z=e}*tz{lrXU&QWVKgo&^e~zTl#pleYV1Ak;KEFgpmKmFnpgY{8zSy+avDkYG?FUCF zh+N_2K=EwzGP6HrwvYTXD|saT193%=K=^sEFC>w*?7lH%!zxck)|Rq7n8#70s+l{> zs#+$sg!=T!ys5+6?6+H~%f368aCSyOI2SwnO@z1{Qt2>p;(Kjba&tIqGnDS{@2(X6 z*k0;xcvkhIsrb}>YO1O5%Y`35pIqTwx{8!W&&+MRFtlJUB%zw265%(Y+nuO^Zm~zl zaQW-jlN#Gr)kmxKA?V)dwfdDff%H=M)g^TiTH2(BaCW5KXap*W838p?4$H_VO(m2m z0!N2YU(8)iK=B>bO5jkgE3Nb$F1P25s;bq?ef^00!A!<%gke!!Q7X-y*h+(vQ}lYG;EzDc|U&G*B|d-(LZ#@`F)>cm!Z zaGB$~vYrww_zA;jaQJpwJ|4eay{3|$;y-`(0|RAbWK`8Txw)T~$9^{&-%Iv$j~yx8 zT_+F-TjtR1Z?cKYS#@NuOmmjZ7T1`XnzAR?Rc7t4kBXKbzUp7pJdyIi@6b-Sl;p9q z7RzV&q%VeZIc9_3Y!gGgmc;`+P??FPh`K9B@>UDpHqN>O6~FHzOy* zQ{n9vI-!XA2e?0ZYizQ9>eLujIH!8dS_>9~@|&n1%s0$USgNS3stTyRy14kMuh*1c zzt&aW)FgjN2s!+FE#Ne+hyRL_-P+MnoENFBtDk9Tq`y+7i{n-ndr@UC##R3u!Jh*9-5o|{Qklc}K(SF;q+(ODr~=Y`i%5ia z$(a|k6(@CYu)o9n;X)K6hLVg-&|`||nI7o$^3Sv5YXR>m50JcPb}l_3-DhTQ2ukOD z^CA3M#p%Lbd_R|F9OLZ?<)^n1;$BD^@)#Ds1?|oTQ+_MwS;jHHFO^l^8?&wd7Mgip zy11w7p3%y^<7+KHkO$FgEuqVU3M8L~%59B~KPmn9HllYpW@N+V6%|>It`-J8A+_S{ zXvyHlA3w)K62P#37itI+nMcO4*5CYa>ID0E1O*n8a9CPiUj9D3aEcMmPg`4C;o^-5 z6vJJ_`cUb3Bw}R*O`QZUb-~(0`d!bEsLO~eJOcFnD;Q&jgSsLu!@%I@du7muO1J;# z=b-jlv@&`PqPf;a7W~M5tVKpeDgSDGwxSv$j7peGWnzwzZMORP^VC>GM8gNJ@rX#; za&skA$^xa_Ifjge|NZ781r0${JM6uHRh(1qKJ2z0ll;>~d5J?OW@W{eT*5Z&hG?p* z1)Jh$%O4B{#!Vu4f!XQl=~LTFx+Kj!Ked;*-7|zZqMkL9M#PMUWH)J0!?07U>(}t# ze-&MHDR5LB1>X>#-a_aiEBH7}-pF2cl#`}csbps22t@c07Yb7AmL^IPB)z4P?u|s^ z#?+(s!~0#62p*o$U|P8FxuNc0TD}V_lgb4OPGi`|@ctSjeiv2-F|Wj@2TPNB7(5*h zYj+z0^s6o(^#5KRZNEVGApI0(Ze|kX7GLh|dK5g}VtEuxr+M6DRyUj6StKwQDwi4@?OTu>l5r(Dk_{#5&%gC$wiz>cP zyS}~MrzG-I-y(h-AH) zDs%MUK1iBhCqjFc+<3yX*3#a-F;K~A0vBl@%Y|fbuY!q5)=OvcO$cfv*}fL z?mK?lZ2(A4ho6(e6+OaY0TQTtcnrEv9H;uq7RKm@{cBgrO-8n&w77IDl_+8K27Ywo z)$1o7w@jxVZu*zmPpEEb`cpC-;h^>oO#Reb{~Wp~hbe#A)p1>|ma%U5@I%YHxN6>r zeAC6;+s0rpJAf}1c@skd33)zywL?V(N6*bd&>s43U$dGqwQVy{S*W^p@r}2)DNVX^8o5OEh zbDx%!!KdaJRJ3v6@$gtYlYLNkWPf8=8udp3DE)<2ZubuG;W2$^j$TXsX_;4~1PPtj z#0LmS<5ag98HLh~xprC^zbeTdyFVa&xe|)$X?l(I*gk)vFJ9!^@f9D43Wy(AN1>VP2JkLguUmVW_Dnr z4wJv)#d9m?u$MeNJqs*;D_uv_e()BGp%SxfJYC68M&^o#`!8!et@51tpwDUB6hD4g z6rdZE6&DwWaFCO}*?w3Z78`3XUhZ^oDyg}L?hb-4vF-;>u`^DnoeJ*~n3I#!Ku&r7 z{AovzY+HRKAmn%;oeoD&mvNF@*QwQhbVNi%L=&53ZfYv{*Zzf!ou8qoN;kEV3Y5w1 zVL6%Q5leoCpkw%=)P&QDNQUnwNZwoan*;CPi{Sp2PM;n$y$Ijy_b%wvTR4C|0?@kCo1@A;h63MU_Wk(7Vu?Qpz?>tTSK!WqV) zIzxYY&ONEaSZ5&alOkGrdSl;f3mMyHW@g-mdZF^j%)IEItRG@QtWTCHXFP#E9#k8j zCKq;38%gu&-8(IVbf`M7D*vAs9ZLmrNo&N2tbnG*xe7MHYKl>_&;roK1;&zqL&0#(JTdHT~2` zfA*;k%yc6E$SxBZ*+$WuH~-bSud4IT-TC4$DHnbNog)v}`%uzXec-G2pgq&AcE69O z^`D4{n|A%-7qLkR+1diq;zJ@5Vh{7St~?Z>jRi`mqe<>0-j(Y@dw_RYz|G;VJl{Gy zb@+5szyDyypK?Ixp^i?xL+~d~JU;T{N0EF(8}BCrSySj2k#YW%i;aNECgG^}g-o++ zcN)F?(*=~}Nu~z%G0A!9tv|<(=O!qx$DVwijPNs|3FRK`8c7!j(u+@Fg@ zjpK2+XyJOi1x9CgmwoSxD&D1GZ({nJ?p6BusHC*kR`#{P%l%8h>b71$k#5@CaN{hp zk>AWRFwuJOr<6xG-=G3VI@q6_yvxnW`9w*n)@Kp-Yx|n?UZFipqiQ?gMT(ul%2;ae z?FFmxAkK=43Mk^xk3ZQy8M7pkFaTHcdpO-z`&x0YyQZt|0n$xvPB8mdpxEipFxUDL zp6C=5VnDnS=;`ID3FhD)t946|Q*V+RUngkWW|>x2oN`+ZjACbIel!<%4=R%k-oa=8 zZ|E8Y8CliE*0!aJd$Yk+x@J^E(vFv!GM%V5>#{YRi<-zebh-$=naUcs*;S-RXgPLb z&3>i_Rb(h_u(WXg_=AxHKzIRhny~8%Mlv z^XsWhf|$?7N1wFuYNv)E`hP&}8MN@Zb>j<+Vq19qkTxQ5v%!DT@7S5-`@>5j|26Vt zrV>!sJiU88pjFGUMp=QjQu?@5EEwb19gcVv#WJQSl#FT#N%(74m1Qx@ty^`r0<2;q zuR=Gxk)@`*jj)L)&okay%bezIuJJo0?Ia8USdo^I{R>1fh;wzQG|Av-M->zlmWOKJ z9)FKL=DV+RuryGVsT?D@*_(CZ+~3%&en9gK?1;>a44twdGkI-V8q$7l=rPLrNjx41 zeT@BAojK0byPXYjfW|I~7-|eQcQ(zzDR9*W)#fMApTnhz@muvST^m%mM+WV#gdUc% zAl|*fv3xsmG-nNRyDex@Y9$7BGM!pmi=RpC?k%YUAMVoMnD$uSA`@TPa}2T;C&^wp znOay--ni5CXUY?3IVW4R00kw5fDV&>l~>8}IV_+&^ziNx=NQjPjbmSlL>yV>&BShgNCHgp%R6;n|+Kx*A|$j{M!(YBgT{{)%qi z%p6PITwh<`U%L@H0YrAWy>_}Sqx_osY*?u$B0@q;5?`+sxo ztFF2*Rd(#n&dn*3ydy(7yIMwdvx&rm=4*Z$A%7!0!*SUC0Hb5Cg{|Lx*sjTK$3P?M zJ>*^hhBXCvh+I`q?>aP5lCrd}hyzuHHwM!lJv1`)$e+G1+o4J#Yi;dDsd;G2FPZ^1 zPX5AD3&rzXfAll$w>GKeE-((;Qe^QHAgF!1q@V7-T7Smbz!4@d5GQTc0U&m@KuO z(5rK2u-j=Vif@KK(ATGyzAb;4C~2}JxQ!nPbl`#BiKqJvOwuL+)j7JAWzc}zdrEPk zw3=q}66!m4^@pQ{PODI2_=@!ibx35z3=o~)bF=m%yXkdQhR$_*OgX>iLOyHvOlJc z+Y+4oxb-vCKJ-GRVw{3jU5;Z5cg0KX{Pt!8kL_&2DQphAktFK-!En@_M)HKc)}-zU zhll|%LpnP<`%5Lk$e1igHf;PzF{|Cs8XxzCb3|3;ZuT|vurR`5vX+JQwwCG*NuO`U z9~=zoNFKxd(CFvnT%}jXZQPje`)s^eUFtvf_F(y?XUx?E|C1-yf`i(A|0bC+!y%>- zu7}#fbDyD+Jdk_5PI>az#QDqP`azGfeG`PKo5N{$!l$`19FBpF^YV~%kRD9yu{w0u zZ>{>rtw&<}ZnnKyCCW3bz!rm4p*I(?DuRx=+Eb9$B0z!V8!BeL#(*e&~ zbBUG~Y#q>@|4OgW$PmM$?%oCCXL@EvrmM##5l$OwosBhF!uOXRwaai78~~D8q7CGP4is7TXQ+~m2q>_k2Ao;+Qc{=kTG$bSh z?7Go1`vio=+V@vKpcD#z)6EaENmmUoi=0-k`2gS$xan#7yT(B9RlIj5DtvWqgZ`c% zBb&9jhk_fej#RkJexHIO9*Jpvq5wb*loq?uLZQ32Qo7V0KR-@3+ldk=134Vc#H%Gp z)q?q+2CCyN3R+=@r8GP9Pn>WV!x)72K?_de<;?R7%;Fw5n6R!4nsE7 z?H_#^^w&6rR$>L-lI0^RrEUwe$i!M=Kk*PXMD(WeO>0T?-jTMx_La}D(llQplJES| zz_p=#)B-+@i5ZBCOQFj-Z`+PU$w!^Zyq`r3v1i#>ZA zL`4NJha{qcgM$V9cK5cq?AA`e7a;}?1pWN^nDoM6n?E0KG3^8~cLw6|>*?B287>x> zFyL&(ntTjg0D`5?%UuUP$Rh3qX+OagN_? zFlBaFPZ}-LO}Y(YVQjQ@Om+ypDF5FM?fqJ_#Rmk>;mC9yAtV?A6Tr9Rjt%M8P55%( zx0^ZK51)UNf^(6Qk`gyGjC<=2I_b!y%2z)n+R0cGmR3)f`RE2B(T}mI%(B97QZlMl z8u^LJm-r64grJq9M_HT4`dCUn*~;2t6x%0M1z1E6f`2|Eh+3~t@Q06rxQ)L;XINkJ z4&)JWy;sFvFA`j4!T8k7{@d2ob!4!(plOGf*4E;Si%w6mg)wC2lZCukTN(a@ss^zp zJw3hK@{SVnFXO#$9W(CWfcu<0MeD+(uLnLW3P<*K$0R}jMU;*^ku0N+j zgQwbOk$>;(kJHXB&cF;cT}gSAhH_Ou?-7Qf1M^dkkbL)WSLotS>jT(ixO>-24Q;(m z_5$0EneWM#!+iaE8wcu*z<;pUU0FuWVf4AJjeKN%QG2VSxvA}qn==Xrh?0%XsmmXn za4xW_ZPjb8%VY2Je|!gix$tF*Ag8fnv>hgHgQQ9S;9UYcv+S6D=Oq%nBH3)#)d4gf zy7>Yx+1m}9(Y(IrZdwmswC!JxNL4tfOAZcAUwrYAI96KX5Eq;Lz|XJtKNBz9Zs4P* zCATWR_a#<5Zg$vl4Y#YNbV2r=EJKt9szK1$_d zZ{?ZqJV7Q48X3oFqJYg3&Yoju6K{^35|QPV3%`B~(H=do=z9a zQ)Nc=uru=G#gU7$EtvWtl{C-Y6~{|!EOhRkQth-e&jlLG5@#*&6hZ)~xDkXSK&&G) z4kUb$i|i2~bl&anYtZRg4sAQL`qN28Am-(SoO?Tqg{BCUK&4H6v`Oar55d~I+v~l9 z-6m6j@%xG&5Lz+wr+s(-q~JcH%It=-)YBBNBa+Luk3Hhx<_1)zf@ZVr3ZOz9Dnz8G z8-yat56O7WFwa^PmA5-Vk-N;;mm}Y+#6UFf{7hKrX4aYbd<0`p#5uy3Hfv!)iKQWAqhW5g_EP7~%BWA{vzqY+iE=`2Qx#B=2Q&O?rD zr{CS}29sGPJ;;W|ZZKI`4XNabGH!K^r>XUbBZ(%3{dXt+)lX7-auHDV!-K(8fRhSI zGl6H$2(q?dp511a78kP#go>Df;GAz8So(wS-;l$y6hE~$6PdgT^=(8APi1`(}fF^*GCF`$uZV9_M{h(HT#!o zXsn&Nud*SODU-AMfBJ0JpY%HOTJ%GFJ}VE8qUlOZN($3-(Au~= zl@~bI7HycLM$^xqAY%VDnCu)oA76f0tR^~hwY=NpE9uFsHM(^TXtZ=T+>GMN<;&4m z6?wQ*+xI*RZ`#e7VjB|!F3{giJ!;DcUl7irpwt!r0I9pt?hVhWQMIgRn+8M)Yzt;{ zb5nItF5T=`pOq`stGf(hj?b1lYMc%#I~boR7L3+6H&+jxeSnmWJA$9`dn42Zx~Q`j zUo#y>3;Xl!stlJLd4&fmK;tYfE{0bqvGKCHmNH7%16@uIgGqIQtWB4-R`A}bV=tJ; ztK7M^JM2bBG)a_Z8lF{98qZVU1k@(#bqzquTsFi*nO3F~&zp5BKCLu&8*#YqD=qu0 z!>TuZBB>y61+1qOyh{rDyF>m&yr2w7X>{k#&}kSyeACxjWrm;UKde^F9!Mvx0+24| z0oc%(dXhqoHPk+-YG_j=A9OxN;PIZ%8MhOhbBMO?e5B;Q_dhBFStXIgg>r)D6!E0a z`5913QeDW-DY)*ZCszYwMG|o79SD#$)B5)7;ag7kl!D~|hMd7~3zk5^z5y`L5}$eO zI>I0|PS7Y-gUSo~!-aTMIHPz*=eujXyu=R_N0c+8r8Pad4m#6|RvM5T(hZ0Nfbu$Y zvlh{4!*xmPdRd@ffPt}=XURJ;lYURFIU_S!7Yjg(R!E+p<3S*hTSJg@Vdc4a<*Ixc z8Qm}_SLweeVbyfYBLZidV=GUti@9lAT|T;^LUWjP{Re>VO1+oEfP~TT>3o%crB`HK zVlsEsv>{v(y0Odf>OwdL1QEEmi6G2O;8sDFQpjSw=f1_hdJZQrTVg$+r#Nx(fQ~SH zlTh*P+v5Yv>nikpxv?nJIy<4_`*+6|b)@)rSZEKq0}-&vn)!MWV(&fdHUFM+g`AIS zS#P!+<;c}piaXSo^c?Z1C#JR&>C z3t*&Y@_Nov-j>YgRoyaqx6|P_BvR2*$Pect_S8;=gXa^0Iv7M;J&?eDZQIo-bZ37H+|O>_)#uF)NXtB0qUc z3i!NhTQ4pQ&UPzeT#iGb5Z)S)Z`s?>D~TMg-y!D|I)6~?|aNOVeQZg-{PNNLD<7q&3=}NN_R8_eXIep>Z0TKr0eJ~d( zPh3e9$W#utkt_SH&+P+ndQ?~M4-f~!>?Sp?i0SIps~{9>-}93yQ%d52+Mn$e3Lya6 zioKqu;OTwm_<@W5A6Z3jzxZC4rhH=cDS-f8a!F1Ifq|GX+|GsXZ+pg*!a&+Gr-{ir~I2nMNpea zbHhN6O7X&1Al1U17?6;-OCrE5HqT#|5E633{#^wc@(luRdso_yq7VQYg}4;y8oQb0 zighaU>})3eDH$VC=N}$aP5@`T^8!ra?@P*4hjE;xcH$P5RHqV0A^!CB_uSRznP{I^ z9G70Ab!nWs!>Yy#wTo13gg~S9R$t6t8&}AU4DhM!za=2>d`zk@TU|GMfhnjwa^h2d1Nn+I9rBjhI znR7d5<!R2SOqQNP`d6g7_me%F(P;nM^HyqfB9wqhROXpp^noWZJE#CuN>sidGl zZTRhi;(<$0GR^gs0EIgNeB-iqJrItAw!vpmeG{>q59MXf*9*cv>G_x;L4*x1FB{-J z7{b(#$;dBNc!&30t>NQ*5)}^WSX7@^4r^2((YBe$&HHG%zP?|XGyU6%P`X<}fy*GX zC*4D!Bz!ZFt72ZlZt_&*K0ZFxCT@!S?J3skBZNI(o$n8Po=Hg^BWQ~(Iotv$dG|4L zqQoVW)qff?jVz&LVKPfUO>*gzHLB26w9^l-$!mZx-_SoeX#-{H^P%>6KOcz?SvJ-K&viZ&1q=Q>cPs*Arx^ z0`m7`<=8#_2U)v<_Dp*ONKrCMI7?p_1)GWHs#Y|(K7ohpnjNyIMYYg`dOb8`k|@?bq!N2tLA$N(r@KSvtMt&{>>%OFo}LGY9b~@aVj!hn%`c zn4-$;RIbpJx7_$y9|8gN7S6gf2x+=wF#i)oQunKd z$c&AF!40buj@+Ox#nK0F6Nd%PBOcGHq9&1>z&vrUkN6?6Ub=Sb7M z?k@mvm6=j=7jh3_s}oiwvw^-K1vH(XsoC{*PYfR<;P9aIsUd|F9?^`7Ac6%RFPQ1Z@m4F($^Wb#$6(@4^z|=9+V2 zJm!*=*HScxs(&281HXGn;v(#r$c4IRfOeg1FaI3k#FkKafc>cxoS zJnzS`{WgGk-lDs&#+#%*|MWjlVyyRRa_=S759aZ>tR}SjDLV()XTkZj)}X1nycu&+ zIT?tQ(D&I_514T`{*n2#F0{F1mrX^5XMB@)E*PlE)dR}y>QK7Nsj!&RS?kc zgDeeL7jROnp`tkyK;b$$;VW&;AHYB+@sq~B^BR=D2!2m5q&@uXdXI3@wJwM%K!BCg zBC<^3U+nLz)T3?x&OVOkr*FM_dzNm6PiSeoUqQF?kD%Y$eKcwIZ?3M_8d9_alZuV? zyOJGIwgZ7+yP5>1+k9uvaFqO~E9{UgVDkwgXS932Tz2lN;E=3|b`n2AVVpx(3(`S=OhA&UI?7qAQulFjj*EG8Tia`q zi76oQ8LIDt(vwGgy|+upv8*gC^7_ZvLKx(brB=vKb#FkPQ(lZbVQs5dH?S^DAjb#M+9$|QWf1L%S(z-QK{C6>Mh)`|w`56EA4_ZFDSajuV0K-cy^`T!+~0YDqh5l>BWG zplDM@Mygd^-~jDk@OrAG^yzAhFR-E4Vt1(&vA>gfgid$fOi#*pKnM3lp$@T6wW~DD z@U_1C0|hvIKuSXZYJ&Fu;kF&(?1r3$7uQi*3 znSSN%}xfShh>i;tcCWBm5`cKF%7@YkC8<>k8|yTate`D-cH`m*zJoqE{o zht~_W%o;f9ZF2>z9D)F<9={fS%0qLMHiEGOU$B%dA zT#K#xbvkdq{w;d=E3tx8SG}8F`B$7@T4C@qgqj1GUYS6SGn$@k_$Z~T!U^$6wVgso z(to(34+KxG2Vc~lAI)LhlrwM4(+^7qReSg5m5D}w`b_HGzpDv-%MCCru=w}CH=)&j zhe%+}iW=ozrC`XG?VVSg_bc5eVqoe)=h7vnws%f5eT?UX#*Q`8yWaATi7oiW z^7Iz5GG&W=(=@dHfEpXq!xga-L?IAsUC0OVHp5z=X`=yo~LaT@SJL_(F7+iY$*S$|5gv?qf;)*(AJXXGSe-M+5<POu_CB>xR3l+ zO(czn1<;2q#Eqr?tX#|s88Xhm<$w-{;JrcYc$J4LmzV2mUm!6@9%-<-UMEYpW*-P% zkGMVZHwKfh)0*4ILwWx6ofi%_h5VdB;Mo2*9GKta2gVC_9ntobfks3Cr>i34Ax zoc7DwJqsGZ-!@>u=iU@LPAd|?XzdMWL|jrLdrLuoi{PydgF5c$$ip8}s_KQ?8{eHH zQRLfc#nsXV0DmP+JND#AbRs zcbir4^qK|%F!d}JviS<;xzQZdze0;lkTkFcw}oOtd*tf{`1xDdUK#m9*2l#uV((Um z0pEGB^mMW`2^Q0nvliQg3XSv1x_p|sDR34=Es+zD?@;RutRMc$&}H|k88}fZCf~3|bvPuYJr;n8-(dl7jOI4|5@jGL7IYg{r^p22T9-6)wXE`W z0>^l_Gki+g)Im6C#aQEtEFUz}&(ni5{C3{LsfukoG9y*H)HNzP`gVUG3|{d0OPInm z6KEp~Y>>$;vijH3U70R`5|pW&1UCghFalx3!F>JfX&w0kmAjA{A`*SxoP8n48ike` z_fmCH8Sx;-JpB&dsV=@l*Go^&&FGEs<;eX%^^&RY=6%-9Hhrl&;Yq zCu-*ZbScnSe(deC$^h!3L@ZXFOC!tnQF>kE5Icf`sny0=E##WSug^Op4?I}~ zhH)U+KnHE}Zhg%HqYp!Q2o6euwz=s28E)(*1$sOGeDYDyB(`!`o|=`uRCfcEidvgj z^kd=j8@xNq<8pZ7^&2!A04kxZs+FdcJJQ`o_zfEK$k^*2Goc^Kuj@O*m6yVlJY4ot z1OG8Axf~gR%KeRjuKdYb>mZY>_+y{$Dnt^YurCP}rw7N46nvET@C>7+*Ger;C*QB=6Z0NKE0hs}>+9=57U!xex9-X9 z|C^(ojK_oipeFoff#qBb3h+)fV8FiFjiG8MW{c}DPJkukK1S3-KWv&6acGlAuE9o> z5m~Uv)Ry|{a`Uo)_7ytxhP3brT;^lNiGO0xUum5PJ5!R=vBIfIcpH+UP!!N z=~F>E(>p*I_F?34(^gSCn)qorYfLsfH$U6A^=+-3FzjCU>e?N|eu-VC9rBZog~s9x zpM<=kk;N>Ly9n1FXwrOsv`>}dRi(OX3O3rAG$!iwJik`A${Uh)9hf7~$VZ`NK&tW{ zd_^GahkFvfPW*YM)+lOOyq)_B$LhRu!~X&%wQm#G*51xVNvKdSnje|R#`R{1k5O(Z zJbZYa_n-EqLgPss2Iu{PNOkk+BR#8D7p!4ZxJ4|lf!eTZKc{BFbkG-NBn{;AI7%*~ zd&a9hXHI2adr>SGAEthR@xIy(Tv4A1Ok?2d2^3GpzgP%SHryz1G4FIPClZ&^XN@mH zYC_odxq>47v!;?u5}6@j4WZ2fx%rM%f7HJ&(w1>e)V5rRl6tERQx9D0Xt_xBY+_4b zQYJdRB0;`y=ERhCH0+k^9#KzC?e?~NWIsXMIx!_7*van;inw#zza7Jf@cF1WcZ7Qct#XUYX5PkLsc(!BTg5Gg18C7R<_h(7P5$cYPZoEpqU^~6L z32j=YnF{wVOs%xvCG__m7W58xBRGntm(A-%*LOF@&Lt^@*C9ug6`ZA|h0B zov)yU$Yl=s)}})>q-A^Tj6Kulun^J$r~+bCdMRPLiNfSYnVn9FdpVIiFGjVO|7axa zyS_B4&MQU-3sY^~er;7Q`=xEqiv1>Qai37(FjOV^^wfDqqw&n;L{#13=lM!MRBgQU zLTT<%N=|g0%r}REB3A4w_+EA$VlV`vz0^q&q0BEJ0PLPo^5tVZ(Fe{N+RmWzW%n!c z2QX3x2{}1EzpgT~>>j=yW?8z@;E!S_L-Z`(e)Kfyt502MQe|twz>DDlsQN}0@4eSM zILb#qngh++`cjGvc}!GN1DbqD$H>SCM3Jw*8(}`^YU#XcyG1}DIH_#EF{)9US*;kD zMRdt=lQ1<7{E08>(?Nn1K#!Mh@9d1x5x5IU^U7zQpejAP>Yvxx6oVorqELJ#_o7pK zs?p))#iGxUG?46tOQ*@dTbsRYmBkBKqI@ z$+OWz8S-qZm{V2EgE!m4eFmqJd{=g_% zh@MNt$Mg&-jlHg4mBjmmb@{#Zl2%h3h;*Jvns^~Aoh4xz=4%_Hj4+i6-6xK=?Z|S{ zIbh(wib$~KBY`Bmcs$leIxRCl zx0+@xs?_w2fYdVjOkGI1aIhMUSqlglyS`tCP}kC87jg)kV}Xx!5%1CwXqo%#Ac#pg z9oHHTD|83Kn7Q0G^q2u|ROVfI6=sfSbxQ~wDt&5*L0 z%m__eX@XQm`rrC0CH<(@uO#NL9|8tJn#BM9r5_fx&e=a};nd`?GX5Zo90^+>RqLce zO}OF!)diC%$)ir_nrlDrhLq<~Wo}#6JQcL3N+Aw|v}KTOP8u`=3*d%`R|xAA766h` z910LS%i5a~`UPE8ukD2tQl}G`pLmto!MqyQ&S{Nq7FMzNj^mc;a%Bhxn>Kz9{$BIs zd+vG%f6X-h9KalTvbWB>%n^90bL@aP{!POjVDYope(n-PMcCx5n^IxC6dci0R!g(9 zrs$aIP~lMn2+!f<-Y>Aw@MztfPS0f%r4o@tAkJu3FctN1{0nXb1zn=P^oiGi2|rPm z6}>Qx1M78rTktVbc=E~AS>+m)051#3pRL0XLto&$O8)@_*e(?Fjh5QRjKoez z9IDnGz)GZ-^5tn%uFgYrzukvc-V9lLiI%O1&feNOYrJk5boQX^uW49|DO8}JLcbq4 zsHa4WGRT$PqNQT+^Bo0u9tViWLWDH$-1#eP4jLMtG_LG^j4Xt)JV@qP(w%^O1$H=89Q%iA3)E<$i`+HSxva&=F-^ZvDp|(=l{E zciP`xdL&kdTKn?0$xSoX>(qlM$K72($}#)NV6|xA^foo5R;{+iXwx z|BtD-y<;_Yn~x8(rg*S6E{^t}ovyoP7y1V#ymfY}N*`CxG>4q0qzIO{mOz{jP4z#7 z2~-%p;7zQ1aQ#v|rOZW^wZdund+PI8u!UnG?XL+2HwP~lsBJW5Y{=D-;N-6zy87qa zA)uH$PZUu@(lnkA(BRQ-ZeIqYb(ZmmHN=?sU*o~%^dDu8yG664DH`Efpj5_jx-r(c zRa%P^zJCxu<4|&|yAMBo2YWyvkLp4Ms!pLUma`2KfvZTR(Cfl_4cJuSn1rY_BeiV( z-fZ9%zN96V->go(oc7lgn5MyAYP{aohWuxq zAH3>;Q&~9kpbHdv8uySTSRg^uf(|)u*px#)&9P&x)htVJ(~sJ@T6!}p+w^Y&*7$dx zO^ewVyZH47#VCC`1LF(U*UeZhQ1*6LR#rj&mLGFtO}=^C?dNaP|kjhaPn?;;4B}$YXwH^t%XV8 z$;5@VxKqeO#PUn2MW>;pl4}ZxKBeuLdYED2--of|?Je~4J)c~Nbfsr7gZm03^v?o8 z`=X|9Tt@O8`^01$)8MGbr2oLUXtQKPrl6l?pE-L@^(c56Ke~#ePPP+FcxQw!y18aB z7u%(}*OQ(yP(>aBW=>E?uyFj-WGgxTsGtxAA)UEjX66~VZ%g*UR4JhMlYC#dfPTq3 zrl3VjV-G|`OKS+MRsvdMXRUznd;!SvCweS+OnOyb>eh*YCg32wz3C^F$iK+w`zz7H z-25*vrwmq@vFo=EI&QaqH;IF0AYWgubBqz=q@P9g(ftyQy8!qqIy@;pyGjf3qX0?pb`Rzx}6e)kXVQ^Rw z`0ZWaI3K>%Jvlgs^VWs+CTPG7<6jJX;{pv})*1Nkhm1acmczp=YY96EYbFj3d8B$U zeE*?@5z^n>(L`37AaN%rkDLr4Ko&QKpij$wSPf%;3*~XI#713@%c?&a*g}BptNT=L z;I(2O)OF~j*kmfHikExMaSG|uY-%A%hhTrTb+&fT+UQhyxuFr%0q;ymrx}idRyLKb z`O$Vao~Ew0uY>Y{r_e5cw&WiPO4w(AL2$8XV78NQ^7piXIT&oZ_c=J(*)P&QBaj(_ zR}4ONh-X{)8Tz^F1zowR3Lx*syz;?q`OM>2ArM{V zH)*x4$;p+3`ByU}?z!lIg1P-{q-jiIV$M9X^pj1SQ6=k%?~$=)TdkN$o`m5CC&nv^ zENpPE)O@5M4E^yc21>#KK&_6$p*VPh!cz|ufXbn4=Qmk;h!pmtCD;_x2BC00nnqPE^Wn9;Eq&-|L6ZZ}+A z0g*+1#%^%;P?qr}o!_xl_a+i= zUJcTnf%zdTw@0%+trgZRWnc)DUgLyPS5aR6vcBAjokZlJjw=Khj#4Vh zg#Rig`o_IM<+)$$6BQ<{Pb}Q3tLHIEv7bNQM0mbgAY(*$RXZJgD9vsEJoXZ7bHrgv zGC^Cfl$3nuCk{*J=eAz!hX2GCj*1o?dO$qBiE+0by|J*)hd}=nnR!QjDf_=e%ThQ-%`nvS-A(3q9q_iu2pUDBSp37H!GEvwy6H_$%+*b zhf$D)?e*|&ZmB;YI1moZ+@s5moDb*eP>H;9oVeRl8y1_}3LThRMxhftt%62pFgYME$9#7|6WykYsUZ-*DG!V<#aV1O^a$7h&?3IZ4RjcUB z6(06EPOEb+57@?SV-2!tY(lA^APKUes!u2df`;dADHnpH5s!3fJT;v9p4~4`oW`Z> zR^D!kUZ*#lmy-bMEXPmDE{;JFByD~YiG67hE zKeeOp2}5U^>c$X2m0@b;J}48)-DLmvI~+^0#qRLewI%?>x70h7OP69GTa@Lt$M*U->aqaTv|-rA9ZE(2dWoszb9>>e+PJkgY*1uId6PM;cx#SV-|+)04xak)+)Jx zYb{aY{Q-a~0cHq6dyPi7eY4I@Un`0^=_GdRiNjrF+>)zW3lBD`4%hvq_ty;oIDDAl z2UrwtH_ojC38W)|&Ig52*6xB<%d4@V=G0Y$m)a<)uZl{WAl zaaVB)@KS5UF|({fsV&~ejsSw2+wRQB06<-~I&E2f*OWl)axEeqfHM4iMdQ?tBw%9_ z2s-|nVBeid={Di>y6FS(GzM>BrOnGF;LOf=a=HR@5cp9bE|4MUWCpAh-f3QO{xIOS zB7!>SiIbP&v#yk}!B5vm0Y)%a4%*t{$-k=y2p@Dd%yc$}OO*h-Op#jg*qSF}%qg(k z8LpT64z8#7K(?4YPwo^HW)~4P0W1dqu`s6HmjPdw-GSQy0Ac_%$Kp2jqXZiS9vO?Z zqkH10e{fL9?;wo_Jtv`j%xPi;plkp_aM-*PIVrQHaPrlr3#fA*Mgaj5Pf(@*;~f&8 zoi7$Jwa1T|c2CvIK)z7~vxnM2QwO(E#91dd0VM7Dj$7?D>h!ESIWu#q$;pj@V+fRD zh21a9#7IIhTSk3D9dC!+gT#7)ZJ;$!RzURh+3mSg(Uy@e^E?P>161=|y|1ofSd;s* zNI}G3&M~lU8>+_k4}ofoe0L7a#mQ1VMiiVP?O6fEc#o7HCr23jz*zvaH@HG(#dh>1 zpV(&r5)a(8_imS^1Kd5kc!@WjC94hc`dX%D4icBwMU!coRli!+^5rvm-oQL5 z*8*i)fU|~J&@(OxYQO|SF3LhMpCB|$OjvdBMwi5MZT1V7iOhOok3W<6@LB6FKe^)^9|G)TuaRoj+mI?Au{29Qjv&R~C!1D0_$-ky2 z>Y^G>|B-8wmF?fiCjV;|Q&u)^-hbwSOxNhO+v7r-zofr=wz?(O4G*t}xeqrp4_8Uw zm?YWJ6u$ECn3r<}<#3=HC3|TiP3Ccx$9|u7w|3MiPq|c6Ux;j`^HrmTA6wHyBD^te5ASCwO>1cHK zR^NQ{s}mFDCdulJ+-|~q{1I1#tRXnQGk2W#!TYfFiA^mxcU6QofWV^ z-0FxC9_Df0KAF+Az~;?Or~OdByr|TzvEcfZ+->&3_r7WeeZv$@mCrd{bS)1ZTQPPJ zQ6@9RaD@oc*cxWV?M|@$t`3GFLW^&8Ap16fwDZKdHupe~_sv6rL zG<3J)Ev|UmY^nL4aY)Khk*Pd2LF%iYv44%8KY3?*YAyCFMzJKm;2GK#y>6d5DZ2(m z8*72ZuhSPpvHf&fWp$tO3JpEk(n_r4VRx^I@EE)&FRjGRMCQ2tbqb8tKEKH5mozJ^ zh4WY8^@4mwQOr(>u~PHjo_2qVF`ig|%)(sM(O(+YgO}8Bpz7woG6)|X8LrbEve)il z#O+uOGaGRa#ch0|noSu&gUI!i!UkvY6%zr)mAmb$N98WoE4KQw4YF_6bjr~bk!=-X zib2V>K7Hmvn3KazuHfh|ILx zAIk;7OePs+J{ZI6QkqcMYXy+mprY1?!_z;PaEUlp2)8_28!#VGA=>}YNELZ9xM!;& ztWnE>yCZDh^(;z5_EgETWCF?Yv-yrw7T$3$okB*z(|0KMpB^Ef{Y~kEe+MR6i$yyk z7oTY|x|6xq7hH8?+tkjep!c!9Tsi8nwJ0kIQ`I@p##)vikI_lZH6166Il85zlA~@{ItKryKr<{cU-Ko5{nl1 zTt-1r_NpK;ioMFpi7uJF?f~H)i6eMcDZ}d+h2!~pGe#@DW=!PBl;uW$MGs3WNuSo! zWhT|DpJn!`zd3(b51Be)auRHzRo0sc4(f>S8lDwj&V>`|T@4NWlxTWkJ?V6?>~iC~ zveb9~m9B|qyK5lIaB@)Q3bV)gsrrTqD-k1hq{RCUgzHEOJqqt)^*NWy-l3A4*0e^4 zZag9Hu3avHv-X}&M>K3ZzH_28+_w9oKsvzO%^~lU^ z%P9Pw`Z(1LcH%R7+FmLSZT^_+>oHl%-fX7pT;2E|j|8D8o2_$J1?vZPjoUBk>X`CK z*>G+Q8$CYCC)v@~9JWC-dWJHBW}M2O)?AhrzpiywYYq=Ggzd*O>J?^lGu~y%pMv_X zxiO9^!M;l5g2y3~YfC;8dC%F;^L8tEwfHl;j8LBj@0E$`N~q6K6ve<75B2)@?STag zF*aq~JU3-g^B^vH(Es+4{?+AA<%506a-87vxlS*{0WQ}Af~^3Z2$u$CstZlC+Na$? zTrv*%-gSLEbjrVz1dfqiF{SS}zXW%F7etmj=CZe5D(UyoMU5E@xY709=I=kT!J%+F z@Hx9r^n*z)n@0POLX?f=--PJ@o@APh`(H_>S$SCgZ;(uL|2vZ2{U5A=R`M^7X>$aj zFaJYz)Cy1Vlv3b7nIr4J&GElsCH`wE{tsx0|7{Tv{w%`(N=r=g-*Rg6aB=*zHrk)} z(1=z4+UY=93HwT9O5_CvDXho`8|Yi~n731Iu%vrX=zvOz%h=A+Q&pXB^?@_EnQG}1 z$ozaR#Wmwr{Izy2V!sJXymSj!9lgvC?pGI{v3_2qDdF!}yyP8JW}yn=KBV3x2(T1! zbbJc`zy5`kpvsB_P|$^8V6JtV+_2zqv3TPmQH8%Iz@v+b7^kGVIBJQN2DQejco8FN z@Yi}{eCcXsQSwqh8}84{o7T0~40__F9F=%^c@=5m021q>BEIX=$lm^NrcEenkQ(dZ z^i%Yqpj>{qV$o~5*Ss%kIWVOtuUl2LYzGI?%VymxtL7bbPvWF6Pb#w&Zl>%mP*7}` zE@2qfzC=^&&9a|-Cs9T!caEawpJg0{X12AZr|S}H4-OBrG6>u~jKA|@Xf z5$vCqE2U59PWv|YrtICqn>TAOYrX76-uMzGIhX!Yp{q3akE4Dw+wIbw7h*KJTY5|W zP7;sMme*pf&qJ09GaR#WAn0Gdu&|g=dnEWyEk7Dv@=~hA2O3!M(dP6C-6B7SfVbk#jhlXn$@nW zdlF;CfDP=juM>HgExg_m#~(~2JW6t=_(OLl37c-)9?dN`1HKxRO}>+w2%6BHe6+lt zc-%aR9;8-T@3{Y|y7C-HduD)GLqi>gwk$IaB9wM#Ht=N;Ct`e?Rlpu^d^k&g@r@7d zMWjk$Y>RHDFN%q}>>KAC==#_6me|}=!BOrDuo?XAHzR02**8%^|7Zz-l+t%uTk z_Bjbbd0Kwv2j{!dgoI%FRz9!Gz7vNwStaYS<6{StEe?curP2fMd7YAR*N0H9gT}3*9{W$FE||Z%%9HUgVDWnYI^3_}y05 zxM*w7J}_gcVVf+*jvR@14CS5UbC*6?T>Qccz3*ZMCA+oIlykkUOM0o%Oa`%iwY|pu z^2s>i3r z;s>jrUj$UWOC6?;9ICJn_v*_X9{5e$v8wgkTy~nuCTym>56n6@1tyO~!ZR zxef%%PY2l-aQJMxYs0DQO6=T=IM^BW{CR&Tuz}$10O#;Vsuis(ewQKhAA<#_HllJJza0!;kJc+$>6#v@}l$A(CvEVd(CV8fwb%0 zph^R;cNKT@+k90JMIqb1AuVa!W$P2UvKdR{zE^HwY~G~ zMQm!D8RuRc4vqg#Z|hY_C9Kr&SjacA)tWcez}Mo+toXX^w^U!N9S(4 zZzC#^LBDCcZ_!UjXf>VJIx3C7#%=iX&0y5M+ic-WELwbQBw2jE(1}-`C+SWXP|y`<+G1=W26jbnA~X ztJZAoneXvfkeylA9M5GklK|Q8?MUgdGCMq&x_`J5rZmPn;PH6BdlQvVy3lAh8ksG$ zr_a}sqiif!F+8cfmv#>!%l>*u`Qi)jlyce@fkU;-t1a36$!l^JKI)Z)Tz?`a=f@YJ zG+l%J{v9unQBlv{@5~PR4`9VeX9uNyS8$k=4fQ~ZGQXm_N*L=(4fD3b{P-^a)9d3wM)2A1qqGV!Q!PMxX0G#&p*|Y8fxr}PBR7|$`Aq$Q-neqo#Dk^ay zHqq$le2n5mgyW51VVZt*30HH*<6ih-nttW~>ntm{u z{iBT%!zHwjEtXoo)%*G+>@|J079$bcStZ%1RGaU8MpoSC&q&P7%$2OfypC%O)`HTc z#h*0OgY5tNZR1n$se|2g*P|JuW!EkmK5?VT&@n~p-a^#d#1W>e2GjWyi(9p{v>N@U#MJa%TwF}7+pNavid%2AwS*dhcayoV~72zq`8&N-b|r2Lb3t=nWMW zd=$2)X7I<4prBIFiPl72PE9|*Lf>GarBFm%AK~+1J|gr zG=WK1DldM$H!)UqI)&33kYXQ0v#>K&=qTxl`T3hRNrM?0`HJsX=%bwZ1liasZzDlH zBc+Sj8aCu5de}(0d;n6`drwMADrmErDc)18Sv8Qx3rUctZn_bp#Y6x^ zs4=pmkV9%s=jc>hJG%@}O5{qvB_^K0Cz1sf&pyBN`Ylft+`A5b6)QtYU3{Oi2&J%Q z@$>UztI|j?d`#9VIq(%j&%$mOC3yvflSkbx&5vUO`?v8ql1$ZIX;b$kPwv!vjBYH z^7gjm=ere^lQX5RkN}3pNUioZ6!F@53~5U%E3)uX@(B_+;hyXqsF->ar-U%{M1giR zPnJBq6!O;xklg0W1uv6fINBFVo(UsUQxaIZ&r5_60^&YOCG)w^B}>iB%%C`r`{?rX z^S=wS$vs$1_GY6cKr!!$qcx$MwlBGDJUBS;Yu-CwQC{$&WURI*@fg8vv>fyw2;{G!{RK@id9W@Y(HTrc3|kVtsM zVODOYi$$d`i%%_{BAd|{vJN#9Q*!8d9f~t3Ul2<^~ z5Jh2I{`r*vV9i&wv$F#?`Hs(@S#{n#=D$Sip*1kU}t#B>XWyZ&C-RF#UHk54hh?cLl$mLWZe8ufxQVbP57AtZC0BWW3xLyW$2iK~4cMg6&(qpSY+Y5I zOq+{T_H54t$8-v&Z)Bp#$-Lh=6nEGmIJhxW#K?IY79p7|mwl1XgV2I7DU~XBJo>!8 zv-%UUw$yX^d}n9GO9fmXmo{V$Tj+pipBLNXVa$vRDa1`&7$N6OjW(m0Mk{GX>`qQY zH&wNVaC$1fxH_x#M$u+8KY-he9WhZlg{gOE0(R?NCHahng3`Kk8XXqC6U#r{7qo+%wsRd z+1%ClXzJP1z+^mVJD1Gy=eSV}{3Hk716CJ9axAas@6!WoGEPJaop`dHAtw8sZ-j*h zggJ$?UAxU5U}>Qvh`IHwvCrUbk>my)B3Rht3q+-^4jLe}j2hpS4ivpO%6}?3<=P9=YW)U&I{2p3P%1#x>mZJXba`w>@>PUMVvmiudKq z(jLjX5i}KfRO-lu2x_N%_q%*HGk)^{Q&O2<9(#3({7Y_i zPy{auxGudpcY>ZXa=znXpSlx`Hs<3ZZxK6LqJ&J;&jOkhk+t1lS4{`Y3Ug+DGM|gc zIFo%p9`NM{|JRLqsO(f9b0#j|MpAR`Ew#G3SbL%)vh3PnESi8#lg&WMR>%I`%Epqg zes9X5>-<%|PW$Hp>BSqZ8FvW-J#>MSa_^3p%c;aKt!A@R?M27SHZf(*)&0m)Zpd@q zBIspz?$QEj@vje@KceGbU;Xow78c(eGV8sbv_>Igfv9LsGmml_EG3&S<>f4~-DmKg zZ=#K*feiasLHEzU{paT|lt^+rt>~mrW5?-qt>iRSBN{qPx+JB$aWu}S>WmqB#;nJr zq(hUh<53sLt15W3Gvjm=)SM1a@kYOYz7jogkp)L<(GMGjW}oCwO*c8NRE8B5^(yD+ zVCfsX_i3}H_F@FJj`{lB&bV~EqC=!3y28&J!DOB9lux&Ac7s=ow}#BOJp08P4~|n7 zf>~Ns6<*cU#?$((x>`G|p+iHmu#hc9M%x6EQx1JTHaY>VY!2k7_Mtoie0e0X01CwpDF%yi2`kyV)bV8wp&0 zuN+tpcF47kzM6&6z;}x9xRf23P(>Z4S)mVvbc!9_!7_R(atPFKlz9|85!-^y<7p^G&~N0?wUqup%V%~jhWZJ(h`etElJzjU zNtF-~W3L(b=o#qvVx%w4f`b7TjeV`)*$C&;6z0HQM0xtIgln(ckK0HcDF@?;;ep}Q z?NQr<5hJF!@D%R_w_E*{T#AQccc>K1k%rtPC5gYhG;e5tqjf2KrH{&-z(dc?$noKT z8QLu-Kt|2QD@(Mtx+ZdoxE6|m*q5YCl6xs}{Nj@&b5}Ux=?U_Z)7^a_r$rBo;!3_XndD$@sjFSwP}6RIr&|ZUKZcJT*!0!aePyilCeyykbSnm3 zo#lU|%GoB@)H9Lm?vq0?YxEM|lBT1h>zbtNtCL`j!>`Ex7`H&4%Ol@@u}s4r)}MF6 zfm_#B<@NT{gaO0gr|_d=V@IAn=nDr=MOnj`xaHO5-uO-RxXq5%vGp*dDBIyxhSPnN-zWI4-7BbGZW**L-MBFdkC0)``Ho>{OI|w-}K^w`>5;AG} zlXK(B?n!jw=I zn{u3UZ8XdX5}kEQR#i~gT>q_nEbQk=ql~I%=<=eR9eYFY&(g47I)1+!Rb4$37L^n} z`@&xe8Y(JUnwn-bwA6JYF01K&RiC^WvkSgf*PkLLF9PG^hxM6z1kpb`u0ZdT05jv? zJvmOLb(HYh4@CKAI}Vt1e~k^O-@gsJf7p2cDhvPd1~B^m%P%jzAP1BC z561vMfd&Bc?Gf9`FG!u>zZJNysR6i+@-KZ_a@TKi8{h5i35QSoQ-{tprr|F&!hf0pfkl&E0k zV&nSv?LX7qbd=p@kBs3=4%20EByoUC7zBl(2qJu8X#WCV`0cAWQpjvmZB5O2LAIw` z!%nSQiMF-%e3Q!{3O|uo+vUB-fzZO{slcIEG&v?*36^%2j(!1wY_daRQO zS;Xgp0@`F56eJ|f7qFz{r14UwY??0u?liwkNB5iY^YOJF{Y1>^Tp`B9EKoxYDN4oX z;N#)hI=|_A_X-=k(};&LrT=dI)6pigZ-kdVLXQhG0tgEiBE|bGDrlEoNuCk@24DL;oN3v{& z0IpsH16J?iq7V5C+z6vw|IU%O(j3Zb6*-3eTMgj}xX zGhe-%c<(m~wXYq0bWma8L0nl#yc<+^Br@$PQZLi-3oKXoV{0{`}}^ zJOg~ZOx`CYy2eKBYHxdl>jx7HlhgKiG((tHNVO!Y6phukWe*lyxk0~taq0F>ksQKf zKQ=x^Y;A2V6B82=5mCmAll)cS53jAk+THb!IaG(_@ISnJzMl_iZh9UFzxol<++H*# z6E&jXHLJ@B!h8KL?}p~o{L*<%{Q75#y|dmsd3FDh z&Ll<85z(2AX&=>Yfte3v1v11gmYdcsjI?OJfvGugQi$3c)obF8$sI2GS*^8AMRd_Y zB!0ZUnWQaSk@hvpzE=!OP4^Fh4wqjZvFW{i!3C&}_Ip_I4;3Op;JIq$Ui348=z(Zg z(R2TVT1~MwRONeuRHu1jELH=1p;59>=emT;dEB}+uy>@@)qQ2pT(rynyKf7 z8HyDbrOa~+(n7^Zy|)N8rx)0>S;FLUk>oaCtPh7BW%1@@(pXsy&V{*$4&GbBI9&HT zX`LR=2Yn%Zj(okr5Os)JezUr1?HJd3khyb?$QTo<8wtrf^V z^UCaG29#vRR&M%`;<8Df@nJHgs>WI5iog&8G`plm!+|vP_$1DuF9UY&6)mufvM=x) zhoJU-&W~nggC+BA9qBD^o-gFHcjZNKuUWItwF+(VJFnE;`dmDu6A8qS=F6ocP@et? zts%oS*O_$3pdnit89l9W1)w<)m6FeVBj`+KV?N*Lf-wXwT&X>{aD;RE4xJ0iYdzTE zcv&nlQfPk3N%{V{qeR}y%lwPlr^n$h-y; zA17yZ><^C{D`I(Z>Ri3{{i1I0L#i|HtipTiZi$oJ&C4baOydknSKmV>CME(<2L-#b zkt}U(OB86Z7&P9mb)iY%eH_$ka%BX}DH^I=!B}65_V=x1(B~FWw;6l)x3(EREnhUr zr7up8CSy4G2~ns5lJ9YTRcy9;VnDDCwJ7+;Ha_6mnrnqCS+Q1Bcd zkTz5KwEecSOGj^RQVWTn zP??nWBF4x`pPVJ^|5bA{~$!q6OFP2F|QHV&c_eNjx zDCEg=CavmEEEM&_{r!ym{I~a)i=Yo8PyO*3`GE?AALNvjFe<9~ zJzQ@>DFfi;1@V$M z{>Ir|ggBAKtZVY%ZNg;kma-Bi#g*Id?>bt%$(5wc2U5lbvTK~oq-({$=O~Vhj^@jz zPRz~C1(2*_xx)my#z|3{=x4L!+&5Fr_GZ@m-XA}6Fe>R?nRd0Wo^BcDb8MbBtn*49 z%`HLgYpm=)kF855GL=wR?0)W#1)N`!50|S4^G#WBuyA2f^9N)S*`GAu$UWF*Y5 zD(_5!6qKFa+%8GGh$ZFaQJYC*Wo6$PceQb9>Cde=8^(@alOB(o<%bgoJ|V^(@-jSq zrcA20{*SwbqslU8}s#^c#JWqAA+u~ zZrkek)bKEAw1j|wKyynAh(V9>0QI7$r&r!%R53R{Z);<-L=7T@D*F11wY6N{h~$18 z1{sQYC%Kjh*j&?@^G8T4MT{4zi`6fUW|6r8bqD3xK<7u84*ZIH*6&xZ>D9iFcBYX2 za9?T}8X8(#Tl?~bBv>RmK3-Kz%ZdeO$y`q_L#rgjH6HEN_F=CI+FHSf9T%05oSDHA zZlSs#8)uE?uQs`-ZFCIIX&@pA?t4=e+1c>5&n&6&9BuH>3BCng@lMR(!oXz3kxey&KJpj)`ndTM*f|il!D?{clS0a#C0%Z zT0@(?Cab~8)m~rU{++clM0s{EfAN&V$y3+1-v`gE+U@cy#Sk=`&16v}R@pkAK>rkJ z<*bo*cQX~P()J@h`U0(j0w4!Kn61O(tB#E%kzUxR0oshdD(@uzN78nWlls@<>v=MZ5jGr)DQFa6Vklo zSUcpV_&r)$a~6zYEhFc9hP1Nh8S8c{Q~w4PKSnC|Cx0+>_E_;5@7hme02>a zoXl)psrk0?(p;jB`?^sw&Ixh~{XhxT0KZX!k zhn!treq=zCdC?{YoHZXGV>LBlmvfaa>TxU1xLFdJP*FA|lmg_7FXg;%FkRgZZ6QpC zT?-irVKTuSDkL!$&JEX|vPpc|6(udXbka<(I=7^>_{`N!Md`AuRc+@3L#iuW&tD<| z>J{l8iKzH@G_eTU=58|dvdU7J)9Ws|xU6J`66K=l`m=KjDrq@!zp1H0PTjp-#C=Xb z$C#kaPY;Cd^+)yErA!BhBzJ|tx>ZcuczIc4&9e<1;=-nyZtq#Z;gYW*1=htRBy_AE zFJ%mEpM5unX+{=~dQT560(&Hm)W`cq2%2mStLN_GGJ55mT*4UGjZ|7#$jHDDln>f; z$&kDPeGieiDQ43tqlS;}ExrcbacGj@ILF6rlKcd;7Hp0DaTmEo+F*6 zJI`~s71m)DkD5Fn{q1lMmn8=ub2{PPT*W=)w>j0PTM%34JT# zgWOG#Nt#wc?Oj( z`NeXO7%U=O!S=B?A3a~4gX^I|yzKE8i4(jOEiJP?t3wMq6=hmyP45(e4}FSxn;j>% zC5$?jZy4YsXeBw;IxBSqo*E&hhQ;~_CP#a?$hvrt9+WnJ6A&1R3=!?18Xg`tVe?2M zD)1*@16{KzUix|O?&b%Fh&R+D2Vnens;YO{t9{38g)$6ZVy8=TG)xlVJ0X#@he z{@vr_+d3)PZYp|C*4n$D^Aff>9lZHKa3X0XF;2M{2^kUjIJ^9HE<2x>-#n_MtLt%8 zcUO>OYjLT^#^(Y&qVf10vHa^_o0BSep=oopJ#!rcn*9;|CH?E&4C;el*20os7ZA`{ ze}`VAeHuI2W^Zcp8e*}KFeygEz<}hBcAooo<>gTwc>``8P$fEUJmmAJ#&WN0rue-sQFFkcLlKNZ~co#RLzOMmpPziS?cd zxCA9Om6TE0o0$(n$vN$msTSK>!^+sI3Tj#elI^Y8ezQyHj*oC!TeW_GoG*nGVv?z9 zS=x3(LW=EE^$JehYF+Ygdd?%*XNLb8CCs$Cfx!|Fr-_CJ4n-KqkSi!-+(Ouo+5JtKSO(YbBKrV;{!Q)Zp|ovlNXjfB^tEKckcV~@$tfJFNK!51F*^|<7S`w8(i^nz6b#4gUc?c z^bjDT_-^piax~AMPWS{Q6o){e$k@=(6QQiLgl-deJudJ~suUnAyn{pxMMOjt6rdUm zAsje#c3srMpO5%pS>a(}zp2pWDs3MefLRPdyWDfCPA}6OCxM=imlE~?sr-7poT@7J z2=PEwzVw5Q4R}VN^2>LYmzNI@g{&tSydTN@IKVigSaX7d;qEv$NxMdefUz`tJC+~& z9a93aDDyLjrY$;Pyf{$-HVQT-W>Qj;Ko68e{>p1VltdmPCpU1mJ(^{e5lXU}0E~Q~ zMhnMxI=$tQ@zAdce|2_RqpdOf>oC28kPXg3C10E*K0yxsLW&0b2be4c8XGQcs#yO@ zz(Vp^{S)@jC(*1ZvE4z`pb=pr4`c3z{NHa@Af?Mig@&@?AaM>p94f;Cnc$Mi6!aTj$-UGB1&T$?tydkXWoI=UV4NHjY(J2BOLpyd%N`aVAN($_ z+k_sym#YTteEoJ})%pKAQ}R+s+RW74>BLFYMSAn`px?q&ox}LZZ+pEzHDv1??YWAynpf6x^t{O3lS*yp4qzw=Y818F#UTCBp|iS^NxE> zhmlPC+$NhN>DX<&56Ae3556li>GWQSvZ?nw3C3MTU`s>Dteu<1+LMUQtYWk<1Hwp-ea-I9mz`wRY z5~YyPW5*K^ztL^;^>KFQ5E!PUq#XA{0Me5TKc;ha+qtptxuk@I0Sk^re#Kh{hvPwU z-@D^Z-6mJiUPIUi*|WH?Py|BO1&qdDzkaoUM1AB4BKEy9ygpg?_4S2_D|!dU<<@Z0 zN-fy87#$@HzzQ58ypk%1CG&>B3Wz=NzpR~7&IKa+O(Na%9U*XO|emRJk^{zk# z00y+q0d=$}RV671kYO`u9F_UqTQ5ncKP&=(4rm|vO=U+x{$*TzCc*tlycK7K9F_7G zl9|xigP{pRgvM@X`0t2;LWZ%A4ua29a5?C3LliCVuD+%ua-}~k?^L+y(|tx>y=C1- zx_Xy8a$p}RnXh=GD@8cfoJmu67;DV0CyA!KRZa?@E}qTq*RuZ7P@;>-?O-lB?N#SV zxmiWC2$_+i6g-@o=9kGJ_^O5n7%N>xkM(Couj9dOg1hev;_M!4UD1!%nU64n50`$A zm%y&PyT2#yStH`0nAXP=+6-*Dy(H$T_tY~IEti--`mrGBb>ZW>x3w&f#X*($xF2|_ z-y3lvW$){BdZF7?SA4B4yLZo6QJ=!gZ$~h%QF38GA#?w}_m;S&$<^1%R`Gg{6H2i^ z-E?94tn=e*-J!;n)t07OTU{Dd%i=bmzZ@gpV zr2Zll)R2Ga9E*!nsQvh{Nn639UTE|kL8_*fnwE}^mRb@n+S}Y~#P(}nq{SCLayQS4 za=-Kq|G7T(q_{}p($a`=j-a)}BdC7HokB^L@l7Lb;R&sp%(%AkF_v8SYKkhm)|S)S zoqg_FVsWT*_Pc-?OKzNU?BRYZ5q~ESSB)6h&fG$3xcIc^cyAfTc~sq|ooBp;{Hy>1_%=Q!p6uK) zUs|;SqE3De4F} z28PI9+eP1-vy5~6H=f3g0x~$7)An7pksG%8k&H}nRk+T?#1j%BX{W!p2lcv_s-_fe zd*9pxCXD9;bB(9tk;$fT(r@@%4ArnQC6Cv;zeDTV+PneucTkOkX1aAbG~T{s!E5jC zM{q8l5T7X-j#AkqHr5(t2&+JIJ39h<9E{51(zj|@PI;1WX_Z^ntrZ@hQn`)&4ceG@ zsJij_acZCO{z%ZAVG97F2O;Jl#?S7}Ig3ziJKtK5>p5PZ2)K&E!bB7zp(@MWywP`; z156Q$>ur^XXQk^-n|NNU7(0v4AZnXpmnFQ8ccX5bmo;izWJHEtfy}w^H&RM^iw=9e zj71AR=BLA>+B-4iRts~kD@%Elr(RlxVPSf6t~QYUx!z+@9wckeK*w=Tvs zMi?JU#dGn2CSmi0Toi@>296sl(UD6~; z8#(Xbhq{p>8CdhbHa2P`7WT>`pHe#gF4Te8y5tI%p(BvFOgGXHr4q&`=xeE^#hZSZ zEh+3%bM&DSiI>HxY;G>5VW;it?T!^W{c=r*URB9ShFa-oBd#YBBqU&|BF_!aOvm50 z^5lX-vV zhK&52nvUfi%yqR#Ql15ffAwK+ucem+$Y7AH=r;VA`9$`vba)TymKGA^v7UU|_t0q$DNr zfIqU;FwmexUC%>|^YgcFGzBVngoJ|4hx!e;@_SBf2L0Vp=QBy{yls$3kelqru|u)VW`EQIsN?vm`ndSGPo&$ zIQ*~w|7AV=`4tFNeaNjI3@pG*$$=*eV4c0E&;DAA0HXQ1 zIWltcQNVZ}&59%-?Abzur9$`m#m;)7ex$E2Facj0NmyH32aEVW;974Hn^<6jSwC<< zW@cyeb8@~!XRw5iKEP}_H-4PM!N#Y@LV#R(zaY(Ij+dzJ?gk^eK1JSMS~?oy$MjH9 z!X_d*Fbe_zTXAHYAdxKKSHr@=<>uv~EC870v5OmOdHG6;_S>seZO7tb!1n|H2>sj2 zn2?Z@bL9lQ-AJxCvx^TGBU?$__IlRV^jl~n?(Qk@f&_HvaD2S)QZ>K9i=fozD14U& z=N5)UYC;;Dny|63d@twS9`81V9tW$Ifa!P{Ln%#?Ou#{bd7_|s%gEVraL% zxy@VOgo7MPVmtx$^uhCg=yqHDOOl$7Ah1dSM%TXedgJDNx6W?J> zB?%WxNk^jI=@>dCN`dY<4&5+uESYTgq57C#9QPV5CLn4_b1+k5%^d-PcE;m{ssQl} zixEI7>;`1B0ANgv5_)h4_7mhIN;qd<#XDrS))wS^0Sg{r208~#O|pND&&7ZDYz zSj1U@CVX*;Tp%5(Oi%U|UCH_8;f#foRxewv2smsv`9ki>jdAXluX@K_dl0G2T&tm1 z6^31~Z?tmy?qdV95X>7 zJtn63Rk@8#7ikYq`WsHIl}#IXt{P`2mkc9IQw|d&(I@SO2%6vIhH`U7e7CkuK-R{{ z%5M7yRw0J+N2&~muvd9S?Bk=hVGX~hSV1$~%}apl_7rg0iOW2`VoN&OEo;*&H-Jg) z_uVb2izMKEiWek=b$hXYdU4^qotsGF1uF>v5&o(Mf5fE0T2Wamf(KQXE6B;VSxWGN z&DGILdR~z7qBOlBuQCR%{rj8TMU zW(Q|~WTE5L>v1TrI$0Cj8Br2v$NdNhv32K4CyI3NIBoQS2>H=MqQ0-k z;euefj)4IQ4jT!{6Gt%%m~;_oO-)>!6M#)#0wQk2KB8E^jR=fvbrE_K2aDS~(f4bt zuVbNmc*60-MA=&1PqonX6KU+)52T;aP^+xe_>$-R1S2Bp;(OZ`n`a+LIa$#jE;dk# zq2E-d9F2J9e~t_XVw4c>hQQ)3G<#s2d6-6da^Y5Gb<=LINup3;p;;GvsQ?( zPc=Tk$WUQ4E_fZb0B1%%m5Wh8!25UDYtZx+YRIJ5j3eW9dtp2E^v`Y3LV9lLfUb}4 z#Exjq??vvawy`lWAYkep*EKop$d*j5)|E?8I8R|5pPoi@Sy|zFvL^m*ob65T#LUSL zI({xW%C8z44J=Q|zp8|>lvXv=G$qpL2~8lsY#_^tR8S)paDRoDt3+FG)Ez^))Hhva z-VQ-#1ZeZ`{?DNFpprs3q(H5RbX>r3O~TMHOOy;|ShxV?{0e+gxE7Q|_&+81vy3y~ z0=vVE{^(fH&5@FWQ>u12dFzE}?Up(8t?N}`%k&yHRjMp&T}>5x-8Q!gUEG=uwgd-t zs>T#QzZN9y>H{f;k}^8Qg9<+4XgAgURQ-rpbm+}lg>W%Vqy`3YTNXc-_Oeb_q=XKwxA`qcr5+@Yth`D8$^*r^)pNs?>e(RR6W zo1~~=VD%v)Bv8&h9@Xk4evO8Og+(-d*|wc{!_gzJ{NLsc?<#Ygun?(Z#(x>Vv}c#2LkdD8u=~Kn=kQBDIG%dQ zKbP8~ixov635epXLCgvb0(^Y_D?!A+mFznuWo2H1$eJ2Xm1&VI77!p{;S(i8OYH|p zn&2Kmk0oiWzek_{&MGY}?Yj-w9h7g@oUEMFc%3$mmfJy};DLbwRDuFlJf#g|E}Xv) z>jP0L7)wY<&+fYAuSGI}!n=EX37{T)!h#z26g`T!8y zQdM#!TdC%+w-Qqut$KeS$r8er+y`VBkWe5JaSz}kzfAi-?M7fEW_<|OuCqf+B>3oR z(O??16%2>-9;jrT_h1|1Jo$fkdkdg8qi9`};=$c5xVw9SLU4C?DHJVEDefg$afjkw ziWhe+QlPlDXmOYKw>@Xhxijb8xp(Hxo6uyYN&X~j@4eQyzGay|zBn05N_N48qix)~ zlF@NDbR(yv-QWFXOoTq651VlU6)cZ4suDp5K-mrI2ZLsp4WJK^`CFi3furMMI)O&+ z3oszg`*aid$v_DEa9m(*xz@ZFsE@H7&zM_X#n{3m7rwY!a&BsD1XQooeCN|;4Pc>f z@(-l1ND~hj6Ee}m8UM-O)$EUzWQ2l2%fRjjR`mRQ39ynua7aKMR=yXIN&vNzm67p( zyqwQd;Lm*AjNzC7#z@c4rveo)+`K(A`Ew3G$1|H;w`3U?%Lgu>RK zefS=o_s1fo3D<{1F?M&@FbUA2^75byU?kv;#PhjCcM|6Bh`)rAn?DIowDslzDxkPQOw>a_2Fd5* zVxZAd_tKIdp!v)o=}Mk^)5SozRK08#Q0c2}UL16EVUs_lxiEA>5eQ;Z($a2@+kQXI z2R_c9ypF}a2lrapgn)Y<|G;4~%jEM7%2+Ck^ z{v*H|0~J&eWM|o4tH8vB-0oaair)Y-`;!z!<~9&Z%(;GZx&{4!(fI}QuQ;}5p**$| zq3~xwrUsN+Y6FeV)5eCL$PG~D-QC?#f?(Q!fB;}rFW6a&Ii=0>=(P&YYzd%DMBKKAf)P-E#8n!#;GkS>%o8!7F?~#rqKO6b z;Qrf<6ljazzaxUSU1{>fH%VG-C$hlRANvwl&D%8^AcmM*TLUvF@kmKYad8VN$ZN67 zwDy1f`UTM5q?8U2jt`c3W2{sK60kI54|Kb%f8CuyP5?~;oH!5^KTM}ifOL6F*IZ4us@-dahbien2`KKPrCK+1cSjn|J@UMw**D|dy!}1Hl~^LL=BddsJPAMbbnQIh?$axX>mZglh>D*)|^Bh!Ye@2{PzbOs35i-7E|}6YHs?Z%Z*cg8u>F_ zX@!5wl-hsEEC0Z~bb@cQsUj<51o2igqnby~97m)K#<%Y^tJ4G04{FrBe1`LZ=9VmF zNduS?{^#$(bZ}tVzl-3nhMjWpB?+&7ke@?8nR9G#Fv5i@fgKSEiGh}On^;~+Dbxyw zBx?2jdl(l*2dyzBN(9K6lP#0ueqA_k3+2C6Ksv+KG_{be<_8^pdQ~db17t&h#Cl+f zDk~~p1GSz=m=vO}n?N79L34AU4pdA`OraP@6mTFBV1o>*RAOTH3Wv>TYRi_3{;>FY z;AfJ{x6*pc(M+3R9}+8T86kvG!5O_90QKVN~-rt8%07oBihyg8m zKBsF6;F61J?{8T#^jQuMcTJP4slBKmfY!T+<>uM z0us@JSx*5)77EU9ep*Fl#R>;5>Hv}GgB?+7%3;;{6K zf7{(MCoB20k5>Qv?k0&zk!<0{`K=jb2m~yO_toKIP3IE{uQ#wtKrw0vekb1_U)HV# zuyyG?wiuM+fN28Ma1Kzhvbm0dxA!BoFGBnTIJmw4gmAD;cR(PdkorR*x<@MyS%L=0 zv|&)m67)JIBf?SG0~EIO0CHlx$KEus`quy>@3u1nm~fyh7hr3k%&DUYH8|m+dt6*x zc{2ah$D?@$?TX*`#Ag@e$!Im8P8o|le$a0xMK{kgoD3)0u6A>-LN_X8-u>qU@L6HO zKj!D>mzGEorS-=x>ViW;5MW<`<@MqsBO$=nP539+*C>e|lm-w2;c$kC5%42i|4S9X z#7p%+3E7R_JCIC6ptM>uA;rA0K-nt5ogs$g1IfdU^Cqv~yum<5rfN-Auy%B0U9h=n z;+&%U#9JpH_#Q0%?*JZz`>&NtL?|I+gj`_aAqo9;1-1EUY_Id-^~{EMVgRD|!o1Gd-L{Xf}Y?70io+qYgwA|EgwFONniq`;+1?iD)@^4z|>w zEMQg*P*ALrEsS8l4WuH1X%GwP?L&E}ELSb(pxKxUXr!;1_>Eo~v>- z|B-g|LqJR|N+5AWFIc5pW+nG#t(fDeKB@b|!8=nhho%OytS zl_EsD*-lceudg>lNnS7$l8Of+@Y0me`Qb&;%8_~h05HYG=({*pQ)?0fLLy?^x#x7s zA;d*TPh;biYGZ&KRFlKaA%h2$ef=OnhV*c5Qh7^CzBj0%FtLy@8{*V-D3$*Y<;^}l z#2Zj3_$DR&hOOk}5E)~$-@Iu<%)hUvhjgAkPZ9BMyO&AS- z4+`r6s8(v4DLO3Vyad5YILo{d#BVS6A^tD42rC@EUy)S6t$tYxH5y zys&f)8G5`PDD^+pjZ#ERJbrN>j<+U2i}2@XLblbz@%}Dj6dF&_RMDSEGJyExeqG8i zJx-|%1nE4|e7f*LQwrFY{HFmLC}uYCz~X3L+>1PV1U00!Mj8As$s|u*yew;P_pKhK zeP?A+I@&{$qYRW~ID2QtdwYA6q%c1Y9{fF$4=f;VdGa9_y8F{tK_(Q*?-`v)^2bAw z19f$;-(w{Rr1zj}7B73{nv^I<$Ed%GUQn4Znf7-2JT(}#$(F(rCVpHUyPh`7z*#gE zO8@UXkUO@5!=)SprgN;tgBZ6E9_p~p-^q=Un_8x6)hJwBmWyRpxO5z{JCYmA06VuX!tjwV}t z$vl_DkUx)!jnbB!*prQq^os>64}l*6>L0*{H@AW+4#{bXr!H=;o<#^UwEY!6tgZ2q z*pww0X2QZkA|grpINH-)En&lML6nQ*VFN`zt+zuspP9J^$A>8>d<1j}bFr+Wj}yX+ zFo+VBh^8ks%e4N%+wU_FV+9QhSZG!TB7&!ao10s-O3i$U!#yc((&tuiE}VkmT+e#n z_I6R9RrYFgh9tCfZcpw`4=QfNoL^5q42v6|cmEQU)3d1oWUu`NbGTW3eKMx(Gc!x8 zac`C=(F~*GlO*v(y}4KR!U@Cs`5b@2I4TTWvKo}*{ zxy8&obPfwFO<)F?K{>+;pro;o@4PC(mT6A`sRJ=eIJ!)^B3{)Gf1)GwkzkN~22e8& zgr32cM2a-EX6EKE?5(u5Q*Qqf@?_G~TNs>0-DdxS3`%5wf)$+UIj*kaEiD(D77p^D z0loMZ_mmjIgWN5001V^yLGuRJ&30ec^plAax!-xrhM_9Na#5mKY&`h%pQ8XN6ED&B zHZA6tD#YIzHTpDoK0Q1Lxhve=apt&RToFv>7;_S>tb|GXWoBqpR9LS0R;bqyiq`zQ z^y;eTQq$n!Lc+qLeQ8BS8Tn5wZEbu4f?cuKXo%9vVRoFO{9+*6Y9EPIxtZAQQj^mx?!E?br4;uk{GtjJl<{`OADYAWWg> zb<#96HniUC2d`R(%*_+Ao}P|mpce%T8zu4{V1gxPpifWyC90#Vff5~_51RV=@`c|d zYWi3!JKLCYoFs5cQ%8 zy>f5_c@8#W2sSC{=#CpXIXNy44%J&)oFT?yjrHT|42v@U1}Z6g`*GVkfN1=us^Y-u zN;bZ}cK~_;+B03}7ViGc4SWLZH~*VuWEB|c-QC^b@kIG!B>Cx>qEbawVnRp)B@~`I zv11Q42{8S@R|1kJ#JrA;AiiKzItM4tA}RKtEv>Iq>(tOgd!~gWyOorcUja0i9>0}! z%L~Su%5q}H*DNft%GN2W+6D7kA5(R;<{n;z!_NW4dN74EQ44^|*l7CprAM3My3zoY zg-f&XbDh;<0aN0^<>th^Oe-ThJ3Bqy-o{2p+TsaA3`4=KzX*#>thAwHt1w>tPr(P! z`6LhO<>eJ2B4IZq8D0_0Z_Qc6J1S`k9F16eX`PhR(%a)JPySg+dmGn4c|A=XB9^N! zb#<s{Vnx8a1%M_stMoh&4T$_>GsQf9K>?CdIygf~Ny$Ne zOtEtw`k0tS*1^{D<`Icyo>afl0Y9eS?d{vgIVg(H`}m4j5xQW@@03P7ph0RVfS{mt zPDAyZkPnSzQDtSBs!G1D%1&`$i7+|-Tt^Fw-9F_pwyNrK#pWTHr9t0LPYnV*?O(kGRwl>fHCf>(8+(YoHh%Hq-RHxH;4F`9 z{)XE6*4<%reO+CoD9UDRJS5mq5+5K&koOY03WSjW`o|J$7a$FRdY~i#mq^V6jr6-i zf$_+ufV%;pAhYkbxdC4QN@-N~>-}+C2oh#^SeV!VbWpy)OaA33Bv`CyC}?14i}sXR zV?kYGn~-+HO=GIy=|xXR(NGM1x%3_nf3@Btk@Ou>tAdqg5B1ocv<(4s9WwGC%5*`X zsG}+_se|+tUZ%c@ae7URnedM`VG%=8bbafg_{|pF65q@WKa?c*a%S|!Itwomcgrn2 z0S@_(VAEkbL#3~QXBm8KkW9mmnRvT9R`%8hX0Pp)cV6uzYbS5hyRDGziNDhlFf>%L za@C(pBE=#2`uyZK1nQ0k;6G6I1P3_-GLq#!kiDP@0)usz>nxF)vAJc{80~PwUvk7Q z*IT0w;U+^aVAuT5#{u?);x$B`VHljeT~05Q43!x?78ntLGWz3KqRW4QZjaFleM(qP zp_PM^_r4fLBSs8QPR9nL0N&lu4QEk|NOpe__f7dj; ztQG`z<c9t%D*^Xl63_;E`Uk1BOMPZz+hFN(&Qp~B+abysAQwSYfM0o8 zjCKo-#MY2I0rLhUf?tJlO(A!f`kx}8h0J2(D5`A&p~JhB1i;7Ym8sKvV3f|GcIBh} zX-~U>L>rwba}O=jQ$1s1@F7T8-o8fP!;v{#d5JSYE7YF=dnFbG4uCao;pX`;`&oio zNeBm3h3XHE0O-Cqu`p4BT_FTSHS^(hOycA^uHTEOGV{=;sqeV`CSu?I6^^dZy3Uj~up=dA)v7v4P7wx{+_ zy~G>%0e`@~foe!`c%QW=kP5s3cEV4t@MSrRVF-mYl-5vQ34i!e0ul_H=uQwNmbA@G zJOtjOB^4SDQgw5rm7jR}2;M;v;+aYzHXndy;B+Ua-2({H%7`eDxF9NF%7_tGo^w1K zr~I2NcK8_6kbH9U(!vbToJAfbqp+jlTaY%sb$Xoz;^N#uPsRvnloL(Bswg602wUh0LB;S?dE zMqpC@2~;p%0P!cNY!56RKp_5PO^ZikFl$elg>)*-%BGQTbHSgLV^*_-J$4RBa%#p~Pa#$;f|*+ktrSy1K1UEAvgF3#72Ir*gQEbdfEsx zh#GYoR=r#S3=(eetCyLasEE=uMcE~>MlEg#vv)+&CbXam`70nHC2O1L)!C8?3Kul% zEv*jCur*bL$426iJ4F1J)(}1Feh-&K!$Bc64XYbj`p;?PD$0i(sn&64O6?A&e%x6V zu<|rFaSM$wenwwx<|=*T`G(9oAB^N1wZ%)n%YQg^(=+m8zdTrwqIY>a>|V~n4Q&yG z6CSgO`uH;gN`Fmw*xz5sX$53ryT&4x@8M!feeRk}l9ddvMI#|2lV_DAtV1&b;)tQQ zMA9UvPRAZNRl(aGp|qVc8gJ-aGawh~w8x{gtKwVxyjwzibF^0miD#R*B;3o%1U6Fe z(y@OG#+#vx@@P?G#{&L_&*kNunxurJ6{9Q_W$crR^8@rn_$k^t+8?bQw1EWoAF=IO z9!?epCdGBSmJc>bY0aTVn>0y$eE4DMTwD%zv2&jYQ*}w3$O`v!NvinYl-IX2vY8Yr zPjb{eiD~n1LkDBYD0|lT%?R_m^Jypz#CYtrh$1Yu=iL8Y~~w$@fE$fjY+jRMaD zEU)*e1u*Zl@LM=(B8da+KTzNBx26DSTk7cOsHv$5c+RumxSW3QmM*p!RfmMY{i-W1 zMb;Y5u{!6DYD>qvJN+HaMxS_XsbCUlzY3UeAbMk+t@3kw8;^j1-+L$eoit+ebgxnw zb47VM3-sTy}!uQ5dDnB!x@e1wEvqZ^rur z&g;RC4~`P|tPZ{5$$K*u4halU&g3QTbfCE7L@rK^QL9V~$V|nAn50VCwzb}8Hs2{9 zV_sQdJ~IWub_NH-{=xji;YDg>s{sN}L)e#zbc_+*{Y_j_Vg!5) zRG=!IlPKpuJ%}l5pao!jEQ=u72MDe2zn1}dQW+V(-rnBSLo)!B{)=aUdw>=Dm!kA1 zNf`Lg|MPpPljj#@Ft6GEhn4}n|J5?!f71k?lkiz|HG1D1?GX4#R3g+ZY$=1c` z>kJKa=!l2^=ALxH)DI8;2OmP3WTNwcScKH%TQS_gbB&w26RoJL$cGM7449NP&ikU+ z=>i*4TyE!A9c-N+)`VcwG*I04uwlZ`D1r|4XoE+dDsDKG12njEZEyDrjhHO3Vo)-`P3F7%G~?i* zrAi?tA(G`Tb+T?b$@wBr$z&m&$XB*P&CjmH{R`)TvFF3IaZ_r%oxJmvfO$uv$dmd((A-WIsrgj|TqBglojP1+1xr!&d(t4Ej`W)d z+ao<3G{_LM(XJDI>6TO0KK?>7@3l4Bw|qw`w*pKQ_K_Gqq982v9-^6<#N^PHbMwOw zh7&`_Q+P!B6E;{JW3#HlKx@*r?9RkquNu3u(?f3~HCKphPg=*0(_?ff>e6D(f$V%@a4gUSu=&Tn^SAG`r}CEq{>2rqM7XRY9~LT=3oW!>3Y1*mGRYz!pkrHgX{{ z04I(*8qFZocI4PDtvYMmUO?g3}EG>?@(Y0noV7?Ny9B$OShQFszR4+_@1;txJ3%nk7p?IeT`t&Zsb>+k924+>wIK}^< zEd>5cTm0X(UE%!ysO`%CqK5weX}jXhm+r*)KM6zdzl8C>YYYEJX8)JnRsd=JUv*pI z28NXUFOoUzKuTlP_4(<<%G+Z5$-Q(!C}N+iqOGFb{dic+M;1QQst1Jtp5N@8%`OV| zMIzP!A_5*34l+Ch7Eg@;0#7=sH?T0^-En2%H~-{0fA5*=cmKs^cOu*0_BiX=JtsZ7 zM5WmDc}-aRCnKJop5CAq>!=PhFuy2&t*aH%LkK1ypr`%w_y6`lkN@XM;MxC!hyQk+ z?;vgZB&O8SG-w(W_*haP@7;|Y9RtHc!(7V3-28InO_OvaIU3?UK(Uo^g6nE)p+Ib? z+YC}N({G_ppVV<^&Cy%bs>cm*f8-4MtOU7}spB>kb3jAeeneoj8VV}vfuOycTfIq5 z11suhG9sd`*w$udU1q_J&>1fIVufNgR(egQw%(URI~wUq!85OvnLhS|7_wY?{)ao^ zS*yAw*T2vF;NJM*&&tYLd2Vm_iyL_P-t4FD?$NtD_N9l#3F}njtFt5~#@iR~!aU}U z#s56-@k!+OMZmFp5KGO4Q1;m#Ti45+% zRYnB9hH&Fv5Kd%)!zO-bcjpx-z$^UY%2=VeUZYGY*Ci;IjGTN$0$c(JRHdo9 z+2ZWDjmK+^oG@l7H;6QD0C%6l4}l_W@~5Sgg|QkB`NozD7{GrY;2Z5&O@iGCN~km6v|mwPMye*fXH z$e|0|Ck>`59Yw6r!y?cKklLC503-idL|`rJh;EzCWv92AoDJ+wA=R~`xWg?4Zt8Q} zF%aMI5VUAXT}De9H~3JzXmKR@o?qRZ+<-W>w;_}#4%D19!aI&v9ybiPJhd&uBv;a4 z-K>`3GqUH=S06X57zqVRo(=#?@|MuVd!xLfTDY&GPJRh~%LttR-EJ($FUwWkfx}_KgMymv=T&!NYx_%c$TT>J%CirfK$K zJ!_0z#l^@}CF{`^s|9nQ;pulq9>PRo8 zq$j2Hff~f6`Wpq_Vvh`8Ly^v)ZPa0!sH&U#PCv7hzQecW2g&7P7>+Tmp?R;TczlWb z-KJx{t@NUQuoi@tzGbhQ4L7g#eE!nFg)r5?7q{`9gh&tuPnbk$u9CFkM$LCd{z5YK% z)^35!HK4%rKJa-<;%V#m^V9DdpeYQHhAd58lp?`DkXok2%<}NPuLHJP(wd(Xk2`FU z)Pt0k`*pcd_}a^2EmGvWS?;KT-OuTKzDXRTp2)-_ePX`(N*nKc+124o9eb(>W7b*q zkn_h#OF{_x)3mng51OUwhL1T%!lbG)!Gh*B^HaJd`Q5;CT zRoLnRfkK7027xBwT0b(8_lQxPGFEdMeattDHGkl8B%ccjc;~$3U=-9(gCeO68PHLF zVFXoWszd}que=jJG|zGeK}s>LM^dDI6yaq^J6by6JOt}ACq>>!KU(@a<8<+{tH~uM zM?v@Gqp9DDCV=&w<}2|Fzt?S;S3{U_Vq+RrKFuDAUXQglK5VGxK)NW2iRX}b!aQIs z{GD5o`KxvEloek3N#iPiFCiu)+K8cpJ!Uk&D)Fa(<0mbj)ZPK+x7tBztkbfc%^dmJ zT1+zMH&g5eLZSBR>u%vk#ilCagSx%8c4JvK1%*JJX>s2rNmX9gxyGyIUD!G>gh7G2 z-L;2Zfo`!UIk~RkLCU}fz8ar#b8L+vO}!A_(Otz9gC8v0xYa~v%5;1;JYmV&^mA=N z$qJ2pQiF$EG`(BYQIIbDvdUpAWMuo(5{Qe{C$q0vywNv^rrgKh6?Q&q@!J!e#^rcV zRpL3wf5fOj5LJXmwasc2^AWhXi0DU!9aWY>4f|4C3Ot4i5`P7>81UHOf*Mz)&ev59 zIKayOFRjv&h)7;CiSurfY{8bzTGZw8e9y*U;^f{Z+Ipk6ASR5#wAw(#YPJiavfc7= zJMJ%Z&su7Gb8*;eOQ(A5t4dh5$UGCch@7+d3$7ovPjEDgee-UwLgqoPlE zbdo{P0$$#z&yR9~GV*S#FOo<~)IkF~4Y;rgb<&V(wcI>SC#fF0Stgw5!+ekEVZ20f zzI@K44Lw#IRqJvmOd)lf5a#q*;_+m~u=o0`)3?)Qd5KU1f2?uc*RKZ333|dcTBO8x zKgw%gN%9h)YI=whex{o74u^7yI2)O{`6N>(bW5whh)Jt)y*oVfESug@7SIgqian*XU4S%k&xk@s`bMmU@Y&Al;nIzy?Qw<45KVI$16 zzadnqWk;=&F^O$1BSH?slA3!=IdXws(07IID+C0xwPgO7GJU0W9rkM6@h45z7m)+7+t-^Eh_w| zbetfwAEBSo8kfK7yIGSTnOeDj;kO|M(W4bNc)Rd3k;89}g&C@?Yz_<1Z*p_xDISp? z5!3x>JGFkA#k)~d+Xp7stqi&TIQ{d+-M>&d+D|?Ej2 z5IM5q)>Vj**QL_7?|It|^-T&nB_~PNhE%aqguE>k0xFW3IigD8q_Ql^+*M=#d{aZPyVeLjFwbb(oP*WK zUP&um%}?6KmQ_=zG+Uby&!%B9`0X@21IG2+NCcoZ1*Yca!1Vbp&>1MJ9qn9p9VB;m zcOML(%$O@eGAf8GBWo+@?)U<*c+qbQ;7icn%>$Tu3U^52p;y9xH{CYp2QBAE(}zvM zKNQuy_~(NT{fuEs4;O#V&`^pZDu&9rLFMqcjtL+F+pFv=mR3&ew=qS>LmW=<@H-+s9W zGDbV_lC1c_ALm(d+czzlAHQ?+6wc09Lw-8up`0y7PTrS10RX2M#pJNVw}Y-Fr1M+< zVhs@R!5ZO>Av$V6?iY|}Oda{jzQd$OV}x4#t#J90bb)1SscGR1mRk!MfBwv#k{>>n zM!s5CzIYn||ARboWD1Ao2*w6E{2XN=V9?RVuWolHy>k~qZ1>Oze&3{FEq za+d-5#LD@Dzix;Kc5SHT)X6_v+_?lDvGu4DekhnH6ghBz}jo?DzS z0_)QcCO}aY!beOh;yBrB)gh^Tn9oebbC?gV7tWLuPb*I|G>e@N{P%TUt#Q6BIu+wK z4T?w%L+Df>1Vq#hpklARz5Q7fjO!BbqVYay&f(Gw)bjNU?~Eh=kBkgc6JrTA#4**v ztfdTnJ!4Z-Q{xP0ftl}Vc8zN;rdjrr&J$xCRaK_JXuxQCpo3X=XuDqUQmr0qfgddv zvfXT-GUe6tQatMO{q6Get@+dQ10yEf^Rv5%a_xykpu}}Tg(#E<{?G-{^xHQU(_4j` zw(|{8Ib`E-03F-IZbSjdGRpXx9q7gz&G19XPt}ADc$QC5f>{;(e)t+_+UC?ga-d zsOY(gGhRMzy}w59@5WE>dZwkg-t1t+MOo9AbL&q61*U~t)J~CQ?3KpBp|SlISj*j* zWc1swu+w-?bd9AP`1(@CkLBQRM(=SsR&y8F1fB+yF664+q$l<~e4U)oACZI8Lp9N+ zmhf4+mMK`lfxj=W0&h$<=T)!hQP3aGHD?t|yy(T1U;e1Ia`wIZ0PQV@IfMbvn=pSy zwKH=P2;TX*yW1Kny2j18#187F`(nVxh)D9D)b^a&1qCAldL;6;l}tMp*?4$=THLOd zSGx%3w#=O!4_Ti9G{LC*=F}T9J*s7!YB0kUlUC?bpRyO$ud`aR8TonRVRmzR`s%$= z)(}J4=GX|xFLC|S7Ys2cLY!cw-|lB9%4mKpr0DAJ6whuyxBMW$#uDh}{L3^)#q-8x z1D@rn*D?z8(H3bN4V!wo*2QvSY)r38Cy}@_F@nJT*U{H#A%lZ*U(Jt*~jqvv-gA&%I)@$;Da`9Yi#%}e7~F2#Y;Z~ezp!ww9^ zOejq5YK`>6KM9@&g7e?TC zwi(yV7d}~2CFi82{Tgq$N9R~r=>>29aAYe>fdn|ZmuW{ORJ-u*^AcTHwR5#Kb0%CG zjL9Yq#RDy7jA5m^HWhYEqz5YbxzQ8IQ!;HYhPU)T~YcE--coS z`rY#VVpCwH(|2fTd?O(<%QJ?o7B2NzA>Lm+*PsfK1zDHx1VxGb5Op0@0rm@Uxa(O( z=ImL?KS?iUjN5n_FSx=`k+D$G)`w*xD7|R{+teY4^_X#{4O=xEvBTg}a|cPnxPR-d zKo3@?6bF-@CozpLaOSF|q1~On%V*I3)PX{wdaOveuUU1AQml>q_87}v9UC#QC3*H- zkc>T0tLSPby;Pr@zW{A_L=%-oER?ME;p}TrclQQ%8OKbP{q_n;g5*xof&2MPTxr~T z6nfp6M}=%=vQ#6@y1QL5v)tE22EI-8>YfcuZ=)cK2ApZs!9m^xi?=qeJAK$V@Tu@J z+G$Y2Y^Xrs)YTfrRo5YfhvV_{0oj@d&#uQ?=D{6h^CL3?LElz2iLx`*gr3(qS`1jxK zYjl@jGiMctu^1q9x_pkOfewSBAO~g|;1)Y0c^kvgicv+yir42%6|s{I_^NmmZK0tJ zh)oPen1H-fp(K2#VHM+@@F5q*XQ^wK5Buh46}j9x(_2mN)SfZpdt@d#nv`q5b5NYL zKeNfo453e;gyjlnV;tMn%EJt&I3buEn1OD;>y|zpn)I6b7iOD0gl`aH5>@-AsL}kc zD3a|x&Tp$$*P6*%)8AgX0{hSl`;P|F;e5@%?vzI>#ISs}U1KoJB%17(edpG6-0z$< zy!}M_*3WeHil9X2HXxNxuymMOxYEeUxzaevK7VYF*a~S{PVBctGWCIj;PbjO* z?h^de&|!+NkXQM#`!iJq&^*a6i(m+QcMXJ;h6)+BDLdCr=GQzQ#uqPQkjMnu@M#JE+&?YV>Q(Cgwb&T@Bsw_nZ3NCUVr+k~+L3e3|35C2_KFREQ?n zd_E{xA=$9F$Pvh6w0hPH`eu#-NQ||0G_^4?nebjHQ}|~uXbTAG&0)@%JmJ%O*ZQmA z!$J!vV8QdLg!`_U(dVQg7AXRnk&M2`_Hn7d1c@(N(A?60P}Iz$u!ndknO`M%I>%P& zrcp>$^D>d9@-XtY!tMEDf{_Bxt&cMAtUGnOJ&Wedir+>&%0<|h{2Gb z5FUGJ!L{kD)rQb*XU-Q*2Fl+hwJq(Hn5L|HWxFto+$^sBd|byErfh$A$i|Yj_IUKo zDz7t(OwSo(EimMl@+gf*>GPvAncvR}xh*S7(!J-x>(i$T7F)NQ;gv)`3A&e|p&fdH zEDHxV4WLfg(zOnMIWzJNH8=+I5;MIrEniWJ$ge?fPZVE>v`rPVgEu7E9C5ZWO|aeI z7(jKRR(kBI=F*Y|Lnz!4-@*X#i_%I}vyUfF?`au^4OkUI$MNZR=Lvo?hxt1>yea>< zH#R!^X;*iCo`8PTZqfg(+q-vPvPO3@*tX-$OxSyi(v*B0PL(dcwob85WoKyuJ*K!D zYg_9@joI*CYbw6ht*oi~l2PoKFTTcpbGPY{lE0*Ht9W^v!lGk{OZ=&WJ*j4lt-4W8 zU%20@f`?&Py5KcTC#DZJ2z32hMh>g~1=#rkZpU=F9?<2+7H6LEtesE zxq;+8N-N>kt$=Xn9-l~)BcUq`=l(G8;)2;K>%+UL1wnAeQYwdrE`(A#&PLc0?xfGR zB9le7Uy%pW?#G71ZQ^N7opP0HEHWCUmJsyD^s2S2(*8KwncJ}5twZ(e%PI>Oh zkN>68U6NmN=X0wk+1;>L)I0CgGu!Jj6Yo84sM(0>v3kePxA4A#h+aFJw+LD?Ca7vK zPe|%@x|%aPiyKQ5MYbY)=}Qwz{#RcTcxIe`>)$xuo$*-$ z-yrupefP1mP`i&u$a*c66s%&CzT@aa(=hR0M-B)Rv>&e|O5CE<2|Zp^^u_Q_pdMf(K_&Pk>R_BwwR*q^g-UWZLxD_F{%&Who67)( zWcfZ8=%}?Cg`*KNGF0? zyjb+*q4n(Oe(H?0aU0BND2z$C`Jrct75~JwGo{bNr-V!i&WjJa7md-W9LXG==QPrjs}nw(HWMNy{b5;_bwpV8 zjh6Y$u@Ksxde#iL_n|US_}^MWE5S7He|+l??F;SuK?;_5_`Xr%Ozyq^k-W$dDd%>x ztDy;9)MvD-Fi`a5M)`;-KEQnasD>;g>szL1)e3U@@Ua1sBBb&t3={>5Y7_$!obnWy z0IU3PS7P$iWoz>889ntkrx?s0&#&L3zi)3wQxC|77Ht}wZdX@S;B9b5;2hzl!h6kQ zIg}u*N<%R!kmv$lheml0#v*V0aNT^bTq2VXo51vQ{StKdhQ&h{!NWGfN`&{?%qb*s z^w}zw{(s_pQYIc!urZ$vsw!tHk5?Ud)kYUek%9tt;R3;wv)mK|gnwd>+pidC`x>z3 zNYD@?KL8Gz&2^Dm3)*+=02f_GysM9xl>n&kk}ohJ;`|B_7@XjEX=QXQ?xf+v^1)Da z15;B~`lMe@l(WcJtMJx>T{RfMOSpjBwJL;&jUWcuqqL)bC5JnYTIQfW$Am}?PTY^m zsfiHrKYtknGFuHxO)Drcs}Hk+ofVvYojG+J@#ZaGio&pP2WQ^f7anzbjy^skImag2Oiwd~*)K_x^rxX^dUJ zgbMdJeoDX1MZ3MZSe^uXLrM)sveg z5}X41TmSM9{%HM;XE=qtG!M#7^vHL#5~YY>5*aJ`?^mbQ5YGN?$IFSm*okU^ zPShL(U7>IQ=5Owkyp1UOyP0}IMZ-f6k5~~cwzZfMY{3LE<6~ovYYk`)%vlADi;E^i zQ+T{AndAGHcXqtO5)y0UR`;?)e+2qR^!VT)OVZYqpw7~OSDZnBtL5wKD@|zJQ3=QF z32JE}M4VMb-4|?|b8y0xR~o{V8oDgj;j?KXsbXa$P5N zNu-s}_@v&8_Y0S3R*&6*l#G#CM3r<4I+-pTI_m($OTXeRi16`+86+;(6Cx@NZK)15 zrYssQ40Jkb9Vn@=|4ueH+`zK5`Bc$>2#>BCowdzuaB6|Xt@ML>l~Gv|sd2d_tu z!hZg={bajq;Eq31tn;Hx!O{~u$i>N(yK2J~Bv&cUCB`#j5Pk{Re#4pU!`+YbFcYW^ zGczYVE2}++7WXMeX}kh+jw(|*ia}5pTc#9+=B;%yrzeQhWaz`D+F9Axhi3tj*k}(o zM|v-5$VY3!iJCV^H7?5E9r(JKWM;aA^QgCBP+{<~!EGI!j!BqkUGX&Aa4!XJ=Bo8Ge$U9FvhRx8chr#fb-mNs5-@(6v4Y@5Yt z(V*8|q-jY94M;_5$rh@Wdfq`A9BeFtCmhmX*GW>*r#^CzI zM?pvMEqbtq`7&DG%hIaZHx_)W<0>u@ZkQ@>ARx|V&?>d+QLnzjp`u+zaLEl$fC+R{ z3%!Wpb0$51*Cug3{_cv;sOeQfU-GgLxJ`^kDcf|0JfFQ_O0o&G%ntUNMwKQ^J0Ya@ zaw)p>CCA2T%!>i}^dJkRYs9(Vkg(vR4u$)C_Xh8Mbd&9W!z|I}@rvaqzKf7s(ozwg z3$h=7>eQL65Ow1?DU*^)9Xnm%Sh5q_B_}$oJ>MIFVFa=l=99CwismaPM3Z)2j5me; zij^`+!QcFCnvpILjnRdYXj^BkodLjWpjF z?%Z-I74Q(~(}EM4)1gNcD}KnJm%J9_k~K!`gr4*lqQs3@7~*PQN=%5%e3}uvvZ<#n zq;goL9QtrLsA+RmZ(?H5zf+|w;Os;h4A^SB2^odt4$D=w*I}oK;i=N%q@U5cXm_PT zg*YR0jp`P_MO-rm28O?Va*z%5ON&J}>(t#V)2@ah2E%krsbA7*^!xH0;KwSGU2Gez za^MezEIN$PktPx?3`ix_qr7TWd=GU=B8ii|AX)AHZXM#xtC(^iI@kes(HoGyMt&(L zV~~QkG#nS|=&^l%+ZrlU38$C;B;Q16fOzUM8M@4hynziS)r+Wk#BvJ=s7p9iy!Za7 z_Rbd$T&7U0lWlMHNH0}M*C5|1Gn8_FUbQG&#l>Z8=?hAy>3;WNNwZ%AKP>5BRFgQu z0GtAmY5$gQ9>k!{)IZkiU&gYcm&TMr;yxZ*lM2n3YQW-)M@J@qij?CZCl@)L1aDNs zixR~2vrSF}wI3Biv9UZly?9UTOs^{7E}UJBDe6ethQ~u?C~%%sR8)e&SwA|=*j#8_ zRKT`3N78&N$oXwYJS0yVcws-Tx^IM6LyZj6m~Lj>UZiq-Tx6nm_-;3Tx<75z?ZkUC zZ7po|y&OMOW-E%&Fovx*0Y|D@Ys9JBqcF#7|8qFRr%HL~GEBjUhA?K9o?}Ml$rUJe zd_msgMBH8$bvu{RBHLGtJ-W@D(jzyY(VwPckGyNUJL;M=kx|)XFrKAIgQYn3vQyL2 z#nx8kYDt_|S^B-_S55c#zomoUvLeUL$MxkLk4jI84K@+GDqkxC6E;;rgw;kWiA8}m zXWpXFsLGix!94DI-4{d~C7M+_a12~uKeR*~wwHu_u5bPFhoO6 zaXUZK`~=(58#EM~>gsGiXXNqyuUxa)($fK1qOk%4RX97Mlb$nJmsY07cN=L`)vU=CC-bwYp-%j3Q;L)Sgqlr%4Qe>BjJHVbQSt|TR?BNYDUr(cW-knL;c zTK{zlb;_`G;N3c9TAXbFy7=%^Azd7c9M$-n>^z`E0&Y(t-lv!Pi0L9JGglgR6Ix-q z)-lB-&Br%vg=2|?i*q0on2MgI^#2g|)j@52?Yg)Y3s#&!ic_?>HBg|qdvPi5?(XjH z?(SaP9g4dYDGtSM`un~+XU?2^uKabGNiu|Fv-Z2!UavjtdBShV4g$!I$Gkj!T>D$7 z>1JtV=ZFr7PU;}*_P4TxkY;FR(Xk`x(PDBn!-(+Skefi2*4pY{=8!UmLQ zdiTp6H-q(`Xi_pXMjW9ukBZqp`&m0U9@9BH=zxi%8zc1R`^_AyDWuN)PJXJJyFMSc zD<1R!29q81aBWC8M!HF)sp;w6$-cv|@qJ;q$ztWwXlagcxux^r**mKGk(!C~kPDte z{WVLr6TVXYLTyISGkPZ>>xcH4vgI0(NNC*lZEeL=BUM+0;!^b9S=@iBdIPf4nRq?8${msCeWP z5ZIp@@9L2P=NnzkC08PSZyU`nphBZsd2FAJ@{m@2kP+V&fqPM{D&uR4QAV;3)n!55 z0CA>xkzS=8a$>=^uKMzMJJV==Dcu{9?Vh?v{Z=H@&)mNj?waWKVSd@CF?NY`DOg^( z?Voxz-51Pi=Xe+oog{)28s2MdGo*z>0_IjpUvu`axbV5h*p#ssw?llQK=aODxJpO zk*{SO2R(}(4{ycH#v7)lDCV>O*s<-@Dwpg3qhH9VRdSDMr)7Al_)fS!H9$C5$uu+6 zqOVk*c3*|bl#uM0jBtO9K_E@0)qx^bghA=(B~%J{V095JI*eVKv&B71y^Vf{79D;Y zB~ldd*GMKZc}(qstN^bP!Kbs=@r!7LGMM_?Su?m@zW}&uq<0WJ9}mfzBSlkwZ7oar z0%54ggGU!6Hfq#ZM<;~JE#X|=#WY&7M^2Zg#J$8-5lk-+HgnbDZC7RlcC*{^T z`l@19sMS*zODB~JI%6AcRj6FIjJ<|9iYArKxER97ILzS*tKk;~s&;)hBVm4>XbnOyc7>AbD zs#V*&&yEQb*qeTnDmFCWq|?KYT>9CNr0~lI-j!lQdUQ%W zoxO0|E>%qf{k`u>=hcYOKO~RE)4jth*LoLVcvRCWJY1syVnd8WZjPepH{|0xQXHv$`ji2HNxJ2)0+qp``1S;Jdp% zs2}t=C_>^XNQW?=QYGiuqlXN5;>1AMGT(|w2-BZht)YHE2ZV_%p#H7!ll%5irK zAgc_$kyh+Ho|F+S#(P=R<0X_}F0EK_WiveBxJI**e2*?t#Tsp{@F(7fF`I`f4G zXxBy?J~|&3TxrM)0x{|PXF?>v4amncsD^lDAu7<|xF5`7G>VWWdHIy}lG&byc|aJ~ z4NBr-qTw8=zl#)&A}@>stMLrx?46&RGtEFig-0#|lBr@Z`ry@o{=AIM1E6premtqo zs1LFT^I-}e$1B-_%{!YxhStT%6UNxgNKP#ABRxKw z7gLAVFuqWq+(a=UyZ%8ilmNAfUGT6O_gFz`Q{1r@5qzRPN9IYCO1OFv{~&X!1Hzgy z9>P_j9ZS03j9F#ER6)EFp%=o>e3~J`3Sr<(s(zsc<6)`;Px{mxZCQJ+Mq$En1a-Vr zZk^Exoh!#&mBq*`Z5m@@7(*s)1HDPzcq#R|4rsGwCqyH8RTav`rSog zH&0B+F2>e*#5==&!Nnub?NevO5dA5I-Wkwm(anbtou*1*MkPvoKx!V#{G(BmAT+!I zVHrA%Mg`V7Q9_*Sus`k$awot3ZFy@|dQi#Gsx@LQ*`GG4_0Kt`?3UffRcbC5N?53$Hq+AKdd_+Yx7F@AofAav(&o z%>B)6ABH-Cqm0O{MmosDvUg6I(`Rx;szT!POTd4p_CYHC9r|c4!}pO0&~dUi`(3Q! z-Pza~2bz|E591$XV1VtG5f{?B4F68Ln?t*96~3qyWbSAR_8@zi`*&#^hzqsH#m^6~)dq`FU==EqE|~Sg&9Y~1bm~^R@Kr7Sf^bf} z%SPg(;DFIiAwji)Lqt<^SoW$*UTud&kOW=TSsjZ>Q+LFC?JaISFQgTf4C5Ii9>#h` zmX4-g#!ZcDXU%$^mbO-IO^q(Tl~vW_Q&Lk9o$_X3e@H5wdK{Q&uw>E?p+@33+@B@i z3wpmsu8adW$QkWkMHc00@8em=^agQche3dD-V>dDZdP!9<;y6h?M(n2;*JB4JQJJy z=4U@BKDSQomd5CAM~39Fny2wBI0io?{Jbk+I?@ER$>Ai6fb87g>bcqV6Gp;}4P?l` zResl43FKny5bCDdiB?#LykF+_k1>IQ%+pItoXj++2Pe3rR4S=;b0&CdS>^~1e2I(# zjUAQ(*B^ovC~R56>CH7i)@X$eBb(;5*sT3&G`&wtAF((`yi@pKSk12B3Yi&unw#wB zk3Yose!<@CdbWx^)#;E*dE0^hEV2Mjjl?UyOfl{UE6&VG4&Ry3WLn|qKPl2B!eH1x zU$*q}P{6*k2+oGkq9OA7X-@@7;;eo88pq6!i3Ext(WdB~flVNBT5&@qKnWZ-u0OBX zLh#+O3Z=KWY!ng)Jg0SCi$qsJW*oIL+oAu5cnw#3TVcPLna1aqpfirl&MYLx)mDBgAn5g0rj^sq^uf#CLNhua+ zbMgI9>OU40(+GW!Y541x8YtW?7 z3|`%2CClL?EmY7EK9mor^|}(yA2E?vnzS*2%}w6W(`_yyN&%Me{-14Xj-W4+jQo$~ z{t}W&_FdJeBq#9(>_KDIu?VKlMqr>K1!|WQkYL6hqwFePw!(ci8l6a0`D7#))-dU_ zTA`BSmuROjwHt8-N9;Qb*%3oEb5yf7w3lAFUoU^BpLjE6GEM0V2m1woNdBlx`%{NK88%bYai=-6qqiWc!1Zw#UqSFwJ!ZisOUj@A?FY!J zeL;fO;W++8SY;k~`2Ernvr_gqqoXgpjRszd1dO7}cLxcj;`kV!Iy7`N7no#%JThj) zHS`t{o5T{o_jnR6 zQDBY404W%04t~wq84{)7L?5yyknnP4eu;!W;C)FQ;+e#rg@o8cJQ&r|j zrV5GuQVP&B3gyx5;F9hXrlu}b2}D=j7{W=eU6z_kpoVV)hY#|@{TlZT4!Cc}eN!}% zHI_7C+}?z@UHi+F1Rc?Bz+tSe*9khkXR2x`(6RTuvm_F?wa(ua!LcY#?(#>LLnnN| z-ZiqfZEY`M0l>YEhmBX+;6>sbN$0|Z!U;OtJeLsl+WtSF2TRDt_`We6EV!RoIJ<2Y zg{v9}_Z4c@bo-oU-VXuj6Z0&=RO*W~MA%39jc&0@;XW~iQgVHVM}38plCAZ+D$4pF z^<-rl4@`=wHRfDzi0eKnU;hFTVq{*G!)bN#PI4voQ`ndE-C!zw*EeTtEcr~%L52wK zTM1A^HgWY-l;)$_BlUAo9I^q&WMLk^&xOt~`J!uu!l3B!i(wNb3D7E0tp+>h?+6JV zi>bSUGS`1UU=90A;lmZzj2pjN=wgXf*v$0NA;m$apWVha>bau(kzwws1xn^4xo5D^Dh5zBDeY^r)s2xbt0%cm1f4sQsdU1MAv5Wvx>CR_VWn~% zM`b{{tq9oAXOx3Z3iA0ATT}>4p!T89fn;SUP*h7`{waij>{J5WB7f8ivsuF=U zloHdci`fU=^GaJW)-|l1K)ywV65Ma2nF#=c3sxfad@XFwdKUtJBOzFrnVDH3!eIKw z`a5EQ&YXC28lR>yDt>N69U|DHa>B!qSipSehHxu3vwcdJ<|?jH!LRI`f^MQ+6+mk3 zs^dxwAIQn5eXnV$q{q4JX6~q0G+bABFfKy7o|;Pc=}={HNn^sJgP+hSEE3O!H^|t` zewe72k0&vNO5ri|vEG_R#t?A%U2NrKes=U^$B<>{I zQ?E|s!%y{M`~AhMKciawUmBMRm-}u`9k|D)_e&S{1KqMFmWuEXimytYupNKrr!svy zC?aC$pEpi6CV~&6m6>9i;0!ly<7)SaH8-Q8riKK|7|)*KB#TWjR1gp%^Ls?)Zkswj z(ALbEQ$7#+18T@BkhI-Td~Nr#gvZYxc@pij-4sXNk`P#BxX2I6mUqYiKMpfDUo2VZ zCy9pEv-CvipQ56OM%c5%+?7yl8v|QgtUTNr*G`s-31e7Uu4Z>=OGw#d6wb?PI(_xX zbdPj;-JD#p6vr(O0x#A*Cmn?#RKnok{mJ|`f(uvqXa@rLlmjaC^g5Nc085LD#>U3v z(^Ovp3*U3HoT03?3L)Sj=P$rvlyQ^$m#-o1&VX@k=I0B60Jw4tZD%W4zq;PGBitMp zz72EADb>=*za3J?H27&BdX!TNm$LJA{*ZVfKne^rZI2~{K4~z1w0~rfJpUy4mnQHOnSi4 zF3$Tx8WgNsKOC40F#3@+5Xu5yM5yB%E{5OcM^fQjOgA=S*0rw$lhnV*bgMT}~JdH4HP5-bsz@5UVK=H_tprs5#U?e^;`9|!7^6O|&*i}3^D9e>+ zj33|*YSrH5;(~XpWLFnZm3qq0&0}KHM-0Jwyb)IQrt{NlcTV_n(I@8P#`c_x0-O1e z?lmN(nUfOlp%elv2MWO*L4hE(?vKBEv|;v7op@8KHY83gPb8q^FiG;sJ2e&SS5=4H zH?Kc4VdW-!Kph;ylDkMQV=Yr8xDtWEK}U^b538PMhaS~Y27f{1D$bR593At#ui-z61`h(pnQK+E{_F_#7@>8z8E1C#^i$}0R)7nAU>5V%wBHE(9N`=b1jzuYg zUE{z8bmF%5*IAN-P~IGQ)`RM9cd%;S1qOeBK3-jhw6x?CJ(+;=UuF;Vbs^{lt8(yK zCDBu)S0Y>5*dc|J`sNrHohDbjG{UnNonlpnB8IZ0X)<^?nFh(PCh&+9%J`XQWq3?1 zqSpZ^*53F$=H+jKP8Gh8yjSPCHQwe%5M9lj76B(~cJ;%~m5TUg;K<`*G*Q79#dR&l zL>AqIZAEE$qn7b*Hvv$$By8o?gCyCfk7;hbJLe-Kl*`D!_ln$F7<@WF`3#R^EiA4E z@N91B75h6?mm9_4hhe-P)?wFU?m#(V{V8$V=3#Jg3B?&jG^ z{V-a@O!`eg^pmPU=}g9Cx#k;f(ox=V!B~kcLi|XL~UL~g#&4N~b3 z9d2mA#1LE_Sw2Mx_(r<=UK(s{GclTP47hzVpMdca3!*xH(hpK}fl3sr>M$d7up@4r zT`eskS;Bc#cr(|cLMt5dbO9Saqh~s0(9B?!&dqzr{L@VAx+h`)AFzx#xDI-gV;ZBg zY<_@}q1#g#-EAAu&Ofky3g|384B>-!tuUbF`h*`EqY~*O_;Dc?y7@B=ut0(w)c=6v zku{KPa||Lb&2o6};!zm=F^9e)MLGqvE6gXL=MaY%*|(=>S6Ck~UtZW}+qZY${*EHl zry2%Bokm!W6vfR#!B<>NH10CS7c=ySLafO4J2{j5Benp;x<{oR@-6JH@8V3`W+bsb z(u{FOYrW!h@l1wsRF5fYzw%gH^=Y%CM8N{hNtk2fT}nTCNp{OEKh{f7efkq8k8iOd zBwDHz7Kx|?i0!j*R{La^`f)T1PZZK(RZ2$7HHUOKaHoCH-*1?BvbZ$@gyucT>NIsa z>~A^Lw(pU4`YE=7PK3{H#AZw3&yFsh|$DKvwAb1IXw$xt&Cw#)^KmKX$* zUwmVDFa`?xj0;l)saWDJEutLDhKvq$p~EKO*!g_rK*VIEL13zW83EaY2oRrJtBCBN zhp~XHOcR+w(ltx+cZ-yM{I5m;u;sgA$>QLct)Zi}#P%V>Y@=tmrT2IN z8u)VAGSx$pNN6G2DpcV7=z$&{C#Ufhpl?yx8$U`Z-h@1Ih|SX}!NEq-0w6znh% zU+XhxDvu&!W*#$P?19kRB4ThY27nHSVA>ng8UsXJgJJ@BMSf(-Fy) zHxJ~BgZu=tgF}&`nXx+I;e@(!+)u0gG$bz2-ey)$|2CZ5OU5Q=zS8v?9<^*<h zkcJns2Et&YA@JnK+W3taDfH^@S;Ty+Oh7HInL6X4j22Ad79Iv*M^h^@q`!0bgif0n z>}LrZ!L=*(S(X0tvaOpSp&*Y`Lg7%VFjM^(!(yg%K#HoHMsPFmV z3Bp-9!%%F!I)>g$9VNtk&mn~AhK8VC(YZ2g*Ba5~iEz6(e_BT2Zf_)g-)>P8Yva~i zM8S8?+;X0#8Qc#IzdAj8!C}<@kGq@zSAVLitb_z*H|o;&6T&{LR)VAFmV$_OKHoj3 zfKHs#=V!PuEoiC!$N_ecgG}@1g+17Cb+lTN-PBG!qWJt16O6)Z+d>pOZEabS$K-JW zyYfH(hNd|qj*G#t%RTyaEJxFj+wISvU@5$b3Bf_PXA7U#1o(&{mCr~Dq^}0A6U+ff(7WX8_ehF`r5^6=};X`*aiMKgCS552b_m(N)@r<} zB?WZjoUN?>sWjH~h=MCnH~{*VTf_$eRNpul!p?_Ah)4Vt|W zlYG@+-8*Ulg$(8H#=UQ zaYiD$mLaM4_VGkdx5sXQsHv!?apsM`EO`Q_5Mo#$ps{%5S0|Q*Gazcp$~XK9%CKsT z0+*w8aUrt3cWT1xk4GuIFXeGfcVij8}8L%DNs*{VCzU|G^l4eo#*a3Wm5><;IEv6%0({5a^?yhpAEY-6mV81~PTsokpX*RZSa7ch9 zOfJg|Z2cs~3<Ma^Ab!W#EejXSy7*r3ll7c(-mvr|h{)9c5~&C4Y#Lp3bR8XKCT zYJ-tO107Ern7~zxiwfvjLc+=#o!IH73hY#vV{p5>VA;B^X}WeCa4y&+A(Wd^UzHt~ zedIww)7Gg)G8O% z7@V-kv?0VEA0ha0YC8e>?rALgNk(S~fIvXAsoVud(nH^j&Itc9;Q(B@M-Hc@Xkk^9 zS~DiPaIW78m=1-f%NPBz;C7_0mF%SykU)|MQOOerQ6T9*841mN$Km~2AqlCU45x=NmCxk1zO-g(_r~R=)WY=o2&g)gFe^WMX7{IGuE73-QEAB1%E!{B?BS%*p`e(| zcE=(SjmDiQB~f=TH%mtf1GW-m?pzMFmBHDcd@kazn7Ord354;yOIm8(`kuB_`G+>3 zHX#FK)mdT^ptmi^?Q#IW`*$GI8bl?_`>EO6z02tJ!20!I#UvZD8&Q`^o?1d}sQju; zN!(?EwRX)=!9Gx5GlZ7n_nrbCu1>*pNdZM9W7gV;*F z$Rxr93aP5`_j^4MOI!X*mf4-X^16GOlVA+zAVd$K?W7^V(+ceFkc(}kS@JlrKbf$Q zn7AQ}3 zQ53G3RS6MEP@mG(jsk{prmz(996;(EJ941|Y0R1u2o;2d@6^oh6!%$)YThTXrYce3 z(cWgc9E2ddLPG=hEx{kNN^7-C3jBDGgRAYAYy&(S0-on6XQI7s@~1ow*dU6V)N)wT z&>(^9akiyz&g=a5Yu9txuQ<}Kr?o>h!F+e3ad(>RfI!+bfooq*q*jo2E^&M(kF?OI=VLpjE|vqe1at`6}PJ6w$Nx* z!jAfK%UZao-~8Q3E0v`!y%<{T^YB7os9EcL1}~9Jbt6?-phqrWqmR1tkAUZq*dvHI zPxp2ZkyZDL6FD%#uh8S9v{>Mw7XzXS1EHd}WJbZ(TZE7hqgX)tg_ADtmK|6NKO~GN zjP8SzisIf8**i-a0Hi2uW)8hazNc`n1;>zJl%f`6qbJJgU0H)bV*zJowc=+OF$(9u znN?|$LJB3m`AD>X3XlWE4JT5OHI^SHJhY!Gei&g6Yqav3yGeMVx z@&(o|rHfos_A+iZ4X$~L#5!aqAR(m^VW_yprQ#zXEfzTi63t7Q$c2lExVh8B=MwY4 z=d!JwqDM1{)F(vBmGQn{ws!O?6}4PjLNIQ0U;%Fs49M%xTz1#(q9$~Z;PW;{w#U`T zea9g`Wcx7^GPWKH18j`PQEsqLB!u9;WW}VSbL2Za6(H2VSiW}MF}hz5k(*e?n_)mf z&zc;;VMGoXJ$CNkuJ6zlS)3e2`mrheQE3^z(C&#+stUCYh6Ka)=Lg5O5w#-!2|kkR zwoK;0o8VonW*JBrQmIn^xhg>u%mC>C?j`+sjXi=$UB1p23pkE3HbWuLBv^YttzNh- zwL_|sfAugAv)s{(dMYj;G#~H!A(HTMAYnCkWf0)=M2~(ZMtN(1>WAd84+^CLawU~B z7SNE&gPkP5JqTv*VMNyJswmyc&xS}ETJ>?uAEWE--=64UYa`gAWf ztY4clwm+S`E|vr7F-{#uTiElec2P$3^kY+j?qY(sfxyuqpSEAXb{PPH_#V(V2C{3{ zIv}70kT+(*;m+Rtl{GbDXt!iy!2pLpNg^~V3fRV^{5M(YKSEi&oP#i&zal>#Q)0az z=IpwRRQ=|-a0}t?>@uoqKW}sHep*NHhwz!7ZnONH!Dht^hwM-X6A*U|rdOr5T+PvZ z+PE6o`6Zy`!YDID-}}{9(f*vh^ATH=w-pggst!-jCG1DupmD}A1`z~D58j2e^EPGw z#%DuvW=up6!_|J-4<;Eha(;>k)K(Y)^JHlbJegV_#nwlBdx*7da3SC-r*>!vbR6Sv z6PF4k1KA-upBtJ-69@9|-Lg^@c}f3UNYDrGILsiY^0U`6pt`_C^w^wNd~8|Fq7V5S zVX**hd2GO>8-Z{)kShKba`ZvlKalKzAICk&uH>0xP&93@{QbB*@w9uaiFSnoEZm>C z<;!!piA0^7aUa5Yct!asoe%wtz69_sd)c=Ututrl(TEJ^pZ+kpw%w3}dLKEo8xo@y z4Eo#U{kC3@$qSq2^L}dw0ss(MB#}}+)N#CJ+&mpZLX9~ zkX$(U6TF(gDU{EP6@%G9bK*zfQM!2{Cd<&N&7_NB3%~-5+Q@Oj7((cNPtl(PBWKyy zQB6dKwMEF9wzz~@e7tI+d!uHL*@>~=pTSd6>|x~-VFRe8h8Yv54!4^itUSN*L!g@( z*Xo(I$~d$g7lvN9zE!^s^J55HEzeDPoE^MftyBxVPUCOzsDFFxga}|odlmBYD6b<2 zKnH=o!eIDHLg_8X4DI?tFJnr<$q^#}p+g0-r_P*&Uu$$~jvd7C17mD5^z0!Ivi2c@ zD5wNXbo2xi=BU5X{2WU}-L|oa(z`(L@Lmti+DxEbXNTLq$@!nzCDP{&N@uP6>K}dGOa6y$&@p^Md z{e$5~Eze_ipW0FhIeUJ?{eyIeVoN$tnn)h@56Mr*gJ zMrQ%n%?WGoi^zMymwo4nM&!pmPtM#K=SgMfmc)-h`4F^#Q;kvKs~B>m6D*+b7xdu# zdY!;S{Bhh#nCCmSNPUrPXOxELUa`nP}C$yN<{m&DI_t_j- z``w_dj`#HoMza`M$8Be&nQO47FAbm_U6Z7ZQAZkw9VP?wc3I;Wi^DR=cW56xuEjz~7$ZoWGARKRLBQnMiL zewPJZIpy6d_CX+Lx)gBtk#rvQPn(`LWZS?7_9ySn^5AdxS=#5+0 ztQJXPM7}nzK~>1iJ$RlzPAx^XGFcZo4h|}qsHj8Ds5Ch=cVxWNb9*2a;yUYb| z!9L&9q3CA}+h`^Kx68prLv0#Ihvk|T>Xy(zc7*s7oxU;GK@{}92&tP)KhquEpA9gF z>@A(>L2y3S{V@&zdY6>@D?Nkam?MgM*QLkH);+96!)_Gcy^n&0smKZ~(USW5grpz^Z0z`UOh;XMbIBsP{)f9>*Cr zK4xXn{Wmr#(4w~_q~A^$S&DccW*VZ;DYo z#`CMM-U=EVa1Gv7^*%@~*0HiJA-g$sDJ6$SY}siee8+r;3 zc*VHguHJW}Qe42JG`TWO7jt8?#QA$xC&WJcn)BP|K$&u;tJ&;ud!06m)}pL67tNFx za7^CGwy?haehvJ)9dgzJ4%;6E1#FI=jDnqUY03E7-M!Wgi}EF1T<>)@x?Jq4 z+uO_Qi%Sn|D)1|-NoLMO+)p69bhq_S{OhvX{1x;Y%vlk=S#St2T!3{Z&5h@y*5;o4O*1P9ZA98`&+I%%@{%rc{@{0G;k2|$EZHf7E40z!IGK&txqTu+byE|fh z{8%3o6DxK&%4l7?R1S_w7~hl&_Kc$FqnB&g&a} z{q;#bsCXqf$YaIH*!v1X6n53bF#zpN-5zScbUHj$-7;N56XI-xIds;Z(`HxLRa6A2 zKCd(}Dt}ldfCIo9@&2xA%45R-D>jZ;px9 zzpdk6^Di4aY0nf&f15~7lvv1gXHoG37uCvc$sRLdHNne@xyA{)!soAf= zl8VYjOYgHut`>vQ3MKpUQPSIS-1Uoo6qQ;D%4Lqfl{US6F|eIpbELLf>&)kCaxyI_ z&qpT4&e#LDVxOF4ysk%g%I zD*wVkj{Ix7;nc+fC}>I|fsV(@2Z*Q>J_9@kAZu{(4H(D|ELgdYDs80Du#Z+PV@^^K zq^-i?u{UL}W1ClB=K^&aR1O(4&jd}0gYzN{YN+=Y1lqh2vCG@O&yKTfQ z*|<$&t`H_eqAMwTF?ByQ)eMgg0s>Zcfo2FR_3h*%TM?qnJ*nj`sq>CTx}9pv$09T_ zxT7Vkc+yZ2R^yg0mhw&l6>5UE+u8&DcYoGH1>vMnZ=9XC1NNGnwZCTbh7q(icI{s^ z{kCO6B+}s^&3w#k97;2gE|Xy1BR6MigZ}!2TCd`9c#tetaN7DUn}F`5Q}O!O*i$B_ zQsh#))q06w>ekT1J?|%3oOXP>pjQ?BW1h~v1N+CQlt@H#9!)0C2;k6^hSMLjr@+kE zCO!wXtNM0^(#1)*8sW2;UXoso%I+3caa8o@EkDV5|X zla_*_>bE48{>d;Y51l~$5p72PM0_$`;nzwy&IH_41(!OFCVEfz%k9ki&eq&t7)l3> z&UOvA-#WYH0MvUe1BWx9NuV_E68T-FQh?uucmT9e0f#dI=C=bD_7?0RJdTf-YJ zWbZJ7;Qma-xEOf3bV*g6TCTwp!K@UeY}m*|6ciksj_mH^(%KJryzL7ne>Etssqn{@xtaV@TrY=45j14# zX=6EPP=X*Tw?z5Q|-%nEj2;3&iU`p z`v2!&e3qcfE9(RPt1;P_|HGL7#Wo6JU?xRrJ$rL<*1tCYzo5VV4{M|Rwf6rT{WT{u z`+u_R>AFb@rMu^ryKzyyeyP$Z_hE+pBzK}hB6#7{uGaOPc{*%HxHJdHwhfmLo3Ukv zWrwaBWX|hb^l+fN_ii;*oc#*0g?e6d-&~KI=bvMv$V%P3FEz=6Z0eeIDE~G0 zrtq~;2^{U9QtsHPtrM8Ti*xOupQQwujUWI-BsUOziTRxN@bY@;qE)p}H$WkE@8yT~ zi3?ul^A^s(p5bJC6`6e%F}dJ<74J7nrE+6Njdx3x7*Zqp9Pp`@<@^=5aNuP4O^Rn9 zI|OkQ%p0{xFMc0=f7^m8;uYu(BFtzbDgJKOsqs-p^CRsai@~tArk=Rg4y`$p<`yUa zeLF|bgT_SWaD^LbXS?&C17_0S3Kv(OV6b~ipH7u{lIxex7&x9Ff?iYp=NdJ+2*p2i7E4TG5;;u9X0VK>H-K`Exx){0m1k<~0z1V57IWY!9YIKn9bfuELA znR905E4Jjr;o28MDs$I-TB-ig*H3qV%c}Mq*{GyLKNB z6MW$mB-F)TTALFu9^BBOM{O>nomA%C z9q>@1HB8w@z3tWi67_RIqkVlCU*hbN(23GdaWhZRxZDwPp)sM0a}aw=$EMnUI6Q{r zkG^Z#rHvh|=u6mGD^a~wSJsFmHp(E3Li|t-75g;yFiB>&<{;5xW@6m1#=URF$Qf;@ zWD^Qk_uafH-+(iVr>(9tUXt3)J6DI>5ye_HZl+|30l!3RVy1+c6{%G#u$P=?8>u08 zG6zDW2{Mb9>D#9G`Mop=H8laDeAP5zl(E&Aepe}%X4J%%#rg6N>UT`8+tZ9VdYoh? z9Rv}`CH-s@mfsL`wP4mclUX@ZshDKA3{-86JI+zJMs=IW%TzQX8%=(c$j?;#QDTOD z*>L{s;RcvY`$4CgE5V|blC)0zhn=^*oPAjfb%+`e+tvjv+0n!0=x3Ins$eeS!?ZQu ze3GC>0sR>=K4@E%+JO@jBDcCmM>-v;6lPzwJUR8el@!O_`R@=mU+ic zJFc*PdeuA5df5kXDAUr1rKPBQcemoT(lAy3Vd<_KReF&JU(F1=#T`81 z?g#Cu0E*OC4_*O{iIdcj{&7Rc$GG*!10!G>MVe{%y4l9T7^fKOpFiba*gL-)^?P|+ zH3;z6=yO-V`S(hAFEW16!ZT-240{kxeC<&E+LqEzitWO`k6M)W;xwL@K(AzmoE@n9 zI_eP0nde1)t>fehd%N9`7~Mt*@6iRL_0J&vNEM1d+Kp-VGJy?a6`FOfP~cPedEp?_ z4RQv4J*BAF0})5#bfHqEizWMZ<_&`Ww%A;^!`zO?bqupdvX@q~w3}KT4(j-(5x+mP zeAoTE;yQNcFO99Zum8DE-G1kBbkTa*-h7*VdwP4Bs}}siB6mi{t@GGB^)}@F zylc((g|?R#3G(kCYY7F{ZEE+Q6V=x{XMvldjw1m5b6>Q_E9%?xz4!eLHSPX>rvZcj z;|CA-TK83lJ$`f)`u_Iay}%<+pQQ-;-N$b$f&zM$)!Z!}$5*f0mzUeXdgfo>$^IT3 z335rSmP%#4F3Dbx=E&Yo5nrP-M!yI?K4t%TFnN3S_71R>I4ab+oz!_<(0PfB_Sg!w zX0mf!QGI@R^199^^SF@h+I83Ic=pA3e(Zi767)Xr@4iaHUu>wo`?YafPWIZU^EN!y z-DT)pa7^v>I^=b_E_l!Oc4n#iVHo+ZCxW;mne{A1@8{O&*DYSb-?g02CRbmq-?qfO zPebotNALwY2xKqcbs3tsxn1>VzpVvlxy(3s-86Uo?%sHVWg2eXhl#4Vp3Q#gOZL8K ze2f`9O5?w+6?}S-^_cp#`PvTo3R8#Eg8Tkc_j4nY_c?~wQ|D&4P^;KqZ}-$d8GPT(#0^@#p$N>%X9zI<&*Ot96qjLm(&xa%gm`=Rb? zxBGd3$@An;XErXpvi0$o*Z$P&RrIE)5kaxQ{eHLCeVNv|W7nC9z#CKcpP4jO7ny_jb@pM(p39j&-S+nOS_M5Vk^~$P{BX|5 zf}T?MGo@zKxqLof#p!Rhqlc29_yvv11uMajZu~Qu;>GWV_N_`BPYvRbNUTn)7U^G~ zT(=q3uYZK`72(Nb#37y5i9F>@ha5`fPW_on*DZwF2Bl3>#ue7rh37@eKQ>qwrnrYT z8r6xQ!~4z~<4wXRA*Gi#AO~*2`Css|yl^ygF?3T9Lewfa_a*ZlWf-$jOOA zK`rccx59bSY8t{}sN$Z|U`lTqILOE$ckg^d`rP%$vnNO!W>w*lwLw;+FS`}Nr zt~SDi{<_`6v)skekensMYGQf4wXp{hNH^;@aG|uNhKlR-G;{zs@Xk z4^QR`Eivvd(67nhK9e7jI#6f)6g0ku14|V-B#6dGDuQFdK52co1RLQzpD0*Hlhx__ zM`{QGK!9^q^C~RY1%3pK$OXOhQpDeQ(26lttj=mc3S7mok$UE|ZkY+lBqqKNkV1Mo z+KRC?3utDu%A}m`D~52*=PQX1q^KE5<0?26V$Nw2OF)!5qLzlrP1j9kHTVSDwSr7D z2R0mhRXwRXHE5HMG6T;Oj*Kkm3c;nUZh4W$Bj&m)MYF4X1FtaCu9Gso)_8EA@kdHK zDe*7{MC=;tS+lG%0I8iEiEE_h3v4p+i&iuGM8$*tajHJUFGe2Dy8|uzakdFj9-nT*?eC*iFd7CsUZ%h^xo`UGRo&qbTLnLjoS&Q#w7Y8-@^}h z^5>T3AUA_w4&o;54?wAmGw)!p|79yGw@TYTFx#n>%=L8b!ujyOXA{CHG6lofl&yZ!Zsg7;X)i1+H16yaBE~XHVtXyP_2qCS zd_T#dNd7U~Myd7&2=nLvVC^l#;#i_~(H(*$gb>^%!GgP6g8LwYI|IQ9FgOe$1oz-N zXkc)6OK^9G;10n(1h`H1-RFGgx%d9NKc*k3?yjz?uC7||TJKtGeWrHTOlZCPTdkVK zS0`iPEPnN#1-T}5tFp*vDY{C69!=8D%{|p4Ykhwje%pG)=jH7VF{yYhxRZF5N8-*z zGFhbc&*4L&ZMM~i3-IL)B3ARUxgaE7CGUchzu^RQXU;6#oh)T;j>-Dh4&oj4Fr!BZ zHMxWi;3#kt1sXRxKRrr>K_&BfQZX1Smf*vZ2CiWs+UP=-6MfcSm3z+e$?B`tKimO< z?DdYX+a6;L)yciFJabt=B@Lb5m|2Bx?1Wg^I~vV%s3=7w-N1xa>hxJ({>2kW$eN@DbpH_>nl~WQscGZ~O;9!Z8hvH@6AeL=Q+WJ$Nin0e@xL&mS4`xBULfnfn zGj1|P*%Vzax3H036vIhVq`~CF8X<33qdu1|P6vh4(Nh>ViL#ve=0eW|6(O8Nf)ihJf|Z)e=g}qec_V?>#x*;3`j1ICI6QGe-!egJYMzqd%W%M z{bE2J|FaM{0Tckg$GZNz^54Qy6t~d40;jPVi%~vShdZ)>?T-$3g8|z!(19Bax1xHJ zfaQ&}pz{c~=a2V_WP?=COr{Wt!F7Ea^UhvBnR>z@6@$@4gIX9wXP>%k@CL%Orv1NJ zc`9MNFbRTI)k~JRCCborJXabT5Q|l7)QjjRXH!ntj&J9}4C{*}W#fyA?Ji<1dZSNX zmTw_xy%d~U9J%&ScgSOxq8h;yA3-AvLc*)Z*pf70+WB?qeujG3&9Qds?ht*7ZSLaE z{ib(T4JXy~2L1jNlwaT6gibV(T1_wP4qr+shVI<`!Lo|Le`Nbascp|pE~8@NMK8NL zF7ZJcN&EqwUAeH~yBzSo6-)7SD*97kV>N}zi>_xs4%TSS3Z9rAg_37OvEDpMVBh0JU&CiqSTqTG%c5_AzY0w|^+RXH4s_shd>}H6@a+)?D#CPw` zlbmh*8Jw9uTu>Aym!rEEE(aC-<=mKK@?EuL@;5F-&{mysQ`5dxzs%xJzGk`yG4#zK zut5LB)|B6fEyM(2$f{LXG6rd(dg}+OTd=R&U+hD_#D1JeB7-1<`O@8SY`u75MP5*d zx^#oe0aN(x#b<+DH96Jpf>n2wQ*^9`@8L&(-kbzV3{KTUuc6yg&7+1SYC~bgY`5>S$!X8jLB*xx1Cb(#qUM+Vy!VwzP!Me>j;n@rRQH-r)M5k zsaRz3uO`V|%EXsD-<7T-s0vn9@06+UzV`PQ@qc`2uPVUI1xxr!xm7nLt*>iAI%`jg z6xW9~I|%%`jyOVGLGj*5l3Q#Mt{`mp#W!1aX}XImldo+EpPN-&atYBc32bgusK^w~ z%L`tU)%GVdS|H&NEXRMmJS9cMkY~r2Lu@rF`E+n{z8N@oc1)7cwr?{2X^@{BG&d!% z=bj;I|982_a(%?)ox5a@m^>qjls!v7OD(y5_b(ueFuj^-TBnb^#MIWOqo8_!5VEyp*=7ThLkaQV_5z4k_Tl@Avmmr(3Z`sc0 zPbNmVeHJE$VZ3}<_O07aM?|d`r6VQh-8Dao)c$__{=h8%|9v6+U(4hFb0z#gm&fz3 zLN$gs9iXa;k~!;$zA1?4At&MQ*eOpZUAIu3&ka9`0T)E4r=B8|uXGnS7vN7S=Hb8L zDX)Y|CZ?(balbUKh94Knl}(sv%C>o|0Wcp>D%dkv&kqrQWlF3gue@m^S(0r~*|Lew z5vAKL+E?Yt+t3&NVXKjrIit{=%-fHQmfBTDR?(I2?9%)wKga2~SJ&wcMN1wrUj~!g zkj~{Bs=VoT9vj2y_I?~MKqK`lF5Qi4dKPKSQaJge^7c?1*ulM5RIM{L_5!MluHzAe zCIhkg!2R|u%Xbo~Z>aYCBoTok1hkaV0gUVTJaQ@i`lUayA*IK}lEK>8wj+t>$>1l% zf!0*p@a#H+?+)Jg7gD85<>wJ~u)r`rL$tpe0vU+B96MUEV4T>y=EQ6rFSPGk+@_d= z@(M@_h9%+7Y4d@fc$x}Fa%0fB*6TK3hYcZtjOyc2Yo3PloWl+9At=P=%_j567Fsyi zZkl6Ap_dPF z`)s%tP~P)x!V1IOCrdfnFMK&`W-naRqH($a@kbhnfWs}-|8%zJ88DO1u>@+|9Gu%% zPuW9q*#VUrXX6lh1J{_<=AwB-*S9uaP{e;a&%^F8#{ri0e6roKwPvu^Nwy5Lilm=OmyxR?9auxQrN zEFWl z*DL$5)lmlkSUUukQ$06TGJ#EstzBBB8Sba}$(0MCm#E6zme_W1l4)^>Z>Nj5a6I2L zEOTL=78Bu`kJ2ym-^cF_XDk(b(qz~w`ZKkgzdPkXJFU&I8J#Ka#eKkT1IP4h-($)n z?&nT6fBP}M3P1hQVe;Aj9F<+A=1c1?B0AiYs0JK^Jat!6T4B~@f|B#bk|c23c6rUA z8L82a;dcN`MdLsvr=$$)f}{=+pa-0L-YGF292{_Pt&#%Do>p+JHk=>sw5Q%0<0N0N z->Q8ePq;oE0ZyGkq)_C(&tyjf%o3aw&X!oM+$!yfKruUo)~*~4xZtZ?sJvpxlZsZ) z!wZH|6-q@Kr%lwQ;oZ*QPP_t*N;+(rLs{2bo*<+)Zo$}j)l#!?lAuK@d{PKCGOVhszEzz{$Cb@wbW~u1sgc2J93IuaHSksS!1y^~8B5>E`Yf~w0SXLRQ zEp0KCz&f57ctBMoEB5%R*7U9eH;dZvN8iE8C%W_F^9BzpF2S(H-JA70B(=7-L&1=& z(L*giI@YkT5LF7Qs5qHUsNs2UWPSc{bUL%NW2~mXqtdQu4G|}ZoH|&Z4wvE#!*{$q zmPtn z-e(C3PPu9f(X!P-mx;s{xf51EFD8IqID{IqSuA>*vcDNo&*}v}HIhNXqPa{}8*apl zP_iq%17Ia<@v#=ztt%Q_R^F5^8B0Bi4A0bxHLTKQu(!cXUij(oHcYjtqD8J@`fw-_ zPip02-W;Hy%r?hKa=DEasP7x3WtOT{i8ZN~aWNVid`yEd{AvJF7}|s<3FY*fAasf} zoBYHOQ{+)H2ZB{8)-4=qY+Ef`TdEp1gE`rsNrAqQa{M+XBEUc`nzBA44()=#L@C9v zw!#+4u3LS_5tX{wDJ_t0to>@h)Y%If70M};Bs-{p>xb|n$iOv z#mDE-b_cGhL*`sut4+X-of$_m6L?Z>6<#ZN&KXV6%}~uEAY$|5^8^gb2&KmS{QPW! zl-WVv=A>s`EwHc9c+G<$8<pXIX#EVA_(E(r;gEj~!4lMesGZUC@aji3(`<@Lf zvmv;~1(A62$HrGc+ysiOHGQq)@vuWn!?)e=Xdf?c*a9Y=oz6$$Nt zZT|6%lT%O#!a=BcXR-~8A9+*n6#1SY0EN-xISa2p-_)!M)CGY=r+Da&4L?&aFaEO( zF5Uu!BADp1lKr}r>N)9a6j0k=xZym43MLAKQz~jO0xaU|h-jq$YU2Yw?74$Wpo_mS zk4-DIm(K%N@Dzb<2PAftxxT)>h&Vea)GQK&AEp9q@PGAHUk-;r?|}Jt(>z>tdIR*^ zo3{?-zY5Vn#2A4#l)MX;+(^DZ+S=MA4ks5L<{kps>Wwbmc`N@}czL#bGWFx?q2TJJ z4=${yhW4TB!8_yX?#FTvXdA|IzOj5`c>6ASfirfy#)riHv}o1sUT@|0;b&FDb)qlg zp5=P$;b2k!w(Cdi!~L-wp8MGYx#z<7zgo)0DpsRbAUb+ki(Tl=7n6OR^yI5H7sl(o zSMtKc-mU1VpM;NV%M3Ff^4P4wqMxp(BKhEU2}W0P0m}^Z_xZOWi)lWNJ~OYf(aoZ2 zk}>f)hTQH9c1nCQBk?24|5To?Th8GS-4_LEOW_rL9xWJ!zVK|~eqD)h1dbI!3{(k!mWJM)dyU%e; zS|&v6M(^HN*RTZLnsgHl$oymKO&l@Ud2_`3{gmlG@jDt%(p&>&<-5z<^ck2wwlldW zC11-9xb^MB4Qb@=eb?EkQ59^P5|!dLV(Em(PKHHaIvfG^ZSX@UWpNVEh_VfY2%?rZR0oZKS1sZnWmk7Uu!AcQuq*%m`SkD0(!1f8(n`5k-CyOSU%GMXYfmJFmLO({yri&r6mjb zBRhjN@^0hSmrcO%*uVH3Vs#sIP2i3~^Uer+d>V7tM+auW_9DYjh>b7s5uo~iq;x)N?0f7C@LU~(oh zd~{z1$=TPQ!R{i6S!ya_gE1AVz=@_)2p?*%hKxMErd1LoJr9e%OoUV9|EI#r{ zE>`$3)?ifMkadU&_1ZYGe&3RLiVoc+}-pRP9*P)JKy30(6z z&c%K6_#g`nO);czobuXnbevHS`^I`Ixxl5BXN2H^=p5SfqG1Ze428?;a!;sIB_bhmy5!5Sl!kq#S~l~6 z1e9PCYKXnQ>c9yH9EZBT5WV`HTJ)Q`JFO@@((m4Ec<`4?5Pw5c?M%=1z>tqI2kCk8 z#kn*tw1!64DpAcmQX{2u8P9Vp)gdba} zDpu@Q9P~kE!oDJg#2|AZjyV?ZSwp`zxse}uG-oVVArYV}-Hhb)ZbFw=fRH5D?&x`8 ze?0Jn5UfUxu$%rR(Xg^1%(tWnNpv{!)Nh4Y6D~_FCOpWK^+^X|`dbyrL$-*WMbQq` zA-XlI#hVlB^*Ai2x`b4j@sU~fR_1B*K+_rc+L>geCGR2EiyQ6CS@J8UPeomss;{Bo zMgbB&QxXh~LUrMS5^bg)5zJT+bpnIP9Hwt#F{h%%mG%^bmCmhRpSL8fgTV6X)TXsz zh%TNrTs~JtFK5a#lK3gP{;F)mrEG=f@jkwFjs9!A1xUbW%n5IvyYgkawM}N3PL5H4syqv7<`wBTA61*y^9#b!JcYgU7y)fK8yXc+dGgywBs;! z6b>rH#(lws-*~o&6l<>Au`Q%FH1URtA4LS|;OMAn@$f7o5#Z_q@+Ke^9tMGfSv21X zb$+(BgZFP|3n~@^;ikJ)7_Aric~U@vRuTV<-M%n|*62oe=&E<)>Sn)$)GaIT6ypx! z$EJZJLQ6jUaXxnBO>h4d?Odu(sYr-dQ`l2YC2CzM@U1tCPGwIs2jlgYdZNxJ6=>fL zS;SOMBD*HCUP(5EMAy=(_4p;RznX&Zeu;ON^Iv2@UNbiQSIkZ8oh7WEFAKyH_ z@oaDmrFG$!-k92KCK&&iR%jLvX=T)=*22T}?$`&zz~$T~_j>z0QY>C5--ClZI7@DT z_73xw%~gC@?Keiby~~u@rDY6}Y{$qceOb`IS*cmnQZB*hu&3%&I9eRU-E7Kg9j>u| z0tcV*2=v!$*kT&J?qtuxlB&-i{CZU4+M`NFnRd)Um-TssE0D1Y-}@qP2EpAhc6x58 z6_%|>gJqSoTd!H~77K>^KauEMQg15}Bv@RF8&9QFG8aOmzzdZkP8G*M-{0*_HLXjD z*uK{$Q^-~?P(L#q8Uoeqv*LI6D29l0P+UxdC`X11?o4@Kb+L!&$6F33x=&bqEpK?% zc$YyX967sU2b$&v-lRN$@`E~7&)&j;JPQC4OZ&2GD9A&p`P15fe))~^HnV3}`7mDo zRnJs8sDy9R^UP4xxDq85*BmBUw%rof!;H@vf~Tuh@XkP0%gS2wd^eYBmDldIUIufS z{WvjVo*}hur4TedgE^4Oy^dNixZ%J*C~Z`@WN)rS;`g2Vr|=imz5>-fMRUNZ^%&vR z(%56k-jlko^KNx)VSVbv*6`RSJW@MDKZ+3>4n(Rc7z7!aDzbSA#A>pRB?<3Bc@EWe z+uP=#|Uv&Fn#jLJP#sRb*QM#HR{v4x=ow#*5)^CcAHN6ei4B! zxj})g?x^nQT>$falFe12AAVJ^chNYq?Zs=MfQ&G1bUHfAEx52&8rxnvkmO+cwsU}A zG_@6WK$arv<~K1tIi+W@R9@>ev&4OSj=Dbt=a?MZPRN|uU-WdnYHH$X(HptU;xH;6 z9ujO>KEOxRePA8Mt7*I}Po6qzZM}bQf32M1bzQ_2#am>EGokx)aQ%3yl?+r0?1ifP zJ3GDm7lvNcQ-@Uylhzj~FgARClp^&G9ve4;at^_zR==OD2tWAUux`4Dfnru!rT z!eb2}du-a5l{5NG8P}r>`CP_$d7*FY7+#l@naKZvz*qCj%X~x_K;D5lACiL><)g^> z?^hC2Gk;M37x3g$ubBH4_D9rcmdJ2+Mds;VJlakEVnX2H`^Yo>TlD`@{@3*M zx7=WZ)j$xBkz1bQh_l%Tz#xy<)!m?VkOKvWBk{Cvx7-WtP5!3$TP=H`2opG9-|dQA3(Q$iD)RU!q9N+oYwq>F@fg?kYua7DVX zE~I~%P>n?(7Bt$bUmK@OtyJ22#XC+gC0yxJ*>yW3p(o?t_Q4hSwVlVmiak@EX!=k9 zPiKNKdq$;<104;m4VsTD!8P|b7FwQIVbVDT>U+umf)6Cbp+9)QaEYz^8zX~J=CNxZ zi+U<9vZ?|E=lj;AE2hAqd%W!p4}!iD?(&9tatD((c2_@3WI0{hvTA4R=V}v=U6bg# z?WU9P<%$rHcc)s{P7qG_?7tS1g2rA5@2iG{w?XIMc70pjN?Y~cAuuq9OPh}Op(J(B z&=oj}m`vN$kmSfy)gR)ukW85}`sX@yHeSP=%tg0q{d7k^Oj>fIx_RVHhYn zCq*LEQa?nOE0+*GzI6{Ul%z3I=xx66;-RMmdn~x~WhNe92fm-BT|X`rs`2QuR*Rg) zr)R_q6;2+83CcFaLEs`}&^{?n#@Oljnq&iKtgjM&nh!itk1F%!u`q* ztO$fGUHs_xIHMNN*6%I_kQ5u0zMNuSvAweejSYwi1Rof*!af|WI6U;{dY5)i?MxYv zAoKLxQVRnK>v>u=i!x(Ra}U>uj-QlmX^-)Re2iQyyq`s4hsjz#I?qK`H5* zzto0zYl4^J50_Cj250A~a0l+4>qSHeyp&qF%Xo*AS zw82=VN{ej;JD6kMR&$8LE@{g);gy_8)5RV77Ewj&Ww-ENB2O@L zQNh?55z-(ZDKdEq9n{DlLd}&deknW(lA^+vwu*uMe&{$5%H1Y^{!O>2WAzfHFh_@L z6OW86jf?^JpwE-1NYW10O%q+inZlL_FQ-_~gvJi7I?P5`V^eB$?p5(T+C9h;R4hJ} zvNIq90iLI+H7$aw2RSvdw~?oG?Es><7xQ`i?-39F>h!qqr1u*Pf0wpJ2E;VYQZdi( ziOo5R=Bau;JC~DPv(Z8=>l)U`s}%Th40RBm1>?Y?VO$&*tn zQWZIHL+M{st-`8ZuqAM-7ENQJi!h`AI&6ODYgQD^0ePl%^h~FOz$iO_?L7g&CP_!j zka6?{xL5{r3-9=ah1bx}8&=KM<7AK6d+`p{zk|=U)usJN7WjE6;+l~F(S98f)Dy1v zkyvI^_7&kayfKvUCqy0FZfID57D8UB5~3aKpo3&r$w8(eE+5cI5v)4}jiCND^;|We z%J-F;D~i!!FI}^B!0cYsYz=zJ+rQd70+ltOV zk9*C9gHRXObtO3&Wt4?N=%XFwn<+)^Pn^*D2v02<<3~G+rXLa2$;PeT=bf8OGjZ&e zGH#s=w@~XIC2?QQIe~ZS?U7fn=EyFwsT^}tkQ*$eYGh<&@+IG3KhM2%7x*Z{k^C;& zF+YIBsFY}&l9C*q2E9O*zM_jHw>&PY@D2qg_*NQ)n(oK1qdG3|AVIK*ouuPL6sc2$>@ry7XUD!QUDbYBF`H|DaisgWa@2o0g-Z zcBpcpH7Sma92KnN@Ul`vk?+eRn!lzycnbzsiY_gNlG3T;0t;hNINA_293Q=Sh!~?o zr24gUXXI1r^Jk6P`DQ>{v6}k*gnR1;Hf73Lc`9`}l>;acFR0{?&yRc-hrMX0!r8;z z!9S)Hd#snK2oUyp$}a*W&bSu0kloWZ?ByMW^KGr&2=LBo{I;FBkzjjVpxIL+_^#tt zTuz0yq7ZS;GYyib0s4vz9W>I)%sat&o>e!^1k+>&OFe_pht6`&P+b%{&U(`~7W^}N zGxiSsG#jCD@^H02(RNtFFj5k*mOM-Iw1j7C(HIVFruxmzG3MXo8_@IgoORV3^lpVo zKtw2k%v@V$6$bvg7<%!FfQ!V?OwYjLwkAtZ1Vk|Yr>14p$Dg<|Wzs{?tkIOQbB)kn zQwnp61$^o22Wy9@HA`kSdA*K88H4IV*D>>Cwp_b$t}~oYTN7doTKO+|6UGM|tMqNp zJ>!QArex0Wh0%bQhJ*m#8PKx7)au8>BSjN90HO;opca2LTK`K)MFFIt{~;3nEeEwl zq5kdH-|PR+Dm=S^L^NHH3h`099^u5t>G9>Td%~(hyZFt{B_v&HkW%<>^~cU%jE^|@ zQAi1%rGv1}^Z9F%)GIm4MvV4`X3j6>COzj^C1V@r&wu^Fuz~6h_)p|wIv!v$R2mJS zwxo(j>-z{>#m5vtgM^#QSrvY6qXxhdb8`|xX(Ym~pI;5&-{A4a9o$DXXH158z!86(@N~`x#0VA=A zxX6*oZl&r~>92zW@?#Y*mr*5tGjt26vumszbryjGc{1sTOnyGpM1Rp>R;$yQI>5+9jLXpemlOS@B_uvrhtrILEx8lHI8< z#=N^+kcuVD_xbn&3sS6G;ox8u!UFq**L|OM8QfgSsJI(6eK6 zIMIsp|7O<{G5o(h>TR&+tnXEnJLpA!&e^2V@jDx>BaYoh|=M z7hkkO?C5+qlWst-VvD{kx(@DCeZAF^uhTE37^44^Mw}P)G8Gh$g)KDEP)@R%;S?J3 zYlB)dUj4^rGSVi;QkYJcnpZYhnE_ie?^PZI^IUR8mM4Wl=nHzu(r2+R##`DsSYI7H z7`=+W4keH*sxq;f!h^#vgBR$8v2O+>zWms~(QmhJyUypDu%=@PR*$uJ^Aj9gI zLv^2PZ80hL_|;3f=79AM2s*xLbW3dX=?XQv6ed8ak$hQ%Xl|u))FH~#3U6M9b!d>l z0RwO%V;$Hv^7DzM*Ggx@45HUno;t<@9WFo4yh?>0AJZeqEomKb&4cK)^>*ebF(ZQ( zaEu%M^g*0^db1|#u_n4XcZkOh8uRQp+dADMO|6pI6G~tPG3lhT@D>?_3+kNYxu>J`6vtNVmj8-3>OCGidQ=zr2 zI;%f7u`TV6x8gnBRjV#bu7=x(jV&L82rcTa3lx;v4Q}#jE7pt5=v&K)~Wm zfh-2=81AefFD+i1xp!+>IQF#)=_2$gdnjf^g(2Yys~ZUw)`Yi(bkDPll#p z+%}CYv+(`f?K_z1(i6U|3^e+?STTs|hdM)f&32rurhXFe~zL-| zm(PB$!2nt1J$GYSMrAF$IDSYFFV}e<8`{8@*?(I}-XW!^zm2#%*s}B0|aVr^A zLi9`G1aU7;+>_4sJf6|DW5qL#71D7-k_D!8oSo=$1yz2r|I?49XwSQYrzTT8ttimN zC{ZyHrK>LP1mh>!648z4arL>n1yaqZ6`U(7hX}3W$yhx%1AuQ0hauJ=pV$v`YG$2$ zPTlDB;*s7D@HAOsgn5-%ALG^l%c`{-`wmx*>f3Jort!tDZU)8ADO`42p`NmAQrI>g zFwgVN6400egp)Yx?ZnU+YpMcxYdo(nT%R>~*ZKA$ZkFY{p`xpna$YP07q*T0nS4nS z=};dnN^1G`d191&F65p(LYhz2#Y-7+Q6E44=C)}zn0~2!UzOC;;fE%w=NYZHiwHBy zX7kg8p9|?Mmev9vEtELV-EX&FQciRgi9lRjTF9iGd&k;bSjzwu=;Kse*_G`k1^OvZevrXu*z8SCfeiy7sEG2dWCe1vY zo}Bvh>Dz0%t;V6@w<(a?52+~ho?b)lybBa5bw6!?Xl^(+F}Dh2N6n?PY&V6a+O1ii z$@2Q7m(;m6=z{l$#wX@%c|VjI+1<~kDkkpp2w3ob8GJfx`x0?>`{#=6Oz|3Z`Hv81 zdL!&Z#tqZwAd=ILK7iAy?w8eQ{6Ww(|(NPmzHM(M*Zp*d(P)DD|9hCtSN$SZk?(gmT13B$<_-7R=c z($-#Z2x#r}U&=Od)OwBbl@GgBc&>I;5! z=j8lI8yEb8tl*<4qrahYQkd{0S?N&087P`IO7k;um_*E{#=B2vy4qjJ6fh2r>2c%; z^-3z0gF-i~1GJ4Jcx76u3JUZCsH$$!j*Dkq?NaqoKd zu%on;vS6`xM$~H$2zljyHmtOw5Zms6@5)Tkfxpx)~Tep zH&Jns1u;IsScTTZY>HdHP(C>IA6;=RBv{vY?uVtjwKKHRs_jJe#P-3YM)*K-+vrF$sYfN6!@ zk)wcN@h3)%rFDu^feM91>LhmGtG@lCh`a(Z{j#4+{(e^E@rU)%P`S-;UHMoc?V}4S z=@40}*pLA9D#U!T=Y@QL{DE`IOKC0BW)iJzAWJB7ER%B{%w8;72@yOZadESX^Xd0U zi7l^Q(Ny}SmDAfaochvta9+@Jvq*U!I~=GxQgU0y5b6afBCoSpi#^Ppv+5m~IZ>e@ zSfOK^Y5n2^QnmcbB+&GPlk43_g6C$_+^t_`5Ugo{r8`Sy$7*>UfVplTJ1R}gYF;N6 zT?lAS4~AcCy^cWzF?af?3gXhFmIh@QDV2D>v1X5&37>CX1c!p z-2kmL1mn37rh`T{;$m-XX!1-cUwq4&FZbM={9-tis#BKa2K`VK(E#hjna@T^`$=|0 zsOeN{yX@exi=*(ddb`Pqf9WV2A261z9>YX^^0tWpeV+j0(B6z1(q;DhJwJ}aZoIUQ z*PoZJTP%P=x0hyBL8E}cww`rmBE)c5rUq8Qm6A~c5jo%siyw}AeWEF9R2WG(S-ng@ zBY3uW9ZcnQ0j2ATV~x{m%HiAPnJe3zD6rd=_mOW`*+b$biAaAAFy}n$(;6F7oS_BU z!3+t-=iAE;I@Z%=AJ(EJbL+m;eQKY0-Z*RO3TQfBzCc!f`z%c`qYI+LOklIK_K3h9 zVIWW>J*3{YM2T@b_PK*1w0pT5~`>>vuTGK?p9Iq6q(!+fQ?7%1Gf0R!aTs61Ga{uoVfUQt2 zC{@yXk~ySNL{lV4ohwun^Snm^e(HLm;#-+>#(f}6h^w7w&XMQl&y^4bU( zDESB*rM+Viu1R|}atQg%wLdqQx;~RYsn|QEWU+0ah;}z&6I9iOKD_t>B=#yBytT2z zQsyDnT@(PsuW%tHC3vJpquhEeL^ga;0ko4piOy;!7t_9;YoM2PO*OYrSLB4^a@VA| zp7G+lHtYQP+!c$4KD2wvsH8MOFxI#Fk%u{8PK!8ZW*9@+HOBhQZ4w&}HFLUT#zzog zn5udZ8GMOFW*vj?c#~&-=c00_ZFriF-M#W@=AIZd)Y4+zu!j!87iY6JV(qfuRi5A~ z2(N&IX?y3OScUH4cSO6Ja1-N$v(&w-k+qIw4qUxBlhYp9WA)&T&K^g{4n9ZyA0A_C z)a?QkY-V*L14H}Qcy{4`DcBA_1l8ztV=t^VBeiePZi5~v*hY#AV(_m_Y70Ms!0Dz_ zayLjG-*^pFW53DunuIB_ZlO1kY|3#*vpR;pXz3i-l`I}Ln+~r~cD|H(BvJ5HRr|-)-+!%a|MHnGMH08H zVF?+RnuA2CCNrM{XTVg9a|YVT%}}?K)83=?nVB#Fr>!)u!Q`XcKf`Gz zqq2d$o|TL5K?3po{75~q1-be-kbiP6zS+DSCAxp-P^beE8p09AS(;hw|0luxe5-Yc zL%JlXHh2{Ng7A_{J}9 z6}~5hoo`EF#LR{2bdvz)7e)z4)NRkzhsgG|t&Y(bcBb~{J~c-Vd`%irJ-o=Xe=|#j z7Jk}B!!btya?M1JbAhM z+p_ETqK%oK)5Z^j;1hQ0VGa7csRN0H7v@!({oC@JP>Pf|Hch>!N78Rh*0DnreZNY7 zj)aZZm{++VHI6pcJwFhD*H!w$DEw*t#v$P|}c+?Gb`ao}Rb2Xru0}BJnl?QX5Rj+>KBg3dcez=B&?BmICog zjXc^IO51&k8KVP%8tTa4k4hTmLN)a3YOxN^PW9~T>QyNY@+f3f=Kn|#*2mU(x+H+Z zQl1wj$*yR}#_NDqe|z4l@FNkR$i#G&0tu?+(L^Y2Grx#KlA1&6^<;LA-ku>NF%tWl zEl~CSD94+a8Tl&f&d;1ef6}$a`!Z}WJ|&z{FuA}DIZcqYnw=Y6LQROt*xmI_T4ADi z4wO5ci(q(0K3SU^2eSw8aB0zXAilvPfs32Ug_qiPBOoyXFj4sX_gMS{K8>nnQZkar z=p)$A=x31=hM$tVcmA?Q(lLIyJ&uVFXLZf%zxf)k(2m{5On?&gM&WKOGgO%X6XmR7 zBPldY+@yktMusDW9;vXE8nNRn=+_2d?NMwb2lNdjp#Xv%@(`G)5&cxkro#ZkNs?4Y zCi;amZAKZ%WLStDLQV83wuI)~`hoN)GmSnHb0ETHTbWdur(Hr^IDrEvl_&j+uEv{; z5cf%aW`hq(8|Fe9XS+%KNF&kdBI)gy7nfA*{A324d&-)mQ{P5YU#s$*zEQgbOGTB&x5I`IS49?mM%dPzdK8xP zR!=^4P8%;Fhmt2GpC4Hczt5bSR{&?A61kEgH5@SiW<*+zcAq2ncpSbrs$l@uV!tN|HPCk->txS~c++XX25_V6i& zZJAD4G9@6-Yxer@fCOV?D7u73)3`uXWO#-n`anfsrCgE!`;91+FP;>r)a=rnoAMm7 zL*}}m=nwbm&z+NAY^qn`)D)F_00M5}wR;DNeXa8Qp^v2VFtumsd4+L?j7w*&lP z0<>!|`WiEmniLkGHmcask!vcqGU>L3moehjpg&~|m|Ra6g@DA*#gOxV&=Ib0J0?K! zDHrnXrjQkEgAyLM^K(;4RGZ4`{5dH4%z{9T)E!N&C3Bj{9MhU6N3<*f6CM>RMdXLn zmOcnEiSnDqJT{~+WB$YJ~qzpadv4o7$NwG}}c&Vo#khTJ9R;B!A>U zAEO;$L6i!)j9)p^WId44sx>KkK@_)Ey` z8iA$JX)3Z}>G-N+FR`U?G(%#jC36FlfgGCjwHZb-<5*!QMmjHE)J~`KiOTB?1)&RZ zW`dv&$Tf*xA+j`hS?ZVTZNpb2kndm-`1R|v-N|Z=c&HU!{3VL}D3QmWd4qldABl!# z;Izpr?gq62@dxF_Gy(NOiMjz`Z_%_8L29Jb#i+*H`6q8)*CBUFS2x#X)wo8#paxBu zYoJWMO?yuWy*h)NB*MO)kRJsJ_@HIsNKXVh7^p&!_taQNwcmdRza~V0pV8m|aO*j8 z>Hy0BECvFj<;>_6YmVmof-@^V|APQ7&jjxH!GMLef=9oC_sjtunI8oms2ZsI3CI`d z$={29FsN7vPFZpT&K^&YH}ufvO+cSa0ID4HO`0x`DCVA8X&FxfkgVkC6M>BPw3b_w|Q>gZwd z=o1+w<5KpfP`2^4M0O{C}T#EdRF)D|o$KN0TPNlbk*>51Fs4rySU$ z*F8)Md-ynA4#jf8yw{2Y(oP1JhpIq#wR$sYiAFdN_8Ek|KjGGsh)=|=yl0JdpTt|$ zOL<2w+clN%1if!2%ewgX<72<;EZ<|_NMB6a)}Xq#uqI4e*K9Q`i-JKBQBe{gazW>3 z+}10TWF!hXNtgR5>heMuy!Ol~VO}g$=mDiR9B)*DZM5eN#(Mq-P zDePR75J!*Csx+4`+13d5;uc3Yu#Mbe%Dfti1p`~v;FpeQW+i&PkG1zPi<~56a`9f^ zt_h=Ca{${6{5f;?EX4#n>ZX+VtBBvQa2QT+PQ|f_BeQgD<)T3D^C-xY^Dn< zb!hAAcBG~b81${N0@&cNgv-TchpHvFuQ(;9g%->HVQ#{JT! zbRf~gdQa557f>q;(KK=P&PG+l#3rU$zmz4ipH$Yd1F%CD6HMeVQjnkof!`p|8IdRx({QFrD!R}vvCI%hK>d|6geA$;xB-w@*#=Jy(Dw@GYrcjH@ zcLAXyi!_&yux7vy%R7w+BHi?N{<+WWprJE)CTL%%KG>NP?Ji7le)}{8)-q;0-Jk5< zi$*>!H6HKTq9z*v1J{MdtMQUNyY_BXp#sB2e}5DT5XW9IYZ205p)obZs&6xi9%4z843glYdV#v?hR^$s#`}XgIZ*5Y%c}K2P|8W=R+X267^dYyd2_G-bLmAK#KO^?;a{Xl_ zX$Pbw8k}WE=w7ShVa9&>9PNClJ(!!D{gsE^TfxL0x)_g+rInR{= z$_XR#>p*YYN9L@~_BSGQ8?(AM?L8Or?DfAx&Rr~?D&u8&c zVEovxh;lIqq7*)-g>Iue2Kk3~d=)^#l(9a^GZ&aD)(|Ek@uho(w}0cWBra(xr`XU< z)Gro9U2=klgK94lDJE`gDRJNMs#I)ih=HCenjR-4ZNHgvV=_x3=-&}$APOjAe;K81 zx8$5V=_+qKrjSn-(ZNB#8s@_I=EN2huM5f=c4oAS#jTjka^jy-6cUi+*5M~Z|G!v! z3!pl-c5M)McefDSgS!NGcXxMpcXx*nJh(%E;0_xI9w4|waEHHh&Yk)0RNeYVYN~eC zZs^+Gy;iUFy#7A%@NjTBCX^&Cu79{=YR|C3DTz^p&ro6qrR7L^)x|$6@RauTvxqjW zSK{s{-H;oaeO5RYLtiGM!igrEh(O|JM-p3H7JXD%sVV+}4jMQ+nzKH5tv5TWH;~)2 zIrB)>BAcc4hRT`Dl=8WW6NHKw+Cx)<3z^G^;|{}%1N~-XKN(|XB|<5we`F_u7@LLW z4`ru}`Js-&_j+W4%0;vrKC0+9b8LBCWa#3$lzA_u-bC!|YwDBjQ^tekIRDH*Cqeu54=TOgtZtwxaG z#R02I64cnFw-AxRzJ1|6VJfS$SqC%UD{Ft6s#cjG!n$tt5+)}V{1nLBwX!}TltMQ0 zi!mQ;WC>6sUX&gxCLQ@2Y>W;Oztqn5_ya9fD&GU}mQx)pCjF6X;^L3>E=h*= z2Nv^DZ?Y739we1#HCh<=6v^SofHbzaJU34rU6${{GpWa4AYs`sw6C0s<}yyG$h%<1 zU0{KC-G-AsiJQVi4l@-Qq2FR-rxoS?j!rg%*6FHF zpCQ7>Kk?Wdx2hh6=|>Ev+}664=FOzj4aFHs2&+6&1+t+dYl}k>sUFe%JSp|#%$6Gr zQNTtFHKiYTyz>^a`gNvg<_hi9w<*4d^^Z9>W_C4+_+FN$)9rIh?D^|*^h08h1ae*{ zngWklu?R{Psm=31aFO|VrAkSPyH$r26h!prVkIdo3=uQwUt>?FCp1bl>@cC}Iw3== z-%e;~mN#kzp%BEkY5hg&GUP>#@e$JTP{rWm3)JR5^p~(wMvG8?zW?&|L$H@oR)p{z zH(hs1>@ju0QQAi|Pkb*(%7hhsnJ~KqBPNWSVZRTe2*EY3-u?w%qs3dw6%?*toN`nP zoIs4QZ{FeeVBZK!?oyiE(Lg^J+COjTKORPhp!@n5HX+V(lTOef zC$KAz6U)<;F;x^hwJ#Db%7>#+E>=R3JcmPz)vpmQcOtD>wK7_iGGo^8D4IM(++fo| zgpxa@u_EexpOiJSSD%Fud$8MLoZddcprJ)knHMNUlSKFZ$mN%HS|wwHXsLl*!f_Z9 zPVUHo?#qhL#|!+F`6Hy->4Ir9KOCNB9IGuKT^8(X8gYznKIlAN-Q)1Dn|6&7Y^7Q=IG~RMmfFkSwQ;{FMlO4{A0nlxeV&^OUpYMpdoqo6VzA{?<{6YI)+HtY! z$x_{BmnSozqW_~Cj}9IEtWvKo%kx3lokRIQf1Uc?L;Bx-cII^q5NE-}6L3QlApUo) z`LFiBf3DWF@+~+h&r%`4UAu@yB9k<#?mH}2MTgo=L>Cl-0I;^`K+|YlZwZ4jqzdY% z5qz(*)FQ#Wbs-+Pm9LRCuK14cgU$EvArKsyA$Js3hP+2VH-(wbnh7UHe*1&l7yzb( z4N1OEhs$1pfN#Kc?&ja^4cG?%et<^+FBkqVD+4$JK7c{;_v_!If2@;#6n?-q`PV$b zazgm8qo4PKmHHQSwQr~f&dhD?hV{GBXJ?=0@BOOu?_ou3p9~zVd(B>u*Y|NLrwYdw zyUl++ryD0WijEMtpv8ID^Sb@isc+a!`p|IvWC$1d2X^YLF!wH?Lgx+by^)%o zPw10;K!w3ATyHnK!E4cRtD+_6Z~B3ZfiJ81H7!_y6uR#TTX(4G6X*LGt0#;?UsvxM z&~xm!?N{asU1guYo+Mgx2~pEs>?qi4Ig{3T^%i+a`hGyIYV|k!<*wJVP3ETheY?V# ztNCT7nd?pk7&x;Ngp_ot%(MeV8M%!^^;9_m%qr-_a$#nm%M`r7Z7KHa5!l(vaS zt=&}JFVjc(bcq$7em>FM?l*_Zf2}%K=kfYiUt zUi#j3LGQKLFB2E3n^(ooGdvbqFTx!+1|&BLOcw{~s8WmH&9nH6*Zj29cz)1tQm;A5 z_3l(OJ9E{&n2yB+9#RM6;UE;S!iKYH4XoNQm+I#GCUg#b!hXBUXhWk2B7 z1FjM?XU`KoZFL&O%4eis5Z!!Mb^PSc_>#?KOL=``hQs!v-)P}saA0+;{K#Y=$fg9N zA8yt4?)w-aF@BLgx%K0fV!^`Zhyg>-9^+JwVbbH5={udyOYf~=)bjggedep-5P|%B zkPeO;O~q8NRonM|HX}Y9rl2x6w`*2Y-*i5~+4y%@k)Vr10^x^1I^9m}h4m&QUPys< zZe_l?rl4Sw724ig$k%<#tWdwhgr2^damFNu_Y4jPydT`!vWD!Z0>zt8)EO%)O+gU^ zzeeF51P3^hFB{95qRquCrWTGAW0JZ3l1|^p@#|o&&3Fww?t%ZQkEr zM-qsi=|@ZRd3Z~8?^(1#3jvPqOhhax^ROITLNXc?v&Dv19)7l`4!`1!WN9pQENJi$aa)(>XQSg^b((IoxHXSOqLYuSAD4vayX<(7rU;VWf?QX2R@Z}45OpU9 zsWg0Y9oBrW&wd`{VBi1N_WKF4*)T_qVd{;vM!ivmI5n5Nk*6duHrIfydKx_6pxCA_XT|2rOzBS3P-4R)km)v z+a+dkW}=Y*l`S&fpAzyULenf>-KiCmdI<>*H+G3MgQ+LAs_EvpUh|9M;F93SZWG89 zJ5vMq!TNjG+i_Bp6`izx6w?v!>J65>eKp(m@^%-@6#jm#m$?0m-ssGiu%m=~_p9h5 z!%Bx&ME(8?%Y*D&--oGZGp^ohZB(A2km|YvgG<*=1Hm5*a9jZ|uO2o-G1&J&Q04ie z7xgbbPb+NwUNz5KO{ArB5aJ`(x*Kg)T@(5w=VzDqGROXyZG13N(=b5JD`ART9*&9B?&tvf{|Oj40gcpibyovL2~d{UIVV-4RM>|XhvbPczcC7vlY z;WWONt=&b?;9QtSXvrEbp1q8=Kd0W&3Fa8|?^@2=<~hoYhIqg7{X@Z6{O7B~(sMcAZRJ(YnN@A5_bnnw9zeZQblKi| zasr{U%{#8nu+Ro+n?#Zx{N@Y;T@dfXdmi;?e*{|}dFU&o zyj6!oC`M$ISZ#x+BXss#><@tP`vcR5%shcxGjt?M;~kdfrR4iOl4DEN;KC=$9`Tdu zOF35x<;}DKm7Zp)CMjANp;a+t$rMYS*L3}}tP!ZqeY_Xrqx%=^0E<(cvl_=K;H@P{ zUr!n6g!#UnsM61U>%>*G#K7oPt6h#XKaSojm%rZr$#{W(-$Pwf+vm&yNr_H=CwqH` zSw8G$dr=<6$dUtQt@A-!h@+t2!|l!k#fUH2@2k70%T6d|Eu8)Opy799*;MlU`xB2| zAB}RiwE|1)Js{5h-CT$wnjJESvC7`DV69RyU6!kug--Oe$m43FRkfK3&o#(a6wWoz zoVik0p^ul>IG;t1S|Qy1RY|~k`}yo=r~3&>;LGI)$%MZWIHyTx1=@M&Gd<$6nRKdlIuP76QiQ6~;MxhdsHUF0D6?d+9Sb zC9zy)2W-XZ6OTO#z`*hgRWYb#wtwWhG!ho%ag|fOGdeOvCNsuO6xip3Z(J9fj7d;x z$kqrH_Z(4cHA3ul8ge-*h)lfq*Wc2%4lPQyI%|9vI%%4%i{snO$fye~UI{w|dKr+F zORaNb>ll*3+)Z%xP#N+Ig4SD#N~%k$yGlxWGgr_ypT@Hl8ftmI7_`8Ke|B?o^KiR$ zV>mq*<>|0B$XJ{?{)xVx@Zq$tI6y?a{SDHJa8*G%`Is>Vpsn%rclhNh+6C?s1CqrT zk!|iyNpV`>J9y&1_uct9I5-ISL46KEyhxaAco3`r>DzWi>G)tJ8MZujn24j?|bLC-v_(p_+o7g_DkYQh(=AWM!XRiCT@q!Z?zhNi#nnIPoO}p}kFATSr^0}?O zaRe4B`WNfo(>H3(%_O3o$WtpuMx%OTZd zp7l1ykY#;>X1W?4!Jc`nzjJF-RbaFIme#EaAo!@8M?PI6g_0A#ghd&j$&M7o5&IuyVZ0Od-LE%AG6HZ^0!I_?hq8c`^5@dSCy*SonST;KCEb z&~G02q0&GIG$Lvv&@0*ccFzuP`$XGS zyT|xm?!&m7hIi7b*s!IE6^;8~q9sVyt?~V;es{dfoX`-{$N!aE zU?<1YoZjH4gP(*-CyI#C&L>5{5r43UrGdGp9$2yY_Qr2`(RKp4;O>brI1cz}Ety*j zu}zu%6+C@U#3as+VUIEzrUk8dzatJ6G5Bcr?)X1`L8hUq;eej%gTBzP4^J>IFsFm@ z)j^HCkCyGfym#k%Pd0Dz98j*I{leh6G7%9SIF>tM{3>N7Lmd}%`>NLBe@wGS|N8X& z$IU_Wc?gjOXKH&9a5D z8dVG%eVEr7tG=V}nN+*&e%t2Yf$|%!VWzTZIPxyAh(Q*gI=y`W(eWO`^)Rj~I7v0*X#fJ!q`STyGCPl>pJ7XB$TZb*^7 zwu5*E{R6i1H_kr2myiG;zDIvoEDmFHU6<0I5}=Ud`Km1L4lk;Op67DxouTn-0abSy z@#Iu&JEeEl&L{r@xfq5^k>}%-271cSwmh{Qp8+mq6(j_#0_lfN4e3Ra)XdC*N}2Y- zcolIkuAa&s6XKBR^Gsa$4PEVNGzI%eWz5sPIs$Ov%{N(<4)}mqlGo`S+}&r@R8m{V z0O^h=Yk&(wjc|k89saNY^NF#JMrXcIBaU?OlzaBv;-Z?1e<`PN-+SurE}h3$aMr=g z*oJd2Li4sQ(0cW{G~h(2tgOPpyUSg;@j!Oqjw_8Cx5a<)qd?bNse!MT&%XRc>!RRe z$9aaOE^3}#Ax0i|S;%6G{XUPvy6^SLYP_WSiQ!Tk)3mpyK+EoeWZKS5wZp5E#WP^? z01tPLeYVJ@{;68SF~HVhKa+z?v91mH!Mq~Tl7pAW{-aF)?M{ySOts@{8~Q4e z72{5%;`8&PAa9H1Ou>4Wr_c>ZtVkKMe1AL5c}X${Ia2o`Kec?^Gq9rLD9UF7c6hz; z#34YY;aK~2s;*-3UCe!gG@FWE#v7Wt7e%@RY58K&;oZ)M9ON7Ln!I=$+}2&D=c&d8 z{<@`pi29VOnWY#o=QC6Lq}x@X;`j=JyN#4*miI)hfVA@#?>Jwmd_-O|&`c0Qo~r!y zM=?rtXWBE(w!nH_?;dr15Vyv?#$SW=Ezf2r_xQG^ly>oZRUuSp`Xpycn( z5-|7T{MAl(dcg2LSI8fcM9mG5#mNRGtbLUA*xKV%c`|-IGYq=_@NiEf9L$@k3Uv1Z zoCX&lTB{LXMGakfmP|OYk0vkFRl13xTps{ixx(@74X~MayW9}|V>l*NAOP1%nK#Faw6+#lNGYl2XBF}R%*z{D?)TBO##qY3v>8LyZ1D_P@fB2;SHxybN z0OQ<$=b zR8nspyuD1GyWy#n9v0&8CVn3~Iy<;|KDjyLlOwYrEn7PI8scQ!IjI0B#y#)XUyy!W zU7T#r7uL-mP<|^UN9=P%2;-cGPOGPje$M*_|Ja@3FxLcPLO_((@_Rn3E3|mpS-Sb~ zmQSNGj%bORb8RC)`_Uq(Iqx$)$F&P>ytds7SQ}V?UbE+AuIuFz!Ta+K?Qg-=~_)c7uuO zE>i|}FZ6zHMB{yiK}T9dv`}MVtx#()N$WourlrO>!PiDz{8?0uY_&)#UI|s|vD3A- z?0h~Yu32JkTLPVkV?3Xjg{y-gDlF1V8Y_tMxe)ASV(s>pKLSN^3c7D_;z2_#-*PuB z7+K?)etQ^DDdV!Y4yqsP3>hnkUY2p_YKU}W53Sl;k~ok%eT~$Q^5`?Nuh+8DOBAFR z#=7dyMst%dvzS~qIEz8u@Q_|15Zd8-4K(|qtbf^>aSxPj802ruQOiQl)`Q%#H0 zp%KT4*w3=;c7wZ{viB9Dh3TZv-zQQf6Qn?v-!a(GQ}3n9lM0VVB(tQ4<2IR8@HOaQ zdqYc!&H{TWD_usYn(oC&Dtt3pH0_l0bIoc@Px;EA88~V9I6n@BbDS6heLy~^Iw9>s zJ66<@%aj)a)LA6O#$u+o2yO%D^CbGNx}xJrkgMvINhgK0cvZifa=fz(kWPA~AFU13 z=x3dJV}{pf-q?+oOPPz@z$+?z1qvJ5&yT=b5WHG2NZJ%`>EShNI1XkM_Xpu6blmHo zzY5+T1uOWSqR1#*3naAjN$~&j6qq}qnZQCzQO6LGZIL^R(z#E!5rp?MBsi;GtQ#mg z@B4wz9v)`BB#}_rm>#R)>O>c_RU->NR{wqJ5=EaB>-(V!LhG=a$FLe)7%`NGL}oL^ zK}){2FJnk_@j%wP6<3*kijQ!i1bk`CR~ZjMzBIrEaxr5;pm{)!5>|2vuL}cDYo&Jb zBX|YDI#vTyhOWcbm3g2B^yC0t-zNhjkW?G@N9n7sYt&~Gnvl&Q0_x`Vt(M`${v#G_ zc6HtyACupSFa*p-0mDCb2ETfI7*&o=7dfn9`%B3f$TI*Bs#3$aQ-4{*@ORdIT_CzzEbzbbRwet^6g-2-5{{-`NqP_nDXN&Fj zuxyrlT^eal9*N=kj)eIOBo8^A=#fzgr_p!b8Bkq<2s@N(G&0Mv7kw5q%EUQK>Ul6C z++N7`1!k=(kQqTtvnZ@?!yjSNk4RQwVm}P6F?&aOJ619{x5HI&zm|9{;`(ID+k)$7 zVkER;cSw4bZMy6q34To^J~qB?m=_y7)pL?Zm)MJ#ukaQ-d>UVd3A0^@=O%-#<#_S& zA%k6%ndO~)v9^ZdOI-&+`MKS@!`hHKt-{H^tG@=oOUn^qR9{ll3GB?-{h&;5%&DDV z460|t#xsy{48#(4z*;qM;YNNvOoT74{5rkJN1st3`e3$HwlMxh%a}k?@1_(|zeC>2 z5qg`bj6G2cfjo<%cply0JfLa7LZI6!j-rHfD@(t1hy&J;s+TqA0ZMyVJL{NK|$vhi^IAGD6FJly|(&^mJQ z{CA1;-&q|Ing2htI{r2$4^^f79|p_upTYibXcs^Ios<6uw2S|l4TQh5@&Af;k(G;^ z{r@`jZrD65_0D@myoj+%*Xd6J>jL=z@1la@w7{p`dYL44C|50PbTn*teWkv*##;Iq z6Jh24m@jZLEa#oa=iR>d=iL{+7w^}Bh36(durMCzRIGWM2Y#K3`DzR0C%QAPba^qK znZyCc#jD*hOe#4v*;155YC?@~odM@5y7BS0?Cvy0LH&X}0w7e@RrCOq(1zXGpnx%6TLb>By2h$bpa=x09Lwk7;ql@xnAk&r3K^fp{FX0KvUhM`$%TZX zhlMb-bNO>&fkQ9P#@6;VKNH!0D7Jc9L;8PZHBqQBg@nj~)7wScQiq zp{|Y%lBC1{ny$tUJv}`wzW6a3d~dI*v1d4iG%DE&f|2BW5I5Svh=$tUMhHn5HZpo& z2gL}J1^EN7+UTO9gz-0uhcZ7;(|+>?|wJ9XN{(N+jg7Sc?v0 zqq8QC8zq}JH%x(%h8i7q>n3<6)>!FXY?~-1MMy=k;$_kH!2V~t+>}#<^ z3A%{0xriiX^4rj%T|dJ^!Jo(Sy5KA zge0`&G4^f-p0z9$KoZ9t5e!E(f`GogFkg)q;lxIWp@=>CMKv`wfwq=F*{U!Z$fgCz zL#IfVD-f_!2P`$| zAsXW1Wy9=YN^}@gkL-e-KvmcS;HqC6#4*QKvoY5f!5&bU|hBbOEX_Ax>D3T7=bPZ)z}0Dd^NdOW||G&qQ7@caC9~*h{OsFb@`jvC@nM%@RieuH;NJ7cE+Vy?l!zaHb z$5vvSMe``}!SVWuuqF?iq|hTE(9)G}(jClYnM6v5GmkWdiGruf;NpjD1;wcv$m~~6 zdO)o^3B!_5A?*QNwEQH6g8omx!HGj0;)F+jBglKS&5%aHuA5MWGqFaRvgW2`WE#qm zrT*C~Wr*%0GeO69aRg~d8_P@udr^?Yew<$JLUP06S2w=vbf?gR_9t`uOeAmNaa65s z)QH>>BaJ`Y3*!D-xIj!x2{a(poC%dWz*;|P3E#W z@2eZt?=W3_hjSXKG=AwaqP1kv$PSU6IpfLR+qh25u%fWBoQgQSU2zGfQF0EO6~YJS zs5=Y`XwsOQ{^0zt2LqXH$)ualCEZ zRFyNe^~cL3m6`~#OI=g}I}?7Rc=_v2bu6f24*QvQhvtPqFM;**mT*-{mjv`|*!JGnz|QbtLTzOl^bUnrSEE{~JI zcG~-lpadfqJf_=hH5*RlDh$$Z5e3C>i+zLR{Rb2xi@K7Gk_zOgY;A2Zqd(utyP`#6 zNk!`Yix_GUWhM=Hr+3AZ)!oJw=NGtxdOXR*qaJEe3*^fWyIERg0R-3AkA zV4--YL)z#4O;O*YNS30(x_b0me*KN9VpOyQ;IRLb+d~-l*FRqTEZ#}E0Z@vRAy^fB zNnNfllgSYdG6@1gGulas&{3|gwY-P*NBw_yS@(BS1~`;i?Ze|*8RH#pqrpscuQ(R7 zfl~rM4Nc8Z=#M8j1-gf`&_kF=5@8|0 zkub~Wd6KyQ5IVMRMR09+K??JEU+w?HL(3r(fAa98R-%Sk!w0fSSfrJNTE0q_;l< zsG-Wwr%f|Kb&frc`#=En{c?mf@ac&9?~DQC5Y3*-<$^TS(tm)GYqU2}pbBxIEFLI> zJ2^imQH4Pf$>ea=9s&3m3F0LtC;PS+YjgwOpEpSbd~Sebmxrqf=HBOXKCrXM01+Y; zGGdovr1pH^k%FfOgE+F~K&wWkz_M{TtiO+*%;&@9vuESH@2tk>J$;d0qy(q3X(4zs zELHKI5x76y>?Qp^Vmgu#%=3I)UH7B#Wq|bUkAE*23T+Zf$3F|T#dZlGb+7_oz4YP_ zjR#hTRxzYd;OrOiN;MlmfQW$dOIBA`Ppwd(^vSUhI`qybvp@ZPVFQtiK*J&J%g7hno$94EO9Eyl1`6h-L z3!af;s3P8YaMuGcg`t~KBA!n-M|Hh#1T>H*FztQRe>WQIVG(5-tmjQ1EGf|D1cc&M z6)GV258^WI0jvS#^0}PD$V4G1Vq~&;16zPlwBsb4yFXpI1`=;VM&M|Og#umxeW_d_ zAEM;WT>{U6Oe)xIG@MNdV_b}}00YD5>emKaP#Hynva)vxF=W) z6x?{gSd96*5LyKa0{kTu7KI28ZXMUqFBqS%=(HMmMW0-g_|SMO_#8L*1q)GY`W~jw zJS-#KOQ7?`ov7kI9oE}A2?z)Pa!_+I!IMJ_7YT-yLXHa4sNamu*2c!6`&I*q*9q77 ztHmQQ7y!^?--+iHcp65_p7r-9#NJ#^?iqKf_u0X!>+trbCQNh>I! z&*(>c3&Bw%v;dC@Xn|@w*$GaS-M|;V90{{wH2W#p>I)|iPEn{cQRW1+8~~*e$b^j` z|En?TLjOB_yvCVNtKGg_NJK>?=j}Tv^|nSkWaz+hOPdt+yy(6Ui4R>YlDG24DmF!@ z&aHBt`tqrday-1dw5h3y@aPK4A8w>JIiz;cQI*YUh#MkWuHV%x!)g0K1(PEde{T<) z5+nJuDIG&_;exO|!|r9|j#${Scd>47fItvr>nRX)gJ}E_2Cix};c>PKt&jX>X>Pt} z-?k1DWgZ>+UoWT2VZDH~dm+?~ z(3+=Osq+>w?Q#+pCCqNammUak+p?0lWFd9lq!8Pc6i4VQm`JnxbTPX;;vT_tW&Xz5 zaG78Pn+7t;8i!G`o`713rHu`gL3MR?k;03WrUNYrJZJ4suq{RB@mw2O?#xpbt~k7> zR5R!i3b5_kGf+_<4kOSycT2~Q+$@T_qPF1+#TDq7i&;AC5DF&eVK9^nrz+55!|h~v zRFB=(hL8}l`!FYfmi3alLq9OH`*R3V>9Z<^bfWO8Xg_jeBu*5k&@SkBQW{}`WTfSo zVnz0%+`;dEh9#3a~qV}bL_T7brIsxS7 zr$eA?vqwOcab!Xe?oS#H6_QX|7Vi+0{J0q-rOVRrQilAs^2|ThY6z)}Ezl60@lhgF zb9fXbxGx}ZkaD|Bx+sH@Q}u#J4V0mRYKI?ZOOQ@S}rtU>j@zu$=zmP{tv^1j$ndDtwAOEe4eeXttJK^-EOPvdJu}tod@iQ z&?2*WDxh}+t;l`Hz-;+_RmUrY%i9Xz;W~@Mr;ij!Wp^$gX7U`vu2M&i>tW% zb2*NV4qUU8jjq}XDr4D(+je#fvEz&?T}_zU1$iS&c4}DpQKC%ujBx7YC~gj%NHHceWg093 zc{7);TNRRUQL0pEUd7&{x1ScPJc zw`h%!GNG%rarES_%v8@rB#Iy8DZH~B2wSumtv#336bA2`Wubp-M+bfsmX05Hj%mj~G|2TS8>Ee=}^?HGUM(Avnlb-y@1kDUz)}YOT$2Qw&uADzrT~ z@h)#iHvz?MU$1*l4y1qc5%Nzdy7oH;Z>4B>QJ0@-rhgQ+FAnyv{_?_rr%+Tu?xfki zrtpuV=X@96o1AwfjBp@v=tTKKr+%eF=+mW#kfPMOJ33xG2A$ei%Lw7GuCC1UnfQ7; zdP>@=s@guo)m|Bjm8*~+GOaJ0OL~9^F`_B?^da{x-}bqB!M}mkzFH!xYy>>p*M}-e z)Gb-siXg6l6F28^xN1VVB_T?p;zi1q&Rx4?R$aqcm3oH{E!>&e4B{PH)yv@D5Xkz& zhB)Nmb-C6OBjs(Ykf8~0A1_q50iX&f1(}8c-b=Ome;)f0nT5y4)9Ke8JUv1L?bs$6 zoI(3M<*mbHZb8`XAfxrhL4Z*@8k4$zCb;36>`(?t%=3 z&&<^H!`-nBAf9lL=Xi)v(t`D9P+N+anu7!g`5rFt7!TcWgHVPY>casA{AKIz?vBA3 z2?jD?$XmiAA9<00w^HR`5fT1#Ye|o-PSuL#q7-BC;$lYBKv5I4DS2*|c0pmHKO+<4Wv2UeqZB5g~>MMTaT{;wM1R)JkV%2ETr9OfBj#VG6<`;fY$$a%O z)b|zBqNc>z%bcyEgz===1=$c6FHWB?W;IDrRN)|0wG0QowWEw z@(9L@Z7*`{O9TDO7M-9~lNREjR_zmt>XaB6~MEQo&XMGZOlY z?69-5^LJn&o4Jg#a58DbMU$wvwy# z5WlIISibt_5;go1cXW>OFW=&9;Usc%Qaot8nxn{55dMgl>UA^~lao=Tt1D@7u)(){ zFCv;jlLf26pji63ygrMD=)0~EpQNx`MS*~-QwJoC5nTO87+*QuM}gs zK!c?c-_lcZP!+CFtb~PwlaZG8!6Y0 zw6j$34Wj#lw=SVADEJ;ugU|``+{MKuh?_S*fPA|Q+{gjj_-gmpOaJzE$S-MCcp`uQ zHT=Wllhh0w1mVn6s|I*!FF*PAYF`~!sljh#YPu)KJ3injBen1&kPEvpF?6P;{(73x z%;saE(LSo?&;@kxoRH@H1ko~d6U_ae^4y8ZiHpXaf41Gau^WMg_;H>Ixlc_CA`(f^MjNPrBB8Gewq!KthC+;tyBF>|UY2{#VZDn_Odfxq| zIP`M#<3$onGdUU@;A)vKR}{LCP#`S|j$L{9P4~%S5{xi%WM>4({mz(TbnpyhTcmp1R#_F;R7Dy749w&Lj!UyQ&k;_=mg{ybjXN zc7>;jepI+)`&vt+b?S>Dv6qMXS6JGjr_HchQO;xSy#3l?Izh+z44Jc zV;3DtC4JfkBX$1VoULp}HCCoF1Zao-EsmqSR_E}?T(T5py?i$=4jyxT=&}&X24Wl) z8OqVhC{Kt97;!zn2Y|Kl+J{90Yin!Faztr|M>2)7H-kC6GkIas?vyW_j@&CrNFApZ zxl@=Zu-(OGlAexLJX`hJavq+|4JB>e8z+sSsYagOgnVVUWjYiFZSc_IQI9}`VhI>RH<_84BStI` z!C>h!;o?Zmu5=WKXl|zXoe2gaVog*S_~wTy2bg#qcsUD8OKmMJ!51io~bO zrj!KnW+p8SALj>7N>ippLk8^>D$e3j?=gCeNBJA@N2p%ml|p;}BnX|as{Imuy0u!r zWC5~f=M9}Atcr)Rx9D1^nm@k9(F7xkZE_jGaN9c_v%5|U1{dKPMIdm{5 z?bf41U-vcU)Ibp#SJBLgn}IH#`g%DY2_hK`CRc{i32Osvcg{*rFmcB0(!AggUg$Kt zxsfmkncR&cdDKR;_Ph4|AI_cay^YS!!3ts6`etMdN=`1W5t9a>TAL^P4}1%-G{}i5 z>bcu-KnQD`Iw0vZpUNP)-Nwf>n*6?z$& zXe>HtP4JFsnvnD3V1*LpHjgY$0h?cc>PtUh;~O6aC48os^)NQRv;Dozlias==D~*& z2~5COg4}r}bv?B(YD9Yv%*YVaB`bFol!Qr6{97an^@=9lJ?lfVOj+{z>fPV=1XDPU zEWt%xGDVnhP&O^AdyTa{D=*d5@e>-}DPx0DqMAxdMx42X5mNE-@xT2-n0XP}f`?vU zqV;U=!a@=VIMY8WwGTLVNeGvxjIvv#50hMLS9_-;G)+|27;DmzFWIKC;;XTRPvcti zqwg9RFoIa|kV;jo+tyb3h<_Vzxc1i6ynczxAJ}U5J2Yd%7uM9!fH^hA?PFF2!Nq|G zx5vaFB#wM)#GS{mEVGi9oa6E{H_cw_#elrpdF_B~#MH!a1I%mOEB2)6*&n$-SP$W# zApCR~GK@yOM|iIV?sa)pkEl`JN?}AZ+tnUl1L~U^jgw}r!n&DQ4cL!C&U-lb@s2(Y z>ygm+jL)ZB-$VO{pbo3;dOIBa5PdKr)Yu7-?^N1GW(C$cd<%rMaYmZ>Hudwg1)#oG)%r8(}+Qk?we$GcCP<-Dtv~3m(@_i*59a2^`$}~9-GG@BlJ0L*1VZwxPy;V9K z$&-Fr5!6i|2?-8C2zk_Pt4V(x1+_HOK$GhJB{q%@nWns~bNvQ4+uC_v%aPDk@ zPAt))rq@V8?fMdRWTT8CZ6cz^PNlr51Gq5}Vg{MWX7^A(62e{#fD(2$Us3QVuU`&b zQ(Guu9~!ilPn?#E^X4(*K9>ZPe@l_Z9+k@;s^83>c5U}79(58v;FOL&YO7dlUN9pH zuJMF^HK7B4?cpM1I9N7vgOy2nA#lGw8ZCvN+;}=jjVB-l5DHtCnW)gd= z)PEEbgU*sP8?}inE;`KG&m-5NutO zoeC~H&dSff*jlUPaF`elaE=3MyIu*0Lge>|C&q-s`Kl0 zEtwJ|OJ=viP`Ft&X5mD$b7o95Y|jjIVR%bqwZ*6CX((8h7YM5Lb;UmHRLT)VD_ghl zaj2heBTzKy*eI!GWF#LknD8Xf&G7_jK_^apQ5~0-tL)orsv6sSd@P0XY3a9Viqif} zkuFj8smiR($jqy#1jNDFra$&EBUN2OmLt_bhT@u1rld1Q!UCTt!2Bb;;+G^^vk0X# zS3JDWGSK-Nw5qnY%j{*NHmuH4;i|E875w0d0}Ry8?kK%8#Rn;W(q(k5Zi**(Fe9LN zeey`8(rGf`ENVVf+f)W?4}q;WCfb%UkJc$Arz-xTkoVp*d7AXB*0qph+)pJSHOqa0 z{z>`X>Dl2hqh>?zc;`_impo%z`Tep^lidvn_0Aj+#!H;0fInp5cFgEgxHVMhYHAy3 z34dXA{wV%AcpRmcO4u^C{Z^DBz0?zyLL@Onl7Znvlee6xG^?V88hnL#8eJ^);gV*0 zhN>BFNs@xGw0uvIE5|-!**>Ncbrr4MPRVWQdH?1Oi zX7W#2X)Z)fGG{I;VQ!+(ibp6=TWw0wNbwqCLzv+{UGtR1rRBCD5WH8+ARfY_yb4Y@ zQ?vI6A9C=KWbcxOs7*>TbQ*OVY_*S<@^4apzeGlkz9Y_XXpEMW&YAzZ3%5SZAjxpM zQ84G#TFOhBG0^^OnX2jt56-KT)$}_xXWBaaRN}3lOB+Y5z$V;l3Rj&qP;h2M*V|ld zWY5K%EgR@>a#$Y=4S*xVvFdg7UYtz2&WGx+JC%AZ5}zl84_MVOY31VA2~oU$LfFs- zf6Sm)w+Zh%RnlaO(hKLqx;+Ws<4%~ikr&f6ZMLeGHfIl(5@uo?C{q1HH=0gh$WG8K z1;58Fk*-#pR(*qGNXE$k+H&@55Ou8g5^HGROdv*p*kXan*Qhf^bLI~p`?|XW@0PES zTTm-<0U)pT;cv+uEskj=JU#Q=JWU-H9Rr=oWSs$16FIJ*psB#@nwqg8^>p#p*v?NN z#&<1VPkCjY-bp7$@ssfn+*;Rn>TLzc>vNDHPG>*ah(C4`jbPxwS*mZkn2S+kA*9QE z6!yF0DdmJ)y`tG$!MEl6bMtY*&rFW zMUNQCBArW7TB##w=|vBa-X4Zwb3-J5RO&-xG1|?*!A@swu66R$6S?oc!M*>Dbxofc zptBCrV@hnm4P?sq=i8{Su(_3<$|r^2UJtjkXVsK+_(l7^r_meW z_4$)_FAlF{d4!#V@a;MDdTi4c;d4&wd9wbzX-`K*UgsL8DUb zx30m96(E!mL(A>lj^VR4UPHqEw-z^_A{?#jx@AH*Q~->au-JR{ZrGu z(XdByf|xti)tY1I`|D*~<2qq#->|M_qkGtS-Otcb6Hdlt-uSOE@&Qtx1}miHBtirr zP&|11Layv;YSx$cqnnG@&~N$WPIY*xkmYS3edklI+!|+AftKTHPv6btE7jkCi~kn+ zbthpyqQ$dr4h39iH7sw39?H47hs>AQ%qfe3H>DOG;x2%RtturYrN3VkAzYLcVb+SB zA~`EFQ<5T?pG46PNZ0%ug4E!g;v@(jgPIN%iffjl!E-)NOHcQlB-f|K zgtctY1dI^Ga`W!=>8#3%1iQ zph`@L%WBe^l|>wi^|c?O5|W z?&lhPb85|C?(x%2Voj_Xr6PA^2~h~CEGdCvBXe&2k}XdG+M-XXe*{X8N)gy$4$xKG z`N4e#R7sXK>aEONMZ3cSYU#f!)wkVEA}oeX=g#rl`V1hNzWN}UPJW^O0u2ujm}0sA z?SaU4KTHLLh2A3&1fFV-`_simRUq0LYY@(v@Hnxry{7g`GGkTu@H|xk|Mcb2Qs$Bd zYasC?$P&I<=}&f}8s-sJLyC%u0%sX;sef+juw|%VCHEnV;NW^;Jh z=}98^Xk@TW>#JOHLQJ)U+#*H%}9gmwfjd2C;u z9c`+3O}#u4z*fblqoj}jI{Eu3Z%7lxEiW%aRy$=@OioUgmQoD^%_&_0-1BcwseXj# zvjW-{7L;yQI)R{FR-idnoIxw$pX^Tq$QF|%@?>!m)soviQzVFx0P|K|hENH)E{LY@sGgg? zfZ}zcR(OQZ;M~Ba-ws7AGp+_2VB7Wn0N{x}|06O#1I_B^3qZ>Me1FtG^yBz{h4ybr z@;8O)w%>3<-Sem6>lZgp-9Eme)brPIBgPOP4`zCX6%9A!LE&vHsi^@+^K9B2O8gk$ zfN4nfMG8Dna2s-W+dg0fL<{^bvx(@u38*@1**vteZznDW*OIkBe8?diA!5Hewp*_- z+2iqlJQ@8Z?8)$FhWh3246^ufSH%B60`>nQLF@%F=yfAg9jt59{I;CMvspKMvdieO zME_CC+!j(C9*|vL1-^f2G?k#yVM^t>f+;6N;*qoS2&ZLN7gi6FtM;I!rH#dh4)$B@ zY4{?%Y!`~wx>(2%dFaAtoi>xi=2%TsqYgXV{m_0lD;;lSj7&1Rb4_ zJ@8*VKLEx?e=Cd01R7lDPBB=6%MV`P0xzG&10-&IunxHDNPz3SX?bPxn1KR4VlsPY z?LFvZ1~|Luua09yiB)$^C;Vfi;SU1A_i~(8M1(@My74&NGMT+tYGw}{NNqWOtM-fgHuee#Qog|3A|8!9 zA_QOr77UgGE9~z90FvQ>&IRO^?q&baanriohVgf*NxjN?AS=40h(8&hH8~=hv`Hbp+7vEK9E%yxXMaOzAB;$6XwdR$0I%D z^u$sl#jN|LUnJ?_RHdhPW{VUk{$viId*2R3sGasdgUoAGDv~u=H#jyx`XBB<+isc2=Jy5YHmes_l4<`a5V7vfo~%I}A_FrWAmu!?&&HOqA-NlN+&6VGO`g{V zQd1y80(Lc#1KaALx4>M_UZsI$ci9LNnoNCf}o4+7;S z=rxv13tSd?*>)9zge!)-FZ3dCyjZCNGX#BZO`T| zSw{|-S|(Gi&%V(&@SVq+?f+tNzK>)-)(8DZ!6$C^2e=$HEgW~Bx_kB*OzyOguXxQ3 zIPA9lIUwZ>2q>^vgLwIO_xC-`2-?R$Zu|iFC4iy%Z3oqY=>!bLCXf;`p|Tf{M3n}C9++d;9qy0Ek@WYm_Rsc@Ci>tZxWmcS-!lLEIILyJ=wBkhET zkA_Q2J-x&V_n9h+O0i}OR?WVi5j{{L`%4_uTA&>SNvYX*%3VGA)203pN<9bg8TRQ} z-iDEHY!nNYOO_3oPKqU{+|Ez}czj-%kxS&+UhxO;G^=$}d}sF_Jy!$GAZjT8JHUXP zcrgtRj#s}vm(}PbXNwClT|j_-Vr?Z0UZIlD#3Qq7XDP>VkS|oqxVj7lQH8B&D@d6t z)T6Tfn@YS}TSr?+K^@a$ z8?yB-17u=?As{gDHVx*?GURf}s)C;1GGooCPMu~tRKHi>xYc+h{{8h4L`K6X^e05W zfl-s*=gShNtNx^4+vAomztv$5`n*oPIg(2lF0d$%dm6r8C|}bP97b-iUh8(Teh3(#(`C z>d{Ap1hr;sYiMx3+U)R~y7K+>9A7qA|7t7F954(pEvEpCd6^RmWMdrw+Q~(qx3RGB zccG%D&IL%Cg@C(+ipO<*x&A8q3`M5c1{U z6-22LHp;8PPWzIXr)AD0Ss~z1q2o02Ts0F-^>l>iH6+W6zt0v2IpB)!%Qimhju>%0 z#pr{&POvTkxzk}n^tdz_K6=S}snvzwp#2ft@x{g|wG8|Vj7X#17QC)uGIzD1#vOwo zwEdAwTWQcc{H^tBq@gRt`QVaz#bj2A@DG z+9*|m@~a;Svn$8WmL*_$(Vl$OG4jR~WS`7oP6rgX z2^b8zc8Mxv!BDs}RXY2wmW}3XQ)w31$s7>R(J$Wvey&90aWhZp8hu5rN^Uiizt~pt}>o**$y6$d8blL-0Fq*d3R&-iTr;%xYU%Zx=`4wch z8$KA!JogUOl(F2UvznumCoevZQ-JVW2jD~B?|Fe(c&8YRkSAXby&pFqnroPPvx)*; z*6D`cEEaXNBG=f|^=VV;;vidVpmaEJ#in%vkgxxa24C{7MQSako$k8WV^+WRFkAu& zoXu{t-4!SUvG6#w)QR>3)S&P!TnbUmd#u@5=U08bn@*x^20OuQ)yIkji_(Rb_JQ5% zpSH8Qyp@vuEgqXa)0L(P6qq$vCcNi9dir0`AIm^(;d5W6*Ks|F)4k;R&xYJRZTE1# z0v<@nT>(8GjGmLptrlQp;g_t19hlM*oC1Pp^u-AlpkHmRA;mQ7JiO%Wn7UdQns>3a z7`B5mdET|{4-2i%!*L?-0k!OIq1I%~7C=4$Y+v{vVDen^LDsG~$%o#oyXi)Att)zBsJ5DXdww za&^Wha5PZ7LN}WA6=X~vU`pWr^&OaWXp^Ji?qGIF!C(^wPsHL;KDUJF4-Mb|-ADq% zL&S&}sBAgJ*0&jq#0nEJ9Em3dhD;Eh=$DyFlr>lAQ-369MHz^&fKHbnIT3%|Xm`KW zro&*XE1NJ4%oHh6*7dw-06uUCRCEScD3V=_B+L-=NnbO$AYdR{cS39d_I`PQ7&8!9 zR(RkOeem9K!n)+HQM{9wJU?9nNQ-4hGK@C2o>DMr@cAO>Tmkrh*Ynhz=xFQ5Hp_bOn`4`~)`2=C~dtXO8Gt zY&RNJqNJ=020XB$qGDU?BLM|aBw?tHo6=}4zqa6#vx2pgQDTWFq*bX8f~c zHOLjc__9Ta0AlJdR?H9~n4qiVGFV44wk0Qij^jyL7--1sX|)CQ2x!_M<6*86P?!m_ zf1B=sgtxacH~-D;`j5r#^#(r{FedTA>8x=aph}7sdQ>*vijD3+%+_2*cI?50W9X9( zW!%Ue7?nxP(jw_9F5Pd1(2vvRF~sFm{VOw}e{&0NnpVB~i=b=Rw1$ZjkAf+D(7UY( z8kXF5#A`H~njQ??z3Bs3Kf0rvoHN@n?%=20jIf-M0kj4GMkJ;*JUBweg4jGK_M$;9 zC!m`FoDp!Pfo~?j@QnjKeP*lQl0ls(vl%srZqbBg&8oGn@39#x)9$nkwiNJqh7W1A zL;(_32;jnT=E7!ncCMvm%t^M@MQvr&3ma=|2?1AG<7Tc1`-QD-N|}H&V#i!{FP3u= z96C+mWaV1=^QA0?)Y2sCssC!`M1w!|H?Cha+RgUBIvz1b{@@tqy`nLIY>k^Q77$m; zgi5hHNdp`gD`T}wpaxG@l{)4WX?;3=DVE5vG>T0i>o(ABYMYhpM4*OKfvZ{HJi!?n z$VB}b*s<`kfnzj+i;*CU`$f{iySX`o%pgVa&AB|6)wE&W`%5l;^z&aD(D7BQ1k*qro*osX~(6tjbsMMVH1u*-sJPp$`R@!q+?c# zNWNyPDrn0#iJr|)qd8Xah5phG$a@eTVrFS5DlA}{ zRDX*=qK>+66dMc-(K)(S~Y>FkoxD~^%f23%T19X}EQD(J4l@qzr^IEz5Wy{f` zd{)-3YQ;Uf%O4A^3-vdK$ibxB)x*}J`IIG9`D)5(Ow+8M^KVQcG;lh0a%SEFlY}X% z%8BSHkn@{`lghJY1t}OPBjr+nS#Dx5PJ$R=p0<9mmAU=M${m$(ZN&tsnQG#;yH}iF z-+mdd5f<04r}vL>|Vx=%(NW6m9(HepSA5=J*|jUn^OMJKHu1? z5oZ~!f^u-_(bk|p?ITBWm8@qTcE13h9m@W5X%KnfQXg4k=2_Jh}+ z20A+#8Msf}9Juf-0nNauhz^Mpkev$(OnL&qfSgfAFY9*%?9xD!3E<>+u7;H9we zD^UN;wh2$eQ9CgN$?S_Rx-g;F@_eP(r9- zWqIEw7YVGfZ`G~qX|Pb<;*cLEskE9}yPZP~yE(k>H94(;5*_`yKTBa#mqZ~$OJ2dK zYV#Crg5md1cp8|%vCSrE+%bLLs|ee{fwiX}*?h^H}M7eodae+If(>pg_mjm1vpe!fd?G)+a>gkCv#6 zY3sge*_2HV{^ZtC;o;csz z-|dgbMVT_n4uLL?D);S*M?DSm!R!^4!3eUw=NX(V&g%nq;3PtO+{XX0(|zkoYTSZC zj$xl>=VkJF&7Ysp^?tM8b5EJ4zVh%^qC{V5aUeTfl2fS5<8Hn5fmo$x%Hb zNi%W>muL1~X+*B~LxI|X%wB7$-R*S#)&|*MfYEcP1`z&FUhTTxPmgnlxSP?IgGVSu z8*yB4-*&3_O%`uIbfU=6vs&K<>^^VpKCk--I^VCid^uhYh2gAurski{#eJX8wmxp3 z>ZtJ=Nx8e84(WYguRejp)yJM|5&WgQ;l}Ba?EBP-%@QlrZPBjVOWWqt<<;l=)>c=; z;&8=phOc%O%~wxySF{MD5oA9`C#q~aZPz4PQC_(KZA@dzabN$yM}4b6tX>y|d8Ky3=;(=WEyJ?G`Yk zr1$CNq?0aoe%$JK+b7rg_Auj$U$w+|a=Hv+hsS+A^3k;UdXAuXsfD&ZdWz2Xd74iD zZu{8d+W6Q?8)qU%;B}PwPT>1=Jr_ZVrlv`Lm@J{mmch|-_2ObPSdbxvMxOO{UZ!R% zEvZt17aD!p(o{g<>d<&sAWXg^uimNG`E;_B-RUs*Cs9S2t>F_qBZJ3wZ1jll_2%jJ z3?rzVHRul%n8k4?&->08`;=w7%_}!~^ra>u^XKk02t*T|L(ox&)8D!P_}a>HO`aXsXe!^EQo4+CX>0r;!Wox5s{;}Qu__(a=$36m_lb;x09v8=BWyO{E$3`gq#&H={ zme=5-3>8HZJAKzh&4zdv=flk`MfMNbwv^8!-%sD^&yR!QJn6Ob)y5;a4>#*6$8=k7 zug{aJnD%Azaf~bkF4AEAwdT*YDt`C(9#(`)KChRuz{hk+o>vNCa;^7X|3Ge4U@qUg z>xwT>YQE9pO1w+U6;0T6x8s7k+MBKkam(cv2N*4yL|Mas{(G10>seOiy_e39yWwpU zTb5Px(M|4YcV%Dcv9tf!yT^*OM*B(9isEb)9eV!RHFo@JEziZE*ekM^`TjG zCYOgR??Ge@2m=0W1a*E`aFy4`9!^(z(%-MGbNVN?sVaInEKE?SDpPrSpBGo3_t_Tj z@4%0uDZR|HIQSr0B<-532ybr#8c@i6HvP?sc(B0RknD}dws=iXYX;e;rlj( zGG*Ip)wk#h3?c@wjPEN7j^Nte6K)wxacSn?=4rR@jdLjlJ&m6_75b$=X;+R zdAzz@`0@2P>ur0e>;2?7H_(p1sbpnXxyW|w^_iU<9uF{N+e^^%aXmiaV~rt#r1Lho z;xj*;qyM}M-K(N?M5$I%YUf*kp_MKyu;l>J5u{_DzU{vL{CHEl#lcu_dL8bxVV(e|C}o#j zYkeHHIy)L_#pn6p|Gb{KmV}>xIuHT}*(>fG*ST-_lD{t$Sfj zkAV*t9*3Lga1GxbH;keE_nIF%T{k@mm^OVME4Y>Z%)W)8%G^bhZ%SZzJ1%wHcH}Ek zXl^*3B|FW2yxZ}%)d}{ywcG0H5%a~B z=WSHcrFO?j!IBtaYZ#|e;i1uJdRmqw1- zn!y(uc2}zW{2_J}a#K$v-2AWv$GNS9s$&=^6mm0PMW0QLB@qXQ*SXu8P0Xj;+ez3* z@N+eJ-a2xbQPuJEv_PGQJ}wu1rFZJ7iLbTmdiKnqO9??CYy(1|o~*P!9yXpY031W0@Pef>IerqIs*vO( z1x8OC7@h!b9K;}*+6ALy;*U(kgzwB?^pa!=C+*W3xbRe&(UEw_v-}Dtq$SPGm}Nfj zPKfp3An-B&3}T#Wk>u}8>mQ%nHVx|M%$fsZ4+)MA)9z>_`Hmt#x?Ue=0~O17AzI6` zq4v1hV#IT2ei`4GRDyw_4k~fbGXeG}fRD)ke6zRM`TPp0PqqIaOlH{rKa-jNyB8Z1 z12fydI^Q&Cj76WZ!EQVPUTi<_bBu8?-4yDLD8u6k64oG0 z1Ny^c6!v#^g!`6y;K|-s3>;3jUn(Oe(@&0<_xyaOgN{v5n@Xb)N-w5xSC+^=_f{UVDRI)Dz=R@OrKp|Kv z%P`1Bgs`k^>lv(`uq+f#3os^JG_suRrv=EG2iwprYFkc1X{8gIPEuL_%*WDOi~?)h z8qIe+u(=Kkpn(94>g1@3go#y;tG+^$#;40*jV`0Z?oc9c%k+FPIcc}6H^G5K`*Ajq z(u5M5UlFxvsR+08Nr>kpY<#(88Lqsb5rvOeJJ5LK<(RegdyJv&U<%t{gAus+*Q}tPbh2p_->jweps~n*ws*WHIi9KWUh);@Q6&m%p-O$V5Xag1aaBU&w zMVQhJr-L8a4}WyV+&{^$MvH%14x-_4RtCRSH){wwyw%)lhZDLO~Pb?BkMfNt!}!I zSpH(t>21x7RHSs~IB$W|oNWyyxg|W3(h3=uavWWb9!a}&t^q+?Z8=;^=UA90ksXKV zTkmfQvC7QS(cQ#dXG_&6QKT8$#=5L>-+@V5xq+xPhnhUWX&TW|zX$4FD=wsUPeMi0guI2{K82)sTmysBQ9 z9U2oU8|L^9c!$4ANuG`0E}8wDHkguD8jH?vwOx38Pn&mEI4~ZfWO>T&um@SSiR6lu z*3u$micAQ$xg8JeE*3EqEF1N>_DRmDf-{nPLy^d9ej0Exw%mAdM9Z0*_Lr`{TW5w^ z4rty~zNYNUvcBtlJ1lzKIb-N$+2cg>`Q3Lc9KsaIxQ|j+6{z(s(}?y~|Mu9mxrZmJ zZi3(Ub1d87>AGsC=`J)>ixRYGW(66g=ao@U{&E})RL0-oZv%*7Kbpv8j8>^mQ}(E$2Ip-&0eBe0qWS{Ir#d4*z{vO%9@?#`>@<{tED21_Pnku>=w$+~Y!(~*_W z^|!^K(%G+R;4oI`ra5itNVQvATQ>MlmN+2-2i%tSV~WAtru<|xYKHOFp0gE%;MmsHVU3xzL_njJ7P8bTb^f9Ik_*+=`RnC5{ zn4$Kjw1k#6efED?7yAe(zAlhJ$$9mQohh+J!4+NQ(1cI!7%Ool*jZzG%b4SmBAEsV zUxlJnG#MU%%VF|_LF6f*x~HKY|6xni;J@Se(Oktir4aD5iW1QQAK9GSYGGuBZY_S8 z+)BU%^D6I2Jk{hr@z3k{4=8&0&Ow}rlkuPNpBWaqy(sZk;*<~jc%->x-D)xXUM!B# z&GV_dEe*owVbJ>PWNH3!J41ZiEy!t$x2O3gtWkpCkmlUGmyyVFHQnDdB}Q=%9Ba3U zEXlWgTFVoZi)4#J3VziwNW>q)L7an_EUo1h_2(SL(y}w%R7Y;o)e4i)Gi;EVDuZyi z63G651o*|&8pEU@>)h`O7{R*cEI;AP6|>05L5_Y&ffQRS$|(^tu6U_C5~39<(OxXy z9;^7;hQ(_jds0FgCb>nIU}xA4N0X$77piLDTRuOBHGFSwq*MGF?r#W-CiH-4)z9kG zf}w7pH>GMQ^JOYXN@v34P&KuCVi%96c%`)R#~1kq1>uq>4mo$y{qMF@eM%J6CI+eb%5M9~cUB6BrX_)b+S`L=u_>z$_Hk_e+x~3>SygNoXhI&!R`DQn)_Q3w`qE_;bN8F8nJ|&L12<74QqpW!4D37y z1U!Gt5hn-cJ^zSv14P@g-cph4%pd@Ii(OV;G?SUWqKEzcl5ubR)IjyM@48Psn!3F( z78ilB9=R;2#(6zkA<3I9)R1N<<xL&Rar$~fvI|WuzCU13Z}Qf|p*1QU3WI!U!Q-?j*)!N5E#Mjshg^c( za`mUG%^!CweiDog%VxZ)KaIzcCz9yKkuW9NSUi2G+Z>GNu_JU!a>eBq*@6LBSverc4;xfa-#b|QN{j3{m@Jdj*ZG$8qL%)Q=kDu?zKEFH2YEq;U!;ij2LTIv zUo(J9Dx<;hu08%dj|tW6>YR{o4Veql)n4PFS%qRf0FM!mjh`=9yi!nESX8&`YmYzedx97MrXFrKEIF`aEPen;@#Gz_Jn;k9o z){!UVt|h)n*U{)8RB*FHaesK=**dQow#<5-gGoZ|<~(qvY+RA9qSQWON8m!(GTKz( zo0OAGHIhEdkWlH>oR~y+b=u+`n1pwN-1SC~p;xekyL*|Gm$|#V3-|8ie8j2uq)K%# zX{UL+&p3K=hUJv1bx}9XT^Z)SUaf?jJRZ8^6-7XQU?7(*i}i^HNj**S&Uz2l(CU*>Av3+?<{RS~uvx!{&o2a`$0>ilN`@lF~srFBm4xdFQ#;3=jb3~$WXhX4^7xw@8-+3O&v|5)x2@!qsxkVhv8k?7(Gph9CZ4XoGn9|N zW4CA7a%-lIbpsK>{LXw9c-txPe;-5WcTWFW^cP{Tb>BODoISH+E;jX9HkC4!2WH`~ za$)xFN%*Xt2WRaKKaKZ#zC!ylRLVK2(A!5j5o}wsjLl}2+eGF5*nxgG&<<6TQ%gMC zd|DZM&Sz7m+Hdj5Q1~mi{t~a(jgpbKv>cNbT-PTXCcZLR1lqNL(+D@ez3qWck03iob_R^i(zl!sLTZW+YxYV(gQ#eL^pwX#Tp|e0JH<^XT%5`)t__F!k{>qwN zFMHYhA-wPmH|D05TBdfTHf*pTX4l9wHL&lPH4VWJWD5rzJOJL`f0T$LpvYp+6Xh6d z^Xv?sWN7;aR5ytcBnBoXm~oL#;DsH}1wF zph&DdM-mX@f7uoj(!}$mNM{Z;T!(4zb!w8Urn_lbk0`mmYnr?&_^OfSIIu5|OJnCe zY+h_|&tI<>@`>KXE?VQLHH_$fuQwNisXRVcXK*5#<1!t8OW+)2KXmAzL7QDs$A04{ zN5lE8jLb_N^ev`jLd;mY^jV9@Y5 zAHWx=I#AWGm7`si^jPt=w-MYsAFX}f0h%!?3h-h|h|1IrODVjC?ro)NqEb_Pud*`X z(Q%KidX-P~eWI1PqhWOs)z}ebabiP9!@f)fA-PZ9TYmOwfmQLMG0na>Uve1zk9(~Z zq-#=;;0T!G-sU96;UZX1>jFuo7MC)QKXanFtv(sqrV4JWD7*S2NBu~;cvTtW&!o~` z-7fqzOg+mH`oYxu%HW!miI6j0SEXQF0THHfC?wsD1<2N5f3kSkuhJxp zQND5}esTqi7~z_Xe+D2M=k==L3g-?UiJdVcYL*+tZQQ%MRIGk(kkMJO$(YvJt%H5^ zQ zh{N~O&!-^*iBkZhffL^I@MpO_bg+`BU=2Sfe__i{1VYCI`KFzO(^1m|sL|R46pN6u z+*@24on+XuqQPn#d-C2FUgDf%d8=<2ZftoNFj-+^nX5`+a(ZN>aWNrD)fYvoj@G5t z37Pe&40Mu+QZE*ZR}dt9ZZTmM9q|`dL}Mei6j=Vd`zg}p1ym^(yHw`E38tS$=0@>k z@Fw9;nHuH^5K+%}@0radf$)xaQnS-qZ<9&z?JHEGgf*d7-Fk2#rp zp$GmW%XQ`JGjGo2XiOj!03&>>60hM9MNYLt ze|rm!o)HhLUzS#u_XxrQItLUR$fm6I-D^AJ_(-07E94r}xNI0>uR&K5iu35MV)vS; z!lE8aHpsn3pfD`vd_>Sk6lbj2G@zFbkiZm9wOIUL>k^CkhA1(EqgP31vmZtXXXvbC zKZ!85uF0g?-u zYTM%mPPCUx6s1YNsE1qKBGDF6MH^CaaZU>MbK9Lh&o4LEVNmn4=lsbgEn8-%E8Y7` zPcw<%4+q8UGt0Elhd$3PZWTfdMf*iQJTS>%Z0E8>C&*oj0ilT%%r0;SB`H~-jGQlO zn{QB}+}OPllv$>r5y?0`;n-WD=}1xC$JFdzJJdft4+U19mYgsdYGE^dDsytQ5$r5v zhR7-g;xhJKUPAw!Flr*aGd^;w4SL+F?o#~tQ{Ai-#)j>0$iuW$#TLD5uLl8W;*TD1 z4%Xb0=9i;iyXtf5S(i8$J6MQ>ugp`7zL~jCn??mW)G?@Y57eTagZ9E;KNnUUoaE(g&2JZ9tZ{hRv?%FO6u-{ANfZ zCQJ2bYYh3hryWy&iA0J_=W9R7_6aF*q+m@Oxkxd(@#~K*Som(a8Uloa@G(Zn^wnSr z@rC4$4|tk4?akjqkbqDJdw6NcWUpx|Tvpya6E9;M$bcC9n9)0?TnfVxTaPS6lwYELCr-)!>8~s1_--?c9+BL zAjEgZq;<#9;45E0uD_jX+BoHbzak*ZF2EJ_z!JPq9jhm zO>5PC*qI7h@Cim!tHs{Nq0#9LKp_b|cp8U)*^zNvySG6Ke#@SmZx2 z%{#fCtcLJ|PeLx`qE6A)@%?5@N1@L!F01kj{?Bl*GW=KJ;9&jtaM;-eFdz&~@qPrM{z>VyVCqH;k_W9gRbg zT}spZeg*owCkG3aK4V;zJ@IoF$4?ZI0UY+LH&7C2Qdge+URHj@#%=99cpGzLyhY6x zHm{3%BCRLq9Sqz_aog3+yl$7hwklnKnaP>}ze7C4I4O ziBBGHZ1>T;Vm1?XXAeQQCShC8Qv1CY>BV-}dLjw=Q_Tmt(_Rv`qLv5Rx!}qJAFS}F z7nd04&a~muoD4`9MkT_8P4)Crtx7%xk5E8K1ZH_l+(dL4%=$#9YhTX~$B{#A*2%d@ zO}$(Q3(4c80xOIiJB9&+=|unBT9B&WEJ37{(Q`^3-=DkOqE%9oy%m_v#7`3OLVhYw zq7vYea*IO^Dn^oe=8KD4TvABKHcFJFw>asURm}d`+hQ=II*(`=L1~nm2}`vI0B2^N zPf(fMr=a!}>mB#H%5V>2O6K zBvCW-A7aGxU%hFp%>N#vH6Zc9hFrOaYunCZhAOT~L6#I$C|i(6J$#+*cak6t6XJ?$ zBB;@z4?!)Tl6?Eb6kjm#l&>(F30?RDK9r^^3DeQ3@%0=wMHNhP)R=l*7SRK?- z{)Z?r|2I)$V&nL?D9Nu`4tz)SdZd21Mzu6jRMdp@j~D)q&@r8H`&Dd7*<5)Z_2!Wk zV^SC_cx402jNGc#(ab66d`@e|2(%#T4)gpRtk*A(jf7sn5(%Nc!*Dm+cml`u%1dat zct1{w?$3uPHiMYWpg^XwvIYu>4XToLQvNF@dzVC)+a8h25a-|u(7#6L=df{BTL$%rpE9dJ*mMR*KEdxZRR|zS! z?KWczv21Q*OBzkJjjs^RoxX|x;UD^6^(k0c|E*1-lQ?0U$ABvK$P=7`SAyR?=t3%J?C-|Zg;BD}+xtbL)#5UG=H?<3*{`Xg zG4HesdzT8cHl1Ge7c;ca^;~i6$9z zL$j7!%NFI9I8?56Beu@NQjOdd*-SN+&o|oAi8^a9dC+Tr-%RkbOhk3XxI|_}h9rc< zk+IAXkc&~ihjIPk&5}gqGADA1Wr1<#@Y7XL^OG$G8Nr=Gh1_6O@aK&A9u-%e3{D)D z#SniwJm)u@0BL%ICSof0oe2aj5vCPm{~4A@jwslS{`+qN{h zcvvNR3OM|?|AcK5)ignKH=>IO1%yCmeLGVcR?>%q&I))T#PA#GazS=DZy&eJA9V?R)sJnJ5e%6snTC=oc^W;A`k+J1EF8p2k#9VV{SNEi zJ0LGLJn$VOP#bm}cGC)k8S8dDyXL_gJ%%K+@$JPz6|~E;2MW zMvCRR+pOQ6SR@#Rh+rHRVnnhYVwj@Q+{KJcO(-WRj0zk$*CpgjL=st{c0~PIqI$Ps z#8HE-e|OKhAU{8Y&4aqk``FmL5+`?knJyX}QF`wh9El*rjvCW5o(eSk$i6=we{-LEDAOuaGr^ZG*O0Z^Wf^0Rw#Ku@Y|X$O<(=IjIvDGmAB;0#v*S|}(NtD*bdGW! z^+0}+&CS8te(|>?uVc?^=t8#NqH)gFY?E`%9VXP0*Ac=oLP4{oFQC4uOMVV zB;cOjQXP`W?0bB04Af@})_E=>=5LVx0*Kz?F?IzA;-D>5JGEb5+iBUSPxQ14lJ2J zh`E7VMI@53gvM#&cRb5M-XL{M-}jy>rq6L$@1)H6O6U)zUo#KQy>vnw5CPQZet4Lm znk*yDnL^%#;iHofxXoTTF_OR0v134teXv-+F#7=>$E8S?0`3?uyGm5eUwJljwjOh{ zor!l)DDQ`I5is>Cf*S0#gItaSFO*%9=%_ptKn#K)rjYIbAIjdbIkRwE7w(ReC$??d z=-9Sx+qP}nw(WFm+Z~&4-fwHyS*PmkKX8ATHEPrx7qM*uh>$%|*xQ=;s|W)s?F1Oq zx`sDO6$^Kg2?G4|F)XeP3SiOl(ZKdZv>;vBLGJv1l<3L6W0_%f1Hf7+d|i>S@H5ur z#=%Hs>O2hn+MzCmwgQ+@y&n+R#<*JKO|++QD-oXI>~MRO9kdA3hG;>W7WCM)d+u!^ z`g92UiC~GvB`?Z-@FJ>mXUX4?XICf&&(HLDwT<-Yy96YVE`zDmr0^dQcy%|s#S}5Q z79n3LKHn_GN&LPaBlEH>;3t?;6M_(IXbbaq@~r%2vl7{_@cE*z4CJ5PxzCl81v+j78erHdEAlQ7% zc>j!g5=iyI*#&W$D^2o|L(KOqR|y1=PiqE*!UR(*(PlZ7Ev7VhET^OH*I+0H!>B5COII|@Ulh(|jscRCHsZ-nkZSta)0U%aL=J;!)lH(Oj? zjVC^kzqj$joc9B#iV0BBP|0EkJ@|F^b^Gr2ydl-;Id0*R?I*qHpW@&DGy$S^v}23W zT}9Ie9P8d9l@H~-S6SNo=?@I3VR%(3A&b&O*)%3^Hg9d6^soJUHqRaLA!aF(-pVQ& zeA@2Q=<~mMR|?talV1=otPK*YE{>fi2sr52i)9cFg~a786Z~2>vm;OPN3PecHk+2U zmz2o0hRF8bpSOT4gz#A8g$pX@OoMIVlk2qlNM)}R7wH6JHPQUqPPDE~!<*_c ziLB3X>0B%d(o#mlnx+@#OhbiD9z`*8TD^WJ7`#FPt*~6j9&r<~GFf5$^4zIm>_>Go z0o~H$sTjEy{d7~&4ik^~P+!tOAJvDwltX9V8e^C$T%Bp-vhioi_+JSwWOh=01sG2G z#A2nwXA|AOc(C#eF(60t%#-iOdF4bB@r^?$c@V-~!IlJ{y-?~R_{|cxe#&5Z`#pHA z85?|d^yS7hA-&?{x{vMD_k5jy;Ezp`f7tvrj0q!&AbP@atU&wqXY+H&R}G{MUiU2V z-u+?Pw#);`YfEW63Bp)Cef9aQ-0`QiKlaFcE30=Nb2gP+-R`q3I*+vM&UH)02jY=m zLdh@rl-3qEYc9+tvZ+t(#g>C>GaJTeN%(xPKwA4%$pWoiJsmej6-W^7NLO&w<_ft$ zS&2)nEE}Pb*l*Gng>8xVAkGDm9xRQ09yap)M|(T5i`sKQ!5#vC?S;?(juo0s_S6-I z!x3>iWdJk8g9$KGZ-Wc;xenmZG=j!opo%KD@5noP?s@Gwn`UdcIc$VmC{>#LxSK!u z{k(_fp;|-Z@(LoL4;eHY!wZxW5uYy3K(y2G$9ugs>#W0xeOMPL!wx~Pt}~zsLy;G= zaB!u|`>dMjc0hQ9;+({~O#DF1;GW{EP#POu2=b)^{( zueKk!$Hsn1IlK6L6a}+N`7T3-^hO3^#K3(V11(Kc4}oo*v`jg zydl)Lk6Cii*HGt^3AfOx8xbfTco1SuJ2XKYG=T=mR5C9Q0X=>((r{ck(*jfxR9h$k zT}Jr_z~TOn^UkDJ-Vd2rO!5{c{J)7$({*DJraUpP#YYr!so|q-- z3gB_-cGj)s%72tyJW)6|o$K&<%R+TV?*biczHu*~D0$+*+1`JcF{_Tbu^XL3e^-Jd zI*Oj4zCFI0%i)zQAQYiJ_jr=LkJe*j-0KV&2w7N&dofVFN~CeKhRt0p}2<;qzq1b*FSnsCk7qq^jBk~o(t#5^hNw8(19 z06PcGF&P818zb4;R^tX$iof_CJ}G}w zG6!AKIHhnzS1|jg_cv{_Y$ab;OU>_kt!cFQuJyXk+Oj2;+G%o%LPnbTibstgpADno z^^P39BG5mU*6*N@VsvMf6l>eibS3F>{orX1JeurOo_nr|y;S1Zeg)HxJ}rrSHV@27 z3wHq(zyA*b5;jf!KKJx<_I!OpTz3@2hMXhdg2SnY{iJnSFq0CCxb9#|aw3%!jm<@@ zE@C>LHH#i5TMuIIUgh_#TS*kH%WD8)a?#KK`~+{araDANmJG;k=Mxc5=aNaM6ZuOe zI7sX~2v&pX$PsGKh8$(LcCXJ2KO3&XloAcHe&$@Y8IbgNI7 z6N01K4HeY7s6O_PYEEduuLf_jmPE zSD}z`39LweV(90_$;9Pp5A)a621f;m%j@p(c-0->X`oVbdB!H32|I)qM615as?dbr zPcOg0VeEoGmpG#jmY)ChL`;uo_HZ-xoJT%@(~@u{dvExx-)${hYwlDMu-C=|lYv9n zd+BI)5066%RJ3w&P+9p(`n~u@yXGSOm)nm0{|TA-AH0F3o`GJS@AtR=*S9CuFFZmp zssHm`*8f1j|F<_I3p?Zgfa{{w!IhL$TYCoGu9|ntwCMUVy3tUm5UTXhKtT~a`@_h| zy94|D@(e&RxWeWC{6>&RFCxcZtz)~4R-0Qz3@5SHZ6KR*1xt8*PksCvRkt)@cf4wS z-`-I#)YE9vLxu_-E;7H;mCmyIhl+>GI>|=cu>-C9od$nRe&A|&IPHLzT~6+*XCzM` zN!n19M5D1wK6Spi|AZ$ih8Chv+frBy^$i=%QL=SP_7_5t>R?1*0T)`HoHH%52KPIH zXPL|^{#pocr|z`x^yT&5kW?yd*NEfi`{}17b^+6jzKR69kE(fuzN&GCgoeC{(7-;x z)@PyM?fo>xH82yZe^rxwDl%b;7!i*ooJ}|xb}*?(!Ih9LM4tV9Fs@3cOZSPQVG6^T zg4Vx8_cS4Aio%$V(i34aLyE_UngXT$Aq|5x5lC}7hEN>FRvw~KpHtgA{3CfAk2_reO(4gu1u!W45JCqENUqu!unm6B z*k!MNoNvX(lPomX&F34G`N^A{O^^4i%ht=Sa^ZYA&>FRim(2abr;~(uYB{-j4r~u$#oB_IHqN$5s^rzt#x@nE6*0yzX zvC@1bCG<#IUo{GyC8|A=4u~?pnkzln8jCb{OgDP}ntdx&O~ZHjRlMw_Q#Um0Jd_r+ zZy&^v6{=Qd5s19L8nQWT?Im_c)H|~P?O{dgrjVx{eqTG4zyr0qeic2hJ7N$1LZHRx zB+*&*)wC>(O2rjbZ8NugABNu51@E;@Vcp14)k~O+N*#Cx!-iIQRO)KQq<&gs3~CfT zRh%mWWj6{8;$hIZBz$5(ad2=kNq=yUPk+BpPjEj;!UPK17XyDhStr%?z5xH#=gqR1yZgWb;(=pYLr_x>ho3jam%7nLp z;3U{B6Zn+OD_bd=TXKDDbV>9$ivt&}&8@i=w%*PzeQ}_;il~vE2jb#;Uzd!3+Z%!v z|BXnO6o8EHgbGb;T2CD*tpd6!4`bQ>;@=+)nSMm?%tcnfZutT==8EQEwJ5F+{hJ~2 z`aGLxRBl~zJ!ajLDQ^48<5f#iF5u8cWqzf)rU>jJ?saR3JFxX*{I@sce;%)x{T?op zDz=yrG=%=RPgEZ&q-^lU0lHZnZjZJV>~RBphAq*c$!uw64S}C8H>p3*@jGD`x}Qmj z&9czuIalr?hw36Kf`R_j^%RnZ^fT;9wrBtxq##!hXalYgGKxQOe(zwhg-QF3^h>br zd9DpnzFFN99aoz^gzPh0fp^13i6}#B9Y>4@$y}>FIY%4j0>m zZ@gPF>AH{^C{Cq@!S8KE+}v!jg;}GP)(!gBO8jHnY1s`j6lAE!L6Cn4=?yK=IYdaNZ| zgQJg$U-iUEH?|{g9Bvww`V4ANACZ-gwC>TWGjM5!Y)*68kUj0cZWgBCMvLYTguGA1`~ti2m_>%YmXY zx!5B3XehdQMt{&IB^z`};Sadt21p-xi43++uS_;cbAw#}RQ&WUVDk^29x#u-NngGp zQ#ks|mv1FI#0SpL^QHnVSj7~+wSw2cbJc9zW9>Nif4{5ON=ClCwn!br zRvMSVXZ(5mk)H@T*M$@DUqog&PIl)MFOwnJ$^1U1ZBh`#GK$f!tlk%isdf8)%pB}3 z=X>A^kGT-$MMhE(qgTZfhhD-?h8eaKaOqBOFYUXFcPN$}oa^7sYGLz&5(Y6Nhu&{*k$DyGA<h=XD1yoHZz)WI76eNy{tUgL%Hfe+-B$4hy{+)Lw>9~m}{pxh9w9aph}O$8YLG* z13#HF5L1+PR6FPv$3Z1^ce1oFRkf1jbmQ zx6up1kp%J$+#0;eP_#-;k|ps9)WQ$#*`Y4slOR8pU&OBz12YLu_DK_V#bPWW4mnCE zeqNvX2dp$eTz*tvl9!v?#049<;e|CXE!FsfeDCNWki%GkpVWVNa}By+bkXignwX!? zCYe?5l^DiFG!m{39*lMN1CQjkcNtd$GnXzqA1rC^W;K35J<;Kk1wFdZp1MP_D+-ox z-%hL)1HPIHnip7oDNbkAXk`KHD-GKmRy~+H*DO`?(4vMn7TG{0afSghS782xiy7*p zo>a2|s=b5^ACP09a$f@#82xgWO={P3sK#VB)cYGtUm^`o-nVYoc^C@weI;acjqXq2D09t`RTBtwvl%Y^Yro(B+Y z|JQuP2pwovG>_a6x)zAaD(I#@EQ~8!nE#v#J*=ukh1Ys6>*?Mxf8o2{Bj8S61*so0$4m+=G~EmAN;V;Wo?J>K7(q zF18p8l_DmQy;D~+Fdi=wD*)^49444~-bt`!ad84`=!;Y?>P1z5OA8t<5moiH*V>40i>?C8=|e8Ebu_`h?4due{k<7QPiQ^)9MMtjDFZwk0#01} zcV0qvLO8#%ZsEu9xtvEbU4ECB@pAL+xSlUMJVwX-;Ia@?|fH@=RDy z-ze|PsT|?D3b7_-Du4g7#3V(&!IL=+jyr#^Z^ktH{b6`&$F?h#D*?HYMd;`d2$-&% z!Qp$%9_!_huOoJ^bVB4xB-F4Q9J`96;IP5GoFB!-crVoTzNWgxGq^;A%BvLLp zd7JyA{Y&$zRz;-&kreSOWYQu-sW3Gwc?Xr!$M;(t!TMoyj97%CRhzI6P45e_#5!qr z<+x%J;yBN^kF-nH?q!4mc2zx4+xyJvin@RB7|AmO@TCg-PsUIZ0#$jYC&s#oT&all zNp2t*MS$an+U2Xk%`;U6cjyDzV-LhrpDBpM-VTaGoze~`rfh%Dh~@diK;9Bh$1M42 z_?xe(egSij7GQH{D=kY0IP`%e{LpG*t`hNdA6(E#@;H0r6~e1yp)yz+j$W#K+5}^|&U=Y<|R8iEnfs z_>~;b?$2S7xK2|B+{~#UEPRTVy$%x9ye@^Ytbo$xb|D>syQrFq*#aOn>~5(9K6scb zPJ<-W9YGnJBCap=@0m!7h#{Kdrp!6k0=##qSO9De#R=48sBiSThsMvx=9(TugTn6u&{l60D)g%AvoaN zuJ|fJqh$U!B6r}};|l?qg%gqv3Bnhehy80VW%Y)}$4SAt7(#6oEr^0~hkI!HqJ zmPjm5wUD{OBiACX?0g4t%L=^nO2+vC>=}mpC@=DYhjMm4Lm`J((4r0v8f|49cVH=i zVj7D$%J{kjkIy@Oenw3@o;u6V7$u_hQKFlpiqZhw2r1ovnyl^~c*0#KC3}3QS%B;q zmZam~IM+kx{T=0ra>*(Sq3c6Kj=k~z!|C!X-|U>%ga zN;Q=h1`mR>Nefzs2fQRiNZ&S-ll|R)Ihc~2^=0U_xvD6% zw?`>H1Pt=)?X6if%Z`#MNU>w&wtSCmrjfou6urJ)gmbc|O0Cu@m%PRql-~)D%HUm~$S1-EN&GI^^#3Lirof38J7GS#mBQ`2GIz zt?pwtukI!{W@k*wK==k6`?GL<8O z23s9iR;)?{nM+Rfg-x1dB{s8MZqGt;;4*upK{`GPO0X$R(;egbAWL|`!TD`4VTwl0 zQ@QGphE}7lnWi?4&ZsE{9BYW|m$PAmy3);-aIy;PgagjDu7GfDI+;&KS@x_Vy|5v0~b-&N6+VJ>a{C=vUrb~nk0ZmSet+;6+Llaf!Xm7`sI zMASU_IB8+CC~y#Zx40S#%Z5C=pe};Am};&-tfh<7TOiUnp>~RI^@Be^%Hgk$8jotCVy6!*PyuCJL$l}Yr(mf7}>tW!xnLVELA8qY)&pfdKyBb;c@nBmJ=6jH<;n2hx-6iB;n!j;%F`D_& z8W>EskQ85umx!TQdfV>ZB(XfI>aKUE+4YEAN`Bf`}yVVYj6$f z&~OGmqMK*?&16mC5GS-XWp09hR*c4I@_6Co)HF{3zif%G0kb%?^q0E5z~IF?S?K^J zc#61A=lG&`y(e6`)_`A$!`iIDA%Mns60e6xV?Ddd9Pcs%V)&wl?=U|x@tIKa*#+&r9k*GnxUV%xbSCbTF~qG@p8{&zS%Ow6dmx_lIhb} zvd3NB8PkbRB+%2OC2l^qZmXF+yLC~^&o0L6s4}WPz3Ofg~S{%qmahd0sY1pq_As%_8!;37}EyDz$|Zsao)&ykh zmkHX&se)b#RDNH-m`8Jc0yv~u3|~Al>c-%Vv`cV^-I6{1_O4{D;DTIHK|^9nG2L9y z=ny#gzu4v6F&a-feEuY_0?J5SJPe6)^wP?(sAL?f7K^_zC^zqW^&EJ1bnaxv%l*{7 zzF;k+?2*BY?R?^+m@zvHE>!%PKruVIuT=iG)W;Yd=*mIPx8QwE=vT=8=KlKuxa&UP zx9z)fMP0w(&RD>#ZY0yhQ)#>)8}(U_!awauwOLo;Oe32%vHKH#N`I)$-(89(U#|Y7 z+V98*VV%-uQH^hE(-eE-%U6A)C!piCGiot8EDt}=?n^x$C1f3icM^9KtxeW^i}k=j zj%5_{FZjEdS@<@PIi)Ho9zEJ=+aF-6=_(578RpmdEX-qPuba!ND&hWWZsRhyBfBS?1SyIrivJ&``*&?u(7>%4Rw!-Fid<%H*NM3j9iQin- z4kwCp@cBjTB&x{znXlSwI(bViTIJvKsV3; zR|Gbq%o|nmZ7)H9jR-XdRVM_yF96`eHbIMWsZnpz*=CEaj?lKeqPfL98|86irf=OY zPnApd!Qy5E>o0v6xFdZA?rTkHoeSxyhVFPPXD$E4Sg}f9XuuWO;CNSQq7sex8o1h` zDT|#!%;8-VWj~=1XQ_mNS20D+c`^U(BIJ22WNj1^wlJHkh{2wGTU!6rFw#_dds6$O zX6!1-5dN1OI1g7W_+BN+r7k6TV$gV`yr$myC*9jyQ*u*xQ^Lv`@qWB1dAdnj_~MNf zWhX6T*_Oqcip?qM2NVW8J<*5!7ij$dO|tqw?BAApdh}nts$citfZOlyZ@pi?LGgR~ z{BYRa=;I*Re_8TC{TEXJ>wky@|F;-C6ASbI!2GR$bX$rmExZI*z~s>x2lXVQ$Gc%= zWzN6As{|2H$~AAj|qt35$u4V!~Fcnq4W~0;Xb`{I4W%h-B5lJp(9_TB)>F$N_=TKlGH?=@z$;^=aTZ$?NC>LHdO~Pspx+_{%&{^cP;A!?>7qc$t zqQIL-T^D$j|5Ex@oEK20XF*k5BrudTb~%^R(28$suumT+Q4~?8SpZ3xeaaR|M=hhq zjoca5ILrr=#@k2V7qmb3`~dL=@fm6ymRzaa{itV|{kQ_04D1PZ8#rMNwl=hy^{TfI z{+gidNz6_SLtNkz7pCvN6n|Ct1f7>I zecd!XZB)}WsAxa6BvrR8j$X&igy~Gg3sGNI1Bh#0)_lo(*;!$42~Yyd`Cg^222ddD z`ZIb_H|cg6g*4COoC%Af(_&C?!^s^-V)A$ff%x>(59G&=;kGaTXAkGh;j-6N_B7f| z2%17Mvk^)>$GC}K_$QS*2=mFZ$b7)@I3GXY!s^S*s7SUS6}i!E#~vv!k_!-NGux_X@TNOaebzvlXo$ zTV$>DRd#qY^#&z@sF}U68<#4WtBzvbqqV0_3ey+IlGO6~)a;#P?8uE9TU_T;hajl8 z5zssvcSB5o2xN>JPz)r0g9EpJuoEK{-IWc$I*-T z`h?YCX|82F&k3Os)QeBQQpjL?EG8g5PG7O;Js3UT#LI(3q9v~XsP`=famJHlDa0PR zjROQckS!HyUtfo{r|x8Nx}`U?xR!pN^=`Z&nx<#}h{P{=_lr|1d+3DKxe=c^k~0U8 znHveZ)6-5(JK~}iy`rZYxB43Zu16@;FY*HIdn3!86&l_aM$%3;qH!5gy}}0y3DR$N zkMr^9w0&T6z2@kWwf znwDH|)!isU1%jc3$yyMz%;}%UJqFo?M^xhm_63jP0uNpLh%VI}I(}AD>_MAAudes_u*HVeg{6a8il*A+NoY$>pc3(i_5tI7w;QN<3v2%fYAUm=w=#XP!% zi-sTJGsiJ4XrObf->bGtXSIi^KlkLFyw#pDH!%vrVV2n6FSQu=lmcdLy>G5AdY#f1 z1rMqc;|Uz5RP>oKr|O*~ZkkrYl-OYA<)40Vw+8T(_J0S12^N?>?GTs7ICK;<%Bkg+ zivx?a>{anlfu0y>^iL%9wu~#UvSdTp6jB}eGnV}HUD!r(cA*Q`D-};SfI0+*?W^@d zeqzh3-ti2-6?I3fnu03>>14VSb{xr(_IvXpbGhTn;4Mr$4+Z6| z$ccK#g}Cg9uko5wOHf-B(E>T^9rGEQcPT-t!N1T-NZm?VSzTRO*-BkV$jT~63o*H} zMj60V^8`NdKz}>1`s>L|-o^zs*E&4;5E(2ok^W)(y5V>%5zB-wGlYiw&?r{}!e@0a z+e{NGu|oo?vw`Z~0(N%bn4=(S!b0xSBHd%I!p(35d!`J~A+hS{Zh$Vl>=o&#p~0-W(WYq6 z4voV)WSu&<93GtzQ5o}`PiU>2#74(UoZ-*?@Ld_GT$N_$X|Ryo=JRK^cfq|kCIdA>DO ziD)CUcxD6Z98mAbWE2#ie#AdKId59j`eb_`%8O99+zmR4XI?dZX3>9Sm7ToXb`04i zoEoqCD6P@zI%1I|U6b?DR#I|ksq7%5Ea1;f2(7h;PEZ=5{2uL6)tlQ_kAKY&k$p|A zIo)j`l1FHOkT$3qXzlVT))F-(E)z7~`x^n^+v@ZU@0%J|1l(te=jbBml9D{5{)@sZ zd>ntz;=QyZ^WBlq6hJou^kbNL!x0Ib%s=A z5s7}d1fDl_96*0k{2<9F=S7vD`8*(9-RYEoEvDy2rpqbp)b4ZCXFMBCfI_Qa zS(x1y;)cD}9wI5mCI5Te8;bg%E$@&`*J@?mtCWD!evV|(|H?(7whhvHo#u9fAABO< zVReK`%dYhgZ;VXyijI2QHI9mAEm^4#k7X@hK&}(#Xl~^y@B8;H6FhK&vxusDDEZQt z=HbvsoR2TTic&*8u9+qJFIUlib;3&B(3(yS8U0nzqRWYpZ*OHYNn-TAP(koE*TS`=1Z~y zrJCK80@oDgX>6FS&s65IJIKEj`mpMEsx!N`t; zLMOxopjwfW4+oGN!@~>z;g2UY9_kB&neC?~4+APl%KIZEf2LMPVDJ$zLV_6`PLh!< zr2DkQvvZI=*L7FT<~!A4`IChG`ftbPWGrpF8zWtc)UDmEoi>BV!N)fZE0ciH#X7M zGO2%hFpQuPBWSJ5{U_UC|z?jkS5drU0onbi&#&FWB|Hq@lq=-&tLdq1G zKIlfD6UBBg_`>KDm2zvELjU9SL7JjAOkpCJf+CHAG*w}&OoJdzQ2#45j*&i|0b{rj z=`)_b=d|a4$)sLT)wzr*#+gs87WK`n))`WR&;Yq&~Pab^jnB2^A}wzNk#>^f_+89jpk$V1O#3zhYmYD z2ZIxeI(d5lD5_mVJ^C6Y&zB_R5Qjb0ti@;oD|+ zZvCo1FMpRdvi9ma2C<-AiQC_=xC5L|F2(nJ?fEMb4WW!1fr&;#udko)yqa06L#a0}r5uF}VVxR#64T7~qCHW^`OMB`-Fx|Q)m zv5VSekg+FtW&9Y`R;O|MX_wcsaJwcb${}boBWcNJS+2Chg~o&-(t}^+0VR`L@8+)z zOE!OF$zZJu@`3ZuVi|<8Lebf-8`Y7y&_bPp@ZX+ob+MIpNp54}BD=`b_+81QVUR$4 z=FlMndAvBqakD2ope~N6=fnzaKZ1+`>)1admtKCmReyZ5?7;LB>L3ECR7n%qHw}GL z1ph#3H%dnypUK4H#oHrI=9QG|CzcE|Y4cb8~b~VeI`H==1ygQ{T!H{xOl75tk?GUasahts5UWAcr!O`;+iX1Sm z1~IPm)<^sqE|JLl`XH1t-&u&4mH zgfM#VUXmuiCSLdpYoPTyo^_D%;0{W2ekA7&>7zJL>foyOVF>Qa;usqi;masQN#x~2 zw4|}taYMiky{BJ&9zOs_BZcpk+Bmb`EFgv)e{B|j%Pj7ZzJvL==WuP1TFmh9TCf$6 z&WC8uwxTTrvj}dNr_l)TjLJF`wu|I@cU*)$_=3DB$D)D3u9#RTrX%q@SXs=`HRxP) z7IeYv+NE$CC+XDa_aOCxb=2EW?)3q6CllTeOXQBPM`P9Y$9L}AAUJD`-WXDAnZ`wD3Q9T{X!<1CK(?*6K(Yp5o=iq0@8_^Vjg(fWp{!5nc= z5$-9j<=$O!BqiM$;w!J2kd;EGGnii#zXb*mFE4#YP-W?e5ovGMPTbjmkN^IhvzSNK z?co$V!oX%=Bfrz*k22wuB9>GOPRdSv=uvHSmm5 zY%8s2?_SlSV~uH(ew_aKcUjuixNdei3UBUL0b`XK5+>7<_MQF#ymT zJil+dU(YQ^o37ONDPiA5k-nn5_cxUjm16$+z%hFXJOlKP&J#K&3Wrx>!<<7QV2@dC z=Dl$WRSrwFQpP0Ltk*|?^s=xW6hZ8Q?3?CG0tz3i^{4&wEe(X*hV>ngA$K|1;(W*3 z5M`v zwO|gXC#}$mCwx~&a~g95x28G#^iEylfSfkR-0+*t+>$+??LQAyo{3muIrY=!ZV2Xz zn#$ysBfgeVlBM}(F*`KECO#K(aHss4Jl*dF(a(6+mh0x(vAdO0|5yh?n6cMr^s@X6iko~_~8yMl=kU0 zAO196%R@2^L7NBLeVzui6LvJfJ?C`K=BeZ@&mQi;;&F0k;x|aYB4rbi0jT$6kS0Z= zi+K)!p-=yiv>x!fHyj8_XTRO-Jv>;|Td^}77Nco%dhAPG6igP{k!$S!QZi%Y;2ooh ze{sdcnDE2;$Hd8fTNJt`upqHCC?#n~JJ7!@&3VK>I}6K^q>_jJ67!uLUn6!9B#Ql= z!oN;^7nq6%C1=QYp)STfnaW&)@ak%=zb7BrTIF^6;7;1gk_b{t4fQDBzVieGGX>(Q z=ht0-2=%m4*l+$Wwkoq#b5PNhMFif!Vs1>fP`UU3{W3ZOr^`yFM1mT@<%*CMKrxU| zyu*WbmY*77Nz1HbhgF?#(IY+y#QeamXO}A%FW*L>g3{wPj23e*+lsxG*!i3%V*g2G zZ0n=QTd006hQS3VB3V|HRP9=vlx(keybv`tHSBL$z+x9V2s6j5d`*mG$TphmDogSu zw={Hn(OrJ$O?&-ETt&%rCd)0`F}H_OxTIgf*ZxB(Y{zD#$do>z}Z`A+j z)DV}b*$3e^LnQ;xOY5tDz6(l1aqhe9RX(HU)0O;d zWFof|Svixi{>9co_Ap8D!1y~=izXVSc<0}>nme1O^zB_tM6u3?@6?I3co)xWhLNYX z3sA{IJ%hFk*Mf=udpwRPY-LXBR@>^fL1c^W@YM4Yv^z*Qo5l9-@82W80N(n@-5CtN zyF%E}CT1~D?1vl~ft6)tebv&to2c2u99`>$ieF;tPo?3D&LFK&Hx=Q+w6QnM^w9^M z^Y;Lzh{Z(?$#sy@Kw!pfT^U%YuqYIY3moz9kk!@xIs7|qIigQWZgZ!SgZ|B#1t#_$ zdR@8!X&YagJ^zEIQ){WFxx+WL>!qZIYYOA~LUIDO_IWS*XVOj=)@*BqrI9R+eJliQ z)Y`d=F&EZ1nzfOFQaZ?en+v{qMeBl5i%(;7smulht8YK~M$1>UI{ogxZ`hAXPdcsw z+1M%sG+eUC$VX6;iiv~*OiudB$X=OAlo=oK=|&9t0AzDu$CJuAgO5x5dx_MY*rJ0w z4eEA8RqS33lzNw~hFRx!P{<77z65+$JRHbx!lx(oPwjItfpdVHv}bBVs6Er)S|AVK zGmvYgJ>zH4z_evC=;2^dyPMP5gcw$xX^L`L}I!(#LiOoEi+;i|%gbOuHM*?A88!J*pxXzt~|EwTJlx$#3#h!fOVr;;5`R7!O(Z=@otvPCWAJ*mHKVe z$gwBubaSvJm*qMh(|4U{9i1A*!;N$RmxK*bcKM#otrv{8M59wC1-}0AzwAZwm-Nh!V-KW0WTgy}n8~m3KrVU3 zK_7Z+L+&_3{kx*%z!GWO61iB3TWsdPUa+6KZMPj zAVZk#B^|H*6O8I(hN)r*?@FgMc&%9}A!bbo zR2zv#+_J^+8Fl+2c_e6bEW>(3uGXoUUD`Gnd5k@!E~2)SjGjv^03HJw>&52LkWYXq zI+}Bbk;vMM1k4@v`w`;Mwzo|~jFr8akGl~)so&74-*ni(Lwi=9)zth3e@FVvU--|{ z4fy`n*TcmBKQBDC|M2_#zu%5}dZ(6p8g4`4U-$25zX)Q$2>#2<|3R1jZ*NBy2Il`v zlrc2Y)7RHCGD3E8d3=bCT6Ce3kcN?=nUDg8V^*+x z1}OhZ&q&EtEr^3Aj$llbki3hGc=S^NFhhniGSLI6|73YgMMZgQ=A5=y={)`$eM+uu zg{t0a^xjFg-FCF$-RTj1x%R)-^wkJE?|joBo}tigcAL%`zT2u)Ky#tnRqJ*<$~ov9 zGY`~U40j{lq@OFeYZ!e76U%}f{pzXWxD{g?bVw*Np<{?{|h!t_6=|7dkcEu@v@T!{1^ zMtG=wXcw z-c}V|OUtG8^&XGoiz7`^5a~rKqZCiD%$N9GGh#U1stR+n=q+uC9u%M=d_M3#ALsAOhpEhKD| z!Y3~;J-%Q{R`!tH9&!WjTW$gpokN2=%KxvhvxchB0naYtcfSx&v@T)!GXk!p z32(Gz|0FI&z4i{}k1Pu^XFrQv4Bus%C7ff#g#!JOMv%{$y&LFj-P2cZr7f|Lq zkuO>4`JWueq2>pTIkLHL*my`ag{C2_FcO7<4H5t3iv7Ir7PxND^SW|(Wz_1@ zHDQWCKR)7olA(HmR-d{=3`d`udNjbXeTT)!7K3Td+4|B#WN#Z*|D6WWs<`NC71!QgKR2g$qX>XoC^iyB zL{o++GvjWNs#K8U3_)b-oVo&9)d||fwX3(NNXf_Nb`49&viXP5n_#o}GWjD@uR10c zTmaV;(6}RGyuMX<)9L;E8udZy?8BerZXX-(JkkCB>OkhYj};;f2xYd59$`Fz7j&MQ zir(Hazi3vHQ;Mc0d8tosRB5JP+8WD~lX;92*V0Dvf>4(aX}hNL0Fwo?iSFRCzv+zd z7*eKeMm(uM(#PnJjMU9y1;-Y`Ihfy|iWfJT&mpRjs;OKTm}PZ?l{GyW%iXBgiEc#C6)<#^hyQ_+J)(+ay7W z3&i(|#lQ4-%%YIRlA6pg%TM>5f|Dg=;==^?bJ(860oYMd)^fmRMR{Xia6%ytO;AB7 zGVvb8I{az$olp z*%0wI;s~45VmxrbEBMrC-^k~mB&jlS+2*z{!-VqZUse|K;?l-5m6pqn`tf8GkT2tz zL1ruTN!1MQ($KEX?UP3bH;$2Y0=I&Pcqzp=#RU!Vg9r*tC*Jp7Orm>c!@n~u+HUr~ zYm+&Pv8o{e!S^w%wInYuxambE;VGdW{@d-Odg(xDqf1ex%DT3OEgQ4s3g_yD%1G}x zWd1}((MQF_VJP@MP$D?O{1&u$?k;% zniiAeq-;fN2U1>{-Fhlw=j?9F&&HMQyRzc0-5DfMf3|eBUkjF6cDXW@_+iRqrzz#} zs18uR?sjZsMvrUbeI!ykf7?TfH493=fj{W|vY`571*kri@#8THqGQ_WSJU;L`1hb3 zqiIf}o$U75To*1A%( z%rb?P;*8`l)B@4M6RU5f)2xs6EqCazx{BwAgP(V-9&8^;7c~tw9E5Kt=EiOE#vT1$ zr@u+M`C&6Ncu#PG!z#7l4XUn2RDbPx2i)9$AdQVz!5BC38hl0;K|&X0a&dNh_U4L) zyPR=?+Biu7XW-T(HY)4M-y@#NY$knWb?`27{!$Tcn0O%S8lDh4$3-j3K8U5We6^S{ zjs}OxTP&y+XAV+Mu5(6XZpmBtu;H;Eo7-Bqs4d=b{0j`^a|ExA`&tKHrW6|8@m8vf zxUIrkJwJM29(+C3y_hw_t@QrI9}G8`6hJzBNsU}6jqiZ;Ji)Oz4o@}KXQz4syo-Jq zH&i|{bV8VrIA%meQqjx5z&p#`{?WwM-t%!9i|#blYuEW|v_zR7INIxDYp5)2zXtQ~ ziKX%9K{)TVGN~TZm+Jy#J?4K%?I4^=#O&@)X#$d}rJ?B-_4vV3k3~WP-Q@grVXP&8 z31h*#J7^8SnA5ZGsi{!WOxVK>^s?Sqq8XUQ%mrY-}g4xtE-b_FD@r_hCiLnjWt`(R7Uej z>q=qS);O|Pa-t~#J@&Y9H4Rr(NxNbmf$w=gZqFS=zu%oC^qteqJjycp!oM7vUIs+L zry!{2Kz1(@GPc)!4Zo-;A-X0!A%$^rSCzCTc9S+j=1%CD_^`*fpQ1JVID409vP_eU z03*LNlH5=ge}+Y}k@{Sstws4gLL0a~C?!Mejn+GVgYSJPo}K-i)SoYY z<)}}cIHvW4O*hc+1R|@}Qf7(qzH8*&!6rwgnP^f}wi);kr>u<;*x)Te9{%r0qpl7 zqd{WIU zu{6Kzcj#e(a~HLc|G|qX)MfBgvJWlr;I-yHO9WEL=7QeqBYCwWVd`%?)1?o@+VS+u zYm|!au#Ew-WE^y3z=Izx94$e6%xm^X}x#Y|L4B=V^a^6O-a%mzQ zQ=+5u!#tY8DxuHTO%VMHEm#NQEYPBXOu#dG4z}^ym{z!$sPgSQSq8TIn|whn#&QY! zw0T_uBDv~8_r|iYm4!5@ z4VD3EWU*!nr+ANPcR(?b)osGBBODEFrh7XbPI!cvT=LKf2^61L^;MduUGMwQv7s_8 z`L%8mRdlVD7V2A;5ZqSDW`JFGIa2qz%vt#Q+4~ zh?Q3}vzI4oSuB-nN9jHz~grM`N6sTy$q+vwNs7=^dCAMea? zX;t%lpfJC!2K*R9BdDpHVO+DbY;%Xh*7JSD&P4>LiwCvH>ZoCkA)R4_-61!VT|WL% z?ip+Ivwi)3-R>dYdwN@7F76*@s|$hWgqGD|a+LgDSGvS#H$=>BCgL$oGQru8hdirh zWM*O7pd$Bb_Z@>57p1hK6M+i2zWZgGi8U$TW5Vem7w=0u1iB+npX6p#qDZ+6aEVpoEk4pYMMydSJ}onz4;_s1 zwH872CvZYD62xGKeY8|%#@nPaX&tF+>*>2vQ@SOX5z!fFi}Ve)+w@%$_fUaZ1z^AW z#osY4(_Ao|1&qOBKYB<&thKiQeGxT)b+%9DS5fLRTd`{zX+YRF`n6gU*|P&lku!{-}|%J3ZW@t1SP z_gRIb(B_SdR$EU!aG)5zQR=nY0?~-OpaYt@-}lhZH2Or1EFAIr zy1BW(e`~h3GlHEZoZru|ck~lH__>+~`eJ7dQ&@Dd_Ta5fQx$0pcJtJ*x{GnkFLe!A z{C)E~(Lp^SXDk>hrX;bj()yDnQyzdNWWi#ExtMoBN44vr{%7om5~73d{JUZt(T@B! zdSq;AsaKIm9oM!s<>*?$e18%8tsqHQvSj}H#X53aCG#gWv#Ct)juhA6H5d2N22%zS z=@`(LR5=uTU|AV~Bs`e^Puhpd`-ETIGor?W)wWtFWKKV*sN>OCStDD3?v|{ATh6;| zke=VO=o`7x4YwUK9F=%|+zp-HHiZE|32eCg$bgp{x`pM$ObzLMi+zid&$tzMt57>q z1Jy9{?7-ZePUA}*dzg|UPpb6})KA0vEBa!r9mT9pR1*>f1g(t41tvf-%TDLNH|^*r zUv=9<@rXELg;mOf?a8G_Z+u8j*}Z6AHjqbt_%}!=rJv?e>5E4D8qkv>G3}@uwfgFr zF*ZM=5i{)h6tZQ2)g)N2Uz_bp`O|l*csMwQ%o{UYgB!tWD!3WqL)8pUTfo`tozf{) z(E~35`i0T)im5)G2E+5)+a;Qw`U%>MKDj>NCF(#?`tx-7v(Tg;^&>DL^jJ>S$@UJ1BQUhq~(WANe*3t-n4NNoMD%#HG7?3bq76C!n6;Kz$1jVQ10#UZZe*!Wlol zo4ghq1$m}Y9KQHkq`iv@74c0tCe(P%8huj&wk%#EupILFB)en*afK&_KEsOa&Bzg5 z`^5YNfN#Rbbz#)q(7LkU?tvt|wN(gQy0%(}Ekd8Elr~5Tj=_l>hXB~(Cqr9@(MBXk zgnIL#ThH`+kCo6`|3@2Y?6q_3W$kIrV}F{<;hJJGuZsmN4%{9Je#zwYm%|(IvWCF(G82_bdEm zPynlgEuNk(cTH%F8}OfNYbrRL5+trnHe&gPuG~%Z!iPMwUt5rk0NXhgS8fj?Ee!*K zbQv(TT;1bPy;|PQCznao`*1C=B>K=!@o(eLzEPExFAD&?gl^70g$pk# zpD>yu-2JH)h@<+;fsNrSV#<1G_{W2+{ZjjADD>Q7N|W{j7I%X=s99RqwK|gVRht(7 z`t_2`=FNzsKGT(@+0#p^(|0U)|5q@=N6J4$4puHCsCfKz+JPUS+J<~Y=&}{jp`i>v zan=7}J*(t?W>lh{V~WPgNZ$KO8tEwX+1aN_AK7yXfdYe#wC#nN#moa-i9?|X-%uwn zRes9K-X`XFG2(0)@(rT@<~Bi3M!8`49$PauJffI5ERan7a0>2j;N9LKTplAqX^36) zPwLL@BX{EB=U^Z5$Ep>^?taFhuO)xfioEKFJQlK#8kFYnTCscXD1>)x8HBhHDu;{VX;SgcJItBHoYIkGM&HDWje|5MbZ`(z zl$t|$wgfD!%d5{@v)p}$edk96{tq+d|73Rif6tWvt-t?M70bVTSNw`uZpZ6kPQXOK zTa{3^1hxPSOn@A!+kgLn^FIx({{z4cPy^a(x;X$;sd+g6p}1XK-Ke=a`2QCuH>V)~ ze}QuU)-!Y><0tgrH0^2rjf2wnY>7jBQB)o}Xy=qYuTt{;3;p1X&LZ(_3)%bgE2ey+ ze3ONBJpHhj!end0zA({e=D~CxmeE1|~1vYfXWJ2tbkT9O_jcA$?cjTHq^!!1R zp?iTOwIqQ23`MLWxIyRbAW>Rt5WFU-4$4@vcA&oASr4)=FF3F)LwLlR4EIiONWzg= z;rD)|d1-JTC@q1OgINn{uaELHA7d<~5xCxCHj#d5($MS_wFwY^<&UwAM)K4fz+R7xg}e|ckU&&-G`%&USk z#>eQSk@)JNpe_1_&mTsrHVgcU%*VnOi$&+E|I`+Fz=Q-u-LV^*P{|(~L07lTuM4#a z{gfgeC{>M74Oq`uE|(fhDfbE+CB9ioo>QG`IwPXJq?hQcs4E3ClXJDzd&uWu=X2*L z0ZC8j&u|#m-cRFa;e}m!2l0Od{E3SmdzLOYlb$d4+iOmy;73CDKDUTtVUc}Ivi0Dr zoaDW0D* zggAj7U?Ew-bB1~zWw(4owi*E=zmZ!qa+(@;@Nf>z93h_OmbB1kLRic}(D2nzKZnUh z8L?zTg6Xz!6KT(89E^H%^J?{qKixL@{cp9BjZ$b{KOO;qfkR%?X68d)LjCYQX|bIx56q{pJbO8$Wu=xj7hoTj z)ucu~TV2wfLYyLZGo&Ou1dAJ^NM_U!{JLqY9}*}M=Xmi)6n;`AK&k7d?k>rJdIh-H zCz=*^J*w=FRogRB8m?*rGWKu|-T6fuVbO%%@Qn8&8Hz;p?$%LP%QXi-jHUS$-At^r ztTiL|tTPpmKJrG;$6!y_Y7-m#&=g#d3SGt^M;m_(ju>s7{Y>?fUqXBcx{u5FKfW^&=n+b6=bqyB9>QSEoxYFqR7k+i}W;4Y3)3oe>!bysHwx z7I@E*;ltHXuZi6`#74%A+lp+zRd(v{sqXVdgCB#MoBb8~@Z%L`3G9I)6r0^+1mC5?zYT`0|H4?~X1g~0FV%0^Z^`uU)m#M zbm%&<-M)cQ_abrOYIsI-U>)VGTQJwq{SSRF*oGywIz+w>SiW|+%tQvqK=l<3&7Vag ztg`bEnYNf@>v(9iY%%&wUNxyCH9XR{?EcpwZz>07)F8~UAb5KPf%=hfi8$GutNvJY zz*Pw?MRKeLhQ6&f{0wPFR51LCLfZen>;`Fq9M-NoQ#HZI0m6fZPPhT2lRjcV1J zr+1s|`M9#fMbTjW2f{Q|w)0;7KV$-hMq$fDk=18X2WPG0-@52h9Yos*o4%77#@5t^ zvN$M7@EzqPG?Yp=k#=)T)h=CwYjOUTA5|p(2%uS1H0p3b@{uY#h%{` z@|TTuHFOC6OjKIDNT8d6xxJz3_+J~+4i@oe4)^EMP5;Qvou^mpr4mywZhRupHH=m9d-1FstPMzeODX7Qym)nk%Q0)%4awHC zF=y5_dx%o2Ow0N~r9=Z#%f_%AX@{g*zMOz$%uf_3?3srNhjO(W6hPcQSsi*E^Bj6@ z*aW$o%1Q0oIO_J@A5d#h=MBS)Tr_ai+o4e|J!OqXeemg}ov-1)Xb)uK<#daog?`mah(rI<&ad7TvmERb5DHqskb zbN$WQe-{S)|EUG;{|W;=4NDL}!^z2w`ai0yGysZ@ASdeo@KgLd${31p0>29Kf`I&d z7Ce@mycWQ(eEi&8{2)#sFBix{kY7OT|9`_6plRb{i6+1S&^6?w=BDN{{$F$l7w>;5 z_+g(B1oW#D4{W(sTUIteG2Th+fT~F)tGPUwh4@NGkm<94#tCw5d2=)2+>WWF;a%)qn@ z$x1};-$-BY>iU|)H{qJbZ|9#gtZ^7HecF)+xg$)Wup7fH)I literal 0 HcmV?d00001 diff --git a/Plugins/FMODStudio/FMODStudio.uplugin b/Plugins/FMODStudio/FMODStudio.uplugin new file mode 100644 index 0000000..e433964 --- /dev/null +++ b/Plugins/FMODStudio/FMODStudio.uplugin @@ -0,0 +1,29 @@ +{ + "FileVersion" : 3, + + "FriendlyName" : "FMOD Studio Integration", + "Version" : 10707, + "VersionName" : "1.07.07", + "CreatedBy" : "Firelight Technologies", + "CreatedByURL" : "http://fmod.com", + "EngineVersion" : "4.6.0", + "Description" : "FMOD Studio Integration.", + "Category" : "Audio", + "EnabledByDefault" : true, + + "Modules" : + [ + { + "Name" : "FMODStudio", + "Type" : "Runtime", + "LoadingPhase" : "PreDefault" + }, + { + "Name" : "FMODStudioEditor", + "Type" : "Editor" + } + ], + + "CanContainContent" : true, + "Installed" : true +} \ No newline at end of file diff --git a/Plugins/FMODStudio/Resources/Icon128.png b/Plugins/FMODStudio/Resources/Icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..fcec53dab196ded2a0d6f3169eb40692cc5973e7 GIT binary patch literal 4009 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

wC5=$J( znNC?~8s1qzw|zt~rn_h%hH;Op&}nlF3k#_|7A^(RTbH|qRi1^*g&Knmg)b|++WDaF zXaCB&0G&3D#ZKNiD?)G>Iy_r#Vp>>p#Cjv3;l8-!LPHzPLSz#cAiH(1$gsP;l>og9 zV7tYyS~vKQE@%fc?~Z3LbUJbTaYs&eJ%Ax*e(L(#Z7Y0W6%$=|=Eik)+;U&o?wg@a%t6+Kp)d literal 0 HcmV?d00001 diff --git a/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODAmbientSound.h b/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODAmbientSound.h new file mode 100644 index 0000000..91c25bb --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODAmbientSound.h @@ -0,0 +1,26 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#pragma once + +#include "FMODAudioComponent.h" +#include "FMODAmbientSound.generated.h" + +/** FMOD Ambient Sound. +*/ +UCLASS(AutoExpandCategories=Audio, ClassGroup=Sounds, hidecategories(Collision, Input)) +class FMODSTUDIO_API AFMODAmbientSound : public AActor +{ + GENERATED_UCLASS_BODY() + + /** The Audio component for this actor */ + UPROPERTY(Category=Sound, VisibleAnywhere, BlueprintReadOnly,meta=(ExposeFunctionCategories="Sound")) + UFMODAudioComponent* AudioComponent; + + // Begin AActor interface. +#if WITH_EDITOR + virtual void CheckForErrors() override; + virtual bool GetReferencedContentObjects( TArray& Objects ) const override; +#endif + // End AActor interface. +}; + diff --git a/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODAsset.h b/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODAsset.h new file mode 100644 index 0000000..551c911 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODAsset.h @@ -0,0 +1,37 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#pragma once + +#include "FMODAsset.generated.h" + +/* Purely for doxygen generation */ +#ifdef GENERATE_DOX + #define UCLASS(...) + #define UPROPERTY(...) public: +#endif + +/** + * FMOD Asset. + */ +UCLASS(BlueprintType) +class FMODSTUDIO_API UFMODAsset : public UObject +{ + GENERATED_UCLASS_BODY() + + /** The unique Guid, which matches the one exported from FMOD Studio */ + UPROPERTY() + FGuid AssetGuid; + + /** Whether to show in the content window */ + UPROPERTY() + bool bShowAsAsset; + + /** Force this to be an asset */ + virtual bool IsAsset() const override { return bShowAsAsset; } + + /** Get tags to show in content view */ + virtual void GetAssetRegistryTags(TArray& OutTags) const override; + +}; + + diff --git a/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODAudioComponent.h b/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODAudioComponent.h new file mode 100644 index 0000000..8bac974 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODAudioComponent.h @@ -0,0 +1,218 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#pragma once + +#include "Map.h" +#include "Runtime/Launch/Resources/Version.h" +#include "FMODAudioComponent.generated.h" + +/** Used to store callback info from FMOD thread to our event */ +struct FTimelineMarkerProperties +{ + FString Name; + int32 Position; +}; + +/** Used to store callback info from FMOD thread to our event */ +struct FTimelineBeatProperties +{ + int32 Bar; + int32 Beat; + int32 Position; + float Tempo; + int32 TimeSignatureUpper; + int32 TimeSignatureLower; +}; + +/** called when an event stops, either because it played to completion or because a Stop() call turned it off early */ +DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnEventStopped); +/** called when we reach a named marker on the timeline */ +DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnTimelineMarker, FString, Name, int32, Position); +/** called when we reach a beat on the timeline */ +DECLARE_DYNAMIC_MULTICAST_DELEGATE_SixParams(FOnTimelineBeat, int32, Bar, int32, Beat, int32, Position, float, Tempo, int32, TimeSignatureUpper, int32, TimeSignatureLower); + +namespace FMOD +{ + class Sound; + + namespace Studio + { + class EventDescription; + class EventInstance; + } +} + +struct FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES; +struct FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES; + + +/* Purely for doxygen generation */ +#ifdef GENERATE_DOX + #define UCLASS(...) + #define UPROPERTY(...) public: +#endif + +/** + * Plays FMOD Studio events. + */ +UCLASS(ClassGroup = (Audio, Common), hidecategories = (Object, ActorComponent, Physics, Rendering, Mobility, LOD), ShowCategories = Trigger, meta = (BlueprintSpawnableComponent)) +class FMODSTUDIO_API UFMODAudioComponent : public USceneComponent +{ + GENERATED_UCLASS_BODY() + + /** The event asset to use for this sound */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Sound) + TAssetPtr Event; + + /** Stored parameters to apply next time we create an instance */ + TMap StoredParameters; + + /** Enable timeline callbacks for this sound, so that OnTimelineMarker and OnTimelineBeat can be used */ + UPROPERTY(EditAnywhere, Category=Callbacks) + uint32 bEnableTimelineCallbacks:1; + + /** Auto destroy this component on completion */ + UPROPERTY() + uint32 bAutoDestroy:1; + + /** Stop sound when owner is destroyed */ + UPROPERTY() + uint32 bStopWhenOwnerDestroyed:1; + + /** called when an event stops, either because it played to completion or because a Stop() call turned it off early */ + UPROPERTY(BlueprintAssignable) + FOnEventStopped OnEventStopped; + + /** called when we reach a named marker (if bEnableTimelineCallbacks is true) */ + UPROPERTY(BlueprintAssignable) + FOnTimelineMarker OnTimelineMarker; + + /** called when we reach a beat of a tempo (if bEnableTimelineCallbacks is true) */ + UPROPERTY(BlueprintAssignable) + FOnTimelineBeat OnTimelineBeat; + + UFUNCTION(BlueprintCallable, Category="Audio|FMOD|Components") + void SetEvent(UFMODEvent* NewEvent); + + /** Start a sound playing on an audio component */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD|Components") + void Play(); + + /** Stop an audio component playing its sound cue, issue any delegates if needed */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD|Components") + void Stop(); + + /** Trigger a cue in an event */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD|Components") + void TriggerCue(); + + /** @return true if this component is currently playing an event */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD|Components") + bool IsPlaying(); + + /** Set volume on an audio component */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD|Components") + void SetVolume(float volume); + + /** Set pitch on an audio component */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD|Components") + void SetPitch(float pitch); + + /** Pause/Unpause an audio component */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD|Components") + void SetPaused(bool paused); + + /** Set a parameter into the event */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD|Components") + void SetParameter(FName Name, float Value); + + /** Set a parameter into the event */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD|Components") + float GetParameter(FName Name); + + /** Set the timeline position in milliseconds */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD|Components") + void SetTimelinePosition(int32 Time); + + /** Get the timeline position in milliseconds */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD|Components") + int32 GetTimelinePosition(); + + /** Called when the event has finished stopping */ + void OnPlaybackCompleted(); + + /** Update gain and low-pass based on interior volumes */ + void UpdateInteriorVolumes(); + + /** Whether we apply gain and low-pass based on audio zones. */ + uint32 bApplyAmbientVolumes:1; + + /** Sound name used for programmer sound. Will look up the name in any loaded audio table. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Sound) + FString ProgrammerSoundName; + + /** Set the sound name to use for programmer sound. Will look up the name in any loaded audio table. */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD|Components") + void SetProgrammerSoundName(FString Value); + + /** Set a programmer sound to use for this audio component. Lifetime of sound must exceed that of the audio component. */ + void SetProgrammerSound(FMOD::Sound* Sound); + +public: + + /** Actual Studio instance handle */ + FMOD::Studio::EventInstance* StudioInstance; + + void EventCallbackAddMarker(struct FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES* props); + void EventCallbackAddBeat(struct FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES* props); + void EventCallbackCreateProgrammerSound(struct FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES* props); + void EventCallbackDestroyProgrammerSound(struct FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES* props); + + // Begin UObject interface. +#if WITH_EDITOR + virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override; +#endif // WITH_EDITOR + virtual void PostLoad() override; + virtual FString GetDetailedInfoInternal() const override; + // End UObject interface. + // Begin USceneComponent Interface + virtual void Activate(bool bReset=false) override; + virtual void Deactivate() override; +#if ENGINE_MINOR_VERSION >= 9 + virtual void OnUpdateTransform(bool bSkipPhysicsMove, ETeleportType Teleport = ETeleportType::None) override; +#else + virtual void OnUpdateTransform(bool bSkipPhysicsMove) override; +#endif + // End USceneComponent Interface + +private: + + // Begin ActorComponent interface. +#if WITH_EDITORONLY_DATA + virtual void OnRegister() override; +#endif + virtual void OnUnregister() override; + virtual void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction) override; + // End ActorComponent interface. + +#if WITH_EDITORONLY_DATA + void UpdateSpriteTexture(); +#endif + + // Settings for ambient volume effects + double InteriorLastUpdateTime; + float SourceInteriorVolume; + float SourceInteriorLPF; + float CurrentInteriorVolume; + float CurrentInteriorLPF; + + // Tempo and marker callbacks + FCriticalSection CallbackLock; + TArray CallbackMarkerQueue; + TArray CallbackBeatQueue; + + // Direct assignment of programmer sound from other C++ code + FMOD::Sound* ProgrammerSound; +}; + + diff --git a/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODBank.h b/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODBank.h new file mode 100644 index 0000000..a5ee262 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODBank.h @@ -0,0 +1,30 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#pragma once + +#include "FMODAsset.h" +#include "FMODBank.generated.h" + +/* Purely for doxygen generation */ +#ifdef GENERATE_DOX + #define UCLASS(...) + #define UPROPERTY(...) public: +#endif + +/** + * FMOD Bank Asset. + */ +UCLASS() +class FMODSTUDIO_API UFMODBank : public UFMODAsset +{ + GENERATED_UCLASS_BODY() + + /** Get tags to show in content view */ + virtual void GetAssetRegistryTags(TArray& OutTags) const override; + + /** Descriptive name */ + virtual FString GetDesc() override; + +}; + + diff --git a/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODBlueprintStatics.h b/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODBlueprintStatics.h new file mode 100644 index 0000000..f625773 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODBlueprintStatics.h @@ -0,0 +1,208 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#pragma once + +#include "UnrealString.h" +#include "FMODBlueprintStatics.generated.h" + +class UFMODAudioComponent; + +namespace FMOD +{ + namespace Studio + { + class EventDescription; + class EventInstance; + } +} + +class UFMODAsset; +class UFMODEvent; +class USceneComponent; + +USTRUCT() +struct FFMODEventInstance +{ + GENERATED_USTRUCT_BODY() + + FMOD::Studio::EventInstance* Instance; +}; + + +UCLASS() +class FMODSTUDIO_API UFMODBlueprintStatics : public UBlueprintFunctionLibrary +{ + GENERATED_UCLASS_BODY() + + /** Plays an event. This returns an FMOD Event Instance. The sound does not travel with any actor. + * @param Event - event to play + * @param bAutoPlay - Start the event automatically. + */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD", meta=(HidePin="WorldContextObject", DefaultToSelf="WorldContextObject", AdvancedDisplay = "2", bAutoPlay = "true", UnsafeDuringActorConstruction = "true")) + static FFMODEventInstance PlayEvent2D(UObject* WorldContextObject, UFMODEvent* Event, bool bAutoPlay); + + /** Plays an event at the given location. This returns an FMOD Event Instance. The sound does not travel with any actor. + * @param Event - event to play + * @param Location - World position to play event at + * @param bAutoPlay - Start the event automatically. + */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD", meta=(HidePin="WorldContextObject", DefaultToSelf="WorldContextObject", AdvancedDisplay = "2", bAutoPlay = "true", UnsafeDuringActorConstruction = "true")) + static FFMODEventInstance PlayEventAtLocation(UObject* WorldContextObject, UFMODEvent* Event, const FTransform& Location, bool bAutoPlay); + + /** Plays an event attached to and following the specified component. + * @param Event - event to play + * @param AttachComponent - Component to attach to. + * @param AttachPointName - Optional named point within the AttachComponent to play the sound at + * @param Location - Depending on the value of Location Type this is either a relative offset from the attach component/point or an absolute world position that will be translated to a relative offset + * @param LocationType - Specifies whether Location is a relative offset or an absolute world position + * @param bStopWhenAttachedToDestroyed - Specifies whether the sound should stop playing when the owner of the attach to component is destroyed. + * @param bAutoPlay - Start the event automatically. + */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD", meta=(AdvancedDisplay = "2", UnsafeDuringActorConstruction = "true", bAutoPlay = "true")) + static class UFMODAudioComponent* PlayEventAttached(UFMODEvent* Event, USceneComponent* AttachToComponent, FName AttachPointName, FVector Location, EAttachLocation::Type LocationType, bool bStopWhenAttachedToDestroyed, bool bAutoPlay); + + /** Find an asset by name. + * @param EventName - The asset name + */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD") + static UFMODAsset* FindAssetByName(const FString& Name); + + /** Find an event by name. + * @param EventName - The event name + */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD") + static UFMODEvent* FindEventByName(const FString& Name); + + /** Loads a bank. + * @param Bank - bank to load + * @param bBlocking - determines whether the bank will load synchronously + * @param bLoadSampleData - determines whether sample data will be preloaded immediately + */ + UFUNCTION(BlueprintCallable, Category = "Audio|FMOD", meta = (UnsafeDuringActorConstruction = "true")) + static void LoadBank(class UFMODBank* Bank, bool bBlocking, bool bLoadSampleData); + + /** Unloads a bank. + * @param Bank - bank to unload + */ + UFUNCTION(BlueprintCallable, Category = "Audio|FMOD", meta = (UnsafeDuringActorConstruction = "true")) + static void UnloadBank(class UFMODBank* Bank); + + /** Load bank sample data. + * @param Bank - bank to load sample data from + */ + UFUNCTION(BlueprintCallable, Category = "Audio|FMOD", meta = (UnsafeDuringActorConstruction = "true")) + static void LoadBankSampleData(class UFMODBank* Bank); + + /** Unload bank sample data. + * @param Bank - bank to unload sample data from + */ + UFUNCTION(BlueprintCallable, Category = "Audio|FMOD", meta = (UnsafeDuringActorConstruction = "true")) + static void UnloadBankSampleData(class UFMODBank* Bank); + + /** Load event sample data. This can be done ahead of time to avoid loading stalls. + * @param Event - event to load sample data from. + */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD", meta=(HidePin="WorldContextObject", DefaultToSelf="WorldContextObject", UnsafeDuringActorConstruction = "true")) + static void LoadEventSampleData(UObject* WorldContextObject, UFMODEvent* Event); + + /** Unload event sample data. + * @param Event - event to load sample data from. + */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD", meta=(HidePin="WorldContextObject", DefaultToSelf="WorldContextObject", UnsafeDuringActorConstruction = "true")) + static void UnloadEventSampleData(UObject* WorldContextObject, UFMODEvent* Event); + + /** Return a list of all event instances that are playing for this event. + Be careful using this function because it is possible to find and alter any playing sound, even ones owned by other audio components. + * @param Event - event to find instances from. + */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD", meta=(HidePin="WorldContextObject", DefaultToSelf="WorldContextObject", UnsafeDuringActorConstruction = "true")) + static TArray FindEventInstances(UObject* WorldContextObject, UFMODEvent* Event); + + /** Set fader level on a bus + * @param Bus - bus to use + * @param Level - fader level + */ + UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|Bus", meta = (UnsafeDuringActorConstruction = "true")) + static void BusSetFaderLevel(class UFMODBus* Bus, float Level); + + /** Pause/Unpause all events going through this bus + * @param Bus - bus to use + * @param bPaused - paused + */ + UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|Bus", meta = (UnsafeDuringActorConstruction = "true")) + static void BusSetPaused(class UFMODBus* Bus, bool bPaused); + + /** Mute/Unmute this bus + * @param Bus - bus to use + * @param bMute - mute + */ + UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|Bus", meta = (UnsafeDuringActorConstruction = "true")) + static void BusSetMute(class UFMODBus* Bus, bool bMute); + + /** Returns whether this FMOD Event Instance is valid. The instance will be invalidated when the sound stops. + * @param EventInstance - Event instance + */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD|EventInstance", meta = (UnsafeDuringActorConstruction = "true")) + static bool EventInstanceIsValid(FFMODEventInstance EventInstance); + + /** Set volume on an FMOD Event Instance. + * @param EventInstance - Event instance + * @param Value - Volume to set + */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD|EventInstance", meta = (UnsafeDuringActorConstruction = "true")) + static void EventInstanceSetVolume(FFMODEventInstance EventInstance, float Volume); + + /** Set pitch on an FMOD Event Instance. + * @param EventInstance - Event instance + * @param Value - Volume to set + */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD|EventInstance", meta = (UnsafeDuringActorConstruction = "true")) + static void EventInstanceSetPitch(FFMODEventInstance EventInstance, float Pitch); + + /** Pause/Unpause an FMOD Event Instance. + * @param EventInstance - Event instance + * @param Paused - Whether to pause or unpause + */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD|EventInstance", meta = (UnsafeDuringActorConstruction = "true")) + static void EventInstanceSetPaused(FFMODEventInstance EventInstance, bool Paused); + + /** Set a parameter on an FMOD Event Instance. + * @param EventInstance - Event instance + * @param Name - Name of parameter + * @param Value - Value of parameter + */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD|EventInstance", meta = (UnsafeDuringActorConstruction = "true")) + static void EventInstanceSetParameter(FFMODEventInstance EventInstance, FName Name, float Value); + + /** Get a parameter on an FMOD Event Instance. + * @param EventInstance - Event instance + * @param Name - Name of parameter + */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD|EventInstance", meta = (UnsafeDuringActorConstruction = "true")) + static float EventInstanceGetParameter(FFMODEventInstance EventInstance, FName Name); + + /** Plays a FMOD Event Instance. + * @param EventInstance - Event instance + */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD|EventInstance", meta = (UnsafeDuringActorConstruction = "true")) + static void EventInstancePlay(FFMODEventInstance EventInstance); + + /** Stops a FMOD Event Instance. + * @param EventInstance - Event instance + */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD|EventInstance", meta = (UnsafeDuringActorConstruction = "true")) + static void EventInstanceStop(FFMODEventInstance EventInstance); + + /** Trigger a cue on an FMOD Event Instance. + * @param EventInstance - Event instance + */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD|EventInstance", meta = (UnsafeDuringActorConstruction = "true")) + static void EventInstanceTriggerCue(FFMODEventInstance EventInstance); + + /** Set transform on an FMOD Event Instance. + * @param EventInstance - Event instance + * @param Location - Location to place event + */ + UFUNCTION(BlueprintCallable, Category="Audio|FMOD|EventInstance", meta = (UnsafeDuringActorConstruction = "true")) + static void EventInstanceSetTransform(FFMODEventInstance EventInstance, const FTransform& Location); +}; diff --git a/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODBus.h b/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODBus.h new file mode 100644 index 0000000..57139ea --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODBus.h @@ -0,0 +1,30 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#pragma once + +#include "FMODAsset.h" +#include "FMODBus.generated.h" + +/* Purely for doxygen generation */ +#ifdef GENERATE_DOX + #define UCLASS(...) + #define UPROPERTY(...) public: +#endif + +/** + * FMOD Bus Asset. + */ +UCLASS() +class FMODSTUDIO_API UFMODBus : public UFMODAsset +{ + GENERATED_UCLASS_BODY() + + /** Get tags to show in content view */ + virtual void GetAssetRegistryTags(TArray& OutTags) const override; + + /** Descriptive name */ + virtual FString GetDesc() override; + +}; + + diff --git a/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODEvent.h b/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODEvent.h new file mode 100644 index 0000000..157c653 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODEvent.h @@ -0,0 +1,30 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#pragma once + +#include "FMODAsset.h" +#include "FMODEvent.generated.h" + +/* Purely for doxygen generation */ +#ifdef GENERATE_DOX + #define UCLASS(...) + #define UPROPERTY(...) public: +#endif + +/** + * FMOD Event Asset. + */ +UCLASS() +class FMODSTUDIO_API UFMODEvent : public UFMODAsset +{ + GENERATED_UCLASS_BODY() + + /** Get tags to show in content view */ + virtual void GetAssetRegistryTags(TArray& OutTags) const override; + + /** Descriptive name */ + virtual FString GetDesc() override; + +}; + + diff --git a/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODSettings.h b/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODSettings.h new file mode 100644 index 0000000..6b91c58 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODSettings.h @@ -0,0 +1,157 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#pragma once + +#include "FMODSettings.generated.h" + +UENUM() +namespace EFMODSpeakerMode +{ + enum Type + { + // The speakers are stereo + Stereo, + // 5.1 speaker setup + Surround_5_1, + // 7.1 speaker setup + Surround_7_1 + }; +} + + +UCLASS(config = Engine, defaultconfig) +class FMODSTUDIO_API UFMODSettings : public UObject +{ + GENERATED_UCLASS_BODY() + +public: + + /** + * Whether to load all banks at startup. + */ + UPROPERTY(config, EditAnywhere, Category = Basic) + bool bLoadAllBanks; + + /** + * Whether to load all bank sample data into memory at startup. + */ + UPROPERTY(config, EditAnywhere, Category = Basic) + bool bLoadAllSampleData; + + /** + * Enable live update in non-final builds. + */ + UPROPERTY(config, EditAnywhere, Category = Basic) + bool bEnableLiveUpdate; + + /** + * Path to find your studio bank output directory, relative to Content directory. + */ + UPROPERTY(config, EditAnywhere, Category = Basic, meta=(RelativeToGameContentDir)) + FDirectoryPath BankOutputDirectory; + + /** Project Output Format, should match the mode set up for the Studio project. */ + UPROPERTY(config, EditAnywhere, Category = Basic) + TEnumAsByte OutputFormat; + + /** + * Whether to enable vol0virtual, which means voices with low volume will automatically go virtual to save CPU. + */ + UPROPERTY(config, EditAnywhere, Category = InitSettings) + bool bVol0Virtual; + + /** + * If vol0virtual is enabled, the signal level at which to make channels virtual. + */ + UPROPERTY(config, EditAnywhere, Category = InitSettings) + float Vol0VirtualLevel; + + /** + * Sample rate to use, or 0 to match system rate. + */ + UPROPERTY(config, EditAnywhere, Category = InitSettings) + int32 SampleRate; + + /** + * Number of actual software voices that can be used at once. + */ + UPROPERTY(config, EditAnywhere, Category = InitSettings) + int32 RealChannelCount; + + /** + * Total number of voices available that can be either real or virtual. + */ + UPROPERTY(config, EditAnywhere, Category = InitSettings) + int32 TotalChannelCount; + + /** + * DSP mixer buffer length, or 0 for system default. + */ + UPROPERTY(config, EditAnywhere, Category = InitSettings) + int32 DSPBufferLength; + + /** + * DSP mixer buffer count, or 0 for system default. + */ + UPROPERTY(config, EditAnywhere, Category = InitSettings) + int32 DSPBufferCount; + + /** + * Studio update period in milliseconds, or 0 for default (which means 20ms). + */ + UPROPERTY(config, EditAnywhere, Category = InitSettings) + int32 StudioUpdatePeriod; + + /** + * Live update port to use, or 0 for default. + */ + UPROPERTY(config, EditAnywhere, Category = Advanced) + int32 LiveUpdatePort; + + /** + * Extra plugin files to load. + * The plugin files should sit alongside the FMOD dynamic libraries in the ThirdParty directory. + */ + UPROPERTY(config, EditAnywhere, Category = Advanced) + TArray PluginFiles; + + /** + * Directory for content to appear in content window. Be careful changing this! + */ + UPROPERTY(config, EditAnywhere, Category = Advanced) + FString ContentBrowserPrefix; + + /** + * Force platform directory name, or leave empty for automatic (Desktop/Mobile/PS4/XBoxOne) + */ + UPROPERTY(config, EditAnywhere, Category = Advanced) + FString ForcePlatformName; + + /** + * Name of master bank. The default in Studio is "Master Bank". + */ + UPROPERTY(config, EditAnywhere, Category = Advanced) + FString MasterBankName; + + /** + * Skip bank files of the given name. + * Can be used to load all banks except for a certain set, such as localization banks. + */ + UPROPERTY(config, EditAnywhere, Category = Advanced) + FString SkipLoadBankName; + + /** Is the bank path set up . */ + bool IsBankPathSet() const { return !BankOutputDirectory.Path.IsEmpty(); } + + /** Get the full bank path. Uses the game's content directory as a base. */ + FString GetFullBankPath() const; + + /** Get the master bank path. */ + FString GetMasterBankPath() const; + + /** Get the master strings bank path. */ + FString GetMasterStringsBankPath() const; + + /** Get all banks in our bank directory excluding the master and strings bank. */ + void GetAllBankPaths(TArray& Paths, bool IncludeMasterBank=false) const; +}; diff --git a/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODSnapshot.h b/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODSnapshot.h new file mode 100644 index 0000000..e236ef5 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODSnapshot.h @@ -0,0 +1,27 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#pragma once + +#include "FMODEvent.h" +#include "FMODSnapshot.generated.h" + +/* Purely for doxygen generation */ +#ifdef GENERATE_DOX + #define UCLASS(...) + #define UPROPERTY(...) public: +#endif + +/** + * FMOD Snapshot Asset. + */ +UCLASS() +class FMODSTUDIO_API UFMODSnapshot : public UFMODEvent +{ + GENERATED_UCLASS_BODY() + + /** Descriptive name */ + virtual FString GetDesc() override; + +}; + + diff --git a/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODSnapshotReverb.h b/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODSnapshotReverb.h new file mode 100644 index 0000000..7636f6e --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODSnapshotReverb.h @@ -0,0 +1,34 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#pragma once + +#include "Sound/ReverbEffect.h" +#include "FMODSnapshotReverb.generated.h" + +/* Purely for doxygen generation */ +#ifdef GENERATE_DOX + #define UCLASS(...) + #define UPROPERTY(...) public: +#endif + +/** + * FMOD Event Asset. + */ +UCLASS() +class FMODSTUDIO_API UFMODSnapshotReverb : public UReverbEffect +{ + GENERATED_UCLASS_BODY() + + /** The unique Guid, which matches the one exported from FMOD Studio */ + UPROPERTY() + FGuid AssetGuid; + + /** Whether to show in the content window */ + UPROPERTY() + bool bShowAsAsset; + + /** Force this to be an asset */ + virtual bool IsAsset() const override { return bShowAsAsset; } +}; + + diff --git a/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODVCA.h b/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODVCA.h new file mode 100644 index 0000000..c767a15 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Classes/FMODVCA.h @@ -0,0 +1,30 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#pragma once + +#include "FMODAsset.h" +#include "FMODVCA.generated.h" + +/* Purely for doxygen generation */ +#ifdef GENERATE_DOX + #define UCLASS(...) + #define UPROPERTY(...) public: +#endif + +/** + * FMOD VCA Asset. + */ +UCLASS() +class FMODSTUDIO_API UFMODVCA : public UFMODAsset +{ + GENERATED_UCLASS_BODY() + + /** Get tags to show in content view */ + virtual void GetAssetRegistryTags(TArray& OutTags) const override; + + /** Descriptive name */ + virtual FString GetDesc() override; + +}; + + diff --git a/Plugins/FMODStudio/Source/FMODStudio/FMODStudio.Build.cs b/Plugins/FMODStudio/Source/FMODStudio/FMODStudio.Build.cs new file mode 100644 index 0000000..d6e7cef --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/FMODStudio.Build.cs @@ -0,0 +1,237 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +namespace UnrealBuildTool.Rules +{ + public class FMODStudio : ModuleRules + { + public FMODStudio(TargetInfo Target) + { + bFasterWithoutUnity = true; + + PublicIncludePaths.AddRange( + new string[] { + } + ); + + PrivateIncludePaths.AddRange( + new string[] { + "FMODStudio/Private", + "FMODStudio/Public/FMOD", + "FMODStudioOculus/Public", + } + ); + + PublicDependencyModuleNames.AddRange( + new string[] + { + "Core", + "CoreUObject", + "Engine", + "Projects" + } + ); + + PrivateDependencyModuleNames.AddRange( + new string[] + { + } + ); + + if (UEBuildConfiguration.bBuildEditor == true) + { + PrivateDependencyModuleNames.Add("AssetRegistry"); + PrivateDependencyModuleNames.Add("UnrealEd"); + } + + DynamicallyLoadedModuleNames.AddRange( + new string[] + { + } + ); + + string configName = ""; + + if (Target.Configuration != UnrealTargetConfiguration.Shipping) + { + configName = "L"; + Definitions.Add("FMODSTUDIO_LINK_LOGGING=1"); + } + else + { + configName = ""; + Definitions.Add("FMODSTUDIO_LINK_RELEASE=1"); + } + + string platformName = Target.Platform.ToString(); + + string platformMidName = ""; + string linkExtension = ""; + string dllExtension = ""; + string libPrefix = ""; + + // ModuleDirectory points to FMODStudio\source\FMODStudio, need to get back to binaries directory for our libs + string BasePath = System.IO.Path.Combine(ModuleDirectory, "../../Binaries", platformName); + + string copyThirdPartyPath = ""; + bool bDynamicLibraries = true; + + switch (Target.Platform) + { + case UnrealTargetPlatform.Win32: + linkExtension = "_vc.lib"; + dllExtension = ".dll"; + break; + case UnrealTargetPlatform.Win64: + platformMidName = "64"; + linkExtension = "_vc.lib"; + dllExtension = ".dll"; + break; + case UnrealTargetPlatform.Mac: + linkExtension = dllExtension = ".dylib"; + libPrefix = "lib"; + break; + case UnrealTargetPlatform.XboxOne: + linkExtension = "_vc.lib"; + dllExtension = ".dll"; + copyThirdPartyPath = "../XBoxOne"; // XBoxOne still doesn't seem to support plugins with .dlls + break; + case UnrealTargetPlatform.PS4: + linkExtension = "_stub.a"; + dllExtension = ".prx"; + libPrefix = "lib"; + break; + case UnrealTargetPlatform.Android: + linkExtension = dllExtension = ".so"; + libPrefix = "lib"; + WriteAndroidDeploy(System.IO.Path.Combine(BasePath, "deploy.txt"), configName); + break; + case UnrealTargetPlatform.IOS: + linkExtension = "_iphoneos.a"; + libPrefix = "lib"; + bDynamicLibraries = false; + break; + case UnrealTargetPlatform.Linux: + BasePath = System.IO.Path.Combine(BasePath, "x86_64"); + linkExtension = ".so"; + dllExtension = ".so"; + libPrefix = "lib"; + break; + case UnrealTargetPlatform.WinRT: + case UnrealTargetPlatform.WinRT_ARM: + case UnrealTargetPlatform.HTML5: + //extName = ".a"; + throw new System.Exception(System.String.Format("Unsupported platform {0}", Target.Platform.ToString())); + //break; + } + + //System.Console.WriteLine("FMOD Current path: " + System.IO.Path.GetFullPath(".")); + //System.Console.WriteLine("FMOD Base path: " + BasePath); + + PublicLibraryPaths.Add(BasePath); + + string fmodLibName = System.String.Format("{0}fmod{1}{2}{3}", libPrefix, configName, platformMidName, linkExtension); + string fmodStudioLibName = System.String.Format("{0}fmodstudio{1}{2}{3}", libPrefix, configName, platformMidName, linkExtension); + + string fmodDllName = System.String.Format("{0}fmod{1}{2}{3}", libPrefix, configName, platformMidName, dllExtension); + string fmodStudioDllName = System.String.Format("{0}fmodstudio{1}{2}{3}", libPrefix, configName, platformMidName, dllExtension); + + string fmodLibPath = System.IO.Path.Combine(BasePath, fmodLibName); + string fmodStudioLibPath = System.IO.Path.Combine(BasePath, fmodStudioLibName); + + string fmodDllPath = System.IO.Path.Combine(BasePath, fmodDllName); + string fmodStudioDllPath = System.IO.Path.Combine(BasePath, fmodStudioDllName); + + System.Collections.Generic.List plugins = GetPlugins(BasePath); + + PublicAdditionalLibraries.Add(fmodLibPath); + PublicAdditionalLibraries.Add(fmodStudioLibPath); + if (bDynamicLibraries) + { + RuntimeDependencies.Add(new RuntimeDependency(fmodDllPath)); + RuntimeDependencies.Add(new RuntimeDependency(fmodStudioDllPath)); + foreach (string plugin in plugins) + { + string pluginPath = System.IO.Path.Combine(BasePath, plugin + dllExtension); + System.Console.WriteLine("Adding reference to FMOD plugin: " + pluginPath); + RuntimeDependencies.Add(new RuntimeDependency(pluginPath)); + } + } + + if (copyThirdPartyPath.Length != 0) + { + string destPath = System.IO.Path.Combine(UEBuildConfiguration.UEThirdPartyBinariesDirectory, copyThirdPartyPath); + System.IO.Directory.CreateDirectory(destPath); + + string fmodDllDest = System.IO.Path.Combine(destPath, fmodDllName); + string fmodStudioDllDest = System.IO.Path.Combine(destPath, fmodStudioDllName); + + CopyFile(fmodDllPath, fmodDllDest); + CopyFile(fmodStudioDllPath, fmodStudioDllDest); + } + + + if (Target.Platform == UnrealTargetPlatform.Win32 || Target.Platform == UnrealTargetPlatform.Win64 || Target.Platform == UnrealTargetPlatform.XboxOne) + { + PublicDelayLoadDLLs.AddRange( + new string[] { + fmodDllName, + fmodStudioDllName + } + ); + } + } + + private void CopyFile(string source, string dest) + { + //System.Console.WriteLine("Copying {0} to {1}", source, dest); + if (System.IO.File.Exists(dest)) + { + System.IO.File.SetAttributes(dest, System.IO.File.GetAttributes(dest) & ~System.IO.FileAttributes.ReadOnly); + } + try + { + System.IO.File.Copy(source, dest, true); + } + catch (System.Exception ex) + { + System.Console.WriteLine("Failed to copy file: {0}", ex.Message); + } + } + + private void WriteAndroidDeploy(string fileName, string configLetter) + { + string[] contents = new string[] + { + "fmod.jar", + System.String.Format("libfmod{0}.so", configLetter), + System.String.Format("libfmodstudio{0}.so", configLetter) + }; + System.IO.File.WriteAllLines(fileName, contents); + } + + private System.Collections.Generic.List GetPlugins(string BasePath) + { + System.Collections.Generic.List AllPlugins = new System.Collections.Generic.List(); + string PluginListName = System.IO.Path.Combine(BasePath, "plugins.txt"); + if (System.IO.File.Exists(PluginListName)) + { + try + { + foreach (string FullEntry in System.IO.File.ReadAllLines(PluginListName)) + { + string Entry = FullEntry.Trim(); + if (Entry.Length > 0) + { + AllPlugins.Add(Entry); + } + } + } + catch (System.Exception ex) + { + System.Console.WriteLine("Failed to read plugin list file: {0}", ex.Message); + } + } + return AllPlugins; + } + } +} \ No newline at end of file diff --git a/Plugins/FMODStudio/Source/FMODStudio/Private/FMODAmbientSound.cpp b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODAmbientSound.cpp new file mode 100644 index 0000000..a76f4e9 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODAmbientSound.cpp @@ -0,0 +1,65 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#include "FMODStudioPrivatePCH.h" +#include "FMODAmbientSound.h" +#include "FMODEvent.h" +#include "MessageLog.h" +#include "UObjectToken.h" +#include "MapErrors.h" + +#define LOCTEXT_NAMESPACE "FMODAmbientSound" + +AFMODAmbientSound::AFMODAmbientSound(const FObjectInitializer& ObjectInitializer) + : Super(ObjectInitializer) +{ + AudioComponent = ObjectInitializer.CreateDefaultSubobject(this, TEXT("FMODAudioComponent0")); + + AudioComponent->bAutoActivate = true; + AudioComponent->bStopWhenOwnerDestroyed = true; + AudioComponent->Mobility = EComponentMobility::Movable; + + RootComponent = AudioComponent; + + bReplicates = false; + bHidden = true; + bCanBeDamaged = false; +} + +#if WITH_EDITOR + +void AFMODAmbientSound::CheckForErrors( void ) +{ + Super::CheckForErrors(); + + if (!AudioComponent) + { + FFormatNamedArguments Arguments; + Arguments.Add(TEXT("ActorName"), FText::FromString(GetName())); + FMessageLog("MapCheck").Warning() + ->AddToken(FUObjectToken::Create(this)) + ->AddToken(FTextToken::Create(FText::Format( LOCTEXT( "MapCheck_Message_AudioComponentNull", "{ActorName} : Ambient sound actor has NULL AudioComponent property - please delete" ), Arguments ) )) + ->AddToken(FMapErrorToken::Create(FMapErrors::AudioComponentNull)); + } + else if (AudioComponent->Event == NULL) + { + FFormatNamedArguments Arguments; + Arguments.Add(TEXT("ActorName"), FText::FromString(GetName())); + FMessageLog("MapCheck").Warning() + ->AddToken(FUObjectToken::Create(this)) + ->AddToken(FTextToken::Create(FText::Format( LOCTEXT( "MapCheck_Message_EventNull", "{ActorName} : Ambient sound actor has NULL Event property" ), Arguments ) )) + ->AddToken(FMapErrorToken::Create(FMapErrors::SoundCueNull)); + } +} + +bool AFMODAmbientSound::GetReferencedContentObjects( TArray& Objects ) const +{ + if (AudioComponent->Event) + { + Objects.Add(AudioComponent->Event.Get()); + } + return true; +} + +#endif + +#undef LOCTEXT_NAMESPACE \ No newline at end of file diff --git a/Plugins/FMODStudio/Source/FMODStudio/Private/FMODAsset.cpp b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODAsset.cpp new file mode 100644 index 0000000..204efbb --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODAsset.cpp @@ -0,0 +1,27 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#include "FMODStudioPrivatePCH.h" +#include "FMODAsset.h" +#include "FMODStudioModule.h" + +static const TCHAR* FMODAssetTypeStrings[] = +{ + TEXT("Bank"), + TEXT("Event"), + TEXT("VCA"), + TEXT("Bus"), + TEXT("Invalid") +}; + +UFMODAsset::UFMODAsset(const FObjectInitializer& ObjectInitializer) + : Super(ObjectInitializer) +{ +} + +/** Get tags to show in content view */ +void UFMODAsset::GetAssetRegistryTags(TArray& OutTags) const +{ + Super::GetAssetRegistryTags(OutTags); + OutTags.Add(UObject::FAssetRegistryTag("Guid", AssetGuid.ToString(EGuidFormats::DigitsWithHyphensInBraces), UObject::FAssetRegistryTag::TT_Alphabetical)); +} + diff --git a/Plugins/FMODStudio/Source/FMODStudio/Private/FMODAssetTable.cpp b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODAssetTable.cpp new file mode 100644 index 0000000..c40b6c7 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODAssetTable.cpp @@ -0,0 +1,274 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#include "FMODStudioPrivatePCH.h" +#include "FMODAssetTable.h" +#include "FMODEvent.h" +#include "FMODSnapshot.h" +#include "FMODSnapshotReverb.h" +#include "FMODBank.h" +#include "FMODBus.h" +#include "FMODVCA.h" +#include "FMODUtils.h" +#include "FMODSettings.h" +#include "FMODFileCallbacks.h" +#include "fmod_studio.hpp" + +#if WITH_EDITOR +#include "AssetRegistryModule.h" +#endif + +FFMODAssetTable::FFMODAssetTable() +: StudioSystem(nullptr) +{ +} + +FFMODAssetTable::~FFMODAssetTable() +{ + Destroy(); +} + +void FFMODAssetTable::Create() +{ + Destroy(); + + // Create a sandbox system purely for loading and considering banks + verifyfmod(FMOD::Studio::System::create(&StudioSystem)); + FMOD::System* lowLevelSystem = nullptr; + verifyfmod(StudioSystem->getLowLevelSystem(&lowLevelSystem)); + verifyfmod(lowLevelSystem->setOutput(FMOD_OUTPUTTYPE_NOSOUND)); + verifyfmod(lowLevelSystem->setFileSystem(FMODOpen, FMODClose, FMODRead, FMODSeek, 0, 0, 2048)); + verifyfmod(StudioSystem->initialize(1, FMOD_STUDIO_INIT_ALLOW_MISSING_PLUGINS, FMOD_INIT_NORMAL, 0)); +} + +void FFMODAssetTable::Destroy() +{ + if (StudioSystem != nullptr) + { + verifyfmod(StudioSystem->release()); + } + StudioSystem = nullptr; +} + +UFMODAsset* FFMODAssetTable::FindByName(const FString& Name) +{ + TWeakObjectPtr* FoundAsset = FullNameLookup.Find(Name); + if (FoundAsset) + { + return FoundAsset->Get(); + } + return nullptr; +} + +void FFMODAssetTable::Refresh() +{ + if (StudioSystem == nullptr) + { + return; + } + + const UFMODSettings& Settings = *GetDefault(); + FString StringPath = Settings.GetMasterStringsBankPath(); + + UE_LOG(LogFMOD, Log, TEXT("Loading strings bank: %s"), *StringPath); + + FMOD::Studio::Bank* StudioStringBank; + FMOD_RESULT StringResult = StudioSystem->loadBankFile(TCHAR_TO_UTF8(*StringPath), FMOD_STUDIO_LOAD_BANK_NORMAL, &StudioStringBank); + if (StringResult == FMOD_OK) + { + TArray RawBuffer; + RawBuffer.SetNum(256); // Initial capacity + + int Count = 0; + verifyfmod(StudioStringBank->getStringCount(&Count)); + for (int StringIdx=0; StringIdxgetStringInfo(StringIdx, &Guid, RawBuffer.GetData(), RawBuffer.Num(), &ActualSize); + if (Result == FMOD_ERR_TRUNCATED) + { + RawBuffer.SetNum(ActualSize); + } + else + { + break; + } + } + verifyfmod(Result); + FString AssetName(UTF8_TO_TCHAR(RawBuffer.GetData())); + FGuid AssetGuid = FMODUtils::ConvertGuid(Guid); + if (!AssetName.IsEmpty()) + { + AddAsset(AssetGuid, AssetName); + } + } + verifyfmod(StudioStringBank->unload()); + verifyfmod(StudioSystem->update()); + } + else + { + UE_LOG(LogFMOD, Warning, TEXT("Failed to load strings bank: %s"), *StringPath); + } +} + +void FFMODAssetTable::AddAsset(const FGuid& AssetGuid, const FString& AssetFullName) +{ + FString AssetPath = AssetFullName; + FString AssetType = ""; + FString AssetShortName = "asset"; + + int DelimIndex; + if (AssetPath.FindChar(':', DelimIndex)) + { + AssetType = AssetPath.Left(DelimIndex); + AssetPath = AssetPath.Right(AssetPath.Len() - DelimIndex - 1); + } + + FString FormattedAssetType = ""; + UClass* AssetClass = UFMODAsset::StaticClass(); + if (AssetType.Equals(TEXT("event"))) + { + FormattedAssetType = TEXT("Events"); + AssetClass = UFMODEvent::StaticClass(); + } + else if (AssetType.Equals(TEXT("snapshot"))) + { + FormattedAssetType = TEXT("Snapshots"); + AssetClass = UFMODSnapshot::StaticClass(); + } + else if (AssetType.Equals(TEXT("bank"))) + { + FormattedAssetType = TEXT("Banks"); + AssetClass = UFMODBank::StaticClass(); + } + else if (AssetType.Equals(TEXT("bus"))) + { + FormattedAssetType = TEXT("Buses"); + AssetClass = UFMODBus::StaticClass(); + } + else if (AssetType.Equals(TEXT("vca"))) + { + FormattedAssetType = TEXT("VCAs"); + AssetClass = UFMODVCA::StaticClass(); + } + else + { + UE_LOG(LogFMOD, Warning, TEXT("Unknown asset type: %s"), *AssetType); + } + + if (AssetPath.FindLastChar('/', DelimIndex)) + { + AssetShortName = AssetPath.Right(AssetPath.Len() - DelimIndex - 1); + AssetPath = AssetPath.Left(AssetPath.Len() - AssetShortName.Len() - 1); + } + else + { + // No path part, all name + AssetShortName = AssetPath; + AssetPath = TEXT(""); + } + + if (AssetShortName.IsEmpty() || AssetShortName.Contains(TEXT(".strings"))) + { + UE_LOG(LogFMOD, Log, TEXT("Skipping asset: %s"), *AssetFullName); + return; + } + + AssetPath = AssetPath.Replace(TEXT(" "), TEXT("_")); + AssetShortName = AssetShortName.Replace(TEXT(" "), TEXT("_")); + + const UFMODSettings& Settings = *GetDefault(); + + FString FolderPath = Settings.ContentBrowserPrefix; + FolderPath += FormattedAssetType; + FolderPath += AssetPath; + + FString AssetPackagePath = FolderPath + TEXT("/") + AssetShortName; + + FName AssetPackagePathName(*AssetPackagePath); + + TWeakObjectPtr& ExistingNameAsset = NameMap.FindOrAdd(AssetPackagePathName); + TWeakObjectPtr& ExistingGuidAsset = GuidMap.FindOrAdd(AssetGuid); + TWeakObjectPtr& ExistingFullNameLookupAsset = FullNameLookup.FindOrAdd(AssetFullName); + + UFMODAsset* AssetNameObject = ExistingNameAsset.Get(); + if (AssetNameObject == nullptr) + { + UE_LOG(LogFMOD, Log, TEXT("Constructing asset: %s"), *AssetPackagePath); + + UPackage* NewPackage = CreatePackage(NULL, *AssetPackagePath); + if (NewPackage) + { +#if ENGINE_MINOR_VERSION >= 10 + NewPackage->SetPackageFlags(PKG_CompiledIn); +#else + NewPackage->PackageFlags |= PKG_CompiledIn; +#endif + + AssetNameObject = NewObject(NewPackage, AssetClass, FName(*AssetShortName), RF_Standalone | RF_Public /* | RF_Transient */); + AssetNameObject->AssetGuid = AssetGuid; + AssetNameObject->bShowAsAsset = true; + +#if WITH_EDITOR + FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked(TEXT("AssetRegistry")); + AssetRegistryModule.Get().AddPath(*FolderPath); + FAssetRegistryModule::AssetCreated(AssetNameObject); +#endif + } + else + { + UE_LOG(LogFMOD, Warning, TEXT("Failed to construct package for asset %s"), *AssetPackagePath); + } + + if (AssetClass == UFMODSnapshot::StaticClass()) + { + FString ReverbFolderPath = Settings.ContentBrowserPrefix; + ReverbFolderPath += TEXT("Reverbs"); + ReverbFolderPath += AssetPath; + + FString ReverbAssetPackagePath = ReverbFolderPath + TEXT("/") + AssetShortName; + + UPackage* ReverbPackage = CreatePackage(NULL, *ReverbAssetPackagePath); + if (ReverbPackage) + { +#if ENGINE_MINOR_VERSION >= 10 + ReverbPackage->SetPackageFlags(PKG_CompiledIn); +#else + ReverbPackage->PackageFlags |= PKG_CompiledIn; +#endif + UFMODSnapshotReverb* AssetReverb = NewObject(ReverbPackage, UFMODSnapshotReverb::StaticClass(), FName(*AssetShortName), RF_Standalone | RF_Public /* | RF_Transient */); + AssetReverb->AssetGuid = AssetGuid; + AssetReverb->bShowAsAsset = true; + +#if WITH_EDITOR + FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked(TEXT("AssetRegistry")); + AssetRegistryModule.Get().AddPath(*ReverbFolderPath); + FAssetRegistryModule::AssetCreated(AssetReverb); +#endif + + } + } + } + + UFMODAsset* AssetGuidObject = ExistingGuidAsset.Get(); + if (AssetGuidObject != nullptr && AssetGuidObject != AssetNameObject) + { + FString OldPath = AssetGuidObject->GetPathName(); + UE_LOG(LogFMOD, Log, TEXT("Hiding old asset '%s'"), *OldPath); + + // We had an asset with the same guid but it must have been renamed + // We just hide the old asset from the asset table + AssetGuidObject->bShowAsAsset = false; + +#if WITH_EDITOR + FAssetRegistryModule::AssetRenamed(AssetNameObject, OldPath); +#endif + } + + ExistingNameAsset = AssetNameObject; + ExistingGuidAsset = AssetNameObject; + ExistingFullNameLookupAsset = AssetNameObject; +} diff --git a/Plugins/FMODStudio/Source/FMODStudio/Private/FMODAssetTable.h b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODAssetTable.h new file mode 100644 index 0000000..ca4d175 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODAssetTable.h @@ -0,0 +1,39 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#pragma once + +#include "FMODAsset.h" + +namespace FMOD +{ + namespace Studio + { + class System; + } +} + +class FFMODAssetTable +{ +public: + FFMODAssetTable(); + ~FFMODAssetTable(); + + void Create(); + void Destroy(); + + void Refresh(); + + UFMODAsset* FindByName(const FString& Name); + +private: + + void HandleBanksUpdated(); + void AddAsset(const FGuid& AssetGuid, const FString& AssetFullName); + +private: + FMOD::Studio::System* StudioSystem; + TMap< FGuid, TWeakObjectPtr > GuidMap; + TMap< FName, TWeakObjectPtr > NameMap; + TMap< FString, TWeakObjectPtr > FullNameLookup; +}; + diff --git a/Plugins/FMODStudio/Source/FMODStudio/Private/FMODAudioComponent.cpp b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODAudioComponent.cpp new file mode 100644 index 0000000..7e0178c --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODAudioComponent.cpp @@ -0,0 +1,647 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#include "FMODStudioPrivatePCH.h" +#include "FMODAudioComponent.h" +#include "FMODStudioModule.h" +#include "FMODUtils.h" +#include "FMODEvent.h" +#include "FMODListener.h" +#include "fmod_studio.hpp" + +UFMODAudioComponent::UFMODAudioComponent(const FObjectInitializer& ObjectInitializer) + : Super(ObjectInitializer) +{ + bAutoDestroy = false; + bAutoActivate = true; + bEnableTimelineCallbacks = false; // Default OFF for efficiency + bStopWhenOwnerDestroyed = true; + bNeverNeedsRenderUpdate = true; +#if WITH_EDITORONLY_DATA + bVisualizeComponent = true; +#endif + bApplyAmbientVolumes = false; + + PrimaryComponentTick.bCanEverTick = true; + PrimaryComponentTick.TickGroup = TG_PrePhysics; + + StudioInstance = nullptr; + ProgrammerSound = nullptr; + + InteriorLastUpdateTime = 0.0; + SourceInteriorVolume = 0.0f; + SourceInteriorLPF = 0.0f; + CurrentInteriorVolume = 0.0f; + CurrentInteriorLPF = 0.0f; +} + +FString UFMODAudioComponent::GetDetailedInfoInternal(void) const +{ + FString Result; + + if(Event) + { + Result = Event->GetPathName(NULL); + } + else + { + Result = TEXT("No_Event"); + } + + return Result; +} + +#if WITH_EDITORONLY_DATA +void UFMODAudioComponent::OnRegister() +{ + Super::OnRegister(); + + UpdateSpriteTexture(); +} + +void UFMODAudioComponent::UpdateSpriteTexture() +{ + if (SpriteComponent) + { + if (bAutoActivate) + { + SpriteComponent->SetSprite(LoadObject(NULL, TEXT("/Engine/EditorResources/AudioIcons/S_AudioComponent_AutoActivate.S_AudioComponent_AutoActivate"))); + } + else + { + SpriteComponent->SetSprite(LoadObject(NULL, TEXT("/Engine/EditorResources/AudioIcons/S_AudioComponent.S_AudioComponent"))); + } + } +} +#endif + +#if WITH_EDITOR +void UFMODAudioComponent::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) +{ + if (IsPlaying()) + { + Stop(); + Play(); + } + +#if WITH_EDITORONLY_DATA + UpdateSpriteTexture(); +#endif + + Super::PostEditChangeProperty(PropertyChangedEvent); +} +#endif // WITH_EDITOR + +#if ENGINE_MINOR_VERSION >= 9 +void UFMODAudioComponent::OnUpdateTransform(bool bSkipPhysicsMove, ETeleportType Teleport) +#else +void UFMODAudioComponent::OnUpdateTransform(bool bSkipPhysicsMove) +#endif +{ + Super::OnUpdateTransform(bSkipPhysicsMove); + if (StudioInstance) + { + FMOD_3D_ATTRIBUTES attr = {{0}}; + attr.position = FMODUtils::ConvertWorldVector(ComponentToWorld.GetLocation()); + attr.up = FMODUtils::ConvertUnitVector(ComponentToWorld.GetUnitAxis(EAxis::Z)); + attr.forward = FMODUtils::ConvertUnitVector(ComponentToWorld.GetUnitAxis(EAxis::X)); + + StudioInstance->set3DAttributes(&attr); + + if (bApplyAmbientVolumes) + { + UpdateInteriorVolumes(); + } + } +} + +// Taken mostly from ActiveSound.cpp +void UFMODAudioComponent::UpdateInteriorVolumes() +{ + // Result of the ambient calculations to apply to the instance + float AmbientVolumeMultiplier = 1.0f; + float AmbientHighFrequencyGain = 1.0f; + + FInteriorSettings Ambient; + const FVector& Location = GetOwner()->GetTransform().GetTranslation(); + AAudioVolume* AudioVolume = GetWorld()->GetAudioSettings(Location, NULL, &Ambient); + + const FFMODListener& Listener = IFMODStudioModule::Get().GetNearestListener(Location); + if( InteriorLastUpdateTime < Listener.InteriorStartTime ) + { + SourceInteriorVolume = CurrentInteriorVolume; + SourceInteriorLPF = CurrentInteriorLPF; + InteriorLastUpdateTime = FApp::GetCurrentTime(); + } + + + bool bAllowSpatialization = true; + if( Listener.Volume == AudioVolume || !bAllowSpatialization ) + { + // Ambient and listener in same ambient zone + CurrentInteriorVolume = ( SourceInteriorVolume * ( 1.0f - Listener.InteriorVolumeInterp ) ) + Listener.InteriorVolumeInterp; + AmbientVolumeMultiplier *= CurrentInteriorVolume; + + CurrentInteriorLPF = ( SourceInteriorLPF * ( 1.0f - Listener.InteriorLPFInterp ) ) + Listener.InteriorLPFInterp; + AmbientHighFrequencyGain *= CurrentInteriorLPF; + + //UE_LOG(LogFMOD, Verbose, TEXT( "Ambient in same volume. Volume *= %g LPF *= %g" ), CurrentInteriorVolume, CurrentInteriorLPF); + } + else + { + // Ambient and listener in different ambient zone + if( Ambient.bIsWorldSettings ) + { + // The ambient sound is 'outside' - use the listener's exterior volume + CurrentInteriorVolume = ( SourceInteriorVolume * ( 1.0f - Listener.ExteriorVolumeInterp ) ) + ( Listener.InteriorSettings.ExteriorVolume * Listener.ExteriorVolumeInterp ); + AmbientVolumeMultiplier *= CurrentInteriorVolume; + + CurrentInteriorLPF = ( SourceInteriorLPF * ( 1.0f - Listener.ExteriorLPFInterp ) ) + ( Listener.InteriorSettings.ExteriorLPF * Listener.ExteriorLPFInterp ); + AmbientHighFrequencyGain *= CurrentInteriorLPF; + + //UE_LOG(LogFMOD, Verbose, TEXT( "Ambient in diff volume, ambient outside. Volume *= %g LPF *= %g" ), CurrentInteriorVolume, CurrentInteriorLPF); + } + else + { + // The ambient sound is 'inside' - use the ambient sound's interior volume multiplied with the listeners exterior volume + CurrentInteriorVolume = (( SourceInteriorVolume * ( 1.0f - Listener.InteriorVolumeInterp ) ) + ( Ambient.InteriorVolume * Listener.InteriorVolumeInterp )) + * (( SourceInteriorVolume * ( 1.0f - Listener.ExteriorVolumeInterp ) ) + ( Listener.InteriorSettings.ExteriorVolume * Listener.ExteriorVolumeInterp )); + AmbientVolumeMultiplier *= CurrentInteriorVolume; + + CurrentInteriorLPF = (( SourceInteriorLPF * ( 1.0f - Listener.InteriorLPFInterp ) ) + ( Ambient.InteriorLPF * Listener.InteriorLPFInterp )) + * (( SourceInteriorLPF * ( 1.0f - Listener.ExteriorLPFInterp ) ) + ( Listener.InteriorSettings.ExteriorLPF * Listener.ExteriorLPFInterp )); + AmbientHighFrequencyGain *= CurrentInteriorLPF; + + //UE_LOG(LogFMOD, Verbose, TEXT( "Ambient in diff volume, ambient inside. Volume *= %g LPF *= %g" ), CurrentInteriorVolume, CurrentInteriorLPF); + } + } + + StudioInstance->setVolume(AmbientVolumeMultiplier); + + FMOD::ChannelGroup* ChanGroup = nullptr; + StudioInstance->getChannelGroup(&ChanGroup); + if (ChanGroup) + { + int NumDSP = 0; + ChanGroup->getNumDSPs(&NumDSP); + for (int Index=0; IndexgetDSP(Index, &ChanDSP); + if (ChanDSP) + { + FMOD_DSP_TYPE DSPType = FMOD_DSP_TYPE_UNKNOWN; + ChanDSP->getType(&DSPType); + if (DSPType == FMOD_DSP_TYPE_LOWPASS || DSPType == FMOD_DSP_TYPE_LOWPASS_SIMPLE) + { + static float MAX_FREQUENCY = 8000.0f; + float Frequency = MAX_FREQUENCY * AmbientHighFrequencyGain; + ChanDSP->setParameterFloat(FMOD_DSP_LOWPASS_CUTOFF, MAX_FREQUENCY * AmbientHighFrequencyGain); + break; + } + } + } + } +} + +void UFMODAudioComponent::OnUnregister() +{ + // Route OnUnregister event. + Super::OnUnregister(); + + // Don't stop audio and clean up component if owner has been destroyed (default behaviour). This function gets + // called from AActor::ClearComponents when an actor gets destroyed which is not usually what we want for one- + // shot sounds. + AActor* Owner = GetOwner(); + if (!Owner || bStopWhenOwnerDestroyed ) + { + Stop(); + } + + if (StudioInstance) + { + StudioInstance->setCallback(nullptr); + StudioInstance->release(); + StudioInstance = nullptr; + } +} + +void UFMODAudioComponent::TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction) +{ + Super::TickComponent(DeltaTime, TickType, ThisTickFunction); + + if (bIsActive) + { + if (bApplyAmbientVolumes && IFMODStudioModule::Get().HasListenerMoved()) + { + UpdateInteriorVolumes(); + } + + TArray LocalMarkerQueue; + TArray LocalBeatQueue; + { + FScopeLock Lock(&CallbackLock); + Swap(LocalMarkerQueue, CallbackMarkerQueue); + Swap(LocalBeatQueue, CallbackBeatQueue); + } + + for(const FTimelineMarkerProperties& EachProps : LocalMarkerQueue) + { + OnTimelineMarker.Broadcast(EachProps.Name, EachProps.Position); + } + for(const FTimelineBeatProperties& EachProps : LocalBeatQueue) + { + OnTimelineBeat.Broadcast(EachProps.Bar, EachProps.Beat, EachProps.Position, EachProps.Tempo, EachProps.TimeSignatureUpper, EachProps.TimeSignatureLower); + } + + FMOD_STUDIO_PLAYBACK_STATE state = FMOD_STUDIO_PLAYBACK_STOPPED; + StudioInstance->getPlaybackState(&state); + if (state == FMOD_STUDIO_PLAYBACK_STOPPED) + { + OnPlaybackCompleted(); + } + } +} + +void UFMODAudioComponent::SetEvent(UFMODEvent* NewEvent) +{ + const bool bPlay = IsPlaying(); + + Stop(); + Event = NewEvent; + + if (bPlay) + { + Play(); + } +} + +void UFMODAudioComponent::PostLoad() +{ + Super::PostLoad(); +} + +void UFMODAudioComponent::Activate(bool bReset) +{ + if (bReset || ShouldActivate()==true) + { + Play(); + } +} + +void UFMODAudioComponent::Deactivate() +{ + if (ShouldActivate()==false) + { + Stop(); + } +} + +FMOD_RESULT F_CALLBACK UFMODAudioComponent_EventCallback(FMOD_STUDIO_EVENT_CALLBACK_TYPE type, FMOD_STUDIO_EVENTINSTANCE *event, void *parameters) +{ + UFMODAudioComponent* Component = nullptr; + FMOD::Studio::EventInstance* Instance = (FMOD::Studio::EventInstance*)event; + if (Instance->getUserData((void**)&Component) == FMOD_OK && Component != nullptr) + { + if (type == FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_MARKER && Component->bEnableTimelineCallbacks) + { + Component->EventCallbackAddMarker((FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES*)parameters); + } + else if (type == FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_BEAT && Component->bEnableTimelineCallbacks) + { + Component->EventCallbackAddBeat((FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES*)parameters); + } + else if (type == FMOD_STUDIO_EVENT_CALLBACK_CREATE_PROGRAMMER_SOUND) + { + Component->EventCallbackCreateProgrammerSound((FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES*)parameters); + } + else if (type == FMOD_STUDIO_EVENT_CALLBACK_DESTROY_PROGRAMMER_SOUND) + { + Component->EventCallbackDestroyProgrammerSound((FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES*)parameters); + } + } + return FMOD_OK; +} + +void UFMODAudioComponent::EventCallbackAddMarker(FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES* props) +{ + FScopeLock Lock(&CallbackLock); + FTimelineMarkerProperties info; + info.Name = props->name; + info.Position = props->position; + CallbackMarkerQueue.Push(info); +} + +void UFMODAudioComponent::EventCallbackAddBeat(FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES* props) +{ + FScopeLock Lock(&CallbackLock); + FTimelineBeatProperties info; + info.Bar = props->bar; + info.Beat = props->beat; + info.Position = props->position; + info.Tempo = props->tempo; + info.TimeSignatureUpper = props->timeSignatureUpper; + info.TimeSignatureLower = props->timeSignatureLower; + CallbackBeatQueue.Push(info); +} + +void UFMODAudioComponent::EventCallbackCreateProgrammerSound(FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES* props) +{ + // Make sure name isn't being changed as we are reading it + FString ProgrammerSoundNameCopy; + { + FScopeLock Lock(&CallbackLock); + ProgrammerSoundNameCopy = ProgrammerSoundName; + } + + if (ProgrammerSound) + { + props->sound = (FMOD_SOUND*)ProgrammerSound; + props->subsoundIndex = -1; + } + else if (ProgrammerSoundNameCopy.Len() || strlen(props->name) != 0) + { + FMOD::Studio::System* System = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime); + FMOD::System* LowLevelSystem = nullptr; + System->getLowLevelSystem(&LowLevelSystem); + FString SoundName = ProgrammerSoundNameCopy.Len() ? ProgrammerSoundNameCopy : UTF8_TO_TCHAR(props->name); + + if (SoundName.Contains(TEXT("."))) + { + // Load via file + FString SoundPath = SoundName; + if (FPaths::IsRelative(SoundPath)) + { + SoundPath = FPaths::GameContentDir() / SoundPath; + } + + FMOD::Sound* Sound = nullptr; + if (LowLevelSystem->createSound(TCHAR_TO_UTF8(*SoundPath), FMOD_DEFAULT, nullptr, &Sound) == FMOD_OK) + { + UE_LOG(LogFMOD, Verbose, TEXT("Creating programmer sound from file '%s'"), *SoundPath); + props->sound = (FMOD_SOUND*)Sound; + props->subsoundIndex = -1; + } + else + { + UE_LOG(LogFMOD, Warning, TEXT("Failed to load programmer sound file '%s'"), *SoundPath); + } + } + else + { + // Load via FMOD Studio asset table + FMOD_STUDIO_SOUND_INFO SoundInfo = {0}; + FMOD_RESULT Result = System->getSoundInfo(TCHAR_TO_UTF8(*SoundName), &SoundInfo); + if (Result == FMOD_OK) + { + FMOD::Sound* Sound = nullptr; + Result = LowLevelSystem->createSound(SoundInfo.name_or_data, SoundInfo.mode, &SoundInfo.exinfo, &Sound); + if (Result == FMOD_OK) + { + UE_LOG(LogFMOD, Verbose, TEXT("Creating programmer sound using audio entry '%s'"), *SoundName); + + props->sound = (FMOD_SOUND*)Sound; + props->subsoundIndex = SoundInfo.subsoundIndex; + } + else + { + UE_LOG(LogFMOD, Warning, TEXT("Failed to load FMOD audio entry '%s'"), *SoundName); + } + } + else + { + UE_LOG(LogFMOD, Warning, TEXT("Failed to find FMOD audio entry '%s'"), *SoundName); + } + } + } +} + +void UFMODAudioComponent::EventCallbackDestroyProgrammerSound(FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES* props) +{ + if (props->sound && ProgrammerSound == nullptr) + { + UE_LOG(LogFMOD, Verbose, TEXT("Destroying programmer sound")); + FMOD_RESULT Result = ((FMOD::Sound*)props->sound)->release(); + verifyfmod(Result); + } +} + +void UFMODAudioComponent::SetProgrammerSoundName(FString Value) +{ + FScopeLock Lock(&CallbackLock); + ProgrammerSoundName = Value; +} + +void UFMODAudioComponent::SetProgrammerSound(FMOD::Sound* Sound) +{ + FScopeLock Lock(&CallbackLock); + ProgrammerSound = Sound; +} + +void UFMODAudioComponent::Play() +{ + Stop(); + + if (!FMODUtils::IsWorldAudible(GetWorld())) + { + return; + } + + UE_LOG(LogFMOD, Verbose, TEXT("UFMODAudioComponent %p Play"), this); + + // Only play events in PIE/game, not when placing them in the editor + FMOD::Studio::EventDescription* EventDesc = IFMODStudioModule::Get().GetEventDescription(Event.Get()); + if (EventDesc != nullptr) + { + FMOD_RESULT result = EventDesc->createInstance(&StudioInstance); + if (StudioInstance != nullptr) + { + FMOD_STUDIO_USER_PROPERTY UserProp = {0}; + if (EventDesc->getUserProperty("Ambient", &UserProp) == FMOD_OK) + { + if (UserProp.type == FMOD_STUDIO_USER_PROPERTY_TYPE_FLOAT) // All numbers are stored as float + { + bApplyAmbientVolumes = (UserProp.floatValue != 0.0f); + } + } + OnUpdateTransform(true); + // Set initial parameters + for (auto Kvp : StoredParameters) + { + FMOD_RESULT Result = StudioInstance->setParameterValue(TCHAR_TO_UTF8(*Kvp.Key.ToString()), Kvp.Value); + if (Result != FMOD_OK) + { + UE_LOG(LogFMOD, Warning, TEXT("Failed to set initial parameter %s"), *Kvp.Key.ToString()); + } + } + + verifyfmod(StudioInstance->setUserData(this)); + verifyfmod(StudioInstance->setCallback(UFMODAudioComponent_EventCallback)); + verifyfmod(StudioInstance->start()); + UE_LOG(LogFMOD, Verbose, TEXT("Playing component %p"), this); + bIsActive = true; + SetComponentTickEnabled(true); + } + } +} + +void UFMODAudioComponent::Stop() +{ + UE_LOG(LogFMOD, Verbose, TEXT("UFMODAudioComponent %p Stop"), this); + if (StudioInstance) + { + StudioInstance->stop(FMOD_STUDIO_STOP_ALLOWFADEOUT); + StudioInstance->setCallback(nullptr); + StudioInstance->release(); + StudioInstance = nullptr; + } + InteriorLastUpdateTime = 0.0; +} + +void UFMODAudioComponent::TriggerCue() +{ + UE_LOG(LogFMOD, Verbose, TEXT("UFMODAudioComponent %p TriggerCue"), this); + if (StudioInstance) + { + // Studio only supports a single cue so try to get it + FMOD::Studio::CueInstance* Cue = nullptr; + StudioInstance->getCueByIndex(0, &Cue); + if (Cue) + { + Cue->trigger(); + } + } +} + +void UFMODAudioComponent::OnPlaybackCompleted() +{ + // Mark inactive before calling destroy to avoid recursion + UE_LOG(LogFMOD, Verbose, TEXT("UFMODAudioComponent %p PlaybackCompleted"), this); + bIsActive = false; + SetComponentTickEnabled(false); + + OnEventStopped.Broadcast(); + + if (StudioInstance) + { + StudioInstance->setCallback(nullptr); + StudioInstance->release(); + StudioInstance = nullptr; + } + + // Auto destruction is handled via marking object for deletion. + if (bAutoDestroy) + { + DestroyComponent(); + } +} + +bool UFMODAudioComponent::IsPlaying( void ) +{ + return bIsActive; +} + + +void UFMODAudioComponent::SetVolume(float Volume) +{ + if (StudioInstance) + { + FMOD_RESULT Result = StudioInstance->setVolume(Volume); + if (Result != FMOD_OK) + { + UE_LOG(LogFMOD, Warning, TEXT("Failed to set volume")); + } + } +} + +void UFMODAudioComponent::SetPitch(float Pitch) +{ + if (StudioInstance) + { + FMOD_RESULT Result = StudioInstance->setPitch(Pitch); + if (Result != FMOD_OK) + { + UE_LOG(LogFMOD, Warning, TEXT("Failed to set pitch")); + } + } +} + +void UFMODAudioComponent::SetPaused(bool Paused) +{ + if (StudioInstance) + { + FMOD_RESULT Result = StudioInstance->setPaused(Paused); + if (Result != FMOD_OK) + { + UE_LOG(LogFMOD, Warning, TEXT("Failed to pause")); + } + } +} + +void UFMODAudioComponent::SetParameter(FName Name, float Value) +{ + if (StudioInstance) + { + FMOD_RESULT Result = StudioInstance->setParameterValue(TCHAR_TO_UTF8(*Name.ToString()), Value); + if (Result != FMOD_OK) + { + UE_LOG(LogFMOD, Warning, TEXT("Failed to set parameter %s"), *Name.ToString()); + } + } + StoredParameters.FindOrAdd(Name) = Value; +} + +void UFMODAudioComponent::SetTimelinePosition(int32 Time) +{ + if (StudioInstance) + { + FMOD_RESULT Result = StudioInstance->setTimelinePosition(Time); + if (Result != FMOD_OK) + { + UE_LOG(LogFMOD, Warning, TEXT("Failed to set timeline position")); + } + } +} + +int32 UFMODAudioComponent::GetTimelinePosition() +{ + int Time = 0; + if (StudioInstance) + { + FMOD_RESULT Result = StudioInstance->getTimelinePosition(&Time); + if (Result != FMOD_OK) + { + UE_LOG(LogFMOD, Warning, TEXT("Failed to get timeline position")); + } + } + return Time; +} + + +float UFMODAudioComponent::GetParameter(FName Name) +{ + float Value = 0.0f; + float* StoredParam = StoredParameters.Find(Name); + if (StoredParam) + { + Value = *StoredParam; + } + if (StudioInstance) + { + FMOD::Studio::ParameterInstance* ParamInst = nullptr; + FMOD_RESULT Result = StudioInstance->getParameter(TCHAR_TO_UTF8(*Name.ToString()), &ParamInst); + if (Result == FMOD_OK) + { + float QueryValue; + Result = ParamInst->getValue(&QueryValue); + if (Result == FMOD_OK) + { + Value = QueryValue; + } + } + if (Result != FMOD_OK) + { + UE_LOG(LogFMOD, Warning, TEXT("Failed to get parameter %s"), *Name.ToString()); + } + } + return Value; +} \ No newline at end of file diff --git a/Plugins/FMODStudio/Source/FMODStudio/Private/FMODBank.cpp b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODBank.cpp new file mode 100644 index 0000000..a832d12 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODBank.cpp @@ -0,0 +1,22 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#include "FMODStudioPrivatePCH.h" +#include "FMODBank.h" +#include "FMODStudioModule.h" + +UFMODBank::UFMODBank(const FObjectInitializer& ObjectInitializer) + : Super(ObjectInitializer) +{ +} + +/** Get tags to show in content view */ +void UFMODBank::GetAssetRegistryTags(TArray& OutTags) const +{ + Super::GetAssetRegistryTags(OutTags); +} + +FString UFMODBank::GetDesc() +{ + return FString::Printf( TEXT( "Bank %s" ), *AssetGuid.ToString(EGuidFormats::DigitsWithHyphensInBraces) ); +} + diff --git a/Plugins/FMODStudio/Source/FMODStudio/Private/FMODBankUpdateNotifier.cpp b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODBankUpdateNotifier.cpp new file mode 100644 index 0000000..282c97f --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODBankUpdateNotifier.cpp @@ -0,0 +1,57 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#include "FMODStudioPrivatePCH.h" +#include "FMODBankUpdateNotifier.h" +#include "FMODSettings.h" + +FFMODBankUpdateNotifier::FFMODBankUpdateNotifier() +: bUpdateEnabled(true), + NextRefreshTime(FDateTime::MinValue()) +{ +} + +void FFMODBankUpdateNotifier::SetFilePath(const FString& InPath) +{ + FilePath = InPath; + NextRefreshTime = FDateTime::MinValue(); + FileTime = FDateTime::MinValue(); +} + +void FFMODBankUpdateNotifier::Update() +{ + if (bUpdateEnabled) + { + FDateTime CurTime = FDateTime::UtcNow(); + if (CurTime >= NextRefreshTime) + { + NextRefreshTime = CurTime + FTimespan(0, 0, 1); + Refresh(); + } + } +} + +void FFMODBankUpdateNotifier::EnableUpdate(bool bEnable) +{ + bUpdateEnabled = bEnable; + + if (bEnable) + { + // Refreshing right after update is enabled is not desirable + NextRefreshTime = FDateTime::UtcNow() + FTimespan(0, 0, 1); + } +} + +void FFMODBankUpdateNotifier::Refresh() +{ + if (!FilePath.IsEmpty()) + { + const FDateTime NewFileTime = IFileManager::Get().GetTimeStamp(*FilePath); + if (NewFileTime != FileTime) + { + FileTime = NewFileTime; + UE_LOG(LogFMOD, Log, TEXT("File has changed: %s"), *FilePath); + + BanksUpdatedEvent.Broadcast(); + } + } +} diff --git a/Plugins/FMODStudio/Source/FMODStudio/Private/FMODBankUpdateNotifier.h b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODBankUpdateNotifier.h new file mode 100644 index 0000000..3b30364 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODBankUpdateNotifier.h @@ -0,0 +1,24 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#pragma once + +class FFMODBankUpdateNotifier +{ +public: + FFMODBankUpdateNotifier(); + + void SetFilePath(const FString& InPath); + void Update(); + + void EnableUpdate(bool bEnable); + + FSimpleMulticastDelegate BanksUpdatedEvent; + +private: + void Refresh(); + + bool bUpdateEnabled; + FString FilePath; + FDateTime NextRefreshTime; + FDateTime FileTime; +}; diff --git a/Plugins/FMODStudio/Source/FMODStudio/Private/FMODBlueprintStatics.cpp b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODBlueprintStatics.cpp new file mode 100644 index 0000000..1dc8d01 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODBlueprintStatics.cpp @@ -0,0 +1,409 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#include "FMODStudioPrivatePCH.h" +#include "FMODBlueprintStatics.h" +#include "FMODAudioComponent.h" +#include "FMODSettings.h" +#include "FMODStudioModule.h" +#include "FMODUtils.h" +#include "FMODBank.h" +#include "FMODEvent.h" +#include "FMODBus.h" +#include "fmod_studio.hpp" + +///////////////////////////////////////////////////// +// UFMODBlueprintStatics + +UFMODBlueprintStatics::UFMODBlueprintStatics(const FObjectInitializer& ObjectInitializer) + : Super(ObjectInitializer) +{ +} + +FFMODEventInstance UFMODBlueprintStatics::PlayEvent2D(UObject* WorldContextObject, class UFMODEvent* Event, bool bAutoPlay) +{ + return PlayEventAtLocation(WorldContextObject, Event, FTransform(), bAutoPlay); +} + +FFMODEventInstance UFMODBlueprintStatics::PlayEventAtLocation(UObject* WorldContextObject, class UFMODEvent* Event, const FTransform& Location, bool bAutoPlay) +{ + FFMODEventInstance Instance; + Instance.Instance = nullptr; + + UWorld* ThisWorld = GEngine->GetWorldFromContextObject(WorldContextObject); + if (FMODUtils::IsWorldAudible(ThisWorld)) + { + FMOD::Studio::EventDescription* EventDesc = IFMODStudioModule::Get().GetEventDescription(Event); + if (EventDesc != nullptr) + { + FMOD::Studio::EventInstance* EventInst = nullptr; + EventDesc->createInstance(&EventInst); + if (EventInst != nullptr) + { + FMOD_3D_ATTRIBUTES EventAttr = { { 0 } }; + FMODUtils::Assign(EventAttr, Location); + EventInst->set3DAttributes(&EventAttr); + + if (bAutoPlay) + { + EventInst->start(); + EventInst->release(); + } + Instance.Instance = EventInst; + } + } + } + return Instance; +} + +class UFMODAudioComponent* UFMODBlueprintStatics::PlayEventAttached(class UFMODEvent* Event, class USceneComponent* AttachToComponent, FName AttachPointName, FVector Location, EAttachLocation::Type LocationType, bool bStopWhenAttachedToDestroyed, bool bAutoPlay) +{ + if (Event == nullptr) + { + return nullptr; + } + if (AttachToComponent == nullptr) + { + UE_LOG(LogFMOD, Warning, TEXT("UFMODBlueprintStatics::PlayEventAttached: NULL AttachComponent specified!")); + return nullptr; + } + + AActor* Actor = AttachToComponent->GetOwner(); + + // Avoid creating component if we're trying to play a sound on an already destroyed actor. + if (Actor && Actor->IsPendingKill()) + { + return nullptr; + } + + UFMODAudioComponent* AudioComponent; + if( Actor ) + { + // Use actor as outer if we have one. + AudioComponent = NewObject(Actor); + } + else + { + // Let engine pick the outer (transient package). + AudioComponent = NewObject(); + } + check( AudioComponent ); + AudioComponent->Event = Event; + AudioComponent->bAutoActivate = false; + AudioComponent->bAutoDestroy = true; + AudioComponent->bStopWhenOwnerDestroyed = bStopWhenAttachedToDestroyed; +#if WITH_EDITORONLY_DATA + AudioComponent->bVisualizeComponent = false; +#endif + AudioComponent->RegisterComponentWithWorld(AttachToComponent->GetWorld()); + + AudioComponent->AttachTo(AttachToComponent, AttachPointName); + if (LocationType == EAttachLocation::KeepWorldPosition) + { + AudioComponent->SetWorldLocation(Location); + } + else + { + AudioComponent->SetRelativeLocation(Location); + } + + if (bAutoPlay) + { + AudioComponent->Play(); + } + return AudioComponent; +} + +UFMODAsset* UFMODBlueprintStatics::FindAssetByName(const FString& Name) +{ + return IFMODStudioModule::Get().FindAssetByName(Name); +} + +UFMODEvent* UFMODBlueprintStatics::FindEventByName(const FString& Name) +{ + return IFMODStudioModule::Get().FindEventByName(Name); +} + +void UFMODBlueprintStatics::LoadBank(class UFMODBank* Bank, bool bBlocking, bool bLoadSampleData) +{ + FMOD::Studio::System* StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime); + if (StudioSystem != nullptr && Bank != nullptr) + { + UE_LOG(LogFMOD, Log, TEXT("LoadBank %s"), *Bank->GetName()); + + const UFMODSettings& Settings = *GetDefault(); + FString BankPath = Settings.GetFullBankPath() / (Bank->GetName() + TEXT(".bank")); + + FMOD::Studio::Bank* bank = nullptr; + FMOD_STUDIO_LOAD_BANK_FLAGS flags = bBlocking ? FMOD_STUDIO_LOAD_BANK_NORMAL : FMOD_STUDIO_LOAD_BANK_NONBLOCKING; + FMOD_RESULT result = StudioSystem->loadBankFile(TCHAR_TO_UTF8(*BankPath), flags, &bank); + if ( result == FMOD_OK && bank != nullptr && bLoadSampleData ) + { + // Make sure bank is ready to load sample data from + StudioSystem->flushCommands(); + bank->loadSampleData(); + } + } +} + +void UFMODBlueprintStatics::UnloadBank(class UFMODBank* Bank) +{ + FMOD::Studio::System* StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime); + if (StudioSystem != nullptr && Bank != nullptr) + { + UE_LOG(LogFMOD, Log, TEXT("UnloadBank %s"), *Bank->GetName()); + + FMOD::Studio::ID guid = FMODUtils::ConvertGuid(Bank->AssetGuid); + FMOD::Studio::Bank* bank = nullptr; + FMOD_RESULT result = StudioSystem->getBankByID(&guid, &bank); + if (result == FMOD_OK && bank != nullptr) + { + bank->unload(); + } + } +} + +void UFMODBlueprintStatics::LoadBankSampleData(class UFMODBank* Bank) +{ + FMOD::Studio::System* StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime); + if (StudioSystem != nullptr && Bank != nullptr) + { + FMOD::Studio::ID guid = FMODUtils::ConvertGuid(Bank->AssetGuid); + FMOD::Studio::Bank* bank = nullptr; + FMOD_RESULT result = StudioSystem->getBankByID(&guid, &bank); + if (result == FMOD_OK && bank != nullptr) + { + bank->loadSampleData(); + } + } +} + +void UFMODBlueprintStatics::UnloadBankSampleData(class UFMODBank* Bank) +{ + FMOD::Studio::System* StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime); + if (StudioSystem != nullptr && Bank != nullptr) + { + FMOD::Studio::ID guid = FMODUtils::ConvertGuid(Bank->AssetGuid); + FMOD::Studio::Bank* bank = nullptr; + FMOD_RESULT result = StudioSystem->getBankByID(&guid, &bank); + if (result == FMOD_OK && bank != nullptr) + { + bank->unloadSampleData(); + } + } +} + +void UFMODBlueprintStatics::LoadEventSampleData(UObject* WorldContextObject, class UFMODEvent* Event) +{ + FMOD::Studio::EventDescription* EventDesc = IFMODStudioModule::Get().GetEventDescription(Event); + if (EventDesc != nullptr) + { + EventDesc->loadSampleData(); + } +} + +void UFMODBlueprintStatics::UnloadEventSampleData(UObject* WorldContextObject, class UFMODEvent* Event) +{ + FMOD::Studio::EventDescription* EventDesc = IFMODStudioModule::Get().GetEventDescription(Event); + if (EventDesc != nullptr) + { + EventDesc->unloadSampleData(); + } +} + +TArray UFMODBlueprintStatics::FindEventInstances(UObject* WorldContextObject, UFMODEvent* Event) +{ + FMOD::Studio::EventDescription* EventDesc = IFMODStudioModule::Get().GetEventDescription(Event); + TArray Instances; + if (EventDesc != nullptr) + { + int Capacity = 0; + EventDesc->getInstanceCount(&Capacity); + TArray InstancePointers; + InstancePointers.SetNum(Capacity, true); + int Count = 0; + EventDesc->getInstanceList(InstancePointers.GetData(), Capacity, &Count); + Instances.SetNum(Count, true); + for (int i=0; iAssetGuid); + FMOD::Studio::Bus* bus = nullptr; + FMOD_RESULT result = StudioSystem->getBusByID(&guid, &bus); + if (result == FMOD_OK && bus != nullptr) + { + bus->setFaderLevel(Level); + } + } +} + +void UFMODBlueprintStatics::BusSetPaused(class UFMODBus* Bus, bool bPaused) +{ + FMOD::Studio::System* StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime); + if (StudioSystem != nullptr && Bus != nullptr) + { + FMOD::Studio::ID guid = FMODUtils::ConvertGuid(Bus->AssetGuid); + FMOD::Studio::Bus* bus = nullptr; + FMOD_RESULT result = StudioSystem->getBusByID(&guid, &bus); + if (result == FMOD_OK && bus != nullptr) + { + bus->setPaused(bPaused); + } + } +} + +void UFMODBlueprintStatics::BusSetMute(class UFMODBus* Bus, bool bMute) +{ + FMOD::Studio::System* StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime); + if (StudioSystem != nullptr && Bus != nullptr) + { + FMOD::Studio::ID guid = FMODUtils::ConvertGuid(Bus->AssetGuid); + FMOD::Studio::Bus* bus = nullptr; + FMOD_RESULT result = StudioSystem->getBusByID(&guid, &bus); + if (result == FMOD_OK && bus != nullptr) + { + bus->setMute(bMute); + } + } +} + +bool UFMODBlueprintStatics::EventInstanceIsValid(FFMODEventInstance EventInstance) +{ + if (EventInstance.Instance) + { + return EventInstance.Instance->isValid(); + } + return false; +} + +void UFMODBlueprintStatics::EventInstanceSetVolume(FFMODEventInstance EventInstance, float Volume) +{ + if (EventInstance.Instance) + { + FMOD_RESULT Result = EventInstance.Instance->setVolume(Volume); + if (Result != FMOD_OK) + { + UE_LOG(LogFMOD, Warning, TEXT("Failed to set event instance volume")); + } + } +} + +void UFMODBlueprintStatics::EventInstanceSetPitch(FFMODEventInstance EventInstance, float Pitch) +{ + if (EventInstance.Instance) + { + FMOD_RESULT Result = EventInstance.Instance->setPitch(Pitch); + if (Result != FMOD_OK) + { + UE_LOG(LogFMOD, Warning, TEXT("Failed to set event instance pitch")); + } + } +} + +void UFMODBlueprintStatics::EventInstanceSetPaused(FFMODEventInstance EventInstance, bool Paused) +{ + if (EventInstance.Instance) + { + FMOD_RESULT Result = EventInstance.Instance->setPaused(Paused); + if (Result != FMOD_OK) + { + UE_LOG(LogFMOD, Warning, TEXT("Failed to pause event instance")); + } + } +} + +void UFMODBlueprintStatics::EventInstanceSetParameter(FFMODEventInstance EventInstance, FName Name, float Value) +{ + if (EventInstance.Instance) + { + FMOD_RESULT Result = EventInstance.Instance->setParameterValue(TCHAR_TO_UTF8(*Name.ToString()), Value); + if (Result != FMOD_OK) + { + UE_LOG(LogFMOD, Warning, TEXT("Failed to set event instance parameter %s"), *Name.ToString()); + } + } +} + +float UFMODBlueprintStatics::EventInstanceGetParameter(FFMODEventInstance EventInstance, FName Name) +{ + float Value = 0.0f; + if (EventInstance.Instance) + { + FMOD::Studio::ParameterInstance* ParamInst = nullptr; + FMOD_RESULT Result = EventInstance.Instance->getParameter(TCHAR_TO_UTF8(*Name.ToString()), &ParamInst); + if (Result == FMOD_OK) + { + Result = ParamInst->getValue(&Value); + } + if (Result != FMOD_OK) + { + UE_LOG(LogFMOD, Warning, TEXT("Failed to get event instance parameter %s"), *Name.ToString()); + } + } + return Value; +} + +void UFMODBlueprintStatics::EventInstancePlay(FFMODEventInstance EventInstance) +{ + if (EventInstance.Instance) + { + FMOD_RESULT Result = EventInstance.Instance->start(); + if (Result != FMOD_OK) + { + UE_LOG(LogFMOD, Warning, TEXT("Failed to play event instance")); + } + // Once we start playing, allow instance to be cleaned up when it finishes + EventInstance.Instance->release(); + } +} + +void UFMODBlueprintStatics::EventInstanceStop(FFMODEventInstance EventInstance) +{ + if (EventInstance.Instance) + { + FMOD_RESULT Result = EventInstance.Instance->stop(FMOD_STUDIO_STOP_ALLOWFADEOUT); + if (Result != FMOD_OK) + { + UE_LOG(LogFMOD, Warning, TEXT("Failed to stop event instance")); + } + } +} + +void UFMODBlueprintStatics::EventInstanceTriggerCue(FFMODEventInstance EventInstance) +{ + if (EventInstance.Instance) + { + // Studio only supports a single cue so try to get it + FMOD::Studio::CueInstance* Cue = nullptr; + EventInstance.Instance->getCueByIndex(0, &Cue); + if (Cue) + { + Cue->trigger(); + } + } +} + +void UFMODBlueprintStatics::EventInstanceSetTransform(FFMODEventInstance EventInstance, const FTransform& Location) +{ + if (EventInstance.Instance) + { + FMOD_3D_ATTRIBUTES attr = {{0}}; + FMODUtils::Assign(attr, Location); + FMOD_RESULT Result = EventInstance.Instance->set3DAttributes(&attr); + if (Result != FMOD_OK) + { + UE_LOG(LogFMOD, Warning, TEXT("Failed to set transform on event instance")); + } + } + + +} diff --git a/Plugins/FMODStudio/Source/FMODStudio/Private/FMODBus.cpp b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODBus.cpp new file mode 100644 index 0000000..12f2edf --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODBus.cpp @@ -0,0 +1,22 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#include "FMODStudioPrivatePCH.h" +#include "FMODBus.h" +#include "FMODStudioModule.h" + +UFMODBus::UFMODBus(const FObjectInitializer& ObjectInitializer) + : Super(ObjectInitializer) +{ +} + +/** Get tags to show in content view */ +void UFMODBus::GetAssetRegistryTags(TArray& OutTags) const +{ + Super::GetAssetRegistryTags(OutTags); +} + +FString UFMODBus::GetDesc() +{ + return FString::Printf( TEXT( "Bus %s" ), *AssetGuid.ToString(EGuidFormats::DigitsWithHyphensInBraces) ); +} + diff --git a/Plugins/FMODStudio/Source/FMODStudio/Private/FMODEvent.cpp b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODEvent.cpp new file mode 100644 index 0000000..28f1c69 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODEvent.cpp @@ -0,0 +1,38 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#include "FMODStudioPrivatePCH.h" +#include "FMODEvent.h" +#include "FMODStudioModule.h" +#include "fmod_studio.hpp" + +UFMODEvent::UFMODEvent(const FObjectInitializer& ObjectInitializer) + : Super(ObjectInitializer) +{ +} + +/** Get tags to show in content view */ +void UFMODEvent::GetAssetRegistryTags(TArray& OutTags) const +{ + Super::GetAssetRegistryTags(OutTags); + FMOD::Studio::EventDescription* EventDesc = IFMODStudioModule::Get().GetEventDescription(this, EFMODSystemContext::Auditioning); + + bool bOneshot = false; + bool bStream = false; + bool b3D = false; + if (EventDesc) + { + EventDesc->isOneshot(&bOneshot); + EventDesc->isStream(&bStream); + EventDesc->is3D(&b3D); + } + + OutTags.Add(UObject::FAssetRegistryTag("Oneshot", bOneshot ? TEXT("True") : TEXT("False"), UObject::FAssetRegistryTag::TT_Alphabetical)); + OutTags.Add(UObject::FAssetRegistryTag("Streaming", bStream ? TEXT("True") : TEXT("False"), UObject::FAssetRegistryTag::TT_Alphabetical)); + OutTags.Add(UObject::FAssetRegistryTag("3D", b3D ? TEXT("True") : TEXT("False"), UObject::FAssetRegistryTag::TT_Alphabetical)); +} + +FString UFMODEvent::GetDesc() +{ + return FString::Printf( TEXT( "Event %s" ), *AssetGuid.ToString(EGuidFormats::DigitsWithHyphensInBraces) ); +} + diff --git a/Plugins/FMODStudio/Source/FMODStudio/Private/FMODFileCallbacks.cpp b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODFileCallbacks.cpp new file mode 100644 index 0000000..52df4cb --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODFileCallbacks.cpp @@ -0,0 +1,109 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#include "FMODStudioPrivatePCH.h" +#include "FMODFileCallbacks.h" +#include "FMODUtils.h" + +FMOD_RESULT F_CALLBACK FMODLogCallback(FMOD_DEBUG_FLAGS flags, const char *file, int line, const char *func, const char *message) +{ + if (flags & FMOD_DEBUG_LEVEL_ERROR) + { + UE_LOG(LogFMOD, Error, TEXT("%s(%d) - %s"), UTF8_TO_TCHAR(file), line, UTF8_TO_TCHAR(message)); + } + else if (flags & FMOD_DEBUG_LEVEL_WARNING) + { + FString Message = UTF8_TO_TCHAR(message); + UE_LOG(LogFMOD, Warning, TEXT("%s(%d) - %s"), UTF8_TO_TCHAR(file), line, *Message); + if (GIsEditor) + { + int32 StartIndex = Message.Find(TEXT("Missing DSP plugin '")); + if (StartIndex != INDEX_NONE) + { + int32 Len = FString(TEXT("Missing DSP plugin '")).Len(); + int32 EndIndex; + if (Message.FindLastChar('\'', EndIndex) && EndIndex != INDEX_NONE && StartIndex+Len < EndIndex) + { + FString PluginName = Message.Mid(StartIndex + Len, EndIndex - StartIndex - Len); + IFMODStudioModule::Get().AddRequiredPlugin(PluginName); + } + } + } + } + else + { + UE_LOG(LogFMOD, Verbose, TEXT("%s(%d) - %s"), UTF8_TO_TCHAR(file), line, UTF8_TO_TCHAR(message)); + } + return FMOD_OK; +} + +FMOD_RESULT F_CALLBACK FMODOpen(const char *name, unsigned int *filesize, void **handle, void * /*userdata*/) +{ + if (name) + { + FArchive* Archive = IFileManager::Get().CreateFileReader(UTF8_TO_TCHAR(name)); + UE_LOG(LogFMOD, Verbose, TEXT("FMODOpen Opening '%s' returned archive %p"), UTF8_TO_TCHAR(name), Archive); + if (!Archive) + { + return FMOD_ERR_FILE_NOTFOUND; + } + *filesize = Archive->TotalSize(); + *handle = Archive; + UE_LOG(LogFMOD, Verbose, TEXT(" TotalSize = %d"), *filesize); + } + + return FMOD_OK; +} + +FMOD_RESULT F_CALLBACK FMODClose(void *handle, void * /*userdata*/) +{ + if (!handle) + { + return FMOD_ERR_INVALID_PARAM; + } + + + FArchive* Archive = (FArchive*)handle; + UE_LOG(LogFMOD, Verbose, TEXT("FMODClose Closing archive %p"), Archive); + delete Archive; + + return FMOD_OK; +} + +FMOD_RESULT F_CALLBACK FMODRead(void *handle, void *buffer, unsigned int sizebytes, unsigned int *bytesread, void * /*userdata*/) +{ + if (!handle) + { + return FMOD_ERR_INVALID_PARAM; + } + + if (bytesread) + { + FArchive* Archive = (FArchive*)handle; + + int64 BytesLeft = Archive->TotalSize() - Archive->Tell(); + int64 ReadAmount = FMath::Min((int64)sizebytes, BytesLeft); + + Archive->Serialize(buffer, ReadAmount); + *bytesread = (unsigned int)ReadAmount; + if (ReadAmount < (int64)sizebytes) + { + UE_LOG(LogFMOD, Verbose, TEXT(" -> EOF ")); + return FMOD_ERR_FILE_EOF; + } + } + + return FMOD_OK; +} + +FMOD_RESULT F_CALLBACK FMODSeek(void *handle, unsigned int pos, void * /*userdata*/) +{ + if (!handle) + { + return FMOD_ERR_INVALID_PARAM; + } + + FArchive* Archive = (FArchive*)handle; + Archive->Seek(pos); + + return FMOD_OK; +} diff --git a/Plugins/FMODStudio/Source/FMODStudio/Private/FMODFileCallbacks.h b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODFileCallbacks.h new file mode 100644 index 0000000..f89234c --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODFileCallbacks.h @@ -0,0 +1,12 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#pragma once + +#include "fmod.h" + +FMOD_RESULT F_CALLBACK FMODLogCallback(FMOD_DEBUG_FLAGS flags, const char *file, int line, const char *func, const char *message); +FMOD_RESULT F_CALLBACK FMODOpen(const char *name, unsigned int *filesize, void **handle, void * /*userdata*/); +FMOD_RESULT F_CALLBACK FMODClose(void *handle, void * /*userdata*/); +FMOD_RESULT F_CALLBACK FMODRead(void *handle, void *buffer, unsigned int sizebytes, unsigned int *bytesread, void * /*userdata*/); +FMOD_RESULT F_CALLBACK FMODSeek(void *handle, unsigned int pos, void * /*userdata*/); + diff --git a/Plugins/FMODStudio/Source/FMODStudio/Private/FMODListener.cpp b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODListener.cpp new file mode 100644 index 0000000..c38f412 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODListener.cpp @@ -0,0 +1,48 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#include "FMODStudioPrivatePCH.h" +#include "FMODListener.h" +#include + +float FFMODListener::Interpolate( const double EndTime ) +{ + if( FApp::GetCurrentTime() < InteriorStartTime ) + { + return( 0.0f ); + } + + if( FApp::GetCurrentTime() >= EndTime ) + { + return( 1.0f ); + } + + float InterpValue = ( float )( ( FApp::GetCurrentTime() - InteriorStartTime ) / ( EndTime - InteriorStartTime ) ); + return( InterpValue ); +} + +void FFMODListener::UpdateCurrentInteriorSettings() +{ + // Store the interpolation value, not the actual value + InteriorVolumeInterp = Interpolate( InteriorEndTime ); + ExteriorVolumeInterp = Interpolate( ExteriorEndTime ); + InteriorLPFInterp = Interpolate( InteriorLPFEndTime ); + ExteriorLPFInterp = Interpolate( ExteriorLPFEndTime ); +} + +void FFMODListener::ApplyInteriorSettings( class AAudioVolume* InVolume, const FInteriorSettings& Settings ) +{ + // Note: FInteriorSettings operator!= is not exported, so just do a memcmp instead + if( InVolume != Volume || (0 != memcmp(&Settings, &InteriorSettings, sizeof(FInteriorSettings))) ) + { + // Use previous/ current interpolation time if we're transitioning to the default worldsettings zone. + InteriorStartTime = FApp::GetCurrentTime(); + InteriorEndTime = InteriorStartTime + (Settings.bIsWorldSettings ? InteriorSettings.InteriorTime : Settings.InteriorTime); + ExteriorEndTime = InteriorStartTime + (Settings.bIsWorldSettings ? InteriorSettings.ExteriorTime : Settings.ExteriorTime); + InteriorLPFEndTime = InteriorStartTime + (Settings.bIsWorldSettings ? InteriorSettings.InteriorLPFTime : Settings.InteriorLPFTime); + ExteriorLPFEndTime = InteriorStartTime + (Settings.bIsWorldSettings ? InteriorSettings.ExteriorLPFTime : Settings.ExteriorLPFTime); + + Volume = InVolume; + InteriorSettings = Settings; + } +} + diff --git a/Plugins/FMODStudio/Source/FMODStudio/Private/FMODListener.h b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODListener.h new file mode 100644 index 0000000..b6ac537 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODListener.h @@ -0,0 +1,61 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#pragma once + +/** A direct copy of FListener (which doesn't have external linkage, unfortunately) **/ +struct FFMODListener +{ + FTransform Transform; + FVector Velocity; + + struct FInteriorSettings InteriorSettings; + + /** The volume the listener resides in */ + class AAudioVolume* Volume; + + /** The times of interior volumes fading in and out */ + double InteriorStartTime; + double InteriorEndTime; + double ExteriorEndTime; + double InteriorLPFEndTime; + double ExteriorLPFEndTime; + float InteriorVolumeInterp; + float InteriorLPFInterp; + float ExteriorVolumeInterp; + float ExteriorLPFInterp; + + FVector GetUp() const { return Transform.GetUnitAxis(EAxis::Z); } + FVector GetFront() const { return Transform.GetUnitAxis(EAxis::Y); } + FVector GetRight() const { return Transform.GetUnitAxis(EAxis::X); } + + /** + * Works out the interp value between source and end + */ + float Interpolate( const double EndTime ); + + /** + * Gets the current state of the interior settings for the listener + */ + void UpdateCurrentInteriorSettings(); + + /** + * Apply the interior settings to ambient sounds + */ + void ApplyInteriorSettings( class AAudioVolume* Volume, const FInteriorSettings& Settings ); + + FFMODListener() + : Transform(FTransform::Identity) + , Velocity(ForceInit) + , Volume(NULL) + , InteriorStartTime(0.0) + , InteriorEndTime(0.0) + , ExteriorEndTime(0.0) + , InteriorLPFEndTime(0.0) + , ExteriorLPFEndTime(0.0) + , InteriorVolumeInterp(0.f) + , InteriorLPFInterp(0.f) + , ExteriorVolumeInterp(0.f) + , ExteriorLPFInterp(0.f) + { + } +}; diff --git a/Plugins/FMODStudio/Source/FMODStudio/Private/FMODPlatformLoadDll_Generic.h b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODPlatformLoadDll_Generic.h new file mode 100644 index 0000000..8ad2772 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODPlatformLoadDll_Generic.h @@ -0,0 +1,12 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. +#pragma once + +void* FMODPlatformLoadDll(const TCHAR* LibToLoad) +{ + return FPlatformProcess::GetDllHandle(LibToLoad); +} + +FMOD_RESULT FMODPlatformSystemSetup() +{ + return FMOD_OK; +} \ No newline at end of file diff --git a/Plugins/FMODStudio/Source/FMODStudio/Private/FMODSettings.cpp b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODSettings.cpp new file mode 100644 index 0000000..9e9a5a3 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODSettings.cpp @@ -0,0 +1,91 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#include "FMODStudioPrivatePCH.h" +#include "FMODSettings.h" + +////////////////////////////////////////////////////////////////////////// +// UPaperRuntimeSettings + +UFMODSettings::UFMODSettings(const FObjectInitializer& ObjectInitializer) +: Super(ObjectInitializer) +{ + MasterBankName = TEXT("Master Bank"); + BankOutputDirectory.Path = TEXT("FMOD"); + OutputFormat = EFMODSpeakerMode::Surround_5_1; + ContentBrowserPrefix = TEXT("/Game/FMOD/"); + bLoadAllBanks = true; + bLoadAllSampleData = false; + bEnableLiveUpdate = true; + bVol0Virtual = true; + Vol0VirtualLevel = 0.0001f; + RealChannelCount = 64; + TotalChannelCount = 512; + DSPBufferLength = 0; + DSPBufferCount = 0; + StudioUpdatePeriod = 0; + LiveUpdatePort = 0; +} + +FString UFMODSettings::GetFullBankPath() const +{ + FString FullPath = BankOutputDirectory.Path; + if (FPaths::IsRelative(FullPath)) + { + FullPath = FPaths::GameContentDir() / FullPath; + } + + if (ForcePlatformName == TEXT(".")) + { + // Leave path without subdirectory + } + else if (!ForcePlatformName.IsEmpty()) + { + FullPath = FullPath / ForcePlatformName; + } + else + { +#if PLATFORM_IOS || PLATFORM_ANDROID + FString PlatformName = "Mobile"; +#elif PLATFORM_PS4 + FString PlatformName = "PS4"; +#elif PLATFORM_XBOXONE + FString PlatformName = "XboxOne"; +#else + FString PlatformName = "Desktop"; +#endif + FullPath = FullPath / PlatformName; + } + return FullPath; +} + +FString UFMODSettings::GetMasterBankPath() const +{ + return GetFullBankPath() / (MasterBankName + TEXT(".bank")); +} + +FString UFMODSettings::GetMasterStringsBankPath() const +{ + return GetFullBankPath() / (MasterBankName + TEXT(".strings.bank")); +} + +void UFMODSettings::GetAllBankPaths(TArray& Paths, bool IncludeMasterBank) const +{ + FString BankDir = GetFullBankPath(); + FString SearchDir = BankDir / FString(TEXT("*")); + + TArray AllFiles; + IFileManager::Get().FindFiles(AllFiles, *SearchDir, true, false); + for ( FString& CurFile : AllFiles ) + { + if (CurFile.EndsWith(".bank")) + { + bool IsMaster = (CurFile == MasterBankName + TEXT(".bank") || + CurFile == MasterBankName + TEXT(".strings.bank")); + if (IncludeMasterBank || !IsMaster) + { + Paths.Push(BankDir / CurFile); + } + } + } +} + diff --git a/Plugins/FMODStudio/Source/FMODStudio/Private/FMODSnapshot.cpp b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODSnapshot.cpp new file mode 100644 index 0000000..47de79c --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODSnapshot.cpp @@ -0,0 +1,16 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#include "FMODStudioPrivatePCH.h" +#include "FMODSnapshot.h" +#include "FMODStudioModule.h" + +UFMODSnapshot::UFMODSnapshot(const FObjectInitializer& ObjectInitializer) + : Super(ObjectInitializer) +{ +} + +FString UFMODSnapshot::GetDesc() +{ + return FString::Printf( TEXT( "Snapshot %s" ), *AssetGuid.ToString(EGuidFormats::DigitsWithHyphensInBraces) ); +} + diff --git a/Plugins/FMODStudio/Source/FMODStudio/Private/FMODSnapshotReverb.cpp b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODSnapshotReverb.cpp new file mode 100644 index 0000000..71808c3 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODSnapshotReverb.cpp @@ -0,0 +1,9 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#include "FMODStudioPrivatePCH.h" +#include "FMODSnapshotReverb.h" + +UFMODSnapshotReverb::UFMODSnapshotReverb(const FObjectInitializer& ObjectInitializer) + : Super(ObjectInitializer) +{ +} diff --git a/Plugins/FMODStudio/Source/FMODStudio/Private/FMODStudioModule.cpp b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODStudioModule.cpp new file mode 100644 index 0000000..1224701 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODStudioModule.cpp @@ -0,0 +1,1080 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#include "FMODStudioPrivatePCH.h" + +#include "FMODSettings.h" +#include "FMODStudioModule.h" +#include "FMODAudioComponent.h" +#include "FMODBlueprintStatics.h" +#include "FMODAssetTable.h" +#include "FMODFileCallbacks.h" +#include "FMODBankUpdateNotifier.h" +#include "FMODUtils.h" +#include "FMODEvent.h" +#include "FMODListener.h" +#include "FMODSnapshotReverb.h" +#include "IPluginManager.h" +#include "fmod_studio.hpp" +#include "fmod_errors.h" + +#if PLATFORM_PS4 +#include "FMODPlatformLoadDll_PS4.h" +#elif PLATFORM_XBOXONE +#include "FMODPlatformLoadDll_XBoxOne.h" +#else +#include "FMODPlatformLoadDll_Generic.h" +#endif + +#define LOCTEXT_NAMESPACE "FMODStudio" + +DEFINE_LOG_CATEGORY(LogFMOD); + +const TCHAR* FMODSystemContextNames[EFMODSystemContext::Max] = +{ + TEXT("Auditioning"), + TEXT("Runtime"), +}; + +void* F_CALLBACK FMODMemoryAlloc(unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr) +{ + return FMemory::Malloc(size); +} +void* F_CALLBACK FMODMemoryRealloc(void *ptr, unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr) +{ + return FMemory::Realloc(ptr, size); +} +void F_CALLBACK FMODMemoryFree(void *ptr, FMOD_MEMORY_TYPE type, const char *sourcestr) +{ + FMemory::Free(ptr); +} + + +struct FFMODSnapshotEntry +{ + FFMODSnapshotEntry(UFMODSnapshotReverb* InSnapshot=nullptr, FMOD::Studio::EventInstance* InInstance=nullptr) + : Snapshot(InSnapshot), + Instance(InInstance), + StartTime(0.0), + FadeDuration(0.0f), + FadeIntensityStart(0.0f), + FadeIntensityEnd(0.0f) + { + } + + float CurrentIntensity() const + { + double CurrentTime = FApp::GetCurrentTime(); + if (StartTime + FadeDuration <= CurrentTime) + { + return FadeIntensityEnd; + } + else + { + float Factor = (CurrentTime - StartTime) / FadeDuration; + return FMath::Lerp(FadeIntensityStart, FadeIntensityEnd, Factor); + } + } + + void FadeTo(float Target, float Duration) + { + float StartIntensity = CurrentIntensity(); + + StartTime = FApp::GetCurrentTime(); + FadeDuration = Duration; + FadeIntensityStart = StartIntensity; + FadeIntensityEnd = Target; + } + + UFMODSnapshotReverb* Snapshot; + FMOD::Studio::EventInstance* Instance; + double StartTime; + float FadeDuration; + float FadeIntensityStart; + float FadeIntensityEnd; +}; + +class FFMODStudioModule : public IFMODStudioModule +{ +public: + /** IModuleInterface implementation */ + FFMODStudioModule() + : AuditioningInstance(nullptr), + ListenerCount(1), + bSimulating(false), + bIsInPIE(false), + bUseSound(true), + bListenerMoved(true), + bAllowLiveUpdate(true), + LowLevelLibHandle(nullptr), + StudioLibHandle(nullptr) + { + for (int i=0; i GetFailedBankLoads(EFMODSystemContext::Type Context) override + { + return FailedBankLoads[Context]; + } + + virtual TArray GetRequiredPlugins() override + { + return RequiredPlugins; + } + + virtual void AddRequiredPlugin(const FString& Plugin) + { + if (!RequiredPlugins.Contains(Plugin)) + { + RequiredPlugins.Add(Plugin); + } + } + + virtual bool UseSound() override + { + return bUseSound; + } + + virtual bool LoadPlugin(const TCHAR* ShortName) override; + + virtual void LogError(int result, const char* function) override; + + void ResetInterpolation(); + + /** The studio system handle. */ + FMOD::Studio::System* StudioSystem[EFMODSystemContext::Max]; + FMOD::Studio::EventInstance* AuditioningInstance; + + /** The delegate to be invoked when this profiler manager ticks. */ + FTickerDelegate OnTick; + + /** Handle for registered TickDelegate. */ + FDelegateHandle TickDelegateHandle; + + /** Table of assets with name and guid */ + FFMODAssetTable AssetTable; + + /** Periodically checks for updates of the strings.bank file */ + FFMODBankUpdateNotifier BankUpdateNotifier; + + /** List of failed bank files */ + TArray FailedBankLoads[EFMODSystemContext::Max]; + + /** List of required plugins we found when loading banks. */ + TArray RequiredPlugins; + + /** Listener information */ +#if FMOD_VERSION >= 0x00010600 + static const int MAX_LISTENERS = FMOD_MAX_LISTENERS; +#else + static const int MAX_LISTENERS = 1; +#endif + FFMODListener Listeners[MAX_LISTENERS]; + int ListenerCount; + + /** Current snapshot applied via reverb zones*/ + TArray ReverbSnapshots; + + /** True if simulating */ + bool bSimulating; + + /** True if in PIE */ + bool bIsInPIE; + + /** True if we want sound enabled */ + bool bUseSound; + + /** True if we the listener has moved and may have changed audio settings*/ + bool bListenerMoved; + + /** True if we allow live update */ + bool bAllowLiveUpdate; + + /** Dynamic library */ + FString BaseLibPath; + void* LowLevelLibHandle; + void* StudioLibHandle; +}; + +IMPLEMENT_MODULE( FFMODStudioModule, FMODStudio ) + +void FFMODStudioModule::LogError(int result, const char* function) +{ + FString ErrorStr(ANSI_TO_TCHAR(FMOD_ErrorString((FMOD_RESULT)result))); + FString FunctionStr(ANSI_TO_TCHAR(function)); + UE_LOG(LogFMOD, Error, TEXT("'%s' returned '%s'"), *FunctionStr, *ErrorStr); +} + +bool FFMODStudioModule::LoadPlugin(const TCHAR* ShortName) +{ + UE_LOG(LogFMOD, Log, TEXT("Loading plugin '%s'"), ShortName); + + static const int ATTEMPT_COUNT = 2; + static const TCHAR* AttemptPrefixes[ATTEMPT_COUNT] = + { + TEXT(""), +#if PLATFORM_64BITS + TEXT("64") +#else + TEXT("32") +#endif + }; + + FMOD::System* LowLevelSystem = nullptr; + verifyfmod(StudioSystem[EFMODSystemContext::Runtime]->getLowLevelSystem(&LowLevelSystem)); + + FMOD_RESULT PluginLoadResult; + for (int attempt=0; attempt<2; ++attempt) + { + FString AttemptName = FString(ShortName) + AttemptPrefixes[attempt]; + FString PluginPath = GetDllPath(*AttemptName); + + UE_LOG(LogFMOD, Log, TEXT("Trying to load plugin file at location: %s"), *PluginPath); + + unsigned int Handle = 0; + PluginLoadResult = LowLevelSystem->loadPlugin(TCHAR_TO_UTF8(*PluginPath), &Handle, 0); + if (PluginLoadResult == FMOD_OK) + { + UE_LOG(LogFMOD, Log, TEXT("Loaded plugin %s"), ShortName); + return true; + } + } + UE_LOG(LogFMOD, Error, TEXT("Failed to load plugin '%s', sounds may not play"), ShortName); + return false; +} + +void* FFMODStudioModule::LoadDll(const TCHAR* ShortName) +{ + FString LibPath = GetDllPath(ShortName); + + void* Handle = nullptr; + UE_LOG(LogFMOD, Log, TEXT("FFMODStudioModule::LoadDll: Loading %s"), *LibPath); + // Unfortunately Unreal's platform loading code hasn't been implemented on all platforms so we wrap it + Handle = FMODPlatformLoadDll(*LibPath); +#if WITH_EDITOR + if (!Handle) + { + FString Message = TEXT("Couldn't load FMOD DLL ") + LibPath; + FPlatformMisc::MessageBoxExt(EAppMsgType::Ok, *Message, TEXT("Error")); + } +#endif + if (!Handle) + { + UE_LOG(LogFMOD, Error, TEXT("Failed to load FMOD DLL '%s', FMOD sounds will not play!"), *LibPath); + } + return Handle; +} + +FString FFMODStudioModule::GetDllPath(const TCHAR* ShortName) +{ +#if PLATFORM_MAC + return FString::Printf(TEXT("%s/Mac/lib%s.dylib"), *BaseLibPath, ShortName); +#elif PLATFORM_PS4 + FString ShortLibPath = BaseLibPath.ToLower(); + while (ShortLibPath.StartsWith(TEXT("../"))) + { + ShortLibPath = ShortLibPath.RightChop(3); + } + return FString::Printf(TEXT("/app0/%s/ps4/lib%s.prx"), *ShortLibPath, ShortName); +#elif PLATFORM_XBOXONE + return FString::Printf(TEXT("%s.dll"), ShortName); +#elif PLATFORM_ANDROID + return FString::Printf(TEXT("lib%s.so"), ShortName); +#elif PLATFORM_LINUX + return FString::Printf(TEXT("lib%s.so"), ShortName); +#elif PLATFORM_WINDOWS + #if PLATFORM_64BITS + return FString::Printf(TEXT("%s/Win64/%s.dll"), *BaseLibPath, ShortName); + #else + return FString::Printf(TEXT("%s/Win32/%s.dll"), *BaseLibPath, ShortName); + #endif +#else + UE_LOG(LogFMOD, Error, TEXT("Unsupported platform for dynamic libs")); + return ""; +#endif +} + +bool FFMODStudioModule::LoadLibraries() +{ +#if PLATFORM_IOS || PLATFORM_ANDROID || PLATFORM_LINUX + return true; // Nothing to do on those platforms +#elif PLATFORM_HTML5 + UE_LOG(LogFMOD, Error, TEXT("FMOD Studio not supported on HTML5")); + return false; // Explicitly don't support this +#else + UE_LOG(LogFMOD, Verbose, TEXT("FFMODStudioModule::LoadLibraries")); + +#if defined(FMODSTUDIO_LINK_DEBUG) + FString ConfigName = TEXT("D"); +#elif defined(FMODSTUDIO_LINK_LOGGING) + FString ConfigName = TEXT("L"); +#elif defined(FMODSTUDIO_LINK_RELEASE) + FString ConfigName = TEXT(""); +#else + #error FMODSTUDIO_LINK not defined +#endif + +#if PLATFORM_WINDOWS && PLATFORM_64BITS + ConfigName += TEXT("64"); +#endif + + FString LowLevelName = FString(TEXT("fmod")) + ConfigName; + FString StudioName = FString(TEXT("fmodstudio")) + ConfigName; + LowLevelLibHandle = LoadDll(*LowLevelName); + StudioLibHandle = LoadDll(*StudioName); + return (LowLevelLibHandle != nullptr && StudioLibHandle != nullptr); +#endif +} + +void FFMODStudioModule::StartupModule() +{ + UE_LOG(LogFMOD, Log, TEXT("FFMODStudioModule startup")); + BaseLibPath = IPluginManager::Get().FindPlugin(TEXT("FMODStudio"))->GetBaseDir() + TEXT("/Binaries"); + UE_LOG(LogFMOD, Log, TEXT(" Lib path = '%s'"), *BaseLibPath); + + if(FParse::Param(FCommandLine::Get(),TEXT("nosound")) || FApp::IsBenchmarking() || IsRunningDedicatedServer() || IsRunningCommandlet()) + { + bUseSound = false; + } + + if(FParse::Param(FCommandLine::Get(),TEXT("noliveupdate"))) + { + bAllowLiveUpdate = false; + } + + if (LoadLibraries()) + { + verifyfmod(FMOD::Memory_Initialize(0, 0, FMODMemoryAlloc, FMODMemoryRealloc, FMODMemoryFree)); + + // Create sandbox system just for asset loading + AssetTable.Create(); + RefreshSettings(); + + if (GIsEditor) + { + CreateStudioSystem(EFMODSystemContext::Auditioning); + } + else + { + SetInPIE(true, false); + } + } + + OnTick = FTickerDelegate::CreateRaw( this, &FFMODStudioModule::Tick ); + TickDelegateHandle = FTicker::GetCoreTicker().AddTicker( OnTick ); + + if (GIsEditor) + { + BankUpdateNotifier.BanksUpdatedEvent.AddRaw(this, &FFMODStudioModule::HandleBanksUpdated); + } +} + +inline FMOD_SPEAKERMODE ConvertSpeakerMode(EFMODSpeakerMode::Type Mode) +{ + switch (Mode) + { + case EFMODSpeakerMode::Stereo: + return FMOD_SPEAKERMODE_STEREO; + case EFMODSpeakerMode::Surround_5_1: + return FMOD_SPEAKERMODE_5POINT1; + case EFMODSpeakerMode::Surround_7_1: + return FMOD_SPEAKERMODE_7POINT1; + default: + check(0); + return FMOD_SPEAKERMODE_DEFAULT; + }; +} + +void FFMODStudioModule::CreateStudioSystem(EFMODSystemContext::Type Type) +{ + DestroyStudioSystem(Type); + if (!bUseSound) + { + return; + } + + UE_LOG(LogFMOD, Verbose, TEXT("CreateStudioSystem for context %s"), FMODSystemContextNames[Type]); + + const UFMODSettings& Settings = *GetDefault(); + + FMOD_SPEAKERMODE OutputMode = ConvertSpeakerMode(Settings.OutputFormat); + FMOD_STUDIO_INITFLAGS StudioInitFlags = FMOD_STUDIO_INIT_NORMAL; + FMOD_INITFLAGS InitFlags = FMOD_INIT_NORMAL; + if (Type == EFMODSystemContext::Auditioning) + { + StudioInitFlags |= FMOD_STUDIO_INIT_ALLOW_MISSING_PLUGINS; + } + else if (Type == EFMODSystemContext::Runtime && Settings.bEnableLiveUpdate && bAllowLiveUpdate) + { +#if (defined(FMODSTUDIO_LINK_DEBUG) || defined(FMODSTUDIO_LINK_LOGGING)) + UE_LOG(LogFMOD, Verbose, TEXT("Enabling live update")); + StudioInitFlags |= FMOD_STUDIO_INIT_LIVEUPDATE; +#endif + } + + FMOD::Debug_Initialize(FMOD_DEBUG_LEVEL_WARNING, FMOD_DEBUG_MODE_CALLBACK, FMODLogCallback); + + verifyfmod(FMOD::Studio::System::create(&StudioSystem[Type])); + FMOD::System* lowLevelSystem = nullptr; + verifyfmod(StudioSystem[Type]->getLowLevelSystem(&lowLevelSystem)); + verifyfmod(lowLevelSystem->setSoftwareFormat(Settings.SampleRate, OutputMode, 0)); + verifyfmod(lowLevelSystem->setSoftwareChannels(Settings.RealChannelCount)); + verifyfmod(lowLevelSystem->setFileSystem(FMODOpen, FMODClose, FMODRead, FMODSeek, 0, 0, 2048)); + + if (Settings.DSPBufferLength > 0 && Settings.DSPBufferCount > 0) + { + verifyfmod(lowLevelSystem->setDSPBufferSize(Settings.DSPBufferLength, Settings.DSPBufferCount)); + } + + verifyfmod(FMODPlatformSystemSetup()); + + FMOD_ADVANCEDSETTINGS advSettings = {0}; + advSettings.cbSize = sizeof(advSettings); + if (Settings.bVol0Virtual) + { + advSettings.vol0virtualvol = Settings.Vol0VirtualLevel; + InitFlags |= FMOD_INIT_VOL0_BECOMES_VIRTUAL; + } +#if PLATFORM_IOS || PLATFORM_ANDROID + advSettings.maxADPCMCodecs = Settings.RealChannelCount; +#elif PLATFORM_PS4 + advSettings.maxAT9Codecs = Settings.RealChannelCount; +#elif PLATFORM_XBOXONE + advSettings.maxXMACodecs = Settings.RealChannelCount; +#else + advSettings.maxVorbisCodecs = Settings.RealChannelCount; +#endif + advSettings.profilePort = Settings.LiveUpdatePort; + advSettings.randomSeed = FMath::Rand(); + verifyfmod(lowLevelSystem->setAdvancedSettings(&advSettings)); + + FMOD_STUDIO_ADVANCEDSETTINGS advStudioSettings = {0}; + advStudioSettings.cbSize = sizeof(advStudioSettings); + advStudioSettings.studioUpdatePeriod = Settings.StudioUpdatePeriod; + verifyfmod(StudioSystem[Type]->setAdvancedSettings(&advStudioSettings)); + + verifyfmod(StudioSystem[Type]->initialize(Settings.TotalChannelCount, StudioInitFlags, InitFlags, 0)); + + // Don't bother loading plugins during editor, only during PIE or in game + if (Type == EFMODSystemContext::Runtime) + { + for (FString PluginName : Settings.PluginFiles) + { + LoadPlugin(*PluginName); + } + } +} + +void FFMODStudioModule::DestroyStudioSystem(EFMODSystemContext::Type Type) +{ + UE_LOG(LogFMOD, Verbose, TEXT("DestroyStudioSystem for context %s"), FMODSystemContextNames[Type]); + + if (StudioSystem[Type]) + { + verifyfmod(StudioSystem[Type]->release()); + StudioSystem[Type] = nullptr; + } +} + +bool FFMODStudioModule::Tick( float DeltaTime ) +{ + bListenerMoved = false; + + if (GIsEditor) + { + BankUpdateNotifier.Update(); + } + + if (StudioSystem[EFMODSystemContext::Auditioning]) + { + verifyfmod(StudioSystem[EFMODSystemContext::Auditioning]->update()); + } + if (StudioSystem[EFMODSystemContext::Runtime]) + { + UpdateViewportPosition(); + + verifyfmod(StudioSystem[EFMODSystemContext::Runtime]->update()); + } + + return true; +} + +void FFMODStudioModule::UpdateViewportPosition() +{ + int ListenerIndex = 0; + + UWorld* ViewportWorld = nullptr; + if(GEngine && GEngine->GameViewport) + { + ViewportWorld = GEngine->GameViewport->GetWorld(); + } + + bool bCameraCut = false; // Not sure how to get View->bCameraCut from here + float DeltaSeconds = ((bCameraCut || !ViewportWorld) ? 0.f : ViewportWorld->GetDeltaSeconds()); + + if (ViewportWorld) + { + for( FConstPlayerControllerIterator Iterator = ViewportWorld->GetPlayerControllerIterator(); Iterator; ++Iterator ) + { + APlayerController* PlayerController = *Iterator; + if( PlayerController ) + { + ULocalPlayer* LocalPlayer = Cast(PlayerController->Player); + if (LocalPlayer) + { + FVector Location; + FVector ProjFront; + FVector ProjRight; + PlayerController->GetAudioListenerPosition(/*out*/ Location, /*out*/ ProjFront, /*out*/ ProjRight); + FVector ProjUp = FVector::CrossProduct(ProjFront, ProjRight); + + FTransform ListenerTransform(FRotationMatrix::MakeFromXY(ProjFront, ProjRight)); + ListenerTransform.SetTranslation(Location); + ListenerTransform.NormalizeRotation(); + + SetListenerPosition(ListenerIndex, ViewportWorld, ListenerTransform, DeltaSeconds); + + ListenerIndex++; + } + } + } + FinishSetListenerPosition(ListenerIndex, DeltaSeconds); + } +} + +bool FFMODStudioModule::HasListenerMoved() +{ + return bListenerMoved; +} + +void FFMODStudioModule::ResetInterpolation() +{ + for (FFMODListener& Listener : Listeners) + { + Listener = FFMODListener(); + } +} + +const FFMODListener& FFMODStudioModule::GetNearestListener(const FVector& Location) +{ + float BestDistSq = FLT_MAX; + int BestListener = 0; + for (int i = 0; i < ListenerCount; ++i) + { + const float DistSq = FVector::DistSquared(Location, Listeners[i].Transform.GetTranslation()); + if (DistSq < BestDistSq) + { + BestListener = i; + BestDistSq = DistSq; + } + } + return Listeners[BestListener]; +} + +// Partially copied from FAudioDevice::SetListener +void FFMODStudioModule::SetListenerPosition(int ListenerIndex, UWorld* World, const FTransform& ListenerTransform, float DeltaSeconds) +{ + FMOD::Studio::System* System = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime); + if (System && ListenerIndex < MAX_LISTENERS) + { + FVector ListenerPos = ListenerTransform.GetTranslation(); + + FInteriorSettings InteriorSettings; + AAudioVolume* Volume = World->GetAudioSettings(ListenerPos, NULL, &InteriorSettings); + + Listeners[ListenerIndex].Velocity = DeltaSeconds > 0.f ? + (ListenerTransform.GetTranslation() - Listeners[ ListenerIndex ].Transform.GetTranslation()) / DeltaSeconds + : FVector::ZeroVector; + + Listeners[ListenerIndex].Transform = ListenerTransform; + + Listeners[ListenerIndex].ApplyInteriorSettings(Volume, InteriorSettings); + + // We are using a direct copy of the inbuilt transforms but the directions come out wrong. + // Several of the audio functions use GetFront() for right, so we do the same here. + const FVector Up = Listeners[ListenerIndex].GetUp(); + const FVector Right = Listeners[ListenerIndex].GetFront(); + const FVector Forward = Right ^ Up; + + FMOD_3D_ATTRIBUTES Attributes = {{0}}; + Attributes.position = FMODUtils::ConvertWorldVector(ListenerPos); + Attributes.forward = FMODUtils::ConvertUnitVector(Forward); + Attributes.up = FMODUtils::ConvertUnitVector(Up); + Attributes.velocity = FMODUtils::ConvertWorldVector(Listeners[ListenerIndex].Velocity); + +#if FMOD_VERSION >= 0x00010600 + // Expand number of listeners dynamically + if (ListenerIndex >= ListenerCount) + { + Listeners[ListenerIndex] = FFMODListener(); + ListenerCount = ListenerIndex+1; + verifyfmod(System->setNumListeners(ListenerCount)); + } + verifyfmod(System->setListenerAttributes(ListenerIndex, &Attributes)); +#else + verifyfmod(System->setListenerAttributes(&Attributes)); +#endif + + bListenerMoved = true; + } +} + +void FFMODStudioModule::FinishSetListenerPosition(int NumListeners, float DeltaSeconds) +{ + FMOD::Studio::System* System = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime); + if (!System) + { + return; + } + + // Shrink number of listeners if we have less than our current count + NumListeners = FMath::Max(NumListeners, 1); + if (System && NumListeners < ListenerCount) + { + ListenerCount = NumListeners; +#if FMOD_VERSION >= 0x00010600 + verifyfmod(System->setNumListeners(ListenerCount)); +#endif + } + + for (int i = 0; i < ListenerCount; ++i) + { + Listeners[i].UpdateCurrentInteriorSettings(); + } + + // Apply a reverb snapshot from the listener position(s) + AAudioVolume* BestVolume = nullptr; + for (int i = 0; i < ListenerCount; ++i) + { + AAudioVolume* CandidateVolume = Listeners[i].Volume; + if (BestVolume == nullptr || (CandidateVolume != nullptr && CandidateVolume->Priority > BestVolume->Priority)) + { + BestVolume = CandidateVolume; + } + } + UFMODSnapshotReverb* NewSnapshot = nullptr; + if (BestVolume && BestVolume->Settings.bApplyReverb) + { + NewSnapshot = Cast(BestVolume->Settings.ReverbEffect); + } + + if (NewSnapshot != nullptr) + { + FString NewSnapshotName = FMODUtils::LookupNameFromGuid(System, NewSnapshot->AssetGuid); + UE_LOG(LogFMOD, Verbose, TEXT("Starting new snapshot '%s'"), *NewSnapshotName); + + // Try to steal old entry + FFMODSnapshotEntry SnapshotEntry; + int SnapshotEntryIndex = -1; + for (int i=0; iAssetGuid); + FMOD::Studio::EventInstance* NewInstance = nullptr; + FMOD::Studio::EventDescription* EventDesc = nullptr; + System->getEventByID(&Guid, &EventDesc); + if (EventDesc) + { + EventDesc->createInstance(&NewInstance); + if (NewInstance) + { + NewInstance->setParameterValue("Intensity", 0.0f); + NewInstance->start(); + } + } + + SnapshotEntryIndex = ReverbSnapshots.Num(); + ReverbSnapshots.Push(FFMODSnapshotEntry(NewSnapshot, NewInstance)); + } + // Fade up + if (ReverbSnapshots[SnapshotEntryIndex].FadeIntensityEnd == 0.0f) + { + ReverbSnapshots[SnapshotEntryIndex].FadeTo(BestVolume->Settings.Volume, BestVolume->Settings.FadeTime); + } + } + // Fade out all other entries + for (int i=0; i %f"), ReverbSnapshots[i].FadeIntensityStart, ReverbSnapshots[i].FadeIntensityEnd, ReverbSnapshots[i].CurrentIntensity()); + ReverbSnapshots[i].Instance->setParameterValue("Intensity", 100.0f * ReverbSnapshots[i].CurrentIntensity()); + + if (ReverbSnapshots[i].Snapshot != NewSnapshot) + { + // Start fading out if needed + if (ReverbSnapshots[i].FadeIntensityEnd != 0.0f) + { + ReverbSnapshots[i].FadeTo(0.0f, ReverbSnapshots[i].FadeDuration); + } + // Finish fading out and remove + else if (ReverbSnapshots[i].CurrentIntensity() == 0.0f) + { + UE_LOG(LogFMOD, Verbose, TEXT("Removing snapshot")); + + ReverbSnapshots[i].Instance->stop(FMOD_STUDIO_STOP_ALLOWFADEOUT); + ReverbSnapshots[i].Instance->release(); + ReverbSnapshots.RemoveAt(i); + --i; // removed entry, redo current index for next one + } + } + } +} + + +void FFMODStudioModule::RefreshSettings() +{ + AssetTable.Refresh(); + if (GIsEditor) + { + const UFMODSettings& Settings = *GetDefault(); + BankUpdateNotifier.SetFilePath(Settings.GetMasterStringsBankPath()); + } +} + + +void FFMODStudioModule::SetInPIE(bool bInPIE, bool simulating) +{ + bIsInPIE = bInPIE; + bSimulating = simulating; + bListenerMoved = true; + ResetInterpolation(); + + if (GIsEditor) + { + BankUpdateNotifier.EnableUpdate(!bInPIE); + } + + if (bInPIE) + { + if (StudioSystem[EFMODSystemContext::Auditioning]) + { + // We currently don't tear down auditioning system but we do stop the playing event. + if (AuditioningInstance) + { + AuditioningInstance->stop(FMOD_STUDIO_STOP_IMMEDIATE); + AuditioningInstance = nullptr; + } + // Also make sure banks are finishing loading so they aren't grabbing file handles. + StudioSystem[EFMODSystemContext::Auditioning]->flushCommands(); + } + + UE_LOG(LogFMOD, Log, TEXT("Creating runtime Studio System")); + ListenerCount = 1; + CreateStudioSystem(EFMODSystemContext::Runtime); + + UE_LOG(LogFMOD, Log, TEXT("Loading Banks")); + LoadBanks(EFMODSystemContext::Runtime); + + } + else + { + ReverbSnapshots.Reset(); + DestroyStudioSystem(EFMODSystemContext::Runtime); + } +} + +UFMODAsset* FFMODStudioModule::FindAssetByName(const FString& Name) +{ + return AssetTable.FindByName(Name); +} + +UFMODEvent* FFMODStudioModule::FindEventByName(const FString& Name) +{ + UFMODAsset* Asset = AssetTable.FindByName(Name); + return Cast(Asset); +} + +void FFMODStudioModule::SetSystemPaused(bool paused) +{ + if (StudioSystem[EFMODSystemContext::Runtime]) + { + FMOD::System* LowLevelSystem = nullptr; + verifyfmod(StudioSystem[EFMODSystemContext::Runtime]->getLowLevelSystem(&LowLevelSystem)); + FMOD::ChannelGroup* MasterChannelGroup = nullptr; + verifyfmod(LowLevelSystem->getMasterChannelGroup(&MasterChannelGroup)); + verifyfmod(MasterChannelGroup->setPaused(paused)); + } +} + +void FFMODStudioModule::PostLoadCallback() +{ +} + +void FFMODStudioModule::ShutdownModule() +{ + UE_LOG(LogFMOD, Verbose, TEXT("FFMODStudioModule shutdown")); + + DestroyStudioSystem(EFMODSystemContext::Auditioning); + DestroyStudioSystem(EFMODSystemContext::Runtime); + + if (GIsEditor) + { + BankUpdateNotifier.BanksUpdatedEvent.RemoveAll(this); + } + + if (UObjectInitialized()) + { + // Unregister tick function. + FTicker::GetCoreTicker().RemoveTicker(TickDelegateHandle); + } + + UE_LOG(LogFMOD, Verbose, TEXT("FFMODStudioModule unloading dynamic libraries")); + if (StudioLibHandle) + { + FPlatformProcess::FreeDllHandle(StudioLibHandle); + StudioLibHandle = nullptr; + } + if (LowLevelLibHandle) + { + FPlatformProcess::FreeDllHandle(LowLevelLibHandle); + LowLevelLibHandle = nullptr; + } + UE_LOG(LogFMOD, Verbose, TEXT("FFMODStudioModule finished unloading")); +} + +struct NamedBankEntry +{ + NamedBankEntry() : Bank(nullptr) { } + NamedBankEntry(const FString& InName, FMOD::Studio::Bank* InBank, FMOD_RESULT InResult) : Name(InName), Bank(InBank), Result(InResult) { } + + FString Name; + FMOD::Studio::Bank* Bank; + FMOD_RESULT Result; +}; + +void FFMODStudioModule::LoadBanks(EFMODSystemContext::Type Type) +{ + const UFMODSettings& Settings = *GetDefault(); + + FailedBankLoads[Type].Reset(); + if (Type == EFMODSystemContext::Auditioning) + { + RequiredPlugins.Reset(); + } + + if (StudioSystem[Type] != nullptr && Settings.IsBankPathSet()) + { + UE_LOG(LogFMOD, Verbose, TEXT("LoadBanks for context %s"), FMODSystemContextNames[Type]); + + /* + Queue up all banks to load asynchronously then wait at the end. + */ + bool bLoadAllBanks = ((Type == EFMODSystemContext::Auditioning) || Settings.bLoadAllBanks); + bool bLoadSampleData = ((Type == EFMODSystemContext::Runtime) && Settings.bLoadAllSampleData); + FMOD_STUDIO_LOAD_BANK_FLAGS BankFlags = (bLoadSampleData ? FMOD_STUDIO_LOAD_BANK_NORMAL : FMOD_STUDIO_LOAD_BANK_NONBLOCKING); + + // Always load the master bank at startup + FString MasterBankPath = Settings.GetMasterBankPath(); + UE_LOG(LogFMOD, Verbose, TEXT("Loading master bank: %s"), *MasterBankPath); + + TArray BankEntries; + + FMOD::Studio::Bank* MasterBank = nullptr; + FMOD_RESULT Result; + Result = StudioSystem[Type]->loadBankFile(TCHAR_TO_UTF8(*MasterBankPath), BankFlags, &MasterBank); + BankEntries.Add(NamedBankEntry(MasterBankPath, MasterBank, Result)); + if (Result == FMOD_OK) + { + if (bLoadSampleData) + { + verifyfmod(MasterBank->loadSampleData()); + } + + // Auditioning needs string bank to get back full paths from events + // Runtime could do without it, but if we load it we can look up guids to names which is helpful + { + FString StringsBankPath = Settings.GetMasterStringsBankPath(); + UE_LOG(LogFMOD, Verbose, TEXT("Loading strings bank: %s"), *StringsBankPath); + FMOD::Studio::Bank* StringsBank = nullptr; + Result = StudioSystem[Type]->loadBankFile(TCHAR_TO_UTF8(*StringsBankPath), BankFlags, &StringsBank); + BankEntries.Add(NamedBankEntry(StringsBankPath, StringsBank, Result)); + } + + // Optionally load all banks in the directory + if (bLoadAllBanks) + { + UE_LOG(LogFMOD, Verbose, TEXT("Loading all banks")); + TArray BankFiles; + Settings.GetAllBankPaths(BankFiles); + for ( const FString& OtherFile : BankFiles ) + { + if (Settings.SkipLoadBankName.Len() && OtherFile.Contains(Settings.SkipLoadBankName)) + { + UE_LOG(LogFMOD, Log, TEXT("Skipping bank: %s"), *OtherFile); + continue; + } + UE_LOG(LogFMOD, Log, TEXT("Loading bank: %s"), *OtherFile); + + FMOD::Studio::Bank* OtherBank; + Result = StudioSystem[Type]->loadBankFile(TCHAR_TO_UTF8(*OtherFile), BankFlags, &OtherBank); + BankEntries.Add(NamedBankEntry(OtherFile, OtherBank, Result)); + if (Result == FMOD_OK) + { + if (bLoadSampleData) + { + verifyfmod(OtherBank->loadSampleData()); + } + } + } + } + } + // Wait for all banks to load. + StudioSystem[Type]->flushCommands(); + + for (NamedBankEntry& Entry : BankEntries) + { + if (Entry.Result == FMOD_OK) + { + FMOD_STUDIO_LOADING_STATE BankLoadingState = FMOD_STUDIO_LOADING_STATE_ERROR; + Entry.Result = Entry.Bank->getLoadingState(&BankLoadingState); + if (BankLoadingState == FMOD_STUDIO_LOADING_STATE_ERROR) + { + Entry.Bank->unload(); + Entry.Bank = nullptr; + } + } + if (Entry.Bank == nullptr || Entry.Result != FMOD_OK) + { + FString ErrorMessage; + if (!FPaths::FileExists(Entry.Name)) + { + ErrorMessage = "File does not exist"; + } + else + { + ErrorMessage = UTF8_TO_TCHAR(FMOD_ErrorString(Entry.Result)); + } + UE_LOG(LogFMOD, Warning, TEXT("Failed to bank: %s (%s)"), *Entry.Name, *ErrorMessage); + FailedBankLoads[Type].Add(FString::Printf(TEXT("%s (%s)"), *FPaths::GetBaseFilename(Entry.Name), *ErrorMessage)); + } + } + } +} + +void FFMODStudioModule::HandleBanksUpdated() +{ + UE_LOG(LogFMOD, Verbose, TEXT("Refreshing auditioning system")); + + DestroyStudioSystem(EFMODSystemContext::Auditioning); + + AssetTable.Refresh(); + + CreateStudioSystem(EFMODSystemContext::Auditioning); + LoadBanks(EFMODSystemContext::Auditioning); + + BanksReloadedDelegate.Broadcast(); + +} + +FMOD::Studio::System* FFMODStudioModule::GetStudioSystem(EFMODSystemContext::Type Context) +{ + if (Context == EFMODSystemContext::Max) + { + Context = (bIsInPIE ? EFMODSystemContext::Runtime : EFMODSystemContext::Auditioning); + } + return StudioSystem[Context]; +} + + +FMOD::Studio::EventDescription* FFMODStudioModule::GetEventDescription(const UFMODEvent* Event, EFMODSystemContext::Type Context) +{ + if (Context == EFMODSystemContext::Max) + { + Context = (bIsInPIE ? EFMODSystemContext::Runtime : EFMODSystemContext::Auditioning); + } + if (StudioSystem[Context] != nullptr && Event != nullptr && Event->AssetGuid.IsValid()) + { + FMOD::Studio::ID Guid = FMODUtils::ConvertGuid(Event->AssetGuid); + FMOD::Studio::EventDescription* EventDesc = nullptr; + StudioSystem[Context]->getEventByID(&Guid, &EventDesc); + return EventDesc; + } + return nullptr; +} + +FMOD::Studio::EventInstance* FFMODStudioModule::CreateAuditioningInstance(const UFMODEvent* Event) +{ + StopAuditioningInstance(); + + FMOD::Studio::EventDescription* EventDesc = GetEventDescription(Event, EFMODSystemContext::Auditioning); + if (EventDesc) + { + FMOD_RESULT Result = EventDesc->createInstance(&AuditioningInstance); + if (Result == FMOD_OK) + { + return AuditioningInstance; + } + } + return nullptr; +} + +void FFMODStudioModule::StopAuditioningInstance() +{ + if (AuditioningInstance) + { + // Don't bother checking for errors just in case auditioning is already shutting down + AuditioningInstance->stop(FMOD_STUDIO_STOP_ALLOWFADEOUT); + AuditioningInstance->release(); + AuditioningInstance = nullptr; + } +} diff --git a/Plugins/FMODStudio/Source/FMODStudio/Private/FMODStudioPrivatePCH.h b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODStudioPrivatePCH.h new file mode 100644 index 0000000..76103c2 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODStudioPrivatePCH.h @@ -0,0 +1,11 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. +#pragma once + +#include "Engine.h" +#include "Components/SceneComponent.h" +#include "Runtime/Launch/Resources/Version.h" +#if WITH_EDITOR +#include "UnrealEd.h" +#endif +DECLARE_LOG_CATEGORY_EXTERN(LogFMOD, Log, All); + diff --git a/Plugins/FMODStudio/Source/FMODStudio/Private/FMODVCA.cpp b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODVCA.cpp new file mode 100644 index 0000000..4bdb6e3 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Private/FMODVCA.cpp @@ -0,0 +1,22 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#include "FMODStudioPrivatePCH.h" +#include "FMODVCA.h" +#include "FMODStudioModule.h" + +UFMODVCA::UFMODVCA(const FObjectInitializer& ObjectInitializer) + : Super(ObjectInitializer) +{ +} + +/** Get tags to show in content view */ +void UFMODVCA::GetAssetRegistryTags(TArray& OutTags) const +{ + Super::GetAssetRegistryTags(OutTags); +} + +FString UFMODVCA::GetDesc() +{ + return FString::Printf( TEXT( "VCA %s" ), *AssetGuid.ToString(EGuidFormats::DigitsWithHyphensInBraces) ); +} + diff --git a/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod.h b/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod.h new file mode 100644 index 0000000..47d2de7 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod.h @@ -0,0 +1,718 @@ +/*$ preserve start $*/ + +/* ======================================================================================== */ +/* FMOD Studio Low Level API - C header file. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. */ +/* */ +/* Use this header in conjunction with fmod_common.h (which contains all the constants / */ +/* callbacks) to develop using C interface. */ +/* ======================================================================================== */ + +#ifndef _FMOD_H +#define _FMOD_H + +#include "fmod_common.h" + +/* ========================================================================================== */ +/* FUNCTION PROTOTYPES */ +/* ========================================================================================== */ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* + FMOD global system functions (optional). +*/ + +FMOD_RESULT F_API FMOD_Memory_Initialize (void *poolmem, int poollen, FMOD_MEMORY_ALLOC_CALLBACK useralloc, FMOD_MEMORY_REALLOC_CALLBACK userrealloc, FMOD_MEMORY_FREE_CALLBACK userfree, FMOD_MEMORY_TYPE memtypeflags); +FMOD_RESULT F_API FMOD_Memory_GetStats (int *currentalloced, int *maxalloced, FMOD_BOOL blocking); +FMOD_RESULT F_API FMOD_Debug_Initialize (FMOD_DEBUG_FLAGS flags, FMOD_DEBUG_MODE mode, FMOD_DEBUG_CALLBACK callback, const char *filename); +FMOD_RESULT F_API FMOD_File_SetDiskBusy (int busy); +FMOD_RESULT F_API FMOD_File_GetDiskBusy (int *busy); + +/* + FMOD System factory functions. Use this to create an FMOD System Instance. below you will see FMOD_System_Init/Close to get started. +*/ + +FMOD_RESULT F_API FMOD_System_Create (FMOD_SYSTEM **system); +FMOD_RESULT F_API FMOD_System_Release (FMOD_SYSTEM *system); + +/*$ preserve end $*/ + +/* + 'System' API +*/ + +/* + Setup functions. +*/ + +FMOD_RESULT F_API FMOD_System_SetOutput (FMOD_SYSTEM *system, FMOD_OUTPUTTYPE output); +FMOD_RESULT F_API FMOD_System_GetOutput (FMOD_SYSTEM *system, FMOD_OUTPUTTYPE *output); +FMOD_RESULT F_API FMOD_System_GetNumDrivers (FMOD_SYSTEM *system, int *numdrivers); +FMOD_RESULT F_API FMOD_System_GetDriverInfo (FMOD_SYSTEM *system, int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels); +FMOD_RESULT F_API FMOD_System_SetDriver (FMOD_SYSTEM *system, int driver); +FMOD_RESULT F_API FMOD_System_GetDriver (FMOD_SYSTEM *system, int *driver); +FMOD_RESULT F_API FMOD_System_SetSoftwareChannels (FMOD_SYSTEM *system, int numsoftwarechannels); +FMOD_RESULT F_API FMOD_System_GetSoftwareChannels (FMOD_SYSTEM *system, int *numsoftwarechannels); +FMOD_RESULT F_API FMOD_System_SetSoftwareFormat (FMOD_SYSTEM *system, int samplerate, FMOD_SPEAKERMODE speakermode, int numrawspeakers); +FMOD_RESULT F_API FMOD_System_GetSoftwareFormat (FMOD_SYSTEM *system, int *samplerate, FMOD_SPEAKERMODE *speakermode, int *numrawspeakers); +FMOD_RESULT F_API FMOD_System_SetDSPBufferSize (FMOD_SYSTEM *system, unsigned int bufferlength, int numbuffers); +FMOD_RESULT F_API FMOD_System_GetDSPBufferSize (FMOD_SYSTEM *system, unsigned int *bufferlength, int *numbuffers); +FMOD_RESULT F_API FMOD_System_SetFileSystem (FMOD_SYSTEM *system, FMOD_FILE_OPEN_CALLBACK useropen, FMOD_FILE_CLOSE_CALLBACK userclose, FMOD_FILE_READ_CALLBACK userread, FMOD_FILE_SEEK_CALLBACK userseek, FMOD_FILE_ASYNCREAD_CALLBACK userasyncread, FMOD_FILE_ASYNCCANCEL_CALLBACK userasynccancel, int blockalign); +FMOD_RESULT F_API FMOD_System_AttachFileSystem (FMOD_SYSTEM *system, FMOD_FILE_OPEN_CALLBACK useropen, FMOD_FILE_CLOSE_CALLBACK userclose, FMOD_FILE_READ_CALLBACK userread, FMOD_FILE_SEEK_CALLBACK userseek); +FMOD_RESULT F_API FMOD_System_SetAdvancedSettings (FMOD_SYSTEM *system, FMOD_ADVANCEDSETTINGS *settings); +FMOD_RESULT F_API FMOD_System_GetAdvancedSettings (FMOD_SYSTEM *system, FMOD_ADVANCEDSETTINGS *settings); +FMOD_RESULT F_API FMOD_System_SetCallback (FMOD_SYSTEM *system, FMOD_SYSTEM_CALLBACK callback, FMOD_SYSTEM_CALLBACK_TYPE callbackmask); + +/* + Plug-in support. +*/ + +FMOD_RESULT F_API FMOD_System_SetPluginPath (FMOD_SYSTEM *system, const char *path); +FMOD_RESULT F_API FMOD_System_LoadPlugin (FMOD_SYSTEM *system, const char *filename, unsigned int *handle, unsigned int priority); +FMOD_RESULT F_API FMOD_System_UnloadPlugin (FMOD_SYSTEM *system, unsigned int handle); +FMOD_RESULT F_API FMOD_System_GetNumPlugins (FMOD_SYSTEM *system, FMOD_PLUGINTYPE plugintype, int *numplugins); +FMOD_RESULT F_API FMOD_System_GetPluginHandle (FMOD_SYSTEM *system, FMOD_PLUGINTYPE plugintype, int index, unsigned int *handle); +FMOD_RESULT F_API FMOD_System_GetPluginInfo (FMOD_SYSTEM *system, unsigned int handle, FMOD_PLUGINTYPE *plugintype, char *name, int namelen, unsigned int *version); +FMOD_RESULT F_API FMOD_System_SetOutputByPlugin (FMOD_SYSTEM *system, unsigned int handle); +FMOD_RESULT F_API FMOD_System_GetOutputByPlugin (FMOD_SYSTEM *system, unsigned int *handle); +FMOD_RESULT F_API FMOD_System_CreateDSPByPlugin (FMOD_SYSTEM *system, unsigned int handle, FMOD_DSP **dsp); +FMOD_RESULT F_API FMOD_System_GetDSPInfoByPlugin (FMOD_SYSTEM *system, unsigned int handle, const FMOD_DSP_DESCRIPTION **description); +FMOD_RESULT F_API FMOD_System_RegisterCodec (FMOD_SYSTEM *system, FMOD_CODEC_DESCRIPTION *description, unsigned int *handle, unsigned int priority); +FMOD_RESULT F_API FMOD_System_RegisterDSP (FMOD_SYSTEM *system, const FMOD_DSP_DESCRIPTION *description, unsigned int *handle); +FMOD_RESULT F_API FMOD_System_RegisterOutput (FMOD_SYSTEM *system, const FMOD_OUTPUT_DESCRIPTION *description, unsigned int *handle); + +/* + Init/Close. +*/ + +FMOD_RESULT F_API FMOD_System_Init (FMOD_SYSTEM *system, int maxchannels, FMOD_INITFLAGS flags, void *extradriverdata); +FMOD_RESULT F_API FMOD_System_Close (FMOD_SYSTEM *system); + +/* + General post-init system functions. +*/ + +FMOD_RESULT F_API FMOD_System_Update (FMOD_SYSTEM *system); + +FMOD_RESULT F_API FMOD_System_SetSpeakerPosition (FMOD_SYSTEM *system, FMOD_SPEAKER speaker, float x, float y, FMOD_BOOL active); +FMOD_RESULT F_API FMOD_System_GetSpeakerPosition (FMOD_SYSTEM *system, FMOD_SPEAKER speaker, float *x, float *y, FMOD_BOOL *active); +FMOD_RESULT F_API FMOD_System_SetStreamBufferSize (FMOD_SYSTEM *system, unsigned int filebuffersize, FMOD_TIMEUNIT filebuffersizetype); +FMOD_RESULT F_API FMOD_System_GetStreamBufferSize (FMOD_SYSTEM *system, unsigned int *filebuffersize, FMOD_TIMEUNIT *filebuffersizetype); +FMOD_RESULT F_API FMOD_System_Set3DSettings (FMOD_SYSTEM *system, float dopplerscale, float distancefactor, float rolloffscale); +FMOD_RESULT F_API FMOD_System_Get3DSettings (FMOD_SYSTEM *system, float *dopplerscale, float *distancefactor, float *rolloffscale); +FMOD_RESULT F_API FMOD_System_Set3DNumListeners (FMOD_SYSTEM *system, int numlisteners); +FMOD_RESULT F_API FMOD_System_Get3DNumListeners (FMOD_SYSTEM *system, int *numlisteners); +FMOD_RESULT F_API FMOD_System_Set3DListenerAttributes (FMOD_SYSTEM *system, int listener, const FMOD_VECTOR *pos, const FMOD_VECTOR *vel, const FMOD_VECTOR *forward, const FMOD_VECTOR *up); +FMOD_RESULT F_API FMOD_System_Get3DListenerAttributes (FMOD_SYSTEM *system, int listener, FMOD_VECTOR *pos, FMOD_VECTOR *vel, FMOD_VECTOR *forward, FMOD_VECTOR *up); +FMOD_RESULT F_API FMOD_System_Set3DRolloffCallback (FMOD_SYSTEM *system, FMOD_3D_ROLLOFF_CALLBACK callback); +FMOD_RESULT F_API FMOD_System_MixerSuspend (FMOD_SYSTEM *system); +FMOD_RESULT F_API FMOD_System_MixerResume (FMOD_SYSTEM *system); +FMOD_RESULT F_API FMOD_System_GetDefaultMixMatrix (FMOD_SYSTEM *system, FMOD_SPEAKERMODE sourcespeakermode, FMOD_SPEAKERMODE targetspeakermode, float *matrix, int matrixhop); +FMOD_RESULT F_API FMOD_System_GetSpeakerModeChannels (FMOD_SYSTEM *system, FMOD_SPEAKERMODE mode, int *channels); + +/* + System information functions. +*/ + +FMOD_RESULT F_API FMOD_System_GetVersion (FMOD_SYSTEM *system, unsigned int *version); +FMOD_RESULT F_API FMOD_System_GetOutputHandle (FMOD_SYSTEM *system, void **handle); +FMOD_RESULT F_API FMOD_System_GetChannelsPlaying (FMOD_SYSTEM *system, int *channels); +FMOD_RESULT F_API FMOD_System_GetChannelsReal (FMOD_SYSTEM *system, int *realchannels); +FMOD_RESULT F_API FMOD_System_GetCPUUsage (FMOD_SYSTEM *system, float *dsp, float *stream, float *geometry, float *update, float *total); +FMOD_RESULT F_API FMOD_System_GetSoundRAM (FMOD_SYSTEM *system, int *currentalloced, int *maxalloced, int *total); + +/* + Sound/DSP/Channel/FX creation and retrieval. +*/ + +FMOD_RESULT F_API FMOD_System_CreateSound (FMOD_SYSTEM *system, const char *name_or_data, FMOD_MODE mode, FMOD_CREATESOUNDEXINFO *exinfo, FMOD_SOUND **sound); +FMOD_RESULT F_API FMOD_System_CreateStream (FMOD_SYSTEM *system, const char *name_or_data, FMOD_MODE mode, FMOD_CREATESOUNDEXINFO *exinfo, FMOD_SOUND **sound); +FMOD_RESULT F_API FMOD_System_CreateDSP (FMOD_SYSTEM *system, const FMOD_DSP_DESCRIPTION *description, FMOD_DSP **dsp); +FMOD_RESULT F_API FMOD_System_CreateDSPByType (FMOD_SYSTEM *system, FMOD_DSP_TYPE type, FMOD_DSP **dsp); +FMOD_RESULT F_API FMOD_System_CreateChannelGroup (FMOD_SYSTEM *system, const char *name, FMOD_CHANNELGROUP **channelgroup); +FMOD_RESULT F_API FMOD_System_CreateSoundGroup (FMOD_SYSTEM *system, const char *name, FMOD_SOUNDGROUP **soundgroup); +FMOD_RESULT F_API FMOD_System_CreateReverb3D (FMOD_SYSTEM *system, FMOD_REVERB3D **reverb); + +FMOD_RESULT F_API FMOD_System_PlaySound (FMOD_SYSTEM *system, FMOD_SOUND *sound, FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL paused, FMOD_CHANNEL **channel); +FMOD_RESULT F_API FMOD_System_PlayDSP (FMOD_SYSTEM *system, FMOD_DSP *dsp, FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL paused, FMOD_CHANNEL **channel); +FMOD_RESULT F_API FMOD_System_GetChannel (FMOD_SYSTEM *system, int channelid, FMOD_CHANNEL **channel); +FMOD_RESULT F_API FMOD_System_GetMasterChannelGroup (FMOD_SYSTEM *system, FMOD_CHANNELGROUP **channelgroup); +FMOD_RESULT F_API FMOD_System_GetMasterSoundGroup (FMOD_SYSTEM *system, FMOD_SOUNDGROUP **soundgroup); + +/* + Routing to ports. +*/ + +FMOD_RESULT F_API FMOD_System_AttachChannelGroupToPort (FMOD_SYSTEM *system, FMOD_PORT_TYPE portType, FMOD_PORT_INDEX portIndex, FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL passThru); +FMOD_RESULT F_API FMOD_System_DetachChannelGroupFromPort(FMOD_SYSTEM *system, FMOD_CHANNELGROUP *channelgroup); + +/* + Reverb API. +*/ + +FMOD_RESULT F_API FMOD_System_SetReverbProperties (FMOD_SYSTEM *system, int instance, const FMOD_REVERB_PROPERTIES *prop); +FMOD_RESULT F_API FMOD_System_GetReverbProperties (FMOD_SYSTEM *system, int instance, FMOD_REVERB_PROPERTIES *prop); + +/* + System level DSP functionality. +*/ + +FMOD_RESULT F_API FMOD_System_LockDSP (FMOD_SYSTEM *system); +FMOD_RESULT F_API FMOD_System_UnlockDSP (FMOD_SYSTEM *system); + +/* + Recording API. +*/ + +FMOD_RESULT F_API FMOD_System_GetRecordNumDrivers (FMOD_SYSTEM *system, int *numdrivers, int *numconnected); +FMOD_RESULT F_API FMOD_System_GetRecordDriverInfo (FMOD_SYSTEM *system, int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels, FMOD_DRIVER_STATE *state); +FMOD_RESULT F_API FMOD_System_GetRecordPosition (FMOD_SYSTEM *system, int id, unsigned int *position); +FMOD_RESULT F_API FMOD_System_RecordStart (FMOD_SYSTEM *system, int id, FMOD_SOUND *sound, FMOD_BOOL loop); +FMOD_RESULT F_API FMOD_System_RecordStop (FMOD_SYSTEM *system, int id); +FMOD_RESULT F_API FMOD_System_IsRecording (FMOD_SYSTEM *system, int id, FMOD_BOOL *recording); + +/* + Geometry API. +*/ + +FMOD_RESULT F_API FMOD_System_CreateGeometry (FMOD_SYSTEM *system, int maxpolygons, int maxvertices, FMOD_GEOMETRY **geometry); +FMOD_RESULT F_API FMOD_System_SetGeometrySettings (FMOD_SYSTEM *system, float maxworldsize); +FMOD_RESULT F_API FMOD_System_GetGeometrySettings (FMOD_SYSTEM *system, float *maxworldsize); +FMOD_RESULT F_API FMOD_System_LoadGeometry (FMOD_SYSTEM *system, const void *data, int datasize, FMOD_GEOMETRY **geometry); +FMOD_RESULT F_API FMOD_System_GetGeometryOcclusion (FMOD_SYSTEM *system, const FMOD_VECTOR *listener, const FMOD_VECTOR *source, float *direct, float *reverb); + +/* + Network functions. +*/ + +FMOD_RESULT F_API FMOD_System_SetNetworkProxy (FMOD_SYSTEM *system, const char *proxy); +FMOD_RESULT F_API FMOD_System_GetNetworkProxy (FMOD_SYSTEM *system, char *proxy, int proxylen); +FMOD_RESULT F_API FMOD_System_SetNetworkTimeout (FMOD_SYSTEM *system, int timeout); +FMOD_RESULT F_API FMOD_System_GetNetworkTimeout (FMOD_SYSTEM *system, int *timeout); + +/* + Userdata set/get. +*/ + +FMOD_RESULT F_API FMOD_System_SetUserData (FMOD_SYSTEM *system, void *userdata); +FMOD_RESULT F_API FMOD_System_GetUserData (FMOD_SYSTEM *system, void **userdata); + +/* + 'Sound' API +*/ + +FMOD_RESULT F_API FMOD_Sound_Release (FMOD_SOUND *sound); +FMOD_RESULT F_API FMOD_Sound_GetSystemObject (FMOD_SOUND *sound, FMOD_SYSTEM **system); + +/* + Standard sound manipulation functions. +*/ + +FMOD_RESULT F_API FMOD_Sound_Lock (FMOD_SOUND *sound, unsigned int offset, unsigned int length, void **ptr1, void **ptr2, unsigned int *len1, unsigned int *len2); +FMOD_RESULT F_API FMOD_Sound_Unlock (FMOD_SOUND *sound, void *ptr1, void *ptr2, unsigned int len1, unsigned int len2); +FMOD_RESULT F_API FMOD_Sound_SetDefaults (FMOD_SOUND *sound, float frequency, int priority); +FMOD_RESULT F_API FMOD_Sound_GetDefaults (FMOD_SOUND *sound, float *frequency, int *priority); +FMOD_RESULT F_API FMOD_Sound_Set3DMinMaxDistance (FMOD_SOUND *sound, float min, float max); +FMOD_RESULT F_API FMOD_Sound_Get3DMinMaxDistance (FMOD_SOUND *sound, float *min, float *max); +FMOD_RESULT F_API FMOD_Sound_Set3DConeSettings (FMOD_SOUND *sound, float insideconeangle, float outsideconeangle, float outsidevolume); +FMOD_RESULT F_API FMOD_Sound_Get3DConeSettings (FMOD_SOUND *sound, float *insideconeangle, float *outsideconeangle, float *outsidevolume); +FMOD_RESULT F_API FMOD_Sound_Set3DCustomRolloff (FMOD_SOUND *sound, FMOD_VECTOR *points, int numpoints); +FMOD_RESULT F_API FMOD_Sound_Get3DCustomRolloff (FMOD_SOUND *sound, FMOD_VECTOR **points, int *numpoints); +FMOD_RESULT F_API FMOD_Sound_GetSubSound (FMOD_SOUND *sound, int index, FMOD_SOUND **subsound); +FMOD_RESULT F_API FMOD_Sound_GetSubSoundParent (FMOD_SOUND *sound, FMOD_SOUND **parentsound); +FMOD_RESULT F_API FMOD_Sound_GetName (FMOD_SOUND *sound, char *name, int namelen); +FMOD_RESULT F_API FMOD_Sound_GetLength (FMOD_SOUND *sound, unsigned int *length, FMOD_TIMEUNIT lengthtype); +FMOD_RESULT F_API FMOD_Sound_GetFormat (FMOD_SOUND *sound, FMOD_SOUND_TYPE *type, FMOD_SOUND_FORMAT *format, int *channels, int *bits); +FMOD_RESULT F_API FMOD_Sound_GetNumSubSounds (FMOD_SOUND *sound, int *numsubsounds); +FMOD_RESULT F_API FMOD_Sound_GetNumTags (FMOD_SOUND *sound, int *numtags, int *numtagsupdated); +FMOD_RESULT F_API FMOD_Sound_GetTag (FMOD_SOUND *sound, const char *name, int index, FMOD_TAG *tag); +FMOD_RESULT F_API FMOD_Sound_GetOpenState (FMOD_SOUND *sound, FMOD_OPENSTATE *openstate, unsigned int *percentbuffered, FMOD_BOOL *starving, FMOD_BOOL *diskbusy); +FMOD_RESULT F_API FMOD_Sound_ReadData (FMOD_SOUND *sound, void *buffer, unsigned int lenbytes, unsigned int *read); +FMOD_RESULT F_API FMOD_Sound_SeekData (FMOD_SOUND *sound, unsigned int pcm); + +FMOD_RESULT F_API FMOD_Sound_SetSoundGroup (FMOD_SOUND *sound, FMOD_SOUNDGROUP *soundgroup); +FMOD_RESULT F_API FMOD_Sound_GetSoundGroup (FMOD_SOUND *sound, FMOD_SOUNDGROUP **soundgroup); + +/* + Synchronization point API. These points can come from markers embedded in wav files, and can also generate channel callbacks. +*/ + +FMOD_RESULT F_API FMOD_Sound_GetNumSyncPoints (FMOD_SOUND *sound, int *numsyncpoints); +FMOD_RESULT F_API FMOD_Sound_GetSyncPoint (FMOD_SOUND *sound, int index, FMOD_SYNCPOINT **point); +FMOD_RESULT F_API FMOD_Sound_GetSyncPointInfo (FMOD_SOUND *sound, FMOD_SYNCPOINT *point, char *name, int namelen, unsigned int *offset, FMOD_TIMEUNIT offsettype); +FMOD_RESULT F_API FMOD_Sound_AddSyncPoint (FMOD_SOUND *sound, unsigned int offset, FMOD_TIMEUNIT offsettype, const char *name, FMOD_SYNCPOINT **point); +FMOD_RESULT F_API FMOD_Sound_DeleteSyncPoint (FMOD_SOUND *sound, FMOD_SYNCPOINT *point); + +/* + Functions also in Channel class but here they are the 'default' to save having to change it in Channel all the time. +*/ + +FMOD_RESULT F_API FMOD_Sound_SetMode (FMOD_SOUND *sound, FMOD_MODE mode); +FMOD_RESULT F_API FMOD_Sound_GetMode (FMOD_SOUND *sound, FMOD_MODE *mode); +FMOD_RESULT F_API FMOD_Sound_SetLoopCount (FMOD_SOUND *sound, int loopcount); +FMOD_RESULT F_API FMOD_Sound_GetLoopCount (FMOD_SOUND *sound, int *loopcount); +FMOD_RESULT F_API FMOD_Sound_SetLoopPoints (FMOD_SOUND *sound, unsigned int loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int loopend, FMOD_TIMEUNIT loopendtype); +FMOD_RESULT F_API FMOD_Sound_GetLoopPoints (FMOD_SOUND *sound, unsigned int *loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int *loopend, FMOD_TIMEUNIT loopendtype); + +/* + For MOD/S3M/XM/IT/MID sequenced formats only. +*/ + +FMOD_RESULT F_API FMOD_Sound_GetMusicNumChannels (FMOD_SOUND *sound, int *numchannels); +FMOD_RESULT F_API FMOD_Sound_SetMusicChannelVolume (FMOD_SOUND *sound, int channel, float volume); +FMOD_RESULT F_API FMOD_Sound_GetMusicChannelVolume (FMOD_SOUND *sound, int channel, float *volume); +FMOD_RESULT F_API FMOD_Sound_SetMusicSpeed (FMOD_SOUND *sound, float speed); +FMOD_RESULT F_API FMOD_Sound_GetMusicSpeed (FMOD_SOUND *sound, float *speed); + +/* + Userdata set/get. +*/ + +FMOD_RESULT F_API FMOD_Sound_SetUserData (FMOD_SOUND *sound, void *userdata); +FMOD_RESULT F_API FMOD_Sound_GetUserData (FMOD_SOUND *sound, void **userdata); + +/* + 'Channel' API +*/ + +FMOD_RESULT F_API FMOD_Channel_GetSystemObject (FMOD_CHANNEL *channel, FMOD_SYSTEM **system); + +/* + General control functionality for Channels and ChannelGroups. +*/ + +FMOD_RESULT F_API FMOD_Channel_Stop (FMOD_CHANNEL *channel); +FMOD_RESULT F_API FMOD_Channel_SetPaused (FMOD_CHANNEL *channel, FMOD_BOOL paused); +FMOD_RESULT F_API FMOD_Channel_GetPaused (FMOD_CHANNEL *channel, FMOD_BOOL *paused); +FMOD_RESULT F_API FMOD_Channel_SetVolume (FMOD_CHANNEL *channel, float volume); +FMOD_RESULT F_API FMOD_Channel_GetVolume (FMOD_CHANNEL *channel, float *volume); +FMOD_RESULT F_API FMOD_Channel_SetVolumeRamp (FMOD_CHANNEL *channel, FMOD_BOOL ramp); +FMOD_RESULT F_API FMOD_Channel_GetVolumeRamp (FMOD_CHANNEL *channel, FMOD_BOOL *ramp); +FMOD_RESULT F_API FMOD_Channel_GetAudibility (FMOD_CHANNEL *channel, float *audibility); +FMOD_RESULT F_API FMOD_Channel_SetPitch (FMOD_CHANNEL *channel, float pitch); +FMOD_RESULT F_API FMOD_Channel_GetPitch (FMOD_CHANNEL *channel, float *pitch); +FMOD_RESULT F_API FMOD_Channel_SetMute (FMOD_CHANNEL *channel, FMOD_BOOL mute); +FMOD_RESULT F_API FMOD_Channel_GetMute (FMOD_CHANNEL *channel, FMOD_BOOL *mute); +FMOD_RESULT F_API FMOD_Channel_SetReverbProperties (FMOD_CHANNEL *channel, int instance, float wet); +FMOD_RESULT F_API FMOD_Channel_GetReverbProperties (FMOD_CHANNEL *channel, int instance, float *wet); +FMOD_RESULT F_API FMOD_Channel_SetLowPassGain (FMOD_CHANNEL *channel, float gain); +FMOD_RESULT F_API FMOD_Channel_GetLowPassGain (FMOD_CHANNEL *channel, float *gain); +FMOD_RESULT F_API FMOD_Channel_SetMode (FMOD_CHANNEL *channel, FMOD_MODE mode); +FMOD_RESULT F_API FMOD_Channel_GetMode (FMOD_CHANNEL *channel, FMOD_MODE *mode); +FMOD_RESULT F_API FMOD_Channel_SetCallback (FMOD_CHANNEL *channel, FMOD_CHANNELCONTROL_CALLBACK callback); +FMOD_RESULT F_API FMOD_Channel_IsPlaying (FMOD_CHANNEL *channel, FMOD_BOOL *isplaying); + +/* + Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values. +*/ + +FMOD_RESULT F_API FMOD_Channel_SetPan (FMOD_CHANNEL *channel, float pan); +FMOD_RESULT F_API FMOD_Channel_SetMixLevelsOutput (FMOD_CHANNEL *channel, float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright); +FMOD_RESULT F_API FMOD_Channel_SetMixLevelsInput (FMOD_CHANNEL *channel, float *levels, int numlevels); +FMOD_RESULT F_API FMOD_Channel_SetMixMatrix (FMOD_CHANNEL *channel, float *matrix, int outchannels, int inchannels, int inchannel_hop); +FMOD_RESULT F_API FMOD_Channel_GetMixMatrix (FMOD_CHANNEL *channel, float *matrix, int *outchannels, int *inchannels, int inchannel_hop); + +/* + Clock based functionality. +*/ + +FMOD_RESULT F_API FMOD_Channel_GetDSPClock (FMOD_CHANNEL *channel, unsigned long long *dspclock, unsigned long long *parentclock); +FMOD_RESULT F_API FMOD_Channel_SetDelay (FMOD_CHANNEL *channel, unsigned long long dspclock_start, unsigned long long dspclock_end, FMOD_BOOL stopchannels); +FMOD_RESULT F_API FMOD_Channel_GetDelay (FMOD_CHANNEL *channel, unsigned long long *dspclock_start, unsigned long long *dspclock_end, FMOD_BOOL *stopchannels); +FMOD_RESULT F_API FMOD_Channel_AddFadePoint (FMOD_CHANNEL *channel, unsigned long long dspclock, float volume); +FMOD_RESULT F_API FMOD_Channel_SetFadePointRamp (FMOD_CHANNEL *channel, unsigned long long dspclock, float volume); +FMOD_RESULT F_API FMOD_Channel_RemoveFadePoints (FMOD_CHANNEL *channel, unsigned long long dspclock_start, unsigned long long dspclock_end); +FMOD_RESULT F_API FMOD_Channel_GetFadePoints (FMOD_CHANNEL *channel, unsigned int *numpoints, unsigned long long *point_dspclock, float *point_volume); + +/* + DSP effects. +*/ + +FMOD_RESULT F_API FMOD_Channel_GetDSP (FMOD_CHANNEL *channel, int index, FMOD_DSP **dsp); +FMOD_RESULT F_API FMOD_Channel_AddDSP (FMOD_CHANNEL *channel, int index, FMOD_DSP *dsp); +FMOD_RESULT F_API FMOD_Channel_RemoveDSP (FMOD_CHANNEL *channel, FMOD_DSP *dsp); +FMOD_RESULT F_API FMOD_Channel_GetNumDSPs (FMOD_CHANNEL *channel, int *numdsps); +FMOD_RESULT F_API FMOD_Channel_SetDSPIndex (FMOD_CHANNEL *channel, FMOD_DSP *dsp, int index); +FMOD_RESULT F_API FMOD_Channel_GetDSPIndex (FMOD_CHANNEL *channel, FMOD_DSP *dsp, int *index); +FMOD_RESULT F_API FMOD_Channel_OverridePanDSP (FMOD_CHANNEL *channel, FMOD_DSP *pan); + +/* + 3D functionality. +*/ + +FMOD_RESULT F_API FMOD_Channel_Set3DAttributes (FMOD_CHANNEL *channel, const FMOD_VECTOR *pos, const FMOD_VECTOR *vel, const FMOD_VECTOR *alt_pan_pos); +FMOD_RESULT F_API FMOD_Channel_Get3DAttributes (FMOD_CHANNEL *channel, FMOD_VECTOR *pos, FMOD_VECTOR *vel, FMOD_VECTOR *alt_pan_pos); +FMOD_RESULT F_API FMOD_Channel_Set3DMinMaxDistance (FMOD_CHANNEL *channel, float mindistance, float maxdistance); +FMOD_RESULT F_API FMOD_Channel_Get3DMinMaxDistance (FMOD_CHANNEL *channel, float *mindistance, float *maxdistance); +FMOD_RESULT F_API FMOD_Channel_Set3DConeSettings (FMOD_CHANNEL *channel, float insideconeangle, float outsideconeangle, float outsidevolume); +FMOD_RESULT F_API FMOD_Channel_Get3DConeSettings (FMOD_CHANNEL *channel, float *insideconeangle, float *outsideconeangle, float *outsidevolume); +FMOD_RESULT F_API FMOD_Channel_Set3DConeOrientation (FMOD_CHANNEL *channel, FMOD_VECTOR *orientation); +FMOD_RESULT F_API FMOD_Channel_Get3DConeOrientation (FMOD_CHANNEL *channel, FMOD_VECTOR *orientation); +FMOD_RESULT F_API FMOD_Channel_Set3DCustomRolloff (FMOD_CHANNEL *channel, FMOD_VECTOR *points, int numpoints); +FMOD_RESULT F_API FMOD_Channel_Get3DCustomRolloff (FMOD_CHANNEL *channel, FMOD_VECTOR **points, int *numpoints); +FMOD_RESULT F_API FMOD_Channel_Set3DOcclusion (FMOD_CHANNEL *channel, float directocclusion, float reverbocclusion); +FMOD_RESULT F_API FMOD_Channel_Get3DOcclusion (FMOD_CHANNEL *channel, float *directocclusion, float *reverbocclusion); +FMOD_RESULT F_API FMOD_Channel_Set3DSpread (FMOD_CHANNEL *channel, float angle); +FMOD_RESULT F_API FMOD_Channel_Get3DSpread (FMOD_CHANNEL *channel, float *angle); +FMOD_RESULT F_API FMOD_Channel_Set3DLevel (FMOD_CHANNEL *channel, float level); +FMOD_RESULT F_API FMOD_Channel_Get3DLevel (FMOD_CHANNEL *channel, float *level); +FMOD_RESULT F_API FMOD_Channel_Set3DDopplerLevel (FMOD_CHANNEL *channel, float level); +FMOD_RESULT F_API FMOD_Channel_Get3DDopplerLevel (FMOD_CHANNEL *channel, float *level); +FMOD_RESULT F_API FMOD_Channel_Set3DDistanceFilter (FMOD_CHANNEL *channel, FMOD_BOOL custom, float customLevel, float centerFreq); +FMOD_RESULT F_API FMOD_Channel_Get3DDistanceFilter (FMOD_CHANNEL *channel, FMOD_BOOL *custom, float *customLevel, float *centerFreq); + +/* + Userdata set/get. +*/ + +FMOD_RESULT F_API FMOD_Channel_SetUserData (FMOD_CHANNEL *channel, void *userdata); +FMOD_RESULT F_API FMOD_Channel_GetUserData (FMOD_CHANNEL *channel, void **userdata); + +/* + Channel specific control functionality. +*/ + +FMOD_RESULT F_API FMOD_Channel_SetFrequency (FMOD_CHANNEL *channel, float frequency); +FMOD_RESULT F_API FMOD_Channel_GetFrequency (FMOD_CHANNEL *channel, float *frequency); +FMOD_RESULT F_API FMOD_Channel_SetPriority (FMOD_CHANNEL *channel, int priority); +FMOD_RESULT F_API FMOD_Channel_GetPriority (FMOD_CHANNEL *channel, int *priority); +FMOD_RESULT F_API FMOD_Channel_SetPosition (FMOD_CHANNEL *channel, unsigned int position, FMOD_TIMEUNIT postype); +FMOD_RESULT F_API FMOD_Channel_GetPosition (FMOD_CHANNEL *channel, unsigned int *position, FMOD_TIMEUNIT postype); +FMOD_RESULT F_API FMOD_Channel_SetChannelGroup (FMOD_CHANNEL *channel, FMOD_CHANNELGROUP *channelgroup); +FMOD_RESULT F_API FMOD_Channel_GetChannelGroup (FMOD_CHANNEL *channel, FMOD_CHANNELGROUP **channelgroup); +FMOD_RESULT F_API FMOD_Channel_SetLoopCount (FMOD_CHANNEL *channel, int loopcount); +FMOD_RESULT F_API FMOD_Channel_GetLoopCount (FMOD_CHANNEL *channel, int *loopcount); +FMOD_RESULT F_API FMOD_Channel_SetLoopPoints (FMOD_CHANNEL *channel, unsigned int loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int loopend, FMOD_TIMEUNIT loopendtype); +FMOD_RESULT F_API FMOD_Channel_GetLoopPoints (FMOD_CHANNEL *channel, unsigned int *loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int *loopend, FMOD_TIMEUNIT loopendtype); + +/* + Information only functions. +*/ + +FMOD_RESULT F_API FMOD_Channel_IsVirtual (FMOD_CHANNEL *channel, FMOD_BOOL *isvirtual); +FMOD_RESULT F_API FMOD_Channel_GetCurrentSound (FMOD_CHANNEL *channel, FMOD_SOUND **sound); +FMOD_RESULT F_API FMOD_Channel_GetIndex (FMOD_CHANNEL *channel, int *index); + +/* + 'ChannelGroup' API +*/ + +FMOD_RESULT F_API FMOD_ChannelGroup_GetSystemObject (FMOD_CHANNELGROUP *channelgroup, FMOD_SYSTEM **system); + +/* + General control functionality for Channels and ChannelGroups. +*/ + +FMOD_RESULT F_API FMOD_ChannelGroup_Stop (FMOD_CHANNELGROUP *channelgroup); +FMOD_RESULT F_API FMOD_ChannelGroup_SetPaused (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL paused); +FMOD_RESULT F_API FMOD_ChannelGroup_GetPaused (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *paused); +FMOD_RESULT F_API FMOD_ChannelGroup_SetVolume (FMOD_CHANNELGROUP *channelgroup, float volume); +FMOD_RESULT F_API FMOD_ChannelGroup_GetVolume (FMOD_CHANNELGROUP *channelgroup, float *volume); +FMOD_RESULT F_API FMOD_ChannelGroup_SetVolumeRamp (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL ramp); +FMOD_RESULT F_API FMOD_ChannelGroup_GetVolumeRamp (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *ramp); +FMOD_RESULT F_API FMOD_ChannelGroup_GetAudibility (FMOD_CHANNELGROUP *channelgroup, float *audibility); +FMOD_RESULT F_API FMOD_ChannelGroup_SetPitch (FMOD_CHANNELGROUP *channelgroup, float pitch); +FMOD_RESULT F_API FMOD_ChannelGroup_GetPitch (FMOD_CHANNELGROUP *channelgroup, float *pitch); +FMOD_RESULT F_API FMOD_ChannelGroup_SetMute (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL mute); +FMOD_RESULT F_API FMOD_ChannelGroup_GetMute (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *mute); +FMOD_RESULT F_API FMOD_ChannelGroup_SetReverbProperties (FMOD_CHANNELGROUP *channelgroup, int instance, float wet); +FMOD_RESULT F_API FMOD_ChannelGroup_GetReverbProperties (FMOD_CHANNELGROUP *channelgroup, int instance, float *wet); +FMOD_RESULT F_API FMOD_ChannelGroup_SetLowPassGain (FMOD_CHANNELGROUP *channelgroup, float gain); +FMOD_RESULT F_API FMOD_ChannelGroup_GetLowPassGain (FMOD_CHANNELGROUP *channelgroup, float *gain); +FMOD_RESULT F_API FMOD_ChannelGroup_SetMode (FMOD_CHANNELGROUP *channelgroup, FMOD_MODE mode); +FMOD_RESULT F_API FMOD_ChannelGroup_GetMode (FMOD_CHANNELGROUP *channelgroup, FMOD_MODE *mode); +FMOD_RESULT F_API FMOD_ChannelGroup_SetCallback (FMOD_CHANNELGROUP *channelgroup, FMOD_CHANNELCONTROL_CALLBACK callback); +FMOD_RESULT F_API FMOD_ChannelGroup_IsPlaying (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *isplaying); + +/* + Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values. +*/ + +FMOD_RESULT F_API FMOD_ChannelGroup_SetPan (FMOD_CHANNELGROUP *channelgroup, float pan); +FMOD_RESULT F_API FMOD_ChannelGroup_SetMixLevelsOutput (FMOD_CHANNELGROUP *channelgroup, float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright); +FMOD_RESULT F_API FMOD_ChannelGroup_SetMixLevelsInput (FMOD_CHANNELGROUP *channelgroup, float *levels, int numlevels); +FMOD_RESULT F_API FMOD_ChannelGroup_SetMixMatrix (FMOD_CHANNELGROUP *channelgroup, float *matrix, int outchannels, int inchannels, int inchannel_hop); +FMOD_RESULT F_API FMOD_ChannelGroup_GetMixMatrix (FMOD_CHANNELGROUP *channelgroup, float *matrix, int *outchannels, int *inchannels, int inchannel_hop); + +/* + Clock based functionality. +*/ + +FMOD_RESULT F_API FMOD_ChannelGroup_GetDSPClock (FMOD_CHANNELGROUP *channelgroup, unsigned long long *dspclock, unsigned long long *parentclock); +FMOD_RESULT F_API FMOD_ChannelGroup_SetDelay (FMOD_CHANNELGROUP *channelgroup, unsigned long long dspclock_start, unsigned long long dspclock_end, FMOD_BOOL stopchannels); +FMOD_RESULT F_API FMOD_ChannelGroup_GetDelay (FMOD_CHANNELGROUP *channelgroup, unsigned long long *dspclock_start, unsigned long long *dspclock_end, FMOD_BOOL *stopchannels); +FMOD_RESULT F_API FMOD_ChannelGroup_AddFadePoint (FMOD_CHANNELGROUP *channelgroup, unsigned long long dspclock, float volume); +FMOD_RESULT F_API FMOD_ChannelGroup_SetFadePointRamp (FMOD_CHANNELGROUP *channelgroup, unsigned long long dspclock, float volume); +FMOD_RESULT F_API FMOD_ChannelGroup_RemoveFadePoints (FMOD_CHANNELGROUP *channelgroup, unsigned long long dspclock_start, unsigned long long dspclock_end); +FMOD_RESULT F_API FMOD_ChannelGroup_GetFadePoints (FMOD_CHANNELGROUP *channelgroup, unsigned int *numpoints, unsigned long long *point_dspclock, float *point_volume); + +/* + DSP effects. +*/ + +FMOD_RESULT F_API FMOD_ChannelGroup_GetDSP (FMOD_CHANNELGROUP *channelgroup, int index, FMOD_DSP **dsp); +FMOD_RESULT F_API FMOD_ChannelGroup_AddDSP (FMOD_CHANNELGROUP *channelgroup, int index, FMOD_DSP *dsp); +FMOD_RESULT F_API FMOD_ChannelGroup_RemoveDSP (FMOD_CHANNELGROUP *channelgroup, FMOD_DSP *dsp); +FMOD_RESULT F_API FMOD_ChannelGroup_GetNumDSPs (FMOD_CHANNELGROUP *channelgroup, int *numdsps); +FMOD_RESULT F_API FMOD_ChannelGroup_SetDSPIndex (FMOD_CHANNELGROUP *channelgroup, FMOD_DSP *dsp, int index); +FMOD_RESULT F_API FMOD_ChannelGroup_GetDSPIndex (FMOD_CHANNELGROUP *channelgroup, FMOD_DSP *dsp, int *index); +FMOD_RESULT F_API FMOD_ChannelGroup_OverridePanDSP (FMOD_CHANNELGROUP *channelgroup, FMOD_DSP *pan); + +/* + 3D functionality. +*/ + +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DAttributes (FMOD_CHANNELGROUP *channelgroup, const FMOD_VECTOR *pos, const FMOD_VECTOR *vel, const FMOD_VECTOR *alt_pan_pos); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DAttributes (FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR *pos, FMOD_VECTOR *vel, FMOD_VECTOR *alt_pan_pos); +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DMinMaxDistance (FMOD_CHANNELGROUP *channelgroup, float mindistance, float maxdistance); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DMinMaxDistance (FMOD_CHANNELGROUP *channelgroup, float *mindistance, float *maxdistance); +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DConeSettings (FMOD_CHANNELGROUP *channelgroup, float insideconeangle, float outsideconeangle, float outsidevolume); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DConeSettings (FMOD_CHANNELGROUP *channelgroup, float *insideconeangle, float *outsideconeangle, float *outsidevolume); +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DConeOrientation(FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR *orientation); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DConeOrientation(FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR *orientation); +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DCustomRolloff (FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR *points, int numpoints); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DCustomRolloff (FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR **points, int *numpoints); +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DOcclusion (FMOD_CHANNELGROUP *channelgroup, float directocclusion, float reverbocclusion); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DOcclusion (FMOD_CHANNELGROUP *channelgroup, float *directocclusion, float *reverbocclusion); +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DSpread (FMOD_CHANNELGROUP *channelgroup, float angle); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DSpread (FMOD_CHANNELGROUP *channelgroup, float *angle); +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DLevel (FMOD_CHANNELGROUP *channelgroup, float level); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DLevel (FMOD_CHANNELGROUP *channelgroup, float *level); +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DDopplerLevel (FMOD_CHANNELGROUP *channelgroup, float level); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DDopplerLevel (FMOD_CHANNELGROUP *channelgroup, float *level); +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DDistanceFilter (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL custom, float customLevel, float centerFreq); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DDistanceFilter (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *custom, float *customLevel, float *centerFreq); + +/* + Userdata set/get. +*/ + +FMOD_RESULT F_API FMOD_ChannelGroup_SetUserData (FMOD_CHANNELGROUP *channelgroup, void *userdata); +FMOD_RESULT F_API FMOD_ChannelGroup_GetUserData (FMOD_CHANNELGROUP *channelgroup, void **userdata); + +FMOD_RESULT F_API FMOD_ChannelGroup_Release (FMOD_CHANNELGROUP *channelgroup); + +/* + Nested channel groups. +*/ + +FMOD_RESULT F_API FMOD_ChannelGroup_AddGroup (FMOD_CHANNELGROUP *channelgroup, FMOD_CHANNELGROUP *group, FMOD_BOOL propagatedspclock, FMOD_DSPCONNECTION **connection); +FMOD_RESULT F_API FMOD_ChannelGroup_GetNumGroups (FMOD_CHANNELGROUP *channelgroup, int *numgroups); +FMOD_RESULT F_API FMOD_ChannelGroup_GetGroup (FMOD_CHANNELGROUP *channelgroup, int index, FMOD_CHANNELGROUP **group); +FMOD_RESULT F_API FMOD_ChannelGroup_GetParentGroup (FMOD_CHANNELGROUP *channelgroup, FMOD_CHANNELGROUP **group); + +/* + Information only functions. +*/ + +FMOD_RESULT F_API FMOD_ChannelGroup_GetName (FMOD_CHANNELGROUP *channelgroup, char *name, int namelen); +FMOD_RESULT F_API FMOD_ChannelGroup_GetNumChannels (FMOD_CHANNELGROUP *channelgroup, int *numchannels); +FMOD_RESULT F_API FMOD_ChannelGroup_GetChannel (FMOD_CHANNELGROUP *channelgroup, int index, FMOD_CHANNEL **channel); + +/* + 'SoundGroup' API +*/ + +FMOD_RESULT F_API FMOD_SoundGroup_Release (FMOD_SOUNDGROUP *soundgroup); +FMOD_RESULT F_API FMOD_SoundGroup_GetSystemObject (FMOD_SOUNDGROUP *soundgroup, FMOD_SYSTEM **system); + +/* + SoundGroup control functions. +*/ + +FMOD_RESULT F_API FMOD_SoundGroup_SetMaxAudible (FMOD_SOUNDGROUP *soundgroup, int maxaudible); +FMOD_RESULT F_API FMOD_SoundGroup_GetMaxAudible (FMOD_SOUNDGROUP *soundgroup, int *maxaudible); +FMOD_RESULT F_API FMOD_SoundGroup_SetMaxAudibleBehavior (FMOD_SOUNDGROUP *soundgroup, FMOD_SOUNDGROUP_BEHAVIOR behavior); +FMOD_RESULT F_API FMOD_SoundGroup_GetMaxAudibleBehavior (FMOD_SOUNDGROUP *soundgroup, FMOD_SOUNDGROUP_BEHAVIOR *behavior); +FMOD_RESULT F_API FMOD_SoundGroup_SetMuteFadeSpeed (FMOD_SOUNDGROUP *soundgroup, float speed); +FMOD_RESULT F_API FMOD_SoundGroup_GetMuteFadeSpeed (FMOD_SOUNDGROUP *soundgroup, float *speed); +FMOD_RESULT F_API FMOD_SoundGroup_SetVolume (FMOD_SOUNDGROUP *soundgroup, float volume); +FMOD_RESULT F_API FMOD_SoundGroup_GetVolume (FMOD_SOUNDGROUP *soundgroup, float *volume); +FMOD_RESULT F_API FMOD_SoundGroup_Stop (FMOD_SOUNDGROUP *soundgroup); + +/* + Information only functions. +*/ + +FMOD_RESULT F_API FMOD_SoundGroup_GetName (FMOD_SOUNDGROUP *soundgroup, char *name, int namelen); +FMOD_RESULT F_API FMOD_SoundGroup_GetNumSounds (FMOD_SOUNDGROUP *soundgroup, int *numsounds); +FMOD_RESULT F_API FMOD_SoundGroup_GetSound (FMOD_SOUNDGROUP *soundgroup, int index, FMOD_SOUND **sound); +FMOD_RESULT F_API FMOD_SoundGroup_GetNumPlaying (FMOD_SOUNDGROUP *soundgroup, int *numplaying); + +/* + Userdata set/get. +*/ + +FMOD_RESULT F_API FMOD_SoundGroup_SetUserData (FMOD_SOUNDGROUP *soundgroup, void *userdata); +FMOD_RESULT F_API FMOD_SoundGroup_GetUserData (FMOD_SOUNDGROUP *soundgroup, void **userdata); + +/* + 'DSP' API +*/ + +FMOD_RESULT F_API FMOD_DSP_Release (FMOD_DSP *dsp); +FMOD_RESULT F_API FMOD_DSP_GetSystemObject (FMOD_DSP *dsp, FMOD_SYSTEM **system); + +/* + Connection / disconnection / input and output enumeration. +*/ + +FMOD_RESULT F_API FMOD_DSP_AddInput (FMOD_DSP *dsp, FMOD_DSP *input, FMOD_DSPCONNECTION **connection, FMOD_DSPCONNECTION_TYPE type); +FMOD_RESULT F_API FMOD_DSP_DisconnectFrom (FMOD_DSP *dsp, FMOD_DSP *target, FMOD_DSPCONNECTION *connection); +FMOD_RESULT F_API FMOD_DSP_DisconnectAll (FMOD_DSP *dsp, FMOD_BOOL inputs, FMOD_BOOL outputs); +FMOD_RESULT F_API FMOD_DSP_GetNumInputs (FMOD_DSP *dsp, int *numinputs); +FMOD_RESULT F_API FMOD_DSP_GetNumOutputs (FMOD_DSP *dsp, int *numoutputs); +FMOD_RESULT F_API FMOD_DSP_GetInput (FMOD_DSP *dsp, int index, FMOD_DSP **input, FMOD_DSPCONNECTION **inputconnection); +FMOD_RESULT F_API FMOD_DSP_GetOutput (FMOD_DSP *dsp, int index, FMOD_DSP **output, FMOD_DSPCONNECTION **outputconnection); + +/* + DSP unit control. +*/ + +FMOD_RESULT F_API FMOD_DSP_SetActive (FMOD_DSP *dsp, FMOD_BOOL active); +FMOD_RESULT F_API FMOD_DSP_GetActive (FMOD_DSP *dsp, FMOD_BOOL *active); +FMOD_RESULT F_API FMOD_DSP_SetBypass (FMOD_DSP *dsp, FMOD_BOOL bypass); +FMOD_RESULT F_API FMOD_DSP_GetBypass (FMOD_DSP *dsp, FMOD_BOOL *bypass); +FMOD_RESULT F_API FMOD_DSP_SetWetDryMix (FMOD_DSP *dsp, float prewet, float postwet, float dry); +FMOD_RESULT F_API FMOD_DSP_GetWetDryMix (FMOD_DSP *dsp, float *prewet, float *postwet, float *dry); +FMOD_RESULT F_API FMOD_DSP_SetChannelFormat (FMOD_DSP *dsp, FMOD_CHANNELMASK channelmask, int numchannels, FMOD_SPEAKERMODE source_speakermode); +FMOD_RESULT F_API FMOD_DSP_GetChannelFormat (FMOD_DSP *dsp, FMOD_CHANNELMASK *channelmask, int *numchannels, FMOD_SPEAKERMODE *source_speakermode); +FMOD_RESULT F_API FMOD_DSP_GetOutputChannelFormat (FMOD_DSP *dsp, FMOD_CHANNELMASK inmask, int inchannels, FMOD_SPEAKERMODE inspeakermode, FMOD_CHANNELMASK *outmask, int *outchannels, FMOD_SPEAKERMODE *outspeakermode); +FMOD_RESULT F_API FMOD_DSP_Reset (FMOD_DSP *dsp); + +/* + DSP parameter control. +*/ + +FMOD_RESULT F_API FMOD_DSP_SetParameterFloat (FMOD_DSP *dsp, int index, float value); +FMOD_RESULT F_API FMOD_DSP_SetParameterInt (FMOD_DSP *dsp, int index, int value); +FMOD_RESULT F_API FMOD_DSP_SetParameterBool (FMOD_DSP *dsp, int index, FMOD_BOOL value); +FMOD_RESULT F_API FMOD_DSP_SetParameterData (FMOD_DSP *dsp, int index, void *data, unsigned int length); +FMOD_RESULT F_API FMOD_DSP_GetParameterFloat (FMOD_DSP *dsp, int index, float *value, char *valuestr, int valuestrlen); +FMOD_RESULT F_API FMOD_DSP_GetParameterInt (FMOD_DSP *dsp, int index, int *value, char *valuestr, int valuestrlen); +FMOD_RESULT F_API FMOD_DSP_GetParameterBool (FMOD_DSP *dsp, int index, FMOD_BOOL *value, char *valuestr, int valuestrlen); +FMOD_RESULT F_API FMOD_DSP_GetParameterData (FMOD_DSP *dsp, int index, void **data, unsigned int *length, char *valuestr, int valuestrlen); +FMOD_RESULT F_API FMOD_DSP_GetNumParameters (FMOD_DSP *dsp, int *numparams); +FMOD_RESULT F_API FMOD_DSP_GetParameterInfo (FMOD_DSP *dsp, int index, FMOD_DSP_PARAMETER_DESC **desc); +FMOD_RESULT F_API FMOD_DSP_GetDataParameterIndex (FMOD_DSP *dsp, int datatype, int *index); +FMOD_RESULT F_API FMOD_DSP_ShowConfigDialog (FMOD_DSP *dsp, void *hwnd, FMOD_BOOL show); + +/* + DSP attributes. +*/ + +FMOD_RESULT F_API FMOD_DSP_GetInfo (FMOD_DSP *dsp, char *name, unsigned int *version, int *channels, int *configwidth, int *configheight); +FMOD_RESULT F_API FMOD_DSP_GetType (FMOD_DSP *dsp, FMOD_DSP_TYPE *type); +FMOD_RESULT F_API FMOD_DSP_GetIdle (FMOD_DSP *dsp, FMOD_BOOL *idle); + +/* + Userdata set/get. +*/ + +FMOD_RESULT F_API FMOD_DSP_SetUserData (FMOD_DSP *dsp, void *userdata); +FMOD_RESULT F_API FMOD_DSP_GetUserData (FMOD_DSP *dsp, void **userdata); + +/* + Metering. +*/ + +FMOD_RESULT F_API FMOD_DSP_SetMeteringEnabled (FMOD_DSP *dsp, FMOD_BOOL inputEnabled, FMOD_BOOL outputEnabled); +FMOD_RESULT F_API FMOD_DSP_GetMeteringEnabled (FMOD_DSP *dsp, FMOD_BOOL *inputEnabled, FMOD_BOOL *outputEnabled); +FMOD_RESULT F_API FMOD_DSP_GetMeteringInfo (FMOD_DSP *dsp, FMOD_DSP_METERING_INFO *inputInfo, FMOD_DSP_METERING_INFO *outputInfo); + +/* + 'DSPConnection' API +*/ + +FMOD_RESULT F_API FMOD_DSPConnection_GetInput (FMOD_DSPCONNECTION *dspconnection, FMOD_DSP **input); +FMOD_RESULT F_API FMOD_DSPConnection_GetOutput (FMOD_DSPCONNECTION *dspconnection, FMOD_DSP **output); +FMOD_RESULT F_API FMOD_DSPConnection_SetMix (FMOD_DSPCONNECTION *dspconnection, float volume); +FMOD_RESULT F_API FMOD_DSPConnection_GetMix (FMOD_DSPCONNECTION *dspconnection, float *volume); +FMOD_RESULT F_API FMOD_DSPConnection_SetMixMatrix (FMOD_DSPCONNECTION *dspconnection, float *matrix, int outchannels, int inchannels, int inchannel_hop); +FMOD_RESULT F_API FMOD_DSPConnection_GetMixMatrix (FMOD_DSPCONNECTION *dspconnection, float *matrix, int *outchannels, int *inchannels, int inchannel_hop); +FMOD_RESULT F_API FMOD_DSPConnection_GetType (FMOD_DSPCONNECTION *dspconnection, FMOD_DSPCONNECTION_TYPE *type); + +/* + Userdata set/get. +*/ + +FMOD_RESULT F_API FMOD_DSPConnection_SetUserData (FMOD_DSPCONNECTION *dspconnection, void *userdata); +FMOD_RESULT F_API FMOD_DSPConnection_GetUserData (FMOD_DSPCONNECTION *dspconnection, void **userdata); + +/* + 'Geometry' API +*/ + +FMOD_RESULT F_API FMOD_Geometry_Release (FMOD_GEOMETRY *geometry); + +/* + Polygon manipulation. +*/ + +FMOD_RESULT F_API FMOD_Geometry_AddPolygon (FMOD_GEOMETRY *geometry, float directocclusion, float reverbocclusion, FMOD_BOOL doublesided, int numvertices, const FMOD_VECTOR *vertices, int *polygonindex); +FMOD_RESULT F_API FMOD_Geometry_GetNumPolygons (FMOD_GEOMETRY *geometry, int *numpolygons); +FMOD_RESULT F_API FMOD_Geometry_GetMaxPolygons (FMOD_GEOMETRY *geometry, int *maxpolygons, int *maxvertices); +FMOD_RESULT F_API FMOD_Geometry_GetPolygonNumVertices (FMOD_GEOMETRY *geometry, int index, int *numvertices); +FMOD_RESULT F_API FMOD_Geometry_SetPolygonVertex (FMOD_GEOMETRY *geometry, int index, int vertexindex, const FMOD_VECTOR *vertex); +FMOD_RESULT F_API FMOD_Geometry_GetPolygonVertex (FMOD_GEOMETRY *geometry, int index, int vertexindex, FMOD_VECTOR *vertex); +FMOD_RESULT F_API FMOD_Geometry_SetPolygonAttributes (FMOD_GEOMETRY *geometry, int index, float directocclusion, float reverbocclusion, FMOD_BOOL doublesided); +FMOD_RESULT F_API FMOD_Geometry_GetPolygonAttributes (FMOD_GEOMETRY *geometry, int index, float *directocclusion, float *reverbocclusion, FMOD_BOOL *doublesided); + +/* + Object manipulation. +*/ + +FMOD_RESULT F_API FMOD_Geometry_SetActive (FMOD_GEOMETRY *geometry, FMOD_BOOL active); +FMOD_RESULT F_API FMOD_Geometry_GetActive (FMOD_GEOMETRY *geometry, FMOD_BOOL *active); +FMOD_RESULT F_API FMOD_Geometry_SetRotation (FMOD_GEOMETRY *geometry, const FMOD_VECTOR *forward, const FMOD_VECTOR *up); +FMOD_RESULT F_API FMOD_Geometry_GetRotation (FMOD_GEOMETRY *geometry, FMOD_VECTOR *forward, FMOD_VECTOR *up); +FMOD_RESULT F_API FMOD_Geometry_SetPosition (FMOD_GEOMETRY *geometry, const FMOD_VECTOR *position); +FMOD_RESULT F_API FMOD_Geometry_GetPosition (FMOD_GEOMETRY *geometry, FMOD_VECTOR *position); +FMOD_RESULT F_API FMOD_Geometry_SetScale (FMOD_GEOMETRY *geometry, const FMOD_VECTOR *scale); +FMOD_RESULT F_API FMOD_Geometry_GetScale (FMOD_GEOMETRY *geometry, FMOD_VECTOR *scale); +FMOD_RESULT F_API FMOD_Geometry_Save (FMOD_GEOMETRY *geometry, void *data, int *datasize); + +/* + Userdata set/get. +*/ + +FMOD_RESULT F_API FMOD_Geometry_SetUserData (FMOD_GEOMETRY *geometry, void *userdata); +FMOD_RESULT F_API FMOD_Geometry_GetUserData (FMOD_GEOMETRY *geometry, void **userdata); + +/* + 'Reverb3D' API +*/ + +FMOD_RESULT F_API FMOD_Reverb3D_Release (FMOD_REVERB3D *reverb3d); + +/* + Reverb manipulation. +*/ + +FMOD_RESULT F_API FMOD_Reverb3D_Set3DAttributes (FMOD_REVERB3D *reverb3d, const FMOD_VECTOR *position, float mindistance, float maxdistance); +FMOD_RESULT F_API FMOD_Reverb3D_Get3DAttributes (FMOD_REVERB3D *reverb3d, FMOD_VECTOR *position, float *mindistance, float *maxdistance); +FMOD_RESULT F_API FMOD_Reverb3D_SetProperties (FMOD_REVERB3D *reverb3d, const FMOD_REVERB_PROPERTIES *properties); +FMOD_RESULT F_API FMOD_Reverb3D_GetProperties (FMOD_REVERB3D *reverb3d, FMOD_REVERB_PROPERTIES *properties); +FMOD_RESULT F_API FMOD_Reverb3D_SetActive (FMOD_REVERB3D *reverb3d, FMOD_BOOL active); +FMOD_RESULT F_API FMOD_Reverb3D_GetActive (FMOD_REVERB3D *reverb3d, FMOD_BOOL *active); + +/* + Userdata set/get. +*/ + +FMOD_RESULT F_API FMOD_Reverb3D_SetUserData (FMOD_REVERB3D *reverb3d, void *userdata); +FMOD_RESULT F_API FMOD_Reverb3D_GetUserData (FMOD_REVERB3D *reverb3d, void **userdata); + +/*$ preserve start $*/ + +#ifdef __cplusplus +} +#endif + +#endif /* _FMOD_H */ + +/*$ preserve end $*/ diff --git a/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod.hpp b/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod.hpp new file mode 100644 index 0000000..5facf97 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod.hpp @@ -0,0 +1,604 @@ +/* ========================================================================================== */ +/* FMOD Studio - C++ header file. Copyright (c), Firelight Technologies Pty, Ltd. 2004-2016. */ +/* */ +/* Use this header in conjunction with fmod_common.h (which contains all the constants / */ +/* callbacks) to develop using C++ classes. */ +/* ========================================================================================== */ + +#ifndef _FMOD_HPP +#define _FMOD_HPP + +#include "fmod_common.h" +#include "fmod.h" + +/* + Constant and defines +*/ + +/* + FMOD Namespace +*/ +namespace FMOD +{ + class System; + class Sound; + class ChannelControl; + class Channel; + class ChannelGroup; + class SoundGroup; + class DSP; + class DSPConnection; + class Geometry; + class Reverb3D; + + /* + FMOD global system functions (optional). + */ + inline FMOD_RESULT Memory_Initialize (void *poolmem, int poollen, FMOD_MEMORY_ALLOC_CALLBACK useralloc, FMOD_MEMORY_REALLOC_CALLBACK userrealloc, FMOD_MEMORY_FREE_CALLBACK userfree, FMOD_MEMORY_TYPE memtypeflags = FMOD_MEMORY_ALL) { return FMOD_Memory_Initialize(poolmem, poollen, useralloc, userrealloc, userfree, memtypeflags); } + inline FMOD_RESULT Memory_GetStats (int *currentalloced, int *maxalloced, bool blocking = true) { return FMOD_Memory_GetStats(currentalloced, maxalloced, blocking); } + inline FMOD_RESULT Debug_Initialize (FMOD_DEBUG_FLAGS flags, FMOD_DEBUG_MODE mode = FMOD_DEBUG_MODE_TTY, FMOD_DEBUG_CALLBACK callback = 0, const char *filename = 0) { return FMOD_Debug_Initialize(flags, mode, callback, filename); } + inline FMOD_RESULT File_SetDiskBusy (int busy) { return FMOD_File_SetDiskBusy(busy); } + inline FMOD_RESULT File_GetDiskBusy (int *busy) { return FMOD_File_GetDiskBusy(busy); } + + /* + FMOD System factory functions. + */ + inline FMOD_RESULT System_Create (System **system) { return FMOD_System_Create((FMOD_SYSTEM **)system); } + + /* + 'System' API + */ + class System + { + private: + + // Constructor made private so user cannot statically instance a System class. System_Create must be used. + System(); + System(const System &); + + public: + + FMOD_RESULT F_API release (); + + // Setup functions. + FMOD_RESULT F_API setOutput (FMOD_OUTPUTTYPE output); + FMOD_RESULT F_API getOutput (FMOD_OUTPUTTYPE *output); + FMOD_RESULT F_API getNumDrivers (int *numdrivers); + FMOD_RESULT F_API getDriverInfo (int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels); + FMOD_RESULT F_API setDriver (int driver); + FMOD_RESULT F_API getDriver (int *driver); + FMOD_RESULT F_API setSoftwareChannels (int numsoftwarechannels); + FMOD_RESULT F_API getSoftwareChannels (int *numsoftwarechannels); + FMOD_RESULT F_API setSoftwareFormat (int samplerate, FMOD_SPEAKERMODE speakermode, int numrawspeakers); + FMOD_RESULT F_API getSoftwareFormat (int *samplerate, FMOD_SPEAKERMODE *speakermode, int *numrawspeakers); + FMOD_RESULT F_API setDSPBufferSize (unsigned int bufferlength, int numbuffers); + FMOD_RESULT F_API getDSPBufferSize (unsigned int *bufferlength, int *numbuffers); + FMOD_RESULT F_API setFileSystem (FMOD_FILE_OPEN_CALLBACK useropen, FMOD_FILE_CLOSE_CALLBACK userclose, FMOD_FILE_READ_CALLBACK userread, FMOD_FILE_SEEK_CALLBACK userseek, FMOD_FILE_ASYNCREAD_CALLBACK userasyncread, FMOD_FILE_ASYNCCANCEL_CALLBACK userasynccancel, int blockalign); + FMOD_RESULT F_API attachFileSystem (FMOD_FILE_OPEN_CALLBACK useropen, FMOD_FILE_CLOSE_CALLBACK userclose, FMOD_FILE_READ_CALLBACK userread, FMOD_FILE_SEEK_CALLBACK userseek); + FMOD_RESULT F_API setAdvancedSettings (FMOD_ADVANCEDSETTINGS *settings); + FMOD_RESULT F_API getAdvancedSettings (FMOD_ADVANCEDSETTINGS *settings); + FMOD_RESULT F_API setCallback (FMOD_SYSTEM_CALLBACK callback, FMOD_SYSTEM_CALLBACK_TYPE callbackmask = FMOD_SYSTEM_CALLBACK_ALL); + + // Plug-in support. + FMOD_RESULT F_API setPluginPath (const char *path); + FMOD_RESULT F_API loadPlugin (const char *filename, unsigned int *handle, unsigned int priority = 0); + FMOD_RESULT F_API unloadPlugin (unsigned int handle); + FMOD_RESULT F_API getNumPlugins (FMOD_PLUGINTYPE plugintype, int *numplugins); + FMOD_RESULT F_API getPluginHandle (FMOD_PLUGINTYPE plugintype, int index, unsigned int *handle); + FMOD_RESULT F_API getPluginInfo (unsigned int handle, FMOD_PLUGINTYPE *plugintype, char *name, int namelen, unsigned int *version); + FMOD_RESULT F_API setOutputByPlugin (unsigned int handle); + FMOD_RESULT F_API getOutputByPlugin (unsigned int *handle); + FMOD_RESULT F_API createDSPByPlugin (unsigned int handle, DSP **dsp); + FMOD_RESULT F_API getDSPInfoByPlugin (unsigned int handle, const FMOD_DSP_DESCRIPTION **description); + FMOD_RESULT F_API registerCodec (FMOD_CODEC_DESCRIPTION *description, unsigned int *handle, unsigned int priority = 0); + FMOD_RESULT F_API registerDSP (const FMOD_DSP_DESCRIPTION *description, unsigned int *handle); + FMOD_RESULT F_API registerOutput (const FMOD_OUTPUT_DESCRIPTION *description, unsigned int *handle); + + // Init/Close. + FMOD_RESULT F_API init (int maxchannels, FMOD_INITFLAGS flags, void *extradriverdata); + FMOD_RESULT F_API close (); + + // General post-init system functions. + FMOD_RESULT F_API update (); /* IMPORTANT! CALL THIS ONCE PER FRAME! */ + + FMOD_RESULT F_API setSpeakerPosition (FMOD_SPEAKER speaker, float x, float y, bool active); + FMOD_RESULT F_API getSpeakerPosition (FMOD_SPEAKER speaker, float *x, float *y, bool *active); + FMOD_RESULT F_API setStreamBufferSize (unsigned int filebuffersize, FMOD_TIMEUNIT filebuffersizetype); + FMOD_RESULT F_API getStreamBufferSize (unsigned int *filebuffersize, FMOD_TIMEUNIT *filebuffersizetype); + FMOD_RESULT F_API set3DSettings (float dopplerscale, float distancefactor, float rolloffscale); + FMOD_RESULT F_API get3DSettings (float *dopplerscale, float *distancefactor, float *rolloffscale); + FMOD_RESULT F_API set3DNumListeners (int numlisteners); + FMOD_RESULT F_API get3DNumListeners (int *numlisteners); + FMOD_RESULT F_API set3DListenerAttributes (int listener, const FMOD_VECTOR *pos, const FMOD_VECTOR *vel, const FMOD_VECTOR *forward, const FMOD_VECTOR *up); + FMOD_RESULT F_API get3DListenerAttributes (int listener, FMOD_VECTOR *pos, FMOD_VECTOR *vel, FMOD_VECTOR *forward, FMOD_VECTOR *up); + FMOD_RESULT F_API set3DRolloffCallback (FMOD_3D_ROLLOFF_CALLBACK callback); + FMOD_RESULT F_API mixerSuspend (); + FMOD_RESULT F_API mixerResume (); + FMOD_RESULT F_API getDefaultMixMatrix (FMOD_SPEAKERMODE sourcespeakermode, FMOD_SPEAKERMODE targetspeakermode, float *matrix, int matrixhop); + FMOD_RESULT F_API getSpeakerModeChannels (FMOD_SPEAKERMODE mode, int *channels); + + // System information functions. + FMOD_RESULT F_API getVersion (unsigned int *version); + FMOD_RESULT F_API getOutputHandle (void **handle); + FMOD_RESULT F_API getChannelsPlaying (int *channels); + FMOD_RESULT F_API getChannelsReal (int *realchannels); + FMOD_RESULT F_API getCPUUsage (float *dsp, float *stream, float *geometry, float *update, float *total); + FMOD_RESULT F_API getSoundRAM (int *currentalloced, int *maxalloced, int *total); + + // Sound/DSP/Channel/FX creation and retrieval. + FMOD_RESULT F_API createSound (const char *name_or_data, FMOD_MODE mode, FMOD_CREATESOUNDEXINFO *exinfo, Sound **sound); + FMOD_RESULT F_API createStream (const char *name_or_data, FMOD_MODE mode, FMOD_CREATESOUNDEXINFO *exinfo, Sound **sound); + FMOD_RESULT F_API createDSP (const FMOD_DSP_DESCRIPTION *description, DSP **dsp); + FMOD_RESULT F_API createDSPByType (FMOD_DSP_TYPE type, DSP **dsp); + FMOD_RESULT F_API createChannelGroup (const char *name, ChannelGroup **channelgroup); + FMOD_RESULT F_API createSoundGroup (const char *name, SoundGroup **soundgroup); + FMOD_RESULT F_API createReverb3D (Reverb3D **reverb); + + FMOD_RESULT F_API playSound (Sound *sound, ChannelGroup *channelgroup, bool paused, Channel **channel); + FMOD_RESULT F_API playDSP (DSP *dsp, ChannelGroup *channelgroup, bool paused, Channel **channel); + FMOD_RESULT F_API getChannel (int channelid, Channel **channel); + FMOD_RESULT F_API getMasterChannelGroup (ChannelGroup **channelgroup); + FMOD_RESULT F_API getMasterSoundGroup (SoundGroup **soundgroup); + + // Routing to ports. + FMOD_RESULT F_API attachChannelGroupToPort (FMOD_PORT_TYPE portType, FMOD_PORT_INDEX portIndex, ChannelGroup *channelgroup, bool passThru = false); + FMOD_RESULT F_API detachChannelGroupFromPort (ChannelGroup *channelgroup); + + // Reverb API. + FMOD_RESULT F_API setReverbProperties (int instance, const FMOD_REVERB_PROPERTIES *prop); + FMOD_RESULT F_API getReverbProperties (int instance, FMOD_REVERB_PROPERTIES *prop); + + // System level DSP functionality. + FMOD_RESULT F_API lockDSP (); + FMOD_RESULT F_API unlockDSP (); + + // Recording API. + FMOD_RESULT F_API getRecordNumDrivers (int *numdrivers, int *numconnected); + FMOD_RESULT F_API getRecordDriverInfo (int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels, FMOD_DRIVER_STATE *state); + FMOD_RESULT F_API getRecordPosition (int id, unsigned int *position); + FMOD_RESULT F_API recordStart (int id, Sound *sound, bool loop); + FMOD_RESULT F_API recordStop (int id); + FMOD_RESULT F_API isRecording (int id, bool *recording); + + // Geometry API. + FMOD_RESULT F_API createGeometry (int maxpolygons, int maxvertices, Geometry **geometry); + FMOD_RESULT F_API setGeometrySettings (float maxworldsize); + FMOD_RESULT F_API getGeometrySettings (float *maxworldsize); + FMOD_RESULT F_API loadGeometry (const void *data, int datasize, Geometry **geometry); + FMOD_RESULT F_API getGeometryOcclusion (const FMOD_VECTOR *listener, const FMOD_VECTOR *source, float *direct, float *reverb); + + // Network functions. + FMOD_RESULT F_API setNetworkProxy (const char *proxy); + FMOD_RESULT F_API getNetworkProxy (char *proxy, int proxylen); + FMOD_RESULT F_API setNetworkTimeout (int timeout); + FMOD_RESULT F_API getNetworkTimeout (int *timeout); + + // Userdata set/get. + FMOD_RESULT F_API setUserData (void *userdata); + FMOD_RESULT F_API getUserData (void **userdata); + }; + + /* + 'Sound' API + */ + class Sound + { + private: + + // Constructor made private so user cannot statically instance a Sound class. Appropriate Sound creation or retrieval function must be used. + Sound(); + Sound(const Sound &); + + public: + + FMOD_RESULT F_API release (); + FMOD_RESULT F_API getSystemObject (System **system); + + // Standard sound manipulation functions. + FMOD_RESULT F_API lock (unsigned int offset, unsigned int length, void **ptr1, void **ptr2, unsigned int *len1, unsigned int *len2); + FMOD_RESULT F_API unlock (void *ptr1, void *ptr2, unsigned int len1, unsigned int len2); + FMOD_RESULT F_API setDefaults (float frequency, int priority); + FMOD_RESULT F_API getDefaults (float *frequency, int *priority); + FMOD_RESULT F_API set3DMinMaxDistance (float min, float max); + FMOD_RESULT F_API get3DMinMaxDistance (float *min, float *max); + FMOD_RESULT F_API set3DConeSettings (float insideconeangle, float outsideconeangle, float outsidevolume); + FMOD_RESULT F_API get3DConeSettings (float *insideconeangle, float *outsideconeangle, float *outsidevolume); + FMOD_RESULT F_API set3DCustomRolloff (FMOD_VECTOR *points, int numpoints); + FMOD_RESULT F_API get3DCustomRolloff (FMOD_VECTOR **points, int *numpoints); + FMOD_RESULT F_API getSubSound (int index, Sound **subsound); + FMOD_RESULT F_API getSubSoundParent (Sound **parentsound); + FMOD_RESULT F_API getName (char *name, int namelen); + FMOD_RESULT F_API getLength (unsigned int *length, FMOD_TIMEUNIT lengthtype); + FMOD_RESULT F_API getFormat (FMOD_SOUND_TYPE *type, FMOD_SOUND_FORMAT *format, int *channels, int *bits); + FMOD_RESULT F_API getNumSubSounds (int *numsubsounds); + FMOD_RESULT F_API getNumTags (int *numtags, int *numtagsupdated); + FMOD_RESULT F_API getTag (const char *name, int index, FMOD_TAG *tag); + FMOD_RESULT F_API getOpenState (FMOD_OPENSTATE *openstate, unsigned int *percentbuffered, bool *starving, bool *diskbusy); + FMOD_RESULT F_API readData (void *buffer, unsigned int lenbytes, unsigned int *read); + FMOD_RESULT F_API seekData (unsigned int pcm); + + FMOD_RESULT F_API setSoundGroup (SoundGroup *soundgroup); + FMOD_RESULT F_API getSoundGroup (SoundGroup **soundgroup); + + // Synchronization point API. These points can come from markers embedded in wav files, and can also generate channel callbacks. + FMOD_RESULT F_API getNumSyncPoints (int *numsyncpoints); + FMOD_RESULT F_API getSyncPoint (int index, FMOD_SYNCPOINT **point); + FMOD_RESULT F_API getSyncPointInfo (FMOD_SYNCPOINT *point, char *name, int namelen, unsigned int *offset, FMOD_TIMEUNIT offsettype); + FMOD_RESULT F_API addSyncPoint (unsigned int offset, FMOD_TIMEUNIT offsettype, const char *name, FMOD_SYNCPOINT **point); + FMOD_RESULT F_API deleteSyncPoint (FMOD_SYNCPOINT *point); + + // Functions also in Channel class but here they are the 'default' to save having to change it in Channel all the time. + FMOD_RESULT F_API setMode (FMOD_MODE mode); + FMOD_RESULT F_API getMode (FMOD_MODE *mode); + FMOD_RESULT F_API setLoopCount (int loopcount); + FMOD_RESULT F_API getLoopCount (int *loopcount); + FMOD_RESULT F_API setLoopPoints (unsigned int loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int loopend, FMOD_TIMEUNIT loopendtype); + FMOD_RESULT F_API getLoopPoints (unsigned int *loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int *loopend, FMOD_TIMEUNIT loopendtype); + + // For MOD/S3M/XM/IT/MID sequenced formats only. + FMOD_RESULT F_API getMusicNumChannels (int *numchannels); + FMOD_RESULT F_API setMusicChannelVolume (int channel, float volume); + FMOD_RESULT F_API getMusicChannelVolume (int channel, float *volume); + FMOD_RESULT F_API setMusicSpeed (float speed); + FMOD_RESULT F_API getMusicSpeed (float *speed); + + // Userdata set/get. + FMOD_RESULT F_API setUserData (void *userdata); + FMOD_RESULT F_API getUserData (void **userdata); + }; + + + /* + 'ChannelControl API'. This is a base class for Channel and ChannelGroup so they can share the same functionality. This cannot be used or instansiated explicitly. + */ + class ChannelControl + { + private: + + // Constructor made private so user cannot statically instance a Control class. + ChannelControl(); + ChannelControl(const ChannelControl &); + + public: + + FMOD_RESULT F_API getSystemObject (System **system); + + // General control functionality for Channels and ChannelGroups. + FMOD_RESULT F_API stop (); + FMOD_RESULT F_API setPaused (bool paused); + FMOD_RESULT F_API getPaused (bool *paused); + FMOD_RESULT F_API setVolume (float volume); + FMOD_RESULT F_API getVolume (float *volume); + FMOD_RESULT F_API setVolumeRamp (bool ramp); + FMOD_RESULT F_API getVolumeRamp (bool *ramp); + FMOD_RESULT F_API getAudibility (float *audibility); + FMOD_RESULT F_API setPitch (float pitch); + FMOD_RESULT F_API getPitch (float *pitch); + FMOD_RESULT F_API setMute (bool mute); + FMOD_RESULT F_API getMute (bool *mute); + FMOD_RESULT F_API setReverbProperties (int instance, float wet); + FMOD_RESULT F_API getReverbProperties (int instance, float *wet); + FMOD_RESULT F_API setLowPassGain (float gain); + FMOD_RESULT F_API getLowPassGain (float *gain); + FMOD_RESULT F_API setMode (FMOD_MODE mode); + FMOD_RESULT F_API getMode (FMOD_MODE *mode); + FMOD_RESULT F_API setCallback (FMOD_CHANNELCONTROL_CALLBACK callback); + FMOD_RESULT F_API isPlaying (bool *isplaying); + + // Panning and level adjustment. + // Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values. + FMOD_RESULT F_API setPan (float pan); + FMOD_RESULT F_API setMixLevelsOutput (float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright); + FMOD_RESULT F_API setMixLevelsInput (float *levels, int numlevels); + FMOD_RESULT F_API setMixMatrix (float *matrix, int outchannels, int inchannels, int inchannel_hop = 0); + FMOD_RESULT F_API getMixMatrix (float *matrix, int *outchannels, int *inchannels, int inchannel_hop = 0); + + // Clock based functionality. + FMOD_RESULT F_API getDSPClock (unsigned long long *dspclock, unsigned long long *parentclock); + FMOD_RESULT F_API setDelay (unsigned long long dspclock_start, unsigned long long dspclock_end, bool stopchannels = true); + FMOD_RESULT F_API getDelay (unsigned long long *dspclock_start, unsigned long long *dspclock_end, bool *stopchannels = 0); + FMOD_RESULT F_API addFadePoint (unsigned long long dspclock, float volume); + FMOD_RESULT F_API setFadePointRamp (unsigned long long dspclock, float volume); + FMOD_RESULT F_API removeFadePoints (unsigned long long dspclock_start, unsigned long long dspclock_end); + FMOD_RESULT F_API getFadePoints (unsigned int *numpoints, unsigned long long *point_dspclock, float *point_volume); + + // DSP effects. + FMOD_RESULT F_API getDSP (int index, DSP **dsp); + FMOD_RESULT F_API addDSP (int index, DSP *dsp); + FMOD_RESULT F_API removeDSP (DSP *dsp); + FMOD_RESULT F_API getNumDSPs (int *numdsps); + FMOD_RESULT F_API setDSPIndex (DSP *dsp, int index); + FMOD_RESULT F_API getDSPIndex (DSP *dsp, int *index); + FMOD_RESULT F_API overridePanDSP (DSP *pan); + + // 3D functionality. + FMOD_RESULT F_API set3DAttributes (const FMOD_VECTOR *pos, const FMOD_VECTOR *vel, const FMOD_VECTOR *alt_pan_pos = 0); + FMOD_RESULT F_API get3DAttributes (FMOD_VECTOR *pos, FMOD_VECTOR *vel, FMOD_VECTOR *alt_pan_pos = 0); + FMOD_RESULT F_API set3DMinMaxDistance (float mindistance, float maxdistance); + FMOD_RESULT F_API get3DMinMaxDistance (float *mindistance, float *maxdistance); + FMOD_RESULT F_API set3DConeSettings (float insideconeangle, float outsideconeangle, float outsidevolume); + FMOD_RESULT F_API get3DConeSettings (float *insideconeangle, float *outsideconeangle, float *outsidevolume); + FMOD_RESULT F_API set3DConeOrientation (FMOD_VECTOR *orientation); + FMOD_RESULT F_API get3DConeOrientation (FMOD_VECTOR *orientation); + FMOD_RESULT F_API set3DCustomRolloff (FMOD_VECTOR *points, int numpoints); + FMOD_RESULT F_API get3DCustomRolloff (FMOD_VECTOR **points, int *numpoints); + FMOD_RESULT F_API set3DOcclusion (float directocclusion, float reverbocclusion); + FMOD_RESULT F_API get3DOcclusion (float *directocclusion, float *reverbocclusion); + FMOD_RESULT F_API set3DSpread (float angle); + FMOD_RESULT F_API get3DSpread (float *angle); + FMOD_RESULT F_API set3DLevel (float level); + FMOD_RESULT F_API get3DLevel (float *level); + FMOD_RESULT F_API set3DDopplerLevel (float level); + FMOD_RESULT F_API get3DDopplerLevel (float *level); + FMOD_RESULT F_API set3DDistanceFilter (bool custom, float customLevel, float centerFreq); + FMOD_RESULT F_API get3DDistanceFilter (bool *custom, float *customLevel, float *centerFreq); + + // Userdata set/get. + FMOD_RESULT F_API setUserData (void *userdata); + FMOD_RESULT F_API getUserData (void **userdata); + }; + + /* + 'Channel' API. + */ + class Channel : public ChannelControl + { + private: + + // Constructor made private so user cannot statically instance a Channel class. Appropriate Channel creation or retrieval function must be used. + Channel(); + Channel(const Channel &); + + public: + + // Channel specific control functionality. + FMOD_RESULT F_API setFrequency (float frequency); + FMOD_RESULT F_API getFrequency (float *frequency); + FMOD_RESULT F_API setPriority (int priority); + FMOD_RESULT F_API getPriority (int *priority); + FMOD_RESULT F_API setPosition (unsigned int position, FMOD_TIMEUNIT postype); + FMOD_RESULT F_API getPosition (unsigned int *position, FMOD_TIMEUNIT postype); + FMOD_RESULT F_API setChannelGroup (ChannelGroup *channelgroup); + FMOD_RESULT F_API getChannelGroup (ChannelGroup **channelgroup); + FMOD_RESULT F_API setLoopCount (int loopcount); + FMOD_RESULT F_API getLoopCount (int *loopcount); + FMOD_RESULT F_API setLoopPoints (unsigned int loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int loopend, FMOD_TIMEUNIT loopendtype); + FMOD_RESULT F_API getLoopPoints (unsigned int *loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int *loopend, FMOD_TIMEUNIT loopendtype); + + // Information only functions. + FMOD_RESULT F_API isVirtual (bool *isvirtual); + FMOD_RESULT F_API getCurrentSound (Sound **sound); + FMOD_RESULT F_API getIndex (int *index); + }; + + /* + 'ChannelGroup' API + */ + class ChannelGroup : public ChannelControl + { + private: + + // Constructor made private so user cannot statically instance a ChannelGroup class. Appropriate ChannelGroup creation or retrieval function must be used. + ChannelGroup(); + ChannelGroup(const ChannelGroup &); + + public: + + FMOD_RESULT F_API release (); + + // Nested channel groups. + FMOD_RESULT F_API addGroup (ChannelGroup *group, bool propagatedspclock = true, DSPConnection **connection = 0); + FMOD_RESULT F_API getNumGroups (int *numgroups); + FMOD_RESULT F_API getGroup (int index, ChannelGroup **group); + FMOD_RESULT F_API getParentGroup (ChannelGroup **group); + + // Information only functions. + FMOD_RESULT F_API getName (char *name, int namelen); + FMOD_RESULT F_API getNumChannels (int *numchannels); + FMOD_RESULT F_API getChannel (int index, Channel **channel); + }; + + /* + 'SoundGroup' API + */ + class SoundGroup + { + private: + + // Constructor made private so user cannot statically instance a SoundGroup class. Appropriate SoundGroup creation or retrieval function must be used. + SoundGroup(); + SoundGroup(const SoundGroup &); + + public: + + FMOD_RESULT F_API release (); + FMOD_RESULT F_API getSystemObject (System **system); + + // SoundGroup control functions. + FMOD_RESULT F_API setMaxAudible (int maxaudible); + FMOD_RESULT F_API getMaxAudible (int *maxaudible); + FMOD_RESULT F_API setMaxAudibleBehavior (FMOD_SOUNDGROUP_BEHAVIOR behavior); + FMOD_RESULT F_API getMaxAudibleBehavior (FMOD_SOUNDGROUP_BEHAVIOR *behavior); + FMOD_RESULT F_API setMuteFadeSpeed (float speed); + FMOD_RESULT F_API getMuteFadeSpeed (float *speed); + FMOD_RESULT F_API setVolume (float volume); + FMOD_RESULT F_API getVolume (float *volume); + FMOD_RESULT F_API stop (); + + // Information only functions. + FMOD_RESULT F_API getName (char *name, int namelen); + FMOD_RESULT F_API getNumSounds (int *numsounds); + FMOD_RESULT F_API getSound (int index, Sound **sound); + FMOD_RESULT F_API getNumPlaying (int *numplaying); + + // Userdata set/get. + FMOD_RESULT F_API setUserData (void *userdata); + FMOD_RESULT F_API getUserData (void **userdata); + }; + + /* + 'DSP' API + */ + class DSP + { + private: + + // Constructor made private so user cannot statically instance a DSP class. Appropriate DSP creation or retrieval function must be used. + DSP(); + DSP(const DSP &); + + public: + + FMOD_RESULT F_API release (); + FMOD_RESULT F_API getSystemObject (System **system); + + // Connection / disconnection / input and output enumeration. + FMOD_RESULT F_API addInput (DSP *input, DSPConnection **connection = 0, FMOD_DSPCONNECTION_TYPE type = FMOD_DSPCONNECTION_TYPE_STANDARD); + FMOD_RESULT F_API disconnectFrom (DSP *target, DSPConnection *connection = 0); + FMOD_RESULT F_API disconnectAll (bool inputs, bool outputs); + FMOD_RESULT F_API getNumInputs (int *numinputs); + FMOD_RESULT F_API getNumOutputs (int *numoutputs); + FMOD_RESULT F_API getInput (int index, DSP **input, DSPConnection **inputconnection); + FMOD_RESULT F_API getOutput (int index, DSP **output, DSPConnection **outputconnection); + + // DSP unit control. + FMOD_RESULT F_API setActive (bool active); + FMOD_RESULT F_API getActive (bool *active); + FMOD_RESULT F_API setBypass (bool bypass); + FMOD_RESULT F_API getBypass (bool *bypass); + FMOD_RESULT F_API setWetDryMix (float prewet, float postwet, float dry); + FMOD_RESULT F_API getWetDryMix (float *prewet, float *postwet, float *dry); + FMOD_RESULT F_API setChannelFormat (FMOD_CHANNELMASK channelmask, int numchannels, FMOD_SPEAKERMODE source_speakermode); + FMOD_RESULT F_API getChannelFormat (FMOD_CHANNELMASK *channelmask, int *numchannels, FMOD_SPEAKERMODE *source_speakermode); + FMOD_RESULT F_API getOutputChannelFormat (FMOD_CHANNELMASK inmask, int inchannels, FMOD_SPEAKERMODE inspeakermode, FMOD_CHANNELMASK *outmask, int *outchannels, FMOD_SPEAKERMODE *outspeakermode); + FMOD_RESULT F_API reset (); + + // DSP parameter control. + FMOD_RESULT F_API setParameterFloat (int index, float value); + FMOD_RESULT F_API setParameterInt (int index, int value); + FMOD_RESULT F_API setParameterBool (int index, bool value); + FMOD_RESULT F_API setParameterData (int index, void *data, unsigned int length); + FMOD_RESULT F_API getParameterFloat (int index, float *value, char *valuestr, int valuestrlen); + FMOD_RESULT F_API getParameterInt (int index, int *value, char *valuestr, int valuestrlen); + FMOD_RESULT F_API getParameterBool (int index, bool *value, char *valuestr, int valuestrlen); + FMOD_RESULT F_API getParameterData (int index, void **data, unsigned int *length, char *valuestr, int valuestrlen); + FMOD_RESULT F_API getNumParameters (int *numparams); + FMOD_RESULT F_API getParameterInfo (int index, FMOD_DSP_PARAMETER_DESC **desc); + FMOD_RESULT F_API getDataParameterIndex (int datatype, int *index); + FMOD_RESULT F_API showConfigDialog (void *hwnd, bool show); + + // DSP attributes. + FMOD_RESULT F_API getInfo (char *name, unsigned int *version, int *channels, int *configwidth, int *configheight); + FMOD_RESULT F_API getType (FMOD_DSP_TYPE *type); + FMOD_RESULT F_API getIdle (bool *idle); + + // Userdata set/get. + FMOD_RESULT F_API setUserData (void *userdata); + FMOD_RESULT F_API getUserData (void **userdata); + + // Metering. + FMOD_RESULT F_API setMeteringEnabled (bool inputEnabled, bool outputEnabled); + FMOD_RESULT F_API getMeteringEnabled (bool *inputEnabled, bool *outputEnabled); + FMOD_RESULT F_API getMeteringInfo (FMOD_DSP_METERING_INFO *inputInfo, FMOD_DSP_METERING_INFO *outputInfo); + }; + + + /* + 'DSPConnection' API + */ + class DSPConnection + { + private: + + // Constructor made private so user cannot statically instance a DSPConnection class. Appropriate DSPConnection creation or retrieval function must be used. + DSPConnection(); + DSPConnection(const DSPConnection &); + + public: + + FMOD_RESULT F_API getInput (DSP **input); + FMOD_RESULT F_API getOutput (DSP **output); + FMOD_RESULT F_API setMix (float volume); + FMOD_RESULT F_API getMix (float *volume); + FMOD_RESULT F_API setMixMatrix (float *matrix, int outchannels, int inchannels, int inchannel_hop = 0); + FMOD_RESULT F_API getMixMatrix (float *matrix, int *outchannels, int *inchannels, int inchannel_hop = 0); + FMOD_RESULT F_API getType (FMOD_DSPCONNECTION_TYPE *type); + + // Userdata set/get. + FMOD_RESULT F_API setUserData (void *userdata); + FMOD_RESULT F_API getUserData (void **userdata); + }; + + + /* + 'Geometry' API + */ + class Geometry + { + private: + + // Constructor made private so user cannot statically instance a Geometry class. Appropriate Geometry creation or retrieval function must be used. + Geometry(); + Geometry(const Geometry &); + + public: + + FMOD_RESULT F_API release (); + + // Polygon manipulation. + FMOD_RESULT F_API addPolygon (float directocclusion, float reverbocclusion, bool doublesided, int numvertices, const FMOD_VECTOR *vertices, int *polygonindex); + FMOD_RESULT F_API getNumPolygons (int *numpolygons); + FMOD_RESULT F_API getMaxPolygons (int *maxpolygons, int *maxvertices); + FMOD_RESULT F_API getPolygonNumVertices (int index, int *numvertices); + FMOD_RESULT F_API setPolygonVertex (int index, int vertexindex, const FMOD_VECTOR *vertex); + FMOD_RESULT F_API getPolygonVertex (int index, int vertexindex, FMOD_VECTOR *vertex); + FMOD_RESULT F_API setPolygonAttributes (int index, float directocclusion, float reverbocclusion, bool doublesided); + FMOD_RESULT F_API getPolygonAttributes (int index, float *directocclusion, float *reverbocclusion, bool *doublesided); + + // Object manipulation. + FMOD_RESULT F_API setActive (bool active); + FMOD_RESULT F_API getActive (bool *active); + FMOD_RESULT F_API setRotation (const FMOD_VECTOR *forward, const FMOD_VECTOR *up); + FMOD_RESULT F_API getRotation (FMOD_VECTOR *forward, FMOD_VECTOR *up); + FMOD_RESULT F_API setPosition (const FMOD_VECTOR *position); + FMOD_RESULT F_API getPosition (FMOD_VECTOR *position); + FMOD_RESULT F_API setScale (const FMOD_VECTOR *scale); + FMOD_RESULT F_API getScale (FMOD_VECTOR *scale); + FMOD_RESULT F_API save (void *data, int *datasize); + + // Userdata set/get. + FMOD_RESULT F_API setUserData (void *userdata); + FMOD_RESULT F_API getUserData (void **userdata); + }; + + + /* + 'Reverb' API + */ + class Reverb3D + { + private: + + // Constructor made private so user cannot statically instance a Reverb3D class. Appropriate Reverb creation or retrieval function must be used. + Reverb3D(); + Reverb3D(const Reverb3D &); + + public: + + FMOD_RESULT F_API release (); + + // Reverb manipulation. + FMOD_RESULT F_API set3DAttributes (const FMOD_VECTOR *position, float mindistance, float maxdistance); + FMOD_RESULT F_API get3DAttributes (FMOD_VECTOR *position, float *mindistance,float *maxdistance); + FMOD_RESULT F_API setProperties (const FMOD_REVERB_PROPERTIES *properties); + FMOD_RESULT F_API getProperties (FMOD_REVERB_PROPERTIES *properties); + FMOD_RESULT F_API setActive (bool active); + FMOD_RESULT F_API getActive (bool *active); + + // Userdata set/get. + FMOD_RESULT F_API setUserData (void *userdata); + FMOD_RESULT F_API getUserData (void **userdata); + }; +} + +#endif diff --git a/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_codec.h b/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_codec.h new file mode 100644 index 0000000..d4d292c --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_codec.h @@ -0,0 +1,178 @@ +/* ======================================================================================================== */ +/* FMOD Studio - codec development header file. Copyright (c), Firelight Technologies Pty, Ltd. 2004-2016. */ +/* */ +/* Use this header if you are wanting to develop your own file format plugin to use with */ +/* FMOD's codec system. With this header you can make your own fileformat plugin that FMOD */ +/* can register and use. See the documentation and examples on how to make a working plugin. */ +/* */ +/* ======================================================================================================== */ + +#ifndef _FMOD_CODEC_H +#define _FMOD_CODEC_H + +typedef struct FMOD_CODEC_STATE FMOD_CODEC_STATE; +typedef struct FMOD_CODEC_WAVEFORMAT FMOD_CODEC_WAVEFORMAT; + +/* + Codec callbacks +*/ +typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_OPEN_CALLBACK) (FMOD_CODEC_STATE *codec_state, FMOD_MODE usermode, FMOD_CREATESOUNDEXINFO *userexinfo); +typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_CLOSE_CALLBACK) (FMOD_CODEC_STATE *codec_state); +typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_READ_CALLBACK) (FMOD_CODEC_STATE *codec_state, void *buffer, unsigned int samples_in, unsigned int *samples_out); +typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_GETLENGTH_CALLBACK) (FMOD_CODEC_STATE *codec_state, unsigned int *length, FMOD_TIMEUNIT lengthtype); +typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_SETPOSITION_CALLBACK) (FMOD_CODEC_STATE *codec_state, int subsound, unsigned int position, FMOD_TIMEUNIT postype); +typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_GETPOSITION_CALLBACK) (FMOD_CODEC_STATE *codec_state, unsigned int *position, FMOD_TIMEUNIT postype); +typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_SOUNDCREATE_CALLBACK) (FMOD_CODEC_STATE *codec_state, int subsound, FMOD_SOUND *sound); +typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_METADATA_CALLBACK) (FMOD_CODEC_STATE *codec_state, FMOD_TAGTYPE tagtype, char *name, void *data, unsigned int datalen, FMOD_TAGDATATYPE datatype, int unique); +typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_GETWAVEFORMAT_CALLBACK)(FMOD_CODEC_STATE *codec_state, int index, FMOD_CODEC_WAVEFORMAT *waveformat); + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + When creating a codec, declare one of these and provide the relevant callbacks and name for FMOD to use when it opens and reads a file. + + [REMARKS] + Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
+ Members marked with [w] mean the variable can be written to. The user can set the value.
+ + [SEE_ALSO] + FMOD_CODEC_STATE + FMOD_CODEC_WAVEFORMAT +] +*/ +typedef struct FMOD_CODEC_DESCRIPTION +{ + const char *name; /* [w] Name of the codec. */ + unsigned int version; /* [w] Plugin writer's version number. */ + int defaultasstream; /* [w] Tells FMOD to open the file as a stream when calling System::createSound, and not a static sample. Should normally be 0 (FALSE), because generally the user wants to decode the file into memory when using System::createSound. Mainly used for formats that decode for a very long time, or could use large amounts of memory when decoded. Usually sequenced formats such as mod/s3m/xm/it/midi fall into this category. It is mainly to stop users that don't know what they're doing from getting FMOD_ERR_MEMORY returned from createSound when they should have in fact called System::createStream or used FMOD_CREATESTREAM in System::createSound. */ + FMOD_TIMEUNIT timeunits; /* [w] When setposition codec is called, only these time formats will be passed to the codec. Use bitwise OR to accumulate different types. */ + FMOD_CODEC_OPEN_CALLBACK open; /* [w] Open callback for the codec for when FMOD tries to open a sound using this codec. */ + FMOD_CODEC_CLOSE_CALLBACK close; /* [w] Close callback for the codec for when FMOD tries to close a sound using this codec. */ + FMOD_CODEC_READ_CALLBACK read; /* [w] Read callback for the codec for when FMOD tries to read some data from the file to the destination format (specified in the open callback). */ + FMOD_CODEC_GETLENGTH_CALLBACK getlength; /* [w] Callback to return the length of the song in whatever format required when Sound::getLength is called. */ + FMOD_CODEC_SETPOSITION_CALLBACK setposition; /* [w] Seek callback for the codec for when FMOD tries to seek within the file with Channel::setPosition. */ + FMOD_CODEC_GETPOSITION_CALLBACK getposition; /* [w] Tell callback for the codec for when FMOD tries to get the current position within the with Channel::getPosition. */ + FMOD_CODEC_SOUNDCREATE_CALLBACK soundcreate; /* [w] Sound creation callback for the codec when FMOD finishes creating the sound. (So the codec can set more parameters for the related created sound, ie loop points/mode or 3D attributes etc). */ + FMOD_CODEC_GETWAVEFORMAT_CALLBACK getwaveformat; /* [w] Callback to tell FMOD about the waveformat of a particular subsound. This is to save memory, rather than saving 1000 FMOD_CODEC_WAVEFORMAT structures in the codec, the codec might have a more optimal way of storing this information. */ +} FMOD_CODEC_DESCRIPTION; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Set these values marked to tell fmod what sort of sound to create when the codec open callback is called.
+ The format, channels, frequency and lengthpcm tell FMOD what sort of sound buffer to create when you initialize your code.
+ If you wrote an MP3 codec that decoded to stereo 16bit integer PCM for a 44khz sound, you would specify FMOD_SOUND_FORMAT_PCM16, and channels would be equal to 2, and frequency would be 44100.
+ + [REMARKS] + Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
+ Members marked with [w] mean the variable can be written to. The user can set the value.
+
+ 1.07 Note. 'blockalign' member which was in bytes has been removed. 'pcmblocksize' is now the replacement, and is measured in PCM samples only, not bytes. This is purely to support buffering + internal to FMOD for codecs that are not sample accurate. +
+ Note: When registering a codec, format, channels, frequency and lengthpcm must be supplied, otherwise there will be an error.
+ This structure is optional if FMOD_CODEC_GETWAVEFORMAT_CALLBACK is specified.
+ An array of these structures may be needed if FMOD_CODEC_STATE::numsubsounds is larger than 1. + + + [SEE_ALSO] + FMOD_CODEC_STATE + FMOD_SOUND_FORMAT + FMOD_MODE + FMOD_CHANNELMASK + FMOD_CHANNELORDER + FMOD_CODEC_WAVEFORMAT_VERSION +] +*/ +struct FMOD_CODEC_WAVEFORMAT +{ + char name[256]; /* [w] Name of sound. Optional. */ + FMOD_SOUND_FORMAT format; /* [w] Format for (decompressed) codec output, ie FMOD_SOUND_FORMAT_PCM8, FMOD_SOUND_FORMAT_PCM16. Mandantory - Must be supplied. */ + int channels; /* [w] Number of channels used by codec, ie mono = 1, stereo = 2. Mandantory - Must be supplied. */ + int frequency; /* [w] Default frequency in hz of the codec, ie 44100. Mandantory - Must be supplied. */ + unsigned int lengthbytes; /* [w] Length in bytes of the source data. Used for FMOD_TIMEUNIT_RAWBYTES. Optional. Default = 0. */ + unsigned int lengthpcm; /* [w] Length in decompressed, PCM samples of the file, ie length in seconds * frequency. Used for Sound::getLength and for memory allocation of static decompressed sample data. Mandantory - Must be supplied. */ + unsigned int pcmblocksize; /* [w] Minimum, optimal number of decompressed PCM samples codec can handle. 0 or 1 = no buffering. Anything higher means FMOD will allocate a PCM buffer of this size to read in chunks. The codec read callback will be called in multiples of this value. Optional. */ + int loopstart; /* [w] Loopstart in decompressed, PCM samples of file. Optional. Default = 0. */ + int loopend; /* [w] Loopend in decompressed, PCM samples of file. Optional. Default = 0. */ + FMOD_MODE mode; /* [w] Mode to determine whether the sound should by default load as looping, non looping, 2d or 3d. Optional. Default = FMOD_DEFAULT. */ + FMOD_CHANNELMASK channelmask; /* [w] Defined channel bitmask to describe which speakers the channels in the codec map to, in order of channel count. See fmod_common.h. Optional. Leave at 0 to map to the speaker layout defined in FMOD_SPEAKER. */ + FMOD_CHANNELORDER channelorder; /* [w] Defined channel order type, to describe where each sound channel should pan for the number of channels specified. See fmod_common.h. Optional. Leave at 0 to play in default speaker order. */ + float peakvolume; /* [w] Peak volume of sound. Optional. Default = 0 if not used. */ +}; + + +/* +[DEFINE] +[ + [NAME] + FMOD_CODEC_WAVEFORMAT_VERSION + + [DESCRIPTION] + Version number of FMOD_CODEC_WAVEFORMAT structure. Should be set into FMOD_CODEC_STATE in the FMOD_CODEC_OPEN_CALLBACK. + + [REMARKS] + Use this for binary compatibility and for future expansion. + + [SEE_ALSO] + FMOD_CODEC_STATE + FMOD_CODEC_DESCRIPTION + FMOD_CODEC_OPEN_CALLBACK +] +*/ +#define FMOD_CODEC_WAVEFORMAT_VERSION 2 +/* [DEFINE_END] */ + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Codec plugin structure that is passed into each callback.
+
+ Optionally set the numsubsounds and waveformat members when called in FMOD_CODEC_OPEN_CALLBACK to tell fmod what sort of sound to create.
+ + [REMARKS] + Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
+ Members marked with [w] mean the variable can be written to. The user can set the value.
+
+ 'numsubsounds' should be 0 if the file is a normal single sound stream or sound. Examples of this would be .WAV, .WMA, .MP3, .AIFF.
+ 'numsubsounds' should be 1+ if the file is a container format, and does not contain wav data itself. Examples of these types would be FSB (contains multiple sounds), DLS (contain instruments).
+ The waveformat value should point to an arrays of information based on how many subsounds are in the format. If the number of subsounds is 0 then it should point to 1 waveformat, the same as if the number of subsounds was 1. If subsounds was 100 for example, there should be a pointer to an array of 100 waveformat structures.
+
+ The waveformat pointer is optional and could be 0, if using FMOD_CODEC_GETWAVEFORMAT_CALLBACK is preferred.
+
+ When a sound has 1 or more subsounds, the caller must play the individual sounds specified by first obtaining the subsound with Sound::getSubSound. + + [SEE_ALSO] + FMOD_CODEC_WAVEFORMAT + FMOD_FILE_READ_CALLBACK + FMOD_FILE_SEEK_CALLBACK + FMOD_CODEC_METADATA_CALLBACK + Sound::getSubSound + Sound::getNumSubSounds + FMOD_CODEC_WAVEFORMAT_VERSION +] +*/ +struct FMOD_CODEC_STATE +{ + int numsubsounds; /* [w] Number of 'subsounds' in this sound. Anything other than 0 makes it a 'container' format (ie DLS/FSB etc which contain 1 or more subsounds). For most normal, single sound codec such as WAV/AIFF/MP3, this should be 0 as they are not a container for subsounds, they are the sound by itself. */ + FMOD_CODEC_WAVEFORMAT *waveformat; /* [w] Pointer to an array of format structures containing information about each sample. Can be 0 or NULL if FMOD_CODEC_GETWAVEFORMAT_CALLBACK callback is preferred. The number of entries here must equal the number of subsounds defined in the subsound parameter. If numsubsounds = 0 then there should be 1 instance of this structure. */ + void *plugindata; /* [w] Plugin writer created data the codec author wants to attach to this object. */ + + void *filehandle; /* [r] This will return an internal FMOD file handle to use with the callbacks provided. */ + unsigned int filesize; /* [r] This will contain the size of the file in bytes. */ + FMOD_FILE_READ_CALLBACK fileread; /* [r] This will return a callable FMOD file function to use from codec. */ + FMOD_FILE_SEEK_CALLBACK fileseek; /* [r] This will return a callable FMOD file function to use from codec. */ + FMOD_CODEC_METADATA_CALLBACK metadata; /* [r] This will return a callable FMOD metadata function to use from codec. */ + + int waveformatversion; /* [w] Must be set to FMOD_CODEC_WAVEFORMAT_VERSION in the FMOD_CODEC_OPEN_CALLBACK. */ +}; + +#endif + + diff --git a/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_common.h b/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_common.h new file mode 100644 index 0000000..3af283e --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_common.h @@ -0,0 +1,1687 @@ +/*$ preserve start $*/ + +/* ================================================================================================== */ +/* FMOD Studio - Common C/C++ header file. Copyright (c), Firelight Technologies Pty, Ltd. 2004-2016. */ +/* */ +/* This header is included by fmod.hpp (C++ interface) and fmod.h (C interface) therefore is the */ +/* base header for all FMOD headers. */ +/* ================================================================================================== */ + +#ifndef _FMOD_COMMON_H +#define _FMOD_COMMON_H + +/* + FMOD version number. Check this against FMOD::System::getVersion. + 0xaaaabbcc -> aaaa = major version number. bb = minor version number. cc = development version number. +*/ + +#define FMOD_VERSION 0x00010707 + +/* + Compiler specific settings. +*/ + +#if defined(__CYGWIN32__) || defined(__MINGW32__) + #define F_STDCALL __stdcall +#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(_WIN64) + #define F_STDCALL _stdcall +#elif defined(__ANDROID__) && defined(__arm__) && !defined(__LP64__) && !defined(__clang__) + #define F_STDCALL __attribute__((pcs("aapcs"))) +#else + #define F_STDCALL +#endif + +#define F_DECLSPEC + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(_WIN64) || defined(__CYGWIN32__) || defined(__MINGW32__) || defined(__ORBIS__) || defined(__psp2__) + #define F_DLLEXPORT __declspec(dllexport) +#elif defined(__MACH__) || defined(__ANDROID__) || defined(__linux__) + #define F_DLLEXPORT __attribute__((visibility("default"))) +#else + #define F_DLLEXPORT +#endif + +#ifdef DLL_EXPORTS + #define F_API F_DLLEXPORT F_STDCALL +#else + #define F_API F_STDCALL +#endif + +#define F_CALLBACK F_STDCALL + +/* + FMOD types. +*/ + +typedef int FMOD_BOOL; +typedef struct FMOD_SYSTEM FMOD_SYSTEM; +typedef struct FMOD_SOUND FMOD_SOUND; +typedef struct FMOD_CHANNELCONTROL FMOD_CHANNELCONTROL; +typedef struct FMOD_CHANNEL FMOD_CHANNEL; +typedef struct FMOD_CHANNELGROUP FMOD_CHANNELGROUP; +typedef struct FMOD_SOUNDGROUP FMOD_SOUNDGROUP; +typedef struct FMOD_REVERB3D FMOD_REVERB3D; +typedef struct FMOD_DSP FMOD_DSP; +typedef struct FMOD_DSPCONNECTION FMOD_DSPCONNECTION; +typedef struct FMOD_POLYGON FMOD_POLYGON; +typedef struct FMOD_GEOMETRY FMOD_GEOMETRY; +typedef struct FMOD_SYNCPOINT FMOD_SYNCPOINT; +typedef struct FMOD_ASYNCREADINFO FMOD_ASYNCREADINFO; +typedef unsigned int FMOD_MODE; +typedef unsigned int FMOD_TIMEUNIT; +typedef unsigned int FMOD_INITFLAGS; +typedef unsigned int FMOD_DEBUG_FLAGS; +typedef unsigned int FMOD_MEMORY_TYPE; +typedef unsigned int FMOD_SYSTEM_CALLBACK_TYPE; +typedef unsigned int FMOD_CHANNELMASK; +typedef unsigned int FMOD_DRIVER_STATE; +typedef unsigned int FMOD_PORT_TYPE; +typedef unsigned long long FMOD_PORT_INDEX; + +/*$ fmod result start $*/ +/* +[ENUM] +[ + [DESCRIPTION] + error codes. Returned from every function. + + [REMARKS] + + [SEE_ALSO] +] +*/ +typedef enum +{ + FMOD_OK, /* No errors. */ + FMOD_ERR_BADCOMMAND, /* Tried to call a function on a data type that does not allow this type of functionality (ie calling Sound::lock on a streaming sound). */ + FMOD_ERR_CHANNEL_ALLOC, /* Error trying to allocate a channel. */ + FMOD_ERR_CHANNEL_STOLEN, /* The specified channel has been reused to play another sound. */ + FMOD_ERR_DMA, /* DMA Failure. See debug output for more information. */ + FMOD_ERR_DSP_CONNECTION, /* DSP connection error. Connection possibly caused a cyclic dependency or connected dsps with incompatible buffer counts. */ + FMOD_ERR_DSP_DONTPROCESS, /* DSP return code from a DSP process query callback. Tells mixer not to call the process callback and therefore not consume CPU. Use this to optimize the DSP graph. */ + FMOD_ERR_DSP_FORMAT, /* DSP Format error. A DSP unit may have attempted to connect to this network with the wrong format, or a matrix may have been set with the wrong size if the target unit has a specified channel map. */ + FMOD_ERR_DSP_INUSE, /* DSP is already in the mixer's DSP network. It must be removed before being reinserted or released. */ + FMOD_ERR_DSP_NOTFOUND, /* DSP connection error. Couldn't find the DSP unit specified. */ + FMOD_ERR_DSP_RESERVED, /* DSP operation error. Cannot perform operation on this DSP as it is reserved by the system. */ + FMOD_ERR_DSP_SILENCE, /* DSP return code from a DSP process query callback. Tells mixer silence would be produced from read, so go idle and not consume CPU. Use this to optimize the DSP graph. */ + FMOD_ERR_DSP_TYPE, /* DSP operation cannot be performed on a DSP of this type. */ + FMOD_ERR_FILE_BAD, /* Error loading file. */ + FMOD_ERR_FILE_COULDNOTSEEK, /* Couldn't perform seek operation. This is a limitation of the medium (ie netstreams) or the file format. */ + FMOD_ERR_FILE_DISKEJECTED, /* Media was ejected while reading. */ + FMOD_ERR_FILE_EOF, /* End of file unexpectedly reached while trying to read essential data (truncated?). */ + FMOD_ERR_FILE_ENDOFDATA, /* End of current chunk reached while trying to read data. */ + FMOD_ERR_FILE_NOTFOUND, /* File not found. */ + FMOD_ERR_FORMAT, /* Unsupported file or audio format. */ + FMOD_ERR_HEADER_MISMATCH, /* There is a version mismatch between the FMOD header and either the FMOD Studio library or the FMOD Low Level library. */ + FMOD_ERR_HTTP, /* A HTTP error occurred. This is a catch-all for HTTP errors not listed elsewhere. */ + FMOD_ERR_HTTP_ACCESS, /* The specified resource requires authentication or is forbidden. */ + FMOD_ERR_HTTP_PROXY_AUTH, /* Proxy authentication is required to access the specified resource. */ + FMOD_ERR_HTTP_SERVER_ERROR, /* A HTTP server error occurred. */ + FMOD_ERR_HTTP_TIMEOUT, /* The HTTP request timed out. */ + FMOD_ERR_INITIALIZATION, /* FMOD was not initialized correctly to support this function. */ + FMOD_ERR_INITIALIZED, /* Cannot call this command after System::init. */ + FMOD_ERR_INTERNAL, /* An error occurred that wasn't supposed to. Contact support. */ + FMOD_ERR_INVALID_FLOAT, /* Value passed in was a NaN, Inf or denormalized float. */ + FMOD_ERR_INVALID_HANDLE, /* An invalid object handle was used. */ + FMOD_ERR_INVALID_PARAM, /* An invalid parameter was passed to this function. */ + FMOD_ERR_INVALID_POSITION, /* An invalid seek position was passed to this function. */ + FMOD_ERR_INVALID_SPEAKER, /* An invalid speaker was passed to this function based on the current speaker mode. */ + FMOD_ERR_INVALID_SYNCPOINT, /* The syncpoint did not come from this sound handle. */ + FMOD_ERR_INVALID_THREAD, /* Tried to call a function on a thread that is not supported. */ + FMOD_ERR_INVALID_VECTOR, /* The vectors passed in are not unit length, or perpendicular. */ + FMOD_ERR_MAXAUDIBLE, /* Reached maximum audible playback count for this sound's soundgroup. */ + FMOD_ERR_MEMORY, /* Not enough memory or resources. */ + FMOD_ERR_MEMORY_CANTPOINT, /* Can't use FMOD_OPENMEMORY_POINT on non PCM source data, or non mp3/xma/adpcm data if FMOD_CREATECOMPRESSEDSAMPLE was used. */ + FMOD_ERR_NEEDS3D, /* Tried to call a command on a 2d sound when the command was meant for 3d sound. */ + FMOD_ERR_NEEDSHARDWARE, /* Tried to use a feature that requires hardware support. */ + FMOD_ERR_NET_CONNECT, /* Couldn't connect to the specified host. */ + FMOD_ERR_NET_SOCKET_ERROR, /* A socket error occurred. This is a catch-all for socket-related errors not listed elsewhere. */ + FMOD_ERR_NET_URL, /* The specified URL couldn't be resolved. */ + FMOD_ERR_NET_WOULD_BLOCK, /* Operation on a non-blocking socket could not complete immediately. */ + FMOD_ERR_NOTREADY, /* Operation could not be performed because specified sound/DSP connection is not ready. */ + FMOD_ERR_OUTPUT_ALLOCATED, /* Error initializing output device, but more specifically, the output device is already in use and cannot be reused. */ + FMOD_ERR_OUTPUT_CREATEBUFFER, /* Error creating hardware sound buffer. */ + FMOD_ERR_OUTPUT_DRIVERCALL, /* A call to a standard soundcard driver failed, which could possibly mean a bug in the driver or resources were missing or exhausted. */ + FMOD_ERR_OUTPUT_FORMAT, /* Soundcard does not support the specified format. */ + FMOD_ERR_OUTPUT_INIT, /* Error initializing output device. */ + FMOD_ERR_OUTPUT_NODRIVERS, /* The output device has no drivers installed. If pre-init, FMOD_OUTPUT_NOSOUND is selected as the output mode. If post-init, the function just fails. */ + FMOD_ERR_PLUGIN, /* An unspecified error has been returned from a plugin. */ + FMOD_ERR_PLUGIN_MISSING, /* A requested output, dsp unit type or codec was not available. */ + FMOD_ERR_PLUGIN_RESOURCE, /* A resource that the plugin requires cannot be found. (ie the DLS file for MIDI playback) */ + FMOD_ERR_PLUGIN_VERSION, /* A plugin was built with an unsupported SDK version. */ + FMOD_ERR_RECORD, /* An error occurred trying to initialize the recording device. */ + FMOD_ERR_REVERB_CHANNELGROUP, /* Reverb properties cannot be set on this channel because a parent channelgroup owns the reverb connection. */ + FMOD_ERR_REVERB_INSTANCE, /* Specified instance in FMOD_REVERB_PROPERTIES couldn't be set. Most likely because it is an invalid instance number or the reverb doesn't exist. */ + FMOD_ERR_SUBSOUNDS, /* The error occurred because the sound referenced contains subsounds when it shouldn't have, or it doesn't contain subsounds when it should have. The operation may also not be able to be performed on a parent sound. */ + FMOD_ERR_SUBSOUND_ALLOCATED, /* This subsound is already being used by another sound, you cannot have more than one parent to a sound. Null out the other parent's entry first. */ + FMOD_ERR_SUBSOUND_CANTMOVE, /* Shared subsounds cannot be replaced or moved from their parent stream, such as when the parent stream is an FSB file. */ + FMOD_ERR_TAGNOTFOUND, /* The specified tag could not be found or there are no tags. */ + FMOD_ERR_TOOMANYCHANNELS, /* The sound created exceeds the allowable input channel count. This can be increased using the 'maxinputchannels' parameter in System::setSoftwareFormat. */ + FMOD_ERR_TRUNCATED, /* The retrieved string is too long to fit in the supplied buffer and has been truncated. */ + FMOD_ERR_UNIMPLEMENTED, /* Something in FMOD hasn't been implemented when it should be! contact support! */ + FMOD_ERR_UNINITIALIZED, /* This command failed because System::init or System::setDriver was not called. */ + FMOD_ERR_UNSUPPORTED, /* A command issued was not supported by this object. Possibly a plugin without certain callbacks specified. */ + FMOD_ERR_VERSION, /* The version number of this file format is not supported. */ + FMOD_ERR_EVENT_ALREADY_LOADED, /* The specified bank has already been loaded. */ + FMOD_ERR_EVENT_LIVEUPDATE_BUSY, /* The live update connection failed due to the game already being connected. */ + FMOD_ERR_EVENT_LIVEUPDATE_MISMATCH, /* The live update connection failed due to the game data being out of sync with the tool. */ + FMOD_ERR_EVENT_LIVEUPDATE_TIMEOUT, /* The live update connection timed out. */ + FMOD_ERR_EVENT_NOTFOUND, /* The requested event, bus or vca could not be found. */ + FMOD_ERR_STUDIO_UNINITIALIZED, /* The Studio::System object is not yet initialized. */ + FMOD_ERR_STUDIO_NOT_LOADED, /* The specified resource is not loaded, so it can't be unloaded. */ + FMOD_ERR_INVALID_STRING, /* An invalid string was passed to this function. */ + FMOD_ERR_ALREADY_LOCKED, /* The specified resource is already locked. */ + FMOD_ERR_NOT_LOCKED, /* The specified resource is not locked, so it can't be unlocked. */ + FMOD_ERR_RECORD_DISCONNECTED, /* The specified recording driver has been disconnected. */ + FMOD_ERR_TOOMANYSAMPLES, /* The length provided exceed the allowable limit. */ + + FMOD_RESULT_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_RESULT; +/*$ fmod result end $*/ + + +/* +[ENUM] +[ + [DESCRIPTION] + Used to distinguish if a FMOD_CHANNELCONTROL parameter is actually a channel or a channelgroup. + + [REMARKS] + Cast the FMOD_CHANNELCONTROL to an FMOD_CHANNEL/FMOD::Channel, or FMOD_CHANNELGROUP/FMOD::ChannelGroup if specific functionality is needed for either class. + Otherwise use as FMOD_CHANNELCONTROL/FMOD::ChannelControl and use that API. + + [SEE_ALSO] + Channel::setCallback + ChannelGroup::setCallback +] +*/ +typedef enum +{ + FMOD_CHANNELCONTROL_CHANNEL, + FMOD_CHANNELCONTROL_CHANNELGROUP, + + FMOD_CHANNELCONTROL_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_CHANNELCONTROL_TYPE; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Structure describing a point in 3D space. + + [REMARKS] + FMOD uses a left handed co-ordinate system by default.
+ To use a right handed co-ordinate system specify FMOD_INIT_3D_RIGHTHANDED from FMOD_INITFLAGS in System::init. + + [SEE_ALSO] + System::set3DListenerAttributes + System::get3DListenerAttributes + Channel::set3DAttributes + Channel::get3DAttributes + Channel::set3DCustomRolloff + Channel::get3DCustomRolloff + Sound::set3DCustomRolloff + Sound::get3DCustomRolloff + Geometry::addPolygon + Geometry::setPolygonVertex + Geometry::getPolygonVertex + Geometry::setRotation + Geometry::getRotation + Geometry::setPosition + Geometry::getPosition + Geometry::setScale + Geometry::getScale + FMOD_INITFLAGS +] +*/ +typedef struct +{ + float x; /* X co-ordinate in 3D space. */ + float y; /* Y co-ordinate in 3D space. */ + float z; /* Z co-ordinate in 3D space. */ +} FMOD_VECTOR; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Structure describing a position, velocity and orientation. + + [REMARKS] + + [SEE_ALSO] + FMOD_VECTOR + FMOD_DSP_PARAMETER_3DATTRIBUTES +] +*/ +typedef struct FMOD_3D_ATTRIBUTES +{ + FMOD_VECTOR position; + FMOD_VECTOR velocity; + FMOD_VECTOR forward; + FMOD_VECTOR up; +} FMOD_3D_ATTRIBUTES; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Structure describing a globally unique identifier. + + [REMARKS] + + [SEE_ALSO] + System::getDriverInfo +] +*/ +typedef struct +{ + unsigned int Data1; /* Specifies the first 8 hexadecimal digits of the GUID */ + unsigned short Data2; /* Specifies the first group of 4 hexadecimal digits. */ + unsigned short Data3; /* Specifies the second group of 4 hexadecimal digits. */ + unsigned char Data4[8]; /* Array of 8 bytes. The first 2 bytes contain the third group of 4 hexadecimal digits. The remaining 6 bytes contain the final 12 hexadecimal digits. */ +} FMOD_GUID; + +typedef void (F_CALLBACK *FMOD_FILE_ASYNCDONE) (FMOD_ASYNCREADINFO *info, FMOD_RESULT result); + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Structure that is passed into FMOD_FILE_ASYNCREAD_CALLBACK. Use the information in this structure to perform + + [REMARKS] + Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
+ Members marked with [w] mean the variable can be written to. The user can set the value.
+
+ Instructions: write to 'buffer', and 'bytesread' BEFORE calling 'done'.
+ As soon as done is called, FMOD will asynchronously continue internally using the data provided in this structure.
+
+ Set result in the 'done' function pointer to the result expected from a normal file read callback.
+ If the read was successful, set it to FMOD_OK.
+ If it read some data but hit the end of the file, set it to FMOD_ERR_FILE_EOF.
+ If a bad error occurred, return FMOD_ERR_FILE_BAD
+ If a disk was ejected, return FMOD_ERR_FILE_DISKEJECTED.
+ + [SEE_ALSO] + FMOD_FILE_ASYNCREAD_CALLBACK + FMOD_FILE_ASYNCCANCEL_CALLBACK + FMOD_FILE_ASYNCDONE +] +*/ +struct FMOD_ASYNCREADINFO +{ + void *handle; /* [r] The file handle that was filled out in the open callback. */ + unsigned int offset; /* [r] Seek position, make sure you read from this file offset. */ + unsigned int sizebytes; /* [r] how many bytes requested for read. */ + int priority; /* [r] 0 = low importance. 100 = extremely important (ie 'must read now or stuttering may occur') */ + + void *userdata; /* [r/w] User data pointer specific to this request. Initially 0, can be ignored or set by the user. Not related to the file's main userdata member. */ + + void *buffer; /* [w] Buffer to read file data into. */ + unsigned int bytesread; /* [w] Fill this in before setting result code to tell FMOD how many bytes were read. */ + + FMOD_FILE_ASYNCDONE done; /* [r] FMOD file system wake up function. Call this when user file read is finished. Pass result of file read as a parameter. */ +}; + + +/* +[ENUM] +[ + [DESCRIPTION] + These output types are used with System::setOutput / System::getOutput, to choose which output method to use. + + [REMARKS] + To pass information to the driver when initializing fmod use the *extradriverdata* parameter in System::init for the following reasons. + + - FMOD_OUTPUTTYPE_WAVWRITER - extradriverdata is a pointer to a char * file name that the wav writer will output to. + - FMOD_OUTPUTTYPE_WAVWRITER_NRT - extradriverdata is a pointer to a char * file name that the wav writer will output to. + - FMOD_OUTPUTTYPE_DSOUND - extradriverdata is cast to a HWND type, so that FMOD can set the focus on the audio for a particular window. + - FMOD_OUTPUTTYPE_PS3 - extradriverdata is a pointer to a FMOD_PS3_EXTRADRIVERDATA struct. This can be found in fmodps3.h. + - FMOD_OUTPUTTYPE_XBOX360 - extradriverdata is a pointer to a FMOD_360_EXTRADRIVERDATA struct. This can be found in fmodxbox360.h. + + Currently these are the only FMOD drivers that take extra information. Other unknown plugins may have different requirements. + + Note! If FMOD_OUTPUTTYPE_WAVWRITER_NRT or FMOD_OUTPUTTYPE_NOSOUND_NRT are used, and if the System::update function is being called + very quickly (ie for a non realtime decode) it may be being called too quickly for the FMOD streamer thread to respond to. + The result will be a skipping/stuttering output in the captured audio. + + To remedy this, disable the FMOD streamer thread, and use FMOD_INIT_STREAM_FROM_UPDATE to avoid skipping in the output stream, + as it will lock the mixer and the streamer together in the same thread. + + [SEE_ALSO] + System::setOutput + System::getOutput + System::init + System::update +] +*/ +typedef enum +{ + FMOD_OUTPUTTYPE_AUTODETECT, /* Picks the best output mode for the platform. This is the default. */ + + FMOD_OUTPUTTYPE_UNKNOWN, /* All - 3rd party plugin, unknown. This is for use with System::getOutput only. */ + FMOD_OUTPUTTYPE_NOSOUND, /* All - Perform all mixing but discard the final output. */ + FMOD_OUTPUTTYPE_WAVWRITER, /* All - Writes output to a .wav file. */ + FMOD_OUTPUTTYPE_NOSOUND_NRT, /* All - Non-realtime version of FMOD_OUTPUTTYPE_NOSOUND. User can drive mixer with System::update at whatever rate they want. */ + FMOD_OUTPUTTYPE_WAVWRITER_NRT, /* All - Non-realtime version of FMOD_OUTPUTTYPE_WAVWRITER. User can drive mixer with System::update at whatever rate they want. */ + + FMOD_OUTPUTTYPE_DSOUND, /* Win - Direct Sound. (Default on Windows XP and below) */ + FMOD_OUTPUTTYPE_WINMM, /* Win - Windows Multimedia. */ + FMOD_OUTPUTTYPE_WASAPI, /* Win/WinStore/XboxOne - Windows Audio Session API. (Default on Windows Vista and above, Xbox One and Windows Store Applications) */ + FMOD_OUTPUTTYPE_ASIO, /* Win - Low latency ASIO 2.0. */ + FMOD_OUTPUTTYPE_PULSEAUDIO, /* Linux - Pulse Audio. (Default on Linux if available) */ + FMOD_OUTPUTTYPE_ALSA, /* Linux - Advanced Linux Sound Architecture. (Default on Linux if PulseAudio isn't available) */ + FMOD_OUTPUTTYPE_COREAUDIO, /* Mac/iOS - Core Audio. (Default on Mac and iOS) */ + FMOD_OUTPUTTYPE_XBOX360, /* Xbox 360 - XAudio. (Default on Xbox 360) */ + FMOD_OUTPUTTYPE_PS3, /* PS3 - Audio Out. (Default on PS3) */ + FMOD_OUTPUTTYPE_AUDIOTRACK, /* Android - Java Audio Track. (Default on Android 2.2 and below) */ + FMOD_OUTPUTTYPE_OPENSL, /* Android - OpenSL ES. (Default on Android 2.3 and above) */ + FMOD_OUTPUTTYPE_WIIU, /* Wii U - AX. (Default on Wii U) */ + FMOD_OUTPUTTYPE_AUDIOOUT, /* PS4/PSVita - Audio Out. (Default on PS4 and PS Vita) */ + + FMOD_OUTPUTTYPE_MAX, /* Maximum number of output types supported. */ + FMOD_OUTPUTTYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_OUTPUTTYPE; + + +/* +[ENUM] +[ + [DESCRIPTION] + Specify the destination of log output when using the logging version of FMOD. + + [REMARKS] + TTY destination can vary depending on platform, common examples include the + Visual Studio / Xcode output window, stderr and LogCat. + + [SEE_ALSO] + FMOD_Debug_Initialize +] +*/ +typedef enum +{ + FMOD_DEBUG_MODE_TTY, /* Default log location per platform, i.e. Visual Studio output window, stderr, LogCat, etc */ + FMOD_DEBUG_MODE_FILE, /* Write log to specified file path */ + FMOD_DEBUG_MODE_CALLBACK, /* Call specified callback with log information */ + + FMOD_DEBUG_MODE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_DEBUG_MODE; + + +/* +[DEFINE] +[ + [NAME] + FMOD_DEBUG_FLAGS + + [DESCRIPTION] + Specify the requested information to be output when using the logging version of FMOD. + + [REMARKS] + + [SEE_ALSO] + FMOD_Debug_Initialize +] +*/ +#define FMOD_DEBUG_LEVEL_NONE 0x00000000 /* Disable all messages */ +#define FMOD_DEBUG_LEVEL_ERROR 0x00000001 /* Enable only error messages. */ +#define FMOD_DEBUG_LEVEL_WARNING 0x00000002 /* Enable warning and error messages. */ +#define FMOD_DEBUG_LEVEL_LOG 0x00000004 /* Enable informational, warning and error messages (default). */ +#define FMOD_DEBUG_TYPE_MEMORY 0x00000100 /* Verbose logging for memory operations, only use this if you are debugging a memory related issue. */ +#define FMOD_DEBUG_TYPE_FILE 0x00000200 /* Verbose logging for file access, only use this if you are debugging a file related issue. */ +#define FMOD_DEBUG_TYPE_CODEC 0x00000400 /* Verbose logging for codec initialization, only use this if you are debugging a codec related issue. */ +#define FMOD_DEBUG_TYPE_TRACE 0x00000800 /* Verbose logging for internal errors, use this for tracking the origin of error codes. */ +#define FMOD_DEBUG_DISPLAY_TIMESTAMPS 0x00010000 /* Display the time stamp of the log message in milliseconds. */ +#define FMOD_DEBUG_DISPLAY_LINENUMBERS 0x00020000 /* Display the source code file and line number for where the message originated. */ +#define FMOD_DEBUG_DISPLAY_THREAD 0x00040000 /* Display the thread ID of the calling function that generated the message. */ +/* [DEFINE_END] */ + + +/* +[DEFINE] +[ + [NAME] + FMOD_MEMORY_TYPE + + [DESCRIPTION] + Bit fields for memory allocation type being passed into FMOD memory callbacks. + + [REMARKS] + Remember this is a bitfield. You may get more than 1 bit set (ie physical + persistent) so do not simply switch on the types! You must check each bit individually or clear out the bits that you do not want within the callback.
+ Bits can be excluded if you want during Memory_Initialize so that you never get them. + + [SEE_ALSO] + FMOD_MEMORY_ALLOC_CALLBACK + FMOD_MEMORY_REALLOC_CALLBACK + FMOD_MEMORY_FREE_CALLBACK + Memory_Initialize +] +*/ +#define FMOD_MEMORY_NORMAL 0x00000000 /* Standard memory. */ +#define FMOD_MEMORY_STREAM_FILE 0x00000001 /* Stream file buffer, size controllable with System::setStreamBufferSize. */ +#define FMOD_MEMORY_STREAM_DECODE 0x00000002 /* Stream decode buffer, size controllable with FMOD_CREATESOUNDEXINFO::decodebuffersize. */ +#define FMOD_MEMORY_SAMPLEDATA 0x00000004 /* Sample data buffer. Raw audio data, usually PCM/MPEG/ADPCM/XMA data. */ +#define FMOD_MEMORY_DSP_BUFFER 0x00000008 /* DSP memory block allocated when more than 1 output exists on a DSP node. */ +#define FMOD_MEMORY_PLUGIN 0x00000010 /* Memory allocated by a third party plugin. */ +#define FMOD_MEMORY_XBOX360_PHYSICAL 0x00100000 /* Requires XPhysicalAlloc / XPhysicalFree. */ +#define FMOD_MEMORY_PERSISTENT 0x00200000 /* Persistent memory. Memory will be freed when System::release is called. */ +#define FMOD_MEMORY_SECONDARY 0x00400000 /* Secondary memory. Allocation should be in secondary memory. For example RSX on the PS3. */ +#define FMOD_MEMORY_ALL 0xFFFFFFFF +/* [DEFINE_END] */ + + +/* +[ENUM] +[ + [DESCRIPTION] + These are speaker types defined for use with the System::setSoftwareFormat command. + + [REMARKS] + Note below the phrase 'sound channels' is used. These are the subchannels inside a sound, they are not related and + have nothing to do with the FMOD class "Channel".
+ For example a mono sound has 1 sound channel, a stereo sound has 2 sound channels, and an AC3 or 6 channel wav file have 6 "sound channels".
+
+ FMOD_SPEAKERMODE_RAW
+ ---------------------
+ This mode is for output devices that are not specifically mono/stereo/quad/surround/5.1 or 7.1, but are multichannel.
+ Use System::setSoftwareFormat to specify the number of speakers you want to address, otherwise it will default to 2 (stereo).
+ Sound channels map to speakers sequentially, so a mono sound maps to output speaker 0, stereo sound maps to output speaker 0 & 1.
+ The user assumes knowledge of the speaker order. FMOD_SPEAKER enumerations may not apply, so raw channel indices should be used.
+ Multichannel sounds map input channels to output channels 1:1.
+ Channel::setPan and Channel::setPanLevels do not work.
+ Speaker levels must be manually set with Channel::setPanMatrix.
+
+ FMOD_SPEAKERMODE_MONO
+ ---------------------
+ This mode is for a 1 speaker arrangement.
+ Panning does not work in this speaker mode.
+ Mono, stereo and multichannel sounds have each sound channel played on the one speaker unity.
+ Mix behavior for multichannel sounds can be set with Channel::setPanMatrix.
+ Channel::setPanLevels does not work.
+
+ FMOD_SPEAKERMODE_STEREO
+ -----------------------
+ This mode is for 2 speaker arrangements that have a left and right speaker.
+

  • Mono sounds default to an even distribution between left and right. They can be panned with Channel::setPan.
    +
  • Stereo sounds default to the middle, or full left in the left speaker and full right in the right speaker. +
  • They can be cross faded with Channel::setPan.
    +
  • Multichannel sounds have each sound channel played on each speaker at unity.
    +
  • Mix behavior for multichannel sounds can be set with Channel::setPanMatrix.
    +
  • Channel::setPanLevels works but only front left and right parameters are used, the rest are ignored.
    +
    + FMOD_SPEAKERMODE_QUAD
    + ------------------------
    + This mode is for 4 speaker arrangements that have a front left, front right, surround left and a surround right speaker.
    +
  • Mono sounds default to an even distribution between front left and front right. They can be panned with Channel::setPan.
    +
  • Stereo sounds default to the left sound channel played on the front left, and the right sound channel played on the front right.
    +
  • They can be cross faded with Channel::setPan.
    +
  • Multichannel sounds default to all of their sound channels being played on each speaker in order of input.
    +
  • Mix behavior for multichannel sounds can be set with Channel::setPanMatrix.
    +
  • Channel::setPanLevels works but rear left, rear right, center and lfe are ignored.
    +
    + FMOD_SPEAKERMODE_SURROUND
    + ------------------------
    + This mode is for 5 speaker arrangements that have a left/right/center/surround left/surround right.
    +
  • Mono sounds default to the center speaker. They can be panned with Channel::setPan.
    +
  • Stereo sounds default to the left sound channel played on the front left, and the right sound channel played on the front right. +
  • They can be cross faded with Channel::setPan.
    +
  • Multichannel sounds default to all of their sound channels being played on each speaker in order of input. +
  • Mix behavior for multichannel sounds can be set with Channel::setPanMatrix.
    +
  • Channel::setPanLevels works but rear left / rear right are ignored.
    +
    + FMOD_SPEAKERMODE_5POINT1
    + ---------------------------------------------------------
    + This mode is for 5.1 speaker arrangements that have a left/right/center/surround left/surround right and a subwoofer speaker.
    +
  • Mono sounds default to the center speaker. They can be panned with Channel::setPan.
    +
  • Stereo sounds default to the left sound channel played on the front left, and the right sound channel played on the front right. +
  • They can be cross faded with Channel::setPan.
    +
  • Multichannel sounds default to all of their sound channels being played on each speaker in order of input. +
  • Mix behavior for multichannel sounds can be set with Channel::setPanMatrix.
    +
  • Channel::setPanLevels works but rear left / rear right are ignored.
    +
    + FMOD_SPEAKERMODE_7POINT1
    + ------------------------
    + This mode is for 7.1 speaker arrangements that have a left/right/center/surround left/surround right/rear left/rear right + and a subwoofer speaker.
    +
  • Mono sounds default to the center speaker. They can be panned with Channel::setPan.
    +
  • Stereo sounds default to the left sound channel played on the front left, and the right sound channel played on the front right. +
  • They can be cross faded with Channel::setPan.
    +
  • Multichannel sounds default to all of their sound channels being played on each speaker in order of input. +
  • Mix behavior for multichannel sounds can be set with Channel::setPanMatrix.
    +
  • Channel::setPanLevels works and every parameter is used to set the balance of a sound in any speaker.
    +
    + + [SEE_ALSO] + System::setSoftwareFormat + System::getSoftwareFormat + DSP::setChannelFormat +] +*/ +typedef enum +{ + FMOD_SPEAKERMODE_DEFAULT, /* Default speaker mode based on operating system/output mode. Windows = control panel setting, Xbox = 5.1, PS3 = 7.1 etc. */ + FMOD_SPEAKERMODE_RAW, /* There is no specific speakermode. Sound channels are mapped in order of input to output. Use System::setSoftwareFormat to specify speaker count. See remarks for more information. */ + FMOD_SPEAKERMODE_MONO, /* The speakers are monaural. */ + FMOD_SPEAKERMODE_STEREO, /* The speakers are stereo. */ + FMOD_SPEAKERMODE_QUAD, /* 4 speaker setup. This includes front left, front right, surround left, surround right. */ + FMOD_SPEAKERMODE_SURROUND, /* 5 speaker setup. This includes front left, front right, center, surround left, surround right. */ + FMOD_SPEAKERMODE_5POINT1, /* 5.1 speaker setup. This includes front left, front right, center, surround left, surround right and an LFE speaker. */ + FMOD_SPEAKERMODE_7POINT1, /* 7.1 speaker setup. This includes front left, front right, center, surround left, surround right, back left, back right and an LFE speaker. */ + + FMOD_SPEAKERMODE_MAX, /* Maximum number of speaker modes supported. */ + FMOD_SPEAKERMODE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_SPEAKERMODE; + + +/* +[DEFINE] +[ + [NAME] + FMOD_MAX_CHANNEL_WIDTH + + [DESCRIPTION] + The maximum number of channels per frame of audio supported by audio files, buffers, connections and DSPs.
    + + [REMARKS] + + [SEE_ALSO] + FMOD_CHANNELORDER + FMOD_CREATESOUNDEXINFO + System::setSoftwareFormat + System::getDefaultMixMatrix + ChannelControl::setMixMatrix + ChannelControl::getMixMatrix + FMOD::DSP::setChannelFormat +] +*/ +#define FMOD_MAX_CHANNEL_WIDTH 32 +/* [DEFINE_END] */ + +/* +[DEFINE] +[ + [NAME] + FMOD_MAX_LISTENERS + + [DESCRIPTION] + The maximum number of listeners supported. + + [REMARKS] + + [SEE_ALSO] + System::set3DNumListeners + System::set3DListenerAttributes + System::get3DListenerAttributes +] +*/ +#define FMOD_MAX_LISTENERS 8 +/* [DEFINE_END] */ + + +/* +[ENUM] +[ + [DESCRIPTION] + Assigns an enumeration for a speaker index. + + [REMARKS] + + [SEE_ALSO] + System::setSpeakerPosition + System::getSpeakerPosition +] +*/ +typedef enum +{ + FMOD_SPEAKER_FRONT_LEFT, + FMOD_SPEAKER_FRONT_RIGHT, + FMOD_SPEAKER_FRONT_CENTER, + FMOD_SPEAKER_LOW_FREQUENCY, + FMOD_SPEAKER_SURROUND_LEFT, + FMOD_SPEAKER_SURROUND_RIGHT, + FMOD_SPEAKER_BACK_LEFT, + FMOD_SPEAKER_BACK_RIGHT, + + FMOD_SPEAKER_MAX, /* Maximum number of speaker types supported. */ + FMOD_SPEAKER_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_SPEAKER; + + +/* +[DEFINE] +[ + [NAME] + FMOD_CHANNELMASK + + [DESCRIPTION] + These are bitfields to describe for a certain number of channels in a signal, which channels are being represented.
    + For example, a signal could be 1 channel, but contain the LFE channel only.
    + + [REMARKS] + FMOD_CHANNELMASK_BACK_CENTER is not represented as an output speaker in fmod - but it is encountered in input formats and is down or upmixed appropriately to the nearest speakers.
    + + [SEE_ALSO] + DSP::setChannelFormat + DSP::getChannelFormat + FMOD_SPEAKERMODE +] +*/ +#define FMOD_CHANNELMASK_FRONT_LEFT 0x00000001 +#define FMOD_CHANNELMASK_FRONT_RIGHT 0x00000002 +#define FMOD_CHANNELMASK_FRONT_CENTER 0x00000004 +#define FMOD_CHANNELMASK_LOW_FREQUENCY 0x00000008 +#define FMOD_CHANNELMASK_SURROUND_LEFT 0x00000010 +#define FMOD_CHANNELMASK_SURROUND_RIGHT 0x00000020 +#define FMOD_CHANNELMASK_BACK_LEFT 0x00000040 +#define FMOD_CHANNELMASK_BACK_RIGHT 0x00000080 +#define FMOD_CHANNELMASK_BACK_CENTER 0x00000100 + +#define FMOD_CHANNELMASK_MONO (FMOD_CHANNELMASK_FRONT_LEFT) +#define FMOD_CHANNELMASK_STEREO (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT) +#define FMOD_CHANNELMASK_LRC (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER) +#define FMOD_CHANNELMASK_QUAD (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT) +#define FMOD_CHANNELMASK_SURROUND (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT) +#define FMOD_CHANNELMASK_5POINT1 (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_LOW_FREQUENCY | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT) +#define FMOD_CHANNELMASK_5POINT1_REARS (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_LOW_FREQUENCY | FMOD_CHANNELMASK_BACK_LEFT | FMOD_CHANNELMASK_BACK_RIGHT) +#define FMOD_CHANNELMASK_7POINT0 (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT | FMOD_CHANNELMASK_BACK_LEFT | FMOD_CHANNELMASK_BACK_RIGHT) +#define FMOD_CHANNELMASK_7POINT1 (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_LOW_FREQUENCY | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT | FMOD_CHANNELMASK_BACK_LEFT | FMOD_CHANNELMASK_BACK_RIGHT) +/* [DEFINE_END] */ + +/* +[ENUM] +[ + [DESCRIPTION] + When creating a multichannel sound, FMOD will pan them to their default speaker locations, for example a 6 channel sound will default to one channel per 5.1 output speaker.
    + Another example is a stereo sound. It will default to left = front left, right = front right.
    +
    + This is for sounds that are not 'default'. For example you might have a sound that is 6 channels but actually made up of 3 stereo pairs, that should all be located in front left, front right only. + + [REMARKS] + + [SEE_ALSO] + FMOD_CREATESOUNDEXINFO + FMOD_MAX_CHANNEL_WIDTH +] +*/ +typedef enum FMOD_CHANNELORDER +{ + FMOD_CHANNELORDER_DEFAULT, /* Left, Right, Center, LFE, Surround Left, Surround Right, Back Left, Back Right (see FMOD_SPEAKER enumeration) */ + FMOD_CHANNELORDER_WAVEFORMAT, /* Left, Right, Center, LFE, Back Left, Back Right, Surround Left, Surround Right (as per Microsoft .wav WAVEFORMAT structure master order) */ + FMOD_CHANNELORDER_PROTOOLS, /* Left, Center, Right, Surround Left, Surround Right, LFE */ + FMOD_CHANNELORDER_ALLMONO, /* Mono, Mono, Mono, Mono, Mono, Mono, ... (each channel all the way up to FMOD_MAX_CHANNEL_WIDTH channels are treated as if they were mono) */ + FMOD_CHANNELORDER_ALLSTEREO, /* Left, Right, Left, Right, Left, Right, ... (each pair of channels is treated as stereo all the way up to FMOD_MAX_CHANNEL_WIDTH channels) */ + FMOD_CHANNELORDER_ALSA, /* Left, Right, Surround Left, Surround Right, Center, LFE (as per Linux ALSA channel order) */ + + FMOD_CHANNELORDER_MAX, /* Maximum number of channel orderings supported. */ + FMOD_CHANNELORDER_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_CHANNELORDER; + + +/* +[ENUM] +[ + [DESCRIPTION] + These are plugin types defined for use with the System::getNumPlugins, + System::getPluginInfo and System::unloadPlugin functions. + + [REMARKS] + + [SEE_ALSO] + System::getNumPlugins + System::getPluginInfo + System::unloadPlugin +] +*/ +typedef enum +{ + FMOD_PLUGINTYPE_OUTPUT, /* The plugin type is an output module. FMOD mixed audio will play through one of these devices */ + FMOD_PLUGINTYPE_CODEC, /* The plugin type is a file format codec. FMOD will use these codecs to load file formats for playback. */ + FMOD_PLUGINTYPE_DSP, /* The plugin type is a DSP unit. FMOD will use these plugins as part of its DSP network to apply effects to output or generate sound in realtime. */ + + FMOD_PLUGINTYPE_MAX, /* Maximum number of plugin types supported. */ + FMOD_PLUGINTYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_PLUGINTYPE; + + +/* +[DEFINE] +[ + [NAME] + FMOD_INITFLAGS + + [DESCRIPTION] + Initialization flags. Use them with System::init in the *flags* parameter to change various behavior. + + [REMARKS] + Use System::setAdvancedSettings to adjust settings for some of the features that are enabled by these flags. + + [SEE_ALSO] + System::init + System::update + System::setAdvancedSettings + Channel::set3DOcclusion +] +*/ +#define FMOD_INIT_NORMAL 0x00000000 /* Initialize normally */ +#define FMOD_INIT_STREAM_FROM_UPDATE 0x00000001 /* No stream thread is created internally. Streams are driven from System::update. Mainly used with non-realtime outputs. */ +#define FMOD_INIT_MIX_FROM_UPDATE 0x00000002 /* Win/PS3/Xbox 360 Only - FMOD Mixer thread is woken up to do a mix when System::update is called rather than waking periodically on its own timer. */ +#define FMOD_INIT_3D_RIGHTHANDED 0x00000004 /* FMOD will treat +X as right, +Y as up and +Z as backwards (towards you). */ +#define FMOD_INIT_CHANNEL_LOWPASS 0x00000100 /* All FMOD_3D based voices will add a software lowpass filter effect into the DSP chain which is automatically used when Channel::set3DOcclusion is used or the geometry API. This also causes sounds to sound duller when the sound goes behind the listener, as a fake HRTF style effect. Use System::setAdvancedSettings to disable or adjust cutoff frequency for this feature. */ +#define FMOD_INIT_CHANNEL_DISTANCEFILTER 0x00000200 /* All FMOD_3D based voices will add a software lowpass and highpass filter effect into the DSP chain which will act as a distance-automated bandpass filter. Use System::setAdvancedSettings to adjust the center frequency. */ +#define FMOD_INIT_PROFILE_ENABLE 0x00010000 /* Enable TCP/IP based host which allows FMOD Designer or FMOD Profiler to connect to it, and view memory, CPU and the DSP network graph in real-time. */ +#define FMOD_INIT_VOL0_BECOMES_VIRTUAL 0x00020000 /* Any sounds that are 0 volume will go virtual and not be processed except for having their positions updated virtually. Use System::setAdvancedSettings to adjust what volume besides zero to switch to virtual at. */ +#define FMOD_INIT_GEOMETRY_USECLOSEST 0x00040000 /* With the geometry engine, only process the closest polygon rather than accumulating all polygons the sound to listener line intersects. */ +#define FMOD_INIT_PREFER_DOLBY_DOWNMIX 0x00080000 /* When using FMOD_SPEAKERMODE_5POINT1 with a stereo output device, use the Dolby Pro Logic II downmix algorithm instead of the SRS Circle Surround algorithm. */ +#define FMOD_INIT_THREAD_UNSAFE 0x00100000 /* Disables thread safety for API calls. Only use this if FMOD low level is being called from a single thread, and if Studio API is not being used! */ +#define FMOD_INIT_PROFILE_METER_ALL 0x00200000 /* Slower, but adds level metering for every single DSP unit in the graph. Use DSP::setMeteringEnabled to turn meters off individually. */ +/* [DEFINE_END] */ + + +/* +[ENUM] +[ + [DESCRIPTION] + These definitions describe the type of song being played. + + [REMARKS] + + [SEE_ALSO] + Sound::getFormat +] +*/ +typedef enum +{ + FMOD_SOUND_TYPE_UNKNOWN, /* 3rd party / unknown plugin format. */ + FMOD_SOUND_TYPE_AIFF, /* AIFF. */ + FMOD_SOUND_TYPE_ASF, /* Microsoft Advanced Systems Format (ie WMA/ASF/WMV). */ + FMOD_SOUND_TYPE_DLS, /* Sound font / downloadable sound bank. */ + FMOD_SOUND_TYPE_FLAC, /* FLAC lossless codec. */ + FMOD_SOUND_TYPE_FSB, /* FMOD Sample Bank. */ + FMOD_SOUND_TYPE_IT, /* Impulse Tracker. */ + FMOD_SOUND_TYPE_MIDI, /* MIDI. */ + FMOD_SOUND_TYPE_MOD, /* Protracker / Fasttracker MOD. */ + FMOD_SOUND_TYPE_MPEG, /* MP2/MP3 MPEG. */ + FMOD_SOUND_TYPE_OGGVORBIS, /* Ogg vorbis. */ + FMOD_SOUND_TYPE_PLAYLIST, /* Information only from ASX/PLS/M3U/WAX playlists */ + FMOD_SOUND_TYPE_RAW, /* Raw PCM data. */ + FMOD_SOUND_TYPE_S3M, /* ScreamTracker 3. */ + FMOD_SOUND_TYPE_USER, /* User created sound. */ + FMOD_SOUND_TYPE_WAV, /* Microsoft WAV. */ + FMOD_SOUND_TYPE_XM, /* FastTracker 2 XM. */ + FMOD_SOUND_TYPE_XMA, /* Xbox360 XMA */ + FMOD_SOUND_TYPE_AUDIOQUEUE, /* iPhone hardware decoder, supports AAC, ALAC and MP3. */ + FMOD_SOUND_TYPE_AT9, /* PS4 / PSVita ATRAC 9 format */ + FMOD_SOUND_TYPE_VORBIS, /* Vorbis */ + FMOD_SOUND_TYPE_MEDIA_FOUNDATION,/* Windows Store Application built in system codecs */ + FMOD_SOUND_TYPE_MEDIACODEC, /* Android MediaCodec */ + FMOD_SOUND_TYPE_FADPCM, /* FMOD Adaptive Differential Pulse Code Modulation */ + + FMOD_SOUND_TYPE_MAX, /* Maximum number of sound types supported. */ + FMOD_SOUND_TYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_SOUND_TYPE; + + +/* +[ENUM] +[ + [DESCRIPTION] + These definitions describe the native format of the hardware or software buffer that will be used. + + [REMARKS] + This is the format the native hardware or software buffer will be or is created in. + + [SEE_ALSO] + System::createSound + Sound::getFormat +] +*/ +typedef enum +{ + FMOD_SOUND_FORMAT_NONE, /* Unitialized / unknown. */ + FMOD_SOUND_FORMAT_PCM8, /* 8bit integer PCM data. */ + FMOD_SOUND_FORMAT_PCM16, /* 16bit integer PCM data. */ + FMOD_SOUND_FORMAT_PCM24, /* 24bit integer PCM data. */ + FMOD_SOUND_FORMAT_PCM32, /* 32bit integer PCM data. */ + FMOD_SOUND_FORMAT_PCMFLOAT, /* 32bit floating point PCM data. */ + FMOD_SOUND_FORMAT_BITSTREAM, /* Sound data is in its native compressed format. */ + + FMOD_SOUND_FORMAT_MAX, /* Maximum number of sound formats supported. */ + FMOD_SOUND_FORMAT_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_SOUND_FORMAT; + + +/* +[DEFINE] +[ + [NAME] + FMOD_MODE + + [DESCRIPTION] + Sound description bitfields, bitwise OR them together for loading and describing sounds. + + [REMARKS] + By default a sound will open as a static sound that is decompressed fully into memory to PCM. (ie equivalent of FMOD_CREATESAMPLE)
    + To have a sound stream instead, use FMOD_CREATESTREAM, or use the wrapper function System::createStream.
    + Some opening modes (ie FMOD_OPENUSER, FMOD_OPENMEMORY, FMOD_OPENMEMORY_POINT, FMOD_OPENRAW) will need extra information.
    + This can be provided using the FMOD_CREATESOUNDEXINFO structure. +
    + Specifying FMOD_OPENMEMORY_POINT will POINT to your memory rather allocating its own sound buffers and duplicating it internally.
    + This means you cannot free the memory while FMOD is using it, until after Sound::release is called. + With FMOD_OPENMEMORY_POINT, for PCM formats, only WAV, FSB, and RAW are supported. For compressed formats, only those formats supported by FMOD_CREATECOMPRESSEDSAMPLE are supported.
    + With FMOD_OPENMEMORY_POINT and FMOD_OPENRAW or PCM, if using them together, note that you must pad the data on each side by 16 bytes. This is so fmod can modify the ends of the data for looping/interpolation/mixing purposes. If a wav file, you will need to insert silence, and then reset loop points to stop the playback from playing that silence.
    +
    + Xbox 360 memory On Xbox 360 Specifying FMOD_OPENMEMORY_POINT to a virtual memory address will cause FMOD_ERR_INVALID_ADDRESS + to be returned. Use physical memory only for this functionality.
    +
    + FMOD_LOWMEM is used on a sound if you want to minimize the memory overhead, by having FMOD not allocate memory for certain + features that are not likely to be used in a game environment. These are :
    + 1. Sound::getName functionality is removed. 256 bytes per sound is saved.
    + + [SEE_ALSO] + System::createSound + System::createStream + Sound::setMode + Sound::getMode + Channel::setMode + Channel::getMode + Sound::set3DCustomRolloff + Channel::set3DCustomRolloff + Sound::getOpenState +] +*/ +#define FMOD_DEFAULT 0x00000000 /* Default for all modes listed below. FMOD_LOOP_OFF, FMOD_2D, FMOD_3D_WORLDRELATIVE, FMOD_3D_INVERSEROLLOFF */ +#define FMOD_LOOP_OFF 0x00000001 /* For non looping sounds. (DEFAULT). Overrides FMOD_LOOP_NORMAL / FMOD_LOOP_BIDI. */ +#define FMOD_LOOP_NORMAL 0x00000002 /* For forward looping sounds. */ +#define FMOD_LOOP_BIDI 0x00000004 /* For bidirectional looping sounds. (only works on software mixed static sounds). */ +#define FMOD_2D 0x00000008 /* Ignores any 3d processing. (DEFAULT). */ +#define FMOD_3D 0x00000010 /* Makes the sound positionable in 3D. Overrides FMOD_2D. */ +#define FMOD_CREATESTREAM 0x00000080 /* Decompress at runtime, streaming from the source provided (ie from disk). Overrides FMOD_CREATESAMPLE and FMOD_CREATECOMPRESSEDSAMPLE. Note a stream can only be played once at a time due to a stream only having 1 stream buffer and file handle. Open multiple streams to have them play concurrently. */ +#define FMOD_CREATESAMPLE 0x00000100 /* Decompress at loadtime, decompressing or decoding whole file into memory as the target sample format (ie PCM). Fastest for playback and most flexible. */ +#define FMOD_CREATECOMPRESSEDSAMPLE 0x00000200 /* Load MP2/MP3/IMAADPCM/Vorbis/AT9 or XMA into memory and leave it compressed. Vorbis/AT9 encoding only supported in the FSB file format. During playback the FMOD software mixer will decode it in realtime as a 'compressed sample'. Overrides FMOD_CREATESAMPLE. If the sound data is not one of the supported formats, it will behave as if it was created with FMOD_CREATESAMPLE and decode the sound into PCM. */ +#define FMOD_OPENUSER 0x00000400 /* Opens a user created static sample or stream. Use FMOD_CREATESOUNDEXINFO to specify format and/or read callbacks. If a user created 'sample' is created with no read callback, the sample will be empty. Use Sound::lock and Sound::unlock to place sound data into the sound if this is the case. */ +#define FMOD_OPENMEMORY 0x00000800 /* "name_or_data" will be interpreted as a pointer to memory instead of filename for creating sounds. Use FMOD_CREATESOUNDEXINFO to specify length. If used with FMOD_CREATESAMPLE or FMOD_CREATECOMPRESSEDSAMPLE, FMOD duplicates the memory into its own buffers. Your own buffer can be freed after open. If used with FMOD_CREATESTREAM, FMOD will stream out of the buffer whose pointer you passed in. In this case, your own buffer should not be freed until you have finished with and released the stream.*/ +#define FMOD_OPENMEMORY_POINT 0x10000000 /* "name_or_data" will be interpreted as a pointer to memory instead of filename for creating sounds. Use FMOD_CREATESOUNDEXINFO to specify length. This differs to FMOD_OPENMEMORY in that it uses the memory as is, without duplicating the memory into its own buffers. Cannot be freed after open, only after Sound::release. Will not work if the data is compressed and FMOD_CREATECOMPRESSEDSAMPLE is not used. */ +#define FMOD_OPENRAW 0x00001000 /* Will ignore file format and treat as raw pcm. Use FMOD_CREATESOUNDEXINFO to specify format. Requires at least defaultfrequency, numchannels and format to be specified before it will open. Must be little endian data. */ +#define FMOD_OPENONLY 0x00002000 /* Just open the file, dont prebuffer or read. Good for fast opens for info, or when sound::readData is to be used. */ +#define FMOD_ACCURATETIME 0x00004000 /* For System::createSound - for accurate Sound::getLength/Channel::setPosition on VBR MP3, and MOD/S3M/XM/IT/MIDI files. Scans file first, so takes longer to open. FMOD_OPENONLY does not affect this. */ +#define FMOD_MPEGSEARCH 0x00008000 /* For corrupted / bad MP3 files. This will search all the way through the file until it hits a valid MPEG header. Normally only searches for 4k. */ +#define FMOD_NONBLOCKING 0x00010000 /* For opening sounds and getting streamed subsounds (seeking) asyncronously. Use Sound::getOpenState to poll the state of the sound as it opens or retrieves the subsound in the background. */ +#define FMOD_UNIQUE 0x00020000 /* Unique sound, can only be played one at a time */ +#define FMOD_3D_HEADRELATIVE 0x00040000 /* Make the sound's position, velocity and orientation relative to the listener. */ +#define FMOD_3D_WORLDRELATIVE 0x00080000 /* Make the sound's position, velocity and orientation absolute (relative to the world). (DEFAULT) */ +#define FMOD_3D_INVERSEROLLOFF 0x00100000 /* This sound will follow the inverse rolloff model where mindistance = full volume, maxdistance = where sound stops attenuating, and rolloff is fixed according to the global rolloff factor. (DEFAULT) */ +#define FMOD_3D_LINEARROLLOFF 0x00200000 /* This sound will follow a linear rolloff model where mindistance = full volume, maxdistance = silence. */ +#define FMOD_3D_LINEARSQUAREROLLOFF 0x00400000 /* This sound will follow a linear-square rolloff model where mindistance = full volume, maxdistance = silence. */ +#define FMOD_3D_INVERSETAPEREDROLLOFF 0x00800000 /* This sound will follow the inverse rolloff model at distances close to mindistance and a linear-square rolloff close to maxdistance. */ +#define FMOD_3D_CUSTOMROLLOFF 0x04000000 /* This sound will follow a rolloff model defined by Sound::set3DCustomRolloff / Channel::set3DCustomRolloff. */ +#define FMOD_3D_IGNOREGEOMETRY 0x40000000 /* Is not affect by geometry occlusion. If not specified in Sound::setMode, or Channel::setMode, the flag is cleared and it is affected by geometry again. */ +/* Unused 0x01000000 Used to be FMOD_UNICODE */ +#define FMOD_IGNORETAGS 0x02000000 /* Skips id3v2/asf/etc tag checks when opening a sound, to reduce seek/read overhead when opening files (helps with CD performance). */ +#define FMOD_LOWMEM 0x08000000 /* Removes some features from samples to give a lower memory overhead, like Sound::getName. See remarks. */ +#define FMOD_LOADSECONDARYRAM 0x20000000 /* Load sound into the secondary RAM of supported platform. On PS3, sounds will be loaded into RSX/VRAM. */ +#define FMOD_VIRTUAL_PLAYFROMSTART 0x80000000 /* For sounds that start virtual (due to being quiet or low importance), instead of swapping back to audible, and playing at the correct offset according to time, this flag makes the sound play from the start. */ +/* [DEFINE_END] */ + + +/* +[ENUM] +[ + [DESCRIPTION] + These values describe what state a sound is in after FMOD_NONBLOCKING has been used to open it. + + [REMARKS] + With streams, if you are using FMOD_NONBLOCKING, note that if the user calls Sound::getSubSound, a stream will go into FMOD_OPENSTATE_SEEKING state and sound related commands will return FMOD_ERR_NOTREADY.
    + With streams, if you are using FMOD_NONBLOCKING, note that if the user calls Channel::getPosition, a stream will go into FMOD_OPENSTATE_SETPOSITION state and sound related commands will return FMOD_ERR_NOTREADY.
    + + [SEE_ALSO] + Sound::getOpenState + FMOD_MODE +] +*/ +typedef enum +{ + FMOD_OPENSTATE_READY = 0, /* Opened and ready to play. */ + FMOD_OPENSTATE_LOADING, /* Initial load in progress. */ + FMOD_OPENSTATE_ERROR, /* Failed to open - file not found, out of memory etc. See return value of Sound::getOpenState for what happened. */ + FMOD_OPENSTATE_CONNECTING, /* Connecting to remote host (internet sounds only). */ + FMOD_OPENSTATE_BUFFERING, /* Buffering data. */ + FMOD_OPENSTATE_SEEKING, /* Seeking to subsound and re-flushing stream buffer. */ + FMOD_OPENSTATE_PLAYING, /* Ready and playing, but not possible to release at this time without stalling the main thread. */ + FMOD_OPENSTATE_SETPOSITION, /* Seeking within a stream to a different position. */ + + FMOD_OPENSTATE_MAX, /* Maximum number of open state types. */ + FMOD_OPENSTATE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_OPENSTATE; + + +/* +[ENUM] +[ + [DESCRIPTION] + These values are used with SoundGroup::setMaxAudibleBehavior to determine what happens when more sounds + are played than are specified with SoundGroup::setMaxAudible. + + [REMARKS] + When using FMOD_SOUNDGROUP_BEHAVIOR_MUTE, SoundGroup::setMuteFadeSpeed can be used to stop a sudden transition. + Instead, the time specified will be used to cross fade between the sounds that go silent and the ones that become audible. + + [SEE_ALSO] + SoundGroup::setMaxAudibleBehavior + SoundGroup::getMaxAudibleBehavior + SoundGroup::setMaxAudible + SoundGroup::getMaxAudible + SoundGroup::setMuteFadeSpeed + SoundGroup::getMuteFadeSpeed +] +*/ +typedef enum +{ + FMOD_SOUNDGROUP_BEHAVIOR_FAIL, /* Any sound played that puts the sound count over the SoundGroup::setMaxAudible setting, will simply fail during System::playSound. */ + FMOD_SOUNDGROUP_BEHAVIOR_MUTE, /* Any sound played that puts the sound count over the SoundGroup::setMaxAudible setting, will be silent, then if another sound in the group stops the sound that was silent before becomes audible again. */ + FMOD_SOUNDGROUP_BEHAVIOR_STEALLOWEST, /* Any sound played that puts the sound count over the SoundGroup::setMaxAudible setting, will steal the quietest / least important sound playing in the group. */ + + FMOD_SOUNDGROUP_BEHAVIOR_MAX, /* Maximum number of sound group behaviors. */ + FMOD_SOUNDGROUP_BEHAVIOR_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_SOUNDGROUP_BEHAVIOR; + + +/* +[ENUM] +[ + [DESCRIPTION] + These callback types are used with Channel::setCallback. + + [REMARKS] + Each callback has commanddata parameters passed as int unique to the type of callback.
    + See reference to FMOD_CHANNELCONTROL_CALLBACK to determine what they might mean for each type of callback.
    +
    + Note! Currently the user must call System::update for these callbacks to trigger! + + [SEE_ALSO] + Channel::setCallback + ChannelGroup::setCallback + FMOD_CHANNELCONTROL_CALLBACK + System::update +] +*/ +typedef enum +{ + FMOD_CHANNELCONTROL_CALLBACK_END, /* Called when a sound ends. */ + FMOD_CHANNELCONTROL_CALLBACK_VIRTUALVOICE, /* Called when a voice is swapped out or swapped in. */ + FMOD_CHANNELCONTROL_CALLBACK_SYNCPOINT, /* Called when a syncpoint is encountered. Can be from wav file markers. */ + FMOD_CHANNELCONTROL_CALLBACK_OCCLUSION, /* Called when the channel has its geometry occlusion value calculated. Can be used to clamp or change the value. */ + + FMOD_CHANNELCONTROL_CALLBACK_MAX, /* Maximum number of callback types supported. */ + FMOD_CHANNELCONTROL_CALLBACK_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_CHANNELCONTROL_CALLBACK_TYPE; + + +/* +[ENUM] +[ + [DESCRIPTION] + These enums denote special types of node within a DSP chain. + + [REMARKS] + + [SEE_ALSO] + Channel::getDSP + ChannelGroup::getDSP + ChannelControl::getNumDSPs +] +*/ +typedef enum +{ + FMOD_CHANNELCONTROL_DSP_HEAD = -1, /* Head of the DSP chain. Equivalent of index 0. */ + FMOD_CHANNELCONTROL_DSP_FADER = -2, /* Built in fader DSP. */ + FMOD_CHANNELCONTROL_DSP_PANNER = -3, /* Built in panner DSP. */ + FMOD_CHANNELCONTROL_DSP_TAIL = -4, /* Tail of the DSP chain. Equivalent of the number of dsps minus 1. */ + + FMOD_CHANNELCONTROL_DSP_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_CHANNELCONTROL_DSP_INDEX; + +/* +[ENUM] +[ + [DESCRIPTION] + Used to distinguish the instance type passed into FMOD_ERROR_CALLBACK. + + [REMARKS] + Cast the instance of FMOD_ERROR_CALLBACK to the appropriate class indicated by this enum. + + [SEE_ALSO] +] +*/ +typedef enum +{ + FMOD_ERRORCALLBACK_INSTANCETYPE_NONE, + FMOD_ERRORCALLBACK_INSTANCETYPE_SYSTEM, + FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNEL, + FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNELGROUP, + FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNELCONTROL, + FMOD_ERRORCALLBACK_INSTANCETYPE_SOUND, + FMOD_ERRORCALLBACK_INSTANCETYPE_SOUNDGROUP, + FMOD_ERRORCALLBACK_INSTANCETYPE_DSP, + FMOD_ERRORCALLBACK_INSTANCETYPE_DSPCONNECTION, + FMOD_ERRORCALLBACK_INSTANCETYPE_GEOMETRY, + FMOD_ERRORCALLBACK_INSTANCETYPE_REVERB3D, + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_SYSTEM, + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_EVENTDESCRIPTION, + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_EVENTINSTANCE, + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_PARAMETERINSTANCE, + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_CUEINSTANCE, + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_BUS, + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_VCA, + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_BANK, + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_COMMANDREPLAY, + + FMOD_ERRORCALLBACK_INSTANCETYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_ERRORCALLBACK_INSTANCETYPE; + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Structure that is passed into FMOD_SYSTEM_CALLBACK for the FMOD_SYSTEM_CALLBACK_ERROR callback type. + + [REMARKS] + The instance pointer will be a type corresponding to the instanceType enum. + + [SEE_ALSO] + FMOD_ERRORCALLBACK_INSTANCETYPE +] +*/ +typedef struct +{ + FMOD_RESULT result; /* Error code result */ + FMOD_ERRORCALLBACK_INSTANCETYPE instancetype; /* Type of instance the error occurred on */ + void *instance; /* Instance pointer */ + const char *functionname; /* Function that the error occurred on */ + const char *functionparams; /* Function parameters that the error ocurred on */ +} FMOD_ERRORCALLBACK_INFO; + +/* +[DEFINE] +[ + [NAME] + FMOD_SYSTEM_CALLBACK_TYPE + + [DESCRIPTION] + These callback types are used with System::setCallback. + + [REMARKS] + Each callback has commanddata parameters passed as void* unique to the type of callback.
    + See reference to FMOD_SYSTEM_CALLBACK to determine what they might mean for each type of callback.
    +
    + Note! Using FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED (Windows only) will disable any automated device ejection/insertion handling by FMOD. Use this callback to control the behaviour yourself.
    +
    + Note! Using FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED (on Mac only) requires the application to be running an event loop which will allow external changes to device list to be detected by FMOD.
    +
    + Note! The 'system' object pointer will be null for FMOD_SYSTEM_CALLBACK_MEMORYALLOCATIONFAILED callback. + + [SEE_ALSO] + System::setCallback + System::update + DSP::addInput +] +*/ +#define FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED 0x00000001 /* Called from System::update when the enumerated list of devices has changed. */ +#define FMOD_SYSTEM_CALLBACK_DEVICELOST 0x00000002 /* Called from System::update when an output device has been lost due to control panel parameter changes and FMOD cannot automatically recover. */ +#define FMOD_SYSTEM_CALLBACK_MEMORYALLOCATIONFAILED 0x00000004 /* Called directly when a memory allocation fails somewhere in FMOD. (NOTE - 'system' will be NULL in this callback type.)*/ +#define FMOD_SYSTEM_CALLBACK_THREADCREATED 0x00000008 /* Called directly when a thread is created. */ +#define FMOD_SYSTEM_CALLBACK_BADDSPCONNECTION 0x00000010 /* Called when a bad connection was made with DSP::addInput. Usually called from mixer thread because that is where the connections are made. */ +#define FMOD_SYSTEM_CALLBACK_PREMIX 0x00000020 /* Called each tick before a mix update happens. */ +#define FMOD_SYSTEM_CALLBACK_POSTMIX 0x00000040 /* Called each tick after a mix update happens. */ +#define FMOD_SYSTEM_CALLBACK_ERROR 0x00000080 /* Called when each API function returns an error code, including delayed async functions. */ +#define FMOD_SYSTEM_CALLBACK_MIDMIX 0x00000100 /* Called each tick in mix update after clocks have been updated before the main mix occurs. */ +#define FMOD_SYSTEM_CALLBACK_THREADDESTROYED 0x00000200 /* Called directly when a thread is destroyed. */ +#define FMOD_SYSTEM_CALLBACK_PREUPDATE 0x00000400 /* Called at start of System::update function. */ +#define FMOD_SYSTEM_CALLBACK_POSTUPDATE 0x00000800 /* Called at end of System::update function. */ +#define FMOD_SYSTEM_CALLBACK_RECORDLISTCHANGED 0x00001000 /* Called from System::update when the enumerated list of recording devices has changed. */ +#define FMOD_SYSTEM_CALLBACK_ALL 0xFFFFFFFF /* Pass this mask to System::setCallback to receive all callback types. */ + +/* [DEFINE_END] */ + + +/* + FMOD Callbacks +*/ +typedef FMOD_RESULT (F_CALLBACK *FMOD_DEBUG_CALLBACK) (FMOD_DEBUG_FLAGS flags, const char *file, int line, const char *func, const char *message); + +typedef FMOD_RESULT (F_CALLBACK *FMOD_SYSTEM_CALLBACK) (FMOD_SYSTEM *system, FMOD_SYSTEM_CALLBACK_TYPE type, void *commanddata1, void *commanddata2, void *userdata); + +typedef FMOD_RESULT (F_CALLBACK *FMOD_CHANNELCONTROL_CALLBACK) (FMOD_CHANNELCONTROL *channelcontrol, FMOD_CHANNELCONTROL_TYPE controltype, FMOD_CHANNELCONTROL_CALLBACK_TYPE callbacktype, void *commanddata1, void *commanddata2); + +typedef FMOD_RESULT (F_CALLBACK *FMOD_SOUND_NONBLOCK_CALLBACK) (FMOD_SOUND *sound, FMOD_RESULT result); +typedef FMOD_RESULT (F_CALLBACK *FMOD_SOUND_PCMREAD_CALLBACK) (FMOD_SOUND *sound, void *data, unsigned int datalen); +typedef FMOD_RESULT (F_CALLBACK *FMOD_SOUND_PCMSETPOS_CALLBACK) (FMOD_SOUND *sound, int subsound, unsigned int position, FMOD_TIMEUNIT postype); + +typedef FMOD_RESULT (F_CALLBACK *FMOD_FILE_OPEN_CALLBACK) (const char *name, unsigned int *filesize, void **handle, void *userdata); +typedef FMOD_RESULT (F_CALLBACK *FMOD_FILE_CLOSE_CALLBACK) (void *handle, void *userdata); +typedef FMOD_RESULT (F_CALLBACK *FMOD_FILE_READ_CALLBACK) (void *handle, void *buffer, unsigned int sizebytes, unsigned int *bytesread, void *userdata); +typedef FMOD_RESULT (F_CALLBACK *FMOD_FILE_SEEK_CALLBACK) (void *handle, unsigned int pos, void *userdata); +typedef FMOD_RESULT (F_CALLBACK *FMOD_FILE_ASYNCREAD_CALLBACK) (FMOD_ASYNCREADINFO *info, void *userdata); +typedef FMOD_RESULT (F_CALLBACK *FMOD_FILE_ASYNCCANCEL_CALLBACK)(FMOD_ASYNCREADINFO *info, void *userdata); + +typedef void * (F_CALLBACK *FMOD_MEMORY_ALLOC_CALLBACK) (unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr); +typedef void * (F_CALLBACK *FMOD_MEMORY_REALLOC_CALLBACK) (void *ptr, unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr); +typedef void (F_CALLBACK *FMOD_MEMORY_FREE_CALLBACK) (void *ptr, FMOD_MEMORY_TYPE type, const char *sourcestr); + +typedef float (F_CALLBACK *FMOD_3D_ROLLOFF_CALLBACK) (FMOD_CHANNELCONTROL *channelcontrol, float distance); + + + + +/* +[ENUM] +[ + [DESCRIPTION] + List of interpolation types that the FMOD Studio software mixer supports. + + [REMARKS] + The default resampler type is FMOD_DSP_RESAMPLER_LINEAR.
    + Use System::setAdvancedSettings and the resamplerMethod member to tell FMOD the resampling quality you require for sample rate conversion during sound playback. + + [SEE_ALSO] + System::setAdvancedSettings + System::setAdvancedSettings + FMOD_ADVANCEDSETINGS +] +*/ +typedef enum +{ + FMOD_DSP_RESAMPLER_DEFAULT, /* Default interpolation method. Currently equal to FMOD_DSP_RESAMPLER_LINEAR. */ + FMOD_DSP_RESAMPLER_NOINTERP, /* No interpolation. High frequency aliasing hiss will be audible depending on the sample rate of the sound. */ + FMOD_DSP_RESAMPLER_LINEAR, /* Linear interpolation (default method). Fast and good quality, causes very slight lowpass effect on low frequency sounds. */ + FMOD_DSP_RESAMPLER_CUBIC, /* Cubic interpolation. Slower than linear interpolation but better quality. */ + FMOD_DSP_RESAMPLER_SPLINE, /* 5 point spline interpolation. Slowest resampling method but best quality. */ + + FMOD_DSP_RESAMPLER_MAX, /* Maximum number of resample methods supported. */ + FMOD_DSP_RESAMPLER_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_DSP_RESAMPLER; + + +/* +[ENUM] +[ + [DESCRIPTION] + List of connection types between 2 DSP nodes. + + [REMARKS] + FMOD_DSP_CONNECTION_TYPE_STANDARD
    + ----------------------------------
    + Default DSPConnection type. Audio is mixed from the input to the output DSP's audible buffer, meaning it will be part of the audible signal. A standard connection will execute its input DSP if it has not been executed before.
    +
    + FMOD_DSP_CONNECTION_TYPE_SIDECHAIN
    + ----------------------------------
    + Sidechain DSPConnection type. Audio is mixed from the input to the output DSP's sidechain buffer, meaning it will NOT be part of the audible signal. A sidechain connection will execute its input DSP if it has not been executed before.
    + The purpose of the seperate sidechain buffer in a DSP, is so that the DSP effect can privately access for analysis purposes. An example of use in this case, could be a compressor which analyzes the signal, to control its own effect parameters (ie a compression level or gain).
    +
    + For the effect developer, to accept sidechain data, the sidechain data will appear in the FMOD_DSP_STATE struct which is passed into the read callback of a DSP unit.
    + FMOD_DSP_STATE::sidechaindata and FMOD_DSP::sidechainchannels will hold the mixed result of any sidechain data flowing into it.
    +
    + FMOD_DSP_CONNECTION_TYPE_SEND
    + -----------------------------
    + Send DSPConnection type. Audio is mixed from the input to the output DSP's audible buffer, meaning it will be part of the audible signal. A send connection will NOT execute its input DSP if it has not been executed before.
    + A send connection will only read what exists at the input's buffer at the time of executing the output DSP unit (which can be considered the 'return')
    +
    + FMOD_DSP_CONNECTION_TYPE_SEND_SIDECHAIN
    + ---------------------------------------
    + Send sidechain DSPConnection type. Audio is mixed from the input to the output DSP's sidechain buffer, meaning it will NOT be part of the audible signal. A send sidechain connection will NOT execute its input DSP if it has not been executed before.
    + A send sidechain connection will only read what exists at the input's buffer at the time of executing the output DSP unit (which can be considered the 'sidechain return'). +
    + For the effect developer, to accept sidechain data, the sidechain data will appear in the FMOD_DSP_STATE struct which is passed into the read callback of a DSP unit.
    + FMOD_DSP_STATE::sidechaindata and FMOD_DSP::sidechainchannels will hold the mixed result of any sidechain data flowing into it. + + [SEE_ALSO] + DSP::addInput + DSPConnection::getType +] +*/ +typedef enum +{ + FMOD_DSPCONNECTION_TYPE_STANDARD, /* Default connection type. Audio is mixed from the input to the output DSP's audible buffer. */ + FMOD_DSPCONNECTION_TYPE_SIDECHAIN, /* Sidechain connection type. Audio is mixed from the input to the output DSP's sidechain buffer. */ + FMOD_DSPCONNECTION_TYPE_SEND, /* Send connection type. Audio is mixed from the input to the output DSP's audible buffer, but the input is NOT executed, only copied from. A standard connection or sidechain needs to make an input execute to generate data. */ + FMOD_DSPCONNECTION_TYPE_SEND_SIDECHAIN, /* Send sidechain connection type. Audio is mixed from the input to the output DSP's sidechain buffer, but the input is NOT executed, only copied from. A standard connection or sidechain needs to make an input execute to generate data. */ + + FMOD_DSPCONNECTION_TYPE_MAX, /* Maximum number of DSP connection types supported. */ + FMOD_DSPCONNECTION_TYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_DSPCONNECTION_TYPE; + + +/* +[ENUM] +[ + [DESCRIPTION] + List of tag types that could be stored within a sound. These include id3 tags, metadata from netstreams and vorbis/asf data. + + [REMARKS] + + [SEE_ALSO] + Sound::getTag +] +*/ +typedef enum +{ + FMOD_TAGTYPE_UNKNOWN = 0, + FMOD_TAGTYPE_ID3V1, + FMOD_TAGTYPE_ID3V2, + FMOD_TAGTYPE_VORBISCOMMENT, + FMOD_TAGTYPE_SHOUTCAST, + FMOD_TAGTYPE_ICECAST, + FMOD_TAGTYPE_ASF, + FMOD_TAGTYPE_MIDI, + FMOD_TAGTYPE_PLAYLIST, + FMOD_TAGTYPE_FMOD, + FMOD_TAGTYPE_USER, + + FMOD_TAGTYPE_MAX, /* Maximum number of tag types supported. */ + FMOD_TAGTYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_TAGTYPE; + + +/* +[ENUM] +[ + [DESCRIPTION] + List of data types that can be returned by Sound::getTag + + [REMARKS] + + [SEE_ALSO] + Sound::getTag +] +*/ +typedef enum +{ + FMOD_TAGDATATYPE_BINARY = 0, + FMOD_TAGDATATYPE_INT, + FMOD_TAGDATATYPE_FLOAT, + FMOD_TAGDATATYPE_STRING, + FMOD_TAGDATATYPE_STRING_UTF16, + FMOD_TAGDATATYPE_STRING_UTF16BE, + FMOD_TAGDATATYPE_STRING_UTF8, + FMOD_TAGDATATYPE_CDTOC, + + FMOD_TAGDATATYPE_MAX, /* Maximum number of tag datatypes supported. */ + FMOD_TAGDATATYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_TAGDATATYPE; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Structure describing a piece of tag data. + + [REMARKS] + Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
    + Members marked with [w] mean the variable can be written to. The user can set the value.
    + + [SEE_ALSO] + Sound::getTag + FMOD_TAGTYPE + FMOD_TAGDATATYPE +] +*/ +typedef struct FMOD_TAG +{ + FMOD_TAGTYPE type; /* [r] The type of this tag. */ + FMOD_TAGDATATYPE datatype; /* [r] The type of data that this tag contains */ + char *name; /* [r] The name of this tag i.e. "TITLE", "ARTIST" etc. */ + void *data; /* [r] Pointer to the tag data - its format is determined by the datatype member */ + unsigned int datalen; /* [r] Length of the data contained in this tag */ + FMOD_BOOL updated; /* [r] True if this tag has been updated since last being accessed with Sound::getTag */ +} FMOD_TAG; + + +/* +[DEFINE] +[ + [NAME] + FMOD_TIMEUNIT + + [DESCRIPTION] + List of time types that can be returned by Sound::getLength and used with Channel::setPosition or Channel::getPosition. + + [REMARKS] + Do not combine flags except FMOD_TIMEUNIT_BUFFERED. + + [SEE_ALSO] + Sound::getLength + Channel::setPosition + Channel::getPosition +] +*/ +#define FMOD_TIMEUNIT_MS 0x00000001 /* Milliseconds. */ +#define FMOD_TIMEUNIT_PCM 0x00000002 /* PCM samples, related to milliseconds * samplerate / 1000. */ +#define FMOD_TIMEUNIT_PCMBYTES 0x00000004 /* Bytes, related to PCM samples * channels * datawidth (ie 16bit = 2 bytes). */ +#define FMOD_TIMEUNIT_RAWBYTES 0x00000008 /* Raw file bytes of (compressed) sound data (does not include headers). Only used by Sound::getLength and Channel::getPosition. */ +#define FMOD_TIMEUNIT_PCMFRACTION 0x00000010 /* Fractions of 1 PCM sample. Unsigned int range 0 to 0xFFFFFFFF. Used for sub-sample granularity for DSP purposes. */ +#define FMOD_TIMEUNIT_MODORDER 0x00000100 /* MOD/S3M/XM/IT. Order in a sequenced module format. Use Sound::getFormat to determine the PCM format being decoded to. */ +#define FMOD_TIMEUNIT_MODROW 0x00000200 /* MOD/S3M/XM/IT. Current row in a sequenced module format. Sound::getLength will return the number of rows in the currently playing or seeked to pattern. */ +#define FMOD_TIMEUNIT_MODPATTERN 0x00000400 /* MOD/S3M/XM/IT. Current pattern in a sequenced module format. Sound::getLength will return the number of patterns in the song and Channel::getPosition will return the currently playing pattern. */ +#define FMOD_TIMEUNIT_BUFFERED 0x10000000 /* Time value as seen by buffered stream. This is always ahead of audible time, and is only used for processing. */ +/* [DEFINE_END] */ + +/* +[DEFINE] +[ + [NAME] + FMOD_PORT_INDEX + + [DESCRIPTION] + + [REMARKS] + + [SEE_ALSO] + System::AttachChannelGroupToPort +] +*/ +#define FMOD_PORT_INDEX_NONE -1ull /* Use when a port index is not required */ +/* [DEFINE_END] */ + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Use this structure with System::createSound when more control is needed over loading. + The possible reasons to use this with System::createSound are: + + - Loading a file from memory. + - Loading a file from within another larger (possibly wad/pak) file, by giving the loader an offset and length. + - To create a user created / non file based sound. + - To specify a starting subsound to seek to within a multi-sample sounds (ie FSB/DLS) when created as a stream. + - To specify which subsounds to load for multi-sample sounds (ie FSB/DLS) so that memory is saved and only a subset is actually loaded/read from disk. + - To specify 'piggyback' read and seek callbacks for capture of sound data as fmod reads and decodes it. Useful for ripping decoded PCM data from sounds as they are loaded / played. + - To specify a MIDI DLS sample set file to load when opening a MIDI file. + + See below on what members to fill for each of the above types of sound you want to create. + + [REMARKS] + This structure is optional! Specify 0 or NULL in System::createSound if you don't need it! + + Loading a file from memory. + + - Create the sound using the FMOD_OPENMEMORY flag. + - Mandatory. Specify 'length' for the size of the memory block in bytes. + - Other flags are optional. + + Loading a file from within another larger (possibly wad/pak) file, by giving the loader an offset and length. + + - Mandatory. Specify 'fileoffset' and 'length'. + - Other flags are optional. + + To create a user created / non file based sound. + + - Create the sound using the FMOD_OPENUSER flag. + - Mandatory. Specify 'defaultfrequency, 'numchannels' and 'format'. + - Other flags are optional. + + To specify a starting subsound to seek to and flush with, within a multi-sample stream (ie FSB/DLS). + + - Mandatory. Specify 'initialsubsound'. + + To specify which subsounds to load for multi-sample sounds (ie FSB/DLS) so that memory is saved and only a subset is actually loaded/read from disk. + + - Mandatory. Specify 'inclusionlist' and 'inclusionlistnum'. + + To specify 'piggyback' read and seek callbacks for capture of sound data as fmod reads and decodes it. Useful for ripping decoded PCM data from sounds as they are loaded / played. + + - Mandatory. Specify 'pcmreadcallback' and 'pcmseekcallback'. + + To specify a MIDI DLS sample set file to load when opening a MIDI file. + + - Mandatory. Specify 'dlsname'. + + Setting the 'decodebuffersize' is for cpu intensive codecs that may be causing stuttering, not file intensive codecs (ie those from CD or netstreams) which are normally + altered with System::setStreamBufferSize. As an example of cpu intensive codecs, an mp3 file will take more cpu to decode than a PCM wav file. + + If you have a stuttering effect, then it is using more cpu than the decode buffer playback rate can keep up with. Increasing the decode buffersize will most likely solve this problem. + + FSB codec. If inclusionlist and numsubsounds are used together, this will trigger a special mode where subsounds are shuffled down to save memory. (useful for large FSB + files where you only want to load 1 sound). There will be no gaps, ie no null subsounds. As an example, if there are 10,000 subsounds and there is an inclusionlist with only 1 entry, + and numsubsounds = 1, then subsound 0 will be that entry, and there will only be the memory allocated for 1 subsound. Previously there would still be 10,000 subsound pointers and other + associated codec entries allocated along with it multiplied by 10,000. + + Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
    + Members marked with [w] mean the variable can be written to. The user can set the value. + + [SEE_ALSO] + System::createSound + System::setStreamBufferSize + FMOD_MODE + FMOD_SOUND_FORMAT + FMOD_SOUND_TYPE + FMOD_CHANNELMASK + FMOD_CHANNELORDER + FMOD_MAX_CHANNEL_WIDTH +] +*/ +typedef struct FMOD_CREATESOUNDEXINFO +{ + int cbsize; /* [w] Size of this structure. This is used so the structure can be expanded in the future and still work on older versions of FMOD Studio. */ + unsigned int length; /* [w] Optional. Specify 0 to ignore. Number of bytes to load starting at 'fileoffset', or size of sound to create (if FMOD_OPENUSER is used). Required if loading from memory. If 0 is specified, then it will use the size of the file (unless loading from memory then an error will be returned). */ + unsigned int fileoffset; /* [w] Optional. Specify 0 to ignore. Offset from start of the file to start loading from. This is useful for loading files from inside big data files. */ + int numchannels; /* [w] Optional. Specify 0 to ignore. Number of channels in a sound mandatory if FMOD_OPENUSER or FMOD_OPENRAW is used. Can be specified up to FMOD_MAX_CHANNEL_WIDTH. */ + int defaultfrequency; /* [w] Optional. Specify 0 to ignore. Default frequency of sound in Hz, mandatory if FMOD_OPENUSER or FMOD_OPENRAW is used. Other formats use the frequency determined by the file format. */ + FMOD_SOUND_FORMAT format; /* [w] Optional. Specify 0 or FMOD_SOUND_FORMAT_NONE to ignore. Format of the sound, mandatory if FMOD_OPENUSER or FMOD_OPENRAW is used. Other formats use the format determined by the file format. */ + unsigned int decodebuffersize; /* [w] Optional. Specify 0 to ignore. For streams. This determines the size of the double buffer (in PCM samples) that a stream uses. Use this for user created streams if you want to determine the size of the callback buffer passed to you. Specify 0 to use FMOD's default size which is currently equivalent to 400ms of the sound format created/loaded. */ + int initialsubsound; /* [w] Optional. Specify 0 to ignore. In a multi-sample file format such as .FSB/.DLS, specify the initial subsound to seek to, only if FMOD_CREATESTREAM is used. */ + int numsubsounds; /* [w] Optional. Specify 0 to ignore or have no subsounds. In a sound created with FMOD_OPENUSER, specify the number of subsounds that are accessable with Sound::getSubSound. If not created with FMOD_OPENUSER, this will limit the number of subsounds loaded within a multi-subsound file. If using FSB, then if FMOD_CREATESOUNDEXINFO::inclusionlist is used, this will shuffle subsounds down so that there are not any gaps. It will mean that the indices of the sounds will be different. */ + int *inclusionlist; /* [w] Optional. Specify 0 to ignore. In a multi-sample format such as .FSB/.DLS it may be desirable to specify only a subset of sounds to be loaded out of the whole file. This is an array of subsound indices to load into memory when created. */ + int inclusionlistnum; /* [w] Optional. Specify 0 to ignore. This is the number of integers contained within the inclusionlist array. */ + FMOD_SOUND_PCMREAD_CALLBACK pcmreadcallback; /* [w] Optional. Specify 0 to ignore. Callback to 'piggyback' on FMOD's read functions and accept or even write PCM data while FMOD is opening the sound. Used for user sounds created with FMOD_OPENUSER or for capturing decoded data as FMOD reads it. */ + FMOD_SOUND_PCMSETPOS_CALLBACK pcmsetposcallback; /* [w] Optional. Specify 0 to ignore. Callback for when the user calls a seeking function such as Channel::setTime or Channel::setPosition within a multi-sample sound, and for when it is opened.*/ + FMOD_SOUND_NONBLOCK_CALLBACK nonblockcallback; /* [w] Optional. Specify 0 to ignore. Callback for successful completion, or error while loading a sound that used the FMOD_NONBLOCKING flag. Also called duing seeking, when setPosition is called or a stream is restarted. */ + const char *dlsname; /* [w] Optional. Specify 0 to ignore. Filename for a DLS sample set when loading a MIDI file. If not specified, on Windows it will attempt to open /windows/system32/drivers/gm.dls or /windows/system32/drivers/etc/gm.dls, on Mac it will attempt to load /System/Library/Components/CoreAudio.component/Contents/Resources/gs_instruments.dls, otherwise the MIDI will fail to open. Current DLS support is for level 1 of the specification. */ + const char *encryptionkey; /* [w] Optional. Specify 0 to ignore. Key for encrypted FSB file. Without this key an encrypted FSB file will not load. */ + int maxpolyphony; /* [w] Optional. Specify 0 to ignore. For sequenced formats with dynamic channel allocation such as .MID and .IT, this specifies the maximum voice count allowed while playing. .IT defaults to 64. .MID defaults to 32. */ + void *userdata; /* [w] Optional. Specify 0 to ignore. This is user data to be attached to the sound during creation. Access via Sound::getUserData. Note: This is not passed to FMOD_FILE_OPEN_CALLBACK - use fileuserdata for that. */ + FMOD_SOUND_TYPE suggestedsoundtype; /* [w] Optional. Specify 0 or FMOD_SOUND_TYPE_UNKNOWN to ignore. Instead of scanning all codec types, use this to speed up loading by making it jump straight to this codec. */ + FMOD_FILE_OPEN_CALLBACK fileuseropen; /* [w] Optional. Specify 0 to ignore. Callback for opening this file. */ + FMOD_FILE_CLOSE_CALLBACK fileuserclose; /* [w] Optional. Specify 0 to ignore. Callback for closing this file. */ + FMOD_FILE_READ_CALLBACK fileuserread; /* [w] Optional. Specify 0 to ignore. Callback for reading from this file. */ + FMOD_FILE_SEEK_CALLBACK fileuserseek; /* [w] Optional. Specify 0 to ignore. Callback for seeking within this file. */ + FMOD_FILE_ASYNCREAD_CALLBACK fileuserasyncread; /* [w] Optional. Specify 0 to ignore. Callback for seeking within this file. */ + FMOD_FILE_ASYNCCANCEL_CALLBACK fileuserasynccancel;/* [w] Optional. Specify 0 to ignore. Callback for seeking within this file. */ + void *fileuserdata; /* [w] Optional. Specify 0 to ignore. User data to be passed into the file callbacks. */ + FMOD_CHANNELORDER channelorder; /* [w] Optional. Specify 0 to ignore. Use this to differ the way fmod maps multichannel sounds to speakers. See FMOD_CHANNELORDER for more. */ + FMOD_CHANNELMASK channelmask; /* [w] Optional. Specify 0 to ignore. Use this to specify which channels map to which speakers. See FMOD_CHANNELMASK for more. */ + FMOD_SOUNDGROUP *initialsoundgroup; /* [w] Optional. Specify 0 to ignore. Specify a sound group if required, to put sound in as it is created. */ + unsigned int initialseekposition;/* [w] Optional. Specify 0 to ignore. For streams. Specify an initial position to seek the stream to. */ + FMOD_TIMEUNIT initialseekpostype; /* [w] Optional. Specify 0 to ignore. For streams. Specify the time unit for the position set in initialseekposition. */ + int ignoresetfilesystem;/* [w] Optional. Specify 0 to ignore. Set to 1 to use fmod's built in file system. Ignores setFileSystem callbacks and also FMOD_CREATESOUNEXINFO file callbacks. Useful for specific cases where you don't want to use your own file system but want to use fmod's file system (ie net streaming). */ + unsigned int audioqueuepolicy; /* [w] Optional. Specify 0 or FMOD_AUDIOQUEUE_CODECPOLICY_DEFAULT to ignore. Policy used to determine whether hardware or software is used for decoding, see FMOD_AUDIOQUEUE_CODECPOLICY for options (iOS >= 3.0 required, otherwise only hardware is available) */ + unsigned int minmidigranularity; /* [w] Optional. Specify 0 to ignore. Allows you to set a minimum desired MIDI mixer granularity. Values smaller than 512 give greater than default accuracy at the cost of more CPU and vice versa. Specify 0 for default (512 samples). */ + int nonblockthreadid; /* [w] Optional. Specify 0 to ignore. Specifies a thread index to execute non blocking load on. Allows for up to 5 threads to be used for loading at once. This is to avoid one load blocking another. Maximum value = 4. */ +} FMOD_CREATESOUNDEXINFO; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Structure defining a reverb environment.
    + + [REMARKS] + Note the default reverb properties are the same as the FMOD_PRESET_GENERIC preset.
    + Note that integer values that typically range from -10,000 to 1000 are represented in decibels, + and are of a logarithmic scale, not linear, wheras float values are always linear.
    +
    + The numerical values listed below are the maximum, minimum and default values for each variable respectively.
    +
    + Hardware voice / Platform Specific reverb support.
    + WII See FMODWII.H for hardware specific reverb functionality.
    + 3DS See FMOD3DS.H for hardware specific reverb functionality.
    + PSP See FMODWII.H for hardware specific reverb functionality.
    +
    + Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
    + Members marked with [w] mean the variable can be written to. The user can set the value.
    + Members marked with [r/w] are either read or write depending on if you are using System::setReverbProperties (w) or System::getReverbProperties (r). + + [SEE_ALSO] + System::setReverbProperties + System::getReverbProperties + FMOD_REVERB_PRESETS +] +*/ +typedef struct FMOD_REVERB_PROPERTIES +{ /* MIN MAX DEFAULT DESCRIPTION */ + float DecayTime; /* [r/w] 0.0 20000.0 1500.0 Reverberation decay time in ms */ + float EarlyDelay; /* [r/w] 0.0 300.0 7.0 Initial reflection delay time */ + float LateDelay; /* [r/w] 0.0 100 11.0 Late reverberation delay time relative to initial reflection */ + float HFReference; /* [r/w] 20.0 20000.0 5000 Reference high frequency (hz) */ + float HFDecayRatio; /* [r/w] 10.0 100.0 50.0 High-frequency to mid-frequency decay time ratio */ + float Diffusion; /* [r/w] 0.0 100.0 100.0 Value that controls the echo density in the late reverberation decay. */ + float Density; /* [r/w] 0.0 100.0 100.0 Value that controls the modal density in the late reverberation decay */ + float LowShelfFrequency; /* [r/w] 20.0 1000.0 250.0 Reference low frequency (hz) */ + float LowShelfGain; /* [r/w] -36.0 12.0 0.0 Relative room effect level at low frequencies */ + float HighCut; /* [r/w] 20.0 20000.0 20000.0 Relative room effect level at high frequencies */ + float EarlyLateMix; /* [r/w] 0.0 100.0 50.0 Early reflections level relative to room effect */ + float WetLevel; /* [r/w] -80.0 20.0 -6.0 Room effect level (at mid frequencies) */ +} FMOD_REVERB_PROPERTIES; + + +/* +[DEFINE] +[ + [NAME] + FMOD_REVERB_PRESETS + + [DESCRIPTION] + A set of predefined environment PARAMETERS.
    + These are used to initialize an FMOD_REVERB_PROPERTIES structure statically.
    + i.e.
    + FMOD_REVERB_PROPERTIES prop = FMOD_PRESET_GENERIC; + + [REMARKS] + + [SEE_ALSO] + System::setReverbProperties + System::getReverbProperties +] +*/ +/* Decay LateDly HFDecay Densty LoGain E/L-Mix + EarlyDly HFRef Diffus LoFreq HiCut WetLvl */ +#define FMOD_PRESET_OFF { 1000, 7, 11, 5000, 100, 100, 100, 250, 0, 20, 96, -80.0f } +#define FMOD_PRESET_GENERIC { 1500, 7, 11, 5000, 83, 100, 100, 250, 0, 14500, 96, -8.0f } +#define FMOD_PRESET_PADDEDCELL { 170, 1, 2, 5000, 10, 100, 100, 250, 0, 160, 84, -7.8f } +#define FMOD_PRESET_ROOM { 400, 2, 3, 5000, 83, 100, 100, 250, 0, 6050, 88, -9.4f } +#define FMOD_PRESET_BATHROOM { 1500, 7, 11, 5000, 54, 100, 60, 250, 0, 2900, 83, 0.5f } +#define FMOD_PRESET_LIVINGROOM { 500, 3, 4, 5000, 10, 100, 100, 250, 0, 160, 58, -19.0f } +#define FMOD_PRESET_STONEROOM { 2300, 12, 17, 5000, 64, 100, 100, 250, 0, 7800, 71, -8.5f } +#define FMOD_PRESET_AUDITORIUM { 4300, 20, 30, 5000, 59, 100, 100, 250, 0, 5850, 64, -11.7f } +#define FMOD_PRESET_CONCERTHALL { 3900, 20, 29, 5000, 70, 100, 100, 250, 0, 5650, 80, -9.8f } +#define FMOD_PRESET_CAVE { 2900, 15, 22, 5000, 100, 100, 100, 250, 0, 20000, 59, -11.3f } +#define FMOD_PRESET_ARENA { 7200, 20, 30, 5000, 33, 100, 100, 250, 0, 4500, 80, -9.6f } +#define FMOD_PRESET_HANGAR { 10000, 20, 30, 5000, 23, 100, 100, 250, 0, 3400, 72, -7.4f } +#define FMOD_PRESET_CARPETTEDHALLWAY { 300, 2, 30, 5000, 10, 100, 100, 250, 0, 500, 56, -24.0f } +#define FMOD_PRESET_HALLWAY { 1500, 7, 11, 5000, 59, 100, 100, 250, 0, 7800, 87, -5.5f } +#define FMOD_PRESET_STONECORRIDOR { 270, 13, 20, 5000, 79, 100, 100, 250, 0, 9000, 86, -6.0f } +#define FMOD_PRESET_ALLEY { 1500, 7, 11, 5000, 86, 100, 100, 250, 0, 8300, 80, -9.8f } +#define FMOD_PRESET_FOREST { 1500, 162, 88, 5000, 54, 79, 100, 250, 0, 760, 94, -12.3f } +#define FMOD_PRESET_CITY { 1500, 7, 11, 5000, 67, 50, 100, 250, 0, 4050, 66, -26.0f } +#define FMOD_PRESET_MOUNTAINS { 1500, 300, 100, 5000, 21, 27, 100, 250, 0, 1220, 82, -24.0f } +#define FMOD_PRESET_QUARRY { 1500, 61, 25, 5000, 83, 100, 100, 250, 0, 3400, 100, -5.0f } +#define FMOD_PRESET_PLAIN { 1500, 179, 100, 5000, 50, 21, 100, 250, 0, 1670, 65, -28.0f } +#define FMOD_PRESET_PARKINGLOT { 1700, 8, 12, 5000, 100, 100, 100, 250, 0, 20000, 56, -19.5f } +#define FMOD_PRESET_SEWERPIPE { 2800, 14, 21, 5000, 14, 80, 60, 250, 0, 3400, 66, 1.2f } +#define FMOD_PRESET_UNDERWATER { 1500, 7, 11, 5000, 10, 100, 100, 250, 0, 500, 92, 7.0f } +/* [DEFINE_END] */ + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Settings for advanced features like configuring memory and cpu usage for the FMOD_CREATECOMPRESSEDSAMPLE feature. + + [REMARKS] + maxMPEGCodecs / maxADPCMCodecs / maxXMACodecs will determine the maximum cpu usage of playing realtime samples. Use this to lower potential excess cpu usage and also control memory usage.
    +
    + maxPCMCodecs is for use with PS3 only. It will determine the maximum number of PCM voices that can be played at once. This includes streams of any format and all sounds created + *without* the FMOD_CREATECOMPRESSEDSAMPLE flag. +
    + Memory will be allocated for codecs 'up front' (during System::init) if these values are specified as non zero. If any are zero, it allocates memory for the codec whenever a file of the type in question is loaded. So if maxMPEGCodecs is 0 for example, it will allocate memory for the mpeg codecs the first time an mp3 is loaded or an mp3 based .FSB file is loaded.
    +
    + Due to inefficient encoding techniques on certain .wav based ADPCM files, FMOD can can need an extra 29720 bytes per codec. This means for lowest memory consumption. Use FSB as it uses an optimal/small ADPCM block size.
    +
    + Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
    + Members marked with [w] mean the variable can be written to. The user can set the value.
    + Members marked with [r/w] are either read or write depending on if you are using System::setAdvancedSettings (w) or System::getAdvancedSettings (r). + + [SEE_ALSO] + System::setAdvancedSettings + System::getAdvancedSettings + System::init + FMOD_MODE +] +*/ +typedef struct FMOD_ADVANCEDSETTINGS +{ + int cbSize; /* [w] Size of this structure. Use sizeof(FMOD_ADVANCEDSETTINGS) NOTE: This must be set before calling System::getAdvancedSettings or System::setAdvancedSettings! */ + int maxMPEGCodecs; /* [r/w] Optional. Specify 0 to ignore. For use with FMOD_CREATECOMPRESSEDSAMPLE only. MPEG codecs consume 22,216 bytes per instance and this number will determine how many MPEG channels can be played simultaneously. Default = 32. */ + int maxADPCMCodecs; /* [r/w] Optional. Specify 0 to ignore. For use with FMOD_CREATECOMPRESSEDSAMPLE only. ADPCM codecs consume 2,480 bytes per instance and this number will determine how many ADPCM channels can be played simultaneously. Default = 32. */ + int maxXMACodecs; /* [r/w] Optional. Specify 0 to ignore. For use with FMOD_CREATECOMPRESSEDSAMPLE only. XMA codecs consume 6,263 bytes per instance and this number will determine how many XMA channels can be played simultaneously. Default = 32. */ + int maxVorbisCodecs; /* [r/w] Optional. Specify 0 to ignore. For use with FMOD_CREATECOMPRESSEDSAMPLE only. Vorbis codecs consume 16,512 bytes per instance and this number will determine how many Vorbis channels can be played simultaneously. Default = 32. */ + int maxAT9Codecs; /* [r/w] Optional. Specify 0 to ignore. For use with FMOD_CREATECOMPRESSEDSAMPLE only. AT9 codecs consume 20,664 bytes per instance and this number will determine how many AT9 channels can be played simultaneously. Default = 32. */ + int maxFADPCMCodecs; /* [r/w] Optional. Specify 0 to ignore. For use with FMOD_CREATECOMPRESSEDSAMPLE only. FADPCM codecs consume 2,232 bytes per instance and this number will determine how many FADPCM channels can be played simultaneously. Default = 32. */ + int maxPCMCodecs; /* [r/w] Optional. Specify 0 to ignore. For use with PS3 only. PCM codecs consume 2,536 bytes per instance and this number will determine how many streams and PCM voices can be played simultaneously. Default = 32. */ + int ASIONumChannels; /* [r/w] Optional. Specify 0 to ignore. Number of channels available on the ASIO device. */ + char **ASIOChannelList; /* [r/w] Optional. Specify 0 to ignore. Pointer to an array of strings (number of entries defined by ASIONumChannels) with ASIO channel names. */ + FMOD_SPEAKER *ASIOSpeakerList; /* [r/w] Optional. Specify 0 to ignore. Pointer to a list of speakers that the ASIO channels map to. This can be called after System::init to remap ASIO output. */ + float HRTFMinAngle; /* [r/w] Optional. For use with FMOD_INIT_HRTF_LOWPASS. The angle range (0-360) of a 3D sound in relation to the listener, at which the HRTF function begins to have an effect. 0 = in front of the listener. 180 = from 90 degrees to the left of the listener to 90 degrees to the right. 360 = behind the listener. Default = 180.0. */ + float HRTFMaxAngle; /* [r/w] Optional. For use with FMOD_INIT_HRTF_LOWPASS. The angle range (0-360) of a 3D sound in relation to the listener, at which the HRTF function has maximum effect. 0 = front of the listener. 180 = from 90 degrees to the left of the listener to 90 degrees to the right. 360 = behind the listener. Default = 360.0. */ + float HRTFFreq; /* [r/w] Optional. Specify 0 to ignore. For use with FMOD_INIT_HRTF_LOWPASS. The cutoff frequency of the HRTF's lowpass filter function when at maximum effect. (i.e. at HRTFMaxAngle). Default = 4000.0. */ + float vol0virtualvol; /* [r/w] Optional. Specify 0 to ignore. For use with FMOD_INIT_VOL0_BECOMES_VIRTUAL. If this flag is used, and the volume is below this, then the sound will become virtual. Use this value to raise the threshold to a different point where a sound goes virtual. */ + unsigned int defaultDecodeBufferSize; /* [r/w] Optional. Specify 0 to ignore. For streams. This determines the default size of the double buffer (in milliseconds) that a stream uses. Default = 400ms */ + unsigned short profilePort; /* [r/w] Optional. Specify 0 to ignore. For use with FMOD_INIT_PROFILE_ENABLE. Specify the port to listen on for connections by the profiler application. */ + unsigned int geometryMaxFadeTime; /* [r/w] Optional. Specify 0 to ignore. The maximum time in miliseconds it takes for a channel to fade to the new level when its occlusion changes. */ + float distanceFilterCenterFreq; /* [r/w] Optional. Specify 0 to ignore. For use with FMOD_INIT_DISTANCE_FILTERING. The default center frequency in Hz for the distance filtering effect. Default = 1500.0. */ + int reverb3Dinstance; /* [r/w] Optional. Specify 0 to ignore. Out of 0 to 3, 3d reverb spheres will create a phyical reverb unit on this instance slot. See FMOD_REVERB_PROPERTIES. */ + int DSPBufferPoolSize; /* [r/w] Optional. Specify 0 to ignore. Number of buffers in DSP buffer pool. Each buffer will be DSPBlockSize * sizeof(float) * SpeakerModeChannelCount. ie 7.1 @ 1024 DSP block size = 8 * 1024 * 4 = 32kb. Default = 8. */ + unsigned int stackSizeStream; /* [r/w] Optional. Specify 0 to ignore. Specify the stack size for the FMOD Stream thread in bytes. Useful for custom codecs that use excess stack. Default 49,152 (48kb) */ + unsigned int stackSizeNonBlocking; /* [r/w] Optional. Specify 0 to ignore. Specify the stack size for the FMOD_NONBLOCKING loading thread. Useful for custom codecs that use excess stack. Default 65,536 (64kb) */ + unsigned int stackSizeMixer; /* [r/w] Optional. Specify 0 to ignore. Specify the stack size for the FMOD mixer thread. Useful for custom dsps that use excess stack. Default 49,152 (48kb) */ + FMOD_DSP_RESAMPLER resamplerMethod; /* [r/w] Optional. Specify 0 to ignore. Resampling method used with fmod's software mixer. See FMOD_DSP_RESAMPLER for details on methods. */ + unsigned int commandQueueSize; /* [r/w] Optional. Specify 0 to ignore. Specify the command queue size for thread safe processing. Default 2048 (2kb) */ + unsigned int randomSeed; /* [r/w] Optional. Specify 0 to ignore. Seed value that FMOD will use to initialize its internal random number generators. */ +} FMOD_ADVANCEDSETTINGS; + + +/* +[DEFINE] +[ + [NAME] + FMOD_DRIVER_STATE + + [DESCRIPTION] + Flags that provide additional information about a particular driver. + + [REMARKS] + + [SEE_ALSO] + System::getRecordDriverInfo +] +*/ +#define FMOD_DRIVER_STATE_CONNECTED 0x00000001 /* Device is currently plugged in. */ +#define FMOD_DRIVER_STATE_DEFAULT 0x00000002 /* Device is the users preferred choice. */ +/* [DEFINE_END] */ + + +/*$ preserve start $*/ + +#include "fmod_codec.h" +#include "fmod_dsp.h" +#include "fmod_output.h" + +#endif + +/*$ preserve end $*/ diff --git a/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_dsp.h b/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_dsp.h new file mode 100644 index 0000000..6aaf9de --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_dsp.h @@ -0,0 +1,850 @@ +/* ========================================================================================== */ +/* FMOD Studio - DSP header file. Copyright (c), Firelight Technologies Pty, Ltd. 2004-2016. */ +/* */ +/* Use this header if you are interested in delving deeper into the FMOD software mixing / */ +/* DSP engine. */ +/* Also use this header if you are wanting to develop your own DSP plugin to use with FMOD's */ +/* dsp system. With this header you can make your own DSP plugin that FMOD can */ +/* register and use. See the documentation and examples on how to make a working plugin. */ +/* */ +/* ========================================================================================== */ + +#ifndef _FMOD_DSP_H +#define _FMOD_DSP_H + +#include "fmod_dsp_effects.h" + +typedef struct FMOD_DSP_STATE FMOD_DSP_STATE; + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Structure for FMOD_DSP_PROCESS_CALLBACK input and output buffers. + + [REMARKS] + Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
    + Members marked with [w] mean the variable can be written to. The user can set the value.
    + + [SEE_ALSO] + FMOD_DSP_DESCRIPTION +] +*/ +typedef struct FMOD_DSP_BUFFER_ARRAY +{ + int numbuffers; /* [r/w] number of buffers */ + int *buffernumchannels; /* [r/w] array of number of channels for each buffer */ + FMOD_CHANNELMASK *bufferchannelmask; /* [r/w] array of channel masks for each buffer */ + float **buffers; /* [r/w] array of buffers */ + FMOD_SPEAKERMODE speakermode; /* [r/w] speaker mode for all buffers in the array */ +} FMOD_DSP_BUFFER_ARRAY; + +/* +[ENUM] +[ + [DESCRIPTION] + Operation type for FMOD_DSP_PROCESS_CALLBACK. + + [REMARKS] + A process callback will be called twice per mix for a DSP unit. Once with the FMOD_DSP_PROCESS_QUERY command, then conditionally, FMOD_DSP_PROCESS_PERFORM.
    + FMOD_DSP_PROCESS_QUERY is to be handled only by filling out the outputarray information, and returning a relevant return code.
    + It should not really do any logic besides checking and returning one of the following codes:
    + - FMOD_OK - Meaning yes, it should execute the dsp process function with FMOD_DSP_PROCESS_PERFORM
    + - FMOD_ERR_DSP_DONTPROCESS - Meaning no, it should skip the process function and not call it with FMOD_DSP_PROCESS_PERFORM.
    + - FMOD_ERR_DSP_SILENCE - Meaning no, it should skip the process function and not call it with FMOD_DSP_PROCESS_PERFORM, AND, tell the signal chain to follow that it is now idle, so that no more processing happens down the chain.
    + If audio is to be processed, 'outbufferarray' must be filled with the expected output format, channel count and mask. Mask can be 0.
    +
    + FMOD_DSP_PROCESS_PROCESS is to be handled by reading the data from the input, processing it, and writing it to the output. Always write to the output buffer and fill it fully to avoid unpredictable audio output.
    + Always return FMOD_OK, the return value is ignored from the process stage. + + [SEE_ALSO] + FMOD_DSP_DESCRIPTION +] +*/ +typedef enum +{ + FMOD_DSP_PROCESS_PERFORM, /* Process the incoming audio in 'inbufferarray' and output to 'outbufferarray'. */ + FMOD_DSP_PROCESS_QUERY /* The DSP is being queried for the expected output format and whether it needs to process audio or should be bypassed. The function should return FMOD_OK, or FMOD_ERR_DSP_DONTPROCESS or FMOD_ERR_DSP_SILENCE if audio can pass through unprocessed. See remarks for more. If audio is to be processed, 'outbufferarray' must be filled with the expected output format, channel count and mask. */ +} FMOD_DSP_PROCESS_OPERATION; + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Complex number structure used for holding FFT frequency domain-data for FMOD_FFTREAL and FMOD_IFFTREAL DSP callbacks. + + [REMARKS] + + [SEE_ALSO] + FMOD_DSP_STATE_SYSTEMCALLBACKS +] +*/ +typedef struct FMOD_COMPLEX +{ + float real; /* Real component */ + float imag; /* Imaginary component */ +} FMOD_COMPLEX; + +/* +[ENUM] +[ + [DESCRIPTION] + Flags for the FMOD_DSP_PAN_SUM_SURROUND_MATRIX callback. + + [REMARKS] + This functionality is experimental, please contact support@fmod.org for more information. + + [SEE_ALSO] + FMOD_DSP_STATE_PAN_CALLBACKS +] +*/ +typedef enum +{ + FMOD_DSP_PAN_SURROUND_DEFAULT = 0, + FMOD_DSP_PAN_SURROUND_ROTATION_NOT_BIASED = 1, + + FMOD_DSP_PAN_SURROUND_FLAGS_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_DSP_PAN_SURROUND_FLAGS; + +/* + DSP callbacks +*/ +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_CREATE_CALLBACK) (FMOD_DSP_STATE *dsp_state); +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_RELEASE_CALLBACK) (FMOD_DSP_STATE *dsp_state); +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_RESET_CALLBACK) (FMOD_DSP_STATE *dsp_state); +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_READ_CALLBACK) (FMOD_DSP_STATE *dsp_state, float *inbuffer, float *outbuffer, unsigned int length, int inchannels, int *outchannels); +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_PROCESS_CALLBACK) (FMOD_DSP_STATE *dsp_state, unsigned int length, const FMOD_DSP_BUFFER_ARRAY *inbufferarray, FMOD_DSP_BUFFER_ARRAY *outbufferarray, FMOD_BOOL inputsidle, FMOD_DSP_PROCESS_OPERATION op); +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_SETPOSITION_CALLBACK) (FMOD_DSP_STATE *dsp_state, unsigned int pos); +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_SHOULDIPROCESS_CALLBACK) (FMOD_DSP_STATE *dsp_state, FMOD_BOOL inputsidle, unsigned int length, FMOD_CHANNELMASK inmask, int inchannels, FMOD_SPEAKERMODE speakermode); + +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_SETPARAM_FLOAT_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, float value); +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_SETPARAM_INT_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, int value); +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_SETPARAM_BOOL_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, FMOD_BOOL value); +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_SETPARAM_DATA_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, void *data, unsigned int length); +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_GETPARAM_FLOAT_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, float *value, char *valuestr); +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_GETPARAM_INT_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, int *value, char *valuestr); +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_GETPARAM_BOOL_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, FMOD_BOOL *value, char *valuestr); +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_GETPARAM_DATA_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, void **data, unsigned int *length, char *valuestr); + +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_SYSTEM_REGISTER_CALLBACK) (FMOD_DSP_STATE *dsp_state); +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_SYSTEM_DEREGISTER_CALLBACK) (FMOD_DSP_STATE *dsp_state); +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_SYSTEM_MIX_CALLBACK) (FMOD_DSP_STATE *dsp_state, int stage); + +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_SYSTEM_GETSAMPLERATE) (FMOD_DSP_STATE *dsp_state, int *rate); +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_SYSTEM_GETBLOCKSIZE) (FMOD_DSP_STATE *dsp_state, unsigned int *blocksize); +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_SYSTEM_GETSPEAKERMODE) (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE *speakermode_mixer, FMOD_SPEAKERMODE *speakermode_output); + +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_DFT_FFTREAL) (FMOD_DSP_STATE* thisdsp, int size, const float *signal, FMOD_COMPLEX* dft, const float *window, int signalhop); +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_DFT_IFFTREAL) (FMOD_DSP_STATE* thisdsp, int size, const FMOD_COMPLEX *dft, float* signal, const float *window, int signalhop); + +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_PAN_SUM_MONO_MATRIX) (FMOD_DSP_STATE *dsp_state, int sourceSpeakerMode, float lowFrequencyGain, float overallGain, float *matrix); +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_PAN_SUM_STEREO_MATRIX) (FMOD_DSP_STATE *dsp_state, int sourceSpeakerMode, float pan, float lowFrequencyGain, float overallGain, int matrixHop, float *matrix); +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_PAN_SUM_SURROUND_MATRIX) (FMOD_DSP_STATE *dsp_state, int sourceSpeakerMode, int targetSpeakerMode, float direction, float extent, float rotation, float lowFrequencyGain, float overallGain, int matrixHop, float *matrix, FMOD_DSP_PAN_SURROUND_FLAGS flags); +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_PAN_SUM_MONO_TO_SURROUND_MATRIX) (FMOD_DSP_STATE *dsp_state, int targetSpeakerMode, float direction, float extent, float lowFrequencyGain, float overallGain, int matrixHop, float *matrix); +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_PAN_SUM_STEREO_TO_SURROUND_MATRIX)(FMOD_DSP_STATE *dsp_state, int targetSpeakerMode, float direction, float extent, float rotation, float lowFrequencyGain, float overallGain, int matrixHop, float *matrix); +typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_PAN_3D_GET_ROLLOFF_GAIN) (FMOD_DSP_STATE *dsp_state, FMOD_DSP_PAN_3D_ROLLOFF_TYPE rolloff, float distance, float mindistance, float maxdistance, float *gain); + + +/* +[DEFINE] +[ + [NAME] + FMOD_DSP_GETPARAM_VALUESTR_LENGTH + + [DESCRIPTION] + Length in bytes of the buffer pointed to by the valuestr argument of FMOD_DSP_GETPARAM_XXXX_CALLBACK functions. + + [REMARKS] + DSP plugins should not copy more than this number of bytes into the buffer or memory corruption will occur. + + [SEE_ALSO] + FMOD_DSP_GETPARAM_FLOAT_CALLBACK + FMOD_DSP_GETPARAM_INT_CALLBACK + FMOD_DSP_GETPARAM_BOOL_CALLBACK + FMOD_DSP_GETPARAM_DATA_CALLBACK +] +*/ +#define FMOD_DSP_GETPARAM_VALUESTR_LENGTH 32 +/* [DEFINE_END] */ + +/* +[ENUM] +[ + [DESCRIPTION] + DSP parameter types. + + [REMARKS] + + [SEE_ALSO] + FMOD_DSP_PARAMETER_DESC +] +*/ +typedef enum +{ + FMOD_DSP_PARAMETER_TYPE_FLOAT, + FMOD_DSP_PARAMETER_TYPE_INT, + FMOD_DSP_PARAMETER_TYPE_BOOL, + FMOD_DSP_PARAMETER_TYPE_DATA, + + FMOD_DSP_PARAMETER_TYPE_MAX, /* Maximum number of DSP parameter types. */ + FMOD_DSP_PARAMETER_TYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_DSP_PARAMETER_TYPE; + + +/* +[ENUM] +[ + [DESCRIPTION] + DSP float parameter mappings. These determine how values are mapped across dials and automation curves. + + [REMARKS] + FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_AUTO generates a mapping based on range and units. For example, if the units are in Hertz and the range is with-in the audio spectrum, a Bark scale will be chosen. Logarithmic scales may also be generated for ranges above zero spanning several orders of magnitude. + + [SEE_ALSO] + FMOD_DSP_PARAMETER_FLOAT_MAPPING +] +*/ +typedef enum +{ + FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_LINEAR, /* Values mapped linearly across range. */ + FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_AUTO, /* A mapping is automatically chosen based on range and units. See remarks. */ + FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_PIECEWISE_LINEAR, /* Values mapped in a piecewise linear fashion defined by FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR. */ + + FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE; + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Structure to define a piecewise linear mapping. + + [REMARKS] + Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
    + Members marked with [w] mean the variable can be written to. The user can set the value.
    + + [SEE_ALSO] + FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE + FMOD_DSP_PARAMETER_FLOAT_MAPPING +] +*/ +typedef struct FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR +{ + int numpoints; /* [w] The number of pairs in the piecewise mapping (at least 2). */ + float *pointparamvalues; /* [w] The values in the parameter's units for each point */ + float *pointpositions; /* [w] The positions along the control's scale (e.g. dial angle) corresponding to each parameter value. The range of this scale is arbitrary and all positions will be relative to the minimum and maximum values (e.g. [0,1,3] is equivalent to [1,2,4] and [2,4,8]). If this array is zero, pointparamvalues will be distributed with equal spacing. */ +} FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Structure to define a mapping for a DSP unit's float parameter. + + [REMARKS] + Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
    + Members marked with [w] mean the variable can be written to. The user can set the value.
    + + [SEE_ALSO] + FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE + FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR + FMOD_DSP_PARAMETER_DESC_FLOAT +] +*/ +typedef struct FMOD_DSP_PARAMETER_FLOAT_MAPPING +{ + FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE type; + FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR piecewiselinearmapping; /* [w] Only required for FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_PIECEWISE_LINEAR type mapping. */ +} FMOD_DSP_PARAMETER_FLOAT_MAPPING; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Structure to define a float parameter for a DSP unit. + + [REMARKS] + Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
    + Members marked with [w] mean the variable can be written to. The user can set the value.
    + + [SEE_ALSO] + System::createDSP + DSP::setParameterFloat + DSP::getParameterFloat + FMOD_DSP_PARAMETER_DESC + FMOD_DSP_PARAMETER_FLOAT_MAPPING +] +*/ +typedef struct FMOD_DSP_PARAMETER_DESC_FLOAT +{ + float min; /* [w] Minimum parameter value. */ + float max; /* [w] Maximum parameter value. */ + float defaultval; /* [w] Default parameter value. */ + FMOD_DSP_PARAMETER_FLOAT_MAPPING mapping; /* [w] How the values are distributed across dials and automation curves (e.g. linearly, exponentially etc). */ +} FMOD_DSP_PARAMETER_DESC_FLOAT; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Structure to define a int parameter for a DSP unit. + + [REMARKS] + Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
    + Members marked with [w] mean the variable can be written to. The user can set the value.
    + + [SEE_ALSO] + System::createDSP + DSP::setParameterInt + DSP::getParameterInt + FMOD_DSP_PARAMETER_DESC +] +*/ +typedef struct FMOD_DSP_PARAMETER_DESC_INT +{ + int min; /* [w] Minimum parameter value. */ + int max; /* [w] Maximum parameter value. */ + int defaultval; /* [w] Default parameter value. */ + FMOD_BOOL goestoinf; /* [w] Whether the last value represents infiniy. */ + const char* const* valuenames; /* [w] Names for each value. There should be as many strings as there are possible values (max - min + 1). Optional. */ +} FMOD_DSP_PARAMETER_DESC_INT; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Structure to define a boolean parameter for a DSP unit. + + [REMARKS] + Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
    + Members marked with [w] mean the variable can be written to. The user can set the value.
    + + [SEE_ALSO] + System::createDSP + DSP::setParameterBool + DSP::getParameterBool + FMOD_DSP_PARAMETER_DESC +] +*/ +typedef struct FMOD_DSP_PARAMETER_DESC_BOOL +{ + FMOD_BOOL defaultval; /* [w] Default parameter value. */ + const char* const* valuenames; /* [w] Names for false and true, respectively. There should be two strings. Optional. */ +} FMOD_DSP_PARAMETER_DESC_BOOL; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Structure to define a data parameter for a DSP unit. Use 0 or above for custom types. This parameter will be treated specially by the system if set to one of the FMOD_DSP_PARAMETER_DATA_TYPE values. + + [REMARKS] + Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
    + Members marked with [w] mean the variable can be written to. The user can set the value.
    + + [SEE_ALSO] + System::createDSP + DSP::setParameterData + DSP::getParameterData + FMOD_DSP_PARAMETER_DATA_TYPE + FMOD_DSP_PARAMETER_DESC +] +*/ +typedef struct FMOD_DSP_PARAMETER_DESC_DATA +{ + int datatype; /* [w] The type of data for this parameter. Use 0 or above for custom types or set to one of the FMOD_DSP_PARAMETER_DATA_TYPE values. */ +} FMOD_DSP_PARAMETER_DESC_DATA; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Base Structure for DSP parameter descriptions. + + [REMARKS] + Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
    + Members marked with [w] mean the variable can be written to. The user can set the value.
    + + [SEE_ALSO] + System::createDSP + DSP::setParameterFloat + DSP::getParameterFloat + DSP::setParameterInt + DSP::getParameterInt + DSP::setParameterBool + DSP::getParameterBool + DSP::setParameterData + DSP::getParameterData + FMOD_DSP_PARAMETER_DESC_FLOAT + FMOD_DSP_PARAMETER_DESC_INT + FMOD_DSP_PARAMETER_DESC_BOOL + FMOD_DSP_PARAMETER_DESC_DATA +] +*/ +typedef struct FMOD_DSP_PARAMETER_DESC +{ + FMOD_DSP_PARAMETER_TYPE type; /* [w] Type of this parameter. */ + char name[16]; /* [w] Name of the parameter to be displayed (ie "Cutoff frequency"). */ + char label[16]; /* [w] Short string to be put next to value to denote the unit type (ie "hz"). */ + const char *description; /* [w] Description of the parameter to be displayed as a help item / tooltip for this parameter. */ + + union + { + FMOD_DSP_PARAMETER_DESC_FLOAT floatdesc; /* [w] Struct containing information about the parameter in floating point format. Use when type is FMOD_DSP_PARAMETER_TYPE_FLOAT. */ + FMOD_DSP_PARAMETER_DESC_INT intdesc; /* [w] Struct containing information about the parameter in integer format. Use when type is FMOD_DSP_PARAMETER_TYPE_INT. */ + FMOD_DSP_PARAMETER_DESC_BOOL booldesc; /* [w] Struct containing information about the parameter in boolean format. Use when type is FMOD_DSP_PARAMETER_TYPE_BOOL. */ + FMOD_DSP_PARAMETER_DESC_DATA datadesc; /* [w] Struct containing information about the parameter in data format. Use when type is FMOD_DSP_PARAMETER_TYPE_DATA. */ + }; +} FMOD_DSP_PARAMETER_DESC; + + +/* +[ENUM] +[ + [DESCRIPTION] + Built-in types for the 'datatype' member of FMOD_DSP_PARAMETER_DESC_DATA. Data parameters of type other than FMOD_DSP_PARAMETER_DATA_TYPE_USER will be treated specially by the system. + + [REMARKS] + + [SEE_ALSO] + FMOD_DSP_PARAMETER_DESC_DATA + FMOD_DSP_PARAMETER_OVERALLGAIN + FMOD_DSP_PARAMETER_3DATTRIBUTES + FMOD_DSP_PARAMETER_3DATTRIBUTES_MULTI + FMOD_DSP_PARAMETER_SIDECHAIN +] +*/ +typedef enum +{ + FMOD_DSP_PARAMETER_DATA_TYPE_USER = 0, /* The default data type. All user data types should be 0 or above. */ + FMOD_DSP_PARAMETER_DATA_TYPE_OVERALLGAIN = -1, /* The data type for FMOD_DSP_PARAMETER_OVERALLGAIN parameters. There should a maximum of one per DSP. */ + FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES = -2, /* The data type for FMOD_DSP_PARAMETER_3DATTRIBUTES parameters. There should a maximum of one per DSP. */ + FMOD_DSP_PARAMETER_DATA_TYPE_SIDECHAIN = -3, /* The data type for FMOD_DSP_PARAMETER_SIDECHAIN parameters. There should a maximum of one per DSP. */ + FMOD_DSP_PARAMETER_DATA_TYPE_FFT = -4, /* The data type for FMOD_DSP_PARAMETER_FFT parameters. There should a maximum of one per DSP. */ + FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES_MULTI = -5, /* The data type for FMOD_DSP_PARAMETER_3DATTRIBUTES_MULTI parameters. There should a maximum of one per DSP. */ +} FMOD_DSP_PARAMETER_DATA_TYPE; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Structure for data parameters of type FMOD_DSP_PARAMETER_DATA_TYPE_OVERALLGAIN. + A parameter of this type is used in effects that affect the overgain of the signal in a predictable way. + This parameter is read by the system to determine the effect's gain for voice virtualization. + + [REMARKS] + Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
    + Members marked with [w] mean the variable can be written to. The user can set the value.
    + + [SEE_ALSO] + FMOD_DSP_PARAMETER_DATA_TYPE + FMOD_DSP_PARAMETER_DESC +] +*/ +typedef struct FMOD_DSP_PARAMETER_OVERALLGAIN +{ + float linear_gain; /* [r] The overall linear gain of the effect on the direct signal path */ + float linear_gain_additive; /* [r] Additive gain, for parallel signal paths */ +} FMOD_DSP_PARAMETER_OVERALLGAIN; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Structure for data parameters of type FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES. + A parameter of this type is used in effects that respond to a sound's 3D position. + The system will set this parameter automatically if a sound's position changes. + + [REMARKS] + Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
    + Members marked with [w] mean the variable can be written to. The user can set the value.
    + + [SEE_ALSO] + FMOD_DSP_PARAMETER_DATA_TYPE + FMOD_DSP_PARAMETER_DESC +] +*/ +typedef struct FMOD_DSP_PARAMETER_3DATTRIBUTES +{ + FMOD_3D_ATTRIBUTES relative; /* [w] The position of the sound relative to the listener. */ + FMOD_3D_ATTRIBUTES absolute; /* [w] The position of the sound in world coordinates. */ +} FMOD_DSP_PARAMETER_3DATTRIBUTES; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Structure for data parameters of type FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES_MULTI. + A parameter of this type is used in effects that respond to a sound's 3D position, and + support multiple listeners. + The system will set this parameter automatically if a sound's position changes. + + [REMARKS] + Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
    + Members marked with [w] mean the variable can be written to. The user can set the value.
    + + [SEE_ALSO] + FMOD_DSP_PARAMETER_DATA_TYPE + FMOD_DSP_PARAMETER_DESC +] +*/ +typedef struct FMOD_DSP_PARAMETER_3DATTRIBUTES_MULTI +{ + int numlisteners; /* [w] The number of listeners. */ + FMOD_3D_ATTRIBUTES relative[FMOD_MAX_LISTENERS]; /* [w] The position of the sound relative to the listeners. */ + FMOD_3D_ATTRIBUTES absolute; /* [w] The position of the sound in world coordinates. */ +} FMOD_DSP_PARAMETER_3DATTRIBUTES_MULTI; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Structure for data parameters of type FMOD_DSP_PARAMETER_DATA_TYPE_SIDECHAIN. + A parameter of this type is declared for effects which support sidechaining. + + [REMARKS] + Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
    + Members marked with [w] mean the variable can be written to. The user can set the value.
    + + [SEE_ALSO] + FMOD_DSP_PARAMETER_DATA_TYPE + FMOD_DSP_PARAMETER_DESC +] +*/ +typedef struct FMOD_DSP_PARAMETER_SIDECHAIN +{ + FMOD_BOOL sidechainenable; /* [r/w] Whether sidechains are enabled. */ +} FMOD_DSP_PARAMETER_SIDECHAIN; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Structure for data parameters of type FMOD_DSP_PARAMETER_DATA_TYPE_FFT. + A parameter of this type is declared for the FMOD_DSP_TYPE_FFT effect. + + [REMARKS] + Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
    + Members marked with [w] mean the variable can be written to. The user can set the value.
    +
    + Notes on the spectrum data member. Values inside the float buffer are typically between 0 and 1.0.
    + Each top level array represents one PCM channel of data.
    + Address data as spectrum[channel][bin]. A bin is 1 fft window entry.
    + Only read/display half of the buffer typically for analysis as the 2nd half is usually the same data reversed due to the nature of the way FFT works.
    + + [SEE_ALSO] + FMOD_DSP_PARAMETER_DATA_TYPE + FMOD_DSP_PARAMETER_DESC + FMOD_DSP_PARAMETER_DATA_TYPE_FFT + FMOD_DSP_TYPE + FMOD_DSP_FFT +] +*/ +typedef struct FMOD_DSP_PARAMETER_FFT +{ + int length; /* [r] Number of entries in this spectrum window. Divide this by the output rate to get the hz per entry. */ + int numchannels; /* [r] Number of channels in spectrum. */ + float *spectrum[32]; /* [r] Per channel spectrum arrays. See remarks for more. */ +} FMOD_DSP_PARAMETER_FFT; + + +/* + Helpers for declaring parameters in custom DSPSs +*/ +#define FMOD_DSP_INIT_PARAMDESC_FLOAT(_paramstruct, _name, _label, _description, _min, _max, _defaultval) \ + memset(&(_paramstruct), 0, sizeof(_paramstruct)); \ + (_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_FLOAT; \ + strncpy((_paramstruct).name, _name, 15); \ + strncpy((_paramstruct).label, _label, 15); \ + (_paramstruct).description = _description; \ + (_paramstruct).floatdesc.min = _min; \ + (_paramstruct).floatdesc.max = _max; \ + (_paramstruct).floatdesc.defaultval = _defaultval; \ + (_paramstruct).floatdesc.mapping.type = FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_AUTO; + +#define FMOD_DSP_INIT_PARAMDESC_FLOAT_WITH_MAPPING(_paramstruct, _name, _label, _description, _defaultval, _values, _positions); \ + memset(&(_paramstruct), 0, sizeof(_paramstruct)); \ + (_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_FLOAT; \ + strncpy((_paramstruct).name, _name , 15); \ + strncpy((_paramstruct).label, _label, 15); \ + (_paramstruct).description = _description; \ + (_paramstruct).floatdesc.min = _values[0]; \ + (_paramstruct).floatdesc.max = _values[sizeof(_values) / sizeof(float) - 1]; \ + (_paramstruct).floatdesc.defaultval = _defaultval; \ + (_paramstruct).floatdesc.mapping.type = FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_PIECEWISE_LINEAR; \ + (_paramstruct).floatdesc.mapping.piecewiselinearmapping.numpoints = sizeof(_values) / sizeof(float); \ + (_paramstruct).floatdesc.mapping.piecewiselinearmapping.pointparamvalues = _values; \ + (_paramstruct).floatdesc.mapping.piecewiselinearmapping.pointpositions = _positions; + +#define FMOD_DSP_INIT_PARAMDESC_INT(_paramstruct, _name, _label, _description, _min, _max, _defaultval, _goestoinf, _valuenames) \ + memset(&(_paramstruct), 0, sizeof(_paramstruct)); \ + (_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_INT; \ + strncpy((_paramstruct).name, _name , 15); \ + strncpy((_paramstruct).label, _label, 15); \ + (_paramstruct).description = _description; \ + (_paramstruct).intdesc.min = _min; \ + (_paramstruct).intdesc.max = _max; \ + (_paramstruct).intdesc.defaultval = _defaultval; \ + (_paramstruct).intdesc.goestoinf = _goestoinf; \ + (_paramstruct).intdesc.valuenames = _valuenames; + +#define FMOD_DSP_INIT_PARAMDESC_INT_ENUMERATED(_paramstruct, _name, _label, _description, _defaultval, _valuenames) \ + memset(&(_paramstruct), 0, sizeof(_paramstruct)); \ + (_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_INT; \ + strncpy((_paramstruct).name, _name , 15); \ + strncpy((_paramstruct).label, _label, 15); \ + (_paramstruct).description = _description; \ + (_paramstruct).intdesc.min = 0; \ + (_paramstruct).intdesc.max = sizeof(_valuenames) / sizeof(char*) - 1; \ + (_paramstruct).intdesc.defaultval = _defaultval; \ + (_paramstruct).intdesc.goestoinf = false; \ + (_paramstruct).intdesc.valuenames = _valuenames; + +#define FMOD_DSP_INIT_PARAMDESC_BOOL(_paramstruct, _name, _label, _description, _defaultval, _valuenames) \ + memset(&(_paramstruct), 0, sizeof(_paramstruct)); \ + (_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_BOOL; \ + strncpy((_paramstruct).name, _name , 15); \ + strncpy((_paramstruct).label, _label, 15); \ + (_paramstruct).description = _description; \ + (_paramstruct).booldesc.defaultval = _defaultval; \ + (_paramstruct).booldesc.valuenames = _valuenames; + +#define FMOD_DSP_INIT_PARAMDESC_DATA(_paramstruct, _name, _label, _description, _datatype) \ + memset(&(_paramstruct), 0, sizeof(_paramstruct)); \ + (_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_DATA; \ + strncpy((_paramstruct).name, _name , 15); \ + strncpy((_paramstruct).label, _label, 15); \ + (_paramstruct).description = _description; \ + (_paramstruct).datadesc.datatype = _datatype; + +#define FMOD_PLUGIN_SDK_VERSION 107 + +/* +[STRUCTURE] +[ + [DESCRIPTION] + When creating a DSP unit, declare one of these and provide the relevant callbacks and name for FMOD to use when it creates and uses a DSP unit of this type. + + [REMARKS] + Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
    + Members marked with [w] mean the variable can be written to. The user can set the value.
    +
    + There are 2 different ways to change a parameter in this architecture.
    + One is to use DSP::setParameterFloat / DSP::setParameterInt / DSP::setParameterBool / DSP::setParameterData. This is platform independant and is dynamic, so new unknown plugins can have their parameters enumerated and used.
    + The other is to use DSP::showConfigDialog. This is platform specific and requires a GUI, and will display a dialog box to configure the plugin.
    + + [SEE_ALSO] + System::createDSP + DSP::setParameterFloat + DSP::setParameterInt + DSP::setParameterBool + DSP::setParameterData + FMOD_DSP_STATE + FMOD_DSP_CREATE_CALLBACK + FMOD_DSP_RELEASE_CALLBACK + FMOD_DSP_RESET_CALLBACK + FMOD_DSP_READ_CALLBACK + FMOD_DSP_PROCESS_CALLBACK + FMOD_DSP_SETPOSITION_CALLBACK + FMOD_DSP_PARAMETER_DESC + FMOD_DSP_SETPARAM_FLOAT_CALLBACK + FMOD_DSP_SETPARAM_INT_CALLBACK + FMOD_DSP_SETPARAM_BOOL_CALLBACK + FMOD_DSP_SETPARAM_DATA_CALLBACK + FMOD_DSP_GETPARAM_FLOAT_CALLBACK + FMOD_DSP_GETPARAM_INT_CALLBACK + FMOD_DSP_GETPARAM_BOOL_CALLBACK + FMOD_DSP_GETPARAM_DATA_CALLBACK + FMOD_DSP_SHOULDIPROCESS_CALLBACK + FMOD_DSP_SYSTEM_REGISTER_CALLBACK + FMOD_DSP_SYSTEM_DEREGISTER_CALLBACK + FMOD_DSP_SYSTEM_MIX_CALLBACK +] +*/ +typedef struct FMOD_DSP_DESCRIPTION +{ + unsigned int pluginsdkversion; /* [w] The plugin SDK version this plugin is built for. set to this to FMOD_PLUGIN_SDK_VERSION defined above. */ + char name[32]; /* [w] The identifier of the DSP. This will also be used as the name of DSP and shouldn't change between versions. */ + unsigned int version; /* [w] Plugin writer's version number. */ + int numinputbuffers; /* [w] Number of input buffers to process. Use 0 for DSPs that only generate sound and 1 for effects that process incoming sound. */ + int numoutputbuffers; /* [w] Number of audio output buffers. Only one output buffer is currently supported. */ + FMOD_DSP_CREATE_CALLBACK create; /* [w] Create callback. This is called when DSP unit is created. Can be null. */ + FMOD_DSP_RELEASE_CALLBACK release; /* [w] Release callback. This is called just before the unit is freed so the user can do any cleanup needed for the unit. Can be null. */ + FMOD_DSP_RESET_CALLBACK reset; /* [w] Reset callback. This is called by the user to reset any history buffers that may need resetting for a filter, when it is to be used or re-used for the first time to its initial clean state. Use to avoid clicks or artifacts. */ + FMOD_DSP_READ_CALLBACK read; /* [w] Read callback. Processing is done here. Can be null. */ + FMOD_DSP_PROCESS_CALLBACK process; /* [w] Process callback. Can be specified instead of the read callback if any channel format changes occur between input and output. This also replaces shouldiprocess and should return an error if the effect is to be bypassed. Can be null. */ + FMOD_DSP_SETPOSITION_CALLBACK setposition; /* [w] Set position callback. This is called if the unit wants to update its position info but not process data, or reset a cursor position internally if it is reading data from a certain source. Can be null. */ + + int numparameters; /* [w] Number of parameters used in this filter. The user finds this with DSP::getNumParameters */ + FMOD_DSP_PARAMETER_DESC **paramdesc; /* [w] Variable number of parameter structures. */ + FMOD_DSP_SETPARAM_FLOAT_CALLBACK setparameterfloat; /* [w] This is called when the user calls DSP::setParameterFloat. Can be null. */ + FMOD_DSP_SETPARAM_INT_CALLBACK setparameterint; /* [w] This is called when the user calls DSP::setParameterInt. Can be null. */ + FMOD_DSP_SETPARAM_BOOL_CALLBACK setparameterbool; /* [w] This is called when the user calls DSP::setParameterBool. Can be null. */ + FMOD_DSP_SETPARAM_DATA_CALLBACK setparameterdata; /* [w] This is called when the user calls DSP::setParameterData. Can be null. */ + FMOD_DSP_GETPARAM_FLOAT_CALLBACK getparameterfloat; /* [w] This is called when the user calls DSP::getParameterFloat. Can be null. */ + FMOD_DSP_GETPARAM_INT_CALLBACK getparameterint; /* [w] This is called when the user calls DSP::getParameterInt. Can be null. */ + FMOD_DSP_GETPARAM_BOOL_CALLBACK getparameterbool; /* [w] This is called when the user calls DSP::getParameterBool. Can be null. */ + FMOD_DSP_GETPARAM_DATA_CALLBACK getparameterdata; /* [w] This is called when the user calls DSP::getParameterData. Can be null. */ + FMOD_DSP_SHOULDIPROCESS_CALLBACK shouldiprocess; /* [w] This is called before processing. You can detect if inputs are idle and return FMOD_OK to process, or any other error code to avoid processing the effect. Use a count down timer to allow effect tails to process before idling! */ + void *userdata; /* [w] Optional. Specify 0 to ignore. This is user data to be attached to the DSP unit during creation. Access via DSP::getUserData. */ + + FMOD_DSP_SYSTEM_REGISTER_CALLBACK sys_register; /* [w] Register callback. This is called when DSP unit is loaded/registered. Useful for 'global'/per system object init for plugin. Can be null. */ + FMOD_DSP_SYSTEM_DEREGISTER_CALLBACK sys_deregister; /* [w] Deregister callback. This is called when DSP unit is unloaded/deregistered. Useful as 'global'/per system object shutdown for plugin. Can be null. */ + FMOD_DSP_SYSTEM_MIX_CALLBACK sys_mix; /* [w] System mix stage callback. This is called when the mixer starts to execute or is just finishing executing. Useful for 'global'/per system object once a mix update calls for a plugin. Can be null. */ + +} FMOD_DSP_DESCRIPTION; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Struct containing DFT callbacks for plugins, to enable a plugin to perform optimized time-frequency domain conversion. + + [REMARKS] + Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
    + Members marked with [w] mean the variable can be written to. The user can set the value.
    + + [SEE_ALSO] + FMOD_DSP_STATE_SYSTEMCALLBACKS +] +*/ +typedef struct FMOD_DSP_STATE_DFTCALLBACKS +{ + FMOD_DSP_DFT_FFTREAL fftreal; /* [r] Callback for performing an FFT on a real signal. */ + FMOD_DSP_DFT_IFFTREAL inversefftreal; /* [r] Callback for performing an inverse FFT to get a real signal. */ +} FMOD_DSP_STATE_DFTCALLBACKS; + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Struct containing panning helper callbacks for plugins. + + [REMARKS] + These are experimental, please contact support@fmod.org for more information. + + [SEE_ALSO] + FMOD_DSP_STATE_SYSTEMCALLBACKS + FMOD_DSP_PAN_SURROUND_FLAGS +] +*/ +typedef struct FMOD_DSP_STATE_PAN_CALLBACKS +{ + FMOD_DSP_PAN_SUM_MONO_MATRIX summonomatrix; + FMOD_DSP_PAN_SUM_STEREO_MATRIX sumstereomatrix; + FMOD_DSP_PAN_SUM_SURROUND_MATRIX sumsurroundmatrix; + FMOD_DSP_PAN_SUM_MONO_TO_SURROUND_MATRIX summonotosurroundmatrix; + FMOD_DSP_PAN_SUM_STEREO_TO_SURROUND_MATRIX sumstereotosurroundmatrix; + FMOD_DSP_PAN_3D_GET_ROLLOFF_GAIN getrolloffgain; +} FMOD_DSP_STATE_PAN_CALLBACKS; + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Struct containing System level callbacks for plugins, to enable a plugin to query information about the system or allocate memory using FMOD's (and therefore possibly the game's) allocators. + + [REMARKS] + Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
    + Members marked with [w] mean the variable can be written to. The user can set the value.
    + + [SEE_ALSO] + FMOD_DSP_STATE + FMOD_DSP_STATE_DFTCALLBACKS + FMOD_DSP_STATE_PAN_CALLBACKS +] +*/ +typedef struct FMOD_DSP_STATE_SYSTEMCALLBACKS +{ + FMOD_MEMORY_ALLOC_CALLBACK alloc; /* [r] Memory allocation callback. Use this for all dynamic memory allocation within the plugin. */ + FMOD_MEMORY_REALLOC_CALLBACK realloc; /* [r] Memory reallocation callback. */ + FMOD_MEMORY_FREE_CALLBACK free; /* [r] Memory free callback. */ + FMOD_DSP_SYSTEM_GETSAMPLERATE getsamplerate; /* [r] Callback for getting the system samplerate. */ + FMOD_DSP_SYSTEM_GETBLOCKSIZE getblocksize; /* [r] Callback for getting the system's block size. DSPs will be requested to process blocks of varying length up to this size.*/ + FMOD_DSP_STATE_DFTCALLBACKS *dft; /* [r] Struct containing callbacks for performing FFTs and inverse FFTs. */ + FMOD_DSP_STATE_PAN_CALLBACKS *pancallbacks; /* [r] Pointer to a structure of callbacks for calculating pan, up-mix and down-mix matrices. */ + FMOD_DSP_SYSTEM_GETSPEAKERMODE getspeakermode; /* [r] Callback for getting the system's speaker modes. One is the mixer's default speaker mode, the other is the output mode the system is downmixing or upmixing to.*/ +} FMOD_DSP_STATE_SYSTEMCALLBACKS; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + DSP plugin structure that is passed into each callback. + + [REMARKS] + Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
    + Members marked with [w] mean the variable can be written to. The user can set the value.
    +
    + 'systemobject' is an integer that relates to the System object that created the DSP or registered the DSP plugin. If only 1 System object is created then it should be 0. A second object would be 1 and so on. + FMOD_DSP_STATE_SYSTEMCALLBACKS::getsamplerate/getblocksize/getspeakermode could return different results so it could be relevant to plugin developers to monitor which object is being used. + + [SEE_ALSO] + FMOD_DSP_DESCRIPTION + FMOD_DSP_STATE_SYSTEMCALLBACKS +] +*/ +struct FMOD_DSP_STATE +{ + FMOD_DSP *instance; /* [r] Handle to the FMOD_DSP object the callback is associated with. Not to be modified. C++ users cast to FMOD::DSP to use. */ + void *plugindata; /* [r/w] Plugin writer created data the output author wants to attach to this object. */ + FMOD_CHANNELMASK channelmask; /* [r] Specifies which speakers the DSP effect is active on */ + FMOD_SPEAKERMODE source_speakermode; /* [r] Specifies which speaker mode the signal originated for information purposes, ie in case panning needs to be done differently. */ + float *sidechaindata; /* [r] The mixed result of all incoming sidechains is stored at this pointer address. */ + int sidechainchannels; /* [r] The number of channels of pcm data stored within the sidechain buffer. */ + FMOD_DSP_STATE_SYSTEMCALLBACKS *callbacks; /* [r] Struct containing callbacks for system level functionality. */ + int systemobject; /* [r] FMOD::System object index, relating to the System object that created this DSP. */ +}; + + +/* + Macro helpers for accessing FMOD_DSP_STATE_SYSTEMCALLBACKS +*/ +#define FMOD_DSP_STATE_MEMALLOC(_state, _size, _type, _str) (_state)->callbacks->alloc (_size, _type, _str); /* Pass in the FMOD_DSP_STATE handle, size in bytes to alloc, FMOD_MEMORY_TYPE type and optional char * string to identify where the alloc came from. */ +#define FMOD_DSP_STATE_MEMREALLOC(_state, _ptr, _size, _type, _str) (_state)->callbacks->realloc (_ptr, _size, _type, _str); /* Pass in the FMOD_DSP_STATE handle, optional existing memory pointer, size in bytes to alloc, FMOD_MEMORY_TYPE type and optional char * string to identify where the alloc came from. */ +#define FMOD_DSP_STATE_MEMFREE(_state, _ptr, _type, _str) (_state)->callbacks->free (_ptr, _type, _str); /* Pass in the FMOD_DSP_STATE handle, existing memory pointer, FMOD_MEMORY_TYPE type and optional char * string to identify where the free came from. */ +#define FMOD_DSP_STATE_GETSAMPLERATE(_state, _rate) (_state)->callbacks->getsamplerate (_state, _rate); /* Pass in the FMOD_DSP_STATE handle, and the address of an int to receive the system DSP sample rate. */ +#define FMOD_DSP_STATE_GETBLOCKSIZE(_state, _blocksize) (_state)->callbacks->getblocksize (_state, _blocksize); /* Pass in the FMOD_DSP_STATE handle, and the address of an unsigned int to receive the system DSP block size. */ +#define FMOD_DSP_STATE_GETSPEAKERMODE(_state, _speakermode_mix, _speakermode_out) (_state)->callbacks->getspeakermode(_state, _speakermode_mix, _speakermode_out); /* Pass in the FMOD_DSP_STATE handle, and the address of an unsigned int to receive the FMOD_SPEAKERMODE for the mixer, and for the mode the system is set to. */ +#define FMOD_DSP_STATE_FFTREAL(_state, _size, _signal, _dft, _window, _signalhop) (_state)->callbacks->dft->fftreal (_state, _size, _signal, _dft, _window, _signalhop); /* Pass in the FMOD_DSP_STATE handle, size of the signal and its DFT, a float buffer containing the signal and an FMOD_COMPLEX buffer to store the calculated DFT. */ +#define FMOD_DSP_STATE_IFFTREAL(_state, _size, _dft, _signal, _window, _signalhop) (_state)->callbacks->dft->inversefftreal(_state, _size, _dft, _signal, _window, _signalhop); /* Pass in the FMOD_DSP_STATE handle, size of the DFT and its signal, an FMOD_COMPLEX buffer containing the DFT and a float buffer to store the calculated signal. */ + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + DSP metering info used for retrieving metering info with DSP::getMeteringInfo + + [REMARKS] + Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
    + Members marked with [w] mean the variable can be written to. The user can set the value.
    + + [SEE_ALSO] + FMOD_SPEAKER + DSP::getMeteringInfo +] +*/ +typedef struct FMOD_DSP_METERING_INFO +{ + int numsamples; /* [r] The number of samples considered for this metering info. */ + float peaklevel[32]; /* [r] The peak level per channel. */ + float rmslevel[32]; /* [r] The rms level per channel. */ + short numchannels; /* [r] Number of channels. */ +} FMOD_DSP_METERING_INFO; + +#endif + diff --git a/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_dsp_effects.h b/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_dsp_effects.h new file mode 100644 index 0000000..f1d1596 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_dsp_effects.h @@ -0,0 +1,1118 @@ +/* ========================================================================================== */ +/* FMOD Studio - Built-in effects header file. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2016. */ +/* */ +/* In this header you can find parameter structures for FMOD system registered DSP effects */ +/* and generators. */ +/* */ +/* ========================================================================================== */ + +#ifndef _FMOD_DSP_EFFECTS_H +#define _FMOD_DSP_EFFECTS_H + +/* +[ENUM] +[ + [DESCRIPTION] + These definitions can be used for creating FMOD defined special effects or DSP units. + + [REMARKS] + To get them to be active, first create the unit, then add it somewhere into the DSP network, + either at the front of the network near the soundcard unit to affect the global output + (by using System::getDSPHead), or on a single channel (using Channel::getDSPHead). + + [SEE_ALSO] + System::createDSPByType +] +*/ +typedef enum +{ + FMOD_DSP_TYPE_UNKNOWN, /* This unit was created via a non FMOD plugin so has an unknown purpose. */ + FMOD_DSP_TYPE_MIXER, /* This unit does nothing but take inputs and mix them together then feed the result to the soundcard unit. */ + FMOD_DSP_TYPE_OSCILLATOR, /* This unit generates sine/square/saw/triangle or noise tones. */ + FMOD_DSP_TYPE_LOWPASS, /* This unit filters sound using a high quality, resonant lowpass filter algorithm but consumes more CPU time. */ + FMOD_DSP_TYPE_ITLOWPASS, /* This unit filters sound using a resonant lowpass filter algorithm that is used in Impulse Tracker, but with limited cutoff range (0 to 8060hz). */ + FMOD_DSP_TYPE_HIGHPASS, /* This unit filters sound using a resonant highpass filter algorithm. */ + FMOD_DSP_TYPE_ECHO, /* This unit produces an echo on the sound and fades out at the desired rate. */ + FMOD_DSP_TYPE_FADER, /* This unit pans and scales the volume of a unit. */ + FMOD_DSP_TYPE_FLANGE, /* This unit produces a flange effect on the sound. */ + FMOD_DSP_TYPE_DISTORTION, /* This unit distorts the sound. */ + FMOD_DSP_TYPE_NORMALIZE, /* This unit normalizes or amplifies the sound to a certain level. */ + FMOD_DSP_TYPE_LIMITER, /* This unit limits the sound to a certain level. */ + FMOD_DSP_TYPE_PARAMEQ, /* This unit attenuates or amplifies a selected frequency range. */ + FMOD_DSP_TYPE_PITCHSHIFT, /* This unit bends the pitch of a sound without changing the speed of playback. */ + FMOD_DSP_TYPE_CHORUS, /* This unit produces a chorus effect on the sound. */ + FMOD_DSP_TYPE_VSTPLUGIN, /* This unit allows the use of Steinberg VST plugins */ + FMOD_DSP_TYPE_WINAMPPLUGIN, /* This unit allows the use of Nullsoft Winamp plugins */ + FMOD_DSP_TYPE_ITECHO, /* This unit produces an echo on the sound and fades out at the desired rate as is used in Impulse Tracker. */ + FMOD_DSP_TYPE_COMPRESSOR, /* This unit implements dynamic compression (linked/unlinked multichannel, wideband) */ + FMOD_DSP_TYPE_SFXREVERB, /* This unit implements SFX reverb */ + FMOD_DSP_TYPE_LOWPASS_SIMPLE, /* This unit filters sound using a simple lowpass with no resonance, but has flexible cutoff and is fast. */ + FMOD_DSP_TYPE_DELAY, /* This unit produces different delays on individual channels of the sound. */ + FMOD_DSP_TYPE_TREMOLO, /* This unit produces a tremolo / chopper effect on the sound. */ + FMOD_DSP_TYPE_LADSPAPLUGIN, /* Unsupported / Deprecated. */ + FMOD_DSP_TYPE_SEND, /* This unit sends a copy of the signal to a return DSP anywhere in the DSP tree. */ + FMOD_DSP_TYPE_RETURN, /* This unit receives signals from a number of send DSPs. */ + FMOD_DSP_TYPE_HIGHPASS_SIMPLE, /* This unit filters sound using a simple highpass with no resonance, but has flexible cutoff and is fast. */ + FMOD_DSP_TYPE_PAN, /* This unit pans the signal, possibly upmixing or downmixing as well. */ + FMOD_DSP_TYPE_THREE_EQ, /* This unit is a three-band equalizer. */ + FMOD_DSP_TYPE_FFT, /* This unit simply analyzes the signal and provides spectrum information back through getParameter. */ + FMOD_DSP_TYPE_LOUDNESS_METER, /* This unit analyzes the loudness and true peak of the signal. */ + FMOD_DSP_TYPE_ENVELOPEFOLLOWER, /* This unit tracks the envelope of the input/sidechain signal. Format to be publicly disclosed soon. */ + FMOD_DSP_TYPE_CONVOLUTIONREVERB, /* This unit implements convolution reverb. */ + FMOD_DSP_TYPE_CHANNELMIX, /* This unit provides per signal channel gain, and output channel mapping to allow 1 multichannel signal made up of many groups of signals to map to a single output signal. */ + FMOD_DSP_TYPE_TRANSCEIVER, /* This unit 'sends' and 'receives' from a selection of up to 32 different slots. It is like a send/return but it uses global slots rather than returns as the destination. It also has other features. Multiple transceivers can receive from a single channel, or multiple transceivers can send to a single channel, or a combination of both. */ + + FMOD_DSP_TYPE_MAX, /* Maximum number of pre-defined DSP types. */ + FMOD_DSP_TYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_DSP_TYPE; + +/* + =================================================================================================== + + FMOD built in effect parameters. + Use DSP::setParameter with these enums for the 'index' parameter. + + =================================================================================================== +*/ + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TYPE_OSCILLATOR filter. + + [REMARKS] + + [SEE_ALSO] + DSP::setParameterFloat + DSP::setParameterInt + DSP::getParameterFloat + DSP::getParameterInt + FMOD_DSP_TYPE +] +*/ +typedef enum +{ + FMOD_DSP_OSCILLATOR_TYPE, /* (Type:int) - Waveform type. 0 = sine. 1 = square. 2 = sawup. 3 = sawdown. 4 = triangle. 5 = noise. */ + FMOD_DSP_OSCILLATOR_RATE /* (Type:float) - Frequency of the sinewave in hz. 1.0 to 22000.0. Default = 220.0. */ +} FMOD_DSP_OSCILLATOR; + + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TYPE_LOWPASS filter. + + [REMARKS] + + [SEE_ALSO] + DSP::setParameterFloat + DSP::getParameterFloat + FMOD_DSP_TYPE +] +*/ +typedef enum +{ + FMOD_DSP_LOWPASS_CUTOFF, /* (Type:float) - Lowpass cutoff frequency in hz. 10.0 to 22000.0. Default = 5000.0. */ + FMOD_DSP_LOWPASS_RESONANCE /* (Type:float) - Lowpass resonance Q value. 1.0 to 10.0. Default = 1.0. */ +} FMOD_DSP_LOWPASS; + + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TYPE_ITLOWPASS filter.
    + This is different to the default FMOD_DSP_TYPE_ITLOWPASS filter in that it uses a different quality algorithm and is + the filter used to produce the correct sounding playback in .IT files.
    + FMOD Studio's .IT playback uses this filter.
    + + [REMARKS] + Note! This filter actually has a limited cutoff frequency below the specified maximum, due to its limited design, + so for a more open range filter use FMOD_DSP_LOWPASS or if you don't mind not having resonance, + FMOD_DSP_LOWPASS_SIMPLE.
    + The effective maximum cutoff is about 8060hz. + + [SEE_ALSO] + DSP::setParameterFloat + DSP::getParameterFloat + FMOD_DSP_TYPE +] +*/ +typedef enum +{ + FMOD_DSP_ITLOWPASS_CUTOFF, /* (Type:float) - Lowpass cutoff frequency in hz. 1.0 to 22000.0. Default = 5000.0/ */ + FMOD_DSP_ITLOWPASS_RESONANCE /* (Type:float) - Lowpass resonance Q value. 0.0 to 127.0. Default = 1.0. */ +} FMOD_DSP_ITLOWPASS; + + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TYPE_HIGHPASS filter. + + [REMARKS] + + [SEE_ALSO] + DSP::setParameterFloat + DSP::getParameterFloat + FMOD_DSP_TYPE +] +*/ +typedef enum +{ + FMOD_DSP_HIGHPASS_CUTOFF, /* (Type:float) - Highpass cutoff frequency in hz. 1.0 to output 22000.0. Default = 5000.0. */ + FMOD_DSP_HIGHPASS_RESONANCE /* (Type:float) - Highpass resonance Q value. 1.0 to 10.0. Default = 1.0. */ +} FMOD_DSP_HIGHPASS; + + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TYPE_ECHO filter. + + [REMARKS] + Note. Every time the delay is changed, the plugin re-allocates the echo buffer. This means the echo will dissapear at that time while it refills its new buffer.
    + Larger echo delays result in larger amounts of memory allocated.
    + + [SEE_ALSO] + DSP::setParameterFloat + DSP::getParameterFloat + FMOD_DSP_TYPE +] +*/ +typedef enum +{ + FMOD_DSP_ECHO_DELAY, /* (Type:float) - Echo delay in ms. 10 to 5000. Default = 500. */ + FMOD_DSP_ECHO_FEEDBACK, /* (Type:float) - Echo decay per delay. 0 to 100. 100.0 = No decay, 0.0 = total decay (ie simple 1 line delay). Default = 50.0. */ + FMOD_DSP_ECHO_DRYLEVEL, /* (Type:float) - Original sound volume in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_ECHO_WETLEVEL /* (Type:float) - Volume of echo signal to pass to output in dB. -80.0 to 10.0. Default = 0. */ +} FMOD_DSP_ECHO; + + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TYPE_FLANGE filter. + + [REMARKS] + Flange is an effect where the signal is played twice at the same time, and one copy slides back and forth creating a whooshing or flanging effect.
    + As there are 2 copies of the same signal, by default each signal is given 50% mix, so that the total is not louder than the original unaffected signal.
    +
    + Flange depth is a percentage of a 10ms shift from the original signal. Anything above 10ms is not considered flange because to the ear it begins to 'echo' so 10ms is the highest value possible.
    + + [SEE_ALSO] + DSP::setParameterFloat + DSP::getParameterFloat + FMOD_DSP_TYPE +] +*/ +typedef enum +{ + FMOD_DSP_FLANGE_MIX, /* (Type:float) - Percentage of wet signal in mix. 0 to 100. Default = 50. */ + FMOD_DSP_FLANGE_DEPTH, /* (Type:float) - Flange depth (percentage of 40ms delay). 0.01 to 1.0. Default = 1.0. */ + FMOD_DSP_FLANGE_RATE /* (Type:float) - Flange speed in hz. 0.0 to 20.0. Default = 0.1. */ +} FMOD_DSP_FLANGE; + + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TYPE_DISTORTION filter. + + [REMARKS] + + [SEE_ALSO] + DSP::setParameterFloat + DSP::getParameterFloat + FMOD_DSP_TYPE +] +*/ +typedef enum +{ + FMOD_DSP_DISTORTION_LEVEL /* (Type:float) - Distortion value. 0.0 to 1.0. Default = 0.5. */ +} FMOD_DSP_DISTORTION; + + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TYPE_NORMALIZE filter. + + [REMARKS] + Normalize amplifies the sound based on the maximum peaks within the signal.
    + For example if the maximum peaks in the signal were 50% of the bandwidth, it would scale the whole sound by 2.
    + The lower threshold value makes the normalizer ignores peaks below a certain point, to avoid over-amplification if a loud signal suddenly came in, and also to avoid amplifying to maximum things like background hiss.
    +
    + Because FMOD is a realtime audio processor, it doesn't have the luxury of knowing the peak for the whole sound (ie it can't see into the future), so it has to process data as it comes in.
    + To avoid very sudden changes in volume level based on small samples of new data, fmod fades towards the desired amplification which makes for smooth gain control. The fadetime parameter can control this.
    + + [SEE_ALSO] + DSP::setParameterFloat + DSP::getParameterFloat + FMOD_DSP_TYPE +] +*/ +typedef enum +{ + FMOD_DSP_NORMALIZE_FADETIME, /* (Type:float) - Time to ramp the silence to full in ms. 0.0 to 20000.0. Default = 5000.0. */ + FMOD_DSP_NORMALIZE_THRESHHOLD, /* (Type:float) - Lower volume range threshold to ignore. 0.0 to 1.0. Default = 0.1. Raise higher to stop amplification of very quiet signals. */ + FMOD_DSP_NORMALIZE_MAXAMP /* (Type:float) - Maximum amplification allowed. 1.0 to 100000.0. Default = 20.0. 1.0 = no amplifaction, higher values allow more boost. */ +} FMOD_DSP_NORMALIZE; + + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TYPE_LIMITER filter. + + [REMARKS] + + [SEE_ALSO] + DSP::setParameterFloat + DSP::getParameterFloat + FMOD_DSP_TYPE +] +*/ +typedef enum +{ + FMOD_DSP_LIMITER_RELEASETIME, /* (Type:float) - Time to ramp the silence to full in ms. 1.0 to 1000.0. Default = 10.0. */ + FMOD_DSP_LIMITER_CEILING, /* (Type:float) - Maximum level of the output signal in dB. -12.0 to 0.0. Default = 0.0. */ + FMOD_DSP_LIMITER_MAXIMIZERGAIN, /* (Type:float) - Maximum amplification allowed in dB. 0.0 to 12.0. Default = 0.0. 0.0 = no amplifaction, higher values allow more boost. */ + FMOD_DSP_LIMITER_MODE, /* (Type:float) - Channel processing mode. 0 or 1. Default = 0. 0 = Independent (limiter per channel), 1 = Linked. */ +} FMOD_DSP_LIMITER; + + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TYPE_PARAMEQ filter. + + [REMARKS] + Parametric EQ is a bandpass filter that attenuates or amplifies a selected frequency and its neighbouring frequencies.
    +
    + To create a multi-band EQ create multiple FMOD_DSP_TYPE_PARAMEQ units and set each unit to different frequencies, for example 1000hz, 2000hz, 4000hz, 8000hz, 16000hz with a range of 1 octave each.
    +
    + When a frequency has its gain set to 1.0, the sound will be unaffected and represents the original signal exactly.
    + + [SEE_ALSO] + DSP::setParameterFloat + DSP::getParameterFloat + FMOD_DSP_TYPE +] +*/ +typedef enum +{ + FMOD_DSP_PARAMEQ_CENTER, /* (Type:float) - Frequency center. 20.0 to 22000.0. Default = 8000.0. */ + FMOD_DSP_PARAMEQ_BANDWIDTH, /* (Type:float) - Octave range around the center frequency to filter. 0.2 to 5.0. Default = 1.0. */ + FMOD_DSP_PARAMEQ_GAIN /* (Type:float) - Frequency Gain in dB. -30 to 30. Default = 0. */ +} FMOD_DSP_PARAMEQ; + + + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TYPE_PITCHSHIFT filter. + + [REMARKS] + This pitch shifting unit can be used to change the pitch of a sound without speeding it up or slowing it down.
    + It can also be used for time stretching or scaling, for example if the pitch was doubled, and the frequency of the sound was halved, the pitch of the sound would sound correct but it would be twice as slow.
    +
    + Warning! This filter is very computationally expensive! Similar to a vocoder, it requires several overlapping FFT and IFFT's to produce smooth output, and can require around 440mhz for 1 stereo 48khz signal using the default settings.
    + Reducing the signal to mono will half the cpu usage.
    + Reducing this will lower audio quality, but what settings to use are largely dependant on the sound being played. A noisy polyphonic signal will need higher fft size compared to a speaking voice for example.
    +
    + This pitch shifter is based on the pitch shifter code at http://www.dspdimension.com, written by Stephan M. Bernsee.
    + The original code is COPYRIGHT 1999-2003 Stephan M. Bernsee .
    +
    + 'maxchannels' dictates the amount of memory allocated. By default, the maxchannels value is 0. If FMOD is set to stereo, the pitch shift unit will allocate enough memory for 2 channels. If it is 5.1, it will allocate enough memory for a 6 channel pitch shift, etc.
    + If the pitch shift effect is only ever applied to the global mix (ie it was added with ChannelGroup::addDSP), then 0 is the value to set as it will be enough to handle all speaker modes.
    + When the pitch shift is added to a channel (ie Channel::addDSP) then the channel count that comes in could be anything from 1 to 8 possibly. It is only in this case where you might want to increase the channel count above the output's channel count.
    + If a channel pitch shift is set to a lower number than the sound's channel count that is coming in, it will not pitch shift the sound.
    +
    + NOTE! Not supported on PlayStation 3.
    + + [SEE_ALSO] + DSP::setParameterFloat + DSP::getParameterFloat + ChannelGroup::addDSP + FMOD_DSP_TYPE +] +*/ +typedef enum +{ + FMOD_DSP_PITCHSHIFT_PITCH, /* (Type:float) - Pitch value. 0.5 to 2.0. Default = 1.0. 0.5 = one octave down, 2.0 = one octave up. 1.0 does not change the pitch. */ + FMOD_DSP_PITCHSHIFT_FFTSIZE, /* (Type:float) - FFT window size. 256, 512, 1024, 2048, 4096. Default = 1024. Increase this to reduce 'smearing'. This effect is a warbling sound similar to when an mp3 is encoded at very low bitrates. */ + FMOD_DSP_PITCHSHIFT_OVERLAP, /* (Type:float) - Removed. Do not use. FMOD now uses 4 overlaps and cannot be changed. */ + FMOD_DSP_PITCHSHIFT_MAXCHANNELS /* (Type:float) - Maximum channels supported. 0 to 16. 0 = same as fmod's default output polyphony, 1 = mono, 2 = stereo etc. See remarks for more. Default = 0. It is suggested to leave at 0! */ +} FMOD_DSP_PITCHSHIFT; + + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TYPE_CHORUS filter. + + [REMARKS] + Chorous is an effect where the sound is more 'spacious' due to 1 to 3 versions of the sound being played along side the original signal but with the pitch of each copy modulating on a sine wave.
    + + [SEE_ALSO] + DSP::setParameterFloat + DSP::getParameterFloat + FMOD_DSP_TYPE +] +*/ +typedef enum +{ + FMOD_DSP_CHORUS_MIX, /* (Type:float) - Volume of original signal to pass to output. 0.0 to 100.0. Default = 50.0. */ + FMOD_DSP_CHORUS_RATE, /* (Type:float) - Chorus modulation rate in Hz. 0.0 to 20.0. Default = 0.8 Hz. */ + FMOD_DSP_CHORUS_DEPTH, /* (Type:float) - Chorus modulation depth. 0.0 to 100.0. Default = 3.0. */ +} FMOD_DSP_CHORUS; + + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TYPE_ITECHO filter.
    + This is effectively a software based echo filter that emulates the DirectX DMO echo effect. Impulse tracker files can support this, and FMOD will produce the effect on ANY platform, not just those that support DirectX effects!
    + + [REMARKS] + Note. Every time the delay is changed, the plugin re-allocates the echo buffer. This means the echo will dissapear at that time while it refills its new buffer.
    + Larger echo delays result in larger amounts of memory allocated.
    +
    + As this is a stereo filter made mainly for IT playback, it is targeted for stereo signals.
    + With mono signals only the FMOD_DSP_ITECHO_LEFTDELAY is used.
    + For multichannel signals (>2) there will be no echo on those channels.
    + + [SEE_ALSO] + DSP::setParameterFloat + DSP::getParameterFloat + FMOD_DSP_TYPE +] +*/ +typedef enum +{ + FMOD_DSP_ITECHO_WETDRYMIX, /* (Type:float) - Ratio of wet (processed) signal to dry (unprocessed) signal. Must be in the range from 0.0 through 100.0 (all wet). Default = 50. */ + FMOD_DSP_ITECHO_FEEDBACK, /* (Type:float) - Percentage of output fed back into input, in the range from 0.0 through 100.0. Default = 50. */ + FMOD_DSP_ITECHO_LEFTDELAY, /* (Type:float) - Delay for left channel, in milliseconds, in the range from 1.0 through 2000.0. Default = 500 ms. */ + FMOD_DSP_ITECHO_RIGHTDELAY, /* (Type:float) - Delay for right channel, in milliseconds, in the range from 1.0 through 2000.0. Default = 500 ms. */ + FMOD_DSP_ITECHO_PANDELAY /* (Type:float) - Value that specifies whether to swap left and right delays with each successive echo. Ranges from 0.0 (equivalent to FALSE) to 1.0 (equivalent to TRUE), meaning no swap. Default = 0. CURRENTLY NOT SUPPORTED. */ +} FMOD_DSP_ITECHO; + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TYPE_COMPRESSOR unit. + This is a multichannel software limiter that is uniform across the whole spectrum. + + [REMARKS] + The limiter is not guaranteed to catch every peak above the threshold level, + because it cannot apply gain reduction instantaneously - the time delay is + determined by the attack time. However setting the attack time too short will + distort the sound, so it is a compromise. High level peaks can be avoided by + using a short attack time - but not too short, and setting the threshold a few + decibels below the critical level. +
    + + [SEE_ALSO] + DSP::setParameterFloat + DSP::getParameterFloat + DSP::setParameterBool + DSP::getParameterBool + FMOD_DSP_TYPE +] +*/ +typedef enum +{ + FMOD_DSP_COMPRESSOR_THRESHOLD, /* (Type:float) - Threshold level (dB) in the range from -80 through 0. Default = 0. */ + FMOD_DSP_COMPRESSOR_RATIO, /* (Type:float) - Compression Ratio (dB/dB) in the range from 1 to 50. Default = 2.5. */ + FMOD_DSP_COMPRESSOR_ATTACK, /* (Type:float) - Attack time (milliseconds), in the range from 0.1 through 1000. Default value is 20. */ + FMOD_DSP_COMPRESSOR_RELEASE, /* (Type:float) - Release time (milliseconds), in the range from 10 through 5000. Default value is 100 */ + FMOD_DSP_COMPRESSOR_GAINMAKEUP, /* (Type:float) - Make-up gain (dB) applied after limiting, in the range from 0 through 30. Default = 0. */ + FMOD_DSP_COMPRESSOR_USESIDECHAIN, /* (Type:data) - Data of type FMOD_DSP_PARAMETER_SIDECHAIN. Whether to analyse the sidechain signal instead of the input signal. Default is { false } */ + FMOD_DSP_COMPRESSOR_LINKED /* (Type:bool) - FALSE = Independent (compressor per channel), TRUE = Linked. Default = TRUE. */ +} FMOD_DSP_COMPRESSOR; + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TYPE_SFXREVERB unit.
    + + [REMARKS] + This is a high quality I3DL2 based reverb.
    + On top of the I3DL2 property set, "Dry Level" is also included to allow the dry mix to be changed.
    +
    + These properties can be set with presets in FMOD_REVERB_PRESETS. + + [SEE_ALSO] + DSP::setParameterFloat + DSP::getParameterFloat + FMOD_DSP_TYPE + FMOD_REVERB_PRESETS +] +*/ +typedef enum +{ + FMOD_DSP_SFXREVERB_DECAYTIME, /* (Type:float) - Decay Time : Reverberation decay time at low-frequencies in milliseconds. Ranges from 100.0 to 20000.0. Default is 1500. */ + FMOD_DSP_SFXREVERB_EARLYDELAY, /* (Type:float) - Early Delay : Delay time of first reflection in milliseconds. Ranges from 0.0 to 300.0. Default is 20. */ + FMOD_DSP_SFXREVERB_LATEDELAY, /* (Type:float) - Reverb Delay : Late reverberation delay time relative to first reflection in milliseconds. Ranges from 0.0 to 100.0. Default is 40. */ + FMOD_DSP_SFXREVERB_HFREFERENCE, /* (Type:float) - HF Reference : Reference frequency for high-frequency decay in Hz. Ranges from 20.0 to 20000.0. Default is 5000. */ + FMOD_DSP_SFXREVERB_HFDECAYRATIO, /* (Type:float) - Decay HF Ratio : High-frequency decay time relative to decay time in percent. Ranges from 10.0 to 100.0. Default is 50. */ + FMOD_DSP_SFXREVERB_DIFFUSION, /* (Type:float) - Diffusion : Reverberation diffusion (echo density) in percent. Ranges from 0.0 to 100.0. Default is 100. */ + FMOD_DSP_SFXREVERB_DENSITY, /* (Type:float) - Density : Reverberation density (modal density) in percent. Ranges from 0.0 to 100.0. Default is 100. */ + FMOD_DSP_SFXREVERB_LOWSHELFFREQUENCY, /* (Type:float) - Low Shelf Frequency : Transition frequency of low-shelf filter in Hz. Ranges from 20.0 to 1000.0. Default is 250. */ + FMOD_DSP_SFXREVERB_LOWSHELFGAIN, /* (Type:float) - Low Shelf Gain : Gain of low-shelf filter in dB. Ranges from -36.0 to 12.0. Default is 0. */ + FMOD_DSP_SFXREVERB_HIGHCUT, /* (Type:float) - High Cut : Cutoff frequency of low-pass filter in Hz. Ranges from 20.0 to 20000.0. Default is 20000. */ + FMOD_DSP_SFXREVERB_EARLYLATEMIX, /* (Type:float) - Early/Late Mix : Blend ratio of late reverb to early reflections in percent. Ranges from 0.0 to 100.0. Default is 50. */ + FMOD_DSP_SFXREVERB_WETLEVEL, /* (Type:float) - Wet Level : Reverb signal level in dB. Ranges from -80.0 to 20.0. Default is -6. */ + FMOD_DSP_SFXREVERB_DRYLEVEL /* (Type:float) - Dry Level : Dry signal level in dB. Ranges from -80.0 to 20.0. Default is 0. */ +} FMOD_DSP_SFXREVERB; + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TYPE_LOWPASS_SIMPLE filter.
    + This is a very simple low pass filter, based on two single-pole RC time-constant modules. + The emphasis is on speed rather than accuracy, so this should not be used for task requiring critical filtering.
    + + [REMARKS] + + [SEE_ALSO] + DSP::setParameterFloat + DSP::getParameterFloat + FMOD_DSP_TYPE +] +*/ +typedef enum +{ + FMOD_DSP_LOWPASS_SIMPLE_CUTOFF /* (Type:float) - Lowpass cutoff frequency in hz. 10.0 to 22000.0. Default = 5000.0 */ +} FMOD_DSP_LOWPASS_SIMPLE; + + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TYPE_DELAY filter. + + [REMARKS] + Note. Every time MaxDelay is changed, the plugin re-allocates the delay buffer. This means the delay will dissapear at that time while it refills its new buffer.
    + A larger MaxDelay results in larger amounts of memory allocated.
    + Channel delays above MaxDelay will be clipped to MaxDelay and the delay buffer will not be resized.
    +
    + NOTE! Not supported on PlayStation 3. + + [SEE_ALSO] + DSP::setParameterFloat + DSP::getParameterFloat + FMOD_DSP_TYPE +] +*/ +typedef enum +{ + FMOD_DSP_DELAY_CH0, /* (Type:float) - Channel #0 Delay in ms. 0 to 10000. Default = 0. */ + FMOD_DSP_DELAY_CH1, /* (Type:float) - Channel #1 Delay in ms. 0 to 10000. Default = 0. */ + FMOD_DSP_DELAY_CH2, /* (Type:float) - Channel #2 Delay in ms. 0 to 10000. Default = 0. */ + FMOD_DSP_DELAY_CH3, /* (Type:float) - Channel #3 Delay in ms. 0 to 10000. Default = 0. */ + FMOD_DSP_DELAY_CH4, /* (Type:float) - Channel #4 Delay in ms. 0 to 10000. Default = 0. */ + FMOD_DSP_DELAY_CH5, /* (Type:float) - Channel #5 Delay in ms. 0 to 10000. Default = 0. */ + FMOD_DSP_DELAY_CH6, /* (Type:float) - Channel #6 Delay in ms. 0 to 10000. Default = 0. */ + FMOD_DSP_DELAY_CH7, /* (Type:float) - Channel #7 Delay in ms. 0 to 10000. Default = 0. */ + FMOD_DSP_DELAY_CH8, /* (Type:float) - Channel #8 Delay in ms. 0 to 10000. Default = 0. */ + FMOD_DSP_DELAY_CH9, /* (Type:float) - Channel #9 Delay in ms. 0 to 10000. Default = 0. */ + FMOD_DSP_DELAY_CH10, /* (Type:float) - Channel #10 Delay in ms. 0 to 10000. Default = 0. */ + FMOD_DSP_DELAY_CH11, /* (Type:float) - Channel #11 Delay in ms. 0 to 10000. Default = 0. */ + FMOD_DSP_DELAY_CH12, /* (Type:float) - Channel #12 Delay in ms. 0 to 10000. Default = 0. */ + FMOD_DSP_DELAY_CH13, /* (Type:float) - Channel #13 Delay in ms. 0 to 10000. Default = 0. */ + FMOD_DSP_DELAY_CH14, /* (Type:float) - Channel #14 Delay in ms. 0 to 10000. Default = 0. */ + FMOD_DSP_DELAY_CH15, /* (Type:float) - Channel #15 Delay in ms. 0 to 10000. Default = 0. */ + FMOD_DSP_DELAY_MAXDELAY /* (Type:float) - Maximum delay in ms. 0 to 10000. Default = 10. */ +} FMOD_DSP_DELAY; + + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TYPE_TREMOLO filter. + + [REMARKS] + The tremolo effect varies the amplitude of a sound. Depending on the settings, this unit can produce a tremolo, chopper or auto-pan effect.
    +
    + The shape of the LFO (low freq. oscillator) can morphed between sine, triangle and sawtooth waves using the FMOD_DSP_TREMOLO_SHAPE and FMOD_DSP_TREMOLO_SKEW parameters.
    + FMOD_DSP_TREMOLO_DUTY and FMOD_DSP_TREMOLO_SQUARE are useful for a chopper-type effect where the first controls the on-time duration and second controls the flatness of the envelope.
    + FMOD_DSP_TREMOLO_SPREAD varies the LFO phase between channels to get an auto-pan effect. This works best with a sine shape LFO.
    + The LFO can be synchronized using the FMOD_DSP_TREMOLO_PHASE parameter which sets its instantaneous phase.
    + + [SEE_ALSO] + DSP::setParameterFloat + DSP::getParameterFloat + FMOD_DSP_TYPE +] +*/ +typedef enum +{ + FMOD_DSP_TREMOLO_FREQUENCY, /* (Type:float) - LFO frequency in Hz. 0.1 to 20. Default = 5. */ + FMOD_DSP_TREMOLO_DEPTH, /* (Type:float) - Tremolo depth. 0 to 1. Default = 1. */ + FMOD_DSP_TREMOLO_SHAPE, /* (Type:float) - LFO shape morph between triangle and sine. 0 to 1. Default = 0. */ + FMOD_DSP_TREMOLO_SKEW, /* (Type:float) - Time-skewing of LFO cycle. -1 to 1. Default = 0. */ + FMOD_DSP_TREMOLO_DUTY, /* (Type:float) - LFO on-time. 0 to 1. Default = 0.5. */ + FMOD_DSP_TREMOLO_SQUARE, /* (Type:float) - Flatness of the LFO shape. 0 to 1. Default = 0. */ + FMOD_DSP_TREMOLO_PHASE, /* (Type:float) - Instantaneous LFO phase. 0 to 1. Default = 0. */ + FMOD_DSP_TREMOLO_SPREAD /* (Type:float) - Rotation / auto-pan effect. -1 to 1. Default = 0. */ +} FMOD_DSP_TREMOLO; + + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TYPE_SEND DSP. + + [REMARKS] + + [SEE_ALSO] + DSP::setParameterInt + DSP::getParameterInt + DSP::setParameterFloat + DSP::getParameterFloat + FMOD_DSP_TYPE +] +*/ +typedef enum +{ + FMOD_DSP_SEND_RETURNID, /* (Type:int) - ID of the Return DSP this send is connected to (integer values only). -1 indicates no connected Return DSP. Default = -1. */ + FMOD_DSP_SEND_LEVEL, /* (Type:float) - Send level. 0.0 to 1.0. Default = 1.0 */ +} FMOD_DSP_SEND; + + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TYPE_RETURN DSP. + + [REMARKS] + + [SEE_ALSO] + DSP::setParameterInt + DSP::getParameterInt + FMOD_DSP_TYPE +] +*/ +typedef enum +{ + FMOD_DSP_RETURN_ID, /* (Type:int) - [r] ID of this Return DSP. Read-only. Default = -1. */ + FMOD_DSP_RETURN_INPUT_SPEAKER_MODE /* (Type:int) - [r/w] Input speaker mode of this return. Default = FMOD_SPEAKERMODE_DEFAULT. */ +} FMOD_DSP_RETURN; + + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TYPE_HIGHPASS_SIMPLE filter.
    + This is a very simple single-order high pass filter. + The emphasis is on speed rather than accuracy, so this should not be used for task requiring critical filtering.
    + + [REMARKS] + + [SEE_ALSO] + DSP::setParameterFloat + DSP::getParameterFloat + FMOD_DSP_TYPE +] +*/ +typedef enum +{ + FMOD_DSP_HIGHPASS_SIMPLE_CUTOFF /* (Type:float) - Highpass cutoff frequency in hz. 10.0 to 22000.0. Default = 1000.0 */ +} FMOD_DSP_HIGHPASS_SIMPLE; + + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter values for the FMOD_DSP_PAN_SURROUND_FROM_STEREO_MODE parameter of the FMOD_DSP_TYPE_PAN DSP. + + [REMARKS] + + [SEE_ALSO] + FMOD_DSP_PAN +] +*/ +typedef enum +{ + FMOD_DSP_PAN_SURROUND_FROM_STEREO_MODE_DISTRIBUTED, + FMOD_DSP_PAN_SURROUND_FROM_STEREO_MODE_DISCRETE +} FMOD_DSP_PAN_SURROUND_FROM_STEREO_MODE_TYPE; + + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter values for the FMOD_DSP_PAN_MODE parameter of the FMOD_DSP_TYPE_PAN DSP. + + [REMARKS] + + [SEE_ALSO] + FMOD_DSP_PAN +] +*/ +typedef enum +{ + FMOD_DSP_PAN_MODE_MONO, + FMOD_DSP_PAN_MODE_STEREO, + FMOD_DSP_PAN_MODE_SURROUND +} FMOD_DSP_PAN_MODE_TYPE; + + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter values for the FMOD_DSP_PAN_3D_ROLLOFF parameter of the FMOD_DSP_TYPE_PAN DSP. + + [REMARKS] + + [SEE_ALSO] + FMOD_DSP_PAN +] +*/ +typedef enum +{ + FMOD_DSP_PAN_3D_ROLLOFF_LINEARSQUARED, + FMOD_DSP_PAN_3D_ROLLOFF_LINEAR, + FMOD_DSP_PAN_3D_ROLLOFF_INVERSE, + FMOD_DSP_PAN_3D_ROLLOFF_INVERSETAPERED, + FMOD_DSP_PAN_3D_ROLLOFF_CUSTOM +} FMOD_DSP_PAN_3D_ROLLOFF_TYPE; + + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter values for the FMOD_DSP_PAN_3D_EXTENT_MODE parameter of the FMOD_DSP_TYPE_PAN DSP. + + [REMARKS] + + [SEE_ALSO] + FMOD_DSP_PAN +] +*/ +typedef enum +{ + FMOD_DSP_PAN_3D_EXTENT_MODE_AUTO, + FMOD_DSP_PAN_3D_EXTENT_MODE_USER, + FMOD_DSP_PAN_3D_EXTENT_MODE_OFF +} FMOD_DSP_PAN_3D_EXTENT_MODE_TYPE; + + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TYPE_PAN DSP. + + [REMARKS] + FMOD_DSP_PAN_3D_PAN_BLEND controls the percentage of the effect supplied by FMOD_DSP_PAN_SURROUND_DIRECTION and FMOD_DSP_PAN_SURROUND_EXTENT. + + [SEE_ALSO] + DSP::setParameterFloat + DSP::getParameterFloat + DSP::setParameterInt + DSP::getParameterInt + DSP::setParameterData + DSP::getParameterData + FMOD_DSP_TYPE +] +*/ +typedef enum +{ + FMOD_DSP_PAN_MODE, /* (Type:int) - Panner mode. FMOD_DSP_PAN_MODE_MONO for mono down-mix, FMOD_DSP_PAN_MODE_STEREO for stereo panning or FMOD_DSP_PAN_MODE_SURROUND for surround panning. Default = FMOD_DSP_PAN_MODE_SURROUND */ + FMOD_DSP_PAN_STEREO_POSITION, /* (Type:float) - Stereo pan position. -100.0 to 100.0. Default = 0.0. */ + FMOD_DSP_PAN_SURROUND_DIRECTION, /* (Type:float) - Surround pan direction. -180.0 (degrees) to 180.0 (degrees). Default = 0.0. */ + FMOD_DSP_PAN_SURROUND_EXTENT, /* (Type:float) - Surround pan extent. 0.0 (degrees) to 360.0 (degrees). Distance from center point of panning circle. Default = 360.0. */ + FMOD_DSP_PAN_SURROUND_ROTATION, /* (Type:float) - Surround pan rotation. -180.0 (degrees) to 180.0 (degrees). Default = 0.0. */ + FMOD_DSP_PAN_SURROUND_LFE_LEVEL, /* (Type:float) - Surround pan LFE level. -80.0 (db) to 20.0 (db). Default = 0.0. */ + FMOD_DSP_PAN_SURROUND_FROM_STEREO_MODE, /* (Type:int) - Stereo-To-Surround Mode. FMOD_DSP_PAN_SURROUND_FROM_STEREO_MODE_DISTRIBUTED to FMOD_DSP_PAN_SURROUND_FROM_STEREO_MODE_DISCRETE. Default = FMOD_DSP_PAN_SURROUND_FROM_STEREO_MODE_DISCRETE. */ + FMOD_DSP_PAN_SURROUND_STEREO_SEPARATION, /* (Type:float) - Stereo-To-Surround Stereo Separation. -180.0 (degrees) to +180.0 (degrees). Default = 60.0. */ + FMOD_DSP_PAN_SURROUND_STEREO_AXIS, /* (Type:float) - Stereo-To-Surround Stereo Axis. -180.0 (degrees) to +180.0 (degrees). Default = 0.0. */ + FMOD_DSP_PAN_ENABLED_SURROUND_SPEAKERS, /* (Type:int) - Surround Speakers Enabled. 0 to 0xFFF. Default = 0xFFF. */ + FMOD_DSP_PAN_3D_POSITION, /* (Type:data) - 3D Position. data of type FMOD_DSP_PARAMETER_3DATTRIBUTES_MULTI */ + FMOD_DSP_PAN_3D_ROLLOFF, /* (Type:int) - 3D Rolloff. FMOD_DSP_PAN_3D_ROLLOFF_LINEARSQUARED to FMOD_DSP_PAN_3D_ROLLOFF_CUSTOM. Default = FMOD_DSP_PAN_3D_ROLLOFF_LINEARSQUARED. */ + FMOD_DSP_PAN_3D_MIN_DISTANCE, /* (Type:float) - 3D Min Distance. 0.0 to 1e+19f. Default = 1.0. */ + FMOD_DSP_PAN_3D_MAX_DISTANCE, /* (Type:float) - 3D Max Distance. 0.0 to 1e+19f. Default = 20.0. */ + FMOD_DSP_PAN_3D_EXTENT_MODE, /* (Type:int) - 3D Extent Mode. FMOD_DSP_PAN_3D_EXTENT_MODE_AUTO to FMOD_DSP_PAN_3D_EXTENT_MODE_OFF. Default = FMOD_DSP_PAN_3D_EXTENT_MODE_AUTO. */ + FMOD_DSP_PAN_3D_SOUND_SIZE, /* (Type:float) - 3D Sound Size. 0.0 to 1e+19f. Default = 0.0. */ + FMOD_DSP_PAN_3D_MIN_EXTENT, /* (Type:float) - 3D Min Extent. 0.0 (degrees) to 360.0 (degrees). Default = 0.0. */ + FMOD_DSP_PAN_3D_PAN_BLEND, /* (Type:float) - 3D Pan Blend. 0.0 (fully 2D) to 1.0 (fully 3D). Default = 0.0. */ + FMOD_DSP_PAN_LFE_UPMIX_ENABLED, /* (Type:int) - LFE Upmix Enabled. 0 to 1. Default = 0. */ + FMOD_DSP_PAN_OVERALL_GAIN, /* (Type:data) - Overall gain. data of type FMOD_DSP_PARAMETER_DATA_TYPE_OVERALLGAIN */ + FMOD_DSP_PAN_SURROUND_SPEAKER_MODE /* (Type:int) - Surround speaker mode. Target speaker mode for surround panning. Default = FMOD_SPEAKERMODE_DEFAULT. */ +} FMOD_DSP_PAN; + + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter values for the FMOD_DSP_THREE_EQ_CROSSOVERSLOPE parameter of the FMOD_DSP_TYPE_THREE_EQ DSP. + + [REMARKS] + + [SEE_ALSO] + FMOD_DSP_THREE_EQ +] +*/ +typedef enum +{ + FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_12DB, + FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_24DB, + FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_48DB +} FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_TYPE; + + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TYPE_THREE_EQ filter. + + [REMARKS] + + [SEE_ALSO] + DSP::setParameterFloat + DSP::getParameterFloat + DSP::setParameterInt + DSP::getParameterInt + FMOD_DSP_TYPE + FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_TYPE +] +*/ +typedef enum +{ + FMOD_DSP_THREE_EQ_LOWGAIN, /* (Type:float) - Low frequency gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_THREE_EQ_MIDGAIN, /* (Type:float) - Mid frequency gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_THREE_EQ_HIGHGAIN, /* (Type:float) - High frequency gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_THREE_EQ_LOWCROSSOVER, /* (Type:float) - Low-to-mid crossover frequency in Hz. 10.0 to 22000.0. Default = 400.0. */ + FMOD_DSP_THREE_EQ_HIGHCROSSOVER, /* (Type:float) - Mid-to-high crossover frequency in Hz. 10.0 to 22000.0. Default = 4000.0. */ + FMOD_DSP_THREE_EQ_CROSSOVERSLOPE /* (Type:int) - Crossover Slope. 0 = 12dB/Octave, 1 = 24dB/Octave, 2 = 48dB/Octave. Default = 1 (24dB/Octave). */ +} FMOD_DSP_THREE_EQ; + + +/* +[ENUM] +[ + [DESCRIPTION] + List of windowing methods for the FMOD_DSP_TYPE_FFT unit. Used in spectrum analysis to reduce leakage / transient signals intefering with the analysis.
    + This is a problem with analysis of continuous signals that only have a small portion of the signal sample (the fft window size).
    + Windowing the signal with a curve or triangle tapers the sides of the fft window to help alleviate this problem. + + [REMARKS] + Cyclic signals such as a sine wave that repeat their cycle in a multiple of the window size do not need windowing.
    + I.e. If the sine wave repeats every 1024, 512, 256 etc samples and the FMOD fft window is 1024, then the signal would not need windowing.
    + Not windowing is the same as FMOD_DSP_FFT_WINDOW_RECT, which is the default.
    + If the cycle of the signal (ie the sine wave) is not a multiple of the window size, it will cause frequency abnormalities, so a different windowing method is needed.
    + +
    + FMOD_DSP_FFT_WINDOW_RECT.
    +
    +
    + FMOD_DSP_FFT_WINDOW_TRIANGLE.
    +
    +
    + FMOD_DSP_FFT_WINDOW_HAMMING.
    +
    +
    + FMOD_DSP_FFT_WINDOW_HANNING.
    +
    +
    + FMOD_DSP_FFT_WINDOW_BLACKMAN.
    +
    +
    + FMOD_DSP_FFT_WINDOW_BLACKMANHARRIS.
    + +
    + + [SEE_ALSO] + FMOD_DSP_FFT +] +*/ +typedef enum +{ + FMOD_DSP_FFT_WINDOW_RECT, /* w[n] = 1.0 */ + FMOD_DSP_FFT_WINDOW_TRIANGLE, /* w[n] = TRI(2n/N) */ + FMOD_DSP_FFT_WINDOW_HAMMING, /* w[n] = 0.54 - (0.46 * COS(n/N) ) */ + FMOD_DSP_FFT_WINDOW_HANNING, /* w[n] = 0.5 * (1.0 - COS(n/N) ) */ + FMOD_DSP_FFT_WINDOW_BLACKMAN, /* w[n] = 0.42 - (0.5 * COS(n/N) ) + (0.08 * COS(2.0 * n/N) ) */ + FMOD_DSP_FFT_WINDOW_BLACKMANHARRIS /* w[n] = 0.35875 - (0.48829 * COS(1.0 * n/N)) + (0.14128 * COS(2.0 * n/N)) - (0.01168 * COS(3.0 * n/N)) */ +} FMOD_DSP_FFT_WINDOW; + + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TYPE_FFT dsp effect. + + [REMARKS] + Set the attributes for the spectrum analysis with FMOD_DSP_FFT_WINDOWSIZE and FMOD_DSP_FFT_WINDOWTYPE, and retrieve the results with FMOD_DSP_FFT_SPECTRUM and FMOD_DSP_FFT_DOMINANT_FREQ. + FMOD_DSP_FFT_SPECTRUM stores its data in the FMOD_DSP_PARAMETER_DATA_TYPE_FFT. You will need to cast to this structure to get the right data. + + [SEE_ALSO] + DSP::setParameterFloat + DSP::getParameterFloat + DSP::setParameterInt + DSP::getParameterInt + DSP::setParameterData + DSP::getParameterData + FMOD_DSP_TYPE + FMOD_DSP_FFT_WINDOW +] +*/ +typedef enum +{ + FMOD_DSP_FFT_WINDOWSIZE, /* (Type:int) - [r/w] Must be a power of 2 between 128 and 16384. 128, 256, 512, 1024, 2048, 4096, 8192, 16384 are accepted. Default = 2048. */ + FMOD_DSP_FFT_WINDOWTYPE, /* (Type:int) - [r/w] Refer to FMOD_DSP_FFT_WINDOW enumeration. Default = FMOD_DSP_FFT_WINDOW_HAMMING. */ + FMOD_DSP_FFT_SPECTRUMDATA, /* (Type:data) - [r] Returns the current spectrum values between 0 and 1 for each 'fft bin'. Cast data to FMOD_DSP_PARAMETER_DATA_TYPE_FFT. Divide the niquist rate by the window size to get the hz value per entry. */ + FMOD_DSP_FFT_DOMINANT_FREQ /* (Type:float) - [r] Returns the dominant frequencies for each channel. */ +} FMOD_DSP_FFT; + + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TYPE_ENVELOPEFOLLOWER unit. + This is a simple envelope follower for tracking the signal level.
    + + [REMARKS] + This unit does not affect the incoming signal +
    + + [SEE_ALSO] + DSP::setParameterFloat + DSP::getParameterFloat + DSP::setParameterData + DSP::getParameterData + FMOD_DSP_TYPE +] +*/ +typedef enum +{ + FMOD_DSP_ENVELOPEFOLLOWER_ATTACK, /* (Type:float) [r/w] - Attack time (milliseconds), in the range from 0.1 through 1000. Default = 20. */ + FMOD_DSP_ENVELOPEFOLLOWER_RELEASE, /* (Type:float) [r/w] - Release time (milliseconds), in the range from 10 through 5000. Default = 100 */ + FMOD_DSP_ENVELOPEFOLLOWER_ENVELOPE, /* (Type:float) [r] - Current value of the envelope, in the range 0 to 1. Read-only. */ + FMOD_DSP_ENVELOPEFOLLOWER_USESIDECHAIN /* (Type:data) [r/w] - Data of type FMOD_DSP_PARAMETER_SIDECHAIN. Whether to analyse the sidechain signal instead of the input signal. Default is { false } */ +} FMOD_DSP_ENVELOPEFOLLOWER; + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TYPE_CONVOLUTIONREVERB filter. + + [REMARKS] + Convolution Reverb reverb IR.
    + + [SEE_ALSO] + DSP::setParameterFloat + DSP::getParameterFloat + DSP::setParameterData + DSP::getParameterData + FMOD_DSP_TYPE +] +*/ +typedef enum +{ + FMOD_DSP_CONVOLUTION_REVERB_PARAM_IR, /* (Type:data) - [w] 16-bit reverb IR (short*) with an extra sample prepended to the start which specifies the number of channels. */ + FMOD_DSP_CONVOLUTION_REVERB_PARAM_WET, /* (Type:float) - [r/w] Volume of echo signal to pass to output in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CONVOLUTION_REVERB_PARAM_DRY /* (Type:float) - [r/w] Original sound volume in dB. -80.0 to 10.0. Default = 0. */ +} FMOD_DSP_CONVOLUTION_REVERB; + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_CHANNELMIX_OUTPUTGROUPING parameter for FMOD_DSP_TYPE_CHANNELMIX effect. + + [REMARKS] + + [SEE_ALSO] + DSP::setParameterInt + DSP::getParameterInt + FMOD_DSP_TYPE +] +*/ +typedef enum +{ + FMOD_DSP_CHANNELMIX_OUTPUT_DEFAULT, /* Output channel count = input channel count. Mapping: See FMOD_SPEAKER enumeration. */ + FMOD_DSP_CHANNELMIX_OUTPUT_ALLMONO, /* Output channel count = 1. Mapping: Mono, Mono, Mono, Mono, Mono, Mono, ... (each channel all the way up to FMOD_MAX_CHANNEL_WIDTH channels are treated as if they were mono) */ + FMOD_DSP_CHANNELMIX_OUTPUT_ALLSTEREO, /* Output channel count = 2. Mapping: Left, Right, Left, Right, Left, Right, ... (each pair of channels is treated as stereo all the way up to FMOD_MAX_CHANNEL_WIDTH channels) */ + FMOD_DSP_CHANNELMIX_OUTPUT_ALLQUAD, /* Output channel count = 4. Mapping: Repeating pattern of Front Left, Front Right, Surround Left, Surround Right. */ + FMOD_DSP_CHANNELMIX_OUTPUT_ALL5POINT1, /* Output channel count = 6. Mapping: Repeating pattern of Front Left, Front Right, Center, LFE, Surround Left, Surround Right. */ + FMOD_DSP_CHANNELMIX_OUTPUT_ALL7POINT1, /* Output channel count = 8. Mapping: Repeating pattern of Front Left, Front Right, Center, LFE, Surround Left, Surround Right, Back Left, Back Right. */ + FMOD_DSP_CHANNELMIX_OUTPUT_ALLLFE /* Output channel count = 6. Mapping: Repeating pattern of LFE in a 5.1 output signal. */ +} FMOD_DSP_CHANNELMIX_OUTPUT; + +#define FMOD_DSP_CHANNELGAIN_OUTPUT_DEFAULT FMOD_DSP_CHANNELMIX_OUTPUT_DEFAULT // Deprecated. Please use FMOD_DSP_CHANNELMIX_OUTPUT_DEFAULT. +#define FMOD_DSP_CHANNELGAIN_OUTPUT_ALLMONO FMOD_DSP_CHANNELMIX_OUTPUT_ALLMONO // Deprecated. Please use FMOD_DSP_CHANNELMIX_OUTPUT_ALLMONO. +#define FMOD_DSP_CHANNELGAIN_OUTPUT_ALLSTEREO FMOD_DSP_CHANNELMIX_OUTPUT_ALLSTEREO // Deprecated. Please use FMOD_DSP_CHANNELMIX_OUTPUT_ALLSTEREO. +#define FMOD_DSP_CHANNELGAIN_OUTPUT_ALLQUAD FMOD_DSP_CHANNELMIX_OUTPUT_ALLQUAD // Deprecated. Please use FMOD_DSP_CHANNELMIX_OUTPUT_ALLQUAD. +#define FMOD_DSP_CHANNELGAIN_OUTPUT_ALL5POINT1 FMOD_DSP_CHANNELMIX_OUTPUT_ALL5POINT1 // Deprecated. Please use FMOD_DSP_CHANNELMIX_OUTPUT_ALL5POINT1. +#define FMOD_DSP_CHANNELGAIN_OUTPUT_ALL7POINT1 FMOD_DSP_CHANNELMIX_OUTPUT_ALL7POINT1 // Deprecated. Please use FMOD_DSP_CHANNELMIX_OUTPUT_ALL7POINT1. +#define FMOD_DSP_CHANNELGAIN_OUTPUT_ALLLFE FMOD_DSP_CHANNELMIX_OUTPUT_ALLLFE // Deprecated. Please use FMOD_DSP_CHANNELMIX_OUTPUT_ALLLFE. + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TYPE_CHANNELMIX filter. + + [REMARKS] + For FMOD_DSP_CHANNELMIX_OUTPUTGROUPING, this value will set the output speaker format for the DSP, and also map the incoming channels to the + outgoing channels in a round-robin fashion. Use this for example play a 32 channel input signal as if it were a repeating group of output signals. + Ie. + FMOD_DSP_CHANNELMIX_OUTPUT_ALLMONO = all incoming channels are mixed to a mono output. + FMOD_DSP_CHANNELMIX_OUTPUT_ALLSTEREO = all incoming channels are mixed to a stereo output, ie even incoming channels 0,2,4,6,etc are mixed to left, and odd incoming channels 1,3,5,7,etc are mixed to right. + FMOD_DSP_CHANNELMIX_OUTPUT_ALL5POINT1 = all incoming channels are mixed to a 5.1 output. If there are less than 6 coming in, it will just fill the first n channels in the 6 output channels. + If there are more, then it will repeat the input pattern to the output like it did with the stereo case, ie 12 incoming channels are mapped as 0-5 mixed to the + 5.1 output and 6 to 11 mapped to the 5.1 output. + FMOD_DSP_CHANNELMIX_OUTPUT_ALLLFE = all incoming channels are mixed to a 5.1 output but via the LFE channel only. + + [SEE_ALSO] + DSP::setParameterInt + DSP::getParameterInt + DSP::setParameterFloat + DSP::getParameterFloat + FMOD_DSP_TYPE +] +*/ +typedef enum +{ + FMOD_DSP_CHANNELMIX_OUTPUTGROUPING, /* (Type:int) - Refer to FMOD_DSP_CHANNELMIX_OUTPUT enumeration. Default = FMOD_DSP_CHANNELMIX_OUTPUT_DEFAULT. See remarks. */ + FMOD_DSP_CHANNELMIX_GAIN_CH0, /* (Type:float) - Channel #0 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH1, /* (Type:float) - Channel #1 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH2, /* (Type:float) - Channel #2 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH3, /* (Type:float) - Channel #3 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH4, /* (Type:float) - Channel #4 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH5, /* (Type:float) - Channel #5 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH6, /* (Type:float) - Channel #6 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH7, /* (Type:float) - Channel #7 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH8, /* (Type:float) - Channel #8 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH9, /* (Type:float) - Channel #9 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH10, /* (Type:float) - Channel #10 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH11, /* (Type:float) - Channel #11 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH12, /* (Type:float) - Channel #12 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH13, /* (Type:float) - Channel #13 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH14, /* (Type:float) - Channel #14 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH15, /* (Type:float) - Channel #15 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH16, /* (Type:float) - Channel #16 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH17, /* (Type:float) - Channel #17 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH18, /* (Type:float) - Channel #18 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH19, /* (Type:float) - Channel #19 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH20, /* (Type:float) - Channel #20 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH21, /* (Type:float) - Channel #21 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH22, /* (Type:float) - Channel #22 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH23, /* (Type:float) - Channel #23 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH24, /* (Type:float) - Channel #24 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH25, /* (Type:float) - Channel #25 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH26, /* (Type:float) - Channel #26 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH27, /* (Type:float) - Channel #27 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH28, /* (Type:float) - Channel #28 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH29, /* (Type:float) - Channel #29 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH30, /* (Type:float) - Channel #30 gain in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_CHANNELMIX_GAIN_CH31 /* (Type:float) - Channel #31 gain in dB. -80.0 to 10.0. Default = 0. */ +} FMOD_DSP_CHANNELMIX; + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TRANSCEIVER_SPEAKERMODE parameter for FMOD_DSP_TYPE_TRANSCEIVER effect. + + [REMARKS] + The speaker mode of a transceiver buffer (of which there are up to 32 of) is determined automatically depending on the signal flowing through the transceiver effect, or it can be forced. + Use a smaller fixed speaker mode buffer to save memory. + + Only relevant for transmitter dsps, as they control the format of the transceiver channel's buffer. + + If multiple transceivers transmit to a single buffer in different speaker modes, it will allocate memory for each speaker mode. This uses more memory than a single speaker mode. + If there are multiple receivers reading from a channel with multiple speaker modes, it will read them all and mix them together. + + If the system's speaker mode is stereo or mono, it will not create a 3rd buffer, it will just use the mono/stereo speaker mode buffer. + + [SEE_ALSO] + DSP::setParameterInt + DSP::getParameterInt + FMOD_DSP_TYPE +] +*/ +typedef enum +{ + FMOD_DSP_TRANSCEIVER_SPEAKERMODE_AUTO = -1, /* A transmitter will use whatever signal channel count coming in to the transmitter, to determine which speaker mode is allocated for the transceiver channel. */ + FMOD_DSP_TRANSCEIVER_SPEAKERMODE_MONO = 0, /* A transmitter will always downmix to a mono channel buffer. */ + FMOD_DSP_TRANSCEIVER_SPEAKERMODE_STEREO, /* A transmitter will always upmix or downmix to a stereo channel buffer. */ + FMOD_DSP_TRANSCEIVER_SPEAKERMODE_SURROUND, /* A transmitter will always upmix or downmix to a surround channel buffer. Surround is the speaker mode of the system above stereo, so could be quad/surround/5.1/7.1. */ +} FMOD_DSP_TRANSCEIVER_SPEAKERMODE; + + +/* +[ENUM] +[ + [DESCRIPTION] + Parameter types for the FMOD_DSP_TYPE_TRANSCEIVER filter. + + [REMARKS] + The transceiver only transmits and receives to a global array of 32 channels. The transceiver can be set to receiver mode (like a return) and can receive the signal at a variable gain (FMOD_DSP_TRANSCEIVER_GAIN). + The transceiver can also be set to transmit to a chnnel (like a send) and can transmit the signal with a variable gain (FMOD_DSP_TRANSCEIVER_GAIN). + + The FMOD_DSP_TRANSCEIVER_TRANSMITSPEAKERMODE is only applicable to the transmission format, not the receive format. This means this parameter is ignored in 'receive mode'. This allows receivers to receive at + the speaker mode of the user's choice. Receiving from a mono channel, is cheaper than receiving from a surround channel for example. + The 3 speaker modes FMOD_DSP_TRANSCEIVER_SPEAKERMODE_MONO, FMOD_DSP_TRANSCEIVER_SPEAKERMODE_STEREO, FMOD_DSP_TRANSCEIVER_SPEAKERMODE_SURROUND are stored as seperate buffers in memory for a tranmitter channel. + To save memory, use 1 common speaker mode for a transmitter. + + The transceiver is double buffered to avoid desyncing of transmitters and receivers. This means there will be a 1 block delay on a receiver, compared to the data sent from a transmitter. + + Multiple transmitters sending to the same channel will be mixed together. + + [SEE_ALSO] + DSP::setParameterFloat + DSP::getParameterFloat + DSP::setParameterInt + DSP::getParameterInt + DSP::setParameterBool + DSP::getParameterBool + FMOD_DSP_TYPE +] +*/ +typedef enum +{ + FMOD_DSP_TRANSCEIVER_TRANSMIT, /* (Type:bool) - [r/w] - FALSE = Transceiver is a 'receiver' (like a return) and accepts data from a channel. TRUE = Transceiver is a 'transmitter' (like a send). Default = FALSE. */ + FMOD_DSP_TRANSCEIVER_GAIN, /* (Type:float) - [r/w] - Gain to receive or transmit at in dB. -80.0 to 10.0. Default = 0. */ + FMOD_DSP_TRANSCEIVER_CHANNEL, /* (Type:int) - [r/w] - Integer to select current global slot, shared by all Transceivers, that can be transmitted to or received from. 0 to 31. Default = 0.*/ + FMOD_DSP_TRANSCEIVER_TRANSMITSPEAKERMODE /* (Type:int) - [r/w] - Speaker mode (transmitter mode only). Specifies either 0 (Auto) Default = 0.*/ +} FMOD_DSP_TRANSCEIVER; + + +#endif + diff --git a/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_errors.h b/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_errors.h new file mode 100644 index 0000000..2640e3c --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_errors.h @@ -0,0 +1,113 @@ +/*$ preserve start $*/ + +/* ================================================================================================== */ +/* FMOD Studio - Error string header file. Copyright (c), Firelight Technologies Pty, Ltd. 2004-2016. */ +/* */ +/* Use this header if you want to store or display a string version / english explanation of */ +/* the FMOD error codes. */ +/* */ +/* ================================================================================================== */ + +#ifndef _FMOD_ERRORS_H +#define _FMOD_ERRORS_H + +#include "fmod.h" + +#ifdef __GNUC__ +static const char *FMOD_ErrorString(FMOD_RESULT errcode) __attribute__((unused)); +#endif + +static const char *FMOD_ErrorString(FMOD_RESULT errcode) +{ + switch (errcode) + { +/*$ preserve end $*/ + case FMOD_OK: return "No errors."; + case FMOD_ERR_BADCOMMAND: return "Tried to call a function on a data type that does not allow this type of functionality (ie calling Sound::lock on a streaming sound)."; + case FMOD_ERR_CHANNEL_ALLOC: return "Error trying to allocate a channel."; + case FMOD_ERR_CHANNEL_STOLEN: return "The specified channel has been reused to play another sound."; + case FMOD_ERR_DMA: return "DMA Failure. See debug output for more information."; + case FMOD_ERR_DSP_CONNECTION: return "DSP connection error. Connection possibly caused a cyclic dependency or connected dsps with incompatible buffer counts."; + case FMOD_ERR_DSP_DONTPROCESS: return "DSP return code from a DSP process query callback. Tells mixer not to call the process callback and therefore not consume CPU. Use this to optimize the DSP graph."; + case FMOD_ERR_DSP_FORMAT: return "DSP Format error. A DSP unit may have attempted to connect to this network with the wrong format, or a matrix may have been set with the wrong size if the target unit has a specified channel map."; + case FMOD_ERR_DSP_INUSE: return "DSP is already in the mixer's DSP network. It must be removed before being reinserted or released."; + case FMOD_ERR_DSP_NOTFOUND: return "DSP connection error. Couldn't find the DSP unit specified."; + case FMOD_ERR_DSP_RESERVED: return "DSP operation error. Cannot perform operation on this DSP as it is reserved by the system."; + case FMOD_ERR_DSP_SILENCE: return "DSP return code from a DSP process query callback. Tells mixer silence would be produced from read, so go idle and not consume CPU. Use this to optimize the DSP graph."; + case FMOD_ERR_DSP_TYPE: return "DSP operation cannot be performed on a DSP of this type."; + case FMOD_ERR_FILE_BAD: return "Error loading file."; + case FMOD_ERR_FILE_COULDNOTSEEK: return "Couldn't perform seek operation. This is a limitation of the medium (ie netstreams) or the file format."; + case FMOD_ERR_FILE_DISKEJECTED: return "Media was ejected while reading."; + case FMOD_ERR_FILE_EOF: return "End of file unexpectedly reached while trying to read essential data (truncated?)."; + case FMOD_ERR_FILE_ENDOFDATA: return "End of current chunk reached while trying to read data."; + case FMOD_ERR_FILE_NOTFOUND: return "File not found."; + case FMOD_ERR_FORMAT: return "Unsupported file or audio format."; + case FMOD_ERR_HEADER_MISMATCH: return "There is a version mismatch between the FMOD header and either the FMOD Studio library or the FMOD Low Level library."; + case FMOD_ERR_HTTP: return "A HTTP error occurred. This is a catch-all for HTTP errors not listed elsewhere."; + case FMOD_ERR_HTTP_ACCESS: return "The specified resource requires authentication or is forbidden."; + case FMOD_ERR_HTTP_PROXY_AUTH: return "Proxy authentication is required to access the specified resource."; + case FMOD_ERR_HTTP_SERVER_ERROR: return "A HTTP server error occurred."; + case FMOD_ERR_HTTP_TIMEOUT: return "The HTTP request timed out."; + case FMOD_ERR_INITIALIZATION: return "FMOD was not initialized correctly to support this function."; + case FMOD_ERR_INITIALIZED: return "Cannot call this command after System::init."; + case FMOD_ERR_INTERNAL: return "An error occurred that wasn't supposed to. Contact support."; + case FMOD_ERR_INVALID_FLOAT: return "Value passed in was a NaN, Inf or denormalized float."; + case FMOD_ERR_INVALID_HANDLE: return "An invalid object handle was used."; + case FMOD_ERR_INVALID_PARAM: return "An invalid parameter was passed to this function."; + case FMOD_ERR_INVALID_POSITION: return "An invalid seek position was passed to this function."; + case FMOD_ERR_INVALID_SPEAKER: return "An invalid speaker was passed to this function based on the current speaker mode."; + case FMOD_ERR_INVALID_SYNCPOINT: return "The syncpoint did not come from this sound handle."; + case FMOD_ERR_INVALID_THREAD: return "Tried to call a function on a thread that is not supported."; + case FMOD_ERR_INVALID_VECTOR: return "The vectors passed in are not unit length, or perpendicular."; + case FMOD_ERR_MAXAUDIBLE: return "Reached maximum audible playback count for this sound's soundgroup."; + case FMOD_ERR_MEMORY: return "Not enough memory or resources."; + case FMOD_ERR_MEMORY_CANTPOINT: return "Can't use FMOD_OPENMEMORY_POINT on non PCM source data, or non mp3/xma/adpcm data if FMOD_CREATECOMPRESSEDSAMPLE was used."; + case FMOD_ERR_NEEDS3D: return "Tried to call a command on a 2d sound when the command was meant for 3d sound."; + case FMOD_ERR_NEEDSHARDWARE: return "Tried to use a feature that requires hardware support."; + case FMOD_ERR_NET_CONNECT: return "Couldn't connect to the specified host."; + case FMOD_ERR_NET_SOCKET_ERROR: return "A socket error occurred. This is a catch-all for socket-related errors not listed elsewhere."; + case FMOD_ERR_NET_URL: return "The specified URL couldn't be resolved."; + case FMOD_ERR_NET_WOULD_BLOCK: return "Operation on a non-blocking socket could not complete immediately."; + case FMOD_ERR_NOTREADY: return "Operation could not be performed because specified sound/DSP connection is not ready."; + case FMOD_ERR_OUTPUT_ALLOCATED: return "Error initializing output device, but more specifically, the output device is already in use and cannot be reused."; + case FMOD_ERR_OUTPUT_CREATEBUFFER: return "Error creating hardware sound buffer."; + case FMOD_ERR_OUTPUT_DRIVERCALL: return "A call to a standard soundcard driver failed, which could possibly mean a bug in the driver or resources were missing or exhausted."; + case FMOD_ERR_OUTPUT_FORMAT: return "Soundcard does not support the specified format."; + case FMOD_ERR_OUTPUT_INIT: return "Error initializing output device."; + case FMOD_ERR_OUTPUT_NODRIVERS: return "The output device has no drivers installed. If pre-init, FMOD_OUTPUT_NOSOUND is selected as the output mode. If post-init, the function just fails."; + case FMOD_ERR_PLUGIN: return "An unspecified error has been returned from a plugin."; + case FMOD_ERR_PLUGIN_MISSING: return "A requested output, dsp unit type or codec was not available."; + case FMOD_ERR_PLUGIN_RESOURCE: return "A resource that the plugin requires cannot be found. (ie the DLS file for MIDI playback)"; + case FMOD_ERR_PLUGIN_VERSION: return "A plugin was built with an unsupported SDK version."; + case FMOD_ERR_RECORD: return "An error occurred trying to initialize the recording device."; + case FMOD_ERR_REVERB_CHANNELGROUP: return "Reverb properties cannot be set on this channel because a parent channelgroup owns the reverb connection."; + case FMOD_ERR_REVERB_INSTANCE: return "Specified instance in FMOD_REVERB_PROPERTIES couldn't be set. Most likely because it is an invalid instance number or the reverb doesn't exist."; + case FMOD_ERR_SUBSOUNDS: return "The error occurred because the sound referenced contains subsounds when it shouldn't have, or it doesn't contain subsounds when it should have. The operation may also not be able to be performed on a parent sound."; + case FMOD_ERR_SUBSOUND_ALLOCATED: return "This subsound is already being used by another sound, you cannot have more than one parent to a sound. Null out the other parent's entry first."; + case FMOD_ERR_SUBSOUND_CANTMOVE: return "Shared subsounds cannot be replaced or moved from their parent stream, such as when the parent stream is an FSB file."; + case FMOD_ERR_TAGNOTFOUND: return "The specified tag could not be found or there are no tags."; + case FMOD_ERR_TOOMANYCHANNELS: return "The sound created exceeds the allowable input channel count. This can be increased using the 'maxinputchannels' parameter in System::setSoftwareFormat."; + case FMOD_ERR_TRUNCATED: return "The retrieved string is too long to fit in the supplied buffer and has been truncated."; + case FMOD_ERR_UNIMPLEMENTED: return "Something in FMOD hasn't been implemented when it should be! contact support!"; + case FMOD_ERR_UNINITIALIZED: return "This command failed because System::init or System::setDriver was not called."; + case FMOD_ERR_UNSUPPORTED: return "A command issued was not supported by this object. Possibly a plugin without certain callbacks specified."; + case FMOD_ERR_VERSION: return "The version number of this file format is not supported."; + case FMOD_ERR_EVENT_ALREADY_LOADED: return "The specified bank has already been loaded."; + case FMOD_ERR_EVENT_LIVEUPDATE_BUSY: return "The live update connection failed due to the game already being connected."; + case FMOD_ERR_EVENT_LIVEUPDATE_MISMATCH: return "The live update connection failed due to the game data being out of sync with the tool."; + case FMOD_ERR_EVENT_LIVEUPDATE_TIMEOUT: return "The live update connection timed out."; + case FMOD_ERR_EVENT_NOTFOUND: return "The requested event, bus or vca could not be found."; + case FMOD_ERR_STUDIO_UNINITIALIZED: return "The Studio::System object is not yet initialized."; + case FMOD_ERR_STUDIO_NOT_LOADED: return "The specified resource is not loaded, so it can't be unloaded."; + case FMOD_ERR_INVALID_STRING: return "An invalid string was passed to this function."; + case FMOD_ERR_ALREADY_LOCKED: return "The specified resource is already locked."; + case FMOD_ERR_NOT_LOCKED: return "The specified resource is not locked, so it can't be unlocked."; + case FMOD_ERR_RECORD_DISCONNECTED: return "The specified recording driver has been disconnected."; + case FMOD_ERR_TOOMANYSAMPLES: return "The length provided exceed the allowable limit."; + default : return "Unknown error."; +/*$ preserve start $*/ + }; +} + +#endif +/*$ preserve end $*/ diff --git a/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_output.h b/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_output.h new file mode 100644 index 0000000..da80d3a --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_output.h @@ -0,0 +1,88 @@ +/* ======================================================================================================== */ +/* FMOD Studio - output development header file. Copyright (c), Firelight Technologies Pty, Ltd. 2004-2016. */ +/* */ +/* Use this header if you are wanting to develop your own output plugin to use with */ +/* FMOD's output system. With this header you can make your own output plugin that FMOD */ +/* can register and use. See the documentation and examples on how to make a working plugin. */ +/* */ +/* ======================================================================================================== */ + +#ifndef _FMOD_OUTPUT_H +#define _FMOD_OUTPUT_H + +typedef struct FMOD_OUTPUT_STATE FMOD_OUTPUT_STATE; + +/* + Output callbacks +*/ +typedef FMOD_RESULT (F_CALLBACK *FMOD_OUTPUT_GETNUMDRIVERS_CALLBACK) (FMOD_OUTPUT_STATE *output_state, int *numdrivers); +typedef FMOD_RESULT (F_CALLBACK *FMOD_OUTPUT_GETDRIVERINFO_CALLBACK) (FMOD_OUTPUT_STATE *output, int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels); +typedef FMOD_RESULT (F_CALLBACK *FMOD_OUTPUT_INIT_CALLBACK) (FMOD_OUTPUT_STATE *output_state, int selecteddriver, FMOD_INITFLAGS flags, int *outputrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels, FMOD_SOUND_FORMAT *outputformat, int dspbufferlength, int dspnumbuffers, void *extradriverdata); +typedef FMOD_RESULT (F_CALLBACK *FMOD_OUTPUT_START_CALLBACK) (FMOD_OUTPUT_STATE *output_state); +typedef FMOD_RESULT (F_CALLBACK *FMOD_OUTPUT_STOP_CALLBACK) (FMOD_OUTPUT_STATE *output_state); +typedef FMOD_RESULT (F_CALLBACK *FMOD_OUTPUT_CLOSE_CALLBACK) (FMOD_OUTPUT_STATE *output_state); +typedef FMOD_RESULT (F_CALLBACK *FMOD_OUTPUT_UPDATE_CALLBACK) (FMOD_OUTPUT_STATE *output_state); +typedef FMOD_RESULT (F_CALLBACK *FMOD_OUTPUT_GETHANDLE_CALLBACK) (FMOD_OUTPUT_STATE *output_state, void **handle); +typedef FMOD_RESULT (F_CALLBACK *FMOD_OUTPUT_GETPOSITION_CALLBACK) (FMOD_OUTPUT_STATE *output_state, unsigned int *pcm); +typedef FMOD_RESULT (F_CALLBACK *FMOD_OUTPUT_LOCK_CALLBACK) (FMOD_OUTPUT_STATE *output_state, unsigned int offset, unsigned int length, void **ptr1, void **ptr2, unsigned int *len1, unsigned int *len2); +typedef FMOD_RESULT (F_CALLBACK *FMOD_OUTPUT_UNLOCK_CALLBACK) (FMOD_OUTPUT_STATE *output_state, void *ptr1, void *ptr2, unsigned int len1, unsigned int len2); + +typedef FMOD_RESULT (F_CALLBACK *FMOD_OUTPUT_READFROMMIXER) (FMOD_OUTPUT_STATE *output_state, void *buffer, unsigned int length); /* This one is called by plugin through FMOD_OUTPUT_STATE, not set by user as a callback. */ + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + When creating an output, declare one of these and provide the relevant callbacks and name for FMOD to use when it opens and reads a file of this type. + + [REMARKS] + Members marked with [in] mean the variable can be written to. The user can set the value.
    + Members marked with [out] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
    + + [SEE_ALSO] + FMOD_OUTPUT_STATE +] +*/ +typedef struct FMOD_OUTPUT_DESCRIPTION +{ + const char *name; /* [in] Name of the output. */ + unsigned int version; /* [in] Plugin writer's version number. */ + int polling; /* [in] If TRUE (non zero), this tells FMOD to start a thread and call getposition / lock / unlock for feeding data. If 0, the output is probably callback based, so all the plugin needs to do is call readfrommixer to the appropriate pointer. */ + FMOD_OUTPUT_GETNUMDRIVERS_CALLBACK getnumdrivers; /* [in] For sound device enumeration. This callback is to give System::getNumDrivers somthing to return. */ + FMOD_OUTPUT_GETDRIVERINFO_CALLBACK getdriverinfo; /* [in] For sound device enumeration. This callback is to give System::getDriverName somthing to return. */ + FMOD_OUTPUT_INIT_CALLBACK init; /* [in] Initialization function for the output device. This is called from System::init. */ + FMOD_OUTPUT_START_CALLBACK start; /* [in] Initialization function for the output device to start accepting audio data from the FMOD software mixer. This is called from System::init. */ + FMOD_OUTPUT_STOP_CALLBACK stop; /* [in] Initialization function for the output device to stop accepting audio data from FMOD the software mixer. This is called from System::close. */ + FMOD_OUTPUT_CLOSE_CALLBACK close; /* [in] Cleanup / close down function for the output device. This is called from System::close. */ + FMOD_OUTPUT_UPDATE_CALLBACK update; /* [in] Update function that is called once a frame by the user. This is called from System::update. */ + FMOD_OUTPUT_GETHANDLE_CALLBACK gethandle; /* [in] This is called from System::getOutputHandle. This is just to return a pointer to the internal system device object that the system may be using.*/ + FMOD_OUTPUT_GETPOSITION_CALLBACK getposition; /* [in] This is called from the FMOD software mixer thread if 'polling' = true. This returns a position value in samples so that FMOD knows where and when to fill its buffer. */ + FMOD_OUTPUT_LOCK_CALLBACK lock; /* [in] This is called from the FMOD software mixer thread if 'polling' = true. This function provides a pointer to data that FMOD can write to when software mixing. */ + FMOD_OUTPUT_UNLOCK_CALLBACK unlock; /* [in] This is called from the FMOD software mixer thread if 'polling' = true. This optional function accepts the data that has been mixed and copies it or does whatever it needs to before sending it to the hardware. */ +} FMOD_OUTPUT_DESCRIPTION; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Output plugin structure that is passed into each callback. + + [REMARKS] + Members marked with [in] mean the variable can be written to. The user can set the value.
    + Members marked with [out] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
    + + [SEE_ALSO] + FMOD_OUTPUT_DESCRIPTION +] +*/ +struct FMOD_OUTPUT_STATE +{ + void *plugindata; /* [in] Plugin writer created data the output author wants to attach to this object. */ + FMOD_OUTPUT_READFROMMIXER readfrommixer; /* [out] Function to update mixer and write the result to the provided pointer. Used from callback based output only. Polling based output uses lock/unlock/getposition. */ +}; + +#endif + + diff --git a/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_studio.h b/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_studio.h new file mode 100644 index 0000000..227350a --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_studio.h @@ -0,0 +1,233 @@ +/*$ preserve start $*/ + +/* + fmod_studio.h - FMOD Studio API + Copyright (c), Firelight Technologies Pty, Ltd. 2016. + + This header defines the C API. If you are programming in C++ use fmod_studio.hpp. +*/ + +#ifndef FMOD_STUDIO_H +#define FMOD_STUDIO_H + +#include "fmod_studio_common.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* + Global +*/ +FMOD_RESULT F_API FMOD_Studio_ParseID(const char *idString, FMOD_GUID *id); +FMOD_RESULT F_API FMOD_Studio_System_Create(FMOD_STUDIO_SYSTEM **system, unsigned int headerVersion); + +/*$ preserve end $*/ + +/* + System +*/ +FMOD_BOOL F_API FMOD_Studio_System_IsValid(FMOD_STUDIO_SYSTEM *system); +FMOD_RESULT F_API FMOD_Studio_System_SetAdvancedSettings(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_ADVANCEDSETTINGS *settings); +FMOD_RESULT F_API FMOD_Studio_System_GetAdvancedSettings(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_ADVANCEDSETTINGS *settings); +FMOD_RESULT F_API FMOD_Studio_System_Initialize(FMOD_STUDIO_SYSTEM *system, int maxchannels, FMOD_STUDIO_INITFLAGS studioflags, FMOD_INITFLAGS flags, void *extradriverdata); +FMOD_RESULT F_API FMOD_Studio_System_Release(FMOD_STUDIO_SYSTEM *system); +FMOD_RESULT F_API FMOD_Studio_System_Update(FMOD_STUDIO_SYSTEM *system); +FMOD_RESULT F_API FMOD_Studio_System_GetLowLevelSystem(FMOD_STUDIO_SYSTEM *system, FMOD_SYSTEM **lowLevelSystem); +FMOD_RESULT F_API FMOD_Studio_System_GetEvent(FMOD_STUDIO_SYSTEM *system, const char *pathOrID, FMOD_STUDIO_EVENTDESCRIPTION **event); +FMOD_RESULT F_API FMOD_Studio_System_GetBus(FMOD_STUDIO_SYSTEM *system, const char *pathOrID, FMOD_STUDIO_BUS **bus); +FMOD_RESULT F_API FMOD_Studio_System_GetVCA(FMOD_STUDIO_SYSTEM *system, const char *pathOrID, FMOD_STUDIO_VCA **vca); +FMOD_RESULT F_API FMOD_Studio_System_GetBank(FMOD_STUDIO_SYSTEM *system, const char *pathOrID, FMOD_STUDIO_BANK **bank); +FMOD_RESULT F_API FMOD_Studio_System_GetEventByID(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, FMOD_STUDIO_EVENTDESCRIPTION **event); +FMOD_RESULT F_API FMOD_Studio_System_GetBusByID(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, FMOD_STUDIO_BUS **bus); +FMOD_RESULT F_API FMOD_Studio_System_GetVCAByID(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, FMOD_STUDIO_VCA **vca); +FMOD_RESULT F_API FMOD_Studio_System_GetBankByID(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, FMOD_STUDIO_BANK **bank); +FMOD_RESULT F_API FMOD_Studio_System_GetSoundInfo(FMOD_STUDIO_SYSTEM *system, const char *key, FMOD_STUDIO_SOUND_INFO *info); +FMOD_RESULT F_API FMOD_Studio_System_LookupID(FMOD_STUDIO_SYSTEM *system, const char *path, FMOD_GUID *id); +FMOD_RESULT F_API FMOD_Studio_System_LookupPath(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, char *path, int size, int *retrieved); +FMOD_RESULT F_API FMOD_Studio_System_GetNumListeners(FMOD_STUDIO_SYSTEM *system, int *numlisteners); +FMOD_RESULT F_API FMOD_Studio_System_SetNumListeners(FMOD_STUDIO_SYSTEM *system, int numlisteners); +FMOD_RESULT F_API FMOD_Studio_System_GetListenerAttributes(FMOD_STUDIO_SYSTEM *system, int index, FMOD_3D_ATTRIBUTES *attributes); +FMOD_RESULT F_API FMOD_Studio_System_SetListenerAttributes(FMOD_STUDIO_SYSTEM *system, int index, FMOD_3D_ATTRIBUTES *attributes); +FMOD_RESULT F_API FMOD_Studio_System_LoadBankFile(FMOD_STUDIO_SYSTEM *system, const char *filename, FMOD_STUDIO_LOAD_BANK_FLAGS flags, FMOD_STUDIO_BANK **bank); +FMOD_RESULT F_API FMOD_Studio_System_LoadBankMemory(FMOD_STUDIO_SYSTEM *system, const char *buffer, int length, FMOD_STUDIO_LOAD_MEMORY_MODE mode, FMOD_STUDIO_LOAD_BANK_FLAGS flags, FMOD_STUDIO_BANK **bank); +FMOD_RESULT F_API FMOD_Studio_System_LoadBankCustom(FMOD_STUDIO_SYSTEM *system, const FMOD_STUDIO_BANK_INFO *info, FMOD_STUDIO_LOAD_BANK_FLAGS flags, FMOD_STUDIO_BANK **bank); +FMOD_RESULT F_API FMOD_Studio_System_RegisterPlugin(FMOD_STUDIO_SYSTEM *system, const FMOD_DSP_DESCRIPTION *description); +FMOD_RESULT F_API FMOD_Studio_System_UnregisterPlugin(FMOD_STUDIO_SYSTEM *system, const char *name); +FMOD_RESULT F_API FMOD_Studio_System_UnloadAll(FMOD_STUDIO_SYSTEM *system); +FMOD_RESULT F_API FMOD_Studio_System_FlushCommands(FMOD_STUDIO_SYSTEM *system); +FMOD_RESULT F_API FMOD_Studio_System_StartCommandCapture(FMOD_STUDIO_SYSTEM *system, const char *filename, FMOD_STUDIO_COMMANDCAPTURE_FLAGS flags); +FMOD_RESULT F_API FMOD_Studio_System_StopCommandCapture(FMOD_STUDIO_SYSTEM *system); +FMOD_RESULT F_API FMOD_Studio_System_LoadCommandReplay(FMOD_STUDIO_SYSTEM *system, const char *filename, FMOD_STUDIO_COMMANDREPLAY_FLAGS flags, FMOD_STUDIO_COMMANDREPLAY **replay); +FMOD_RESULT F_API FMOD_Studio_System_GetBankCount(FMOD_STUDIO_SYSTEM *system, int *count); +FMOD_RESULT F_API FMOD_Studio_System_GetBankList(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_BANK **array, int capacity, int *count); +FMOD_RESULT F_API FMOD_Studio_System_GetCPUUsage(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_CPU_USAGE *usage); +FMOD_RESULT F_API FMOD_Studio_System_GetBufferUsage(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_BUFFER_USAGE *usage); +FMOD_RESULT F_API FMOD_Studio_System_ResetBufferUsage(FMOD_STUDIO_SYSTEM *system); +FMOD_RESULT F_API FMOD_Studio_System_SetCallback(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_SYSTEM_CALLBACK callback, FMOD_STUDIO_SYSTEM_CALLBACK_TYPE callbackmask); +FMOD_RESULT F_API FMOD_Studio_System_SetUserData(FMOD_STUDIO_SYSTEM *system, void *userdata); +FMOD_RESULT F_API FMOD_Studio_System_GetUserData(FMOD_STUDIO_SYSTEM *system, void **userdata); + +/* + EventDescription +*/ +FMOD_BOOL F_API FMOD_Studio_EventDescription_IsValid(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetID(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_GUID *id); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetPath(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, char *path, int size, int *retrieved); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterCount(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int *count); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterByIndex(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int index, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameter(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, const char *name, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetUserPropertyCount(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int *count); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetUserPropertyByIndex(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int index, FMOD_STUDIO_USER_PROPERTY *property); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetUserProperty(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, const char *name, FMOD_STUDIO_USER_PROPERTY *property); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetLength(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int *length); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetMinimumDistance(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, float *distance); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetMaximumDistance(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, float *distance); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetSoundSize(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, float *size); +FMOD_RESULT F_API FMOD_Studio_EventDescription_IsOneshot(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *oneshot); +FMOD_RESULT F_API FMOD_Studio_EventDescription_IsStream(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *isStream); +FMOD_RESULT F_API FMOD_Studio_EventDescription_Is3D(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *is3D); +FMOD_RESULT F_API FMOD_Studio_EventDescription_CreateInstance(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_EVENTINSTANCE **instance); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetInstanceCount(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int *count); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetInstanceList(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_EVENTINSTANCE **array, int capacity, int *count); +FMOD_RESULT F_API FMOD_Studio_EventDescription_LoadSampleData(FMOD_STUDIO_EVENTDESCRIPTION *eventDesc); +FMOD_RESULT F_API FMOD_Studio_EventDescription_UnloadSampleData(FMOD_STUDIO_EVENTDESCRIPTION *eventDesc); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetSampleLoadingState(FMOD_STUDIO_EVENTDESCRIPTION *eventDesc, FMOD_STUDIO_LOADING_STATE *state); +FMOD_RESULT F_API FMOD_Studio_EventDescription_ReleaseAllInstances(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription); +FMOD_RESULT F_API FMOD_Studio_EventDescription_SetCallback(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_EVENT_CALLBACK callback, FMOD_STUDIO_EVENT_CALLBACK_TYPE callbackmask); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetUserData(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, void **userData); +FMOD_RESULT F_API FMOD_Studio_EventDescription_SetUserData(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, void *userData); + +/* + EventInstance +*/ +FMOD_BOOL F_API FMOD_Studio_EventInstance_IsValid(FMOD_STUDIO_EVENTINSTANCE *eventinstance); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetDescription(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_EVENTDESCRIPTION **description); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetVolume(FMOD_STUDIO_EVENTINSTANCE *eventinstance, float *volume); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetVolume(FMOD_STUDIO_EVENTINSTANCE *eventinstance, float volume); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetPitch(FMOD_STUDIO_EVENTINSTANCE *eventinstance, float *pitch); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetPitch(FMOD_STUDIO_EVENTINSTANCE *eventinstance, float pitch); +FMOD_RESULT F_API FMOD_Studio_EventInstance_Get3DAttributes(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_3D_ATTRIBUTES *attributes); +FMOD_RESULT F_API FMOD_Studio_EventInstance_Set3DAttributes(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_3D_ATTRIBUTES *attributes); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetProperty(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_EVENT_PROPERTY index, float *value); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetProperty(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_EVENT_PROPERTY index, float value); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetPaused(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_BOOL *paused); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetPaused(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_BOOL paused); +FMOD_RESULT F_API FMOD_Studio_EventInstance_Start(FMOD_STUDIO_EVENTINSTANCE *eventinstance); +FMOD_RESULT F_API FMOD_Studio_EventInstance_Stop(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_STOP_MODE mode); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetTimelinePosition(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int *position); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetTimelinePosition(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int position); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetPlaybackState(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_PLAYBACK_STATE *state); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetChannelGroup(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_CHANNELGROUP **group); +FMOD_RESULT F_API FMOD_Studio_EventInstance_Release(FMOD_STUDIO_EVENTINSTANCE *eventinstance); +FMOD_RESULT F_API FMOD_Studio_EventInstance_IsVirtual(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_BOOL *virtualState); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetParameter(FMOD_STUDIO_EVENTINSTANCE *eventinstance, const char *name, FMOD_STUDIO_PARAMETERINSTANCE **parameter); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetParameterByIndex(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int index, FMOD_STUDIO_PARAMETERINSTANCE **parameter); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetParameterCount(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int *count); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetParameterValue(FMOD_STUDIO_EVENTINSTANCE *eventinstance, const char *name, float value); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetParameterValueByIndex(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int index, float value); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetCue(FMOD_STUDIO_EVENTINSTANCE *eventinstance, const char *name, FMOD_STUDIO_CUEINSTANCE **cue); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetCueByIndex(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int index, FMOD_STUDIO_CUEINSTANCE **cue); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetCueCount(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int *count); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetCallback(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_EVENT_CALLBACK callback, FMOD_STUDIO_EVENT_CALLBACK_TYPE callbackmask); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetUserData(FMOD_STUDIO_EVENTINSTANCE *eventinstance, void **userData); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetUserData(FMOD_STUDIO_EVENTINSTANCE *eventinstance, void *userData); + +/* + CueInstance +*/ +FMOD_BOOL F_API FMOD_Studio_CueInstance_IsValid(FMOD_STUDIO_CUEINSTANCE *cueinstance); +FMOD_RESULT F_API FMOD_Studio_CueInstance_Trigger(FMOD_STUDIO_CUEINSTANCE *cueinstance); + +/* + ParameterInstance +*/ +FMOD_BOOL F_API FMOD_Studio_ParameterInstance_IsValid(FMOD_STUDIO_PARAMETERINSTANCE *parameterinstance); +FMOD_RESULT F_API FMOD_Studio_ParameterInstance_GetDescription(FMOD_STUDIO_PARAMETERINSTANCE *parameterinstance, FMOD_STUDIO_PARAMETER_DESCRIPTION *description); +FMOD_RESULT F_API FMOD_Studio_ParameterInstance_GetValue(FMOD_STUDIO_PARAMETERINSTANCE *parameterinstance, float *value); +FMOD_RESULT F_API FMOD_Studio_ParameterInstance_SetValue(FMOD_STUDIO_PARAMETERINSTANCE *parameterinstance, float value); + +/* + Bus +*/ +FMOD_BOOL F_API FMOD_Studio_Bus_IsValid(FMOD_STUDIO_BUS *bus); +FMOD_RESULT F_API FMOD_Studio_Bus_GetID(FMOD_STUDIO_BUS *bus, FMOD_GUID *id); +FMOD_RESULT F_API FMOD_Studio_Bus_GetPath(FMOD_STUDIO_BUS *bus, char *path, int size, int *retrieved); +FMOD_RESULT F_API FMOD_Studio_Bus_GetFaderLevel(FMOD_STUDIO_BUS *bus, float *level); +FMOD_RESULT F_API FMOD_Studio_Bus_SetFaderLevel(FMOD_STUDIO_BUS *bus, float level); +FMOD_RESULT F_API FMOD_Studio_Bus_GetPaused(FMOD_STUDIO_BUS *bus, FMOD_BOOL *paused); +FMOD_RESULT F_API FMOD_Studio_Bus_SetPaused(FMOD_STUDIO_BUS *bus, FMOD_BOOL paused); +FMOD_RESULT F_API FMOD_Studio_Bus_GetMute(FMOD_STUDIO_BUS *bus, FMOD_BOOL *mute); +FMOD_RESULT F_API FMOD_Studio_Bus_SetMute(FMOD_STUDIO_BUS *bus, FMOD_BOOL mute); +FMOD_RESULT F_API FMOD_Studio_Bus_StopAllEvents(FMOD_STUDIO_BUS *bus, FMOD_STUDIO_STOP_MODE mode); +FMOD_RESULT F_API FMOD_Studio_Bus_LockChannelGroup(FMOD_STUDIO_BUS *bus); +FMOD_RESULT F_API FMOD_Studio_Bus_UnlockChannelGroup(FMOD_STUDIO_BUS *bus); +FMOD_RESULT F_API FMOD_Studio_Bus_GetChannelGroup(FMOD_STUDIO_BUS *bus, FMOD_CHANNELGROUP **group); + +/* + VCA +*/ +FMOD_BOOL F_API FMOD_Studio_VCA_IsValid(FMOD_STUDIO_VCA *vca); +FMOD_RESULT F_API FMOD_Studio_VCA_GetID(FMOD_STUDIO_VCA *vca, FMOD_GUID *id); +FMOD_RESULT F_API FMOD_Studio_VCA_GetPath(FMOD_STUDIO_VCA *vca, char *path, int size, int *retrieved); +FMOD_RESULT F_API FMOD_Studio_VCA_GetFaderLevel(FMOD_STUDIO_VCA *vca, float *level); +FMOD_RESULT F_API FMOD_Studio_VCA_SetFaderLevel(FMOD_STUDIO_VCA *vca, float level); + +/* + Bank +*/ +FMOD_BOOL F_API FMOD_Studio_Bank_IsValid(FMOD_STUDIO_BANK *bank); +FMOD_RESULT F_API FMOD_Studio_Bank_GetID(FMOD_STUDIO_BANK *bank, FMOD_GUID *id); +FMOD_RESULT F_API FMOD_Studio_Bank_GetPath(FMOD_STUDIO_BANK *bank, char *path, int size, int *retrieved); +FMOD_RESULT F_API FMOD_Studio_Bank_Unload(FMOD_STUDIO_BANK *bank); +FMOD_RESULT F_API FMOD_Studio_Bank_LoadSampleData(FMOD_STUDIO_BANK *bank); +FMOD_RESULT F_API FMOD_Studio_Bank_UnloadSampleData(FMOD_STUDIO_BANK *bank); +FMOD_RESULT F_API FMOD_Studio_Bank_GetLoadingState(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_LOADING_STATE *state); +FMOD_RESULT F_API FMOD_Studio_Bank_GetSampleLoadingState(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_LOADING_STATE *state); +FMOD_RESULT F_API FMOD_Studio_Bank_GetStringCount(FMOD_STUDIO_BANK *bank, int *count); +FMOD_RESULT F_API FMOD_Studio_Bank_GetStringInfo(FMOD_STUDIO_BANK *bank, int index, FMOD_GUID *id, char *path, int size, int *retrieved); +FMOD_RESULT F_API FMOD_Studio_Bank_GetEventCount(FMOD_STUDIO_BANK *bank, int *count); +FMOD_RESULT F_API FMOD_Studio_Bank_GetEventList(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_EVENTDESCRIPTION **array, int capacity, int *count); +FMOD_RESULT F_API FMOD_Studio_Bank_GetBusCount(FMOD_STUDIO_BANK *bank, int *count); +FMOD_RESULT F_API FMOD_Studio_Bank_GetBusList(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_BUS **array, int capacity, int *count); +FMOD_RESULT F_API FMOD_Studio_Bank_GetVCACount(FMOD_STUDIO_BANK *bank, int *count); +FMOD_RESULT F_API FMOD_Studio_Bank_GetVCAList(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_VCA **array, int capacity, int *count); +FMOD_RESULT F_API FMOD_Studio_Bank_GetUserData(FMOD_STUDIO_BANK *bank, void **userData); +FMOD_RESULT F_API FMOD_Studio_Bank_SetUserData(FMOD_STUDIO_BANK *bank, void *userData); + +/* + Command playback information +*/ +FMOD_BOOL F_API FMOD_Studio_CommandReplay_IsValid(FMOD_STUDIO_COMMANDREPLAY *replay); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetSystem(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_SYSTEM **system); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetLength(FMOD_STUDIO_COMMANDREPLAY *replay, float *length); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCommandCount(FMOD_STUDIO_COMMANDREPLAY *replay, int *count); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCommandInfo(FMOD_STUDIO_COMMANDREPLAY *replay, int commandIndex, FMOD_STUDIO_COMMAND_INFO *info); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCommandString(FMOD_STUDIO_COMMANDREPLAY *replay, int commandIndex, char *description, int capacity); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCommandAtTime(FMOD_STUDIO_COMMANDREPLAY *replay, float time, int *commandIndex); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetBankPath(FMOD_STUDIO_COMMANDREPLAY *replay, const char *bankPath); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_Start(FMOD_STUDIO_COMMANDREPLAY *replay); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_Stop(FMOD_STUDIO_COMMANDREPLAY *replay); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_SeekToTime(FMOD_STUDIO_COMMANDREPLAY *replay, float time); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_SeekToCommand(FMOD_STUDIO_COMMANDREPLAY *replay, int commandIndex); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetPaused(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_BOOL *paused); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetPaused(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_BOOL paused); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetPlaybackState(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_PLAYBACK_STATE *state); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCurrentCommand(FMOD_STUDIO_COMMANDREPLAY *replay, int *commandIndex, float *currentTime); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_Release(FMOD_STUDIO_COMMANDREPLAY *replay); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetFrameCallback(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_COMMANDREPLAY_FRAME_CALLBACK callback); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetLoadBankCallback(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_COMMANDREPLAY_LOAD_BANK_CALLBACK callback); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetCreateInstanceCallback(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_COMMANDREPLAY_CREATE_INSTANCE_CALLBACK callback); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetUserData(FMOD_STUDIO_COMMANDREPLAY *replay, void **userdata); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetUserData(FMOD_STUDIO_COMMANDREPLAY *replay, void *userdata); + +/*$ preserve start $*/ + +#ifdef __cplusplus +} +#endif + +#endif /* FMOD_STUDIO_H */ + +/*$ preserve end $*/ diff --git a/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_studio.hpp b/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_studio.hpp new file mode 100644 index 0000000..e529860 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_studio.hpp @@ -0,0 +1,388 @@ +/* + fmod_studio.hpp - FMOD Studio API + Copyright (c), Firelight Technologies Pty, Ltd. 2016. + + This header defines the C++ API. If you are programming in C use fmod_studio.h. +*/ + +#ifndef FMOD_STUDIO_HPP +#define FMOD_STUDIO_HPP + +#include "fmod_studio_common.h" +#include "fmod_studio.h" + +#include "fmod.hpp" + +namespace FMOD +{ + +namespace Studio +{ + typedef FMOD_GUID ID; // Deprecated. Please use FMOD_GUID type. + + class System; + class EventDescription; + class EventInstance; + class CueInstance; + class ParameterInstance; + class Bus; + class VCA; + class Bank; + class CommandReplay; + + FMOD_RESULT F_API parseID(const char *idString, FMOD_GUID *id); + + class System + { + private: + // Constructor made private so user cannot statically instance a System class. System::create must be used. + System(); + System(const System &); + + public: + static FMOD_RESULT F_API create(System **system, unsigned int headerVersion = FMOD_VERSION); + FMOD_RESULT F_API setAdvancedSettings(FMOD_STUDIO_ADVANCEDSETTINGS *settings); + FMOD_RESULT F_API getAdvancedSettings(FMOD_STUDIO_ADVANCEDSETTINGS *settings); + FMOD_RESULT F_API initialize(int maxchannels, FMOD_STUDIO_INITFLAGS studioflags, FMOD_INITFLAGS flags, void *extradriverdata); + FMOD_RESULT F_API release(); + + // Handle validity + bool F_API isValid() const; + + // Update processing + FMOD_RESULT F_API update(); + FMOD_RESULT F_API flushCommands(); + + // Low-level API access + FMOD_RESULT F_API getLowLevelSystem(FMOD::System **system) const; + + // Asset retrieval + FMOD_RESULT F_API getEvent(const char *path, EventDescription **event) const; + FMOD_RESULT F_API getBus(const char *path, Bus **bus) const; + FMOD_RESULT F_API getVCA(const char *path, VCA **vca) const; + FMOD_RESULT F_API getBank(const char *path, Bank **bank) const; + FMOD_RESULT F_API getEventByID(const FMOD_GUID *id, EventDescription **event) const; + FMOD_RESULT F_API getBusByID(const FMOD_GUID *id, Bus **bus) const; + FMOD_RESULT F_API getVCAByID(const FMOD_GUID *id, VCA **vca) const; + FMOD_RESULT F_API getBankByID(const FMOD_GUID *id, Bank **bank) const; + FMOD_RESULT F_API getSoundInfo(const char *key, FMOD_STUDIO_SOUND_INFO *info) const; + + // Path lookup + FMOD_RESULT F_API lookupID(const char *path, FMOD_GUID *id) const; + FMOD_RESULT F_API lookupPath(const FMOD_GUID *id, char *path, int size, int *retrieved) const; + + // Listener control + FMOD_RESULT F_API getNumListeners(int *numlisteners); + FMOD_RESULT F_API setNumListeners(int numlisteners); + FMOD_RESULT F_API getListenerAttributes(int listener, FMOD_3D_ATTRIBUTES *attributes) const; + FMOD_RESULT F_API setListenerAttributes(int listener, const FMOD_3D_ATTRIBUTES *attributes); + + // Bank control + FMOD_RESULT F_API loadBankFile(const char *filename, FMOD_STUDIO_LOAD_BANK_FLAGS flags, Bank **bank); + FMOD_RESULT F_API loadBankMemory(const char *buffer, int length, FMOD_STUDIO_LOAD_MEMORY_MODE mode, FMOD_STUDIO_LOAD_BANK_FLAGS flags, Bank **bank); + FMOD_RESULT F_API loadBankCustom(const FMOD_STUDIO_BANK_INFO *info, FMOD_STUDIO_LOAD_BANK_FLAGS flags, Bank **bank); + FMOD_RESULT F_API unloadAll(); + + // General functionality + FMOD_RESULT F_API getCPUUsage(FMOD_STUDIO_CPU_USAGE *usage) const; + FMOD_RESULT F_API getBufferUsage(FMOD_STUDIO_BUFFER_USAGE *usage) const; + FMOD_RESULT F_API resetBufferUsage(); + FMOD_RESULT F_API registerPlugin(const FMOD_DSP_DESCRIPTION *description); + FMOD_RESULT F_API unregisterPlugin(const char *name); + + // Enumeration + FMOD_RESULT F_API getBankCount(int *count) const; + FMOD_RESULT F_API getBankList(Bank **array, int capacity, int *count) const; + + // Command capture and replay + FMOD_RESULT F_API startCommandCapture(const char *filename, FMOD_STUDIO_COMMANDCAPTURE_FLAGS flags); + FMOD_RESULT F_API stopCommandCapture(); + FMOD_RESULT F_API loadCommandReplay(const char *filename, FMOD_STUDIO_COMMANDREPLAY_FLAGS flags, CommandReplay **playback); + + // Callbacks + FMOD_RESULT F_API setCallback(FMOD_STUDIO_SYSTEM_CALLBACK callback, FMOD_STUDIO_SYSTEM_CALLBACK_TYPE callbackmask = FMOD_STUDIO_SYSTEM_CALLBACK_ALL); + FMOD_RESULT F_API getUserData(void **userData) const; + FMOD_RESULT F_API setUserData(void *userData); + + }; + + class EventDescription + { + private: + // Constructor made private so user cannot statically instance the class. + EventDescription(); + EventDescription(const EventDescription &); + + public: + // Handle validity + bool F_API isValid() const; + + // Property access + FMOD_RESULT F_API getID(FMOD_GUID *id) const; + FMOD_RESULT F_API getPath(char *path, int size, int *retrieved) const; + FMOD_RESULT F_API getParameterCount(int *count) const; + FMOD_RESULT F_API getParameterByIndex(int index, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter) const; + FMOD_RESULT F_API getParameter(const char *name, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter) const; + FMOD_RESULT F_API getUserPropertyCount(int *count) const; + FMOD_RESULT F_API getUserPropertyByIndex(int index, FMOD_STUDIO_USER_PROPERTY *property) const; + FMOD_RESULT F_API getUserProperty(const char *name, FMOD_STUDIO_USER_PROPERTY *property) const; + FMOD_RESULT F_API getLength(int *length) const; + FMOD_RESULT F_API getMinimumDistance(float *distance) const; + FMOD_RESULT F_API getMaximumDistance(float *distance) const; + FMOD_RESULT F_API getSoundSize(float *size) const; + + FMOD_RESULT F_API isOneshot(bool *oneshot) const; + FMOD_RESULT F_API isStream(bool *isStream) const; + FMOD_RESULT F_API is3D(bool *is3D) const; + + // Playback control + FMOD_RESULT F_API createInstance(EventInstance **instance) const; + FMOD_RESULT F_API getInstanceCount(int *count) const; + FMOD_RESULT F_API getInstanceList(EventInstance **array, int capacity, int *count) const; + + // Sample data loading control + FMOD_RESULT F_API loadSampleData(); + FMOD_RESULT F_API unloadSampleData(); + FMOD_RESULT F_API getSampleLoadingState(FMOD_STUDIO_LOADING_STATE *state) const; + + // Convenience functions + FMOD_RESULT F_API releaseAllInstances(); + + // Callbacks + FMOD_RESULT F_API setCallback(FMOD_STUDIO_EVENT_CALLBACK callback, FMOD_STUDIO_EVENT_CALLBACK_TYPE callbackmask = FMOD_STUDIO_EVENT_CALLBACK_ALL); + FMOD_RESULT F_API getUserData(void **userData) const; + FMOD_RESULT F_API setUserData(void *userData); + }; + + class EventInstance + { + private: + // Constructor made private so user cannot statically instance the class. + EventInstance(); + EventInstance(const EventInstance &); + + public: + // Handle validity + bool F_API isValid() const; + + // Property access + FMOD_RESULT F_API getDescription(EventDescription **description) const; + + // Playback control + FMOD_RESULT F_API getVolume(float *volume) const; + FMOD_RESULT F_API setVolume(float volume); + + FMOD_RESULT F_API getPitch(float *pitch) const; + FMOD_RESULT F_API setPitch(float pitch); + + FMOD_RESULT F_API get3DAttributes(FMOD_3D_ATTRIBUTES *attributes) const; + FMOD_RESULT F_API set3DAttributes(const FMOD_3D_ATTRIBUTES *attributes); + + FMOD_RESULT F_API getProperty(FMOD_STUDIO_EVENT_PROPERTY index, float* value) const; + FMOD_RESULT F_API setProperty(FMOD_STUDIO_EVENT_PROPERTY index, float value); + + FMOD_RESULT F_API getPaused(bool *paused) const; + FMOD_RESULT F_API setPaused(bool paused); + + FMOD_RESULT F_API start(); + FMOD_RESULT F_API stop(FMOD_STUDIO_STOP_MODE mode); + + FMOD_RESULT F_API getTimelinePosition(int *position) const; + FMOD_RESULT F_API setTimelinePosition(int position); + + FMOD_RESULT F_API getPlaybackState(FMOD_STUDIO_PLAYBACK_STATE *state) const; + + FMOD_RESULT F_API getChannelGroup(ChannelGroup **group) const; + + FMOD_RESULT F_API release(); + + FMOD_RESULT F_API isVirtual(bool *virtualState) const; + + FMOD_RESULT F_API getParameter(const char *name, ParameterInstance **parameter) const; + FMOD_RESULT F_API getParameterByIndex(int index, ParameterInstance **parameter) const; + FMOD_RESULT F_API getParameterCount(int *count) const; + + FMOD_RESULT F_API setParameterValue(const char *name, float value); + FMOD_RESULT F_API setParameterValueByIndex(int index, float value); + + FMOD_RESULT F_API getCue(const char *name, CueInstance **cue) const; + FMOD_RESULT F_API getCueByIndex(int index, CueInstance **cue) const; + FMOD_RESULT F_API getCueCount(int *count) const; + + // Callbacks + FMOD_RESULT F_API setCallback(FMOD_STUDIO_EVENT_CALLBACK callback, FMOD_STUDIO_EVENT_CALLBACK_TYPE callbackmask = FMOD_STUDIO_EVENT_CALLBACK_ALL); + FMOD_RESULT F_API getUserData(void **userData) const; + FMOD_RESULT F_API setUserData(void *userData); + }; + + class CueInstance + { + private: + // Constructor made private so user cannot statically instance the class. + CueInstance(); + CueInstance(const CueInstance &); + + public: + // Handle validity + bool F_API isValid() const; + + FMOD_RESULT F_API trigger(); + }; + + class ParameterInstance + { + private: + // Constructor made private so user cannot statically instance the class. + ParameterInstance(); + ParameterInstance(const ParameterInstance &); + + public: + // Handle validity + bool F_API isValid() const; + + // Property access + FMOD_RESULT F_API getDescription(FMOD_STUDIO_PARAMETER_DESCRIPTION *description) const; + + // Playback control + FMOD_RESULT F_API getValue(float *value) const; + FMOD_RESULT F_API setValue(float value); + }; + + class Bus + { + private: + // Constructor made private so user cannot statically instance the class. + Bus(); + Bus(const Bus &); + + public: + // Handle validity + bool F_API isValid() const; + + // Property access + FMOD_RESULT F_API getID(FMOD_GUID *id) const; + FMOD_RESULT F_API getPath(char *path, int size, int *retrieved) const; + + // Playback control + FMOD_RESULT F_API getFaderLevel(float *level) const; + FMOD_RESULT F_API setFaderLevel(float level); + + FMOD_RESULT F_API getPaused(bool *paused) const; + FMOD_RESULT F_API setPaused(bool paused); + + FMOD_RESULT F_API getMute(bool *paused) const; + FMOD_RESULT F_API setMute(bool paused); + + FMOD_RESULT F_API stopAllEvents(FMOD_STUDIO_STOP_MODE mode); + + // Low-level API access + FMOD_RESULT F_API lockChannelGroup(); + FMOD_RESULT F_API unlockChannelGroup(); + FMOD_RESULT F_API getChannelGroup(FMOD::ChannelGroup **channelgroup) const; + }; + + class VCA + { + private: + // Constructor made private so user cannot statically instance the class. + VCA(); + VCA(const VCA &); + + public: + // Handle validity + bool F_API isValid() const; + + // Property access + FMOD_RESULT F_API getID(FMOD_GUID *id) const; + FMOD_RESULT F_API getPath(char *path, int size, int *retrieved) const; + + // Playback control + FMOD_RESULT F_API getFaderLevel(float *level) const; + FMOD_RESULT F_API setFaderLevel(float level); + }; + + class Bank + { + private: + // Constructor made private so user cannot statically instance the class. + Bank(); + Bank(const Bank &); + + public: + // Handle validity + bool F_API isValid() const; + + // Property access + FMOD_RESULT F_API getID(FMOD_GUID *id) const; + FMOD_RESULT F_API getPath(char *path, int size, int *retrieved) const; + + // Loading control + FMOD_RESULT F_API unload(); + FMOD_RESULT F_API loadSampleData(); + FMOD_RESULT F_API unloadSampleData(); + + FMOD_RESULT F_API getLoadingState(FMOD_STUDIO_LOADING_STATE *state) const; + FMOD_RESULT F_API getSampleLoadingState(FMOD_STUDIO_LOADING_STATE *state) const; + + // Enumeration + FMOD_RESULT F_API getStringCount(int *count) const; + FMOD_RESULT F_API getStringInfo(int index, FMOD_GUID *id, char *path, int size, int *retrieved) const; + FMOD_RESULT F_API getEventCount(int *count) const; + FMOD_RESULT F_API getEventList(EventDescription **array, int capacity, int *count) const; + FMOD_RESULT F_API getBusCount(int *count) const; + FMOD_RESULT F_API getBusList(Bus **array, int capacity, int *count) const; + FMOD_RESULT F_API getVCACount(int *count) const; + FMOD_RESULT F_API getVCAList(VCA **array, int capacity, int *count) const; + + FMOD_RESULT F_API getUserData(void **userData) const; + FMOD_RESULT F_API setUserData(void *userData); + }; + + class CommandReplay + { + private: + // Constructor made private so user cannot statically instance the class. + CommandReplay(); + CommandReplay(const CommandReplay &); + + public: + // Handle validity + bool F_API isValid() const; + + // Information query + FMOD_RESULT F_API getSystem(System **system) const; + FMOD_RESULT F_API getLength(float *length) const; + + FMOD_RESULT F_API getCommandCount(int *count) const; + FMOD_RESULT F_API getCommandInfo(int commandIndex, FMOD_STUDIO_COMMAND_INFO *info) const; + FMOD_RESULT F_API getCommandString(int commandIndex, char *buffer, int length) const; + FMOD_RESULT F_API getCommandAtTime(float time, int *commandIndex) const; + + // Playback + FMOD_RESULT F_API setBankPath(const char *bankPath); + FMOD_RESULT F_API start(); + FMOD_RESULT F_API stop(); + FMOD_RESULT F_API seekToTime(float time); + FMOD_RESULT F_API seekToCommand(int commandIndex); + FMOD_RESULT F_API getPaused(bool *paused) const; + FMOD_RESULT F_API setPaused(bool paused); + FMOD_RESULT F_API getPlaybackState(FMOD_STUDIO_PLAYBACK_STATE *state) const; + FMOD_RESULT F_API getCurrentCommand(int *commandIndex, float *currentTime) const; + + // Release + FMOD_RESULT F_API release(); + + // Callbacks + FMOD_RESULT F_API setFrameCallback(FMOD_STUDIO_COMMANDREPLAY_FRAME_CALLBACK callback); + FMOD_RESULT F_API setLoadBankCallback(FMOD_STUDIO_COMMANDREPLAY_LOAD_BANK_CALLBACK callback); + FMOD_RESULT F_API setCreateInstanceCallback(FMOD_STUDIO_COMMANDREPLAY_CREATE_INSTANCE_CALLBACK callback); + + FMOD_RESULT F_API getUserData(void **userData) const; + FMOD_RESULT F_API setUserData(void *userData); + }; + +} // namespace Studio + +} // namespace FMOD + +#endif //FMOD_STUDIO_HPP diff --git a/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_studio_common.h b/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_studio_common.h new file mode 100644 index 0000000..f80b405 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_studio_common.h @@ -0,0 +1,754 @@ +/* + fmod_studio_common.h + Copyright (c), Firelight Technologies Pty, Ltd. 2016. + + This header defines common enumerations, structs and callbacks that are shared between the C and C++ interfaces. +*/ + +#ifndef FMOD_STUDIO_COMMON_H +#define FMOD_STUDIO_COMMON_H + +#include "fmod.h" + + +/* + FMOD Studio types. +*/ + +typedef struct FMOD_STUDIO_SYSTEM FMOD_STUDIO_SYSTEM; +typedef struct FMOD_STUDIO_EVENTDESCRIPTION FMOD_STUDIO_EVENTDESCRIPTION; +typedef struct FMOD_STUDIO_EVENTINSTANCE FMOD_STUDIO_EVENTINSTANCE; +typedef struct FMOD_STUDIO_CUEINSTANCE FMOD_STUDIO_CUEINSTANCE; +typedef struct FMOD_STUDIO_PARAMETERINSTANCE FMOD_STUDIO_PARAMETERINSTANCE; +typedef struct FMOD_STUDIO_BUS FMOD_STUDIO_BUS; +typedef struct FMOD_STUDIO_VCA FMOD_STUDIO_VCA; +typedef struct FMOD_STUDIO_BANK FMOD_STUDIO_BANK; +typedef struct FMOD_STUDIO_COMMANDREPLAY FMOD_STUDIO_COMMANDREPLAY; + + +/* +[DEFINE] +[ + [NAME] + FMOD_STUDIO_INITFLAGS + + [DESCRIPTION] + Studio System initialization flags. + Use them with Studio::System::initialize in the *studioflags* parameter to change various behavior. + + [REMARKS] + + [SEE_ALSO] + Studio::System::initialize +] +*/ +#define FMOD_STUDIO_INIT_NORMAL 0x00000000 /* Initialize normally. */ +#define FMOD_STUDIO_INIT_LIVEUPDATE 0x00000001 /* Enable live update. */ +#define FMOD_STUDIO_INIT_ALLOW_MISSING_PLUGINS 0x00000002 /* Load banks even if they reference plugins that have not been loaded. */ +#define FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE 0x00000004 /* Disable asynchronous processing and perform all processing on the calling thread instead. */ +#define FMOD_STUDIO_INIT_DEFERRED_CALLBACKS 0x00000008 /* Defer timeline callbacks until the main update. See Studio::EventInstance::setCallback for more information. */ +/* [DEFINE_END] */ + +typedef unsigned int FMOD_STUDIO_INITFLAGS; + + +/* +[ENUM] +[ + [DESCRIPTION] + These values describe the loading status of various objects. + + [REMARKS] + Calling Studio::System::loadBankFile, Studio::System::loadBankMemory or Studio::System::loadBankCustom + will trigger loading of metadata from the bank. + + Calling Studio::EventDescription::loadSampleData, Studio::EventDescription::createInstance + or Studio::Bank::loadSampleData may trigger asynchronous loading of sample data. + + [SEE_ALSO] + Studio::EventDescription::getSampleLoadingState + Studio::Bank::getLoadingState + Studio::Bank::getSampleLoadingState +] +*/ +typedef enum FMOD_STUDIO_LOADING_STATE +{ + FMOD_STUDIO_LOADING_STATE_UNLOADING, /* Currently unloading. */ + FMOD_STUDIO_LOADING_STATE_UNLOADED, /* Not loaded. */ + FMOD_STUDIO_LOADING_STATE_LOADING, /* Loading in progress. */ + FMOD_STUDIO_LOADING_STATE_LOADED, /* Loaded and ready to play. */ + FMOD_STUDIO_LOADING_STATE_ERROR, /* Failed to load and is now in error state. */ + + FMOD_STUDIO_LOADING_STATE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_STUDIO_LOADING_STATE; + + +/* +[ENUM] +[ + [DESCRIPTION] + Specifies how to use the memory buffer passed to Studio::System::loadBankMemory. + + [REMARKS] + + [SEE_ALSO] + Studio::System::loadBankMemory + Studio::Bank::unload +] +*/ +typedef enum FMOD_STUDIO_LOAD_MEMORY_MODE +{ + FMOD_STUDIO_LOAD_MEMORY, /* When passed to Studio::System::loadBankMemory, FMOD duplicates the memory into its own buffers. Your buffer can be freed after Studio::System::loadBankMemory returns. */ + FMOD_STUDIO_LOAD_MEMORY_POINT, /* This differs from FMOD_STUDIO_LOAD_MEMORY in that FMOD uses the memory as is, without duplicating the memory into its own buffers. Cannot not be freed after load, only after calling Studio::Bank::unload. */ + + FMOD_STUDIO_LOAD_MEMORY_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_STUDIO_LOAD_MEMORY_MODE; + + +/* +[ENUM] +[ + [DESCRIPTION] + Describes the type of a parameter. + + [REMARKS] + There are two primary types of parameters: game controlled and automatic. + Game controlled parameters receive their value from the API using + Studio::ParameterInstance::setValue. Automatic parameters are updated inside + FMOD based on the positional information of the event and listener. + + **Horizontal angle** means the angle between vectors projected onto the + listener's XZ plane (for the EVENT_ORIENTATION and DIRECTION parameters) + or the global XZ plane (for the LISTENER_ORIENTATION parameter). + + [SEE_ALSO] + FMOD_STUDIO_PARAMETER_DESCRIPTION + Studio::ParameterInstance::setValue + Studio::EventInstance::set3DAttributes + Studio::System::setListenerAttributes +] +*/ +typedef enum FMOD_STUDIO_PARAMETER_TYPE +{ + FMOD_STUDIO_PARAMETER_GAME_CONTROLLED, /* Controlled via the API using Studio::ParameterInstance::setValue. */ + FMOD_STUDIO_PARAMETER_AUTOMATIC_DISTANCE, /* Distance between the event and the listener. */ + FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_CONE_ANGLE, /* Angle between the event's forward vector and the vector pointing from the event to the listener (0 to 180 degrees). */ + FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_ORIENTATION, /* Horizontal angle between the event's forward vector and listener's forward vector (-180 to 180 degrees). */ + FMOD_STUDIO_PARAMETER_AUTOMATIC_DIRECTION, /* Horizontal angle between the listener's forward vector and the vector pointing from the listener to the event (-180 to 180 degrees). */ + FMOD_STUDIO_PARAMETER_AUTOMATIC_ELEVATION, /* Angle between the listener's XZ plane and the vector pointing from the listener to the event (-90 to 90 degrees). */ + FMOD_STUDIO_PARAMETER_AUTOMATIC_LISTENER_ORIENTATION, /* Horizontal angle between the listener's forward vector and the global positive Z axis (-180 to 180 degrees). */ + + FMOD_STUDIO_PARAMETER_MAX, /* Maximum number of parameter types supported. */ + FMOD_STUDIO_PARAMETER_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_STUDIO_PARAMETER_TYPE; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Information for loading a bank with Studio::System::loadBankCustom. + + [REMARKS] + + [SEE_ALSO] + Studio::System::loadBankCustom +] +*/ +typedef struct FMOD_STUDIO_BANK_INFO +{ + int size; /* The size of this struct (for binary compatibility) */ + void *userData; /* User data to be passed to the file callbacks */ + int userDataLength; /* If this is non-zero, userData will be copied internally */ + FMOD_FILE_OPEN_CALLBACK openCallback; /* Callback for opening this file. */ + FMOD_FILE_CLOSE_CALLBACK closeCallback; /* Callback for closing this file. */ + FMOD_FILE_READ_CALLBACK readCallback; /* Callback for reading from this file. */ + FMOD_FILE_SEEK_CALLBACK seekCallback; /* Callback for seeking within this file. */ +} FMOD_STUDIO_BANK_INFO; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Structure describing an event parameter. + + [REMARKS] + + [SEE_ALSO] + Studio::EventDescription::getParameter + FMOD_STUDIO_PARAMETER_TYPE +] +*/ +typedef struct FMOD_STUDIO_PARAMETER_DESCRIPTION +{ + const char *name; /* Name of the parameter. */ + float minimum; /* Minimum parameter value. */ + float maximum; /* Maximum parameter value. */ + FMOD_STUDIO_PARAMETER_TYPE type; /* Type of the parameter */ +} FMOD_STUDIO_PARAMETER_DESCRIPTION; + + +/* +[ENUM] +[ + [DESCRIPTION] + These definitions describe a user property's type. + + [REMARKS] + + [SEE_ALSO] + FMOD_STUDIO_USER_PROPERTY +] +*/ +typedef enum FMOD_STUDIO_USER_PROPERTY_TYPE +{ + FMOD_STUDIO_USER_PROPERTY_TYPE_INTEGER, /* Integer property */ + FMOD_STUDIO_USER_PROPERTY_TYPE_BOOLEAN, /* Boolean property */ + FMOD_STUDIO_USER_PROPERTY_TYPE_FLOAT, /* Float property */ + FMOD_STUDIO_USER_PROPERTY_TYPE_STRING, /* String property */ + + FMOD_STUDIO_USER_PROPERTY_TYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_STUDIO_USER_PROPERTY_TYPE; + + +/* +[ENUM] +[ + [DESCRIPTION] + These definitions describe built-in event properties. + + [REMARKS] + For FMOD_STUDIO_EVENT_PROPERTY_CHANNELPRIORITY, a value of -1 uses the priority + set in FMOD Studio, while other values override it. This property uses the same + system as Channel::setPriority; this means lower values are higher priority + (i.e. 0 is the highest priority while 256 is the lowest). + + [SEE_ALSO] + Studio::EventInstance::getProperty + Studio::EventInstance::setProperty +] +*/ +typedef enum FMOD_STUDIO_EVENT_PROPERTY +{ + FMOD_STUDIO_EVENT_PROPERTY_CHANNELPRIORITY, /* Priority to set on low-level channels created by this event instance (-1 to 256). */ + FMOD_STUDIO_EVENT_PROPERTY_SCHEDULE_DELAY, /* Schedule delay to synchronized playback for multiple tracks in DSP clocks, or -1 for default. */ + FMOD_STUDIO_EVENT_PROPERTY_SCHEDULE_LOOKAHEAD, /* Schedule look-ahead on the timeline in DSP clocks, or -1 for default. */ + FMOD_STUDIO_EVENT_PROPERTY_MINIMUM_DISTANCE, /* Override the event's 3D minimum distance, or -1 for default. */ + FMOD_STUDIO_EVENT_PROPERTY_MAXIMUM_DISTANCE, /* Override the event's 3D maximum distance, or -1 for default. */ + FMOD_STUDIO_EVENT_PROPERTY_MAX, /* Maximum number of event properties supported. */ + + FMOD_STUDIO_EVENT_PROPERTY_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_STUDIO_EVENT_PROPERTY; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Structure describing a user property. + + [REMARKS] + + [SEE_ALSO] + Studio::EventDescription::getUserProperty +] +*/ +typedef struct FMOD_STUDIO_USER_PROPERTY +{ + const char *name; /* Name of the user property. */ + FMOD_STUDIO_USER_PROPERTY_TYPE type; /* Type of the user property. Use this to select one of the following values. */ + + union + { + int intValue; /* Value of the user property. Only valid when type is FMOD_STUDIO_USER_PROPERTY_TYPE_INTEGER. */ + FMOD_BOOL boolValue; /* Value of the user property. Only valid when type is FMOD_STUDIO_USER_PROPERTY_TYPE_BOOLEAN. */ + float floatValue; /* Value of the user property. Only valid when type is FMOD_STUDIO_USER_PROPERTY_TYPE_FLOAT. */ + const char *stringValue; /* Value of the user property. Only valid when type is FMOD_STUDIO_USER_PROPERTY_TYPE_STRING. */ + }; +} FMOD_STUDIO_USER_PROPERTY; + + +/* +[DEFINE] +[ + [NAME] + FMOD_STUDIO_SYSTEM_CALLBACK_TYPE + + [DESCRIPTION] + These callback types are used with Studio::System::setCallback. + + [REMARKS] + + [SEE_ALSO] + FMOD_STUDIO_SYSTEM_CALLBACK + Studio::System::setCallback +] +*/ +#define FMOD_STUDIO_SYSTEM_CALLBACK_PREUPDATE 0x00000001 /* Called at the start of the main Studio update. For async mode this will be on its own thread. */ +#define FMOD_STUDIO_SYSTEM_CALLBACK_POSTUPDATE 0x00000002 /* Called at the end of the main Studio update. For async mode this will be on its own thread. */ +#define FMOD_STUDIO_SYSTEM_CALLBACK_BANK_UNLOAD 0x00000004 /* Called when bank has just been unloaded, after all resources are freed. CommandData will be the bank handle.*/ +#define FMOD_STUDIO_SYSTEM_CALLBACK_ALL 0xFFFFFFFF /* Pass this mask to Studio::System::setCallback to receive all callback types. */ +/* [DEFINE_END] */ + +typedef unsigned int FMOD_STUDIO_SYSTEM_CALLBACK_TYPE; + + +/* +[DEFINE] +[ + [NAME] + FMOD_STUDIO_EVENT_CALLBACK_TYPE + + [DESCRIPTION] + These callback types are used with FMOD_STUDIO_EVENT_CALLBACK. + + [REMARKS] + The data passed to the event callback function in the *parameters* argument varies based on the callback type. + + FMOD_STUDIO_EVENT_CALLBACK_STARTED is called when: + + * Studio::EventInstance::start has been called on an event which was not already playing. + + FMOD_STUDIO_EVENT_CALLBACK_RESTARTED is called when: + + * Studio::EventInstance::start has been called on an event which was already playing. + + FMOD_STUDIO_EVENT_CALLBACK_STOPPED is called when: + + * The event has stopped due to Studio::EventInstance::stop being called with FMOD_STUDIO_STOP_IMMEDIATE. + * The event has finished fading out after Studio::EventInstance::stop was called with FMOD_STUDIO_STOP_ALLOWFADEOUT. + * The event has stopped naturally by reaching the end of the timeline, and no further sounds can be triggered due to + parameter changes. + + FMOD_STUDIO_EVENT_CALLBACK_CREATE_PROGRAMMER_SOUND is called when: + + * A programmer sound is about to play. FMOD expects the callback to provide an FMOD::Sound object for it to use. + + FMOD_STUDIO_EVENT_CALLBACK_DESTROY_PROGRAMMER_SOUND is called when: + + * A programmer sound has stopped playing. At this point it is safe to release the FMOD::Sound object that was used. + + [SEE_ALSO] + Studio::EventDescription::setCallback + Studio::EventInstance::setCallback + FMOD_STUDIO_EVENT_CALLBACK +] +*/ +#define FMOD_STUDIO_EVENT_CALLBACK_STARTED 0x00000001 /* Called when an instance starts. Parameters = unused. */ +#define FMOD_STUDIO_EVENT_CALLBACK_RESTARTED 0x00000002 /* Called when an instance is restarted. Parameters = unused. */ +#define FMOD_STUDIO_EVENT_CALLBACK_STOPPED 0x00000004 /* Called when an instance stops. Parameters = unused. */ +#define FMOD_STUDIO_EVENT_CALLBACK_CREATE_PROGRAMMER_SOUND 0x00000008 /* Called when a programmer sound needs to be created in order to play a programmer instrument. Parameters = FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES. */ +#define FMOD_STUDIO_EVENT_CALLBACK_DESTROY_PROGRAMMER_SOUND 0x00000010 /* Called when a programmer sound needs to be destroyed. Parameters = FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES. */ +#define FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_CREATED 0x00000020 /* Called when a DSP plugin instance has just been created. Parameters = FMOD_STUDIO_PLUGIN_INSTANCE_PROPERTIES. */ +#define FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_DESTROYED 0x00000040 /* Called when a DSP plugin instance is about to be destroyed. Parameters = FMOD_STUDIO_PLUGIN_INSTANCE_PROPERTIES. */ +#define FMOD_STUDIO_EVENT_CALLBACK_CREATED 0x00000080 /* Called when an instance is fully created. Parameters = unused. */ +#define FMOD_STUDIO_EVENT_CALLBACK_DESTROYED 0x00000100 /* Called when an instance is just about to be destroyed. Parameters = unused. */ +#define FMOD_STUDIO_EVENT_CALLBACK_START_FAILED 0x00000200 /* Called when an instance did not start, e.g. due to polyphony. Parameters = unused. */ +#define FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_MARKER 0x00000400 /* Called when the timeline passes a named marker. Parameters = FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES. */ +#define FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_BEAT 0x00000800 /* Called when the timeline hits a beat in a tempo section. Parameters = FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES. */ +#define FMOD_STUDIO_EVENT_CALLBACK_ALL 0xFFFFFFFF /* Pass this mask to Studio::EventDescription::setCallback or Studio::EventInstance::setCallback to receive all callback types. */ +/* [DEFINE_END] */ + +typedef unsigned int FMOD_STUDIO_EVENT_CALLBACK_TYPE; + +/* +[STRUCTURE] +[ + [DESCRIPTION] + This structure holds information about a programmer sound. + + [REMARKS] + This data is passed to the event callback function when type is FMOD_STUDIO_EVENT_CALLBACK_CREATE_PROGRAMMER_SOUND + or FMOD_STUDIO_EVENT_CALLBACK_DESTROY_PROGRAMMER_SOUND. + + To support non-blocking loading of FSB subsounds, you can specify the subsound you want to use by setting the + subsoundIndex field. This will cause FMOD to wait until the provided sound is ready and then get the specified + subsound from it. + + [SEE_ALSO] + FMOD_STUDIO_EVENT_CALLBACK + Studio::EventDescription::setCallback + Studio::EventInstance::setCallback +] +*/ +typedef struct FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES +{ + const char *name; /* The name of the programmer instrument (set in FMOD Studio). */ + FMOD_SOUND *sound; /* The programmer-created sound. This should be filled in by the create callback, and cleaned up by the destroy callback. This can be cast to/from FMOD::Sound* type. */ + int subsoundIndex; /* The index of the subsound to use, or -1 if the provided sound should be used directly. Defaults to -1. */ +} FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + This structure holds information about a DSP plugin instance. + + [REMARKS] + This data is passed to the event callback function when type is FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_CREATED + or FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_DESTROYED. + + [SEE_ALSO] + FMOD_STUDIO_EVENT_CALLBACK + Studio::EventDescription::setCallback + Studio::EventInstance::setCallback +] +*/ +typedef struct FMOD_STUDIO_PLUGIN_INSTANCE_PROPERTIES +{ + const char *name; /* The name of the plugin effect or sound (set in FMOD Studio). */ + FMOD_DSP *dsp; /* The DSP plugin instance. This can be cast to FMOD::DSP* type. */ +} FMOD_STUDIO_PLUGIN_INSTANCE_PROPERTIES; + +/* +[STRUCTURE] +[ + [DESCRIPTION] + This structure holds information about a marker on the timeline. + + [REMARKS] + This data is passed to the event callback function when type is FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_MARKER. + + [SEE_ALSO] + FMOD_STUDIO_EVENT_CALLBACK + Studio::EventDescription::setCallback + Studio::EventInstance::setCallback +] +*/ +typedef struct FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES +{ + const char* name; /* The marker name */ + int position; /* The position of the marker on the timeline in milliseconds. */ +} FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES; + +/* +[STRUCTURE] +[ + [DESCRIPTION] + This structure holds information about a beat on the timeline. + + [REMARKS] + This data is passed to the event callback function when type is FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_BEAT. + + [SEE_ALSO] + FMOD_STUDIO_EVENT_CALLBACK + Studio::EventDescription::setCallback + Studio::EventInstance::setCallback +] +*/ +typedef struct FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES +{ + int bar; /* The bar number (starting from 1). */ + int beat; /* The beat number within the bar (starting from 1). */ + int position; /* The position of the beat on the timeline in milliseconds. */ + float tempo; /* The current tempo in beats per minute. */ + int timeSignatureUpper; /* The current time signature upper number (beats per bar). */ + int timeSignatureLower; /* The current time signature lower number (beat unit). */ +} FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES; + +/* +[ENUM] +[ + [DESCRIPTION] + These values describe the playback state of an event instance. + + [REMARKS] + + [SEE_ALSO] + Studio::EventInstance::getPlaybackState + Studio::EventInstance::start + Studio::EventInstance::stop + Studio::CueInstance::trigger + Studio::ParameterInstance::setValue +] +*/ +typedef enum FMOD_STUDIO_PLAYBACK_STATE +{ + FMOD_STUDIO_PLAYBACK_PLAYING, /* Currently playing. */ + FMOD_STUDIO_PLAYBACK_SUSTAINING, /* The timeline cursor is paused on a sustain point. */ + FMOD_STUDIO_PLAYBACK_STOPPED, /* Not playing. */ + FMOD_STUDIO_PLAYBACK_STARTING, /* Start has been called but the instance is not fully started yet. */ + FMOD_STUDIO_PLAYBACK_STOPPING, /* Stop has been called but the instance is not fully stopped yet. */ + + FMOD_STUDIO_PLAYBACK_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_STUDIO_PLAYBACK_STATE; + + +/* +[ENUM] +[ + [DESCRIPTION] + Controls how to stop playback of an event instance. + + [REMARKS] + + [SEE_ALSO] + Studio::EventInstance::stop + Studio::Bus::stopAllEvents +] +*/ +typedef enum FMOD_STUDIO_STOP_MODE +{ + FMOD_STUDIO_STOP_ALLOWFADEOUT, /* Allows AHDSR modulators to complete their release, and DSP effect tails to play out. */ + FMOD_STUDIO_STOP_IMMEDIATE, /* Stops the event instance immediately. */ + + FMOD_STUDIO_STOP_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_STUDIO_STOP_MODE; + + +/* +[DEFINE] +[ + [NAME] + FMOD_STUDIO_LOAD_BANK_FLAGS + + [DESCRIPTION] + Flags passed into Studio loadBank commands to control bank load behaviour. + + [REMARKS] + + [SEE_ALSO] + Studio::System::loadBankFile + Studio::System::loadBankMemory + Studio::System::loadBankCustom +] +*/ +#define FMOD_STUDIO_LOAD_BANK_NORMAL 0x00000000 /* Standard behaviour. */ +#define FMOD_STUDIO_LOAD_BANK_NONBLOCKING 0x00000001 /* Bank loading occurs asynchronously rather than occurring immediately. */ +#define FMOD_STUDIO_LOAD_BANK_DECOMPRESS_SAMPLES 0x00000002 /* Force samples to decompress into memory when they are loaded, rather than staying compressed. */ +/* [DEFINE_END] */ + +typedef unsigned int FMOD_STUDIO_LOAD_BANK_FLAGS; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Settings for advanced features like configuring memory and cpu usage. + + [REMARKS] + Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value.
    + Members marked with [w] mean the variable can be written to. The user can set the value.
    + Members marked with [r/w] are either read or write depending on if you are using System::setAdvancedSettings (w) or System::getAdvancedSettings (r). + + [SEE_ALSO] + Studio::System::setAdvancedSettings + Studio::System::getAdvancedSettings + FMOD_MODE +] +*/ +typedef struct FMOD_STUDIO_ADVANCEDSETTINGS +{ + int cbSize; /* [w] Size of this structure. Use sizeof(FMOD_STUDIO_ADVANCEDSETTINGS) NOTE: This must be set before calling Studio::System::getAdvancedSettings or Studio::System::setAdvancedSettings! */ + unsigned int commandQueueSize; /* [r/w] Optional. Specify 0 to ignore. Specify the command queue size for studio async processing. Default 32kB. */ + unsigned int handleInitialSize; /* [r/w] Optional. Specify 0 to ignore. Specify the initial size to allocate for handles. Memory for handles will grow as needed in pages. Default 8192 * sizeof(void*) */ + int studioUpdatePeriod; /* [r/w] Optional. Specify 0 to ignore. Specify the update period of Studio when in async mode, in milliseconds. Will be quantised to the nearest multiple of mixer duration. Default is 20ms. */ +} FMOD_STUDIO_ADVANCEDSETTINGS; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Performance information for FMOD Studio and low level systems. + + [REMARKS] + + [SEE_ALSO] + Studio::System::getCPUUsage +] +*/ +typedef struct FMOD_STUDIO_CPU_USAGE +{ + float dspUsage; /* Returns the % CPU time taken by DSP processing on the low level mixer thread. */ + float streamUsage; /* Returns the % CPU time taken by stream processing on the low level stream thread. */ + float geometryUsage; /* Returns the % CPU time taken by geometry processing on the low level geometry thread. */ + float updateUsage; /* Returns the % CPU time taken by low level update, called as part of the studio update. */ + float studioUsage; /* Returns the % CPU time taken by studio update, called from the studio thread. Does not include low level update time. */ +} FMOD_STUDIO_CPU_USAGE; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Information for a single buffer in FMOD Studio. + + [REMARKS] + + [SEE_ALSO] + FMOD_STUDIO_BUFFER_USAGE +] +*/ +typedef struct FMOD_STUDIO_BUFFER_INFO +{ + int currentUsage; /* Current buffer usage in bytes. */ + int peakUsage; /* Peak buffer usage in bytes. */ + int capacity; /* Buffer capacity in bytes. */ + int stallCount; /* Cumulative number of stalls due to buffer overflow. */ + float stallTime; /* Cumulative amount of time stalled due to buffer overflow, in seconds. */ +} FMOD_STUDIO_BUFFER_INFO; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Information for FMOD Studio buffer usage. + + [REMARKS] + + [SEE_ALSO] + Studio::System::getBufferUsage + Studio::System::resetBufferUsage + FMOD_STUDIO_BUFFER_INFO +] +*/ +typedef struct FMOD_STUDIO_BUFFER_USAGE +{ + FMOD_STUDIO_BUFFER_INFO studioCommandQueue; /* Information for the Studio Async Command buffer, controlled by FMOD_STUDIO_ADVANCEDSETTINGS commandQueueSize. */ + FMOD_STUDIO_BUFFER_INFO studioHandle; /* Information for the Studio handle table, controlled by FMOD_STUDIO_ADVANCEDSETTINGS handleInitialSize. */ +} FMOD_STUDIO_BUFFER_USAGE; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Information for loading a sound from a sound table. + + [REMARKS] + The name_or_data member points into FMOD internal memory, which will become + invalid if the sound table bank is unloaded. + + If mode flags such as FMOD_CREATESTREAM or FMOD_NONBLOCKING are required, + they should be ORed together with the mode member when calling System::createSound. + + [SEE_ALSO] + Studio::System::getSoundInfo + System::createSound +] +*/ +typedef struct FMOD_STUDIO_SOUND_INFO +{ + const char* name_or_data; /* The filename or memory buffer that contains the sound. */ + FMOD_MODE mode; /* Mode flags required for loading the sound. */ + FMOD_CREATESOUNDEXINFO exinfo; /* Extra information required for loading the sound. */ + int subsoundIndex; /* Subsound index for loading the sound. */ +} FMOD_STUDIO_SOUND_INFO; + + +/* +[DEFINE] +[ + [NAME] + FMOD_STUDIO_COMMANDCAPTURE_FLAGS + + [DESCRIPTION] + Flags passed into Studio::System::startCommandCapture. + + [REMARKS] + + [SEE_ALSO] + Studio::System::startCommandCapture +] +*/ +#define FMOD_STUDIO_COMMANDCAPTURE_NORMAL 0x00000000 /* Standard behaviour. */ +#define FMOD_STUDIO_COMMANDCAPTURE_FILEFLUSH 0x00000001 /* Call file flush on every command. */ +#define FMOD_STUDIO_COMMANDCAPTURE_SKIP_INITIAL_STATE 0x00000002 /* Normally the initial state of banks and instances is captured, unless this flag is set. */ +/* [DEFINE_END] */ + +typedef unsigned int FMOD_STUDIO_COMMANDCAPTURE_FLAGS; + + +/* +[DEFINE] +[ + [NAME] + FMOD_STUDIO_COMMANDREPLAY_FLAGS + + [DESCRIPTION] + Flags passed into Studio::System::loadCommandReplay. + + [REMARKS] + + [SEE_ALSO] + Studio::System::loadCommandReplay +] +*/ +#define FMOD_STUDIO_COMMANDREPLAY_NORMAL 0x00000000 /* Standard behaviour. */ +#define FMOD_STUDIO_COMMANDREPLAY_SKIP_CLEANUP 0x00000001 /* Normally the playback will release any created resources when it stops, unless this flag is set. */ +/* [DEFINE_END] */ + +typedef unsigned int FMOD_STUDIO_COMMANDREPLAY_FLAGS; + + +/* +[ENUM] +[ + [DESCRIPTION] + Used to distinguish the types used in command replays. + + [REMARKS] + + [SEE_ALSO] +] +*/ +typedef enum FMOD_STUDIO_INSTANCETYPE +{ + FMOD_STUDIO_INSTANCETYPE_NONE, + FMOD_STUDIO_INSTANCETYPE_SYSTEM, + FMOD_STUDIO_INSTANCETYPE_EVENTDESCRIPTION, + FMOD_STUDIO_INSTANCETYPE_EVENTINSTANCE, + FMOD_STUDIO_INSTANCETYPE_PARAMETERINSTANCE, + FMOD_STUDIO_INSTANCETYPE_CUEINSTANCE, + FMOD_STUDIO_INSTANCETYPE_BUS, + FMOD_STUDIO_INSTANCETYPE_VCA, + FMOD_STUDIO_INSTANCETYPE_BANK, + FMOD_STUDIO_INSTANCETYPE_COMMANDREPLAY, + + FMOD_STUDIO_INSTANCETYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_STUDIO_INSTANCETYPE; + + +/* +[STRUCTURE] +[ + [DESCRIPTION] + Information about a single command in a command replay file. + + [REMARKS] + This information has metadata about the command at the given index. Note that the handle fields are + from the recorded session, and will no longer correspond to any actual object type in the current + system. + + [SEE_ALSO] + Studio::CommandReplay::getCommandInfo +] +*/ +typedef struct FMOD_STUDIO_COMMAND_INFO +{ + const char* commandName; /* The full name of the API function for this command. */ + int parentCommandIndex; /* For commands that operate on an instance, this is the command that created the instance. */ + int frameNumber; /* The frame the command belongs to. */ + float frameTime; /* The playback time at which this command will be executed. */ + FMOD_STUDIO_INSTANCETYPE instanceType; /* The type of object that this command uses as an instance. */ + FMOD_STUDIO_INSTANCETYPE outputType; /* The type of object that this command outputs, if any. */ + unsigned int instanceHandle; /* The original handle value of the instance. This will no longer correspond to any actual object in playback. */ + unsigned int outputHandle; /* The original handle value of the command output. This will no longer correspond to any actual object in playback. */ +} FMOD_STUDIO_COMMAND_INFO; + + +/* + FMOD Studio callbacks. +*/ +typedef FMOD_RESULT (F_CALLBACK *FMOD_STUDIO_SYSTEM_CALLBACK) (FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_SYSTEM_CALLBACK_TYPE type, void *commanddata, void *userdata); +typedef FMOD_RESULT (F_CALLBACK *FMOD_STUDIO_EVENT_CALLBACK) (FMOD_STUDIO_EVENT_CALLBACK_TYPE type, FMOD_STUDIO_EVENTINSTANCE *event, void *parameters); +typedef FMOD_RESULT (F_CALLBACK *FMOD_STUDIO_COMMANDREPLAY_FRAME_CALLBACK) (FMOD_STUDIO_COMMANDREPLAY *replay, int commandIndex, float currentTime, void *userdata); +typedef FMOD_RESULT (F_CALLBACK *FMOD_STUDIO_COMMANDREPLAY_LOAD_BANK_CALLBACK) (FMOD_STUDIO_COMMANDREPLAY *replay, int commandIndex, const FMOD_GUID *bankGuid, const char *bankFilename, FMOD_STUDIO_LOAD_BANK_FLAGS flags, FMOD_STUDIO_BANK **bank, void *userdata); +typedef FMOD_RESULT (F_CALLBACK *FMOD_STUDIO_COMMANDREPLAY_CREATE_INSTANCE_CALLBACK) (FMOD_STUDIO_COMMANDREPLAY *replay, int commandIndex, FMOD_STUDIO_EVENTDESCRIPTION *eventDescription, FMOD_STUDIO_EVENTINSTANCE **instance, void *userdata); + +#endif // FMOD_STUDIO_COMMON_H diff --git a/Plugins/FMODStudio/Source/FMODStudio/Public/FMODStudioModule.h b/Plugins/FMODStudio/Source/FMODStudio/Public/FMODStudioModule.h new file mode 100644 index 0000000..82bb184 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Public/FMODStudioModule.h @@ -0,0 +1,155 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#pragma once + +#include "ModuleManager.h" + +namespace FMOD +{ + namespace Studio + { + class System; + class EventDescription; + class EventInstance; + } +} + +class UFMODAsset; +class UFMODEvent; +class UWorld; +class AAudioVolume; +struct FInteriorSettings; +struct FFMODListener; // Currently only for private use, we don't export this type + +// Which FMOD Studio system to use +namespace EFMODSystemContext +{ + enum Type + { + // For use auditioning sounds within the editor + Auditioning, + + // For use in PIE and in-game + Runtime, + + // Max number of types + Max + }; +} + +/** + * The public interface to this module + */ +class IFMODStudioModule : public IModuleInterface +{ +public: + + /** + * Singleton-like access to this module's interface. This is just for convenience! + * Beware of calling this during the shutdown phase, though. Your module might have been unloaded already. + * + * @return Returns singleton instance, loading the module on demand if needed + */ + static inline IFMODStudioModule& Get() + { + return FModuleManager::LoadModuleChecked< IFMODStudioModule >( "FMODStudio" ); + } + + /** + * Checks to see if this module is loaded and ready. It is only valid to call Get() if IsAvailable() returns true. + * + * @return True if the module is loaded and ready to use + */ + static inline bool IsAvailable() + { + return FModuleManager::Get().IsModuleLoaded( "FMODStudio" ); + } + + /** + * Get a pointer to the runtime studio system (only valid in-game or in PIE) + */ + virtual FMOD::Studio::System* GetStudioSystem(EFMODSystemContext::Type Context) = 0; + + /** + * Set system paused (for PIE pause) + */ + virtual void SetSystemPaused(bool paused) = 0; + + /** + * Called when user changes any studio settings + */ + virtual void RefreshSettings() = 0; + + /** + * Called when we enter of leave PIE mode + */ + virtual void SetInPIE(bool bInPIE, bool bSimulating) = 0; + + /** + * Look up an asset given its name + */ + virtual UFMODAsset* FindAssetByName(const FString& Name) = 0; + + /** + * Look up an event given its name + */ + virtual UFMODEvent* FindEventByName(const FString& Name) = 0; + + /** + * Get an event description. + * The system type can control which Studio system to use, or leave it as System_Max for it to choose automatically. + */ + virtual FMOD::Studio::EventDescription* GetEventDescription(const UFMODEvent* Event, EFMODSystemContext::Type Context = EFMODSystemContext::Max) = 0; + + /** + * Create a single auditioning instance using the auditioning system + */ + virtual FMOD::Studio::EventInstance* CreateAuditioningInstance(const UFMODEvent* Event) = 0; + + /** + * Stop any auditioning instance + */ + virtual void StopAuditioningInstance() = 0; + + /** + * Return whether the listener(s) have moved + */ + virtual bool HasListenerMoved() = 0; + + /** + * Called to change the listener position for editor mode + */ + virtual void SetListenerPosition(int ListenerIndex, UWorld* World, const FTransform& ListenerTransform, float DeltaSeconds) = 0; + + /** + * Called to change the listener position for editor mode + */ + virtual void FinishSetListenerPosition(int NumListeners, float DeltaSeconds) = 0; + + /** + * Return the audio settings for the listener nearest the given location + */ + virtual const FFMODListener& GetNearestListener(const FVector& Location) = 0; + + /** This event is fired after all banks were reloaded */ + virtual FSimpleMulticastDelegate& BanksReloadedEvent() = 0; + + /** Return a list of banks that failed to load due to an error */ + virtual TArray GetFailedBankLoads(EFMODSystemContext::Type Context) = 0; + + /** Return a list of plugins that appear to be needed */ + virtual TArray GetRequiredPlugins() = 0; + + /** Register a plugin that is required */ + virtual void AddRequiredPlugin(const FString& Plugin) = 0; + + /** Returns whether sound is enabled for the game */ + virtual bool UseSound() = 0; + + /** Attempts to load a plugin by name */ + virtual bool LoadPlugin(const TCHAR* ShortName) = 0; + + /** Log a FMOD error */ + virtual void LogError(int result, const char* function) = 0; + +}; diff --git a/Plugins/FMODStudio/Source/FMODStudio/Public/FMODUtils.h b/Plugins/FMODStudio/Source/FMODStudio/Public/FMODUtils.h new file mode 100644 index 0000000..f51dd2a --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudio/Public/FMODUtils.h @@ -0,0 +1,190 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#pragma once + +#include "fmod_studio.hpp" +#include "fmod.hpp" + +#include "FMODStudioModule.h" + +#define verifyfmod(fn) { FMOD_RESULT _result = (fn); if (_result != FMOD_OK) { FMODUtils::LogError(_result, #fn); } } + +namespace FMODUtils +{ + +// Unreal defines 1 unit == 1cm, so convert to metres for Studio automatically +#define FMOD_VECTOR_SCALE_DEFAULT 0.01f + +// Just call into module +inline void LogError(FMOD_RESULT result, const char* function) +{ + IFMODStudioModule::Get().LogError(result, function); +} + +inline void Assign(FMOD_VECTOR& Dest, const FVector& Src, float Scale=1.0f) +{ + Dest.x = Src.X * Scale; + Dest.y = Src.Y * Scale; + Dest.z = Src.Z * Scale; +} + +inline void Assign(FMOD_3D_ATTRIBUTES& Dest, const FTransform& Src) +{ + Assign(Dest.position, Src.GetTranslation(), FMOD_VECTOR_SCALE_DEFAULT); + Assign(Dest.forward, Src.GetUnitAxis(EAxis::X), 1.0f); + Assign(Dest.up, Src.GetUnitAxis(EAxis::Z), 1.0f); +} + +inline FMOD_VECTOR ConvertWorldVector(const FVector& Src) +{ + FMOD_VECTOR Dest; + Assign(Dest, Src, FMOD_VECTOR_SCALE_DEFAULT); + return Dest; +} + +inline FMOD_VECTOR ConvertUnitVector(const FVector& Src) +{ + FMOD_VECTOR Dest; + Dest.x = Src.X; + Dest.y = Src.Y; + Dest.z = Src.Z; + return Dest; +} + +inline float DistanceToUEScale(float FMODDistance) +{ + return FMODDistance / FMOD_VECTOR_SCALE_DEFAULT; +} + +inline bool IsWorldAudible(UWorld* World) +{ + if (GEngine && IFMODStudioModule::Get().UseSound()) + { + if (World == nullptr) + { + return true; + } + + if (World->bAllowAudioPlayback && World->GetNetMode() != NM_DedicatedServer) + { + if (World->IsGameWorld() || World->WorldType == EWorldType::Preview) + { + return true; + } + } + } + return false; +} + +inline FMOD::Studio::ID ConvertGuid(const FGuid& UnrealGuid) +{ + // Unreal doesn't follow the usual windows GUID format, instead it parses + // them as 4 integers + FMOD::Studio::ID StudioGuid; + FMemory::Memcpy(&StudioGuid, &UnrealGuid, sizeof(StudioGuid)); + Swap(StudioGuid.Data2, StudioGuid.Data3); + Swap(StudioGuid.Data4[0], StudioGuid.Data4[3]); + Swap(StudioGuid.Data4[1], StudioGuid.Data4[2]); + Swap(StudioGuid.Data4[4], StudioGuid.Data4[7]); + Swap(StudioGuid.Data4[5], StudioGuid.Data4[6]); + return StudioGuid; +} + +inline FGuid ConvertGuid(const FMOD::Studio::ID& StudioGuid) +{ + // Unreal doesn't follow the usual windows GUID format, instead it parses + // them as 4 integers + FMOD::Studio::ID CopiedGuid; + FMemory::Memcpy(&CopiedGuid, &StudioGuid, sizeof(StudioGuid)); + Swap(CopiedGuid.Data2, CopiedGuid.Data3); + Swap(CopiedGuid.Data4[0], CopiedGuid.Data4[3]); + Swap(CopiedGuid.Data4[1], CopiedGuid.Data4[2]); + Swap(CopiedGuid.Data4[4], CopiedGuid.Data4[7]); + Swap(CopiedGuid.Data4[5], CopiedGuid.Data4[6]); + FGuid UnrealGuid; + FMemory::Memcpy(&UnrealGuid, &CopiedGuid, sizeof(CopiedGuid)); + return UnrealGuid; +} + +template +inline FGuid GetID(StudioType* Instance) +{ + FMOD::Studio::ID StudioID = {0}; + verifyfmod(Instance->getID(&StudioID)); + return FMODUtils::ConvertGuid(StudioID); +} + +template +inline FString GetPath(StudioType* Instance) +{ + int ActualSize = 128; // Start with expected enough space + TArray RawBuffer; + FMOD_RESULT Result; + do + { + RawBuffer.SetNum(ActualSize); + Result = Instance->getPath(RawBuffer.GetData(), ActualSize, &ActualSize); + } + while (Result == FMOD_ERR_TRUNCATED); + + if (Result == FMOD_OK) + { + return FString(UTF8_TO_TCHAR(RawBuffer.GetData())); + } + else + { + return FString(); + } +} + +inline FString LookupNameFromGuid(FMOD::Studio::System* StudioSystem, const FMOD::Studio::ID& Guid) +{ + int ActualSize = 128; // Start with expected enough space + TArray RawBuffer; + FMOD_RESULT Result; + do + { + RawBuffer.SetNum(ActualSize); + Result = StudioSystem->lookupPath(&Guid, RawBuffer.GetData(), ActualSize, &ActualSize); + } + while (Result == FMOD_ERR_TRUNCATED); + + if (Result == FMOD_OK) + { + return FString(UTF8_TO_TCHAR(RawBuffer.GetData())); + } + else + { + return FString(); + } +} + +inline FString LookupNameFromGuid(FMOD::Studio::System* StudioSystem, const FGuid& Guid) +{ + return LookupNameFromGuid(StudioSystem, ConvertGuid(Guid)); +} + +inline FString ParameterTypeToString(FMOD_STUDIO_PARAMETER_TYPE Type) +{ + switch (Type) + { + case FMOD_STUDIO_PARAMETER_GAME_CONTROLLED: + return FString("Game Controlled"); + case FMOD_STUDIO_PARAMETER_AUTOMATIC_DISTANCE: + return FString("Distance (Auto)"); + case FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_CONE_ANGLE: + return FString("Event Cone Angle (Auto)"); + case FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_ORIENTATION: + return FString("Event Orientation (Auto)"); + case FMOD_STUDIO_PARAMETER_AUTOMATIC_DIRECTION: + return FString("Direction (Auto)"); + case FMOD_STUDIO_PARAMETER_AUTOMATIC_ELEVATION: + return FString("Elevation (Auto)"); + case FMOD_STUDIO_PARAMETER_AUTOMATIC_LISTENER_ORIENTATION: + return FString("Listener Orientation (Auto)"); + } + + return FString(); +} + +} \ No newline at end of file diff --git a/Plugins/FMODStudio/Source/FMODStudioEditor/Classes/FMODAmbientSoundActorFactory.h b/Plugins/FMODStudio/Source/FMODStudioEditor/Classes/FMODAmbientSoundActorFactory.h new file mode 100644 index 0000000..9d168e1 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudioEditor/Classes/FMODAmbientSoundActorFactory.h @@ -0,0 +1,23 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#pragma once + +#include "FMODAmbientSoundActorFactory.generated.h" + +/** FMOD Ambient Sound Actor Factory. +*/ +UCLASS(MinimalAPI, config=Editor, collapsecategories, hidecategories=Object) +class UFMODAmbientSoundActorFactory : public UActorFactory +{ + GENERATED_UCLASS_BODY() + + // Begin UActorFactory Interface + virtual void PostSpawnActor( UObject* Asset, AActor* NewActor ) override; + virtual void PostCreateBlueprint( UObject* Asset, AActor* CDO ) override; + virtual bool CanCreateActorFrom( const FAssetData& AssetData, FText& OutErrorMsg ) override; + virtual UObject* GetAssetFromActorInstance(AActor* ActorInstance) override; + // End UActorFactory Interface +}; + + + diff --git a/Plugins/FMODStudio/Source/FMODStudioEditor/FMODStudioEditor.Build.cs b/Plugins/FMODStudio/Source/FMODStudioEditor/FMODStudioEditor.Build.cs new file mode 100644 index 0000000..c420055 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudioEditor/FMODStudioEditor.Build.cs @@ -0,0 +1,58 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +namespace UnrealBuildTool.Rules +{ + public class FMODStudioEditor : ModuleRules + { + public FMODStudioEditor(TargetInfo Target) + { + bFasterWithoutUnity = true; + + PublicIncludePaths.AddRange( + new string[] { + } + ); + + PrivateIncludePaths.AddRange( + new string[] { + "FMODStudioEditor/Private", + "FMODStudio/Private", + } + ); + + PublicDependencyModuleNames.AddRange( + new string[] + { + "Core", + "CoreUObject", + "Engine", + "FMODStudio" + } + ); + + PrivateDependencyModuleNames.AddRange( + new string[] + { + "UnrealEd", + "Slate", + "SlateCore", + "InputCore", + "Settings", + "EditorStyle", + "LevelEditor", + "AssetTools", + "AssetRegistry", + "PropertyEditor", + "WorkspaceMenuStructure", + "Sockets" + } + ); + + DynamicallyLoadedModuleNames.AddRange( + new string[] + { + } + ); + } + } +} \ No newline at end of file diff --git a/Plugins/FMODStudio/Source/FMODStudioEditor/Private/AssetTypeActions_FMODEvent.cpp b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/AssetTypeActions_FMODEvent.cpp new file mode 100644 index 0000000..43614fb --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/AssetTypeActions_FMODEvent.cpp @@ -0,0 +1,152 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#include "FMODStudioEditorPrivatePCH.h" +#include "AssetTypeActions_Base.h" +#include "AssetTypeActions_FMODEvent.h" +#include "FMODEventEditor.h" +#include "FMODEvent.h" +#include "FMODUtils.h" +#include "FMODStudioModule.h" +#include "FMODStudioEditorModule.h" + +#define LOCTEXT_NAMESPACE "AssetTypeActions" + +FAssetTypeActions_FMODEvent::FAssetTypeActions_FMODEvent() + : CurrentPreviewEventInstance(nullptr) +{ + BeginPIEDelegateHandle = FEditorDelegates::BeginPIE.AddRaw(this, &FAssetTypeActions_FMODEvent::HandleBeginPIE); + IFMODStudioModule::Get().BanksReloadedEvent().AddRaw(this, &FAssetTypeActions_FMODEvent::HandleBanksReloaded); +} + +FAssetTypeActions_FMODEvent::~FAssetTypeActions_FMODEvent() +{ + FEditorDelegates::BeginPIE.Remove(BeginPIEDelegateHandle); + IFMODStudioModule::Get().BanksReloadedEvent().RemoveAll(this); + IFMODStudioModule::Get().StopAuditioningInstance(); +} + +UClass* FAssetTypeActions_FMODEvent::GetSupportedClass() const +{ + return UFMODEvent::StaticClass(); +} + +void FAssetTypeActions_FMODEvent::GetActions(const TArray& InObjects, FMenuBuilder& MenuBuilder) +{ + auto Events = GetTypedWeakObjectPtrs(InObjects); + + + MenuBuilder.AddMenuEntry( + LOCTEXT("FMODEvent_Play", "Play"), + LOCTEXT("FMODEvent_PlayTooltip", "Plays the selected FMOD event."), + FSlateIcon(FEditorStyle::GetStyleSetName(), "MediaAsset.AssetActions.Play"), + FUIAction( + FExecuteAction::CreateSP(this, &FAssetTypeActions_FMODEvent::ExecutePlay, Events), + FCanExecuteAction::CreateSP(this, &FAssetTypeActions_FMODEvent::CanExecutePlayCommand, Events) + ) + ); + + MenuBuilder.AddMenuEntry( + LOCTEXT("FMODEvent_Stop", "Stop"), + LOCTEXT("FMODEvent_StopTooltip", "Stops the currently playing FMOD event."), + FSlateIcon(FEditorStyle::GetStyleSetName(), "MediaAsset.AssetActions.Stop"), + FUIAction( + FExecuteAction::CreateSP(this, &FAssetTypeActions_FMODEvent::ExecuteStop, Events), + FCanExecuteAction() + ) + ); +} + +void FAssetTypeActions_FMODEvent::OpenAssetEditor(const TArray& InObjects, TSharedPtr EditWithinLevelEditor) +{ + EToolkitMode::Type Mode = EditWithinLevelEditor.IsValid() ? EToolkitMode::WorldCentric : EToolkitMode::Standalone; + + for (auto ObjIt = InObjects.CreateConstIterator(); ObjIt; ++ObjIt) + { + auto Event = Cast(*ObjIt); + if (Event != nullptr) + { + TSharedRef NewFMODEventEditor(new FFMODEventEditor()); + NewFMODEventEditor->InitFMODEventEditor(Mode, EditWithinLevelEditor, Event); + } + } +} + +bool FAssetTypeActions_FMODEvent::CanExecutePlayCommand(TArray> Objects) const +{ + return Objects.Num() == 1; +} + +void FAssetTypeActions_FMODEvent::AssetsActivated(const TArray& InObjects, EAssetTypeActivationMethod::Type ActivationType) +{ + if (ActivationType == EAssetTypeActivationMethod::Previewed) + { + for (auto ObjIt = InObjects.CreateConstIterator(); ObjIt; ++ObjIt) + { + UFMODEvent* Event = Cast(*ObjIt); + if (Event != nullptr) + { + // Only play the first valid event + PlayEvent(Event); + break; + } + } + } + else + { + FAssetTypeActions_Base::AssetsActivated(InObjects, ActivationType); + } +} + +void FAssetTypeActions_FMODEvent::ExecuteEdit(TArray> Objects) +{ + for (auto ObjIt = Objects.CreateConstIterator(); ObjIt; ++ObjIt) + { + auto Object = (*ObjIt).Get(); + if (Object != nullptr) + { + FAssetEditorManager::Get().OpenEditorForAsset(Object); + } + } +} + +void FAssetTypeActions_FMODEvent::ExecutePlay(TArray> Objects) +{ + for (auto ObjIt = Objects.CreateConstIterator(); ObjIt; ++ObjIt) + { + UFMODEvent* Event = (*ObjIt).Get(); + if (Event != nullptr) + { + // Only play the first valid event + PlayEvent(Event); + break; + } + } +} + +void FAssetTypeActions_FMODEvent::ExecuteStop(TArray> Objects) +{ + IFMODStudioModule::Get().StopAuditioningInstance(); +} + +void FAssetTypeActions_FMODEvent::PlayEvent(UFMODEvent* Event) +{ + CurrentPreviewEventInstance = IFMODStudioModule::Get().CreateAuditioningInstance(Event); + if (CurrentPreviewEventInstance != nullptr) + { + CurrentPreviewEventInstance->start(); + } +} + +void FAssetTypeActions_FMODEvent::HandleBeginPIE(bool bSimulating) +{ + // Studio module will handle its own auditioning, just clear the handle + CurrentPreviewEventInstance = nullptr; +} + +void FAssetTypeActions_FMODEvent::HandleBanksReloaded() +{ + // Studio module will handle its own auditioning, just clear the handle + CurrentPreviewEventInstance = nullptr; +} + +#undef LOCTEXT_NAMESPACE diff --git a/Plugins/FMODStudio/Source/FMODStudioEditor/Private/AssetTypeActions_FMODEvent.h b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/AssetTypeActions_FMODEvent.h new file mode 100644 index 0000000..2319ef4 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/AssetTypeActions_FMODEvent.h @@ -0,0 +1,55 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#pragma once + +#include "AssetTypeActions_Base.h" + +namespace FMOD +{ + namespace Studio + { + class EventInstance; + } +} + +class UFMODEvent; + +class FAssetTypeActions_FMODEvent : public FAssetTypeActions_Base +{ +public: + FAssetTypeActions_FMODEvent(); + ~FAssetTypeActions_FMODEvent(); + + // IAssetTypeActions Implementation + virtual FText GetName() const override { return NSLOCTEXT("AssetTypeActions", "AssetTypeActions_FMODEvent", "FMOD Event"); } + virtual FColor GetTypeColor() const override { return FColor(0, 175, 255); } + virtual UClass* GetSupportedClass() const override; + virtual bool HasActions(const TArray& InObjects) const override { return true; } + virtual void GetActions(const TArray& InObjects, FMenuBuilder& MenuBuilder) override; + virtual void AssetsActivated(const TArray& InObjects, EAssetTypeActivationMethod::Type ActivationType) override; + virtual void OpenAssetEditor(const TArray& InObjects, TSharedPtr EditWithinLevelEditor = TSharedPtr()) override; + virtual bool CanFilter() override { return false; } + virtual uint32 GetCategories() override { return EAssetTypeCategories::Sounds; } + +private: + /** Returns true if only one event is selected to play */ + bool CanExecutePlayCommand(TArray> Objects) const; + + /** Handler for when Edit is selected */ + void ExecuteEdit(TArray> Objects); + + /** Handler for when Play is selected */ + void ExecutePlay(TArray> Objects); + + /** Handler for when Stop is selected */ + void ExecuteStop(TArray> Objects); + + /** Plays the event */ + void PlayEvent(UFMODEvent* Event); + + void HandleBeginPIE(bool bSimulating); + void HandleBanksReloaded(); + + FMOD::Studio::EventInstance* CurrentPreviewEventInstance; + FDelegateHandle BeginPIEDelegateHandle; +}; diff --git a/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAmbientSoundActorFactory.cpp b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAmbientSoundActorFactory.cpp new file mode 100644 index 0000000..7efb35e --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAmbientSoundActorFactory.cpp @@ -0,0 +1,66 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#include "FMODStudioEditorPrivatePCH.h" +#include "AssetData.h" +#include "FMODAmbientSoundActorFactory.h" +#include "FMODAmbientSound.h" +#include "FMODEvent.h" + +UFMODAmbientSoundActorFactory::UFMODAmbientSoundActorFactory(const FObjectInitializer& ObjectInitializer) + : Super(ObjectInitializer) +{ + DisplayName = NSLOCTEXT("FMOD", "FMODAmbientSoundDisplayName", "FMOD Ambient Sound"); + NewActorClass = AFMODAmbientSound::StaticClass(); +} + +bool UFMODAmbientSoundActorFactory::CanCreateActorFrom( const FAssetData& AssetData, FText& OutErrorMsg ) +{ + //We allow creating AAmbientSounds without an existing sound asset + if ( UActorFactory::CanCreateActorFrom( AssetData, OutErrorMsg ) ) + { + return true; + } + + if ( AssetData.IsValid() && !AssetData.GetClass()->IsChildOf( UFMODEvent::StaticClass() ) ) + { + OutErrorMsg = NSLOCTEXT("FMOD", "CanCreateActorFrom_NoFMODEventAsset", "A valid FMOD Event asset must be specified."); + return false; + } + + return true; +} + +void UFMODAmbientSoundActorFactory::PostSpawnActor( UObject* Asset, AActor* NewActor) +{ + UFMODEvent* Event = Cast( Asset ); + + if ( Event != NULL ) + { + AFMODAmbientSound* NewSound = CastChecked( NewActor ); + FActorLabelUtilities::SetActorLabelUnique(NewSound, Event->GetName()); + NewSound->AudioComponent->Event = Event; + } +} + +UObject* UFMODAmbientSoundActorFactory::GetAssetFromActorInstance(AActor* Instance) +{ + check(Instance->IsA(NewActorClass)); + AFMODAmbientSound* SoundActor = CastChecked(Instance); + + check(SoundActor->AudioComponent); + return SoundActor->AudioComponent->Event.Get(); +} + +void UFMODAmbientSoundActorFactory::PostCreateBlueprint( UObject* Asset, AActor* CDO ) +{ + if (Asset != NULL && CDO != NULL) + { + UFMODEvent* Event = Cast(Asset); + + if (Event != NULL) + { + AFMODAmbientSound* NewSound = CastChecked(CDO); + NewSound->AudioComponent->Event = Event; + } + } +} \ No newline at end of file diff --git a/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAmbientSoundDetails.cpp b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAmbientSoundDetails.cpp new file mode 100644 index 0000000..2379ece --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAmbientSoundDetails.cpp @@ -0,0 +1,119 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#include "FMODStudioEditorPrivatePCH.h" +#include "FMODAmbientSoundDetails.h" +#include "Toolkits/AssetEditorManager.h" +#include "FMODAmbientSound.h" +#include "FMODStudioModule.h" +#include "FMODEvent.h" +#include "fmod_studio.hpp" + +#define LOCTEXT_NAMESPACE "FMODStudio" + +TSharedRef FFMODAmbientSoundDetails::MakeInstance() +{ + return MakeShareable( new FFMODAmbientSoundDetails ); +} + +void FFMODAmbientSoundDetails::CustomizeDetails( IDetailLayoutBuilder& DetailBuilder ) +{ + const TArray< TWeakObjectPtr >& SelectedObjects = DetailBuilder.GetDetailsView().GetSelectedObjects(); + + for( int32 ObjectIndex = 0; !AmbientSound.IsValid() && ObjectIndex < SelectedObjects.Num(); ++ObjectIndex ) + { + const TWeakObjectPtr& CurrentObject = SelectedObjects[ObjectIndex]; + if ( CurrentObject.IsValid() ) + { + AmbientSound = Cast(CurrentObject.Get()); + } + } + + DetailBuilder.EditCategory(TEXT("Sound")) + .AddCustomRow(FText::GetEmpty()) + [ + SNew(SVerticalBox) + + SVerticalBox::Slot() + .Padding( 0, 2.0f, 0, 0 ) + .FillHeight(1.0f) + .VAlign( VAlign_Center ) + [ + SNew(SHorizontalBox) + +SHorizontalBox::Slot() + .AutoWidth() + .Padding( 2.0f, 0.0f ) + .VAlign(VAlign_Center) + .HAlign(HAlign_Left) + [ + SNew(SButton) + .VAlign(VAlign_Center) + .OnClicked( this, &FFMODAmbientSoundDetails::OnEditSoundClicked ) + .Text( LOCTEXT("EditAsset", "Edit") ) + .ToolTipText( LOCTEXT("EditAssetToolTip", "Edit this sound cue") ) + ] + +SHorizontalBox::Slot() + .AutoWidth() + .Padding( 2.0f, 0.0f ) + .VAlign(VAlign_Center) + .HAlign(HAlign_Left) + [ + SNew(SButton) + .VAlign(VAlign_Center) + .OnClicked( this, &FFMODAmbientSoundDetails::OnPlaySoundClicked ) + .Text( LOCTEXT("PlaySoundCue", "Play") ) + ] + +SHorizontalBox::Slot() + .AutoWidth() + .Padding( 2.0f, 0.0f ) + .VAlign(VAlign_Center) + .HAlign(HAlign_Left) + [ + SNew(SButton) + .VAlign(VAlign_Center) + .OnClicked( this, &FFMODAmbientSoundDetails::OnStopSoundClicked ) + .Text( LOCTEXT("StopSoundCue", "Stop") ) + ] + ] + ]; +} + + +FReply FFMODAmbientSoundDetails::OnEditSoundClicked() +{ + if( AmbientSound.IsValid() ) + { + UFMODEvent* Event = AmbientSound.Get()->AudioComponent->Event.Get(); + if (Event) + { + FAssetEditorManager::Get().OpenEditorForAsset(Event); + } + } + + return FReply::Handled(); +} + +FReply FFMODAmbientSoundDetails::OnPlaySoundClicked() +{ + if( AmbientSound.IsValid() ) + { + UFMODEvent* Event = AmbientSound.Get()->AudioComponent->Event.Get(); + if (Event) + { + FMOD::Studio::EventInstance* Instance = IFMODStudioModule::Get().CreateAuditioningInstance(Event); + if (Instance) + { + Instance->start(); + } + } + } + + return FReply::Handled(); +} + +FReply FFMODAmbientSoundDetails::OnStopSoundClicked() +{ + IFMODStudioModule::Get().StopAuditioningInstance(); + + return FReply::Handled(); +} + +#undef LOCTEXT_NAMESPACE diff --git a/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAmbientSoundDetails.h b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAmbientSoundDetails.h new file mode 100644 index 0000000..2a21e62 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAmbientSoundDetails.h @@ -0,0 +1,23 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#pragma once + +#include "PropertyEditing.h" +#include "PropertyCustomizationHelpers.h" + +class FFMODAmbientSoundDetails : public IDetailCustomization +{ +public: + /** Makes a new instance of this detail layout class for a specific detail view requesting it */ + static TSharedRef MakeInstance(); + +private: + /** IDetailCustomization interface */ + virtual void CustomizeDetails( IDetailLayoutBuilder& DetailBuilder ) override; + + FReply OnEditSoundClicked(); + FReply OnPlaySoundClicked(); + FReply OnStopSoundClicked(); + + TWeakObjectPtr AmbientSound; +}; \ No newline at end of file diff --git a/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAssetBroker.h b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAssetBroker.h new file mode 100644 index 0000000..09ff26f --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAssetBroker.h @@ -0,0 +1,43 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#pragma once + +#include "ComponentAssetBroker.h" +#include "FMODEvent.h" + +////////////////////////////////////////////////////////////////////////// +// FFMODAssetBroker + +class FFMODAssetBroker : public IComponentAssetBroker +{ +public: + UClass* GetSupportedAssetClass() override + { + return UFMODEvent::StaticClass(); + } + + virtual bool AssignAssetToComponent(UActorComponent* InComponent, UObject* InAsset) override + { + if (UFMODAudioComponent* AudioComp = Cast(InComponent)) + { + UFMODEvent* Event = Cast(InAsset); + + if ((Event != NULL) || (InAsset == NULL)) + { + AudioComp->Event = Event; + return true; + } + } + return false; + } + + virtual UObject* GetAssetFromComponent(UActorComponent* InComponent) override + { + if (UFMODAudioComponent* AudioComp = Cast(InComponent)) + { + return AudioComp->Event.Get(); + } + return NULL; + } +}; + diff --git a/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAudioComponentVisualizer.cpp b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAudioComponentVisualizer.cpp new file mode 100644 index 0000000..5e96678 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAudioComponentVisualizer.cpp @@ -0,0 +1,45 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#include "FMODStudioEditorPrivatePCH.h" +#include "FMODAudioComponentVisualizer.h" +#include "FMODAudioComponent.h" +#include "FMODUtils.h" +#include "FMODEvent.h" +#include "fmod_studio.hpp" + +void FFMODAudioComponentVisualizer::DrawVisualization(const UActorComponent* Component, const FSceneView* View, FPrimitiveDrawInterface* PDI) +{ + if (View->Family->EngineShowFlags.AudioRadius) + { + const UFMODAudioComponent* AudioComp = Cast(Component); + if (AudioComp != nullptr && AudioComp->Event.IsValid()) + { + FMOD::Studio::EventDescription* EventDesc = IFMODStudioModule::Get().GetEventDescription(AudioComp->Event.Get(), EFMODSystemContext::Auditioning); + if (EventDesc != nullptr) + { + bool bIs3D = false; + EventDesc->is3D(&bIs3D); + if (bIs3D) + { + const FColor AudioOuterRadiusColor(255, 153, 0); + const FColor AudioInnerRadiusColor(216, 130, 0); + + const FTransform& Transform = AudioComp->ComponentToWorld; + + float MinDistance = 0.0f; + float MaxDistance = 0.0f; + EventDesc->getMinimumDistance(&MinDistance); + EventDesc->getMaximumDistance(&MaxDistance); + MinDistance = FMODUtils::DistanceToUEScale(MinDistance); + MaxDistance = FMODUtils::DistanceToUEScale(MaxDistance); + + DrawWireSphereAutoSides(PDI, Transform.GetTranslation(), AudioOuterRadiusColor, MinDistance, SDPG_World); + if (MaxDistance != MinDistance) + { + DrawWireSphereAutoSides(PDI, Transform.GetTranslation(), AudioInnerRadiusColor, MaxDistance, SDPG_World); + } + } + } + } + } +} diff --git a/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAudioComponentVisualizer.h b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAudioComponentVisualizer.h new file mode 100644 index 0000000..c3dd007 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAudioComponentVisualizer.h @@ -0,0 +1,13 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#pragma once + +#include "ComponentVisualizer.h" + +class FFMODAudioComponentVisualizer : public FComponentVisualizer +{ +public: + // Begin FComponentVisualizer interface + virtual void DrawVisualization(const UActorComponent* Component, const FSceneView* View, FPrimitiveDrawInterface* PDI) override; + // End FComponentVisualizer interface +}; diff --git a/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODEventEditor.cpp b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODEventEditor.cpp new file mode 100644 index 0000000..d8006c7 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODEventEditor.cpp @@ -0,0 +1,187 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#include "FMODStudioEditorPrivatePCH.h" +#include "FMODEventEditor.h" +#include "FMODEvent.h" +#include "FMODStudioModule.h" +#include "FMODUtils.h" +#include "SFMODEventEditorPanel.h" +#include "SDockTab.h" +//#include "WorkspaceMenuStructureModule.h" +#include "fmod_studio.hpp" + +#define LOCTEXT_NAMESPACE "FMODEventEditor" + +DEFINE_LOG_CATEGORY_STATIC(LogFMODEventEditor, Log, All); + +const FName FFMODEventEditor::EventEditorTabId(TEXT("FFMODEventEditor_EventView")); +const FName FFMODEventEditor::FMODEventEditorAppIdentifier(TEXT("FMODEventEditorApp")); + +void FFMODEventEditor::RegisterTabSpawners(const TSharedRef& TabManager) +{ + WorkspaceMenuCategory = TabManager->AddLocalWorkspaceMenuCategory(LOCTEXT("WorkspaceMenu_FMODEventEditor", "FMOD Event Editor")); + auto WorkspaceMenuCategoryRef = WorkspaceMenuCategory.ToSharedRef(); + + FAssetEditorToolkit::RegisterTabSpawners(TabManager); + + TabManager->RegisterTabSpawner( + EventEditorTabId, + FOnSpawnTab::CreateSP(this, &FFMODEventEditor::SpawnTab_EventEditor)) + .SetDisplayName(LOCTEXT("EventTab", "FMOD Event")) + .SetGroup(WorkspaceMenuCategoryRef); +} + +void FFMODEventEditor::UnregisterTabSpawners(const TSharedRef& TabManager) +{ + FAssetEditorToolkit::UnregisterTabSpawners(TabManager); + + TabManager->UnregisterTabSpawner(EventEditorTabId); +} + +FFMODEventEditor::FFMODEventEditor() + : CurrentPreviewEventInstance(nullptr) +{ + IFMODStudioModule::Get().BanksReloadedEvent().AddRaw(this, &FFMODEventEditor::HandleBanksReloaded); + BeginPIEDelegateHandle = FEditorDelegates::BeginPIE.AddRaw(this, &FFMODEventEditor::HandleBeginPIE); +} + +FFMODEventEditor::~FFMODEventEditor() +{ + IFMODStudioModule::Get().BanksReloadedEvent().RemoveAll(this); + FEditorDelegates::BeginPIE.Remove(BeginPIEDelegateHandle); + + CurrentPreviewEventInstance = nullptr; +} + +UFMODEvent* FFMODEventEditor::GetEditedEvent() const +{ + return EditedEvent; +} + +FMOD::Studio::EventDescription* FFMODEventEditor::GetEventDescription() const +{ + return IFMODStudioModule::Get().GetEventDescription(EditedEvent, EFMODSystemContext::Auditioning); +} + +void FFMODEventEditor::PlayEvent() +{ + CurrentPreviewEventInstance = IFMODStudioModule::Get().CreateAuditioningInstance(EditedEvent); + if (CurrentPreviewEventInstance != nullptr) + { + for (int32 ParamIdx = 0; ParamIdx < ParameterValues.Num(); ParamIdx++) + { + CurrentPreviewEventInstance->setParameterValueByIndex(ParamIdx, ParameterValues[ParamIdx]); + } + + CurrentPreviewEventInstance->start(); + } +} + +void FFMODEventEditor::PauseEvent() +{ + if (CurrentPreviewEventInstance != nullptr) + { + bool bIsPaused = false; + CurrentPreviewEventInstance->getPaused(&bIsPaused); + CurrentPreviewEventInstance->setPaused(!bIsPaused); + } +} + +void FFMODEventEditor::StopEvent() +{ + IFMODStudioModule::Get().StopAuditioningInstance(); +} + +void FFMODEventEditor::SetParameterValue(int32 ParameterIdx, float Value) +{ + ParameterValues[ParameterIdx] = Value; + + if (CurrentPreviewEventInstance != nullptr) + { + CurrentPreviewEventInstance->setParameterValueByIndex(ParameterIdx, Value); + } +} + +TArray& FFMODEventEditor::GetParameterValues() +{ + return ParameterValues; +} + +void FFMODEventEditor::InitFMODEventEditor(const EToolkitMode::Type Mode, const TSharedPtr< class IToolkitHost >& InitToolkitHost, UFMODEvent* Event) +{ + EditedEvent = Event; + + TSharedRef StandaloneDefaultLayout = FTabManager::NewLayout("Standalone_FMODEventEditor_Layout") + ->AddArea + ( + FTabManager::NewPrimaryArea()->SetOrientation(Orient_Vertical) + ->Split + ( + FTabManager::NewStack() + ->AddTab(EventEditorTabId, ETabState::OpenedTab)->SetHideTabWell(true) + ) + ); + + const bool bCreateDefaultStandaloneMenu = true; + const bool bCreateDefaultToolbar = false; + FAssetEditorToolkit::InitAssetEditor(Mode, InitToolkitHost, FFMODEventEditor::FMODEventEditorAppIdentifier, StandaloneDefaultLayout, bCreateDefaultStandaloneMenu, bCreateDefaultToolbar, Event); +} + +FName FFMODEventEditor::GetToolkitFName() const +{ + return FName("FMODEventEditor"); +} + +FText FFMODEventEditor::GetBaseToolkitName() const +{ + return LOCTEXT("ToolkitName", "FMOD Event Editor"); +} + +FString FFMODEventEditor::GetWorldCentricTabPrefix() const +{ + return LOCTEXT("WorldCentricTabPrefix", "FMOD Event ").ToString(); +} + +FLinearColor FFMODEventEditor::GetWorldCentricTabColorScale() const +{ + return FLinearColor(0.0f, 0.0f, 0.5f, 0.5f); +} + +void FFMODEventEditor::CreateInternalWidgets() +{ + FMODEventEditorPanel = SNew(SFMODEventEditorPanel) + .FMODEventEditor(SharedThis(this)); +} + +TSharedRef FFMODEventEditor::SpawnTab_EventEditor(const FSpawnTabArgs& Args) +{ + check(Args.GetTabId().TabType == EventEditorTabId); + + CreateInternalWidgets(); + + return SAssignNew(OwnerTab, SDockTab) + .Label(LOCTEXT("EventEditorTitle", "FMOD Event")) + .TabColorScale(GetTabColorScale()) + [ + FMODEventEditorPanel.ToSharedRef() + ]; +} + +void FFMODEventEditor::HandleBanksReloaded() +{ + CurrentPreviewEventInstance = nullptr; + + CreateInternalWidgets(); + + if (OwnerTab.IsValid()) + { + OwnerTab->SetContent(FMODEventEditorPanel.ToSharedRef()); + } +} + +void FFMODEventEditor::HandleBeginPIE(bool bSimulating) +{ + CurrentPreviewEventInstance = nullptr; +} + +#undef LOCTEXT_NAMESPACE diff --git a/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODEventEditor.h b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODEventEditor.h new file mode 100644 index 0000000..122b594 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODEventEditor.h @@ -0,0 +1,80 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#pragma once + +#include "Toolkits/AssetEditorToolkit.h" +#include "fmod_studio_common.h" + +namespace FMOD +{ + namespace Studio + { + class EventDescription; + class EventInstance; + } +} + +class FFMODEventEditor : public FAssetEditorToolkit +{ +public: + virtual void RegisterTabSpawners(const TSharedRef& TabManager) override; + virtual void UnregisterTabSpawners(const TSharedRef& TabManager) override; + + /** + * Edits the specified event + * + * @param Mode Asset editing mode for this editor (standalone or world-centric) + * @param InitToolkitHost When Mode is WorldCentric, this is the level editor instance to spawn this editor within + * @param Event The event to edit + */ + void InitFMODEventEditor(const EToolkitMode::Type Mode, const TSharedPtr< class IToolkitHost >& InitToolkitHost, class UFMODEvent* Event); + + /** Constructor */ + FFMODEventEditor(); + + /** Destructor */ + virtual ~FFMODEventEditor(); + + UFMODEvent* GetEditedEvent() const; + FMOD::Studio::EventDescription* GetEventDescription() const; + void PlayEvent(); + void PauseEvent(); + void StopEvent(); + void SetParameterValue(int32 ParameterIdx, float Value); + TArray& GetParameterValues(); + + /** IToolkit interface */ + virtual FName GetToolkitFName() const override; + virtual FText GetBaseToolkitName() const override; + virtual FString GetWorldCentricTabPrefix() const override; + virtual FLinearColor GetWorldCentricTabColorScale() const override; + + TArray ParameterValues; + +private: + + FMOD::Studio::EventInstance* CurrentPreviewEventInstance; + + void HandlePreBanksReloaded(); + void HandleBanksReloaded(); + void HandleBeginPIE(bool bSimulating); + + /** Creates all internal widgets for the tabs to point at */ + void CreateInternalWidgets(); + + /** Spawns the tab with the FMOD event inside */ + TSharedRef SpawnTab_EventEditor(const FSpawnTabArgs& Args); + + TSharedPtr FMODEventEditorPanel; + TSharedPtr OwnerTab; + + /** The tab id for the event editor tab */ + static const FName EventEditorTabId; + + /** FMOD event editor app identifier string */ + static const FName FMODEventEditorAppIdentifier; + + class UFMODEvent* EditedEvent; + + FDelegateHandle BeginPIEDelegateHandle; +}; diff --git a/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODStudioEditorModule.cpp b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODStudioEditorModule.cpp new file mode 100644 index 0000000..fc1d525 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODStudioEditorModule.cpp @@ -0,0 +1,872 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#include "FMODStudioEditorPrivatePCH.h" + +#include "FMODStudioEditorModule.h" +#include "FMODStudioModule.h" +#include "FMODStudioStyle.h" +#include "FMODAudioComponent.h" +#include "FMODAssetBroker.h" +#include "FMODSettings.h" +#include "FMODUtils.h" + +#include "FMODEventEditor.h" +#include "FMODAudioComponentVisualizer.h" +#include "FMODAmbientSoundDetails.h" + +#include "SlateBasics.h" +#include "AssetTypeActions_FMODEvent.h" +#include "NotificationManager.h" +#include "SNotificationList.h" +#include "ISettingsModule.h" +#include "ISettingsSection.h" +#include "Editor.h" +#include "SceneViewport.h" +#include "LevelEditor.h" +#include "SocketSubsystem.h" +#include "Sockets.h" +#include "IPAddress.h" + +#include "fmod_studio.hpp" + +#define LOCTEXT_NAMESPACE "FMODStudio" + +DEFINE_LOG_CATEGORY(LogFMOD); + +class FFMODStudioLink +{ +public: + FFMODStudioLink() + : SocketSubsystem(nullptr), + Socket(nullptr) + { + SocketSubsystem = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM); + } + + ~FFMODStudioLink() + { + Disconnect(); + } + + bool Connect() + { + if (!SocketSubsystem) return false; + + Disconnect(); + Socket = SocketSubsystem->CreateSocket(NAME_Stream, TEXT("FMOD Studio Connection"), false); + + TSharedRef Addr = SocketSubsystem->CreateInternetAddr(); + bool Valid = false; + Addr->SetIp(TEXT("127.0.0.1"), Valid); + if (!Valid) return false; + + Addr->SetPort(3663); + return Socket->Connect(*Addr); + } + + void Disconnect() + { + if (SocketSubsystem && Socket) + { + SocketSubsystem->DestroySocket(Socket); + Socket = nullptr; + } + } + + bool Execute(const TCHAR* Message, FString& OutMessage) + { + OutMessage = TEXT(""); + if (!Socket) + { + return false; + } + + UE_LOG(LogFMOD, Log, TEXT("Sent studio message: %s"), Message); + + FTCHARToUTF8 MessageChars(Message); + int32 BytesSent = 0; + if (!Socket->Send((const uint8*)MessageChars.Get(), MessageChars.Length(), BytesSent)) + { + return false; + } + + while (1) + { + FString BackMessage; + if (!ReadMessage(BackMessage)) + { + return false; + } + UE_LOG(LogFMOD, Log, TEXT("Received studio message: %s"), *BackMessage); + if (BackMessage.StartsWith(TEXT("out(): "))) + { + OutMessage = BackMessage.Mid(7).TrimTrailing(); + break; + } + else + { + // Keep going + } + } + return true; + } +private: + bool ReadMessage(FString& OutMessage) + { + while (1) + { + for (int32 i=0; iWait(ESocketWaitConditions::WaitForRead, FTimespan::FromSeconds(10))) + { + return false; + } + else if (!Socket->Recv((uint8*)ReceivedMessage.GetData() + CurrentSize, ExtraSpace, ActualRead)) + { + return false; + } + ReceivedMessage.SetNum(CurrentSize + ActualRead); + } + } + + ISocketSubsystem* SocketSubsystem; + FSocket* Socket; + TArray ReceivedMessage; +}; + +class FFMODStudioEditorModule : public IFMODStudioEditorModule +{ +public: + /** IModuleInterface implementation */ + FFMODStudioEditorModule() : + bSimulating(false), + bIsInPIE(false), + bRegisteredComponentVisualizers(false) + { + } + + virtual void StartupModule() override; + virtual void PostLoadCallback() override; + virtual void ShutdownModule() override; + + bool HandleSettingsSaved(); + + /** Called after all banks were reloaded by the studio module */ + void HandleBanksReloaded(); + + /** Show notification */ + void ShowNotification(const FText& Text, SNotificationItem::ECompletionState State); + + void BeginPIE(bool simulating); + void EndPIE(bool simulating); + void PausePIE(bool simulating); + void ResumePIE(bool simulating); + + void ViewportDraw(UCanvas* Canvas, APlayerController*); + + bool Tick( float DeltaTime ); + + /** Add extensions to menu */ + void AddHelpMenuExtension(FMenuBuilder& MenuBuilder); + void AddFileMenuExtension(FMenuBuilder& MenuBuilder); + + /** Show FMOD version */ + void ShowVersion(); + /** Open CHM */ + void OpenCHM(); + /** Open web page to online docs */ + void OpenOnlineDocs(); + /** Open Video tutorials page */ + void OpenVideoTutorials(); + /** Set Studio build path */ + void ValidateFMOD(); + + /** Reload banks */ + void ReloadBanks(); + + TArray RegisteredComponentClassNames; + void RegisterComponentVisualizer(FName ComponentClassName, TSharedPtr Visualizer); + + /** The delegate to be invoked when this profiler manager ticks. */ + FTickerDelegate OnTick; + + /** Handle for registered delegates. */ + FDelegateHandle TickDelegateHandle; + FDelegateHandle BeginPIEDelegateHandle; + FDelegateHandle EndPIEDelegateHandle; + FDelegateHandle PausePIEDelegateHandle; + FDelegateHandle ResumePIEDelegateHandle; + FDelegateHandle HandleBanksReloadedDelegateHandle; + + /** Hook for drawing viewport */ + FDebugDrawDelegate ViewportDrawingDelegate; + FDelegateHandle ViewportDrawingDelegateHandle; + + TSharedPtr AssetBroker; + + /** The extender to pass to the level editor to extend it's window menu */ + TSharedPtr MainMenuExtender; + + /** Asset type actions for events (edit, play, stop) */ + TSharedPtr FMODEventAssetTypeActions; + + bool bSimulating; + bool bIsInPIE; + bool bRegisteredComponentVisualizers; +}; + +IMPLEMENT_MODULE( FFMODStudioEditorModule, FMODStudioEditor ) + +void FFMODStudioEditorModule::StartupModule() +{ + UE_LOG(LogFMOD, Log, TEXT("FFMODStudioEditorModule startup")); + + AssetBroker = MakeShareable(new FFMODAssetBroker); + FComponentAssetBrokerage::RegisterBroker(AssetBroker, UFMODAudioComponent::StaticClass(), true, true); + + if (ISettingsModule* SettingsModule = FModuleManager::GetModulePtr("Settings")) + { + ISettingsSectionPtr SettingsSection = SettingsModule->RegisterSettings("Project", "Plugins", "FMODStudio", + LOCTEXT("FMODStudioSettingsName", "FMOD Studio"), + LOCTEXT("FMODStudioDescription", "Configure the FMOD Studio plugin"), + GetMutableDefault() + ); + + if (SettingsSection.IsValid()) + { + SettingsSection->OnModified().BindRaw(this, &FFMODStudioEditorModule::HandleSettingsSaved); + } + } + + // Register the details customizations + { + FPropertyEditorModule& PropertyModule = FModuleManager::LoadModuleChecked("PropertyEditor"); + PropertyModule.RegisterCustomClassLayout("FMODAmbientSound", FOnGetDetailCustomizationInstance::CreateStatic(&FFMODAmbientSoundDetails::MakeInstance)); + PropertyModule.NotifyCustomizationModuleChanged(); + } + + // Need to load the editor module since it gets created after us, and we can't re-order ourselves otherwise our asset registration stops working! + // It only works if we are running the editor, not a commandlet + if (!IsRunningCommandlet()) + { + MainMenuExtender = MakeShareable(new FExtender); + MainMenuExtender->AddMenuExtension("HelpBrowse", EExtensionHook::After, NULL, FMenuExtensionDelegate::CreateRaw(this, &FFMODStudioEditorModule::AddHelpMenuExtension)); + MainMenuExtender->AddMenuExtension("FileLoadAndSave", EExtensionHook::After, NULL, FMenuExtensionDelegate::CreateRaw(this, &FFMODStudioEditorModule::AddFileMenuExtension)); + + FLevelEditorModule* LevelEditor = FModuleManager::LoadModulePtr(TEXT("LevelEditor")); + if (LevelEditor) + { + LevelEditor->GetMenuExtensibilityManager()->AddExtender(MainMenuExtender); + } + } + + // Register AssetTypeActions + IAssetTools& AssetTools = FModuleManager::GetModuleChecked("AssetTools").Get(); + + FMODEventAssetTypeActions = MakeShareable(new FAssetTypeActions_FMODEvent); + AssetTools.RegisterAssetTypeActions(FMODEventAssetTypeActions.ToSharedRef()); + + // Register slate style overrides + FFMODStudioStyle::Initialize(); + + BeginPIEDelegateHandle = FEditorDelegates::BeginPIE.AddRaw(this, &FFMODStudioEditorModule::BeginPIE); + EndPIEDelegateHandle = FEditorDelegates::EndPIE.AddRaw(this, &FFMODStudioEditorModule::EndPIE); + PausePIEDelegateHandle = FEditorDelegates::PausePIE.AddRaw(this, &FFMODStudioEditorModule::PausePIE); + ResumePIEDelegateHandle = FEditorDelegates::ResumePIE.AddRaw(this, &FFMODStudioEditorModule::ResumePIE); + + ViewportDrawingDelegate = FDebugDrawDelegate::CreateRaw(this, &FFMODStudioEditorModule::ViewportDraw); + ViewportDrawingDelegateHandle = UDebugDrawService::Register(TEXT("Editor"), ViewportDrawingDelegate); + + OnTick = FTickerDelegate::CreateRaw( this, &FFMODStudioEditorModule::Tick ); + TickDelegateHandle = FTicker::GetCoreTicker().AddTicker( OnTick ); + + // This module is loaded after FMODStudioModule + HandleBanksReloadedDelegateHandle = IFMODStudioModule::Get().BanksReloadedEvent().AddRaw(this, &FFMODStudioEditorModule::HandleBanksReloaded); + +} + +void FFMODStudioEditorModule::AddHelpMenuExtension(FMenuBuilder& MenuBuilder) +{ + MenuBuilder.BeginSection("FMODHelp", LOCTEXT("FMODHelpLabel", "FMOD Help")); + MenuBuilder.AddMenuEntry( + LOCTEXT("FMODVersionMenuEntryTitle", "About FMOD Studio"), + LOCTEXT("FMODVersionMenuEntryToolTip", "Shows the informationa about FMOD Studio."), + FSlateIcon(), + FUIAction(FExecuteAction::CreateRaw(this, &FFMODStudioEditorModule::ShowVersion))); + +#if PLATFORM_WINDOWS + MenuBuilder.AddMenuEntry( + LOCTEXT("FMODHelpCHMTitle", "FMOD Documentation..."), + LOCTEXT("FMODHelpCHMToolTip", "Opens the local FMOD documentation."), + FSlateIcon(FEditorStyle::GetStyleSetName(), "LevelEditor.BrowseAPIReference"), + FUIAction(FExecuteAction::CreateRaw(this, &FFMODStudioEditorModule::OpenCHM))); +#endif + + MenuBuilder.AddMenuEntry( + LOCTEXT("FMODHelpOnlineTitle", "FMOD Online Documentation..."), + LOCTEXT("FMODHelpOnlineToolTip", "Go to the online FMOD documentation."), + FSlateIcon(FEditorStyle::GetStyleSetName(), "LevelEditor.BrowseDocumentation"), + FUIAction(FExecuteAction::CreateRaw(this, &FFMODStudioEditorModule::OpenOnlineDocs))); + + MenuBuilder.AddMenuEntry( + LOCTEXT("FMODHelpVideosTitle", "FMOD Tutorial Videos..."), + LOCTEXT("FMODHelpVideosToolTip", "Go to the online FMOD tutorial videos."), + FSlateIcon(FEditorStyle::GetStyleSetName(), "LevelEditor.Tutorials"), + FUIAction(FExecuteAction::CreateRaw(this, &FFMODStudioEditorModule::OpenVideoTutorials))); + + MenuBuilder.AddMenuEntry( + LOCTEXT("FMODSetStudioBuildTitle", "Validate FMOD"), + LOCTEXT("FMODSetStudioBuildToolTip", "Verifies that FMOD and FMOD Studio are working as expected."), + FSlateIcon(), + FUIAction(FExecuteAction::CreateRaw(this, &FFMODStudioEditorModule::ValidateFMOD))); + + MenuBuilder.EndSection(); +} + +void FFMODStudioEditorModule::AddFileMenuExtension(FMenuBuilder& MenuBuilder) +{ + MenuBuilder.BeginSection("FMODFile", LOCTEXT("FMODFileLabel", "FMOD")); + MenuBuilder.AddMenuEntry( + LOCTEXT("FMODFileMenuEntryTitle", "Reload Banks"), + LOCTEXT("FMODFileMenuEntryToolTip", "Force a manual reload of all FMOD Studio banks."), + FSlateIcon(), + FUIAction(FExecuteAction::CreateRaw(this, &FFMODStudioEditorModule::ReloadBanks))); + MenuBuilder.EndSection(); +} + +unsigned int GetDLLVersion() +{ + // Just grab it from the audition context which is always valid + unsigned int DLLVersion = 0; + FMOD::Studio::System* StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Auditioning); + if (StudioSystem) + { + FMOD::System* LowLevelSystem = nullptr; + if (StudioSystem->getLowLevelSystem(&LowLevelSystem) == FMOD_OK) + { + LowLevelSystem->getVersion(&DLLVersion); + } + } + return DLLVersion; +} +unsigned int StripPatch(unsigned int FullVersion) +{ + return FullVersion & ~0xFF; +} +FString VersionToString(unsigned int FullVersion) +{ + return FString::Printf(TEXT("%x.%02x.%02x"), (FullVersion>>16), (FullVersion>>8) & 0xFF, FullVersion & 0xFF); +} + +void FFMODStudioEditorModule::ShowVersion() +{ + unsigned int HeaderVersion = FMOD_VERSION; + unsigned int DLLVersion = GetDLLVersion(); + + FText VersionMessage = FText::Format( + LOCTEXT("FMODStudio_About", "FMOD Studio\n\nBuilt Version: {0}\nDLL Version: {1}\n\nCopyright Firelight Technologies Pty Ltd"), + FText::FromString(VersionToString(HeaderVersion)), + FText::FromString(VersionToString(DLLVersion))); + FMessageDialog::Open(EAppMsgType::Ok, VersionMessage); +} + +void FFMODStudioEditorModule::OpenCHM() +{ + FString APIPath = FPaths::Combine(*FPaths::EngineDir(), TEXT("Plugins/FMODStudio/Docs/FMOD UE4 Integration.chm")); + if( IFileManager::Get().FileSize( *APIPath ) != INDEX_NONE ) + { + FString AbsoluteAPIPath = IFileManager::Get().ConvertToAbsolutePathForExternalAppForRead(*APIPath); + FPlatformProcess::LaunchFileInDefaultExternalApplication(*AbsoluteAPIPath); + } + else + { + FMessageDialog::Open(EAppMsgType::Ok, NSLOCTEXT("Documentation", "CannotFindFMODIntegration", "Cannot open FMOD Studio Integration CHM reference; help file not found.")); + } +} + +void FFMODStudioEditorModule::OpenOnlineDocs() +{ + FPlatformProcess::LaunchFileInDefaultExternalApplication(TEXT("http://www.fmod.org/documentation")); +} + +void FFMODStudioEditorModule::OpenVideoTutorials() +{ + FPlatformProcess::LaunchFileInDefaultExternalApplication(TEXT("http://www.youtube.com/user/FMODTV")); +} + +void FFMODStudioEditorModule::ValidateFMOD() +{ + int ProblemsFound = 0; + + FFMODStudioLink StudioLink; + bool Connected = StudioLink.Connect(); + if (!Connected) + { + if (EAppReturnType::No == FMessageDialog::Open(EAppMsgType::YesNo, LOCTEXT("SetStudioBuildStudioNotRunning", "FMODStudio does not appear to be running. Only some validation will occur. Do you want to continue anyway?"))) + { + return; + } + } + unsigned int HeaderVersion = FMOD_VERSION; + unsigned int DLLVersion = GetDLLVersion(); + unsigned int StudioVersion = 0; + if (Connected) + { + FString StudioVersionString; + if (StudioLink.Execute(TEXT("studio.version"), StudioVersionString)) + { + int Super = 0; + int Major = 0; + int Minor = 0; + sscanf(TCHAR_TO_UTF8(*StudioVersionString), "Version %x.%x.%x", &Super, &Major, &Minor); + StudioVersion = (Super<<16) | (Major<<8) | Minor; + } + } + if (StripPatch(HeaderVersion) != StripPatch(DLLVersion)) + { + FText VersionMessage = FText::Format( + LOCTEXT("SetStudioBuildStudio_Status", "The FMOD DLL version is different to the version the integration was built against. This may cause problems running the game.\nBuilt Version: {0}\nDLL Version: {1}\n"), + FText::FromString(VersionToString(HeaderVersion)), + FText::FromString(VersionToString(DLLVersion))); + FMessageDialog::Open(EAppMsgType::Ok, VersionMessage); + ProblemsFound++; + } + if (StudioVersion > DLLVersion) + { + FText VersionMessage = FText::Format( + LOCTEXT("SetStudioBuildStudio_Version", "The Studio tool is newer than the version the integration was built against. The integration may not be able to load the banks that the tool builds.\n\nBuilt Version: {0}\nDLL Version: {1}\nStudio Version: {2}\n\nWe recommend using the Studio tool that matches the integration.\n\nDo you want to continue with the validation?"), + FText::FromString(VersionToString(HeaderVersion)), + FText::FromString(VersionToString(DLLVersion)), + FText::FromString(VersionToString(StudioVersion))); + if (EAppReturnType::No == FMessageDialog::Open(EAppMsgType::YesNo, VersionMessage)) + { + return; + } + ProblemsFound++; + } + + const UFMODSettings& Settings = *GetDefault(); + FString FullBankPath = Settings.BankOutputDirectory.Path; + if (FPaths::IsRelative(FullBankPath)) + { + FullBankPath = FPaths::GameContentDir() / FullBankPath; + } + FString PlatformBankPath = Settings.GetFullBankPath(); + FullBankPath = FPaths::ConvertRelativePathToFull(FullBankPath); + PlatformBankPath = FPaths::ConvertRelativePathToFull(PlatformBankPath); + + if (Connected) + { + // File path was added in FMOD Studio 1.07.00 + FString StudioProjectPath; + FString StudioProjectDir; + if (StudioVersion >= 0x00010700) + { + StudioLink.Execute(TEXT("studio.project.filePath"), StudioProjectPath); + if (StudioProjectPath.IsEmpty() || StudioProjectPath == TEXT("undefined")) + { + FMessageDialog::Open(EAppMsgType::Ok, LOCTEXT("SetStudioBuildStudio_NewProject", "FMOD Studio has an empty project. Please go to FMOD Studio, and press Save to create your new project.")); + // Just try to save anyway + FString Result; + StudioLink.Execute(TEXT("studio.project.save()"), Result); + } + StudioLink.Execute(TEXT("studio.project.filePath"), StudioProjectPath); + if (StudioProjectPath != TEXT("undefined")) + { + StudioProjectDir = FPaths::GetPath(StudioProjectPath); + } + } + + FString StudioPathString; + StudioLink.Execute(TEXT("studio.project.workspace.builtBanksOutputDirectory"), StudioPathString); + if (StudioPathString == TEXT("undefined")) + { + StudioPathString = TEXT(""); + } + + FString CanonicalBankPath = FullBankPath; + FPaths::CollapseRelativeDirectories(CanonicalBankPath); + FPaths::NormalizeDirectoryName(CanonicalBankPath); + FPaths::RemoveDuplicateSlashes(CanonicalBankPath); + FPaths::NormalizeDirectoryName(CanonicalBankPath); + + FString CanonicalStudioPath = StudioPathString; + if (FPaths::IsRelative(CanonicalStudioPath) && !StudioProjectDir.IsEmpty() && !StudioPathString.IsEmpty()) + { + CanonicalStudioPath = FPaths::Combine(*StudioProjectDir, *CanonicalStudioPath); + } + FPaths::CollapseRelativeDirectories(CanonicalStudioPath); + FPaths::NormalizeDirectoryName(CanonicalStudioPath); + FPaths::RemoveDuplicateSlashes(CanonicalStudioPath); + FPaths::NormalizeDirectoryName(CanonicalStudioPath); + if (!FPaths::IsSamePath(CanonicalBankPath, CanonicalStudioPath)) + { + FString BankPathToSet = FullBankPath; + // Extra logic - if we have put the studio project inside the game project, then make it relative + if (!StudioProjectDir.IsEmpty()) + { + FString GameBaseDir = FPaths::ConvertRelativePathToFull(FPaths::GameDir()); + FString BankPathFromGameProject = FullBankPath; + FString StudioProjectFromGameProject = StudioProjectDir; + if (FPaths::MakePathRelativeTo(BankPathFromGameProject, *GameBaseDir) && !BankPathFromGameProject.Contains(TEXT("..")) && + FPaths::MakePathRelativeTo(StudioProjectFromGameProject, *GameBaseDir) && !StudioProjectFromGameProject.Contains(TEXT(".."))) + { + FPaths::MakePathRelativeTo(BankPathToSet, *(StudioProjectDir + TEXT("/"))); + } + } + ProblemsFound++; + + FText AskMessage = FText::Format( + LOCTEXT("SetStudioBuildStudio_Ask", "FMOD Studio build path should be set up.\n\nCurrent Studio build path: {0}\nNew build path: {1}\n\nDo you want to fix up the project now?"), + FText::FromString(StudioPathString), + FText::FromString(BankPathToSet)); + if (EAppReturnType::Yes == FMessageDialog::Open(EAppMsgType::YesNo, AskMessage)) + { + FString Result; + StudioLink.Execute(*FString::Printf(TEXT("studio.project.workspace.builtBanksOutputDirectory = \"%s\";"), *BankPathToSet), Result); + StudioLink.Execute(TEXT("studio.project.workspace.builtBanksOutputDirectory"), Result); + if (Result != BankPathToSet) + { + FMessageDialog::Open(EAppMsgType::Ok, LOCTEXT("SetStudioBuildStudio_Save", "Failed to set bank directory. Please go to FMOD Studio, and set the bank path in FMOD Studio project settings.")); + } + FMessageDialog::Open(EAppMsgType::Ok, LOCTEXT("SetStudioBuildStudio_Save", "Please go to FMOD Studio, save your project and build banks.")); + // Just try to do it again anyway + StudioLink.Execute(TEXT("studio.project.save()"), Result); + StudioLink.Execute(TEXT("studio.project.build()"), Result); + // Pretend settings have changed which will force a reload + IFMODStudioModule::Get().RefreshSettings(); + } + } + } + bool AnyBankFiles = false; + + if (!FPaths::DirectoryExists(FullBankPath) || !FPaths::DirectoryExists(PlatformBankPath)) + { + FText DirMessage = FText::Format( + LOCTEXT("SetStudioBuildStudio_Dir", "The FMOD Content directory does not exist. Please make sure FMOD Studio is exporting banks into the correct location.\n\nBanks should be exported to: {0}\nBanks files should exist in: {1}\n"), + FText::FromString(FullBankPath), + FText::FromString(PlatformBankPath)); + FMessageDialog::Open(EAppMsgType::Ok, DirMessage); + ProblemsFound++; + } + else + { + TArray BankFiles; + Settings.GetAllBankPaths(BankFiles, true); + if (BankFiles.Num() != 0) + { + AnyBankFiles = true; + } + else + { + FText EmptyBankDirMessage = FText::Format( + LOCTEXT("SetStudioBuildStudio_EmptyBankDir", "The FMOD Content directory does not have any bank files in them. Please make sure FMOD Studio is exporting banks into the correct location.\n\nBanks should be exported to: {0}\nBanks files should exist in: {1}\n"), + FText::FromString(FullBankPath), + FText::FromString(PlatformBankPath)); + FMessageDialog::Open(EAppMsgType::Ok, EmptyBankDirMessage); + ProblemsFound++; + } + } + if (AnyBankFiles) + { + FMOD::Studio::System* StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Auditioning); + int BankCount = 0; + StudioSystem->getBankCount(&BankCount); + TArray FailedBanks = IFMODStudioModule::Get().GetFailedBankLoads(EFMODSystemContext::Auditioning); + if (BankCount == 0 || FailedBanks.Num() != 0) + { + FString CombinedBanks; + for (auto Bank : FailedBanks) + { + CombinedBanks += Bank; + CombinedBanks += TEXT("\n"); + } + FText BankLoadMessage; + if (BankCount == 0 && FailedBanks.Num() == 0) + { + BankLoadMessage = LOCTEXT("SetStudioBuildStudio_BankLoad", "Failed to load banks\n"); + } + else if (BankCount == 0) + { + BankLoadMessage = FText::Format( + LOCTEXT("SetStudioBuildStudio_BankLoad", "Failed to load banks:\n{0}\n"), + FText::FromString(CombinedBanks)); + } + else + { + BankLoadMessage = FText::Format( + LOCTEXT("SetStudioBuildStudio_BankLoad", "Some banks failed to load:\n{0}\n"), + FText::FromString(CombinedBanks)); + } + FMessageDialog::Open(EAppMsgType::Ok, BankLoadMessage); + ProblemsFound++; + } + else + { + int TotalEventCount = 0; + TArray Banks; + Banks.SetNum(BankCount); + StudioSystem->getBankList(Banks.GetData(), BankCount, &BankCount); + for (FMOD::Studio::Bank* Bank : Banks) + { + int EventCount = 0; + Bank->getEventCount(&EventCount); + TotalEventCount += EventCount; + } + if (TotalEventCount == 0) + { + FMessageDialog::Open(EAppMsgType::Ok, LOCTEXT("SetStudioBuildStudio_NoEvents", "Banks have been loaded but they didn't have any events in them. Please make sure you have added some events to banks.")); + ProblemsFound++; + } + } + } + TArray RequiredPlugins = IFMODStudioModule::Get().GetRequiredPlugins(); + if (RequiredPlugins.Num() != 0 && Settings.PluginFiles.Num() == 0) + { + FString CombinedPlugins; + for (auto Name : RequiredPlugins) + { + CombinedPlugins += Name; + CombinedPlugins += TEXT("\n"); + } + FText PluginMessage = FText::Format( + LOCTEXT("SetStudioBuildStudio_Plugins", "The banks require the following plugins, but no plugin filenames are listed in the settings:\n{0}\n"), + FText::FromString(CombinedPlugins)); + FMessageDialog::Open(EAppMsgType::Ok, PluginMessage); + ProblemsFound++; + } + + if (ProblemsFound) + { + FMessageDialog::Open(EAppMsgType::Ok, LOCTEXT("SetStudioBuildStudio_FinishedBad", "Finished validation. Problems were detected.\n")); + } + else + { + FMessageDialog::Open(EAppMsgType::Ok, LOCTEXT("SetStudioBuildStudio_FinishedGood", "Finished validation. No problems detected.\n")); + } +} + +void FFMODStudioEditorModule::ReloadBanks() +{ + // Pretend settings have changed which will force a reload + IFMODStudioModule::Get().RefreshSettings(); +} + +bool FFMODStudioEditorModule::Tick( float DeltaTime ) +{ + if (!bRegisteredComponentVisualizers && GUnrealEd != nullptr) + { + // Register component visualizers (GUnrealED is required for this, but not initialized before this module loads, so we have to wait until GUnrealEd is available) + RegisterComponentVisualizer(UFMODAudioComponent::StaticClass()->GetFName(), MakeShareable(new FFMODAudioComponentVisualizer)); + + bRegisteredComponentVisualizers = true; + } + + return true; +} + +void FFMODStudioEditorModule::BeginPIE(bool simulating) +{ + UE_LOG(LogFMOD, Verbose, TEXT("FFMODStudioEditorModule BeginPIE: %d"), simulating); + bSimulating = simulating; + bIsInPIE = true; + IFMODStudioModule::Get().SetInPIE(true, simulating); +} + +void FFMODStudioEditorModule::EndPIE(bool simulating) +{ + UE_LOG(LogFMOD, Verbose, TEXT("FFMODStudioEditorModule EndPIE: %d"), simulating); + bSimulating = false; + bIsInPIE = false; + IFMODStudioModule::Get().SetInPIE(false, simulating); +} + +void FFMODStudioEditorModule::PausePIE(bool simulating) +{ + UE_LOG(LogFMOD, Verbose, TEXT("FFMODStudioEditorModule PausePIE%d")); + IFMODStudioModule::Get().SetSystemPaused(true); +} + +void FFMODStudioEditorModule::ResumePIE(bool simulating) +{ + UE_LOG(LogFMOD, Verbose, TEXT("FFMODStudioEditorModule ResumePIE")); + IFMODStudioModule::Get().SetSystemPaused(false); +} + +void FFMODStudioEditorModule::PostLoadCallback() +{ + UE_LOG(LogFMOD, Verbose, TEXT("FFMODStudioEditorModule PostLoadCallback")); +} + +void FFMODStudioEditorModule::ViewportDraw(UCanvas* Canvas, APlayerController*) +{ + // Only want to update based on viewport in simulate mode. + // In PIE/game, we update from the player controller instead. + if (!bSimulating) + { + return; + } + + const FSceneView* View = Canvas->SceneView; + + if (View->Drawer == GCurrentLevelEditingViewportClient) + { + UWorld* World = GCurrentLevelEditingViewportClient->GetWorld(); + const FVector& ViewLocation = GCurrentLevelEditingViewportClient->GetViewLocation(); + + FMatrix CameraToWorld = View->ViewMatrices.ViewMatrix.InverseFast(); + FVector ProjUp = CameraToWorld.TransformVector(FVector(0, 1000, 0)); + FVector ProjRight = CameraToWorld.TransformVector(FVector(1000, 0, 0)); + + FTransform ListenerTransform(FRotationMatrix::MakeFromZY(ProjUp, ProjRight)); + ListenerTransform.SetTranslation(ViewLocation); + ListenerTransform.NormalizeRotation(); + + IFMODStudioModule::Get().SetListenerPosition(0, World, ListenerTransform, 0.0f); + IFMODStudioModule::Get().FinishSetListenerPosition(1, 0.0f); + } +} + +void FFMODStudioEditorModule::ShutdownModule() +{ + UE_LOG(LogFMOD, Verbose, TEXT("FFMODStudioEditorModule shutdown")); + + if (UObjectInitialized()) + { + // Unregister tick function. + FTicker::GetCoreTicker().RemoveTicker(TickDelegateHandle); + + FEditorDelegates::BeginPIE.Remove(BeginPIEDelegateHandle); + FEditorDelegates::EndPIE.Remove(EndPIEDelegateHandle); + FEditorDelegates::PausePIE.Remove(PausePIEDelegateHandle); + FEditorDelegates::ResumePIE.Remove(ResumePIEDelegateHandle); + + if (ViewportDrawingDelegate.IsBound()) + { + UDebugDrawService::Unregister(ViewportDrawingDelegateHandle); + } + + FComponentAssetBrokerage::UnregisterBroker(AssetBroker); + + if (MainMenuExtender.IsValid()) + { + FLevelEditorModule* LevelEditorModule = FModuleManager::GetModulePtr( "LevelEditor" ); + if (LevelEditorModule) + { + LevelEditorModule->GetMenuExtensibilityManager()->RemoveExtender(MainMenuExtender); + } + } + } + + if (ISettingsModule* SettingsModule = FModuleManager::GetModulePtr("Settings")) + { + SettingsModule->UnregisterSettings("Project", "Plugins", "FMODStudio"); + } + + // Unregister AssetTypeActions + if (FModuleManager::Get().IsModuleLoaded("AssetTools")) + { + IAssetTools& AssetTools = FModuleManager::GetModuleChecked("AssetTools").Get(); + + AssetTools.UnregisterAssetTypeActions(FMODEventAssetTypeActions.ToSharedRef()); + } + + // Unregister component visualizers + if (GUnrealEd != nullptr) + { + // Iterate over all class names we registered for + for (FName ClassName : RegisteredComponentClassNames) + { + GUnrealEd->UnregisterComponentVisualizer(ClassName); + } + } + + IFMODStudioModule::Get().BanksReloadedEvent().Remove(HandleBanksReloadedDelegateHandle); +} + +bool FFMODStudioEditorModule::HandleSettingsSaved() +{ + IFMODStudioModule::Get().RefreshSettings(); + + return true; +} + +void FFMODStudioEditorModule::HandleBanksReloaded() +{ + // Show a reload notification + TArray FailedBanks = IFMODStudioModule::Get().GetFailedBankLoads(EFMODSystemContext::Auditioning); + FText Message; + SNotificationItem::ECompletionState State; + if (FailedBanks.Num() == 0) + { + Message = LOCTEXT("FMODBanksReloaded", "Reloaded FMOD Banks\n"); + State = SNotificationItem::CS_Success; + } + else + { + FString CombinedMessage = "Problem loading FMOD Banks:"; + for (auto Entry : FailedBanks) + { + CombinedMessage += TEXT("\n"); + CombinedMessage += Entry; + + UE_LOG(LogFMOD, Warning, TEXT("Problem loading FMOD Bank: %s"), *Entry); + } + + Message = FText::Format( + LOCTEXT("FMODBanksReloaded", "{0}"), + FText::FromString(CombinedMessage)); + State = SNotificationItem::CS_Fail; + } + ShowNotification(Message, State); +} + +void FFMODStudioEditorModule::ShowNotification(const FText& Text, SNotificationItem::ECompletionState State) +{ + FNotificationInfo Info(Text); + Info.Image = FEditorStyle::GetBrush(TEXT("NoBrush")); + Info.FadeInDuration = 0.1f; + Info.FadeOutDuration = 0.5f; + Info.ExpireDuration = State == SNotificationItem::CS_Fail ? 6.0f : 1.5f; + Info.bUseThrobber = false; + Info.bUseSuccessFailIcons = true; + Info.bUseLargeFont = true; + Info.bFireAndForget = false; + Info.bAllowThrottleWhenFrameRateIsLow = false; + auto NotificationItem = FSlateNotificationManager::Get().AddNotification(Info); + NotificationItem->SetCompletionState(State); + NotificationItem->ExpireAndFadeout(); + + if (GCurrentLevelEditingViewportClient) + { + // Refresh any 3d event visualization + GCurrentLevelEditingViewportClient->bNeedsRedraw = true; + } +} + +void FFMODStudioEditorModule::RegisterComponentVisualizer(FName ComponentClassName, TSharedPtr Visualizer) +{ + if (GUnrealEd != nullptr) + { + GUnrealEd->RegisterComponentVisualizer(ComponentClassName, Visualizer); + } + + RegisteredComponentClassNames.Add(ComponentClassName); + + if (Visualizer.IsValid()) + { + Visualizer->OnRegister(); + } +} diff --git a/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODStudioEditorPrivatePCH.h b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODStudioEditorPrivatePCH.h new file mode 100644 index 0000000..1fe0eab --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODStudioEditorPrivatePCH.h @@ -0,0 +1,9 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. +#pragma once + +#include "Engine.h" +#include "UnrealEd.h" +#include "Components/SceneComponent.h" + +DECLARE_LOG_CATEGORY_EXTERN(LogFMOD, Log, All); + diff --git a/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODStudioStyle.cpp b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODStudioStyle.cpp new file mode 100644 index 0000000..b3a7f6a --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODStudioStyle.cpp @@ -0,0 +1,56 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#include "FMODStudioEditorPrivatePCH.h" +#include "FMODStudioStyle.h" +#include "SlateStyle.h" +#include "EditorStyle.h" + +#define IMAGE_BRUSH(RelativePath, ...) FSlateImageBrush(Style.RootToContentDir(RelativePath, TEXT(".png")), __VA_ARGS__) +#define BOX_BRUSH(RelativePath, ...) FSlateBoxBrush(Style.RootToContentDir(RelativePath, TEXT(".png")), __VA_ARGS__) + +////////////////////////////////////////////////////////////////////////// +// FFMODStudioStyle + +TSharedPtr FFMODStudioStyle::StyleInstance = NULL; + +void FFMODStudioStyle::Initialize() +{ + if (!StyleInstance.IsValid()) + { + StyleInstance = Create(); + } + + SetStyle(StyleInstance.ToSharedRef()); +} + +void FFMODStudioStyle::Shutdown() +{ + ResetToDefault(); + ensure(StyleInstance.IsUnique()); + StyleInstance.Reset(); +} + +TSharedRef FFMODStudioStyle::Create() +{ + IEditorStyleModule& EditorStyle = FModuleManager::LoadModuleChecked(TEXT("EditorStyle")); + TSharedRef< FSlateStyleSet > StyleRef = EditorStyle.CreateEditorStyleInstance(); + FSlateStyleSet& Style = StyleRef.Get(); + + const FVector2D Icon20x20(20.0f, 20.0f); + const FVector2D Icon40x40(40.0f, 40.0f); + + Style.Set( "ClassIcon.FMODAmbientSound", new IMAGE_BRUSH( "Icons/AssetIcons/AmbientSound_16x", FVector2D(16.0f, 16.0f) ) ); + Style.Set( "ClassThumbnail.FMODAmbientSound", new IMAGE_BRUSH( "Icons/AssetIcons/AmbientSound_64x", FVector2D(64.0f, 64.0f) ) ); + + Style.Set( "ClassIcon.FMODAudioComponent", new IMAGE_BRUSH( "Icons/ActorIcons/SoundActor_16x", FVector2D(16.0f, 16.0f) ) ); + //Style.Set( "ClassThumbnail.FMODAudioComponent", new IMAGE_BRUSH( "Icons/ActorIcons/SoundActor_64x", FVector2D(64.0f, 64.0f) ) ); + + Style.Set( "ClassIcon.FMODAsset", new IMAGE_BRUSH( "Icons/ActorIcons/SoundActor_16x", FVector2D(16.0f,16.0f) ) ); + //Style.Set( "ClassThumbnail.FMODAsset", new IMAGE_BRUSH( "Icons/ActorIcons/SoundActor_64x", FVector2D(64.0f, 64.0f) ) ); + + return StyleRef; +} + +////////////////////////////////////////////////////////////////////////// + +#undef IMAGE_BRUSH diff --git a/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODStudioStyle.h b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODStudioStyle.h new file mode 100644 index 0000000..71e95ba --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODStudioStyle.h @@ -0,0 +1,20 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#pragma once + +class FFMODStudioStyle : public FEditorStyle +{ +public: + static void Initialize(); + + static void Shutdown(); + +private: + static TSharedRef Create(); + +private: + static TSharedPtr StyleInstance; + +private: + FFMODStudioStyle() {} +}; diff --git a/Plugins/FMODStudio/Source/FMODStudioEditor/Private/SFMODEventEditorPanel.cpp b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/SFMODEventEditorPanel.cpp new file mode 100644 index 0000000..169a462 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/SFMODEventEditorPanel.cpp @@ -0,0 +1,375 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#include "FMODStudioEditorPrivatePCH.h" +#include "SFMODEventEditorPanel.h" +#include "FMODStudioModule.h" +#include "FMODUtils.h" +#include "Input/Reply.h" +#include "SNumericEntryBox.h" +#include "SExpandableArea.h" +#include "fmod_studio.hpp" + +#define LOCTEXT_NAMESPACE "FMODEventEditor" + +SFMODEventEditorPanel::~SFMODEventEditorPanel() +{ +} + +void SFMODEventEditorPanel::Construct(const FArguments& InArgs) +{ + FMODEventEditorPtr = InArgs._FMODEventEditor; + + FMOD::Studio::EventDescription* EventDescription = FMODEventEditorPtr.Pin()->GetEventDescription(); + + TSharedRef ToolbarBorder = ConstructToolbar(EventDescription); + TSharedRef InfoArea = ConstructInfo(EventDescription); + TSharedRef ParametersArea = ConstructParameters(EventDescription); + TSharedRef UserPropertiesArea = ConstructUserProperties(EventDescription); + + TSharedRef ChildWidget = + SNew(SVerticalBox) + + SVerticalBox::Slot() + .AutoHeight() + .Padding(0.0f, 3.0f) + [ + InfoArea + ] + + SVerticalBox::Slot() + .AutoHeight() + .Padding(0.0f, 3.0f) + [ + ParametersArea + ] + + SVerticalBox::Slot() + .AutoHeight() + .Padding(0.0f, 3.0f) + [ + UserPropertiesArea + ]; + + ChildSlot + [ + SNew(SVerticalBox) + + SVerticalBox::Slot() + .AutoHeight() + .Padding(0.0f, 3.0f) + [ + ToolbarBorder + ] + + SVerticalBox::Slot() + .FillHeight(1.0f) + [ + SNew(SScrollBox) + + SScrollBox::Slot() + .Padding(0.0f) + [ + SNew(SVerticalBox) + + SVerticalBox::Slot() + .AutoHeight() + .Padding(0.0f) + [ + ChildWidget + ] + ] + ] + ]; +} + +TSharedRef SFMODEventEditorPanel::ConstructToolbar(FMOD::Studio::EventDescription* EventDescription) +{ + float MinDistance = 0.0f; + float MaxDistance = 0.0f; + int32 EventLengthMS = 0; + bool bIsOneshot = false, bIsStream = false, bIs3D = false; + if (EventDescription != nullptr) + { + EventDescription->getMinimumDistance(&MinDistance); + EventDescription->getMaximumDistance(&MaxDistance); + EventDescription->getLength(&EventLengthMS); + EventDescription->isOneshot(&bIsOneshot); + EventDescription->isStream(&bIsStream); + EventDescription->is3D(&bIs3D); + } + + const FTimespan EventLength = FTimespan::FromMilliseconds((double)EventLengthMS); + const FString EventLengthString = EventLength.GetHours() <= 0 ? EventLength.ToString(TEXT("%m:%s.%f")) : EventLength.ToString(TEXT("%h:%m:%s.%f")); + + const FText RadiusText = FText::Format(LOCTEXT("RadiusFormat", "Distance Attenuation: {0}m to {1}m"), FText::AsNumber(MinDistance), FText::AsNumber(MaxDistance)); + const FText LengthText = FText::Format(LOCTEXT("LengthFormat", "Length: {0}"), FText::FromString(EventLengthString)); + + FText EventInfoText; + if (bIs3D && bIsOneshot) + { + EventInfoText = FText::Format(LOCTEXT("RadiusLengthFormat", "{0} - {1}"), RadiusText, LengthText); + } + else if (!bIs3D && bIsOneshot) + { + EventInfoText = LengthText; + } + else if (bIs3D && !bIsOneshot) + { + EventInfoText = RadiusText; + } + + return SNew(SBorder) + .BorderImage(FEditorStyle::Get().GetBrush("ToolPanel.GroupBorder")) + .Padding(6.0f) + .Content() + [ + SNew(SHorizontalBox) + + SHorizontalBox::Slot() + .AutoWidth() + .Padding(0.0f, 0.0f, 2.0f, 0.0f) + .VAlign(VAlign_Center) + .HAlign(HAlign_Left) + [ + SNew(SButton) + .VAlign(VAlign_Center) + .Text(LOCTEXT("Play", "Play")) + .ContentPadding(4) + .OnClicked(this, &SFMODEventEditorPanel::OnClickedPlay) + ] + + SHorizontalBox::Slot() + .AutoWidth() + .Padding(2.0f, 0.0f) + .VAlign(VAlign_Center) + .HAlign(HAlign_Left) + [ + SNew(SButton) + .Text(LOCTEXT("Pause", "Pause")) + .ContentPadding(4) + .OnClicked(this, &SFMODEventEditorPanel::OnClickedPause) + ] + + SHorizontalBox::Slot() + .AutoWidth() + .Padding(2.0f, 0.0f) + .VAlign(VAlign_Center) + .HAlign(HAlign_Left) + [ + SNew(SButton) + .VAlign(VAlign_Center) + .Text(LOCTEXT("Stop", "Stop")) + .ContentPadding(4) + .OnClicked(this, &SFMODEventEditorPanel::OnClickedStop) + ] + + SHorizontalBox::Slot() + .FillWidth(1.0f) + .Padding(2.0f, 0.0f) + .VAlign(VAlign_Center) + .HAlign(HAlign_Right) + [ + SNew(STextBlock) + .Text(EventInfoText) + ] + ]; +} + +void AddTextField(TSharedRef& InfoBox, const TCHAR* Name, const FText& Value) +{ + InfoBox->AddSlot() + .Padding(4.0f, 3.0f) + [ + SNew(SHorizontalBox) + + SHorizontalBox::Slot() + .FillWidth(0.3f) + [ + SNew(STextBlock) + .Text(FText::FromString(Name)) + ] + + SHorizontalBox::Slot() + [ + SNew(SEditableText) + .Text(Value) + .IsReadOnly(true) + ] + ]; +} + +void AddBoolField(TSharedRef& InfoBox, const TCHAR* Name, bool bValue) +{ + AddTextField(InfoBox, Name, bValue ? LOCTEXT("True","True") : LOCTEXT("False","False")); +} + +void AddFloatField(TSharedRef& InfoBox, const TCHAR* Name, float Value) +{ + AddTextField(InfoBox, Name, FText::AsNumber(Value)); +} + +TSharedRef MakeBox(TSharedRef& InfoBox, const FText& Value) +{ + return SNew(SExpandableArea) + .AreaTitle(Value) + .InitiallyCollapsed(false) + .BodyContent() + [ + SNew(SBorder) + .BorderImage(FCoreStyle::Get().GetBrush("NoBorder")) + .Padding(4.0f) + .Content() + [ + InfoBox + ] + ]; +} + +TSharedRef SFMODEventEditorPanel::ConstructInfo(FMOD::Studio::EventDescription* EventDescription) +{ + TSharedRef InfoBox = SNew(SVerticalBox); + + if (EventDescription != nullptr) + { + FString EventPath = FMODUtils::GetPath(EventDescription); + FGuid Guid = FMODUtils::GetID(EventDescription); + + int Length = 0.0f; + float MinDist = 0.0f; + float MaxDist = 0.0f; + EventDescription->getLength(&Length); + EventDescription->getMinimumDistance(&MinDist); + EventDescription->getMaximumDistance(&MaxDist); + + bool bOneShot = false; + bool bStream = false; + bool b3D = false; + EventDescription->isOneshot(&bOneShot); + EventDescription->isStream(&bStream); + EventDescription->is3D(&b3D); + + AddTextField(InfoBox, TEXT("Path"), FText::FromString(EventPath)); + AddTextField(InfoBox, TEXT("Guid"), FText::FromString(Guid.ToString(EGuidFormats::DigitsWithHyphensInBraces))); + AddBoolField(InfoBox, TEXT("OneShot"), bOneShot); + AddBoolField(InfoBox, TEXT("Streaming"), bStream); + AddBoolField(InfoBox, TEXT("3D"), b3D); + + AddFloatField(InfoBox, TEXT("Length"), static_cast(Length)); + if (b3D) + { + AddFloatField(InfoBox, TEXT("Min Dist"), MinDist); + AddFloatField(InfoBox, TEXT("Max Dist"), MaxDist); + } + } + + return MakeBox(InfoBox, LOCTEXT("EventInfo", "Event Info")); +} + +TSharedRef SFMODEventEditorPanel::ConstructParameters(FMOD::Studio::EventDescription* EventDescription) +{ + auto EventEditor = FMODEventEditorPtr.Pin(); + TSharedRef ParametersBox = SNew(SVerticalBox); + + FNumberFormattingOptions Options; + Options.MinimumFractionalDigits = 1; + + if (EventDescription != nullptr) + { + int32 ParameterCount; + EventDescription->getParameterCount(&ParameterCount); + for (int32 ParamIdx = 0; ParamIdx < ParameterCount; ParamIdx++) + { + FMOD_STUDIO_PARAMETER_DESCRIPTION Parameter; + EventDescription->getParameterByIndex(ParamIdx, &Parameter); + + EventEditor->GetParameterValues().Add(Parameter.minimum); + + const FString ParameterName = Parameter.type == FMOD_STUDIO_PARAMETER_GAME_CONTROLLED ? FString(UTF8_TO_TCHAR(Parameter.name)) : FMODUtils::ParameterTypeToString(Parameter.type); + const FText ToolTipText = FText::Format(LOCTEXT("ParameterTooltipFormat", "{0} (Min Value: {1} - Max Value: {2})"), + FText::FromString(ParameterName), FText::AsNumber(Parameter.minimum, &Options), FText::AsNumber(Parameter.maximum, &Options)); + + ParametersBox->AddSlot() + .Padding(4.0f, 2.0f) + [ + SNew(SHorizontalBox) + .ToolTipText(ToolTipText) + + SHorizontalBox::Slot() + .FillWidth(0.3f) + [ + SNew(STextBlock) + .Text(FText::FromString(ParameterName)) + ] + + SHorizontalBox::Slot() + .MaxWidth(200.0f) + [ + SNew(SNumericEntryBox) + .Value(this, &SFMODEventEditorPanel::GetParameterValue, ParamIdx) + .OnValueChanged(this, &SFMODEventEditorPanel::OnParameterValueChanged, ParamIdx) + .AllowSpin(true) + .MinValue(Parameter.minimum) + .MaxValue(Parameter.maximum) + .MinSliderValue(Parameter.minimum) + .MaxSliderValue(Parameter.maximum) + .Delta(0.01f) + ] + ]; + } + } + + return MakeBox(ParametersBox, LOCTEXT("EventParameters", "Event Parameters")); +} + +TSharedRef SFMODEventEditorPanel::ConstructUserProperties(FMOD::Studio::EventDescription* EventDescription) +{ + TSharedRef UserPropertiesBox = SNew(SVerticalBox); + + if (EventDescription != nullptr) + { + int32 UserPropertyCount; + EventDescription->getUserPropertyCount(&UserPropertyCount); + for (int32 PropertyIdx = 0; PropertyIdx < UserPropertyCount; PropertyIdx++) + { + FMOD_STUDIO_USER_PROPERTY UserProperty; + EventDescription->getUserPropertyByIndex(PropertyIdx, &UserProperty); + + FText PropertyText; + switch (UserProperty.type) + { + case FMOD_STUDIO_USER_PROPERTY_TYPE_INTEGER: + PropertyText = FText::AsNumber(UserProperty.intValue); + break; + case FMOD_STUDIO_USER_PROPERTY_TYPE_BOOLEAN: + PropertyText = UserProperty.boolValue ? LOCTEXT("True", "True") : LOCTEXT("False", "False"); + break; + case FMOD_STUDIO_USER_PROPERTY_TYPE_FLOAT: + PropertyText = FText::AsNumber(UserProperty.floatValue); + break; + case FMOD_STUDIO_USER_PROPERTY_TYPE_STRING: + PropertyText = FText::FromString(UTF8_TO_TCHAR(UserProperty.stringValue)); + break; + } + + FString UserName(UTF8_TO_TCHAR(UserProperty.name)); + AddTextField(UserPropertiesBox, *UserName, PropertyText); + } + } + + return MakeBox(UserPropertiesBox, LOCTEXT("EventUserProperties", "Event User Properties")); +} + +FReply SFMODEventEditorPanel::OnClickedPlay() +{ + FMODEventEditorPtr.Pin()->PlayEvent(); + return FReply::Handled(); +} + +FReply SFMODEventEditorPanel::OnClickedStop() +{ + FMODEventEditorPtr.Pin()->StopEvent(); + return FReply::Handled(); +} + +FReply SFMODEventEditorPanel::OnClickedPause() +{ + FMODEventEditorPtr.Pin()->PauseEvent(); + return FReply::Handled(); +} + +void SFMODEventEditorPanel::OnParameterValueChanged(float NewValue, int32 ParameterIdx) +{ + FMODEventEditorPtr.Pin()->SetParameterValue(ParameterIdx, NewValue); +} + +TOptional SFMODEventEditorPanel::GetParameterValue(int32 ParameterIdx) const +{ + return FMODEventEditorPtr.Pin()->GetParameterValues()[ParameterIdx]; +} + +#undef LOC_NAMESPACE diff --git a/Plugins/FMODStudio/Source/FMODStudioEditor/Private/SFMODEventEditorPanel.h b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/SFMODEventEditorPanel.h new file mode 100644 index 0000000..181d696 --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudioEditor/Private/SFMODEventEditorPanel.h @@ -0,0 +1,45 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#pragma once + +#include "FMODEventEditor.h" + +namespace FMOD +{ + namespace Studio + { + class EventDescription; + } +} + +class SFMODEventEditorPanel : public SCompoundWidget +{ +public: + + SLATE_BEGIN_ARGS(SFMODEventEditorPanel) + {} + SLATE_ARGUMENT(TWeakPtr, FMODEventEditor) + SLATE_END_ARGS() + + ~SFMODEventEditorPanel(); + + /** SCompoundWidget interface */ + void Construct(const FArguments& InArgs); + +private: + + TSharedRef ConstructToolbar(FMOD::Studio::EventDescription* EventDescription); + TSharedRef ConstructInfo(FMOD::Studio::EventDescription* EventDescription); + TSharedRef ConstructParameters(FMOD::Studio::EventDescription* EventDescription); + TSharedRef ConstructUserProperties(FMOD::Studio::EventDescription* EventDescription); + + /** Editor that owns this panel */ + TWeakPtr FMODEventEditorPtr; + + FReply OnClickedPlay(); + FReply OnClickedStop(); + FReply OnClickedPause(); + + TOptional GetParameterValue(int32 ParameterIdx) const; + void OnParameterValueChanged(float NewValue, int32 ParameterIdx); +}; diff --git a/Plugins/FMODStudio/Source/FMODStudioEditor/Public/FMODStudioEditorModule.h b/Plugins/FMODStudio/Source/FMODStudioEditor/Public/FMODStudioEditorModule.h new file mode 100644 index 0000000..90da84e --- /dev/null +++ b/Plugins/FMODStudio/Source/FMODStudioEditor/Public/FMODStudioEditorModule.h @@ -0,0 +1,35 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2016. + +#pragma once + +#include "ModuleManager.h" + +/** + * The public interface to this module + */ +class IFMODStudioEditorModule : public IModuleInterface +{ + +public: + + /** + * Singleton-like access to this module's interface. This is just for convenience! + * Beware of calling this during the shutdown phase, though. Your module might have been unloaded already. + * + * @return Returns singleton instance, loading the module on demand if needed + */ + static inline IFMODStudioEditorModule& Get() + { + return FModuleManager::LoadModuleChecked< IFMODStudioEditorModule >( "FMODStudioEditor" ); + } + + /** + * Checks to see if this module is loaded and ready. It is only valid to call Get() if IsAvailable() returns true. + * + * @return True if the module is loaded and ready to use + */ + static inline bool IsAvailable() + { + return FModuleManager::Get().IsModuleLoaded( "FMODStudioEditor" ); + } +}; diff --git a/Plugins/Mantis/Mantis.uplugin b/Plugins/Mantis/Mantis.uplugin new file mode 100644 index 0000000..ba8de99 --- /dev/null +++ b/Plugins/Mantis/Mantis.uplugin @@ -0,0 +1,21 @@ +{ + "FileVersion": 3, + "Version": 1, + "VersionName": "1.0", + "FriendlyName": "Mantis Plugin", + "Description": "A plugin to add an interface in Unreal for Mantis bug reports.", + "Category": "Bugs", + "CreatedBy": "Yoshi van Belkom", + "CreatedByURL": "http://www.yoshivanbelkom.com/", + "Modules": [ + { + "Name": "Mantis", + "Type": "Developer", + "LoadingPhase": "PreDefault" + } + ], + "EnabledByDefault": true, + "CanContainContent": true, + "IsBetaVersion": true, + "Installed": false +} \ No newline at end of file diff --git a/Plugins/Mantis/Resources/Icon128.png b/Plugins/Mantis/Resources/Icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..d0b460066795cab0d7dc0c60080f8e0ab41acca3 GIT binary patch literal 45697 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

    GWw(Mzc;5#G)CvUp*OyVSug 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 VariableStrings; + CleanString.ParseIntoArray( VariableStrings, TEXT(",") ); + + TMap Variables; + for ( int32 i = 0; i < VariableStrings.Num(); i++ ) + { + TArray VariableString; + VariableStrings[i].ParseIntoArray( VariableString, TEXT( "=" ) ); + if ( VariableString.Num() != 2 ) continue; + Variables.Add( VariableString[0], VariableString[1].TrimQuotes() ); + } + + FString* FieldIDValue = Variables.Find( "FieldID" ); + if ( FieldIDValue != nullptr ) FieldID = *FieldIDValue; + FString* BatchPathValue = Variables.Find( "BatchPath" ); + if ( BatchPathValue != nullptr ) BatchPath = *BatchPathValue; + } + + /* Default constructor. */ + FBatchBinding() {} + + /* + * The ID of the field. + * e.g. category_id + */ + UPROPERTY( Config, EditAnywhere ) + FString FieldID; + + /* + * The path to the batch script. This is can be a relative path from the project folder (where the .uproject is located) or an absolute path. + * Relative e.g. /Scripts/GetCategory.bat + * Absolute e.g. C:/Perforce/Scripts/GetCategory.bat + */ + UPROPERTY( Config, EditAnywhere ) + FString BatchPath; +}; + +UCLASS(config=Engine) +class UMantisSettings : public UObject +{ + GENERATED_UCLASS_BODY() +public: + /* + * This is the root url of the Mantis. + * e.g. if the login url is: http://bugs.yourdomain.com/login_page.php + * this would be http://bugs.youdomain.com/ + */ + UPROPERTY( Config, EditAnywhere, Category = General ) + FString HostURL; + + /* + * A list of batch scrips you want to use to load data for certain fields in the crash report. + */ + UPROPERTY( Config, EditAnywhere, Category = Advanced ) + TArray ScriptBindings; +}; \ No newline at end of file diff --git a/Plugins/Mantis/Source/Mantis/Mantis.Build.cs b/Plugins/Mantis/Source/Mantis/Mantis.Build.cs new file mode 100644 index 0000000..fcbb659 --- /dev/null +++ b/Plugins/Mantis/Source/Mantis/Mantis.Build.cs @@ -0,0 +1,29 @@ +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// +// The Mantis Editor Module Settings. +////////////////////////////////////////// + +namespace UnrealBuildTool.Rules +{ + public class Mantis : ModuleRules + { + public Mantis(TargetInfo Target) + { + PublicDependencyModuleNames.AddRange( + new string[] { + "Core", + "CoreUObject", + "Engine", + "UnrealEd" + } + ); + + PrivateIncludePathModuleNames.AddRange( + new string[] { + "Settings" + } + ); + } + } +} \ No newline at end of file diff --git a/Plugins/Mantis/Source/Mantis/Private/Mantis.cpp b/Plugins/Mantis/Source/Mantis/Private/Mantis.cpp new file mode 100644 index 0000000..7ced544 --- /dev/null +++ b/Plugins/Mantis/Source/Mantis/Private/Mantis.cpp @@ -0,0 +1,332 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// + +#include "MantisPrivatePCH.h" +#include "ISettingsModule.h" +#include "MantisSettings.h" +#include "Runtime/Launch/Resources/Version.h" +#if PLATFORM_WINDOWS + #include + #pragma comment( lib, "version.lib" ) +#endif + +//defines +#define LOCTEXT_NAMESPACE "Mantis" +#define STRINGIZE_(x) #x +#define STRINGIZE(x) STRINGIZE_(x) +#define PlatformFile FPlatformFileManager::Get().GetPlatformFile() + +class FMantis : public IMantis +{ +public: + /* IModuleInterface implementation */ + virtual void StartupModule() override; + virtual void ShutdownModule() override; + /* End IModuleInterface implementation */ + FString GetEngineCrashClientPath(); + FString GetMantisCrashClientPath(); + void RegisterSettings(); + void UnregisterSettings(); + int32 IsMantisExe( FString FilePath ); + void UpdateMantis(); + bool MakeBackup( FString Original, FString Backup, bool bOverwrite = false ); +}; + +DEFINE_LOG_CATEGORY(LogMantis); + +//Get the path of the Engine Crash Report +FString FMantis::GetEngineCrashClientPath() +{ + //Get Engine root path. + FString EnginePath = FPaths::RootDir(); + FPaths::NormalizeDirectoryName(EnginePath); + TArray< FString > EnginePathDirs; + EnginePath.ParseIntoArray(EnginePathDirs, TEXT("/"), 1); + + //Get the path to the CrashReportClient.exe + FString EngineCrashClientPath; + EnginePathDirs.Push(TEXT("Engine")); + EnginePathDirs.Push(TEXT("Binaries")); + EnginePathDirs.Push(TEXT("Win64")); + EnginePathDirs.Push(TEXT("CrashReportClient.exe")); + EngineCrashClientPath = FString::Join(EnginePathDirs, TEXT("/")); + + //Check if file exists. + if (FPaths::FileExists(EngineCrashClientPath)) + { + UE_LOG(LogMantis, Log, TEXT("Engine Crash Report file found!")); + } + else + { + UE_LOG(LogMantis, Warning, TEXT("Engine Crash Report file not found!")); + } + + return EngineCrashClientPath; +} + +FString FMantis::GetMantisCrashClientPath() +{ + //Get the path of the Project File + FString ProjectPath = FPaths::GetPath( FPaths::GetProjectFilePath() ); + FPaths::NormalizeDirectoryName( ProjectPath ); + //Get the path to the Mantis Crash Report + TArray< FString > ProjectPathDirs; + ProjectPath.ParseIntoArray( ProjectPathDirs, TEXT( "/" ), 1 ); + FString MantisCrashClientPath; + ProjectPathDirs.Push( TEXT( "Plugins" ) ); + ProjectPathDirs.Push( TEXT( "Mantis" ) ); + ProjectPathDirs.Push( TEXT( "Resources" ) ); + ProjectPathDirs.Push( TEXT( "CrashReporter" ) ); + ProjectPathDirs.Push( TEXT( STRINGIZE( ENGINE_MAJOR_VERSION ) "." STRINGIZE( ENGINE_MINOR_VERSION ) ) ); +#if PLATFORM_64BITS + ProjectPathDirs.Push( TEXT( "Win64" ) ); +#else + ProjectPathDirs.Push( TEXT( "Win32" ) ); +#endif + ProjectPathDirs.Push( TEXT( "CrashReportClient.exe" ) ); + MantisCrashClientPath = FString::Join( ProjectPathDirs, TEXT( "/" ) ); + return MantisCrashClientPath; +} + +void FMantis::RegisterSettings() +{ + ISettingsModule* SettingsModule = FModuleManager::GetModulePtr("Settings"); + + if (SettingsModule != nullptr) + { + SettingsModule->RegisterSettings("Project", "Plugins", "MantisPlugin", + LOCTEXT("MantisSettingsName", "Mantis Plugin"), + LOCTEXT("MantisSettingsDescription", "Set the setting for the Mantis Plugin."), + GetMutableDefault() + ); + } + else + { + UE_LOG(LogMantis, Log, TEXT("SettingsModule is null!")); + } +} + +void FMantis::UnregisterSettings() +{ + ISettingsModule* SettingsModule = FModuleManager::GetModulePtr("Settings"); + if (SettingsModule != nullptr) + { + SettingsModule->UnregisterSettings("Project", "Plugins", "MantisPlugin"); + } +} + +void FMantis::UpdateMantis() +{ + //Get the path of the Engine Crash Report + FString EngineCrashClientPath = GetEngineCrashClientPath(); + FString EngineCrashClientBackupPath = EngineCrashClientPath + ".ue"; + FString EngineCrashClientTmpPath = EngineCrashClientPath + ".tmp"; + + //Get the path to the Mantis Crash Report + FString MantisCrashClientPath = GetMantisCrashClientPath(); + UE_LOG( LogMantis, Log, TEXT( "MantisCrashClientPath: %s" ), *MantisCrashClientPath ); + if ( FPaths::FileExists( MantisCrashClientPath ) ) + { + UE_LOG( LogMantis, Log, TEXT( "Mantis Crash Report file found!" ) ); + } + else + { + UE_LOG( LogMantis, Warning, TEXT( "Mantis Crash Report file not found!" ) ); + return; + } + + //Removing the read-only tag + PlatformFile.SetReadOnly( *EngineCrashClientPath, false ); + + if ( IsMantisExe( EngineCrashClientPath ) == 1 ) + { + FDateTime EngineTimestamp = PlatformFile.GetTimeStamp( *EngineCrashClientPath ); + FDateTime MantisTimestamp = PlatformFile.GetTimeStamp( *MantisCrashClientPath ); + if ( EngineTimestamp >= MantisTimestamp ) + { + UE_LOG( LogMantis, Log, TEXT( "Crash Report Client is up-to-date!" ) ); + return; + } + else + { + UE_LOG( LogMantis, Log, TEXT( "Crash Report Client is out-of-date!" ) ); + } + } + + //Make temporary backup + if ( !MakeBackup( EngineCrashClientPath, EngineCrashClientTmpPath, true ) ) + { + UE_LOG( LogMantis, Warning, TEXT( "Couldn't make temporary Crash Report Client backup!" ) ); + return; + } + + //Delete current file. + if ( !PlatformFile.DeleteFile( *EngineCrashClientPath ) ) + { + UE_LOG( LogMantis, Log, TEXT( "Failed to delete the current Crash Report Client." ) ); + return; + } + + //Copy file if out of date. + if ( PlatformFile.CopyFile( *EngineCrashClientPath, *MantisCrashClientPath ) ) + { + UE_LOG( LogMantis, Log, TEXT( "Crash Report Client is updated!" ) ); + } + else + { + int32 errorNum = FPlatformMisc::GetLastError(); + UE_LOG( LogMantis, Warning, TEXT( "Failed to update Crash Report Client! (Error: %i)" ), errorNum ); + + if ( PlatformFile.CopyFile( *EngineCrashClientPath, *EngineCrashClientPath ) ) + { + UE_LOG( LogMantis, Log, TEXT( "Restored Crash Report Client." ) ); + } + else + { + errorNum = FPlatformMisc::GetLastError(); + UE_LOG( LogMantis, Warning, TEXT( "Failed to restore Crash Report Client! (Error: %i)" ), errorNum ); + } + return; + } + + //Delete temporary backup file. + if ( !PlatformFile.DeleteFile( *EngineCrashClientTmpPath ) ) + { + UE_LOG( LogMantis, Log, TEXT( "Failed to delete the current Crash Report Client." ) ); + return; + } + + //Removing the read-only tag + PlatformFile.SetReadOnly( *EngineCrashClientPath, false ); +} + +bool FMantis::MakeBackup( FString Original, FString Backup, bool bOverwrite ) +{ + //Delete backup if it already exists. + if ( bOverwrite && FPaths::FileExists( Backup ) ) + { + PlatformFile.DeleteFile( *Backup ); + } + + //Make backup. + if ( PlatformFile.CopyFile( *Backup, *Original ) ) + { + UE_LOG( LogMantis, Log, TEXT( "Made a backup." ) ); + } + else + { + int32 errorNum = FPlatformMisc::GetLastError(); + UE_LOG( LogMantis, Warning, TEXT( "Original path: %s" ), *Original ); + UE_LOG( LogMantis, Warning, TEXT( "Backup path: %s" ), *Backup ); + UE_LOG( LogMantis, Warning, TEXT( "Failed to make a backup! (Error: %i)" ), errorNum ); + return false; + } + return true; +} + +void FMantis::StartupModule() +{ + //Register the settings in the editor. + RegisterSettings(); + +#if PLATFORM_WINDOWS + //Get the path of the Engine Crash Report + FString EngineCrashClientPath = GetEngineCrashClientPath(); + FString EngineCrashClientBackupPath = EngineCrashClientPath + ".ue"; + + int32 Result = IsMantisExe( EngineCrashClientPath ); + if ( Result == 1 ) + { + UpdateMantis(); + } + else if ( Result == 0 ) + { + MakeBackup( EngineCrashClientPath, EngineCrashClientBackupPath, true ); + UpdateMantis(); + } + +#endif +} + +void FMantis::ShutdownModule() +{ + //Unregister the settings in the editor. + UnregisterSettings(); + +#if PLATFORM_WINDOWS + //Get the path of the Engine Crash Report + FString EngineCrashClientPath = GetEngineCrashClientPath(); + FString EngineCrashClientBackupPath = EngineCrashClientPath + ".ue"; + + //Can't restore if there is no backup. + if ( !FPaths::FileExists( EngineCrashClientBackupPath ) ) + { + UE_LOG( LogMantis, Warning, TEXT( "Backup file not found!" ) ); + return; + } + + //Check if backup is valid + if ( IsMantisExe( EngineCrashClientBackupPath ) == 1 ) + { + UE_LOG( LogMantis, Warning, TEXT( "Backup file is not from Unreal!" ) ); + return; + } + + //Check if client is valid + int32 Result = IsMantisExe( EngineCrashClientPath ); + if ( Result == 1 ) + { + MakeBackup( EngineCrashClientBackupPath, EngineCrashClientPath, true ); + } +#endif + // This function may be called during shutdown to clean up the module. For modules that support dynamic reloading, + // this function gets called before unloading the module. +} + +int32 FMantis::IsMantisExe( FString FilePath ) +{ +#if PLATFORM_WINDOWS + // get the filename of the executable containing the version resource + LPWSTR FilePathW = (WCHAR*) *FilePath; + + // allocate a block of memory for the version info + uint32 dummy; + uint32 dwSize = GetFileVersionInfoSize( FilePathW, (LPDWORD)&dummy ); + if ( dwSize == 0 ) + { + UE_LOG( LogMantis, Log, TEXT( "GetFileVersionInfoSize failed with error %d\n" ), FPlatformMisc::GetLastError() ); + return -1; + } + + TArray data; + data.SetNum( dwSize ); + // load the version info + if ( !GetFileVersionInfo( FilePathW, NULL, dwSize, &data[0] ) ) + { + UE_LOG( LogMantis, Log, TEXT( "GetFileVersionInfo failed with error %d\n" ), FPlatformMisc::GetLastError() ); + return -1; + } + + LPVOID pvFileDescription = NULL; + uint32 FileDescriptionLen = 0; + + if ( !VerQueryValue( &data[0], _T( "\\StringFileInfo\\040904b0\\FileDescription" ), &pvFileDescription, &FileDescriptionLen ) ) + { + UE_LOG( LogMantis, Log, TEXT( "Can't obtain ProductName and ProductVersion from resources\n" ) ); + return -1; + } + + FString MantisClientName = TEXT( "MantisCrashReportClient" ); + TCHAR* ClientNameW = (TCHAR*)pvFileDescription; + FString ClientName = ClientNameW; + return ( ClientName == MantisClientName ) ? 1 : 0; +#else + return 0; +#endif +} + +IMPLEMENT_MODULE( FMantis, Mantis ) + +#undef LOCTEXT_NAMESPACE \ No newline at end of file diff --git a/Plugins/Mantis/Source/Mantis/Private/MantisPrivatePCH.h b/Plugins/Mantis/Source/Mantis/Private/MantisPrivatePCH.h new file mode 100644 index 0000000..47aaf5e --- /dev/null +++ b/Plugins/Mantis/Source/Mantis/Private/MantisPrivatePCH.h @@ -0,0 +1,12 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// +// The Mantis Module Pre Compiled Header. +////////////////////////////////////////// + +#pragma once + +#include "IMantis.h" + +DECLARE_LOG_CATEGORY_EXTERN(LogMantis, Log, All); \ No newline at end of file diff --git a/Plugins/Mantis/Source/Mantis/Private/MantisSettings.cpp b/Plugins/Mantis/Source/Mantis/Private/MantisSettings.cpp new file mode 100644 index 0000000..5c3c6d4 --- /dev/null +++ b/Plugins/Mantis/Source/Mantis/Private/MantisSettings.cpp @@ -0,0 +1,7 @@ +#pragma once + +#include "MantisPrivatePCH.h" +#include "MantisSettings.h" + +UMantisSettings::UMantisSettings(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer), HostURL(TEXT("")) +{} \ No newline at end of file diff --git a/Plugins/Mantis/Source/Mantis/Public/IMantis.h b/Plugins/Mantis/Source/Mantis/Public/IMantis.h new file mode 100644 index 0000000..d42c98b --- /dev/null +++ b/Plugins/Mantis/Source/Mantis/Public/IMantis.h @@ -0,0 +1,27 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// +// The Mantis Editor Module Interface. +////////////////////////////////////////// + +#pragma once + +#include "ModuleManager.h" + +class IMantis : public IModuleInterface +{ +public: + //Function to Get the Singleton of this Module if it's loaded. + static inline IMantis& Get() + { + return FModuleManager::LoadModuleChecked< IMantis >( "Mantis" ); + } + + //Function to check if the Module is loaded. + static inline bool IsAvailable() + { + return FModuleManager::Get().IsModuleLoaded( "Mantis" ); + } +}; + diff --git a/Plugins/PolishBuildings/PolishBuildings.uplugin b/Plugins/PolishBuildings/PolishBuildings.uplugin new file mode 100644 index 0000000..210a8df --- /dev/null +++ b/Plugins/PolishBuildings/PolishBuildings.uplugin @@ -0,0 +1,24 @@ +{ + "FileVersion": 3, + "Version": 1, + "VersionName": "1.0", + "FriendlyName": "Polish Buildings", + "Description": "A plugin to polish the buildings.", + "Category": "2D", + "CreatedBy": "Yoshi van Belkom", + "CreatedByURL": "http://www.yoshivanbelkom.com/", + "DocsURL": "", + "MarketplaceURL": "", + "SupportURL": "", + "Modules": [ + { + "Name": "PolishBuildings", + "Type": "Editor", + "LoadingPhase": "PreDefault" + } + ], + "EnabledByDefault": false, + "CanContainContent": true, + "IsBetaVersion": false, + "Installed": false +} \ No newline at end of file diff --git a/Plugins/PolishBuildings/Resources/Icon128.png b/Plugins/PolishBuildings/Resources/Icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..afab71bc3a4261e6bb6235141329ce18745ee9e9 GIT binary patch literal 43015 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 G FBuildingsProxyTool::GetWidget() +{ + return SNew(SBuildingsProxyDialog, this); +} + + +FText FBuildingsProxyTool::GetTooltipText() const +{ + return LOCTEXT("BuildingsProxyToolTooltip", "Harvest geometry from selected actors and merge them into single mesh."); +} + + +FString FBuildingsProxyTool::GetDefaultPackageName() const +{ + FString PackageName; + + USelection* SelectedActors = GEditor->GetSelectedActors(); + + // Iterate through selected actors and find first static mesh asset + // Use this static mesh path as destination package name for a merged mesh + for (FSelectionIterator Iter(*SelectedActors); Iter; ++Iter) + { + AActor* Actor = Cast(*Iter); + if (Actor) + { + TInlineComponentArray SMComponets; + Actor->GetComponents(SMComponets); + for (UStaticMeshComponent* Component : SMComponets) + { + if (Component->StaticMesh) + { + PackageName = FPackageName::GetLongPackagePath(Component->StaticMesh->GetOutermost()->GetName()); + PackageName += FString(TEXT("/PROXY_")) + Component->StaticMesh->GetName(); + break; + } + } + } + + if (!PackageName.IsEmpty()) + { + break; + } + } + + if (PackageName.IsEmpty()) + { + PackageName = FPackageName::FilenameToLongPackageName(FPaths::GameContentDir() + TEXT("PROXY")); + PackageName = MakeUniqueObjectName(NULL, UPackage::StaticClass(), *PackageName).ToString(); + } + + return PackageName; +} + + +bool FBuildingsProxyTool::RunMerge(const FString& PackageName) +{ + TArray Actors; + TArray AssetsToSync; + + //Get the module for the proxy mesh utilities + IMeshUtilities& MeshUtilities = FModuleManager::Get().LoadModuleChecked("MeshUtilities"); + + USelection* SelectedActors = GEditor->GetSelectedActors(); + for (FSelectionIterator Iter(*SelectedActors); Iter; ++Iter) + { + AActor* Actor = Cast(*Iter); + if (Actor) + { + Actors.Add(Actor); + } + } + + if (Actors.Num()) + { + GWarn->BeginSlowTask(LOCTEXT("BuildingsProxy_CreatingProxy", "Creating Mesh Proxy"), true); + GEditor->BeginTransaction(LOCTEXT("BuildingsProxy_Create", "Creating Mesh Proxy")); + + FVector ProxyLocation = FVector::ZeroVector; + + FCreateProxyDelegate ProxyDelegate; + ProxyDelegate.BindLambda( + []( const FGuid Guid, TArray& InAssetsToSync ) + { + //Update the asset registry that a new static mash and material has been created + if ( InAssetsToSync.Num() ) + { + FAssetRegistryModule& AssetRegistry = FModuleManager::Get().LoadModuleChecked( "AssetRegistry" ); + int32 AssetCount = InAssetsToSync.Num(); + for ( int32 AssetIndex = 0; AssetIndex < AssetCount; AssetIndex++ ) + { + AssetRegistry.AssetCreated( InAssetsToSync[AssetIndex] ); + GEditor->BroadcastObjectReimported( InAssetsToSync[AssetIndex] ); + } + + //Also notify the content browser that the new assets exists + FContentBrowserModule& ContentBrowserModule = FModuleManager::Get().LoadModuleChecked( "ContentBrowser" ); + ContentBrowserModule.Get().SyncBrowserToAssets( InAssetsToSync, true ); + } + } ); + + FGuid JobGuid = FGuid::NewGuid(); + MeshUtilities.CreateProxyMesh( Actors, ProxySettings, NULL, PackageName, JobGuid, ProxyDelegate ); + + GEditor->EndTransaction(); + GWarn->EndSlowTask(); + } + + return true; +} + + +#undef LOCTEXT_NAMESPACE diff --git a/Plugins/PolishBuildings/Source/Private/BuildingsProxyTool/BuildingsProxyTool.h b/Plugins/PolishBuildings/Source/Private/BuildingsProxyTool/BuildingsProxyTool.h new file mode 100644 index 0000000..3596a20 --- /dev/null +++ b/Plugins/PolishBuildings/Source/Private/BuildingsProxyTool/BuildingsProxyTool.h @@ -0,0 +1,25 @@ +// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved. +#pragma once + +#include "IPolishBuildingsTool.h" + +/** +* Mesh Proxy Tool +*/ +class FBuildingsProxyTool : public IPolishBuildingsTool +{ + friend class SBuildingsProxyDialog; + +public: + + // IMergeActorsTool interface + virtual TSharedRef GetWidget() override; + virtual FName GetIconName() const override { return "PolishBuildings.BuildingsProxyTool"; } + virtual FText GetTooltipText() const override; + virtual FString GetDefaultPackageName() const override; + virtual bool RunMerge(const FString& PackageName) override; + +private: + + FMeshProxySettings ProxySettings; +}; diff --git a/Plugins/PolishBuildings/Source/Private/BuildingsProxyTool/SBuildingsProxyDialog.cpp b/Plugins/PolishBuildings/Source/Private/BuildingsProxyTool/SBuildingsProxyDialog.cpp new file mode 100644 index 0000000..8f011f7 --- /dev/null +++ b/Plugins/PolishBuildings/Source/Private/BuildingsProxyTool/SBuildingsProxyDialog.cpp @@ -0,0 +1,614 @@ +// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved. + +#include "PolishBuildingsPrivatePCH.h" +#include "SBuildingsProxyDialog.h" +#include "Dialogs/DlgPickAssetPath.h" +#include "SNumericEntryBox.h" +#include "STextComboBox.h" +#include "BuildingsProxyTool/BuildingsProxyTool.h" + +#define LOCTEXT_NAMESPACE "SBuildingsProxyDialog" + + +void SBuildingsProxyDialog::Construct(const FArguments& InArgs, FBuildingsProxyTool* InTool) +{ + Tool = InTool; + check(Tool != nullptr); + + CuttingPlaneOptions.Add(MakeShareable(new FString(TEXT("+X")))); + CuttingPlaneOptions.Add(MakeShareable(new FString(TEXT("+Y")))); + CuttingPlaneOptions.Add(MakeShareable(new FString(TEXT("+Z")))); + CuttingPlaneOptions.Add(MakeShareable(new FString(TEXT("-X")))); + CuttingPlaneOptions.Add(MakeShareable(new FString(TEXT("-Y")))); + CuttingPlaneOptions.Add(MakeShareable(new FString(TEXT("-Z")))); + + TextureResolutionOptions.Add(MakeShareable(new FString(TEXT("64")))); + TextureResolutionOptions.Add(MakeShareable(new FString(TEXT("128")))); + TextureResolutionOptions.Add(MakeShareable(new FString(TEXT("256")))); + TextureResolutionOptions.Add(MakeShareable(new FString(TEXT("512")))); + TextureResolutionOptions.Add(MakeShareable(new FString(TEXT("1024")))); + TextureResolutionOptions.Add(MakeShareable(new FString(TEXT("2048")))); + + CreateLayout(); +} + +BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION +void SBuildingsProxyDialog::CreateLayout() +{ + int32 TextureResEntryIndex = FindTextureResolutionEntryIndex( Tool->ProxySettings.MaterialSettings.TextureSize.X ); + int32 LightMapResEntryIndex = FindTextureResolutionEntryIndex( Tool->ProxySettings.LightMapResolution ); + TextureResEntryIndex = FMath::Max( TextureResEntryIndex, 0 ); + LightMapResEntryIndex = FMath::Max( LightMapResEntryIndex, 0 ); + + this->ChildSlot + [ + SNew(SVerticalBox) + + +SVerticalBox::Slot() + .AutoHeight() + .HAlign(HAlign_Center) + .VAlign(VAlign_Center) + .Padding(10) + [ + // Simplygon logo + SNew(SImage) + .Image(FEditorStyle::GetBrush("BuildingsProxy.SimplygonLogo")) + ] + + +SVerticalBox::Slot() + .AutoHeight() + [ + SNew(SBorder) + .BorderImage(FEditorStyle::GetBrush("ToolPanel.GroupBorder")) + [ + // Proxy options + SNew(SVerticalBox) + + +SVerticalBox::Slot() + .AutoHeight() + .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) + [ + SNew(SHorizontalBox) + +SHorizontalBox::Slot() + .FillWidth(0.5f) + .VAlign(VAlign_Center) + [ + SNew(STextBlock) + .Text(LOCTEXT("OnScreenSizeLabel", "On Screen Size (pixels)")) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + .ToolTipText( GetPropertyToolTipText( GET_MEMBER_NAME_CHECKED( FMeshProxySettings, ScreenSize ) ) ) + ] + + SHorizontalBox::Slot() + .FillWidth(0.5f) + .HAlign(HAlign_Left) + .VAlign(VAlign_Center) + [ + SNew(SBox) + .HAlign(HAlign_Fill) + .MinDesiredWidth(100.0f) + .MaxDesiredWidth(100.0f) + [ + SNew(SNumericEntryBox) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + .MinValue(40) + .MaxValue(1200) + .MinSliderValue(40) + .MaxSliderValue(1200) + .AllowSpin(true) + .Value(this, &SBuildingsProxyDialog::GetScreenSize) + .OnValueChanged(this, &SBuildingsProxyDialog::ScreenSizeChanged) + ] + ] + ] + + +SVerticalBox::Slot() + .AutoHeight() + .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) + [ + SNew(SHorizontalBox) + +SHorizontalBox::Slot() + .FillWidth(0.5f) + .VAlign(VAlign_Center) + [ + SNew(STextBlock) + .Text(LOCTEXT("MergeDistanceLabel", "Merge Distance (pixels)")) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + .ToolTipText( GetPropertyToolTipText( GET_MEMBER_NAME_CHECKED( FMeshProxySettings, MergeDistance ) ) ) + ] + + SHorizontalBox::Slot() + .FillWidth(0.5f) + .HAlign(HAlign_Left) + .VAlign(VAlign_Center) + [ + SNew(SBox) + .HAlign(HAlign_Fill) + .MinDesiredWidth(100.0f) + .MaxDesiredWidth(100.0f) + [ + SNew(SNumericEntryBox) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + .MinValue(0) + .MaxValue(300) + .MinSliderValue(0) + .MaxSliderValue(300) + .AllowSpin(true) + .Value(this, &SBuildingsProxyDialog::GetMergeDistance) + .OnValueChanged(this, &SBuildingsProxyDialog::MergeDistanceChanged) + ] + ] + ] + + +SVerticalBox::Slot() + .AutoHeight() + .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) + [ + SNew(SHorizontalBox) + +SHorizontalBox::Slot() + .FillWidth(0.5f) + .VAlign(VAlign_Center) + [ + SNew(STextBlock) + .Text(LOCTEXT("TextureResolutionLabel", "Texture Resolution")) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + ] + + SHorizontalBox::Slot() + .FillWidth(0.5f) + .HAlign(HAlign_Left) + .VAlign(VAlign_Center) + [ + SNew(STextComboBox) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + .OptionsSource(&TextureResolutionOptions) + .InitiallySelectedItem( TextureResolutionOptions[TextureResEntryIndex] ) + .OnSelectionChanged(this, &SBuildingsProxyDialog::SetTextureResolution) + ] + ] + + +SVerticalBox::Slot() + .AutoHeight() + .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) + [ + SNew( SHorizontalBox ) + + SHorizontalBox::Slot() + .FillWidth( 0.5f ) + .VAlign( VAlign_Center ) + [ + SNew(STextBlock) + .Text( LOCTEXT( "LightMapResolutionLabel", "LightMap Resolution" ) ) + .Font( FEditorStyle::GetFontStyle( "StandardDialog.SmallFont" ) ) + .ToolTipText( GetPropertyToolTipText( GET_MEMBER_NAME_CHECKED( FMeshProxySettings, LightMapResolution ) ) ) + ] + + SHorizontalBox::Slot() + .FillWidth( 0.5f ) + .HAlign( HAlign_Left ) + .VAlign( VAlign_Center ) + [ + SNew( STextComboBox ) + .Font( FEditorStyle::GetFontStyle( "StandardDialog.SmallFont" ) ) + .OptionsSource( &TextureResolutionOptions ) + .InitiallySelectedItem( TextureResolutionOptions[LightMapResEntryIndex] ) + .OnSelectionChanged( this, &SBuildingsProxyDialog::SetLightMapResolution ) + ] + ] + + +SVerticalBox::Slot() + .AutoHeight() + .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) + [ + SNew(SHorizontalBox) + +SHorizontalBox::Slot() + .FillWidth(0.5f) + .VAlign(VAlign_Center) + .Padding(0.0, 0.0, 3.0, 0.0) + [ + SNew( STextBlock ) + .Text( LOCTEXT( "HardAngleLabel", "Hard Edge Angle" ) ) + .Font( FEditorStyle::GetFontStyle( "StandardDialog.SmallFont" ) ) + .ToolTipText( GetPropertyToolTipText( GET_MEMBER_NAME_CHECKED( FMeshProxySettings, HardAngleThreshold ) ) ) + ] + +SHorizontalBox::Slot() + .FillWidth(0.5f) + .HAlign(HAlign_Left) + .VAlign(VAlign_Center) + [ + SNew(SBox) + .HAlign(HAlign_Fill) + .MinDesiredWidth(100.0f) + .MaxDesiredWidth(100.0f) + [ + SNew(SNumericEntryBox) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + .MinValue(0.f) + .MaxValue(180.f) + .MinSliderValue(0.f) + .MaxSliderValue(180.f) + .AllowSpin(true) + .Value(this, &SBuildingsProxyDialog::GetHardAngleThreshold) + .OnValueChanged(this, &SBuildingsProxyDialog::HardAngleThresholdChanged) + .IsEnabled(this, &SBuildingsProxyDialog::HardAngleThresholdEnabled) + ] + ] + ] + + +SVerticalBox::Slot() + .AutoHeight() + .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) + [ + SNew(SCheckBox) + .Type(ESlateCheckBoxType::CheckBox) + .IsChecked( this, &SBuildingsProxyDialog::GetRecalculateNormals ) + .OnCheckStateChanged( this, &SBuildingsProxyDialog::SetRecalculateNormals ) + .Content() + [ + SNew( STextBlock ) + .Text( LOCTEXT( "RecalcNormalsLabel", "Recalculate Normals" ) ) + .Font( FEditorStyle::GetFontStyle( "StandardDialog.SmallFont" ) ) + .ToolTipText( GetPropertyToolTipText( GET_MEMBER_NAME_CHECKED( FMeshProxySettings, bRecalculateNormals ) ) ) + ] + ] + + + SVerticalBox::Slot() + .AutoHeight() + .Padding( FEditorStyle::GetMargin( "StandardDialog.ContentPadding" ) ) + [ + SNew( SCheckBox ) + .Type( ESlateCheckBoxType::CheckBox ) + .IsChecked(this, &SBuildingsProxyDialog::GetUseClippingPlane) + .OnCheckStateChanged(this, &SBuildingsProxyDialog::SetUseClippingPlane) + .Content() + [ + SNew(STextBlock) + .Text(LOCTEXT("ClippingPlaneLabel", "Use Clipping Plane")) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + ] + ] + + +SVerticalBox::Slot() + .AutoHeight() + .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) + [ + SNew(SHorizontalBox) + +SHorizontalBox::Slot() + .VAlign(VAlign_Center) + .FillWidth(0.5f) + [ + SNew(SHorizontalBox) + +SHorizontalBox::Slot() + .AutoWidth() + [ + SNew(SBox) + .MinDesiredWidth(30) + [ + SNullWidget::NullWidget + ] + ] + +SHorizontalBox::Slot() + .AutoWidth() + .HAlign(HAlign_Left) + [ + SNew(STextBlock) + .IsEnabled(this, &SBuildingsProxyDialog::UseClippingPlaneEnabled) + .Text(LOCTEXT("ClippingAxisLabel", "Clipping Axis")) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + .ToolTipText( GetPropertyToolTipText( GET_MEMBER_NAME_CHECKED( FMeshProxySettings, AxisIndex ) ) ) + ] + ] + +SHorizontalBox::Slot() + .FillWidth(0.5f) + .HAlign(HAlign_Left) + .VAlign(VAlign_Center) + .Padding(8.0, 0.0, 8.0, 0.0) + [ + SNew(STextComboBox) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + .OptionsSource(&CuttingPlaneOptions) + .InitiallySelectedItem(CuttingPlaneOptions[0]) + .OnSelectionChanged(this, &SBuildingsProxyDialog::SetClippingAxis) + .IsEnabled(this, &SBuildingsProxyDialog::UseClippingPlaneEnabled) + ] + ] + + +SVerticalBox::Slot() + .AutoHeight() + .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) + [ + SNew(SHorizontalBox) + +SHorizontalBox::Slot() + .FillWidth(0.5f) + .VAlign(VAlign_Center) + .Padding(0.0, 0.0, 3.0, 0.0) + [ + SNew(SHorizontalBox) + +SHorizontalBox::Slot() + .AutoWidth() + [ + SNew(SBox) + .MinDesiredWidth(30) + [ + SNullWidget::NullWidget + ] + ] + +SHorizontalBox::Slot() + .HAlign(HAlign_Left) + .AutoWidth() + [ + SNew(STextBlock) + .Text(LOCTEXT("PlaneLevelLabel", "Plane level")) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + .IsEnabled(this, &SBuildingsProxyDialog::UseClippingPlaneEnabled) + .ToolTipText( GetPropertyToolTipText( GET_MEMBER_NAME_CHECKED( FMeshProxySettings, ClippingLevel ) ) ) + ] + ] + +SHorizontalBox::Slot() + .FillWidth(0.5f) + .HAlign(HAlign_Left) + [ + SNew(SBox) + .HAlign(HAlign_Fill) + .MinDesiredWidth(100.0f) + .MaxDesiredWidth(100.0f) + [ + SNew(SNumericEntryBox) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + .Value(this, &SBuildingsProxyDialog::GetClippingLevel) + .OnValueChanged(this, &SBuildingsProxyDialog::ClippingLevelChanged) + .IsEnabled(this, &SBuildingsProxyDialog::UseClippingPlaneEnabled) + ] + ] + ] + + +SVerticalBox::Slot() + .AutoHeight() + .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) + [ + SNew(SCheckBox) + .Type(ESlateCheckBoxType::CheckBox) + .IsChecked(this, &SBuildingsProxyDialog::GetExportNormalMap) + .OnCheckStateChanged(this, &SBuildingsProxyDialog::SetExportNormalMap) + .Content() + [ + SNew(STextBlock) + .Text(LOCTEXT("ExportNormalMapLabel", "Export Normal Map")) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + ] + ] + + +SVerticalBox::Slot() + .AutoHeight() + .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) + [ + SNew(SCheckBox) + .Type(ESlateCheckBoxType::CheckBox) + .IsChecked(this, &SBuildingsProxyDialog::GetExportMetallicMap) + .OnCheckStateChanged(this, &SBuildingsProxyDialog::SetExportMetallicMap) + .Content() + [ + SNew(STextBlock) + .Text(LOCTEXT("ExportMetallicMapLabel", "Export Metallic Map")) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + ] + ] + + +SVerticalBox::Slot() + .AutoHeight() + .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) + [ + SNew(SCheckBox) + .Type(ESlateCheckBoxType::CheckBox) + .IsChecked(this, &SBuildingsProxyDialog::GetExportRoughnessMap) + .OnCheckStateChanged(this, &SBuildingsProxyDialog::SetExportRoughnessMap) + .Content() + [ + SNew(STextBlock) + .Text(LOCTEXT("ExportRoughnessMapLabel", "Export Roughness Map")) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + ] + ] + + +SVerticalBox::Slot() + .AutoHeight() + .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) + [ + SNew(SCheckBox) + .Type(ESlateCheckBoxType::CheckBox) + .IsChecked(this, &SBuildingsProxyDialog::GetExportSpecularMap) + .OnCheckStateChanged(this, &SBuildingsProxyDialog::SetExportSpecularMap) + .Content() + [ + SNew(STextBlock) + .Text(LOCTEXT("ExportSpecularMapLabel", "Export Specular Map")) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + ] + ] + ] + ] + ]; +} +END_SLATE_FUNCTION_BUILD_OPTIMIZATION + +int32 SBuildingsProxyDialog::FindTextureResolutionEntryIndex( int32 InResolution ) const +{ + FString ResolutionStr = TTypeToString::ToString( InResolution ); + + int32 Result = TextureResolutionOptions.IndexOfByPredicate( [&]( const TSharedPtr& Entry ) + { + return ( ResolutionStr == *Entry ); + } ); + + return Result; +} + +FText SBuildingsProxyDialog::GetPropertyToolTipText( const FName& PropertyName ) const +{ + UProperty* Property = FMeshProxySettings::StaticStruct()->FindPropertyByName( PropertyName ); + if ( Property ) + { + return Property->GetToolTipText(); + } + + return FText::GetEmpty(); +} + +//Screen size +TOptional SBuildingsProxyDialog::GetScreenSize() const +{ + return Tool->ProxySettings.ScreenSize; +} + +void SBuildingsProxyDialog::ScreenSizeChanged(int32 NewValue) +{ + Tool->ProxySettings.ScreenSize = NewValue; +} + +//Recalculate normals +ECheckBoxState SBuildingsProxyDialog::GetRecalculateNormals() const +{ + return Tool->ProxySettings.bRecalculateNormals ? ECheckBoxState::Checked: ECheckBoxState::Unchecked; +} + +void SBuildingsProxyDialog::SetRecalculateNormals(ECheckBoxState NewValue) +{ + Tool->ProxySettings.bRecalculateNormals = (NewValue == ECheckBoxState::Checked); +} + +//Hard Angle Threshold +bool SBuildingsProxyDialog::HardAngleThresholdEnabled() const +{ + if(Tool->ProxySettings.bRecalculateNormals) + { + return true; + } + + return false; +} + +TOptional SBuildingsProxyDialog::GetHardAngleThreshold() const +{ + return Tool->ProxySettings.HardAngleThreshold; +} + +void SBuildingsProxyDialog::HardAngleThresholdChanged(float NewValue) +{ + Tool->ProxySettings.HardAngleThreshold = NewValue; +} + +//Merge Distance +TOptional SBuildingsProxyDialog::GetMergeDistance() const +{ + return Tool->ProxySettings.MergeDistance; +} + +void SBuildingsProxyDialog::MergeDistanceChanged(int32 NewValue) +{ + Tool->ProxySettings.MergeDistance = NewValue; +} + +//Clipping Plane +ECheckBoxState SBuildingsProxyDialog::GetUseClippingPlane() const +{ + return Tool->ProxySettings.bUseClippingPlane ? ECheckBoxState::Checked: ECheckBoxState::Unchecked; +} + +void SBuildingsProxyDialog::SetUseClippingPlane(ECheckBoxState NewValue) +{ + Tool->ProxySettings.bUseClippingPlane = (NewValue == ECheckBoxState::Checked); +} + +bool SBuildingsProxyDialog::UseClippingPlaneEnabled() const +{ + if(Tool->ProxySettings.bUseClippingPlane) + { + return true; + } + return false; +} + +void SBuildingsProxyDialog::SetClippingAxis(TSharedPtr NewSelection, ESelectInfo::Type SelectInfo ) +{ + //This is a ugly hack, but it solves the problem for now + int32 AxisIndex = CuttingPlaneOptions.Find(NewSelection); + //FMessageDialog::Debugf(*FString::Printf(TEXT("%d"), AxisIndex )); + if(AxisIndex < 3) + { + Tool->ProxySettings.bPlaneNegativeHalfspace = false; + Tool->ProxySettings.AxisIndex = AxisIndex; + return; + } + else + { + Tool->ProxySettings.bPlaneNegativeHalfspace = true; + Tool->ProxySettings.AxisIndex = AxisIndex - 3; + return; + } +} + +TOptional SBuildingsProxyDialog::GetClippingLevel() const +{ + return Tool->ProxySettings.ClippingLevel; +} + +void SBuildingsProxyDialog::ClippingLevelChanged(float NewValue) +{ + Tool->ProxySettings.ClippingLevel = NewValue; +} + +//Texture Resolution +void SBuildingsProxyDialog::SetTextureResolution(TSharedPtr NewSelection, ESelectInfo::Type SelectInfo) +{ + int32 Resolution = 512; + TTypeFromString::FromString(Resolution, **NewSelection); + FIntPoint TextureSize(Resolution, Resolution); + + Tool->ProxySettings.MaterialSettings.TextureSize = TextureSize; +} + +void SBuildingsProxyDialog::SetLightMapResolution( TSharedPtr NewSelection, ESelectInfo::Type SelectInfo ) +{ + int32 Resolution = 256; + TTypeFromString::FromString( Resolution, **NewSelection ); + + Tool->ProxySettings.LightMapResolution = Resolution; +} + +ECheckBoxState SBuildingsProxyDialog::GetExportNormalMap() const +{ + return Tool->ProxySettings.MaterialSettings.bNormalMap ? ECheckBoxState::Checked : ECheckBoxState::Unchecked; +} + +void SBuildingsProxyDialog::SetExportNormalMap(ECheckBoxState NewValue) +{ + Tool->ProxySettings.MaterialSettings.bNormalMap = ( NewValue == ECheckBoxState::Checked ); +} + +ECheckBoxState SBuildingsProxyDialog::GetExportMetallicMap() const +{ + return Tool->ProxySettings.MaterialSettings.bMetallicMap ? ECheckBoxState::Checked : ECheckBoxState::Unchecked; +} + +void SBuildingsProxyDialog::SetExportMetallicMap(ECheckBoxState NewValue) +{ + Tool->ProxySettings.MaterialSettings.bMetallicMap = ( NewValue == ECheckBoxState::Checked ); +} + +ECheckBoxState SBuildingsProxyDialog::GetExportRoughnessMap() const +{ + return Tool->ProxySettings.MaterialSettings.bRoughnessMap ? ECheckBoxState::Checked : ECheckBoxState::Unchecked; +} + +void SBuildingsProxyDialog::SetExportRoughnessMap(ECheckBoxState NewValue) +{ + Tool->ProxySettings.MaterialSettings.bRoughnessMap = ( NewValue == ECheckBoxState::Checked ); +} + +ECheckBoxState SBuildingsProxyDialog::GetExportSpecularMap() const +{ + return Tool->ProxySettings.MaterialSettings.bSpecularMap ? ECheckBoxState::Checked : ECheckBoxState::Unchecked; +} + +void SBuildingsProxyDialog::SetExportSpecularMap(ECheckBoxState NewValue) +{ + Tool->ProxySettings.MaterialSettings.bSpecularMap = ( NewValue == ECheckBoxState::Checked ); +} + + +#undef LOCTEXT_NAMESPACE diff --git a/Plugins/PolishBuildings/Source/Private/BuildingsProxyTool/SBuildingsProxyDialog.h b/Plugins/PolishBuildings/Source/Private/BuildingsProxyTool/SBuildingsProxyDialog.h new file mode 100644 index 0000000..0b27af7 --- /dev/null +++ b/Plugins/PolishBuildings/Source/Private/BuildingsProxyTool/SBuildingsProxyDialog.h @@ -0,0 +1,75 @@ +// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved. + +#pragma once + +class FBuildingsProxyTool; + +/*----------------------------------------------------------------------------- + SBuildingsProxyDialog +-----------------------------------------------------------------------------*/ +class SBuildingsProxyDialog : public SCompoundWidget +{ +public: + SLATE_BEGIN_ARGS(SBuildingsProxyDialog) + { + } + SLATE_END_ARGS() + +public: + /** SWidget functions */ + void Construct(const FArguments& InArgs, FBuildingsProxyTool* InTool); + +protected: + /** ScreenSize accessors */ + TOptional GetScreenSize() const; + void ScreenSizeChanged(int32 NewValue); //used with editable text block (Simplygon) + + /** Recalculate Normals accessors */ + ECheckBoxState GetRecalculateNormals() const; + void SetRecalculateNormals(ECheckBoxState NewValue); + + /** Hard Angle Threshold accessors */ + TOptional GetHardAngleThreshold() const; + bool HardAngleThresholdEnabled() const; + void HardAngleThresholdChanged(float NewValue); + + /** Hole filling accessors */ + TOptional GetMergeDistance() const; + void MergeDistanceChanged(int32 NewValue); + + /** Clipping Plane accessors */ + ECheckBoxState GetUseClippingPlane() const; + void SetUseClippingPlane(ECheckBoxState NewValue); + bool UseClippingPlaneEnabled() const; + void SetClippingAxis(TSharedPtr NewSelection, ESelectInfo::Type SelectInfo); + TOptional GetClippingLevel() const; + void ClippingLevelChanged(float NewValue); + + /** TextureResolution accessors */ + void SetTextureResolution(TSharedPtr NewSelection, ESelectInfo::Type SelectInfo); + void SetLightMapResolution( TSharedPtr NewSelection, ESelectInfo::Type SelectInfo ); + + /** Export material properties acessors **/ + ECheckBoxState GetExportNormalMap() const; + void SetExportNormalMap(ECheckBoxState NewValue); + ECheckBoxState GetExportMetallicMap() const; + void SetExportMetallicMap(ECheckBoxState NewValue); + ECheckBoxState GetExportRoughnessMap() const; + void SetExportRoughnessMap(ECheckBoxState NewValue); + ECheckBoxState GetExportSpecularMap() const; + void SetExportSpecularMap(ECheckBoxState NewValue); + +private: + /** Creates the geometry mode controls */ + void CreateLayout(); + + int32 FindTextureResolutionEntryIndex( int32 InResolution ) const; + FText GetPropertyToolTipText( const FName& PropertyName ) const; + +private: + FBuildingsProxyTool* Tool; + + TArray< TSharedPtr > CuttingPlaneOptions; + TArray< TSharedPtr > TextureResolutionOptions; +}; + diff --git a/Plugins/PolishBuildings/Source/Private/PolishBuildingsModule.cpp b/Plugins/PolishBuildings/Source/Private/PolishBuildingsModule.cpp new file mode 100644 index 0000000..2c44958 --- /dev/null +++ b/Plugins/PolishBuildings/Source/Private/PolishBuildingsModule.cpp @@ -0,0 +1,162 @@ +// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved. + +#include "PolishBuildingsPrivatePCH.h" +#include "SPolishBuildingsToolbar.h" +#include "ModuleManager.h" +#include "WorkspaceMenuStructureModule.h" +#include "PolishBuildingsTool.h" +#include "BuildingsProxyTool.h" +#include "SDockTab.h" + +#define LOCTEXT_NAMESPACE "PolishBuildingsModule" + + +static const FName PolishBuildingsTabName = FName("PolishBuildings"); + +/** + * Merge Actors module + */ +class FPolishBuildingsModule : public IPolishBuildingsModule +{ +public: + + /** + * Called right after the module DLL has been loaded and the module object has been created + */ + virtual void StartupModule() override; + + /** + * Called before the module is unloaded, right before the module object is destroyed. + */ + virtual void ShutdownModule() override; + + /** + * Register an IPolishBuildingsTool with the module, passing ownership to it + */ + virtual bool RegisterPolishBuildingsTool(TUniquePtr Tool) override; + + /** + * Unregister an IPolishBuildingsTool with the module + */ + virtual bool UnregisterPolishBuildingsTool(IPolishBuildingsTool* Tool) override; + + +private: + + /** Creates the dock tab widget used by the tab manager */ + TSharedRef CreatePolishBuildingsTab(const FSpawnTabArgs& Args); + +private: + + /** Pointer to the toolbar widget */ + TWeakPtr PolishBuildingsToolbarPtr; + + /** List of registered PolishBuildingsTool instances */ + TArray> PolishBuildingsTools; +}; + +IMPLEMENT_MODULE(FPolishBuildingsModule, PolishBuildings); + + +TSharedRef FPolishBuildingsModule::CreatePolishBuildingsTab(const FSpawnTabArgs& Args) +{ + // Build array of PolishBuildingsTool raw pointers + TArray ToolsToRegister; + for (const auto& MergeActorTool : PolishBuildingsTools) + { + check(MergeActorTool.Get() != nullptr); + ToolsToRegister.Add(MergeActorTool.Get()); + } + + // Construct toolbar widget + TSharedRef PolishBuildingsToolbar = + SNew(SPolishBuildingsToolbar) + .ToolsToRegister(ToolsToRegister); + + // Construct dock tab + TSharedRef DockTab = + SNew(SDockTab) + .TabRole(ETabRole::NomadTab) + [ + PolishBuildingsToolbar + ]; + + // Keep weak pointer to toolbar widget + PolishBuildingsToolbarPtr = PolishBuildingsToolbar; + + return DockTab; +} + + +void FPolishBuildingsModule::StartupModule() +{ + FGlobalTabmanager::Get()->RegisterNomadTabSpawner(PolishBuildingsTabName, FOnSpawnTab::CreateRaw(this, &FPolishBuildingsModule::CreatePolishBuildingsTab)) + .SetDisplayName(LOCTEXT("TabTitle", "Polish Buildings")) + .SetTooltipText(LOCTEXT("TooltipText", "Open the Polish Buildings tab.")) + .SetGroup(WorkspaceMenu::GetMenuStructure().GetLevelEditorCategory()) + .SetIcon(FSlateIcon(FEditorStyle::GetStyleSetName(), "ClassViewer.TabIcon")); + // This is still experimental in the editor, so it's added specifically in FMainMenu for now. + // When no longer experimental, remove the below. + //.SetAutoGenerateMenuEntry(false); + + // Register built-in merging tools straight away + ensure(RegisterPolishBuildingsTool(MakeUnique())); + + IMeshUtilities* MeshUtilities = FModuleManager::Get().LoadModulePtr("MeshUtilities"); + if (MeshUtilities != nullptr && MeshUtilities->GetMeshMergingInterface() != nullptr) + { + // Only register BuildingsProxyTool if Simplygon is available + ensure(RegisterPolishBuildingsTool(MakeUnique())); + } +} + + +void FPolishBuildingsModule::ShutdownModule() +{ + if (FSlateApplication::IsInitialized()) + { + FGlobalTabmanager::Get()->UnregisterNomadTabSpawner(PolishBuildingsTabName); + } +} + + +bool FPolishBuildingsModule::RegisterPolishBuildingsTool(TUniquePtr Tool) +{ + if (Tool.Get() != nullptr && !PolishBuildingsTools.Contains(MoveTemp(Tool))) + { + PolishBuildingsTools.Add(MoveTemp(Tool)); + + // If a tool is added while the toolbar widget is active, update it accordingly + TSharedPtr PolishBuildingsToolbar = PolishBuildingsToolbarPtr.Pin(); + if (PolishBuildingsToolbar.IsValid()) + { + PolishBuildingsToolbar->AddTool(Tool.Get()); + } + + return true; + } + + return false; +} + + +bool FPolishBuildingsModule::UnregisterPolishBuildingsTool(IPolishBuildingsTool* Tool) +{ + if (Tool != nullptr) + { + if (PolishBuildingsTools.RemoveAll([=](const TUniquePtr& Ptr) { return Ptr.Get() == Tool; }) > 0) + { + TSharedPtr PolishBuildingsToolbar = PolishBuildingsToolbarPtr.Pin(); + if (PolishBuildingsToolbar.IsValid()) + { + PolishBuildingsToolbar->RemoveTool(Tool); + } + + return true; + } + } + return false; +} + + +#undef LOCTEXT_NAMESPACE diff --git a/Plugins/PolishBuildings/Source/Private/PolishBuildingsPrivatePCH.h b/Plugins/PolishBuildings/Source/Private/PolishBuildingsPrivatePCH.h new file mode 100644 index 0000000..0c6663e --- /dev/null +++ b/Plugins/PolishBuildings/Source/Private/PolishBuildingsPrivatePCH.h @@ -0,0 +1,6 @@ +// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "UnrealEd.h" +#include "IPolishBuildingsModule.h" diff --git a/Plugins/PolishBuildings/Source/Private/PolishBuildingsTool/PolishBuildingsTool.cpp b/Plugins/PolishBuildings/Source/Private/PolishBuildingsTool/PolishBuildingsTool.cpp new file mode 100644 index 0000000..ae20391 --- /dev/null +++ b/Plugins/PolishBuildings/Source/Private/PolishBuildingsTool/PolishBuildingsTool.cpp @@ -0,0 +1,149 @@ +// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved. + +#include "PolishBuildingsPrivatePCH.h" +#include "PolishBuildingsTool.h" +#include "SPolishBuildingsDialog.h" +#include "PropertyEditorModule.h" +#include "Engine/TextureLODSettings.h" +#include "RawMesh.h" +#include "Engine/StaticMeshActor.h" +#include "Engine/StaticMesh.h" +#include "Engine/Selection.h" +#include "SystemSettings.h" +#include "Engine/TextureLODSettings.h" +#include "ContentBrowserModule.h" +#include "AssetRegistryModule.h" +#include "ScopedTransaction.h" + +#define LOCTEXT_NAMESPACE "PolishBuildingsTool" + + +FPolishBuildingsTool::FPolishBuildingsTool() + : bReplaceSourceActors(false) + , bExportSpecificLOD(false) + , ExportLODIndex(0) +{} + + +TSharedRef FPolishBuildingsTool::GetWidget() +{ + return SNew(SPolishBuildingsDialog, this); +} + + +FText FPolishBuildingsTool::GetTooltipText() const +{ + return LOCTEXT("PolishBuildingsToolTooltip", "Harvest geometry from selected actors and merge grouping them by materials."); +} + + +FString FPolishBuildingsTool::GetDefaultPackageName() const +{ + FString PackageName = FPackageName::FilenameToLongPackageName(FPaths::GameContentDir() + TEXT("SM_MERGED")); + + USelection* SelectedActors = GEditor->GetSelectedActors(); + // Iterate through selected actors and find first static mesh asset + // Use this static mesh path as destination package name for a merged mesh + for (FSelectionIterator Iter(*SelectedActors); Iter; ++Iter) + { + AActor* Actor = Cast(*Iter); + if (Actor) + { + FString ActorName = Actor->GetName(); + PackageName = FString::Printf(TEXT("%s_%s"), *PackageName, *ActorName); + break; + } + } + + if (PackageName.IsEmpty()) + { + PackageName = MakeUniqueObjectName(NULL, UPackage::StaticClass(), *PackageName).ToString(); + } + + return PackageName; +} + + +bool FPolishBuildingsTool::RunMerge(const FString& PackageName) +{ + IMeshUtilities& MeshUtilities = FModuleManager::Get().LoadModuleChecked("MeshUtilities"); + USelection* SelectedActors = GEditor->GetSelectedActors(); + TArray Actors; + TArray UniqueLevels; + for (FSelectionIterator Iter(*SelectedActors); Iter; ++Iter) + { + AActor* Actor = Cast(*Iter); + if (Actor) + { + Actors.Add(Actor); + UniqueLevels.AddUnique(Actor->GetLevel()); + } + } + + // This restriction is only for replacement of selected actors with merged mesh actor + if (UniqueLevels.Num() > 1 && bReplaceSourceActors) + { + FText Message = NSLOCTEXT("UnrealEd", "FailedToPolishBuildingsSublevels_Msg", "The selected actors should be in the same level"); + OpenMsgDlgInt(EAppMsgType::Ok, Message, NSLOCTEXT("UnrealEd", "FailedToPolishBuildings_Title", "Unable to merge actors")); + return false; + } + + int32 TargetMeshLOD = bExportSpecificLOD ? ExportLODIndex : INDEX_NONE; + FVector MergedActorLocation; + TArray AssetsToSync; + // Merge... + { + FScopedSlowTask SlowTask(0, LOCTEXT("MergingActorsSlowTask", "Merging actors...")); + SlowTask.MakeDialog(); + + MeshUtilities.MergeActors(Actors, MergingSettings, NULL, PackageName, TargetMeshLOD, AssetsToSync, MergedActorLocation); + } + + if (AssetsToSync.Num()) + { + FAssetRegistryModule& AssetRegistry = FModuleManager::Get().LoadModuleChecked("AssetRegistry"); + int32 AssetCount = AssetsToSync.Num(); + for (int32 AssetIndex = 0; AssetIndex < AssetCount; AssetIndex++) + { + AssetRegistry.AssetCreated(AssetsToSync[AssetIndex]); + GEditor->BroadcastObjectReimported(AssetsToSync[AssetIndex]); + } + + //Also notify the content browser that the new assets exists + FContentBrowserModule& ContentBrowserModule = FModuleManager::Get().LoadModuleChecked("ContentBrowser"); + ContentBrowserModule.Get().SyncBrowserToAssets(AssetsToSync, true); + + // Place new mesh in the world + if (bReplaceSourceActors) + { + UStaticMesh* MergedMesh = nullptr; + if (AssetsToSync.FindItemByClass(&MergedMesh)) + { + const FScopedTransaction Transaction(LOCTEXT("PlaceMergedActor", "Place Merged Actor")); + UniqueLevels[0]->Modify(); + + UWorld* World = UniqueLevels[0]->OwningWorld; + FActorSpawnParameters Params; + Params.OverrideLevel = UniqueLevels[0]; + FRotator MergedActorRotation(ForceInit); + + AStaticMeshActor* MergedActor = World->SpawnActor(MergedActorLocation, MergedActorRotation, Params); + MergedActor->GetStaticMeshComponent()->StaticMesh = MergedMesh; + MergedActor->SetActorLabel(AssetsToSync[0]->GetName()); + + // Remove source actors + /* + for (AActor* Actor : Actors) + { + Actor->Destroy(); + } + */ + } + } + } + + return true; +} + + +#undef LOCTEXT_NAMESPACE diff --git a/Plugins/PolishBuildings/Source/Private/PolishBuildingsTool/PolishBuildingsTool.h b/Plugins/PolishBuildings/Source/Private/PolishBuildingsTool/PolishBuildingsTool.h new file mode 100644 index 0000000..673e64e --- /dev/null +++ b/Plugins/PolishBuildings/Source/Private/PolishBuildingsTool/PolishBuildingsTool.h @@ -0,0 +1,35 @@ +// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved. +#pragma once + +#include "IPolishBuildingsTool.h" +#include "MeshUtilities.h" + +/** + * Mesh Merging Tool + */ +class FPolishBuildingsTool : public IPolishBuildingsTool +{ + friend class SPolishBuildingsDialog; + +public: + + FPolishBuildingsTool(); + + // IPolishBuildingsTool interface + virtual TSharedRef GetWidget() override; + virtual FName GetIconName() const override { return "PolishBuildings.PolishBuildingsTool"; } + virtual FText GetTooltipText() const override; + virtual FString GetDefaultPackageName() const override; + virtual bool RunMerge(const FString& PackageName) override; + +private: + + /** Current mesh merging settings */ + FMeshMergingSettings MergingSettings; + + /** Whether to replace source actors with a merged actor in the world */ + bool bReplaceSourceActors; + + bool bExportSpecificLOD; + int32 ExportLODIndex; +}; diff --git a/Plugins/PolishBuildings/Source/Private/PolishBuildingsTool/SPolishBuildingsDialog.cpp b/Plugins/PolishBuildings/Source/Private/PolishBuildingsTool/SPolishBuildingsDialog.cpp new file mode 100644 index 0000000..d4316fb --- /dev/null +++ b/Plugins/PolishBuildings/Source/Private/PolishBuildingsTool/SPolishBuildingsDialog.cpp @@ -0,0 +1,520 @@ +// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved. + +#include "PolishBuildingsPrivatePCH.h" +#include "SPolishBuildingsDialog.h" +#include "Dialogs/DlgPickAssetPath.h" +#include "STextComboBox.h" +#include "RawMesh.h" +#include "PolishBuildingsTool/PolishBuildingsTool.h" + +#define LOCTEXT_NAMESPACE "SPolishBuildingsDialog" + +////////////////////////////////////////////////////////////////////////// +// SPolishBuildingsDialog + +SPolishBuildingsDialog::SPolishBuildingsDialog() +{ +} + +BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION +void SPolishBuildingsDialog::Construct(const FArguments& InArgs, FPolishBuildingsTool* InTool) +{ + Tool = InTool; + check(Tool != nullptr); + + // Setup available resolutions for lightmap and merged materials + const int32 MinTexResolution = 1 << FTextureLODGroup().MinLODMipCount; + const int32 MaxTexResolution = 1 << FTextureLODGroup().MaxLODMipCount; + for (int32 TexRes = MinTexResolution; TexRes <= MaxTexResolution; TexRes*=2) + { + LightMapResolutionOptions.Add(MakeShareable(new FString(TTypeToString::ToString(TexRes)))); + MergedMaterialResolutionOptions.Add(MakeShareable(new FString(TTypeToString::ToString(TexRes)))); + } + + Tool->MergingSettings.TargetLightMapResolution = FMath::Clamp(Tool->MergingSettings.TargetLightMapResolution, MinTexResolution, MaxTexResolution); + Tool->MergingSettings.MaterialSettings.TextureSize.X = FMath::Clamp( Tool->MergingSettings.MaterialSettings.TextureSize.X, MinTexResolution, MaxTexResolution ); + Tool->MergingSettings.MaterialSettings.TextureSize.Y = FMath::Clamp( Tool->MergingSettings.MaterialSettings.TextureSize.Y, MinTexResolution, MaxTexResolution ); + + // Setup available UV channels for an atlased lightmap + for (int32 Index = 0; Index < MAX_MESH_TEXTURE_COORDS; Index++) + { + LightMapChannelOptions.Add(MakeShareable(new FString(TTypeToString::ToString(Index)))); + } + + for (int32 Index = 0; Index < MAX_STATIC_MESH_LODS; Index++) + { + ExportLODOptions.Add(MakeShareable(new FString(TTypeToString::ToString(Index)))); + } + + // Create widget layout + this->ChildSlot + [ + SNew(SVerticalBox) + + +SVerticalBox::Slot() + .AutoHeight() + .Padding(0,2,0,0) + [ + // Lightmap settings + SNew(SBorder) + .BorderImage(FEditorStyle::GetBrush("ToolPanel.GroupBorder")) + [ + SNew(SVerticalBox) + + // Enable atlasing + +SVerticalBox::Slot() + .AutoHeight() + .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) + [ + SNew(SCheckBox) + .Type(ESlateCheckBoxType::CheckBox) + .IsChecked(this, &SPolishBuildingsDialog::GetGenerateLightmapUV) + .OnCheckStateChanged(this, &SPolishBuildingsDialog::SetGenerateLightmapUV) + .Content() + [ + SNew(STextBlock) + .Text(LOCTEXT("AtlasLightmapUVLabel", "Generate Lightmap UVs")) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + ] + ] + + // Target lightmap channel / Max lightmap resolution + +SVerticalBox::Slot() + .AutoHeight() + .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) + [ + SNew(SHorizontalBox) + + +SHorizontalBox::Slot() + .AutoWidth() + .VAlign(VAlign_Center) + [ + SNew(STextBlock) + .IsEnabled(this, &SPolishBuildingsDialog::IsLightmapChannelEnabled) + .Text(LOCTEXT("TargetLightMapChannelLabel", "Target Channel:")) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + ] + + +SHorizontalBox::Slot() + .AutoWidth() + .VAlign(VAlign_Center) + .Padding(4,0,4,0) + [ + SNew(STextComboBox) + .IsEnabled( this, &SPolishBuildingsDialog::IsLightmapChannelEnabled ) + .OptionsSource(&LightMapChannelOptions) + .InitiallySelectedItem(LightMapChannelOptions[Tool->MergingSettings.TargetLightMapUVChannel]) + .OnSelectionChanged(this, &SPolishBuildingsDialog::SetTargetLightMapChannel) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + ] + + +SHorizontalBox::Slot() + .AutoWidth() + .VAlign(VAlign_Center) + [ + SNew(STextBlock) + .IsEnabled(this, &SPolishBuildingsDialog::IsLightmapChannelEnabled) + .Text(LOCTEXT("TargetLightMapResolutionLabel", "Target Resolution:")) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + ] + + +SHorizontalBox::Slot() + .AutoWidth() + .VAlign(VAlign_Center) + .Padding(4,0,4,0) + [ + SNew(STextComboBox) + .IsEnabled( this, &SPolishBuildingsDialog::IsLightmapChannelEnabled ) + .OptionsSource(&LightMapResolutionOptions) + .InitiallySelectedItem(LightMapResolutionOptions[FMath::FloorLog2(Tool->MergingSettings.TargetLightMapResolution)]) + .OnSelectionChanged(this, &SPolishBuildingsDialog::SetTargetLightMapResolution) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + ] + ] + ] + ] + + // Other merging settings + +SVerticalBox::Slot() + .AutoHeight() + .Padding(0,2,0,0) + [ + SNew(SBorder) + .BorderImage(FEditorStyle::GetBrush("ToolPanel.GroupBorder")) + [ + SNew(SVerticalBox) + + // LOD to export + +SVerticalBox::Slot() + .AutoHeight() + .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) + [ + SNew(SHorizontalBox) + + +SHorizontalBox::Slot() + .AutoWidth() + .VAlign(VAlign_Center) + [ + SNew(SCheckBox) + .Type(ESlateCheckBoxType::CheckBox) + .IsChecked(this, &SPolishBuildingsDialog::GetExportSpecificLODEnabled) + .OnCheckStateChanged(this, &SPolishBuildingsDialog::SetExportSpecificLODEnabled) + .Content() + [ + SNew(STextBlock) + .IsEnabled(this, &SPolishBuildingsDialog::IsExportSpecificLODEnabled) + .Text(LOCTEXT("TargetMeshLODIndexLabel", "Export specific LOD:")) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + ] + ] + + +SHorizontalBox::Slot() + .AutoWidth() + .VAlign(VAlign_Center) + .Padding(4,0,4,0) + [ + SNew(STextComboBox) + .IsEnabled(this, &SPolishBuildingsDialog::IsExportSpecificLODEnabled) + .OptionsSource(&ExportLODOptions) + .InitiallySelectedItem(ExportLODOptions[Tool->ExportLODIndex]) + .OnSelectionChanged(this, &SPolishBuildingsDialog::SetExportSpecificLODIndex) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + ] + ] + + // Vertex colors + +SVerticalBox::Slot() + .AutoHeight() + .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) + [ + SNew(SCheckBox) + .Type(ESlateCheckBoxType::CheckBox) + .IsChecked(this, &SPolishBuildingsDialog::GetImportVertexColors) + .OnCheckStateChanged(this, &SPolishBuildingsDialog::SetImportVertexColors) + .Content() + [ + SNew(STextBlock) + .Text(LOCTEXT("ImportVertexColorsLabel", "Import Vertex Colors")) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + ] + ] + + // Pivot at zero + +SVerticalBox::Slot() + .AutoHeight() + .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) + [ + SNew(SCheckBox) + .Type(ESlateCheckBoxType::CheckBox) + .IsChecked(this, &SPolishBuildingsDialog::GetPivotPointAtZero) + .OnCheckStateChanged(this, &SPolishBuildingsDialog::SetPivotPointAtZero) + .Content() + [ + SNew(STextBlock) + .Text(LOCTEXT("PivotPointAtZeroLabel", "Pivot Point At (0,0,0)")) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + ] + ] + + // Replace source actors + +SVerticalBox::Slot() + .AutoHeight() + .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) + [ + SNew(SCheckBox) + .Type(ESlateCheckBoxType::CheckBox) + .IsChecked(this, &SPolishBuildingsDialog::GetReplaceSourceActors) + .OnCheckStateChanged(this, &SPolishBuildingsDialog::SetReplaceSourceActors) + .Content() + [ + SNew(STextBlock) + .Text(LOCTEXT("ReplaceSourceActorsLabel", "Replace Source Actors")) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + ] + ] + + // Merge physics data + +SVerticalBox::Slot() + .AutoHeight() + .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) + [ + SNew(SCheckBox) + .Type(ESlateCheckBoxType::CheckBox) + .IsChecked(this, &SPolishBuildingsDialog::GetMergePhyisicData) + .OnCheckStateChanged(this, &SPolishBuildingsDialog::SetMergePhyisicData) + .Content() + [ + SNew(STextBlock) + .Text(LOCTEXT("MergePhysicsDataLabel", "Merge Physics Data")) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + ] + ] + + // Merge materials + +SVerticalBox::Slot() + .AutoHeight() + .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) + [ + SNew(SCheckBox) + .Type(ESlateCheckBoxType::CheckBox) + .IsChecked(this, &SPolishBuildingsDialog::GetMergeMaterials) + .OnCheckStateChanged(this, &SPolishBuildingsDialog::SetMergeMaterials) + .Content() + [ + SNew(STextBlock) + .Text(LOCTEXT("MergeMaterialsLabel", "Merge Materials")) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + ] + ] + // Export normal map + +SVerticalBox::Slot() + .AutoHeight() + .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) + [ + SNew(SCheckBox) + .Type(ESlateCheckBoxType::CheckBox) + .IsChecked(this, &SPolishBuildingsDialog::GetExportNormalMap) + .OnCheckStateChanged(this, &SPolishBuildingsDialog::SetExportNormalMap) + .IsEnabled(this, &SPolishBuildingsDialog::IsMaterialMergingEnabled) + .Content() + [ + SNew(STextBlock) + .Text(LOCTEXT("ExportNormalMapLabel", "Export Normal Map")) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + ] + ] + // Export metallic map + +SVerticalBox::Slot() + .AutoHeight() + .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) + [ + SNew(SCheckBox) + .Type(ESlateCheckBoxType::CheckBox) + .IsChecked(this, &SPolishBuildingsDialog::GetExportMetallicMap) + .OnCheckStateChanged(this, &SPolishBuildingsDialog::SetExportMetallicMap) + .IsEnabled(this, &SPolishBuildingsDialog::IsMaterialMergingEnabled) + .Content() + [ + SNew(STextBlock) + .Text(LOCTEXT("ExportMetallicMapLabel", "Export Metallic Map")) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + ] + ] + // Export roughness map + +SVerticalBox::Slot() + .AutoHeight() + .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) + [ + SNew(SCheckBox) + .Type(ESlateCheckBoxType::CheckBox) + .IsChecked(this, &SPolishBuildingsDialog::GetExportRoughnessMap) + .OnCheckStateChanged(this, &SPolishBuildingsDialog::SetExportRoughnessMap) + .IsEnabled(this, &SPolishBuildingsDialog::IsMaterialMergingEnabled) + .Content() + [ + SNew(STextBlock) + .Text(LOCTEXT("ExportRoughnessMapLabel", "Export Roughness Map")) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + ] + ] + // Export specular map + +SVerticalBox::Slot() + .AutoHeight() + .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) + [ + SNew(SCheckBox) + .Type(ESlateCheckBoxType::CheckBox) + .IsChecked(this, &SPolishBuildingsDialog::GetExportSpecularMap) + .OnCheckStateChanged(this, &SPolishBuildingsDialog::SetExportSpecularMap) + .IsEnabled(this, &SPolishBuildingsDialog::IsMaterialMergingEnabled) + .Content() + [ + SNew(STextBlock) + .Text(LOCTEXT("ExportSpecularMapLabel", "Export Specular Map")) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + ] + ] + + // Merged texture size + +SVerticalBox::Slot() + .AutoHeight() + .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) + [ + SNew(SHorizontalBox) + +SHorizontalBox::Slot() + .AutoWidth() + .VAlign(VAlign_Center) + [ + SNew(STextBlock) + .IsEnabled(this, &SPolishBuildingsDialog::IsMaterialMergingEnabled) + .Text(LOCTEXT("MergedMaterialAtlasResolutionLabel", "Merged Material Atlas Resolution:")) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + ] + + +SHorizontalBox::Slot() + .AutoWidth() + .VAlign(VAlign_Center) + .Padding(4,0,4,0) + [ + SNew(STextComboBox) + .IsEnabled(this, &SPolishBuildingsDialog::IsMaterialMergingEnabled) + .OptionsSource(&MergedMaterialResolutionOptions) + .InitiallySelectedItem( MergedMaterialResolutionOptions[FMath::FloorLog2( Tool->MergingSettings.MaterialSettings.TextureSize.X )] ) + .OnSelectionChanged(this, &SPolishBuildingsDialog::SetMergedMaterialAtlasResolution) + .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) + ] + ] + ] + ] + ]; +} +END_SLATE_FUNCTION_BUILD_OPTIMIZATION + +ECheckBoxState SPolishBuildingsDialog::GetGenerateLightmapUV() const +{ + return (Tool->MergingSettings.bGenerateLightMapUV ? ECheckBoxState::Checked : ECheckBoxState::Unchecked); +} + +void SPolishBuildingsDialog::SetGenerateLightmapUV(ECheckBoxState NewValue) +{ + Tool->MergingSettings.bGenerateLightMapUV = (ECheckBoxState::Checked == NewValue); +} + +bool SPolishBuildingsDialog::IsLightmapChannelEnabled() const +{ + return Tool->MergingSettings.bGenerateLightMapUV; +} + +void SPolishBuildingsDialog::SetTargetLightMapChannel(TSharedPtr NewSelection, ESelectInfo::Type SelectInfo) +{ + TTypeFromString::FromString(Tool->MergingSettings.TargetLightMapUVChannel, **NewSelection); +} + +void SPolishBuildingsDialog::SetTargetLightMapResolution(TSharedPtr NewSelection, ESelectInfo::Type SelectInfo) +{ + TTypeFromString::FromString(Tool->MergingSettings.TargetLightMapResolution, **NewSelection); +} + +ECheckBoxState SPolishBuildingsDialog::GetExportSpecificLODEnabled() const +{ + return (Tool->bExportSpecificLOD ? ECheckBoxState::Checked : ECheckBoxState::Unchecked); +} + +void SPolishBuildingsDialog::SetExportSpecificLODEnabled(ECheckBoxState NewValue) +{ + Tool->bExportSpecificLOD = (NewValue == ECheckBoxState::Checked); +} + +bool SPolishBuildingsDialog::IsExportSpecificLODEnabled() const +{ + return Tool->bExportSpecificLOD; +} + +void SPolishBuildingsDialog::SetExportSpecificLODIndex(TSharedPtr NewSelection, ESelectInfo::Type SelectInfo) +{ + TTypeFromString::FromString(Tool->ExportLODIndex, **NewSelection); +} + +ECheckBoxState SPolishBuildingsDialog::GetImportVertexColors() const +{ + return ( Tool->MergingSettings.bBakeVertexData ? ECheckBoxState::Checked : ECheckBoxState::Unchecked ); +} + +void SPolishBuildingsDialog::SetImportVertexColors(ECheckBoxState NewValue) +{ + Tool->MergingSettings.bBakeVertexData = ( ECheckBoxState::Checked == NewValue ); +} + +ECheckBoxState SPolishBuildingsDialog::GetPivotPointAtZero() const +{ + return (Tool->MergingSettings.bPivotPointAtZero ? ECheckBoxState::Checked : ECheckBoxState::Unchecked); +} + +void SPolishBuildingsDialog::SetPivotPointAtZero(ECheckBoxState NewValue) +{ + Tool->MergingSettings.bPivotPointAtZero = (ECheckBoxState::Checked == NewValue); +} + +ECheckBoxState SPolishBuildingsDialog::GetReplaceSourceActors() const +{ + return (Tool->bReplaceSourceActors ? ECheckBoxState::Checked : ECheckBoxState::Unchecked); +} + +void SPolishBuildingsDialog::SetReplaceSourceActors(ECheckBoxState NewValue) +{ + Tool->bReplaceSourceActors = (ECheckBoxState::Checked == NewValue); +} + +ECheckBoxState SPolishBuildingsDialog::GetMergePhyisicData() const +{ + return (Tool->MergingSettings.bMergePhysicsData ? ECheckBoxState::Checked : ECheckBoxState::Unchecked); +} + +void SPolishBuildingsDialog::SetMergePhyisicData(ECheckBoxState NewValue) +{ + Tool->MergingSettings.bMergePhysicsData = (ECheckBoxState::Checked == NewValue); +} + +bool SPolishBuildingsDialog::IsMaterialMergingEnabled() const +{ + return Tool->MergingSettings.bMergeMaterials; +} + +ECheckBoxState SPolishBuildingsDialog::GetMergeMaterials() const +{ + return (Tool->MergingSettings.bMergeMaterials ? ECheckBoxState::Checked : ECheckBoxState::Unchecked); +} + +void SPolishBuildingsDialog::SetMergeMaterials(ECheckBoxState NewValue) +{ + Tool->MergingSettings.bMergeMaterials = (ECheckBoxState::Checked == NewValue); +} + +ECheckBoxState SPolishBuildingsDialog::GetExportNormalMap() const +{ + return ( Tool->MergingSettings.MaterialSettings.bNormalMap ? ECheckBoxState::Checked : ECheckBoxState::Unchecked ); +} + +void SPolishBuildingsDialog::SetExportNormalMap(ECheckBoxState NewValue) +{ + Tool->MergingSettings.MaterialSettings.bNormalMap = ( ECheckBoxState::Checked == NewValue ); +} + +ECheckBoxState SPolishBuildingsDialog::GetExportMetallicMap() const +{ + return ( Tool->MergingSettings.MaterialSettings.bMetallicMap ? ECheckBoxState::Checked : ECheckBoxState::Unchecked ); +} + +void SPolishBuildingsDialog::SetExportMetallicMap(ECheckBoxState NewValue) +{ + Tool->MergingSettings.MaterialSettings.bMetallicMap = ( ECheckBoxState::Checked == NewValue ); +} + +ECheckBoxState SPolishBuildingsDialog::GetExportRoughnessMap() const +{ + return ( Tool->MergingSettings.MaterialSettings.bRoughnessMap ? ECheckBoxState::Checked : ECheckBoxState::Unchecked ); +} + +void SPolishBuildingsDialog::SetExportRoughnessMap(ECheckBoxState NewValue) +{ + Tool->MergingSettings.MaterialSettings.bRoughnessMap = ( ECheckBoxState::Checked == NewValue ); +} + +ECheckBoxState SPolishBuildingsDialog::GetExportSpecularMap() const +{ + return ( Tool->MergingSettings.MaterialSettings.bSpecularMap ? ECheckBoxState::Checked : ECheckBoxState::Unchecked ); +} + +void SPolishBuildingsDialog::SetExportSpecularMap(ECheckBoxState NewValue) +{ + Tool->MergingSettings.MaterialSettings.bSpecularMap = ( ECheckBoxState::Checked == NewValue ); +} + +void SPolishBuildingsDialog::SetMergedMaterialAtlasResolution(TSharedPtr NewSelection, ESelectInfo::Type SelectInfo) +{ + TTypeFromString::FromString( Tool->MergingSettings.MaterialSettings.TextureSize.X, **NewSelection ); + TTypeFromString::FromString( Tool->MergingSettings.MaterialSettings.TextureSize.Y, **NewSelection ); +} + + +#undef LOCTEXT_NAMESPACE diff --git a/Plugins/PolishBuildings/Source/Private/PolishBuildingsTool/SPolishBuildingsDialog.h b/Plugins/PolishBuildings/Source/Private/PolishBuildingsTool/SPolishBuildingsDialog.h new file mode 100644 index 0000000..0b397c2 --- /dev/null +++ b/Plugins/PolishBuildings/Source/Private/PolishBuildingsTool/SPolishBuildingsDialog.h @@ -0,0 +1,86 @@ +// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved. +#pragma once + +class FPolishBuildingsTool; + +/*----------------------------------------------------------------------------- + SPolishBuildingsDialog +-----------------------------------------------------------------------------*/ +class SPolishBuildingsDialog : public SCompoundWidget +{ +public: + SLATE_BEGIN_ARGS(SPolishBuildingsDialog) + { + } + + SLATE_END_ARGS() + +public: + /** **/ + SPolishBuildingsDialog(); + + /** SWidget functions */ + void Construct(const FArguments& InArgs, FPolishBuildingsTool* InTool); + +private: + + /** Called when the Merge button is clicked */ + FReply OnMergeClicked(); + + /** */ + ECheckBoxState GetGenerateLightmapUV() const; + void SetGenerateLightmapUV(ECheckBoxState NewValue); + + /** Target lightmap channel */ + bool IsLightmapChannelEnabled() const; + void SetTargetLightMapChannel(TSharedPtr NewSelection, ESelectInfo::Type SelectInfo); + void SetTargetLightMapResolution(TSharedPtr NewSelection, ESelectInfo::Type SelectInfo); + + /** */ + ECheckBoxState GetExportSpecificLODEnabled() const; + void SetExportSpecificLODEnabled(ECheckBoxState NewValue); + bool IsExportSpecificLODEnabled() const; + void SetExportSpecificLODIndex(TSharedPtr NewSelection, ESelectInfo::Type SelectInfo); + + /** */ + ECheckBoxState GetImportVertexColors() const; + void SetImportVertexColors(ECheckBoxState NewValue); + + /** */ + ECheckBoxState GetPivotPointAtZero() const; + void SetPivotPointAtZero(ECheckBoxState NewValue); + + ECheckBoxState GetReplaceSourceActors() const; + void SetReplaceSourceActors(ECheckBoxState NewValue); + + ECheckBoxState GetMergePhyisicData() const; + void SetMergePhyisicData(ECheckBoxState NewValue); + + /** Material merging */ + bool IsMaterialMergingEnabled() const; + ECheckBoxState GetMergeMaterials() const; + void SetMergeMaterials(ECheckBoxState NewValue); + + ECheckBoxState GetExportNormalMap() const; + void SetExportNormalMap(ECheckBoxState NewValue); + + ECheckBoxState GetExportMetallicMap() const; + void SetExportMetallicMap(ECheckBoxState NewValue); + + ECheckBoxState GetExportRoughnessMap() const; + void SetExportRoughnessMap(ECheckBoxState NewValue); + + ECheckBoxState GetExportSpecularMap() const; + void SetExportSpecularMap(ECheckBoxState NewValue); + + void SetMergedMaterialAtlasResolution(TSharedPtr NewSelection, ESelectInfo::Type SelectInfo); + +private: + + FPolishBuildingsTool* Tool; + + TArray> ExportLODOptions; + TArray> LightMapResolutionOptions; + TArray> LightMapChannelOptions; + TArray> MergedMaterialResolutionOptions; +}; diff --git a/Plugins/PolishBuildings/Source/Private/SPolishBuildingsToolbar.cpp b/Plugins/PolishBuildings/Source/Private/SPolishBuildingsToolbar.cpp new file mode 100644 index 0000000..9ad91a5 --- /dev/null +++ b/Plugins/PolishBuildings/Source/Private/SPolishBuildingsToolbar.cpp @@ -0,0 +1,219 @@ +// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved. + +#include "PolishBuildingsPrivatePCH.h" +#include "SPolishBuildingsToolbar.h" +#include "LevelEditor.h" +#include "IDocumentation.h" +#include "ContentBrowserModule.h" + +#define LOCTEXT_NAMESPACE "SPolishBuildingsToolbar" + + +////////////////////////////////////////////////////////////// + +void SPolishBuildingsToolbar::Construct(const FArguments& InArgs) +{ + // Important: We use raw bindings here because we are releasing our binding in our destructor (where a weak pointer would be invalid) + // It's imperative that our delegate is removed in the destructor for the level editor module to play nicely with reloading. + + FLevelEditorModule& LevelEditor = FModuleManager::GetModuleChecked("LevelEditor"); + LevelEditor.OnActorSelectionChanged().AddRaw(this, &SPolishBuildingsToolbar::OnActorSelectionChanged); + + RegisteredTools = InArgs._ToolsToRegister; + + ChildSlot + [ + SNew(SVerticalBox) + + + SVerticalBox::Slot() + .AutoHeight() + .HAlign(HAlign_Left) + .Padding(0, 0, 0, 0) + [ + SAssignNew(ToolbarContainer, SBorder) + .BorderImage(FEditorStyle::GetBrush("NoBorder")) + .Padding(FMargin(4, 0, 0, 0)) + ] + + + SVerticalBox::Slot() + .FillHeight(1.0f) + .Padding(2, 0, 0, 0) + [ + SNew(SBorder) + .BorderImage(FEditorStyle::GetBrush("ToolPanel.GroupBorder")) + .Padding(0.f) + .IsEnabled(this, &SPolishBuildingsToolbar::GetContentEnabledState) + [ + SNew(SVerticalBox) + + + SVerticalBox::Slot() + .FillHeight(1.0f) + .Padding(4, 4, 4, 4) + [ + SNew(SScrollBox) + +SScrollBox::Slot() + [ + SAssignNew(InlineContentHolder, SBox) + ] + ] + + + SVerticalBox::Slot() + .AutoHeight() + .HAlign(HAlign_Right) + .Padding(4, 4, 10, 4) + [ + SNew(SButton) + .Text(LOCTEXT("PolishBuildings", "Merge Actors")) + .OnClicked(this, &SPolishBuildingsToolbar::OnPolishBuildingsClicked) + ] + ] + ] + ]; + + UpdateToolbar(); + + // Update selected actor state for the first time + GUnrealEd->UpdateFloatingPropertyWindows(); +} + + +SPolishBuildingsToolbar::~SPolishBuildingsToolbar() +{ + FLevelEditorModule& LevelEditor = FModuleManager::GetModuleChecked("LevelEditor"); + LevelEditor.OnActorSelectionChanged().RemoveAll(this); +} + + +void SPolishBuildingsToolbar::OnActorSelectionChanged(const TArray& NewSelection, bool bForceRefresh) +{ + SelectedObjects = NewSelection; + bIsContentEnabled = (NewSelection.Num() > 0); +} + + +void SPolishBuildingsToolbar::OnToolSelectionChanged(const ECheckBoxState NewCheckedState, int32 ToolIndex) +{ + if (NewCheckedState == ECheckBoxState::Checked) + { + CurrentlySelectedTool = ToolIndex; + UpdateInlineContent(); + } +} + + +ECheckBoxState SPolishBuildingsToolbar::OnIsToolSelected(int32 ToolIndex) const +{ + return (CurrentlySelectedTool == ToolIndex) ? ECheckBoxState::Checked : ECheckBoxState::Unchecked; +} + + +FReply SPolishBuildingsToolbar::OnPolishBuildingsClicked() +{ + if (CurrentlySelectedTool >= 0 && CurrentlySelectedTool < RegisteredTools.Num()) + { + const FString DefaultPackageName = RegisteredTools[CurrentlySelectedTool]->GetDefaultPackageName(); + const FString DefaultPath = FPackageName::GetLongPackagePath(DefaultPackageName); + const FString DefaultName = FPackageName::GetShortName(DefaultPackageName); + + // Initialize SaveAssetDialog config + FSaveAssetDialogConfig SaveAssetDialogConfig; + SaveAssetDialogConfig.DialogTitleOverride = LOCTEXT("CreateMergedActorTitle", "Create Merged Actor"); + SaveAssetDialogConfig.DefaultPath = DefaultPath; + SaveAssetDialogConfig.DefaultAssetName = DefaultName; + SaveAssetDialogConfig.ExistingAssetPolicy = ESaveAssetDialogExistingAssetPolicy::AllowButWarn; + + FContentBrowserModule& ContentBrowserModule = FModuleManager::LoadModuleChecked("ContentBrowser"); + FString SaveObjectPath = ContentBrowserModule.Get().CreateModalSaveAssetDialog(SaveAssetDialogConfig); + if (!SaveObjectPath.IsEmpty()) + { + const FString PackageName = FPackageName::ObjectPathToPackageName(SaveObjectPath); + + RegisteredTools[CurrentlySelectedTool]->RunMerge(PackageName); + } + } + + return FReply::Handled(); +} + + +bool SPolishBuildingsToolbar::GetContentEnabledState() const +{ + return bIsContentEnabled; +} + + +void SPolishBuildingsToolbar::AddTool(IPolishBuildingsTool* Tool) +{ + check(!RegisteredTools.Contains(Tool)); + RegisteredTools.Add(Tool); + UpdateToolbar(); +} + + +void SPolishBuildingsToolbar::RemoveTool(IPolishBuildingsTool* Tool) +{ + int32 IndexToRemove = RegisteredTools.Find(Tool); + if (IndexToRemove != INDEX_NONE) + { + RegisteredTools.RemoveAt(IndexToRemove); + + if (CurrentlySelectedTool > IndexToRemove) + { + CurrentlySelectedTool--; + } + UpdateToolbar(); + } +} + + +void SPolishBuildingsToolbar::UpdateToolbar() +{ + const ISlateStyle& StyleSet = FEditorStyle::Get(); + + TSharedRef HorizontalBox = + SNew(SHorizontalBox); + + for (int32 ToolIndex = 0; ToolIndex < RegisteredTools.Num(); ToolIndex++) + { + const IPolishBuildingsTool* Tool = RegisteredTools[ToolIndex]; + + HorizontalBox->AddSlot() + .Padding(StyleSet.GetMargin("EditorModesToolbar.SToolBarButtonBlock.Padding")) + [ + SNew(SCheckBox) + .Style(&StyleSet, "EditorModesToolbar.ToggleButton") + .OnCheckStateChanged(this, &SPolishBuildingsToolbar::OnToolSelectionChanged, ToolIndex) + .IsChecked(this, &SPolishBuildingsToolbar::OnIsToolSelected, ToolIndex) + .Padding(StyleSet.GetMargin("EditorModesToolbar.SToolBarButtonBlock.CheckBox.Padding")) + .ToolTip(IDocumentation::Get()->CreateToolTip(Tool->GetTooltipText(), nullptr, FString(), FString())) + [ + SNew(SImage) + .Image(StyleSet.GetBrush(Tool->GetIconName())) + ] + ]; + } + + TSharedRef ToolbarContent = + SNew(SBorder) + .Padding(0) + .BorderImage(StyleSet.GetBrush("NoBorder")) + [ + HorizontalBox + ]; + + ToolbarContainer->SetContent(ToolbarContent); + + UpdateInlineContent(); +} + + +void SPolishBuildingsToolbar::UpdateInlineContent() +{ + if (CurrentlySelectedTool >= 0 && CurrentlySelectedTool < RegisteredTools.Num()) + { + InlineContentHolder->SetContent(RegisteredTools[CurrentlySelectedTool]->GetWidget()); + } +} + + +#undef LOCTEXT_NAMESPACE diff --git a/Plugins/PolishBuildings/Source/Private/SPolishBuildingsToolbar.h b/Plugins/PolishBuildings/Source/Private/SPolishBuildingsToolbar.h new file mode 100644 index 0000000..18d5f3b --- /dev/null +++ b/Plugins/PolishBuildings/Source/Private/SPolishBuildingsToolbar.h @@ -0,0 +1,83 @@ +// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved. + +#pragma once + +class IPolishBuildingsTool; + +////////////////////////////////////////////////////////////////////////// +// SPolishBuildingsToolbar + +class SPolishBuildingsToolbar : public SCompoundWidget +{ +public: + + SLATE_BEGIN_ARGS(SPolishBuildingsToolbar) {} + SLATE_ARGUMENT(TArray, ToolsToRegister) + SLATE_END_ARGS() + + /** + * Construct the widget + * + * @param InArgs A declaration from which to construct the widget + */ + void Construct(const FArguments& InArgs); + + /** Constructor */ + SPolishBuildingsToolbar() + : CurrentlySelectedTool(0) + {} + + /** Destructor */ + virtual ~SPolishBuildingsToolbar(); + + /** Add a new tool to the toolbar */ + void AddTool(IPolishBuildingsTool* Tool); + + /** Remove an existing tool from the toolbar */ + void RemoveTool(IPolishBuildingsTool* Tool); + + +private: + + /** Called when the level actor selection changes */ + void OnActorSelectionChanged(const TArray& NewSelection, bool bForceRefresh); + + /** Called when the currently selected tool changes */ + void OnToolSelectionChanged(const ECheckBoxState NewCheckedState, int32 ToolIndex); + + /** Called to determine whether a toolbox widget is selected or not */ + ECheckBoxState OnIsToolSelected(int32 ToolIndex) const; + + /** Called when the Merge Actors button is clicked */ + FReply OnPolishBuildingsClicked(); + + /** Determine whether the widget content is enabled or not */ + bool GetContentEnabledState() const; + + /** Update the toolbar container based on the currently registered tools */ + void UpdateToolbar(); + + /** Updates the inline content widget for the current tool */ + void UpdateInlineContent(); + + +private: + + /** List of registered tool instances */ + TArray RegisteredTools; + + /** Index of currently selected tool */ + int32 CurrentlySelectedTool; + + /** List of currently selected objects */ + TArray SelectedObjects; + + /** Whether the merge actors tool panel is enabled or not */ + bool bIsContentEnabled; + + /** The container holding the toolbar */ + TSharedPtr ToolbarContainer; + + /** Inline content area for different tool modes */ + TSharedPtr InlineContentHolder; +}; diff --git a/Plugins/PolishBuildings/Source/Public/IPolishBuildingsModule.h b/Plugins/PolishBuildings/Source/Public/IPolishBuildingsModule.h new file mode 100644 index 0000000..b8cc32d --- /dev/null +++ b/Plugins/PolishBuildings/Source/Public/IPolishBuildingsModule.h @@ -0,0 +1,33 @@ +// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved. +#pragma once + +#include "ModuleManager.h" +#include "IPolishBuildingsTool.h" + + +/** + * Merge Actors module interface + */ +class IPolishBuildingsModule : public IModuleInterface +{ + +public: + + /** + * Get reference to the Merge Actors module instance + */ + static inline IPolishBuildingsModule& Get() + { + return FModuleManager::LoadModuleChecked("PolishBuildings"); + } + + /** + * Register an IPolishBuildingsTool with the module, passing ownership to it + */ + virtual bool RegisterPolishBuildingsTool(TUniquePtr Tool) = 0; + + /** + * Unregister an IPolishBuildingsTool with the module + */ + virtual bool UnregisterPolishBuildingsTool(IPolishBuildingsTool* Tool) = 0; +}; diff --git a/Plugins/PolishBuildings/Source/Public/IPolishBuildingsTool.h b/Plugins/PolishBuildings/Source/Public/IPolishBuildingsTool.h new file mode 100644 index 0000000..8434fcc --- /dev/null +++ b/Plugins/PolishBuildings/Source/Public/IPolishBuildingsTool.h @@ -0,0 +1,43 @@ +// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved. +#pragma once + +/** +* Merge Actors tool interface +*/ +class IPolishBuildingsTool +{ + +public: + + /** Virtual destructor */ + virtual ~IPolishBuildingsTool() {} + + /** + * Gets the widget instance associated with this tool + */ + virtual TSharedRef GetWidget() = 0; + + /** + * Get the name of the icon displayed in the Merge Actors toolbar + */ + virtual FName GetIconName() const = 0; + + /** + * Get Tooltip text displayed in the Merge Actors toolbar + */ + virtual FText GetTooltipText() const = 0; + + /** + * Get default name for the merged asset package + */ + virtual FString GetDefaultPackageName() const = 0; + + /** + * Perform merge operation + * + * @param PackageName Long package name of the asset to create + * @return true if the merge succeeded + */ + virtual bool RunMerge(const FString& PackageName) = 0; + +}; diff --git a/Plugins/SkillTree/Resources/Icon128.png b/Plugins/SkillTree/Resources/Icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..46699950888b7948815effcc7198d6ed2319dc42 GIT binary patch literal 5261 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 literal 0 HcmV?d00001 diff --git a/Plugins/SkillTree/SkillTree.uplugin b/Plugins/SkillTree/SkillTree.uplugin new file mode 100644 index 0000000..7a96103 --- /dev/null +++ b/Plugins/SkillTree/SkillTree.uplugin @@ -0,0 +1,28 @@ +{ + "FileVersion": 3, + "Version": 1, + "VersionName": "1.0", + "FriendlyName": "Skill Tree Plugin", + "Description": "A plugin to design the skill tree.", + "Category": "2D", + "CreatedBy": "Yoshi van Belkom", + "CreatedByURL": "http://www.farsquad.com/", + "DocsURL": "http://iamfromtheinternet.nl/wiki/index.php/Programming_Documentation", + "MarketplaceURL": "", + "SupportURL": "http://iamfromtheinternet.nl/wiki/index.php/Programming_Documentation", + "Modules": [ + { + "Name": "SkillTree", + "Type": "Runtime", + "LoadingPhase": "PreDefault" + }, + { + "Name": "SkillTreeEditor", + "Type": "Editor" + } + ], + "EnabledByDefault": false, + "CanContainContent": true, + "IsBetaVersion": false, + "Installed": false +} \ No newline at end of file diff --git a/Plugins/SkillTree/Source/SkillTree/Classes/DynamicHexMap.h b/Plugins/SkillTree/Source/SkillTree/Classes/DynamicHexMap.h new file mode 100644 index 0000000..f6a3af1 --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTree/Classes/DynamicHexMap.h @@ -0,0 +1,42 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// +// A Hexagon Map with variable width and height. +////////////////////////////////////////// + +#pragma once + +#include "Engine/EngineTypes.h" +#include "HexMap.h" +#include "DynamicHexMap.generated.h" + +USTRUCT() +struct FDynamicHexMap : public FHexMap +{ + GENERATED_BODY() +protected: + //Returns true if x and y are valid positions on the hex map. + virtual bool IsPointValid( int32 a_x, int32 a_y ) override + { + bool result = !( a_x < 0 || a_x >= width || a_y < 0 || a_y >= height ); + if ( result && IsOdd( a_x ) ) + result = ( a_y < ( 15 ) ); + return result; + } +public: + UPROPERTY( Category = Skill, EditAnywhere, meta = ( ClampMin = "1", ClampMax = "13", UIMin = "1", UIMax = "13" ) ) + int32 width = 13; + UPROPERTY( Category = Skill, EditAnywhere, meta = ( ClampMin = "2", ClampMax = "16", UIMin = "2", UIMax = "16" ) ) + int32 height = 16; + + FDynamicHexMap() + {} + + FDynamicHexMap( FDynamicHexMap& a_v ) + { + for ( int i = 0; i < 13; i++ ) rawdata[i] = a_v.rawdata[i]; + width = a_v.width; + height = a_v.height; + } +}; \ No newline at end of file diff --git a/Plugins/SkillTree/Source/SkillTree/Classes/HexMap.h b/Plugins/SkillTree/Source/SkillTree/Classes/HexMap.h new file mode 100644 index 0000000..41aebfa --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTree/Classes/HexMap.h @@ -0,0 +1,80 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// +// A Map of Hexagons with a static width and height. +////////////////////////////////////////// + +#pragma once + +#include "Engine/EngineTypes.h" +#include "HexMap.generated.h" + +USTRUCT() +struct FHexMap +{ + GENERATED_BODY() +protected: + //Get bit at position. + bool GetBit( uint16 a_byte, int32 a_pos ) + { + return ( a_byte >> a_pos ) & 0x1; + } + //Set bit at position. + uint16 SetBit( uint16 a_byte, int32 a_pos, bool a_bit ) + { + if ( a_bit ) + a_byte |= 1 << a_pos; + else + a_byte &= ~( 1 << a_pos ); + return a_byte; + } + //True if i is odd. + bool IsOdd( uint16 a_i ) + { + return ( a_i % 2 != 0 ); + } + + //Returns true if x and y are valid positions on the map. + virtual bool IsPointValid( int32 a_x, int32 a_y ) + { + bool result = !( a_x < 0 || a_x >= 13 || a_y < 0 || a_y >= 16 ); + if ( result && IsOdd( a_x ) ) + result = ( a_y < ( 15 ) ); + return result; + } +public: + UPROPERTY() + uint16 rawdata[13]; + + //Get the state of a hex at given position. Returns false if position is not valid. + bool Get( int32 a_x, int32 a_y ) + { + if ( !IsPointValid( a_x, a_y ) ) return false; + return GetBit( rawdata[a_x], a_y ); + } + //Set the state of a hex at given position. + void Set( int32 a_x, int32 a_y, bool a_v ) + { + if ( !IsPointValid( a_x, a_y ) ) return; + rawdata[a_x] = SetBit( rawdata[a_x], a_y, a_v ); + } + //Invert the state of a hex at a given position. + void Invert( int32 a_x, int32 a_y ) + { + if ( !IsPointValid( a_x, a_y ) ) return; + unsigned short mask = 1 << a_y; + rawdata[a_x] ^= mask; + } + + FHexMap() + {} + + FHexMap( FHexMap& a_v ) + { + for ( int i = 0; i < 13; i++ ) rawdata[i] = a_v.rawdata[i]; + } + + virtual ~FHexMap() {} + +}; diff --git a/Plugins/SkillTree/Source/SkillTree/Classes/SkillObject.h b/Plugins/SkillTree/Source/SkillTree/Classes/SkillObject.h new file mode 100644 index 0000000..34539fb --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTree/Classes/SkillObject.h @@ -0,0 +1,28 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// +// The base Skill Object. +////////////////////////////////////////// + +#pragma once + +#include "Engine/EngineTypes.h" +#include "DynamicHexMap.h" +#include "SkillObject.generated.h" + +class USkillTreeObject; + +UCLASS( BlueprintType, meta = (DisplayThumbnail = "true") ) +class SKILLTREE_API USkillObject : public UObject +{ + GENERATED_BODY() +public: + //A Dynamic Map of Hexagons. + UPROPERTY( Category = Skill, EditAnywhere ) + FDynamicHexMap hexMap; + + //Pointer to the parent Skill Tree. + UPROPERTY() + USkillTreeObject* skillTree; +}; diff --git a/Plugins/SkillTree/Source/SkillTree/Classes/SkillTreeObject.h b/Plugins/SkillTree/Source/SkillTree/Classes/SkillTreeObject.h new file mode 100644 index 0000000..c0344e9 --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTree/Classes/SkillTreeObject.h @@ -0,0 +1,25 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// +// The base Skill Tree Object. +////////////////////////////////////////// + + +#pragma once + +#include "Engine/EngineTypes.h" +#include "HexMap.h" +#include "SkillTreeObject.generated.h" + +UCLASS( BlueprintType, meta = (DisplayThumbnail = "true") ) +class SKILLTREE_API USkillTreeObject : public UObject +{ + GENERATED_BODY() +public: + UPROPERTY() + FHexMap hexMap; + + UPROPERTY( Category = SkillTree, EditAnywhere, AssetRegistrySearchable ) + TArray> skills; +}; diff --git a/Plugins/SkillTree/Source/SkillTree/Private/SkillObject.cpp b/Plugins/SkillTree/Source/SkillTree/Private/SkillObject.cpp new file mode 100644 index 0000000..6f90916 --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTree/Private/SkillObject.cpp @@ -0,0 +1,7 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// + +#include "SkillTreePrivatePCH.h" +#include "../Classes/SkillObject.h" diff --git a/Plugins/SkillTree/Source/SkillTree/Private/SkillTree.cpp b/Plugins/SkillTree/Source/SkillTree/Private/SkillTree.cpp new file mode 100644 index 0000000..b6d663f --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTree/Private/SkillTree.cpp @@ -0,0 +1,32 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// + +#include "SkillTreePrivatePCH.h" + +#define LOCTEXT_NAMESPACE "SkillTree" + +class FSkillTree : public ISkillTree +{ +public: + /* IModuleInterface implementation */ + virtual void StartupModule() override; + virtual void ShutdownModule() override; + /* End IModuleInterface implementation */ +}; + +void FSkillTree::StartupModule() +{ + // This code will execute after the module is loaded into memory (but after global variables are initialized, of course.) +} + +void FSkillTree::ShutdownModule() +{ + // This function may be called during shutdown to clean up the module. For modules that support dynamic reloading, + // this function gets called before unloading the module. +} + +IMPLEMENT_MODULE( FSkillTree, SkillTree ) + +#undef LOCTEXT_NAMESPACE \ No newline at end of file diff --git a/Plugins/SkillTree/Source/SkillTree/Private/SkillTreeObject.cpp b/Plugins/SkillTree/Source/SkillTree/Private/SkillTreeObject.cpp new file mode 100644 index 0000000..077b8bf --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTree/Private/SkillTreeObject.cpp @@ -0,0 +1,8 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// + +#include "SkillTreePrivatePCH.h" +#include "../Classes/SkillTreeObject.h" + diff --git a/Plugins/SkillTree/Source/SkillTree/Private/SkillTreePrivatePCH.h b/Plugins/SkillTree/Source/SkillTree/Private/SkillTreePrivatePCH.h new file mode 100644 index 0000000..659bc97 --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTree/Private/SkillTreePrivatePCH.h @@ -0,0 +1,11 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// +// The Skill Tree Module Pre Compiled Header. +////////////////////////////////////////// + +#pragma once + +#include "ISkillTree.h" + diff --git a/Plugins/SkillTree/Source/SkillTree/Public/ISkillTree.h b/Plugins/SkillTree/Source/SkillTree/Public/ISkillTree.h new file mode 100644 index 0000000..2cae9e2 --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTree/Public/ISkillTree.h @@ -0,0 +1,27 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// +// The Skill Tree Runtime Module Interface. +////////////////////////////////////////// + +#pragma once + +#include "ModuleManager.h" + +class ISkillTree : public IModuleInterface +{ +public: + //Function to Get the Singleton of this Module if it's loaded. + static inline ISkillTree& Get() + { + return FModuleManager::LoadModuleChecked< ISkillTree >( "SkillTree" ); + } + + //Function to check if the Module is loaded. + static inline bool IsAvailable() + { + return FModuleManager::Get().IsModuleLoaded( "SkillTree" ); + } +}; + diff --git a/Plugins/SkillTree/Source/SkillTree/SkillTree.Build.cs b/Plugins/SkillTree/Source/SkillTree/SkillTree.Build.cs new file mode 100644 index 0000000..c1ab81c --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTree/SkillTree.Build.cs @@ -0,0 +1,34 @@ +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// +// The Skill Tree Runtime Module Settings. +////////////////////////////////////////// + +namespace UnrealBuildTool.Rules +{ + public class SkillTree : ModuleRules + { + public SkillTree(TargetInfo Target) + { + PublicDependencyModuleNames.AddRange( + new string[] { + "Core", + "CoreUObject", + "Engine" + } + ); + + PrivateDependencyModuleNames.AddRange( + new string[] { + "Slate", + "Renderer", + } + ); + + if (UEBuildConfiguration.bBuildEditor == true) + { + PrivateDependencyModuleNames.Add("UnrealEd"); + } + } + } +} \ No newline at end of file diff --git a/Plugins/SkillTree/Source/SkillTreeEditor/Classes/SkillFactory.h b/Plugins/SkillTree/Source/SkillTreeEditor/Classes/SkillFactory.h new file mode 100644 index 0000000..828eb0b --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTreeEditor/Classes/SkillFactory.h @@ -0,0 +1,21 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// +// Factory for making a Skill asset. +////////////////////////////////////////// + +#pragma once + +#include "SkillFactory.generated.h" + +UCLASS() +class USkillFactory : public UFactory +{ + GENERATED_UCLASS_BODY() +public: + + // UFactory interface + virtual UObject* FactoryCreateNew( UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn ) override; + // End of UFactory interface +}; diff --git a/Plugins/SkillTree/Source/SkillTreeEditor/Classes/SkillTreeFactory.h b/Plugins/SkillTree/Source/SkillTreeEditor/Classes/SkillTreeFactory.h new file mode 100644 index 0000000..a65a8dd --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTreeEditor/Classes/SkillTreeFactory.h @@ -0,0 +1,21 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// +// Factory for making a Skill Tree asset. +////////////////////////////////////////// + +#pragma once + +#include "SkillTreeFactory.generated.h" + +UCLASS() +class USkillTreeFactory : public UFactory +{ + GENERATED_UCLASS_BODY() + +public: + // UFactory interface + virtual UObject* FactoryCreateNew( UClass* a_class, UObject* a_parent, FName a_name, EObjectFlags a_flags, UObject* a_context, FFeedbackContext* a_warn ) override; + // End of UFactory interface +}; diff --git a/Plugins/SkillTree/Source/SkillTreeEditor/Private/SSkillTreeEditorViewportToolbar.cpp b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SSkillTreeEditorViewportToolbar.cpp new file mode 100644 index 0000000..0c9bf68 --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SSkillTreeEditorViewportToolbar.cpp @@ -0,0 +1,33 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// + +#include "SkillTreeEditorPrivatePCH.h" +#include "SSkillTreeEditorViewportToolbar.h" +#include "SkillTreeEditorCommands.h" +#include "SEditorViewport.h" + +#define LOCTEXT_NAMESPACE "SSkillTreeEditorViewportToolbar" + +void SSkillTreeEditorViewportToolbar::Construct( const FArguments& a_args, TSharedPtr a_infoProvider ) +{ + SCommonEditorViewportToolbarBase::Construct( SCommonEditorViewportToolbarBase::FArguments(), a_infoProvider ); +} + +TSharedRef SSkillTreeEditorViewportToolbar::GenerateShowMenu() const +{ + GetInfoProvider().OnFloatingButtonClicked(); + + TSharedRef viewportRef = GetInfoProvider().GetViewportWidget(); + + const bool shouldCloseWindowAfterMenuSelection = true; + FMenuBuilder showMenuBuilder( shouldCloseWindowAfterMenuSelection, viewportRef->GetCommandList() ); + { + showMenuBuilder.AddMenuEntry( FSkillTreeEditorCommands::Get().setShowGrid ); + } + + return showMenuBuilder.MakeWidget(); +} + +#undef LOCTEXT_NAMESPACE diff --git a/Plugins/SkillTree/Source/SkillTreeEditor/Private/SSkillTreeEditorViewportToolbar.h b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SSkillTreeEditorViewportToolbar.h new file mode 100644 index 0000000..c9bede1 --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SSkillTreeEditorViewportToolbar.h @@ -0,0 +1,23 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// +// In-viewport toolbar widgets used in the Skill Tree Editor. +////////////////////////////////////////// + +#pragma once + +#include "SCommonEditorViewportToolbarBase.h" + +class SSkillTreeEditorViewportToolbar : public SCommonEditorViewportToolbarBase +{ +public: + SLATE_BEGIN_ARGS( SSkillTreeEditorViewportToolbar ) {} + SLATE_END_ARGS() + + void Construct( const FArguments& a_args, TSharedPtr a_infoProvider ); + + // SCommonEditorViewportToolbarBase interface + virtual TSharedRef GenerateShowMenu() const override; + // End of SCommonEditorViewportToolbarBase +}; diff --git a/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillAsset.cpp b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillAsset.cpp new file mode 100644 index 0000000..0275a51 --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillAsset.cpp @@ -0,0 +1,63 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// + +#include "SkillTreeEditorPrivatePCH.h" +#include "SkillAsset.h" +#include "AssetToolsModule.h" +#include "Classes/SkillObject.h" +#include "Classes/SkillTreeObject.h" +#include "SkillTreeEditorViewport.h" + +#define LOCTEXT_NAMESPACE "AssetTypeActions" + +FSkillAsset::FSkillAsset( EAssetTypeCategories::Type a_assetCategory ) + : m_assetCategory( a_assetCategory ) +{ +} + +//Gets the name of the asset. +FText FSkillAsset::GetName() const +{ + return LOCTEXT( "FSkillName", "Skill" ); +} + +//Gets the type color of the asset. +FColor FSkillAsset::GetTypeColor() const +{ + return FColor::Cyan; +} + +//Gets a pointer to the class this asset implements. +UClass* FSkillAsset::GetSupportedClass() const +{ + return USkillObject::StaticClass(); +} + +//Gets the category of this asset. +uint32 FSkillAsset::GetCategories() +{ + return m_assetCategory; +} + +//Opens an editor with this asset. +void FSkillAsset::OpenAssetEditor( const TArray& a_objects, TSharedPtr a_editWithinLevelEditor ) +{ + const EToolkitMode::Type mode = a_editWithinLevelEditor.IsValid() ? EToolkitMode::WorldCentric : EToolkitMode::Standalone; + + for ( auto i = a_objects.CreateConstIterator(); i; ++i ) + { + if ( USkillObject* skill = Cast( *i ) ) + { + USkillTreeObject* skillTree = skill->skillTree; + if( skillTree != NULL ) + { + TSharedRef newSkillTreeEditor( new FSkillTreeEditorViewport() ); + newSkillTreeEditor->InitSkillTreeEditor( mode, a_editWithinLevelEditor, skillTree, skill ); + } + } + } +}; + +#undef LOCTEXT_NAMESPACE \ No newline at end of file diff --git a/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillAsset.h b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillAsset.h new file mode 100644 index 0000000..4722ab5 --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillAsset.h @@ -0,0 +1,29 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// +// Skill asset class for adding extra +// functionality to the Skill asset. +////////////////////////////////////////// + +#pragma once + +#include "EditorStyle.h" +#include "AssetTypeActions_Base.h" + +class FSkillAsset : public FAssetTypeActions_Base +{ +public: + FSkillAsset( EAssetTypeCategories::Type a_assetCategory ); + + // IAssetTypeActions interface + virtual FText GetName() const override; + virtual FColor GetTypeColor() const override; + virtual UClass* GetSupportedClass() const override; + virtual void OpenAssetEditor( const TArray& a_objects, TSharedPtr a_editWithinLevelEditor = TSharedPtr() ) override; + virtual uint32 GetCategories() override; + // End of IAssetTypeActions interface + +private: + EAssetTypeCategories::Type m_assetCategory; +}; \ No newline at end of file diff --git a/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillFactory.cpp b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillFactory.cpp new file mode 100644 index 0000000..96e430e --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillFactory.cpp @@ -0,0 +1,29 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// + +#include "SkillTreeEditorPrivatePCH.h" +#include "SkillFactory.h" +#include "SkillObject.h" +#include "AssetRegistryModule.h" +#include "PackageTools.h" + +#define LOCTEXT_NAMESPACE "SkillTree" + +USkillFactory::USkillFactory( const FObjectInitializer& ObjectInitializer ) + : Super( ObjectInitializer ) +{ + bCreateNew = true; + bEditAfterNew = true; + SupportedClass = USkillObject::StaticClass(); +} + +UObject* USkillFactory::FactoryCreateNew( UClass* a_class, UObject* a_parent, FName a_name, EObjectFlags a_flags, UObject* a_context, FFeedbackContext* a_warn ) +{ + USkillObject* newSkill = NewObject( a_parent, a_class, a_name, a_flags | RF_Transactional ); + + return newSkill; +} + +#undef LOCTEXT_NAMESPACE \ No newline at end of file diff --git a/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeAsset.cpp b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeAsset.cpp new file mode 100644 index 0000000..449e948 --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeAsset.cpp @@ -0,0 +1,58 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// + +#include "SkillTreeEditorPrivatePCH.h" +#include "SkillTreeAsset.h" +#include "AssetToolsModule.h" +#include "Classes/SkillTreeObject.h" +#include "SkillTreeEditorViewport.h" + +#define LOCTEXT_NAMESPACE "AssetTypeActions" + +FSkillTreeAsset::FSkillTreeAsset( EAssetTypeCategories::Type a_assetCategory ) + : m_assetCategory( a_assetCategory ) +{ +} + +//Gets the name of the asset. +FText FSkillTreeAsset::GetName() const +{ + return LOCTEXT( "FSkillTreeName", "Skill Tree" ); +} + +//Gets the type color of the asset. +FColor FSkillTreeAsset::GetTypeColor() const +{ + return FColor::Cyan; +} + +//Gets a pointer to the class this asset implements. +UClass* FSkillTreeAsset::GetSupportedClass() const +{ + return USkillTreeObject::StaticClass(); +} + +//Gets the category of this asset. +uint32 FSkillTreeAsset::GetCategories() +{ + return m_assetCategory; +} + +//Opens an editor with this asset. +void FSkillTreeAsset::OpenAssetEditor( const TArray& a_objects, TSharedPtr a_editWithinLevelEditor ) +{ + const EToolkitMode::Type mode = a_editWithinLevelEditor.IsValid() ? EToolkitMode::WorldCentric : EToolkitMode::Standalone; + + for ( auto i = a_objects.CreateConstIterator(); i; ++i ) + { + if ( USkillTreeObject* skillTree = Cast( *i ) ) + { + TSharedRef newSkillTreeEditor( new FSkillTreeEditorViewport() ); + newSkillTreeEditor->InitSkillTreeEditor( mode, a_editWithinLevelEditor, skillTree ); + } + } +}; + +#undef LOCTEXT_NAMESPACE \ No newline at end of file diff --git a/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeAsset.h b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeAsset.h new file mode 100644 index 0000000..b369374 --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeAsset.h @@ -0,0 +1,29 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// +// Skill Tree asset class for adding extra +// functionality to the Skill Tree asset. +////////////////////////////////////////// + +#pragma once + +#include "EditorStyle.h" +#include "AssetTypeActions_Base.h" + +class FSkillTreeAsset : public FAssetTypeActions_Base +{ +public: + FSkillTreeAsset( EAssetTypeCategories::Type a_assetCategory ); + + // IAssetTypeActions interface + virtual FText GetName() const override; + virtual FColor GetTypeColor() const override; + virtual UClass* GetSupportedClass() const override; + virtual void OpenAssetEditor( const TArray& a_objects, TSharedPtr a_editWithinLevelEditor = TSharedPtr() ) override; + virtual uint32 GetCategories() override; + // End of IAssetTypeActions interface + +private: + EAssetTypeCategories::Type m_assetCategory; +}; \ No newline at end of file diff --git a/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeDetailsCustomization.cpp b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeDetailsCustomization.cpp new file mode 100644 index 0000000..2019a69 --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeDetailsCustomization.cpp @@ -0,0 +1,147 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// + +#include "SkillTreeEditorPrivatePCH.h" +#include "SkillTreeDetailsCustomization.h" +#include "PhysicsEngine/BodySetup.h" +#include "Editor/Documentation/Public/IDocumentation.h" +#include "PropertyRestriction.h" +#include "PropertyCustomizationHelpers.h" +#include "SkillTreeObject.h" +#include "SkillObject.h" + +#define LOCTEXT_NAMESPACE "SkillTreeEditor" + +///////////////////////////////////////////////////// +// FSkillTreeDetailsCustomization + +// Makes a new instance of this detail layout class for a specific detail view requesting it. +TSharedRef FSkillTreeDetailsCustomization::MakeInstance() +{ + return MakeInstanceForSkillTreeEditor( ); +} + +// Makes a new instance of this detail layout class for a specific detail view requesting it. +TSharedRef FSkillTreeDetailsCustomization::MakeInstanceForSkillTreeEditor( ) +{ + return MakeShareable( new FSkillTreeDetailsCustomization( ) ); +} + +FSkillTreeDetailsCustomization::FSkillTreeDetailsCustomization( ) +{ +} + +FDetailWidgetRow& FSkillTreeDetailsCustomization::GenerateWarningRow( IDetailCategoryBuilder& a_warningCategory, bool a_experimental, const FText& a_warningText, const FText& a_tooltip, const FString& a_excerptLink, const FString& a_excerptName ) +{ + const FText searchString = a_warningText; + const FSlateBrush* warningIcon = FEditorStyle::GetBrush( a_experimental ? "PropertyEditor.ExperimentalClass" : "PropertyEditor.EarlyAccessClass" ); + + FDetailWidgetRow& warningRow = a_warningCategory.AddCustomRow( searchString ) + .WholeRowContent() + [ + SNew( SHorizontalBox ) + .ToolTip( IDocumentation::Get()->CreateToolTip( a_tooltip, nullptr, a_excerptLink, a_excerptName ) ) + .Visibility( EVisibility::Visible ) + + + SHorizontalBox::Slot() + .VAlign( VAlign_Center ) + .AutoWidth() + .Padding( 4.0f, 0.0f, 0.0f, 0.0f ) + [SNew( SImage ) + .Image( warningIcon ) + ] + + + SHorizontalBox::Slot() + .VAlign( VAlign_Center ) + .AutoWidth() + .Padding( 4.0f, 0.0f, 0.0f, 0.0f ) + [ + SNew( STextBlock ) + .Text( a_warningText ) + .Font( IDetailLayoutBuilder::GetDetailFont() ) + ] + ]; + + return warningRow; +} + +void FSkillTreeDetailsCustomization::CustomizeDetails( IDetailLayoutBuilder& a_detailLayout ) +{ + IDetailCategoryBuilder& skillTreeCategory = a_detailLayout.EditCategory( "SkillTree", FText::GetEmpty(), ECategoryPriority::Important ); + BuildSkillTreeSection( skillTreeCategory, a_detailLayout ); +} + +// Makes sure Skill Tree properties are near the top. +void FSkillTreeDetailsCustomization::BuildSkillTreeSection( IDetailCategoryBuilder& a_skillTreeCategory, IDetailLayoutBuilder& a_detailLayout ) +{ + a_skillTreeCategory.AddProperty( GET_MEMBER_NAME_CHECKED( USkillTreeObject, skills ) ); +} + +///////////////////////////////////////////////////// +// FSkillDetailsCustomization + +// Makes a new instance of this detail layout class for a specific detail view requesting it. +TSharedRef FSkillDetailsCustomization::MakeInstance() +{ + return MakeInstanceForSkillTreeEditor( ); +} + +// Makes a new instance of this detail layout class for a specific detail view requesting it. +TSharedRef FSkillDetailsCustomization::MakeInstanceForSkillTreeEditor( ) +{ + return MakeShareable( new FSkillDetailsCustomization( ) ); +} + +FSkillDetailsCustomization::FSkillDetailsCustomization( ) +{ +} + +FDetailWidgetRow& FSkillDetailsCustomization::GenerateWarningRow( IDetailCategoryBuilder& a_warningCategory, bool a_experimental, const FText& a_warningText, const FText& a_tooltip, const FString& a_excerptLink, const FString& a_excerptName ) +{ + const FText searchString = a_warningText; + const FSlateBrush* warningIcon = FEditorStyle::GetBrush( a_experimental ? "PropertyEditor.ExperimentalClass" : "PropertyEditor.EarlyAccessClass" ); + + FDetailWidgetRow& warningRow = a_warningCategory.AddCustomRow( searchString ) + .WholeRowContent() + [ + SNew( SHorizontalBox ) + .ToolTip( IDocumentation::Get()->CreateToolTip( a_tooltip, nullptr, a_excerptLink, a_excerptName ) ) + .Visibility( EVisibility::Visible ) + + + SHorizontalBox::Slot() + .VAlign( VAlign_Center ) + .AutoWidth() + .Padding( 4.0f, 0.0f, 0.0f, 0.0f ) + [SNew( SImage ) + .Image( warningIcon ) + ] + + + SHorizontalBox::Slot() + .VAlign( VAlign_Center ) + .AutoWidth() + .Padding( 4.0f, 0.0f, 0.0f, 0.0f ) + [ + SNew( STextBlock ) + .Text( a_warningText ) + .Font( IDetailLayoutBuilder::GetDetailFont() ) + ] + ]; + + return warningRow; +} + +void FSkillDetailsCustomization::CustomizeDetails( IDetailLayoutBuilder& a_detailLayout ) +{ + IDetailCategoryBuilder& skillCategory = a_detailLayout.EditCategory( "Skill", FText::GetEmpty(), ECategoryPriority::Important ); + BuildSkillSection( skillCategory, a_detailLayout ); +} + +// Makes sure Skill properties are near the top. +void FSkillDetailsCustomization::BuildSkillSection( IDetailCategoryBuilder& a_skillCategory, IDetailLayoutBuilder& a_detailLayout ) +{ + a_skillCategory.AddProperty( GET_MEMBER_NAME_CHECKED( USkillObject, hexMap ) ); +} + +#undef LOCTEXT_NAMESPACE diff --git a/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeDetailsCustomization.h b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeDetailsCustomization.h new file mode 100644 index 0000000..2d1c52b --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeDetailsCustomization.h @@ -0,0 +1,55 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// + + +#pragma once + +#include "PropertyEditing.h" +#include "SkillTreeEditorViewportClient.h" + +////////////////////////////////////////// +// The Skill Tree Details viewport. +////////////////////////////////////////// +class FSkillTreeDetailsCustomization : public IDetailCustomization +{ +public: + static TSharedRef MakeInstance(); + + static TSharedRef MakeInstanceForSkillTreeEditor( ); + + // IDetailCustomization interface + virtual void CustomizeDetails( IDetailLayoutBuilder& DetailLayout ) override; + // End of IDetailCustomization interface + +protected: + FSkillTreeDetailsCustomization( ); + + static FDetailWidgetRow& GenerateWarningRow( IDetailCategoryBuilder& a_warningCategory, bool a_experimental, const FText& a_warningText, const FText& a_tooltip, const FString& a_excerptLink, const FString& a_excerptName ); + + void BuildSkillTreeSection( IDetailCategoryBuilder& a_skillTreeCategory, IDetailLayoutBuilder& a_detailLayout ); +}; + +////////////////////////////////////////// +// The Skill Details viewport. +////////////////////////////////////////// +class FSkillDetailsCustomization : public IDetailCustomization +{ +public: + static TSharedRef MakeInstance(); + + static TSharedRef MakeInstanceForSkillTreeEditor( ); + + // IDetailCustomization interface + virtual void CustomizeDetails( IDetailLayoutBuilder& DetailLayout ) override; + // End of IDetailCustomization interface + +protected: + FSkillDetailsCustomization( ); + + static FDetailWidgetRow& GenerateWarningRow( IDetailCategoryBuilder& a_warningCategory, bool a_experimental, const FText& a_warningText, const FText& a_tooltip, const FString& a_excerptLink, const FString& a_excerptName ); + + void BuildSkillSection( IDetailCategoryBuilder& a_skillCategory, IDetailLayoutBuilder& a_detailLayout ); +}; + diff --git a/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditMode.cpp b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditMode.cpp new file mode 100644 index 0000000..5390b7f --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditMode.cpp @@ -0,0 +1,9 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// + +#include "SkillTreeEditorPrivatePCH.h" +#include "SkillTreeEditMode.h" + +const FEditorModeID FSkillTreeEditMode::EM_skillTree( TEXT( "SkillTreeEditMode" ) ); diff --git a/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditMode.h b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditMode.h new file mode 100644 index 0000000..2022849 --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditMode.h @@ -0,0 +1,20 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// +// The Skill Tree Editor mode class. +////////////////////////////////////////// + +#include "UnrealEd.h" +#include "EditorModeRegistry.h" + +#pragma once + +class FSkillTreeEditMode : public FEdMode +{ +public: + //The ID of the Skill Tree Editor. + static const FEditorModeID EM_skillTree; +public: + FSkillTreeEditMode(){}; +}; \ No newline at end of file diff --git a/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditor.cpp b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditor.cpp new file mode 100644 index 0000000..3240159 --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditor.cpp @@ -0,0 +1,72 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// + +#include "SkillTreeEditorPrivatePCH.h" +#include "AssetToolsModule.h" +#include "ModuleManager.h" +#include "SkillTreeAsset.h" +#include "SkillAsset.h" +#include "SkillTreeEditMode.h" +#include "SkillTreeEditorCommands.h" + +#define LOCTEXT_NAMESPACE "SkillTreeEditor" + +EAssetTypeCategories::Type skillTreeAssetCategoryBit; + +class FSkillTreeEditor : public ISkillTreeEditor +{ +public: + /** IModuleInterface implementation */ + virtual void StartupModule() override; + virtual void ShutdownModule() override; + + void RegisterAssetTypeAction( IAssetTools& a_assetTools, TSharedRef a_action ); +private: + TArray< TSharedPtr > m_createdAssetTypeActions; +}; + + +void FSkillTreeEditor::RegisterAssetTypeAction( IAssetTools& a_assetTools, TSharedRef a_action ) +{ + a_assetTools.RegisterAssetTypeActions( a_action ); + m_createdAssetTypeActions.Add( a_action ); +} + +void FSkillTreeEditor::StartupModule() +{ + FSkillTreeEditorCommands::Register(); + + IAssetTools& assetTools = FModuleManager::LoadModuleChecked( "AssetTools" ).Get(); + + //Register the category of the assets. + skillTreeAssetCategoryBit = assetTools.RegisterAdvancedAssetCategory( FName( TEXT( "SkillTree" ) ), LOCTEXT( "SkillTreeAssetCategory", "Skill Tree" ) ); + + //Register the asset to the category. + RegisterAssetTypeAction( assetTools, MakeShareable( new FSkillTreeAsset( skillTreeAssetCategoryBit ) ) ); + + FEditorModeRegistry::Get().RegisterMode( FSkillTreeEditMode::EM_skillTree, LOCTEXT( "SkillTreeEditMode", "Skill Tree Editor" ), FSlateIcon(), false ); +} + +void FSkillTreeEditor::ShutdownModule() +{ + FEditorModeRegistry::Get().UnregisterMode( FSkillTreeEditMode::EM_skillTree ); + + //Unregister all the assets. + if ( FModuleManager::Get().IsModuleLoaded( "AssetTools" ) ) + { + IAssetTools& AssetTools = FModuleManager::GetModuleChecked( "AssetTools" ).Get(); + for ( int32 i = 0; i < m_createdAssetTypeActions.Num(); ++i ) + { + AssetTools.UnregisterAssetTypeActions( m_createdAssetTypeActions[i].ToSharedRef() ); + } + } + m_createdAssetTypeActions.Empty(); + + FSkillTreeEditorCommands::Unregister(); +} + +IMPLEMENT_MODULE( FSkillTreeEditor, SkillTreeEditor ) + +#undef LOCTEXT_NAMESPACE \ No newline at end of file diff --git a/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditorCommands.cpp b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditorCommands.cpp new file mode 100644 index 0000000..72f0d4c --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditorCommands.cpp @@ -0,0 +1,20 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// + +#include "SkillTreeEditorPrivatePCH.h" +#include "SkillTreeEditorCommands.h" + +#define LOCTEXT_NAMESPACE "" + +void FSkillTreeEditorCommands::RegisterCommands() +{ + // Show toggles + UI_COMMAND( setShowGrid, "Grid", "Displays the viewport grid.", EUserInterfaceActionType::ToggleButton, FInputChord() ); + + // Editing modes + UI_COMMAND( enterViewMode, "View", "View the sprite.", EUserInterfaceActionType::ToggleButton, FInputChord() ); +} + +#undef LOCTEXT_NAMESPACE \ No newline at end of file diff --git a/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditorCommands.h b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditorCommands.h new file mode 100644 index 0000000..64de28c --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditorCommands.h @@ -0,0 +1,30 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// +// The Skill Tree Editor commands class. +////////////////////////////////////////// + +#pragma once + +class FSkillTreeEditorCommands : public TCommands +{ +public: + FSkillTreeEditorCommands() + : TCommands( + TEXT( "SkillTreeEditor" ), + NSLOCTEXT( "Contexts", "SkillTreeEditor", "Skill Tree Editor" ), + NAME_None, + FName(TEXT("null")) + ) + { + } + + // TCommand<> interface + virtual void RegisterCommands() override; + // End of TCommand<> interface + + //TODO: Remove? + TSharedPtr setShowGrid; + TSharedPtr enterViewMode; +}; \ No newline at end of file diff --git a/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditorPrivatePCH.h b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditorPrivatePCH.h new file mode 100644 index 0000000..b4f9cd2 --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditorPrivatePCH.h @@ -0,0 +1,13 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// +// The Skill Tree Editor Module Pre Compiled Header. +////////////////////////////////////////// + + +#pragma once + +#include "UnrealEd.h" +#include "ISkillTreeEditor.h" + diff --git a/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditorViewport.cpp b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditorViewport.cpp new file mode 100644 index 0000000..11bc705 --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditorViewport.cpp @@ -0,0 +1,532 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// + +#include "SkillTreeEditorPrivatePCH.h" +#include "SkillTreeEditorViewport.h" +#include "SceneViewport.h" + +#include "GraphEditor.h" +#include "SDockTab.h" +#include "SEditorViewport.h" +#include "SCommonEditorViewportToolbarBase.h" +#include "ISkillTree.h" +#include "SkillTreeEditorViewportClient.h" +#include "SSkillTreeEditorViewportToolbar.h" +#include "SkillTreeObject.h" +#include "SkillObject.h" +#include "WorkspaceMenuStructureModule.h" + +#include "SkillTreeEditorCommands.h" +#include "SSingleObjectDetailsPanel.h" +#include "SkillTreeDetailsCustomization.h" + +#define LOCTEXT_NAMESPACE "SkillTreeEditor" + +const FName skillTreeEditorAppName = FName( TEXT( "SkillTreeEditorApp" ) ); + +// Tab identifiers. +struct FSkillTreeEditorTabs +{ + static const FName skillTreeViewportID; + static const FName skillTreeDetailViewportID; + static const FName skillViewportID; + static const FName skillDetailViewportID; +}; + +const FName FSkillTreeEditorTabs::skillTreeViewportID( TEXT( "STViewport" ) ); +const FName FSkillTreeEditorTabs::skillViewportID( TEXT( "SViewport" ) ); +const FName FSkillTreeEditorTabs::skillTreeDetailViewportID( TEXT( "STDViewport" ) ); +const FName FSkillTreeEditorTabs::skillDetailViewportID( TEXT( "SDViewport" ) ); + +//TODO: Make separate headers for these classes. +///////////////////////////////////////////////////// +// SSkillTreePropertiesTabBody + +class SSkillTreePropertiesTabBody : public SSingleObjectDetailsPanel +{ +public: + SLATE_BEGIN_ARGS( SSkillTreePropertiesTabBody ) {} + SLATE_END_ARGS() + +private: + // Pointer back to owning skill tree editor instance. + TWeakPtr m_skillTreeEditorPtr; + +public: + void Construct( const FArguments& a_args, TSharedPtr a_skillTreeEditor ) + { + m_skillTreeEditorPtr = a_skillTreeEditor; + + SSingleObjectDetailsPanel::Construct( SSingleObjectDetailsPanel::FArguments().HostCommandList( a_skillTreeEditor->GetToolkitCommands() ), true, true ); + + FOnGetDetailCustomizationInstance customizeSkillTreeForEditor = FOnGetDetailCustomizationInstance::CreateStatic( &FSkillTreeDetailsCustomization::MakeInstanceForSkillTreeEditor ); + PropertyView->RegisterInstancedCustomPropertyLayout( USkillTreeObject::StaticClass(), customizeSkillTreeForEditor ); + } + + // SSingleObjectDetailsPanel interface + virtual UObject* GetObjectToObserve() const override + { + return m_skillTreeEditorPtr.Pin()->GetSkillTreeBeingEdited(); + } + + virtual TSharedRef PopulateSlot( TSharedRef a_propertyEditorWidget ) override + { + return SNew( SVerticalBox ) + + SVerticalBox::Slot() + .FillHeight( 1 ) + [ + a_propertyEditorWidget + ]; + } + // End of SSingleObjectDetailsPanel interface +}; + +///////////////////////////////////////////////////// +// SSkillPropertiesTabBody + +class SSkillPropertiesTabBody : public SSingleObjectDetailsPanel +{ +public: + SLATE_BEGIN_ARGS( SSkillPropertiesTabBody ) {} + SLATE_END_ARGS() + +private: + // Pointer back to owning sprite editor instance (the keeper of state) + TWeakPtr m_skillTreeEditorPtr; + +public: + void Construct( const FArguments& InArgs, TSharedPtr a_skillTreeEditor ) + { + m_skillTreeEditorPtr = a_skillTreeEditor; + + SSingleObjectDetailsPanel::Construct( SSingleObjectDetailsPanel::FArguments().HostCommandList( a_skillTreeEditor->GetToolkitCommands() ), true, true ); + + FOnGetDetailCustomizationInstance customizeSkillTreeForEditor = FOnGetDetailCustomizationInstance::CreateStatic( &FSkillDetailsCustomization::MakeInstanceForSkillTreeEditor ); + PropertyView->RegisterInstancedCustomPropertyLayout( USkillObject::StaticClass(), customizeSkillTreeForEditor ); + } + + // SSingleObjectDetailsPanel interface + virtual UObject* GetObjectToObserve() const override + { + return m_skillTreeEditorPtr.Pin()->GetSkillBeingEdited(); + } + + virtual TSharedRef PopulateSlot( TSharedRef a_propertyEditorWidget ) override + { + return SNew( SVerticalBox ) + + SVerticalBox::Slot() + .FillHeight( 1 ) + [ + a_propertyEditorWidget + ]; + } + // End of SSingleObjectDetailsPanel interface +}; + +///////////////////////////////////////////////////// +// SSkillTreeEditorViewport + +class SSkillTreeEditorViewport : public SEditorViewport, public ICommonEditorViewportToolbarInfoProvider +{ +public: + SLATE_BEGIN_ARGS( SSkillTreeEditorViewport ) {} + SLATE_END_ARGS() + + void Construct( const FArguments& a_args, TSharedPtr a_spriteEditor ); + + // SEditorViewport interface + virtual void BindCommands() override; + virtual TSharedRef MakeEditorViewportClient() override; + virtual TSharedPtr MakeViewportToolbar() override; + virtual EVisibility GetTransformToolbarVisibility() const override; + virtual void OnFloatingButtonClicked() override; + // End of SEditorViewport interface + + // ICommonEditorViewportToolbarInfoProvider interface + virtual TSharedRef GetViewportWidget() override; + virtual TSharedPtr GetExtenders() const override; + // End of ICommonEditorViewportToolbarInfoProvider interface + + void ActivateEditMode() + { + m_editorViewportClient->ActivateEditMode(); + } + + void IsSkill( bool a_state ) + { + m_editorViewportClient->IsSkill( a_state ); + } + +private: + // Pointer back to owning Skill Tree editor instance (the keeper of state). + TWeakPtr m_skillTreeEditorPtr; + + // Viewport client + TSharedPtr m_editorViewportClient; +}; + +void SSkillTreeEditorViewport::Construct( const FArguments& a_args, TSharedPtr a_skillTreeEditor ) +{ + m_skillTreeEditorPtr = a_skillTreeEditor; + + SEditorViewport::Construct( SEditorViewport::FArguments() ); +} + +void SSkillTreeEditorViewport::BindCommands() +{ + SEditorViewport::BindCommands(); + + const FSkillTreeEditorCommands& commands = FSkillTreeEditorCommands::Get(); + + TSharedRef editorViewportClientRef = m_editorViewportClient.ToSharedRef(); + + // Show toggles + //TODO: Remove. + CommandList->MapAction( + commands.setShowGrid, + FExecuteAction::CreateSP( editorViewportClientRef, &FEditorViewportClient::SetShowGrid ), + FCanExecuteAction(), + FIsActionChecked::CreateSP( editorViewportClientRef, &FEditorViewportClient::IsSetShowGridChecked ) ); + + + // Editing modes + //TODO: Remove. + CommandList->MapAction( + commands.enterViewMode, + FExecuteAction::CreateSP( editorViewportClientRef, &FSkillTreeEditorViewportClient::EnterViewMode ), + FCanExecuteAction(), + FIsActionChecked::CreateSP( editorViewportClientRef, &FSkillTreeEditorViewportClient::IsInViewMode ) ); +} + +// Make a new client for the viewport. +TSharedRef SSkillTreeEditorViewport::MakeEditorViewportClient() +{ + m_editorViewportClient = MakeShareable( new FSkillTreeEditorViewportClient( m_skillTreeEditorPtr, SharedThis( this ) ) ); + + return m_editorViewportClient.ToSharedRef(); +} + +TSharedPtr SSkillTreeEditorViewport::MakeViewportToolbar() +{ + return SNew( SSkillTreeEditorViewportToolbar, SharedThis( this ) ); +} + +EVisibility SSkillTreeEditorViewport::GetTransformToolbarVisibility() const +{ + return EVisibility::Visible; +} + +TSharedRef SSkillTreeEditorViewport::GetViewportWidget() +{ + return SharedThis( this ); +} + +TSharedPtr SSkillTreeEditorViewport::GetExtenders() const +{ + TSharedPtr Result( MakeShareable( new FExtender ) ); + return Result; +} + +//Needed to be implemented but not used. +void SSkillTreeEditorViewport::OnFloatingButtonClicked() +{ +} + +///////////////////////////////////////////////////// +// FSkillTreeEditorViewport + +TSharedRef FSkillTreeEditorViewport::SpawnTab_SKViewport( const FSpawnTabArgs& a_args ) +{ + return SNew( SDockTab ) + .Label( LOCTEXT( "SKViewportTab_Title", "Skill Tree" ) ) + [ + SNew( SOverlay ) + + // The Skill Tree editor viewport + + SOverlay::Slot() + [ + m_skillTreeViewport.ToSharedRef() + ] + + // Bottom-right corner text indicating the preview nature of the viewport. + + SOverlay::Slot() + .Padding( 10 ) + .VAlign( VAlign_Bottom ) + .HAlign( HAlign_Right ) + [ + SNew( STextBlock ) + .Visibility( EVisibility::HitTestInvisible ) + .TextStyle( FEditorStyle::Get(), "Graph.CornerText" ) + .Text( LOCTEXT( "SKViewportTab_CornerText", "Edit Skill Tree" ) ) + ] + ]; +} + +TSharedRef FSkillTreeEditorViewport::SpawnTab_SViewport( const FSpawnTabArgs& a_args ) +{ + return SNew( SDockTab ) + .Label( LOCTEXT( "SViewportTab_Title", "Skill" ) ) + [ + SNew( SOverlay ) + + // The sprite editor viewport + + SOverlay::Slot() + [ + m_skillViewport.ToSharedRef() + ] + + // Bottom-right corner text indicating the preview nature of the viewport. + + SOverlay::Slot() + .Padding( 10 ) + .VAlign( VAlign_Bottom ) + .HAlign( HAlign_Right ) + [ + SNew( STextBlock ) + .Visibility( EVisibility::HitTestInvisible ) + .TextStyle( FEditorStyle::Get(), "Graph.CornerText" ) + .Text( LOCTEXT("SViewportTab_CornerText", "Edit Skill") ) + ] + ]; +} + +TSharedRef FSkillTreeEditorViewport::SpawnTab_SKDViewport( const FSpawnTabArgs& a_args ) +{ + TSharedPtr editorPtr = SharedThis( this ); + + // Spawn the tab + return SNew( SDockTab ) + .Label( LOCTEXT( "SKDViewportTab_Title", "Skill Tree Details" ) ) + [ + SNew( SSkillTreePropertiesTabBody, editorPtr ) + ]; +} + +TSharedRef FSkillTreeEditorViewport::SpawnTab_SDViewport( const FSpawnTabArgs& a_args ) +{ + TSharedPtr editorPtr = SharedThis( this ); + + // Spawn the tab + return SNew( SDockTab ) + .Label( LOCTEXT( "SDViewportTab_Title", "Skill Details" ) ) + [ + SNew( SSkillPropertiesTabBody, editorPtr ) + ]; +} + +void FSkillTreeEditorViewport::RegisterTabSpawners( const TSharedRef& a_tabManager ) +{ + WorkspaceMenuCategory = a_tabManager->AddLocalWorkspaceMenuCategory( LOCTEXT( "WorkspaceMenu_SpriteEditor", "Skill Tree Editor" ) ); + auto workspaceMenuCategoryRef = WorkspaceMenuCategory.ToSharedRef(); + + FAssetEditorToolkit::RegisterTabSpawners( a_tabManager ); + + a_tabManager->RegisterTabSpawner( FSkillTreeEditorTabs::skillTreeViewportID, FOnSpawnTab::CreateSP( this, &FSkillTreeEditorViewport::SpawnTab_SKViewport ) ) + .SetDisplayName( LOCTEXT( "SKViewportTab", "Skill Tree" ) ) + .SetGroup( workspaceMenuCategoryRef ) + .SetIcon( FSlateIcon( FEditorStyle::GetStyleSetName(), "LevelEditor.Tabs.Viewports" ) ); + + a_tabManager->RegisterTabSpawner( FSkillTreeEditorTabs::skillTreeDetailViewportID, FOnSpawnTab::CreateSP( this, &FSkillTreeEditorViewport::SpawnTab_SKDViewport ) ) + .SetDisplayName( LOCTEXT( "SKDViewportTab", "Skill Tree Details" ) ) + .SetGroup( workspaceMenuCategoryRef ) + .SetIcon( FSlateIcon( FEditorStyle::GetStyleSetName(), "LevelEditor.Tabs.Viewports" ) ); + + a_tabManager->RegisterTabSpawner( FSkillTreeEditorTabs::skillViewportID, FOnSpawnTab::CreateSP( this, &FSkillTreeEditorViewport::SpawnTab_SViewport ) ) + .SetDisplayName( LOCTEXT( "SViewportTab", "Skill" ) ) + .SetGroup( workspaceMenuCategoryRef ) + .SetIcon( FSlateIcon( FEditorStyle::GetStyleSetName(), "LevelEditor.Tabs.Viewports" ) ); + + a_tabManager->RegisterTabSpawner( FSkillTreeEditorTabs::skillDetailViewportID, FOnSpawnTab::CreateSP( this, &FSkillTreeEditorViewport::SpawnTab_SDViewport ) ) + .SetDisplayName( LOCTEXT( "SDViewportTab", "Skill Details" ) ) + .SetGroup( workspaceMenuCategoryRef ) + .SetIcon( FSlateIcon( FEditorStyle::GetStyleSetName(), "LevelEditor.Tabs.Viewports" ) ); +} + +void FSkillTreeEditorViewport::UnregisterTabSpawners( const TSharedRef& a_tabManager ) +{ + FAssetEditorToolkit::UnregisterTabSpawners( a_tabManager ); + + a_tabManager->UnregisterTabSpawner( FSkillTreeEditorTabs::skillTreeViewportID ); + a_tabManager->UnregisterTabSpawner( FSkillTreeEditorTabs::skillTreeDetailViewportID ); + a_tabManager->UnregisterTabSpawner( FSkillTreeEditorTabs::skillViewportID ); + a_tabManager->UnregisterTabSpawner( FSkillTreeEditorTabs::skillDetailViewportID ); +} + +FName FSkillTreeEditorViewport::GetToolkitFName() const +{ + return FName( "SkillTreeEditor" ); +} + +void FSkillTreeEditorViewport::SetSkillBeingEdited( USkillObject* a_skill ) +{ + if ( (a_skill != m_skillBeingEdited) && (a_skill != nullptr) ) + { + USkillObject* oldSkill = m_skillBeingEdited; + m_skillBeingEdited = a_skill; + + //No longer needed. + /* + RemoveEditingObject( oldSkill ); + AddEditingObject( a_skill ); + */ + } +} + +FText FSkillTreeEditorViewport::GetBaseToolkitName() const +{ + return LOCTEXT( "SkillTreeEditorAppLabel", "Skill Tree" ); +} + +FText FSkillTreeEditorViewport::GetToolkitName() const +{ + bool dirtyState = (m_skillTreeBeingEdited->GetOutermost()->IsDirty() || m_skillBeingEdited->GetOutermost()->IsDirty()); + + FFormatNamedArguments args; + args.Add( TEXT( "SkillTreeName" ), FText::FromString( m_skillTreeBeingEdited->GetName() ) ); + args.Add( TEXT( "DirtyState" ), dirtyState ? FText::FromString( TEXT( "*" ) ) : FText::GetEmpty() ); + return FText::Format( LOCTEXT( "SkillTreeEditorAppLabel", "{SkillTreeName}{DirtyState}" ), args ); +} + +FText FSkillTreeEditorViewport::GetToolkitToolTipText() const +{ + return LOCTEXT( "SkillTreeToolTip", "Test tooltip text" ); +} + +FString FSkillTreeEditorViewport::GetWorldCentricTabPrefix() const +{ + return TEXT( "SkillTreeEditor" ); +} + +FString FSkillTreeEditorViewport::GetDocumentationLink() const +{ + return TEXT( "http://iamfromtheinternet.nl/wiki/index.php/Skill_Tree" ); +} + +FLinearColor FSkillTreeEditorViewport::GetWorldCentricTabColorScale() const +{ + return FLinearColor::White; +} + +void FSkillTreeEditorViewport::CreateModeToolbarWidgets( FToolBarBuilder& a_ignoredBuilder ) +{ + FToolBarBuilder toolbarBuilder( m_skillTreeViewport->GetCommandList(), FMultiBoxCustomization::None ); + toolbarBuilder.AddToolBarButton( FSkillTreeEditorCommands::Get().enterViewMode ); + AddToolbarWidget( toolbarBuilder.MakeWidget() ); +} + +void FSkillTreeEditorViewport::InitSkillTreeEditor( const EToolkitMode::Type a_mode, const TSharedPtr< class IToolkitHost >& a_toolkitHost, class USkillTreeObject* a_skillTree, class USkillObject* a_skill ) +{ + m_skillTreeBeingEdited = a_skillTree; + m_tmpSkills = m_skillTreeBeingEdited->skills; + if ( !a_skill ) + { + m_skillBeingEdited = NewObject(); + m_skillBeingEdited->hexMap.width = 0; + m_skillBeingEdited->hexMap.height = 0; + } + else + { + m_skillBeingEdited = a_skill; + selectedY = m_tmpSkills.Find( TSubclassOf((UClass*)m_skillBeingEdited) ); + } + + FSkillTreeEditorCommands::Register(); + + TSharedPtr skillTreeEditorPtr = SharedThis( this ); + m_skillTreeViewport = SNew( SSkillTreeEditorViewport, skillTreeEditorPtr ); + m_skillViewport = SNew( SSkillTreeEditorViewport, skillTreeEditorPtr ); + m_skillViewport->IsSkill( true ); + + const TSharedRef defaultLayout = FTabManager::NewLayout( "SkillTreeEditor_Layout_v2" ) + ->AddArea + ( + FTabManager::NewPrimaryArea() + ->SetOrientation( Orient_Vertical ) + ->Split + ( + FTabManager::NewStack() + ->SetSizeCoefficient( 0.1f ) + ->SetHideTabWell( true ) + ->AddTab( GetToolbarTabId(), ETabState::OpenedTab ) + ) + ->Split + ( + FTabManager::NewSplitter() + ->SetOrientation( Orient_Horizontal ) + ->SetSizeCoefficient( 0.9f ) + ->Split + ( + FTabManager::NewStack() + ->SetSizeCoefficient( 0.35f ) + ->SetHideTabWell( true ) + ->AddTab( FSkillTreeEditorTabs::skillTreeViewportID, ETabState::OpenedTab ) + ) + ->Split + ( + FTabManager::NewStack() + ->SetSizeCoefficient( 0.15f ) + ->SetHideTabWell( true ) + ->AddTab( FSkillTreeEditorTabs::skillTreeDetailViewportID, ETabState::OpenedTab ) + ) + ->Split + ( + FTabManager::NewStack() + ->SetSizeCoefficient( 0.35f ) + ->SetHideTabWell( true ) + ->AddTab( FSkillTreeEditorTabs::skillViewportID, ETabState::OpenedTab ) + ) + ->Split + ( + FTabManager::NewStack() + ->SetSizeCoefficient( 0.15f ) + ->SetHideTabWell( true ) + ->AddTab( FSkillTreeEditorTabs::skillDetailViewportID, ETabState::OpenedTab ) + ) + ) + ); + + // Initialize the asset editor + InitAssetEditor( a_mode, a_toolkitHost, skillTreeEditorAppName, defaultLayout, true, true, a_skillTree ); + + m_skillTreeViewport->ActivateEditMode(); + m_skillViewport->ActivateEditMode(); + + // Extend things + RegenerateMenusAndToolbars(); +} + +void FSkillTreeEditorViewport::UpdateSkills() +{ + if ( m_skillTreeBeingEdited->skills != m_tmpSkills ) + { + for ( int i = 0; i < m_tmpSkills.Num(); i++ ) + { + if ( m_tmpSkills[i] != NULL && !m_skillTreeBeingEdited->skills.Contains( m_tmpSkills[i] ) ) + { + USkillObject* tmpSkill = (USkillObject*)*m_tmpSkills[i];//m_tmpSkills[i]->GetDefaultObject(); + if ( tmpSkill != NULL ) tmpSkill->skillTree = NULL; + } + } + for ( int i = 0; i < m_skillTreeBeingEdited->skills.Num(); i++ ) + { + if ( m_skillTreeBeingEdited->skills[i] != NULL && !m_tmpSkills.Contains( m_skillTreeBeingEdited->skills[i] ) ) + { + USkillObject* tmpSkill = (USkillObject*)*m_skillTreeBeingEdited->skills[i]; //m_skillTreeBeingEdited->skills[i]->GetDefaultObject(); + if ( tmpSkill != NULL ) tmpSkill->skillTree = m_skillTreeBeingEdited; + } + } + m_tmpSkills = m_skillTreeBeingEdited->skills; + } +} + +void FSkillTreeEditorViewport::SaveAsset_Execute() +{ + TArray< UPackage* > PackagesToSave; + PackagesToSave.Add( m_skillTreeBeingEdited->GetOutermost() ); + PackagesToSave.Add( m_skillBeingEdited->GetOutermost() ); + + FEditorFileUtils::PromptForCheckoutAndSave( PackagesToSave, bCheckDirtyOnAssetSave, /*bPromptToSave=*/ false ); +} + +#undef LOCTEXT_NAMESPACE \ No newline at end of file diff --git a/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditorViewport.h b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditorViewport.h new file mode 100644 index 0000000..27ce1bc --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditorViewport.h @@ -0,0 +1,71 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// +// The Skill Tree Editor main class. +////////////////////////////////////////// + +#pragma once + +#include "Toolkits/AssetEditorToolkit.h" +#include "Toolkits/AssetEditorManager.h" + +class SSkillTreeEditorViewport; +class USkillTreeObject; +class USkillObject; + +class FSkillTreeEditorViewport : public FAssetEditorToolkit//, public FGCObject +{ +public: + //The ID of the selected Skill. + int32 selectedY = -1; + + // IToolkit interface + virtual void RegisterTabSpawners( const TSharedRef& a_tabManager ) override; + virtual void UnregisterTabSpawners( const TSharedRef& a_tabManager ) override; + // End of IToolkit interface + + // FAssetEditorToolkit + virtual FName GetToolkitFName() const override; + virtual FText GetBaseToolkitName() const override; + virtual FText GetToolkitName() const override; + virtual FText GetToolkitToolTipText() const override; + virtual FLinearColor GetWorldCentricTabColorScale() const override; + virtual FString GetWorldCentricTabPrefix() const override; + virtual FString GetDocumentationLink() const override; + virtual void SaveAsset_Execute() override; + // End of FAssetEditorToolkit + + //Set the Skill to Edit. + void SetSkillBeingEdited( USkillObject* a_skill ); + //Get the Current Skill Tree that is being edited. + USkillTreeObject* GetSkillTreeBeingEdited() const { return m_skillTreeBeingEdited; }; + //Get the Current Skill that is being edited. + USkillObject* GetSkillBeingEdited() const { return m_skillBeingEdited; }; + + void InitSkillTreeEditor( const EToolkitMode::Type a_mode, const TSharedPtr< class IToolkitHost >& a_toolkitHost, class USkillTreeObject* a_skillTree, class USkillObject* a_skill = NULL ); + + void UpdateSkills(); +protected: + // A temporary list of Skills to check agains to see if new Skills have been added. + TArray> m_tmpSkills; + + // The pointer to the current Skill Tree. + USkillTreeObject* m_skillTreeBeingEdited; + // The pointer to the current Skill. + USkillObject* m_skillBeingEdited = NULL; + + // The pointer to the Skill Tree Viewport. + TSharedPtr m_skillTreeViewport; + // The pointer to the Skill Viewport. + TSharedPtr m_skillViewport; + + // Functions to spawn the Viewports and Details + TSharedRef SpawnTab_SKViewport( const FSpawnTabArgs& a_args ); + TSharedRef SpawnTab_SViewport( const FSpawnTabArgs& a_args ); + TSharedRef SpawnTab_SKDViewport( const FSpawnTabArgs& a_args ); + TSharedRef SpawnTab_SDViewport( const FSpawnTabArgs& a_args ); + + // Creates the toolbar buttons. + void CreateModeToolbarWidgets( FToolBarBuilder& ToolbarBuilder ); +}; diff --git a/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditorViewportClient.cpp b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditorViewportClient.cpp new file mode 100644 index 0000000..d8355a0 --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditorViewportClient.cpp @@ -0,0 +1,333 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// + +#include "SkillTreeEditorPrivatePCH.h" +#include "SkillTreeEditorViewportClient.h" +#include "SceneViewport.h" + +#include "PreviewScene.h" +#include "ScopedTransaction.h" +#include "Runtime/Engine/Public/ComponentReregisterContext.h" + +#include "AssetToolsModule.h" +#include "AssetRegistryModule.h" +#include "CanvasTypes.h" +#include "CanvasItem.h" + +#include "PhysicsEngine/BodySetup2D.h" +#include "SEditorViewport.h" + +#include "SNotificationList.h" +#include "NotificationManager.h" + +#include "SkillTreeFactory.h" +#include "SkillTreeObject.h" +#include "SkillObject.h" + +#define LOCTEXT_NAMESPACE "SkillTreeEditor" + +FSkillTreeEditorViewportClient::FSkillTreeEditorViewportClient( TWeakPtr a_skillTreeEditor, TWeakPtr a_skillTreeEditorViewportPtr ) + : FEditorViewportClient( new FAssetEditorModeManager(), nullptr, a_skillTreeEditorViewportPtr ) + , m_skillTreeEditorPtr( a_skillTreeEditor ) + , m_skillTreeEditorViewportPtr( a_skillTreeEditorViewportPtr ) +{ + check( m_skillTreeEditorPtr.IsValid() && m_skillTreeEditorViewportPtr.IsValid() ); + + // The tile map editor fully supports mode tools and isn't doing any incompatible stuff with the Widget + Widget->SetUsesEditorModeTools( ModeTools ); + + PreviewScene = &m_ownedPreviewScene; + ((FAssetEditorModeManager*)ModeTools)->SetPreviewScene( PreviewScene ); + + SetRealtime( true ); + + DrawHelper.bDrawGrid = false; + + EngineShowFlags.DisableAdvancedFeatures(); + EngineShowFlags.CompositeEditorPrimitives = false; //REMINDER: Turned off. +} + +void FSkillTreeEditorViewportClient::Draw( const FSceneView* a_view, FPrimitiveDrawInterface* a_drawInterface ) +{ + FEditorViewportClient::Draw( a_view, a_drawInterface ); +} + +void FSkillTreeEditorViewportClient::DrawCanvas( FViewport& a_viewport, FSceneView& a_view, FCanvas& a_canvas ) +{ + const bool isHitTesting = a_canvas.IsHitTesting(); + if ( !isHitTesting ) + { + a_canvas.SetHitProxy( nullptr ); + } + + if ( !m_skillTreeEditorPtr.IsValid() ) + { + return; + } + + m_screenSize = a_viewport.GetSizeXY(); + + USkillTreeObject* skillTree = m_skillTreeEditorPtr.Pin()->GetSkillTreeBeingEdited(); + USkillObject* skill = m_skillTreeEditorPtr.Pin()->GetSkillBeingEdited(); + + int offsetY = -m_hexSize; + int height; + int maxY; + int width; + + if ( m_state ) + { + height = skill->hexMap.height; + if ( height % 2 != 0 ) offsetY = m_hexSize; + width = skill->hexMap.width; + maxY = height - 1; + } + else + { + height = 16; + width = 13; + maxY = 15; + } + + FLinearColor enabledColor = FLinearColor( 0.43f, 0.43f, 0.43f ); + FLinearColor disabledColor = FLinearColor( 0.10f, 0.10f, 0.10f ); + + for ( float x = 0; x < width; x++ ) + { + maxY = (maxY == (height - 1) ? height : (height - 1)); + offsetY = (offsetY == -m_hexSize ? 0 : -m_hexSize); + for ( int y = 0; y < maxY; y++ ) + { + bool test; + if ( m_state ) + { + test = skill->hexMap.Get( x, y ); + } + else + { + test = skillTree->hexMap.Get( x, y ); + } + FLinearColor hexColor = enabledColor; + if ( !test ) + { + hexColor = disabledColor; + } + float X = (x - (((float)width) / 2.0f)) * m_hexSize * 2; + float Y = ((y - (maxY / 2)) * m_hexSize * 2) + offsetY; + FCanvasNGonItem hexagonBorder( FVector2D( ( m_screenSize.X / 2 ) + X, ( m_screenSize.Y / 2 ) + Y ), FVector2D( m_hexSize, m_hexSize ), 6, hexColor ); + hexagonBorder.Draw( &a_canvas ); + + if ( m_state ) + { + FCanvasTextItem TextItem( FVector2D( ( m_screenSize.X / 2 ) + X, ( m_screenSize.Y / 2 ) + Y ), FText::Format( LOCTEXT( "PositionStr", "{0},{1}" ), FText::AsNumber( x ), FText::AsNumber( y ) ), GEngine->GetSmallFont(), FLinearColor::White ); + TextItem.EnableShadow( FLinearColor::Black ); + TextItem.bCentreX = true; + + TextItem.Draw( &a_canvas ); + } + } + } + + float hexmapWidth = ( m_screenSize.X / 2 ) + ( ( ( width - 1 ) - ( ( (float)width ) / 2.0f ) ) * m_hexSize * 2 ); + hexmapWidth += m_hexSize; + int boxWidth = ( ( m_screenSize.X - hexmapWidth ) ); + boxWidth = FMath::Clamp( boxWidth, 0, 150 ); + if ( !m_state ) + { + for ( int i = 0, y = 50; i < skillTree->skills.Num(); i++, y += 20 ) + { + if ( !skillTree->skills[i] ) continue; + if ( m_hoverY == i || m_skillTreeEditorPtr.Pin()->selectedY == i ) + { + int minboxX = m_screenSize.X - boxWidth; + int minboxY = y; + FCanvasBoxItem boxItem( FVector2D( minboxX, minboxY ), FVector2D( boxWidth, 20) ); + if ( m_hoverY == i ) boxItem.SetColor( FLinearColor::Black ); + if ( m_skillTreeEditorPtr.Pin()->selectedY == i ) boxItem.SetColor( FLinearColor::White ); + boxItem.Draw( &a_canvas ); + } + FFormatNamedArguments args; + args.Add( TEXT( "DirtyState" ), skillTree->skills[i]->GetOutermost()->IsDirty() ? FText::FromString( TEXT( "*" ) ) : FText::GetEmpty() ); + args.Add( TEXT( "SkillName" ), FText::AsCultureInvariant( skillTree->skills[i]->GetName() ) ); + const FText assetName = FText::Format( LOCTEXT( "SkillName", "{SkillName}{DirtyState}" ), args ); + FCanvasTextItem TextItem( FVector2D( m_screenSize.X - ( ( m_screenSize.X - hexmapWidth ) / 2 ), y ), assetName, GEngine->GetSmallFont(), FLinearColor::White ); + TextItem.EnableShadow( FLinearColor::Black ); + TextItem.bCentreX = true; + + TextItem.Draw( &a_canvas ); + } + } + + int minboxX = 0; + int minboxY = 50; + FCanvasTileItem enabledColorSquare( FVector2D( 0, 50 ), FVector2D( boxWidth, 20 ), enabledColor ); + FCanvasTileItem disabledColorSquare( FVector2D( 0, 70 ), FVector2D( boxWidth, 20 ), disabledColor ); + enabledColorSquare.Draw( &a_canvas ); + disabledColorSquare.Draw( &a_canvas ); + + FCanvasTextItem enabledTextItem( FVector2D( boxWidth / 2, 50 ), FText::FromString( TEXT( "Solid" ) ), GEngine->GetSmallFont(), FLinearColor::White ); + enabledTextItem.EnableShadow( FLinearColor::Black ); + enabledTextItem.bCentreX = true; + enabledTextItem.Draw( &a_canvas ); + + FCanvasTextItem disabledTextItem( FVector2D( boxWidth / 2, 70 ), FText::FromString( TEXT( "Empty" ) ), GEngine->GetSmallFont(), FLinearColor::White ); + disabledTextItem.EnableShadow( FLinearColor::Black ); + disabledTextItem.bCentreX = true; + disabledTextItem.Draw( &a_canvas ); + + FEditorViewportClient::DrawCanvas( a_viewport, a_view, a_canvas ); +} + +void FSkillTreeEditorViewportClient::MouseMove( FViewport* a_viewport, int32 a_mouseX, int32 a_mouseY ) +{ + if ( m_state ) return; + USkillTreeObject* skillTree = m_skillTreeEditorPtr.Pin()->GetSkillTreeBeingEdited(); + int width = 13; + + float hexmapWidth = ( m_screenSize.X / 2 ) + ( ( ( width - 1 ) - ( ( (float)width ) / 2.0f ) ) * m_hexSize * 2 ); + hexmapWidth += m_hexSize; + + int minboxX = m_screenSize.X - ( ( m_screenSize.X - hexmapWidth ) ); + int maxboxX = m_screenSize.X; + for ( int i = 0, y = 50; i < skillTree->skills.Num(); i++, y += 20 ) + { + int minboxY = y; + int maxboxY = y + 20; + if ( !skillTree->skills[i] ) continue; + if ( a_mouseX >= minboxX && a_mouseX <= maxboxX && a_mouseY >= minboxY && a_mouseY <= maxboxY ) + { + m_hoverY = i; + FEditorViewportClient::MouseMove( a_viewport, a_mouseX, a_mouseY ); + return; + } + } + m_hoverY = -1; + + FEditorViewportClient::MouseMove( a_viewport, a_mouseX, a_mouseY ); +} + +void FSkillTreeEditorViewportClient::InternalActivateNewMode( ) +{ + //m_currentMode = a_newMode; + Viewport->InvalidateHitProxy(); +} + +FLinearColor FSkillTreeEditorViewportClient::GetBackgroundColor() const +{ + return FLinearColor( 0.20f, 0.22f, 0.22f ); +} + +void FSkillTreeEditorViewportClient::ActivateEditMode() +{ + // Activate the skill tree edit mode + ModeTools->SetToolkitHost( m_skillTreeEditorPtr.Pin()->GetToolkitHost() ); + ModeTools->ActivateDefaultMode(); +} + +void FSkillTreeEditorViewportClient::Tick( float a_deltaSeconds ) +{ + FEditorViewportClient::Tick( a_deltaSeconds ); + + m_skillTreeEditorPtr.Pin()->UpdateSkills(); + + if ( !GIntraFrameDebuggingGameThread ) + { + m_ownedPreviewScene.GetWorld()->Tick( LEVELTICK_All, a_deltaSeconds ); + } +} + +void FSkillTreeEditorViewportClient::ProcessClick( FSceneView& a_view, HHitProxy* a_hitProxy, FKey a_key, EInputEvent a_event, uint32 a_hitX, uint32 a_hitY ) +{ + bool handled = false; + USkillTreeObject* skillTree = m_skillTreeEditorPtr.Pin()->GetSkillTreeBeingEdited(); + USkillObject* skill = m_skillTreeEditorPtr.Pin()->GetSkillBeingEdited(); + + int offsetY = -m_hexSize; + int height; + int maxY; + int width; + + if ( m_state ) + { + height = skill->hexMap.height; + width = skill->hexMap.width; + if ( height % 2 != 0 ) offsetY = m_hexSize; + maxY = height-1; + } + else + { + height = 16; + width = 13; + maxY = 15; + } + + FVector2D mpos( a_hitX, a_hitY ); + + for ( float x = 0; x < width; x++ ) + { + maxY = (maxY == (height - 1) ? height : (height - 1)); + offsetY = ( offsetY == -m_hexSize ? 0 : -m_hexSize ); + for ( int y = 0; y < maxY; y++ ) + { + float X = ( x - ( ( (float)width ) / 2.0f ) ) * m_hexSize * 2; + float Y = ( ( y - ( maxY / 2 ) ) * m_hexSize * 2 ) + offsetY; + FVector2D pos( ( m_screenSize.X / 2 ) + X, ( m_screenSize.Y / 2 ) + Y ); + float dist = FVector2D::Distance( pos, mpos ); + if ( dist <= m_hexSize ) + { + if ( !m_state ) + { + skillTree->hexMap.Invert( x, y ); + skillTree->Modify(); + skillTree->MarkPackageDirty(); + skillTree->PostEditChange(); + } + else + { + skill->hexMap.Invert( x, y ); + skill->Modify(); + skill->MarkPackageDirty(); + skill->PostEditChange(); + } + handled = true; + Invalidate(); + break; + } + } + if ( handled ) + { + break; + } + } + + if ( !handled && !m_state ) + { + float hexmapWidth = ( m_screenSize.X / 2 ) + ( ( ( width - 1 ) - ( ( (float)width ) / 2.0f ) ) * m_hexSize * 2 ); + hexmapWidth += m_hexSize; + + uint32 minboxX = m_screenSize.X - ( ( m_screenSize.X - hexmapWidth ) ); + uint32 maxboxX = m_screenSize.X; + for ( int i = 0, y = 50; i < skillTree->skills.Num(); i++, y += 20 ) + { + uint32 minboxY = y; + uint32 maxboxY = y + 20; + if ( !skillTree->skills[i] ) continue; + if ( a_hitX >= minboxX && a_hitX <= maxboxX && a_hitY >= minboxY && a_hitY <= maxboxY ) + { + m_skillTreeEditorPtr.Pin()->selectedY = i; + handled = true; + USkillObject* tmpCast = skillTree->skills[i]->GetDefaultObject(); + if ( tmpCast != NULL ) m_skillTreeEditorPtr.Pin()->SetSkillBeingEdited( tmpCast ); + } + } + } + + if ( !handled ) + { + FEditorViewportClient::ProcessClick( a_view, a_hitProxy, a_key, a_event, a_hitX, a_hitY ); + } +} + +#undef LOCTEXT_NAMESPACE \ No newline at end of file diff --git a/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditorViewportClient.h b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditorViewportClient.h new file mode 100644 index 0000000..77367bd --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeEditorViewportClient.h @@ -0,0 +1,78 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// +// The Skill Tree Editor main viewport. +// Can be used for editing a Skill Tree +// and a Skill. +////////////////////////////////////////// + +#pragma once + +#include "SkillTreeEditorViewport.h" +#include "SceneViewport.h" +#include "AssetEditorModeManager.h" +#include "PreviewScene.h" +#include "ScopedTransaction.h" +#include "AssetData.h" +#include "SkillTreeObject.h" + +class FSkillTreeEditorViewportClient : public FEditorViewportClient +{ +public: + FSkillTreeEditorViewportClient( TWeakPtr a_skillTreeEditor, TWeakPtr a_skillTreeEditorViewportPtr ); + + // FViewportClient interface + virtual void Draw( const FSceneView* a_view, FPrimitiveDrawInterface* a_drawInterface ) override; + virtual void DrawCanvas( FViewport& a_viewport, FSceneView& a_view, FCanvas& a_canvas ) override; + virtual void Tick( float a_deltaSeconds ) override; + // End of FViewportClient interface + + // FEditorViewportClient interface + virtual void ProcessClick( FSceneView& a_view, HHitProxy* a_hitProxy, FKey a_key, EInputEvent a_event, uint32 a_hitX, uint32 a_hitY ) override; + virtual void MouseMove( FViewport* a_viewport, int32 a_mouseX, int32 a_mouseY ) override; + virtual FLinearColor GetBackgroundColor() const override; + // End of FEditorViewportClient interface + + //virtual void RequestFocusOnSelection( bool a_instant ); + + void EnterViewMode() { InternalActivateNewMode( ); } + + bool IsInViewMode() const { return true; } + + void UpdateRelatedSpritesList(); + + void ActivateEditMode(); + + // Set the current state of the Viewport. + void IsSkill( bool a_state ) + { + m_state = a_state; + } + +private: + // The ID of the current hovered Skill. + int32 m_hoverY = -1; + // The current state of the Viewport. + // True = Skill + // False = Skill Tree + bool m_state = false; + + // The Viewport screen size. + FIntPoint m_screenSize; + + // The preview scene. + FPreviewScene m_ownedPreviewScene; + + // Skill Tree Editor that owns this viewport. + TWeakPtr m_skillTreeEditorPtr; + + // Pointer back to the Skill Tree viewport control that owns this. + TWeakPtr m_skillTreeEditorViewportPtr; + + // The radius of the Hexagons. + float m_hexSize = 20; + + void InternalActivateNewMode(); + +}; diff --git a/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeFactory.cpp b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeFactory.cpp new file mode 100644 index 0000000..cfd600c --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTreeEditor/Private/SkillTreeFactory.cpp @@ -0,0 +1,29 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// + +#include "SkillTreeEditorPrivatePCH.h" +#include "SkillTreeFactory.h" +#include "SkillTreeObject.h" +#include "AssetRegistryModule.h" +#include "PackageTools.h" + +#define LOCTEXT_NAMESPACE "SkillTree" + +USkillTreeFactory::USkillTreeFactory( const FObjectInitializer& ObjectInitializer ) + : Super( ObjectInitializer ) +{ + bCreateNew = true; + bEditAfterNew = true; + SupportedClass = USkillTreeObject::StaticClass(); +} + +UObject* USkillTreeFactory::FactoryCreateNew( UClass* a_class, UObject* a_parent, FName a_name, EObjectFlags a_flags, UObject* a_context, FFeedbackContext* a_warn ) +{ + USkillTreeObject* newSkillTree = NewObject( a_parent, a_class, a_name, a_flags | RF_Transactional ); + + return newSkillTree; +} + +#undef LOCTEXT_NAMESPACE \ No newline at end of file diff --git a/Plugins/SkillTree/Source/SkillTreeEditor/Public/ISkillTreeEditor.h b/Plugins/SkillTree/Source/SkillTreeEditor/Public/ISkillTreeEditor.h new file mode 100644 index 0000000..b61d129 --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTreeEditor/Public/ISkillTreeEditor.h @@ -0,0 +1,27 @@ +// Project Lab - NHTV IGAD +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// +// The Skill Tree Editor Module Interface. +////////////////////////////////////////// + +#pragma once + +#include "ModuleManager.h" + +class ISkillTreeEditor : public IModuleInterface +{ +public: + //Function to Get the Singleton of this Module if it's loaded. + static inline ISkillTreeEditor& Get() + { + return FModuleManager::LoadModuleChecked< ISkillTreeEditor >( "SkillTreeEditor" ); + } + + //Function to check if the Module is loaded. + static inline bool IsAvailable() + { + return FModuleManager::Get().IsModuleLoaded( "SkillTreeEditor" ); + } +}; + diff --git a/Plugins/SkillTree/Source/SkillTreeEditor/SkillTreeEditor.Build.cs b/Plugins/SkillTree/Source/SkillTreeEditor/SkillTreeEditor.Build.cs new file mode 100644 index 0000000..03c5f3b --- /dev/null +++ b/Plugins/SkillTree/Source/SkillTreeEditor/SkillTreeEditor.Build.cs @@ -0,0 +1,23 @@ +////////////////////////////////////////// +// Author: Yoshi van Belkom - 130118 +////////////////////////////////////////// +// The Skill Tree Editor Module Settings. +////////////////////////////////////////// + +namespace UnrealBuildTool.Rules +{ + public class SkillTreeEditor : ModuleRules + { + public SkillTreeEditor(TargetInfo Target) + { + + PrivateIncludePaths.Add("SkillTreeEditor/Private"); + + PrivateIncludePathModuleNames.AddRange(new string[] { "AssetTools" }); + + PrivateDependencyModuleNames.AddRange(new string[] { "SkillTree", "Core", "CoreUObject", "Engine", "InputCore", "Slate", "UnrealEd", "SlateCore", "EditorStyle", "Kismet", "PropertyEditor", "KismetWidgets", "ContentBrowser", "WorkspaceMenuStructure", "EditorWidgets" }); + + DynamicallyLoadedModuleNames.AddRange(new string[] { "AssetTools" }); + } + } +} \ No newline at end of file diff --git a/Source/UnrealProject/Abilities/AbilityEventGroup.cpp b/Source/UnrealProject/Abilities/AbilityEventGroup.cpp new file mode 100644 index 0000000..e725273 --- /dev/null +++ b/Source/UnrealProject/Abilities/AbilityEventGroup.cpp @@ -0,0 +1,165 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "AbilityEventGroup.h" +#include "NetworkCharacter.h" +#include "NPCBase.h" + +AAbilityEventGroup::AAbilityEventGroup() +{ + // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it. + PrimaryActorTick.bCanEverTick = true; + channelEvent = false; + stunWhileChannel = true; + progressionType = EAbilityEventGroupProgressionType::Continue; + duration = 1.0f; + m_endEventSend = false; + m_hasBeenDestroyed = false; + allowRotateWhileChannel = false; +} + +void AAbilityEventGroup::BeginPlay() +{ + check(Role == ROLE_Authority); + Super::BeginPlay(); + m_life = 0.0f; + + if(!character || character->IsActorBeingDestroyed()) + { + m_MoveToNextGroup(); + } + else + { + // Handle the destruction of the caster + character->OnDestroyed.AddDynamic(this, &AAbilityEventGroup::m_OnCharacterDestroyed); + } +} +void AAbilityEventGroup::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + check(Role == ROLE_Authority); + if(EndPlayReason == EEndPlayReason::Destroyed) + { + Super::EndPlay(EndPlayReason); + AAbilityEventGroup* nextGroup = nullptr; + if(m_nextGroups.Num() > 0) + { + //GWPRINT(L"Move next"); + nextGroup = SpawnSequence(character, abilityInfo, abilityState, m_nextGroups); + } + m_SendEndEvent(nextGroup); + } +} +void AAbilityEventGroup::Tick(float DeltaTime) +{ + Super::Tick(DeltaTime); + + if(IsPendingKill()) + return; + + m_life += DeltaTime; + if(progressionType == EAbilityEventGroupProgressionType::Continue) + { + if(m_life >= duration || m_continue) + m_MoveToNextGroup(); + } + else + { + if(m_continue) + m_MoveToNextGroup(); + } +} + +void AAbilityEventGroup::m_OnCharacterDestroyed() +{ + m_MoveToNextGroup(); +} +void AAbilityEventGroup::m_MoveToNextGroup() +{ + if(m_hasBeenDestroyed) + return; + m_hasBeenDestroyed = true; + if(IsValid(this) && !IsPendingKillPending()) + Destroy(); +} + +void AAbilityEventGroup::m_SendEndEvent(AAbilityEventGroup* next) +{ + if(!m_endEventSend) + { + onAbilityEventGroupEnded.Broadcast(abilityInfo, this, next); + m_endEventSend = true; + } +} + +void AAbilityEventGroup::Interrupt() +{ + //GPRINT("Interrupting ability"); + if(IsPendingKill()) + return; + m_nextGroups.Empty(); // Don't execute any follow up events + m_hasBeenDestroyed = true; +} + +void AAbilityEventGroup::TransitionTo(class AAbilityEventGroup* newGroup) +{ + check(newGroup); + check(abilityInfo); + check(abilityState); + newGroup->character = character; + newGroup->abilityInfo = abilityInfo; + newGroup->abilityState = abilityState; + newGroup->m_nextGroups = m_nextGroups; + m_nextGroups.Empty(); + + m_SendEndEvent(newGroup); + + //GWPRINT(L"TransitionTo next"); + m_MoveToNextGroup(); +} + +void AAbilityEventGroup::NextGroup() +{ + m_continue = true; +} + +ANetworkCharacter* AAbilityEventGroup::GetTarget() +{ + ANPCBase* creature = Cast(character); + if(creature) + { + return creature->target; + } + return nullptr; +} + +float AAbilityEventGroup::GetLifetimeRate() const +{ + float rate = m_life / duration; + return FMath::Fmod(rate, 1.0f + FLT_EPSILON); +} +float AAbilityEventGroup::GetLifetime() const +{ + return m_life; +} + +AAbilityEventGroup* AAbilityEventGroup::SpawnSequence(ANetworkCharacter* character, class UAbilityInfo* abilityInfo, class AAbilityState* abilityState, TArray> groups) +{ + UWorld* world = character->GetWorld(); + check(world); + check(groups.Num() > 0); + + AAbilityEventGroup* group = world->SpawnActorDeferred(groups[0], FTransform::Identity); + check(group); + check(abilityInfo); + check(abilityState); + + group->character = character; + group->abilityState = abilityState; + group->abilityInfo = abilityInfo; + groups.RemoveAt(0); + group->m_nextGroups = groups; + + UGameplayStatics::FinishSpawningActor(group, FTransform::Identity); + + return group; +} \ No newline at end of file diff --git a/Source/UnrealProject/Abilities/AbilityEventGroup.h b/Source/UnrealProject/Abilities/AbilityEventGroup.h new file mode 100644 index 0000000..95db905 --- /dev/null +++ b/Source/UnrealProject/Abilities/AbilityEventGroup.h @@ -0,0 +1,85 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "DealDamageProxy.h" +#include "AbilityEventGroup.generated.h" + +UENUM(BlueprintType) +enum class EAbilityEventGroupProgressionType : uint8 +{ + // Continues when the duration of the group has expired + Continue, + // Loops until the ability itself decides to continue, or is activated again + Loop +}; + + +UCLASS() +class UNREALPROJECT_API AAbilityEventGroup : public ADealDamageProxy +{ + GENERATED_BODY() + +public: + AAbilityEventGroup(); + + virtual void BeginPlay() override final; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason); + virtual void Tick(float DeltaSeconds) override final; + + // Used to construct an ability group sequence from an array of ability groups + static AAbilityEventGroup* SpawnSequence(class ANetworkCharacter* character, class UAbilityInfo* abilityInfo, class AAbilityState* abilityState, TArray> groups); + + // Try to interrupt this group chain if it's a channelEvent + void Interrupt(); + + // Changes the current group to execute this group now + void TransitionTo(class AAbilityEventGroup* newGroup); + + // Try to continue this group if it's progression type is not duration bound + UFUNCTION(BlueprintCallable, Category = "Ability") + void NextGroup(); + + // Value from 0 to 1 representing the life cycle of this event, loops back to 0 if the event is looping after the life exceeded the duration set in the group + UFUNCTION(BlueprintCallable, Category = "Ability Group") + float GetLifetimeRate() const; + UFUNCTION(BlueprintCallable, Category = "Ability Group") + float GetLifetime() const; + + UFUNCTION(BlueprintCallable, Category = "Ability") + class ANetworkCharacter* GetTarget(); + + UPROPERTY(BlueprintReadOnly, Category = "Ability Group") + class AAbilityState* abilityState; + UPROPERTY(BlueprintReadOnly, EditDefaultsOnly, Category = "Ability Group") + float duration; + UPROPERTY(EditDefaultsOnly, Category = "Ability Group") + bool channelEvent; + UPROPERTY(EditDefaultsOnly, Category = "Ability Group") + bool stunWhileChannel; + UPROPERTY(EditDefaultsOnly, Category = "Ability Group") + bool allowRotateWhileChannel; + + // Setting this to true makes the ability + UPROPERTY(EditDefaultsOnly, Category = "Ability Group") + EAbilityEventGroupProgressionType progressionType; + + // Called when the group's duration has expired or NextGroup is called + DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnAbilityEventGroupEnded, class UAbilityInfo*, ability, class AAbilityEventGroup*, current, class AAbilityEventGroup*, next); + FOnAbilityEventGroupEnded onAbilityEventGroupEnded; + +private: + UFUNCTION() + void m_OnCharacterDestroyed(); + void m_MoveToNextGroup(); + void m_SendEndEvent(AAbilityEventGroup* next = nullptr); + + float m_life; + + UPROPERTY() + TArray> m_nextGroups; + + bool m_hasBeenDestroyed; + bool m_endEventSend; + bool m_continue; +}; diff --git a/Source/UnrealProject/Abilities/AbilityFilter.h b/Source/UnrealProject/Abilities/AbilityFilter.h new file mode 100644 index 0000000..11d8aa7 --- /dev/null +++ b/Source/UnrealProject/Abilities/AbilityFilter.h @@ -0,0 +1,17 @@ +// Project Lab - NHTV Igad + +#pragma once +#include "AbilityFilter.generated.h" + +#define ABILITY_FILTER_ENEMY 0x1 +#define ABILITY_FILTER_ALLY 0x2 +#define ABILITY_FILTER_SELF 0x10 + +UENUM(BlueprintType) +enum class EAbilityFilter : uint8 +{ + EnemyAll = 0x1, + AllyAll = 0x2, + All = 0x3, + Self = 0x10, +}; \ No newline at end of file diff --git a/Source/UnrealProject/Abilities/AbilityInfo.cpp b/Source/UnrealProject/Abilities/AbilityInfo.cpp new file mode 100644 index 0000000..a5e8cfb --- /dev/null +++ b/Source/UnrealProject/Abilities/AbilityInfo.cpp @@ -0,0 +1,56 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "AbilityInfo.h" +#include "AbilityState.h" + +namespace +{ + inline uint32 Hash32(const void* data, uint32 length) + { + const uint32 offset = 2166136261U; + const uint32 prime = 16777619U; + const unsigned char* data_bytes = (const unsigned char*)data; + + uint32 value = offset; + for (uint32 next = 0; next < length; ++next) + { + value ^= (uint32)data_bytes[next]; + value *= prime; + } + return value; + } +} + +UAbilityInfo::UAbilityInfo() +{ + name = L""; + description = L""; + cooldown = 1.0f; + AICastRange = 0.0f; + rotateTowardsPlayer = false; + abilityState = AAbilityState::StaticClass(); + + FString strName = GetPathName(); + m_hash = Hash32(strName.GetCharArray().GetData(), strName.Len() * sizeof(wchar_t)); +} + +uint32 UAbilityInfo::GetStaticHash() const +{ + return m_hash; +} + +void AAbilityState::NativeSetCooldown() +{ + SetCooldown(); + cooldownRate = (currentCooldownDuration > 0.0f) ? (onCooldownTimer / currentCooldownDuration) : 0.0f; +} +void AAbilityState::SetCooldown_Implementation() +{ + currentCooldownDuration = info->cooldown; + onCooldownTimer = currentCooldownDuration; +} +bool AAbilityState::IsMaxed() const +{ + return power >= 1.0f; +} \ No newline at end of file diff --git a/Source/UnrealProject/Abilities/AbilityInfo.h b/Source/UnrealProject/Abilities/AbilityInfo.h new file mode 100644 index 0000000..0386911 --- /dev/null +++ b/Source/UnrealProject/Abilities/AbilityInfo.h @@ -0,0 +1,96 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Engine/DataAsset.h" +#include "Items/ItemBase.h" +#include "AbilityInfo.generated.h" + +UENUM(BlueprintType) +enum class EAbilityCategory : uint8 +{ + Unassigned = 0, + Ranged, + Melee +}; +UENUM(BlueprintType) +enum class EAbilityType : uint8 +{ + Basic, + Ability +}; +UENUM(BlueprintType) +enum class EAbilityActionType : uint8 +{ + Normal, + Toggle, + Hold +}; + + +USTRUCT() +struct FAbilityItem +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere) + USkeletalMesh* mesh; + UPROPERTY(EditAnywhere) + EItemTypeEnum type; +}; + +UCLASS(BlueprintType) +class UNREALPROJECT_API UAbilityInfo : public UDataAsset +{ + GENERATED_BODY() +public: + UAbilityInfo(); + + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Ability") + FString name; + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Ability") + FString description; + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Ability") + float cooldown; + UPROPERTY(EditDefaultsOnly) + TArray> events; + UPROPERTY(EditDefaultsOnly) + TSubclassOf precastEvent; + UPROPERTY(EditDefaultsOnly) + TSubclassOf abilityState; + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Ability") + UTexture2D* icon; + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Ability") + float AICastRange; + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Ability") + bool passive; + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Ability") + bool rotateTowardsPlayer; + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Ability") + int32 mana; + + // The action type of the ability, Toggle, Hold or Normal + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Ability") + EAbilityActionType actionType; + // The type of the ability Ability(On AbilityBar) or Basic(Left Mouse Click). + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Ability") + EAbilityType abilityType; + // If the ability is Ranged or Melee + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Ability") + EAbilityCategory abilityCategory; + + UPROPERTY(EditAnywhere) + bool isVisible; + UPROPERTY(EditAnywhere, meta = (EditCondition = "isVisible")) + TArray itemsToEquip; + + bool IsHoldOrToggle() const + { + return actionType == EAbilityActionType::Hold || actionType == EAbilityActionType::Toggle; + } + + uint32 GetStaticHash() const; + +private: + uint32 m_hash; +}; diff --git a/Source/UnrealProject/Abilities/AbilityState.h b/Source/UnrealProject/Abilities/AbilityState.h new file mode 100644 index 0000000..7c5c22e --- /dev/null +++ b/Source/UnrealProject/Abilities/AbilityState.h @@ -0,0 +1,37 @@ +// Project Lab - NHTV Igad + +#pragma once +#include "AbilityState.generated.h" + +UCLASS() +class AAbilityState : public AActor +{ + GENERATED_BODY() +public: + // Sets the ability to be on cooldown + virtual void NativeSetCooldown(); + UFUNCTION(BlueprintNativeEvent, Category = "Ability State") + void SetCooldown(); + + UFUNCTION(BlueprintCallable, Category = "Ability State") + bool IsMaxed() const; + + // Total duration of cooldown + UPROPERTY(BlueprintReadWrite) + float currentCooldownDuration; + + // Current state of cooldown going from max->0 + UPROPERTY(BlueprintReadWrite) + float onCooldownTimer; + + // Current state of cooldown going from 1->0 + UPROPERTY(BlueprintReadOnly) + float cooldownRate; + + UPROPERTY(BlueprintReadOnly) + float power; + UPROPERTY(BlueprintReadOnly) + bool toggleState; + UPROPERTY(BlueprintReadOnly) + class UAbilityInfo* info; +}; diff --git a/Source/UnrealProject/Abilities/AbilityTriggerBase.cpp b/Source/UnrealProject/Abilities/AbilityTriggerBase.cpp new file mode 100644 index 0000000..e57b096 --- /dev/null +++ b/Source/UnrealProject/Abilities/AbilityTriggerBase.cpp @@ -0,0 +1,221 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "NetworkCharacter.h" +#include "AbilityTriggerBase.h" +#include "BlueprintAbilityLibrary.h" + + +AAbilityTriggerBase::AAbilityTriggerBase() +{ + PrimaryActorTick.bCanEverTick = true; + + filter = EAbilityFilter::EnemyAll; + autoDestroy = true; + bReplicateMovement = true; + bReplicates = true; + duration = 1.0f; + ticksPerSecond = 0.0f; + m_lifeTime = 0.0f; +} + +void AAbilityTriggerBase::BeginPlay() +{ + if (Role == ROLE_Authority) + { + if (!character) + { + GWERROR(L"No owner assigned to trigger " + GetName()); + this->SetActorEnableCollision(false); + Destroy(); + } + if (ticksPerSecond > 0) + { + m_tickTime = 1.0f / ticksPerSecond; + } + else + { + m_tickTime = 0.0f; + } + } + + //make sure the collision delegates are working + UShapeComponent* root = Cast(RootComponent); + if (root != nullptr && !delegatesSet) + { + root->OnComponentBeginOverlap.AddDynamic(this, &AAbilityTriggerBase::OnOverlapBegin); + root->OnComponentEndOverlap.AddDynamic(this, &AAbilityTriggerBase::OnOverlapEnd); + delegatesSet = true; + } + else + FWARNING("rootComponent is not a UShapeComponent"); + Super::BeginPlay(); + if (Role == ROLE_Authority) + UpdateOverlaps(); +} + + +void AAbilityTriggerBase::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + if (Role == ROLE_Authority) + { + while (m_actorsInside.Num()>0) + { + if (IsValid(m_actorsInside.GetData()[0])) + { + LeaveEvent(Cast(m_actorsInside.GetData()[0])); + } + } + } + Super::EndPlay(EndPlayReason); +} + +void AAbilityTriggerBase::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + DOREPLIFETIME_CONDITION(AAbilityTriggerBase, duration, COND_InitialOnly); +} + +void AAbilityTriggerBase::Tick(float DeltaTime) +{ + m_lifeTime += DeltaTime; + + Super::Tick(DeltaTime); + + if(Role != ROLE_Authority || !IsValid(this)) + return; + + UpdateOverlaps(); + if(autoDestroy && m_lifeTime >= duration) + { + Destroy(); + return; + } + + if(m_tickTime > 0) + { + m_tickTimer += DeltaTime; + while(m_tickTimer > m_tickTime) + { + m_tickTimer -= m_tickTime; + for(AActor* actorInside : m_actorsInside) + { + if (CollisionCheck(Cast(actorInside))) + { + OnTriggerTick(Cast(actorInside)); + NativeOnLocalTriggerTick(Cast(actorInside)); + } + } + } + } +} + +void AAbilityTriggerBase::OnOverlapBegin(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) +{ + if(Role != ROLE_Authority) + return; + + if(OtherActor == NULL) + { + FWPRINT(L"Error - wrong otherunit on OnOverlapBegin "); + return; + } + if(character == NULL) + { + FWPRINT(L"Error - m_character NULL on OnOverlapBegin "); + return; + } + + ANetworkCharacter* otherUnit = Cast(OtherActor); + if(!otherUnit->GetHitable()) + return; + if(!ULib::CheckAbilityFilter(filter, character, otherUnit)) + return; + if(hitOnce && m_CheckActorsHit(otherUnit)) + return; + + m_actorsInside.Add(OtherActor); + if (CollisionCheck(Cast(OtherActor))) + { + HitEvent(otherUnit); + } +} + + +void AAbilityTriggerBase::OnOverlapEnd(class AActor * OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex) +{ + if(Role == ROLE_Authority) + LeaveEvent(Cast(OtherActor)); +} + +void AAbilityTriggerBase::HitEvent(class ANetworkCharacter* otherUnit) +{ + if (hitOnce) + m_actorsHit.Add(otherUnit); + OnTriggerHit(otherUnit); +} +void AAbilityTriggerBase::LeaveEvent(class ANetworkCharacter* otherActor) +{ + if (Role == ROLE_Authority) + { + for (auto it = (m_actorsInside.CreateIterator()); it; it++) + { + if (*it == otherActor) + { + m_actorsInside.Remove(otherActor); + break; + } + } + + if (!ULib::CheckAbilityFilter(filter, character, otherActor)) + return; + OnTriggerLeave(otherActor); + } +} + +float AAbilityTriggerBase::GetLifeTime() const +{ + return m_lifeTime; +} + +float AAbilityTriggerBase::GetLifeTimeRate() const +{ + return FMath::Clamp(m_lifeTime / duration, 0.0f, 1.0f); +} + +bool AAbilityTriggerBase::m_CheckActorsHit(class ANetworkCharacter* otherUnit) +{ + for (ANetworkCharacter* character : m_actorsHit) + { + if (character == otherUnit) + return true; + } + return false; +} + +bool AAbilityTriggerBase::CollisionCheck(ANetworkCharacter* otheractor) +{ + return IsValid(otheractor); +} +void AAbilityTriggerBase::OnTriggerHit_Implementation(ANetworkCharacter* actor) +{ + +} +void AAbilityTriggerBase::OnTriggerTick_Implementation(ANetworkCharacter* actor) +{ + +} +void AAbilityTriggerBase::OnTriggerLeave_Implementation(ANetworkCharacter* actor) +{ + +} + +void AAbilityTriggerBase::OnLocalTriggerTick_Implementation(ANetworkCharacter* actor) +{ + +} + +void AAbilityTriggerBase::NativeOnLocalTriggerTick_Implementation(ANetworkCharacter* actor) +{ + OnLocalTriggerTick(actor); +} \ No newline at end of file diff --git a/Source/UnrealProject/Abilities/AbilityTriggerBase.h b/Source/UnrealProject/Abilities/AbilityTriggerBase.h new file mode 100644 index 0000000..91f727e --- /dev/null +++ b/Source/UnrealProject/Abilities/AbilityTriggerBase.h @@ -0,0 +1,71 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "DealDamageProxy.h" +#include "AbilityFilter.h" +#include "AbilityTriggerBase.generated.h" + + +UCLASS() +class UNREALPROJECT_API AAbilityTriggerBase : public ADealDamageProxy +{ + GENERATED_BODY() + +public: + AAbilityTriggerBase(); + + virtual void BeginPlay() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + virtual void Tick( float DeltaSeconds ) override; + virtual bool CollisionCheck(ANetworkCharacter* otheractor); + + UFUNCTION() + void OnOverlapBegin(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult); + UFUNCTION() + void OnOverlapEnd(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex); + + virtual void HitEvent(class ANetworkCharacter* otherActor); + virtual void LeaveEvent(class ANetworkCharacter* otherActor); + + UFUNCTION(BlueprintCallable, Category="Ability") + float GetLifeTime() const; + UFUNCTION(BlueprintCallable, Category="Ability") + float GetLifeTimeRate() const; + + UPROPERTY(BlueprintReadWrite, Replicated, Category = "Ability", meta = (ExposeOnSpawn)) + float duration; + UPROPERTY(BlueprintReadWrite, Category = "Ability", meta = (ExposeOnSpawn)) + bool hitOnce; + + UPROPERTY(BlueprintReadWrite, meta = (ExposeOnSpawn)) + EAbilityFilter filter; + + UFUNCTION(BlueprintNativeEvent) + void OnTriggerHit(ANetworkCharacter* actor); + UFUNCTION(BlueprintNativeEvent) + void OnTriggerTick(ANetworkCharacter* actor); + UFUNCTION(BlueprintCallable, NetMulticast, Reliable, Category = "trigger") + void NativeOnLocalTriggerTick(ANetworkCharacter* actor); + + UFUNCTION(BlueprintNativeEvent) + void OnLocalTriggerTick(ANetworkCharacter* actor); + UFUNCTION(BlueprintNativeEvent) + void OnTriggerLeave(ANetworkCharacter* actor); + + UPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = "Ability", meta = (ExposeOnSpawn)) + bool autoDestroy; + UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = "Ability", meta = (ExposeOnSpawn)) + float ticksPerSecond; + bool m_CheckActorsHit(class ANetworkCharacter* otherUnit); + + + +protected: + TArray m_actorsInside; + TArray m_actorsHit; + float m_tickTime; + float m_lifeTime; + float m_tickTimer; + bool delegatesSet = false; +}; diff --git a/Source/UnrealProject/Abilities/AuraTrigger.cpp b/Source/UnrealProject/Abilities/AuraTrigger.cpp new file mode 100644 index 0000000..9f1ea32 --- /dev/null +++ b/Source/UnrealProject/Abilities/AuraTrigger.cpp @@ -0,0 +1,31 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "Modifier.h" +#include "NetworkCharacter.h" +#include "AuraTrigger.h" + + + + + +AModifier* AAuraTrigger::GetModifier(class ANetworkCharacter* targetCharacter) +{ + auto it = data.Find(targetCharacter); + if (it==nullptr) + return nullptr; + return *it; +} +void AAuraTrigger::SetModifier(class ANetworkCharacter* targetCharacter, AModifier* modifier) +{ + data.Add(targetCharacter, modifier); +} + +void AAuraTrigger::Tick(float DeltaSeconds) +{ + Super::Tick(DeltaSeconds); + if (Role == ROLE_Authority && IsValid(followObject)) + { + SetActorLocation(followObject->GetActorLocation()); + } +} \ No newline at end of file diff --git a/Source/UnrealProject/Abilities/AuraTrigger.h b/Source/UnrealProject/Abilities/AuraTrigger.h new file mode 100644 index 0000000..cae920e --- /dev/null +++ b/Source/UnrealProject/Abilities/AuraTrigger.h @@ -0,0 +1,26 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Abilities/ConeTrigger.h" +#include "AuraTrigger.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API AAuraTrigger : public AConeTrigger +{ + GENERATED_BODY() + +public: + virtual void Tick(float DeltaSeconds) override; + UFUNCTION(BlueprintCallable, category = "Trigger") + class AModifier* GetModifier(class ANetworkCharacter* targetCharacter); + UFUNCTION(BlueprintCallable, category = "Trigger") + void SetModifier(class ANetworkCharacter* targetCharacter, AModifier* modifier); + UPROPERTY() + TMap data; + UPROPERTY(BlueprintReadWrite, Category = "Ability", meta = (ExposeOnSpawn)) + AActor* followObject; +}; diff --git a/Source/UnrealProject/Abilities/BlueprintAbilityLibrary.cpp b/Source/UnrealProject/Abilities/BlueprintAbilityLibrary.cpp new file mode 100644 index 0000000..91f4603 --- /dev/null +++ b/Source/UnrealProject/Abilities/BlueprintAbilityLibrary.cpp @@ -0,0 +1,326 @@ +#include "UnrealProject.h" +#include "BlueprintAbilityLibrary.h" + +#include "DealDamageProxy.h" +#include "AbilityEventGroup.h" +#include "AbilityTriggerBase.h" +#include "Modifier.h" +#include "NetworkCharacter.h" +#include "ProjectileBase.h" +#include "Class.h" + +ULib::ULib(const FObjectInitializer& init) + : Super(init) +{ +} +AActor* ULib::BeginSpawning2(UObject* WorldContextObject, TSubclassOf ActorClass) +{ + return UGameplayStatics::BeginDeferredActorSpawnFromClass(WorldContextObject, ActorClass, FTransform()); +} +AActor* ULib::FinishSpawning2(class AActor* Actor) +{ + if(!Actor) + return nullptr; + return UGameplayStatics::FinishSpawningActor(Actor, FTransform()); +} + +AActor* ULib::BeginSpawningGroup(UObject* WorldContextObject, TSubclassOf ActorClass) +{ + if(!WorldContextObject->GetWorld()->GetAuthGameMode()) + return nullptr; + AActor* actor = UGameplayStatics::BeginDeferredActorSpawnFromClass(WorldContextObject, ActorClass, FTransform()); + if(!actor) + return nullptr; + AAbilityEventGroup* newGroup = Cast(actor); + check(newGroup); + + AAbilityEventGroup* parent = Cast(WorldContextObject); + //GWPRINT(L"Parent = " + parent); + if(!parent) + { + GWERROR(L"Cannot call FinishSpawningGroup from any other source than AAbilityEventGroup"); + newGroup->Destroy(); + return nullptr; + } + parent->TransitionTo(newGroup); + return newGroup; +} +AActor* ULib::FinishSpawningGroup(class AActor* Actor) +{ + if(!Actor) + return nullptr; + return FinishSpawning2(Actor); +} + +AActor* ULib::BeginSpawningModifier(UObject* WorldContextObject, TSubclassOf ActorClass) +{ + if(!WorldContextObject->GetWorld()->GetAuthGameMode()) + return nullptr; + AActor* actor = UGameplayStatics::BeginDeferredActorSpawnFromClass(WorldContextObject, ActorClass, FTransform()); + if(!actor) + return nullptr; + AModifier* newModifier = Cast(actor); + check(newModifier); + + ADealDamageProxy* damageProxy = Cast(WorldContextObject); + if(damageProxy) + { + newModifier->character = damageProxy->character; + newModifier->abilityInfo = damageProxy->abilityInfo; + } + else + { + GWERROR(L"Cannot spawn modifier from a source that is not a ADealDamageProxy"); + newModifier->Destroy(); + return nullptr; + } + return newModifier; +} +AActor* ULib::FinishSpawningModifier(class AActor* Actor, class ANetworkCharacter* target) +{ + if(!IsValid(Actor)) + return nullptr; + AModifier* mod = Cast(Actor); + if(!IsValid(target)) + { + FString name = ""; + if(mod->abilityInfo) + name = mod->abilityInfo->GetName(); + GWERROR(L"Modifier needs a target (spawned by " + name + L")"); + Actor->Destroy(); + return nullptr; + } + //GWPRINT(L"Modifier Target = " + target); + ModifierManager* mm = target->GetModifierManager(); + if(!mm) + { + GWWARNING(L"Can't spawn modifier on a target that doesn't have a modifier manager. Might be in the process of destroying"); + Actor->Destroy(); + return nullptr; + } + mod->target = target; + check(mod); + mm->AddModifier(mod); + + return FinishSpawning2(Actor); +} + +AActor* ULib::BeginSpawningTrigger(UObject* WorldContextObject, TSubclassOf ActorClass, const FTransform& SpawnTransform) +{ + if(!WorldContextObject->GetWorld()->GetAuthGameMode()) + return nullptr; + AActor* actor = UGameplayStatics::BeginDeferredActorSpawnFromClass(WorldContextObject, ActorClass, SpawnTransform); + if(!actor) + return nullptr; + AAbilityTriggerBase* newTrigger = Cast(actor); + check(newTrigger); + ADealDamageProxy* damageProxy = Cast(WorldContextObject); + if(damageProxy) + { + newTrigger->character = damageProxy->character; + newTrigger->abilityInfo = damageProxy->abilityInfo; + } + else + { + GWERROR(L"Cannot spawn trigger from a source that is not a ADealDamageProxy"); + actor->Destroy(); + return nullptr; + } + return newTrigger; +} +AActor* ULib::FinishSpawningTrigger(class AActor* Actor, const FTransform & SpawnTransform) +{ + if(!Actor) + return nullptr; + return UGameplayStatics::FinishSpawningActor(Actor, SpawnTransform); +} + +AActor* ULib::BeginSpawningProjectile(UObject* WorldContextObject, TSubclassOf ActorClass, const FTransform& SpawnTransform) +{ + if(!WorldContextObject->GetWorld()->GetAuthGameMode()) + return nullptr; + AActor* actor = UGameplayStatics::BeginDeferredActorSpawnFromClass(WorldContextObject, ActorClass, SpawnTransform); + if(!actor) + return nullptr; + AProjectileBase* newProjectile = Cast(actor); + check(newProjectile); + ADealDamageProxy* damageProxy = Cast(WorldContextObject); + if(damageProxy) + { + newProjectile->character = damageProxy->character; + newProjectile->abilityInfo = damageProxy->abilityInfo; + } + else + { + GWERROR(L"Cannot spawn projectile from a source that is not a ADealDamageProxy"); + actor->Destroy(); + return nullptr; + } + return newProjectile; +} +AActor* ULib::FinishSpawningProjectile(class AActor* Actor, const FTransform& SpawnTransform) +{ + return UGameplayStatics::FinishSpawningActor(Actor, SpawnTransform); +} + +bool ULib::IsContainedInCone(FVector origin, FVector forward, float coneAngle, AActor* other) +{ + if(other->IsPendingKillPending()) + return false; + + //always hits at 360 degrees + if(coneAngle >= 360.0f) + return true; + + FVector dist = other->GetActorLocation() - origin; + dist.Normalize(); + forward.Normalize(); + float dot = FVector::DotProduct(dist, forward); + float angle = acosf(dot); + + float tempMaxAngle = coneAngle / 360; + tempMaxAngle *= PI; + + bool ret = tempMaxAngle > angle; + return ret; +} +int32 ULib::CharacterConeOverlap(UObject* WorldContextObject, FVector origin, float coneRadius, + FCharacterConeOverlapCallback callback, FVector forward, float coneAngle, EAbilityFilter filter) +{ + UWorld* world = GEngine->GetWorldFromContextObject(WorldContextObject); + check(world); + + if(world->GetAuthGameMode() == nullptr) + return 0; + m_overlapResultArray.Empty(); + // Get the character + ANetworkCharacter* character = Cast(WorldContextObject); + if(!character) + { + ADealDamageProxy* proxy = Cast(WorldContextObject); + if(!proxy) + { + GWERROR(L"CharacterConeOverlap failed, no caller character or proxy"); + return 0; + } + character = proxy->character; + } + + FCollisionShape shape; + shape.SetCapsule(coneRadius, 400.0f); + + TArray overlaps; + if(!world->OverlapMultiByObjectType( + overlaps, origin, FQuat::Identity, + FCollisionObjectQueryParams::AllDynamicObjects, shape, + FCollisionQueryParams::DefaultQueryParam)) + { + return 0; + } + TArray test; + if(callback.IsBound()) + { + for(int32 i = 0; i < overlaps.Num(); i++) + { + FOverlapResult& overlap = overlaps[i]; + ANetworkCharacter* target = Cast(overlap.GetActor()); + if (target && (overlap.Component->GetCollisionProfileName() == FName("Units") || overlap.Component->GetCollisionProfileName() == FName("Players")) && + IsContainedInCone(origin, forward, coneAngle, target) && + ULib::CheckAbilityFilter(filter, character, target)) + { + + callback.Execute(target); + m_overlapResultArray.Add(target); + } + } + } + // = test; + return overlaps.Num(); +} + +int32 ULib::ClosestCharacterConeOverlap(UObject* WorldContextObject, FVector origin, float coneRadius, + FClosestCharacterConeOverlapCallback callback, FVector forward, float coneAngle, EAbilityFilter filter) +{ + UWorld* world = GEngine->GetWorldFromContextObject(WorldContextObject); + check(world); + + if (world->GetAuthGameMode() == nullptr) + return 0; + + // Get the character + ANetworkCharacter* character = Cast(WorldContextObject); + if (!character) + { + ADealDamageProxy* proxy = Cast(WorldContextObject); + if (!proxy) + { + GWERROR(L"CharacterConeOverlap failed, no caller character or proxy"); + return 0; + } + character = proxy->character; + } + + FCollisionShape shape; + shape.SetCapsule(coneRadius, 400.0f); + + TArray overlaps; + if (!world->OverlapMultiByObjectType( + overlaps, origin, FQuat::Identity, + FCollisionObjectQueryParams::AllDynamicObjects, shape, + FCollisionQueryParams::DefaultQueryParam)) + { + return 0; + } + ANetworkCharacter* closest = nullptr; + float dist = 9999999999999.0f; + if (callback.IsBound()) + { + for (int32 i = 0; i < overlaps.Num(); i++) + { + FOverlapResult& overlap = overlaps[i]; + ANetworkCharacter* target = Cast(overlap.GetActor()); + if (target && IsContainedInCone(origin, forward, coneAngle, target) && ULib::CheckAbilityFilter(filter, character, target)) + { + if ((target->GetActorLocation() - origin).Size() < dist) + { + closest = target; + dist = (target->GetActorLocation() - origin).Size(); + } + } + } + } + if(closest) + callback.Execute(closest); + return overlaps.Num(); + +} +TArray ULib::m_overlapResultArray; +bool ULib::CheckAbilityFilter(EAbilityFilter filter, class ANetworkCharacter* self, class ANetworkCharacter* other) +{ + if(!self) + return false; + if(!other) + return false; + if(((uint8)filter & ABILITY_FILTER_ENEMY) != 0) + { + if(self->GetTeam() != other->GetTeam()) + return true; + } + if(((uint8)filter & ABILITY_FILTER_ALLY) != 0) + { + if(self->GetTeam() == other->GetTeam()) + return true; + } + return false; +} + +TArrayULib::GetCharacterOverlaps() +{ + TArray returnArray; + for (ANetworkCharacter* character : m_overlapResultArray) + { + if(IsValid(character)) + returnArray.Add(character); + } + return returnArray; +} \ No newline at end of file diff --git a/Source/UnrealProject/Abilities/BlueprintAbilityLibrary.h b/Source/UnrealProject/Abilities/BlueprintAbilityLibrary.h new file mode 100644 index 0000000..a7e53b3 --- /dev/null +++ b/Source/UnrealProject/Abilities/BlueprintAbilityLibrary.h @@ -0,0 +1,59 @@ +#pragma once +#include "Kismet/BlueprintFunctionLibrary.h" +#include "AbilityFilter.h" +#include "BlueprintAbilityLibrary.Generated.h" + +UCLASS() +class ULib : public UBlueprintFunctionLibrary +{ + GENERATED_UCLASS_BODY() + +public: + UFUNCTION(BlueprintCallable, Category = "Spawning", meta = (WorldContext = "WorldContextObject", UnsafeDuringActorConstruction = "true", BlueprintInternalUseOnly = "true")) + static AActor* BeginSpawning2(UObject* WorldContextObject, TSubclassOf ActorClass); + UFUNCTION(BlueprintCallable, Category = "Spawning", meta = (UnsafeDuringActorConstruction = "true", BlueprintInternalUseOnly = "true")) + static AActor* FinishSpawning2(class AActor* Actor); + + UFUNCTION(BlueprintCallable, Category = "Spawning", meta = (WorldContext = "WorldContextObject", UnsafeDuringActorConstruction = "true", BlueprintInternalUseOnly = "true")) + static AActor* BeginSpawningGroup(UObject* WorldContextObject, TSubclassOf ActorClass); + UFUNCTION(BlueprintCallable, Category = "Spawning", meta = (UnsafeDuringActorConstruction = "true", BlueprintInternalUseOnly = "true")) + static AActor* FinishSpawningGroup(class AActor* Actor); + + UFUNCTION(BlueprintCallable, Category = "Spawning", meta = (WorldContext = "WorldContextObject", UnsafeDuringActorConstruction = "true", BlueprintInternalUseOnly = "true")) + static AActor* BeginSpawningModifier(UObject* WorldContextObject, TSubclassOf ActorClass); + UFUNCTION(BlueprintCallable, Category = "Spawning", meta = (UnsafeDuringActorConstruction = "true", BlueprintInternalUseOnly = "true")) + static AActor* FinishSpawningModifier(class AActor* Actor, class ANetworkCharacter* Target); + + UFUNCTION(BlueprintCallable, Category = "Spawning", meta = (WorldContext = "WorldContextObject", UnsafeDuringActorConstruction = "true", BlueprintInternalUseOnly = "true")) + static AActor* BeginSpawningTrigger(UObject* WorldContextObject, TSubclassOf ActorClass, const FTransform& SpawnTransform); + UFUNCTION(BlueprintCallable, Category = "Spawning", meta = (UnsafeDuringActorConstruction = "true", BlueprintInternalUseOnly = "true")) + static AActor* FinishSpawningTrigger(class AActor* Actor, const FTransform& SpawnTransform); + + UFUNCTION(BlueprintCallable, Category = "Spawning", meta = (WorldContext = "WorldContextObject", UnsafeDuringActorConstruction = "true", BlueprintInternalUseOnly = "true")) + static AActor* BeginSpawningProjectile(UObject* WorldContextObject, TSubclassOf ActorClass, const FTransform& SpawnTransform); + UFUNCTION(BlueprintCallable, Category = "Spawning", meta = (UnsafeDuringActorConstruction = "true", BlueprintInternalUseOnly = "true")) + static AActor* FinishSpawningProjectile(class AActor* Actor, const FTransform& SpawnTransform); + + UFUNCTION(BlueprintCallable, Category = "Trigger") + static bool IsContainedInCone(FVector origin, FVector forward, float coneAngle, AActor* other); + + DECLARE_DYNAMIC_DELEGATE_OneParam(FCharacterConeOverlapCallback, class ANetworkCharacter*, character); + UFUNCTION(BlueprintCallable, Category = "Trigger", meta = (WorldContext = "WorldContextObject")) + static int32 CharacterConeOverlap(UObject* WorldContextObject, FVector origin, float coneRadius, + FCharacterConeOverlapCallback callback, FVector forward = FVector(1, 0, 0), float coneAngle = 360.0f, EAbilityFilter filter = EAbilityFilter::EnemyAll); + UFUNCTION(BlueprintCallable, Category = "Trigger", meta = (WorldContext = "WorldContextObject")) + static TArray GetCharacterOverlaps(); + + DECLARE_DYNAMIC_DELEGATE_OneParam(FClosestCharacterConeOverlapCallback, class ANetworkCharacter*, character); + UFUNCTION(BlueprintCallable, Category = "Trigger", meta = (WorldContext = "WorldContextObject")) + static int32 ClosestCharacterConeOverlap(UObject* WorldContextObject, FVector origin, float coneRadius, + FClosestCharacterConeOverlapCallback callback, FVector forward = FVector(1, 0, 0), float coneAngle = 360.0f, EAbilityFilter filter = EAbilityFilter::EnemyAll); + + UFUNCTION(BlueprintCallable, Category = "Damage Proxy") + static bool CheckAbilityFilter(EAbilityFilter filter, class ANetworkCharacter* self, class ANetworkCharacter* other); + + static TArray m_overlapResultArray; + +private: + +}; \ No newline at end of file diff --git a/Source/UnrealProject/Abilities/BombProjectile.cpp b/Source/UnrealProject/Abilities/BombProjectile.cpp new file mode 100644 index 0000000..3dc7f08 --- /dev/null +++ b/Source/UnrealProject/Abilities/BombProjectile.cpp @@ -0,0 +1,58 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "BombProjectile.h" +#include "NetworkCharacter.h" + +#include "Effect.h" +#include "EffectFunctionLibrary.h" +#include "BlueprintAbilityLibrary.h" + + +ABombProjectile::ABombProjectile() +{ + PrimaryActorTick.bCanEverTick = true; + + m_progress = 0.0f; + maxDistance = 100000.0f; +} + +void ABombProjectile::BeginPlay() +{ + Super::BeginPlay(); + travelTime = travelTime < 0.01f ? 0.01f : travelTime; + + float distance = FVector::Dist(source, target); +} + +void ABombProjectile::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + + DOREPLIFETIME_CONDITION(ABombProjectile, source, COND_InitialOnly); + DOREPLIFETIME_CONDITION(ABombProjectile, target, COND_InitialOnly); + DOREPLIFETIME_CONDITION(ABombProjectile, travelTime, COND_InitialOnly); +} + +void ABombProjectile::NativeFixedProjectileTick(float DeltaTime) +{ + if(travelTime <= 0 || m_finished) + return; + + m_progress += DeltaTime; + if(m_progress >= travelTime) + m_progress = travelTime; + + const float lerp = m_progress / travelTime; + const float sin = FMath::Sin(lerp * PI); + FVector newLocation = FMath::Lerp(source, target, lerp) + FVector(0, 0, sin * travelHeight); + SetActorLocation(newLocation, true); + + float distToEnd = (target - newLocation).Size(); + + if(lerp >= 1.0f) + { + // Server only + Finish(); + } +} \ No newline at end of file diff --git a/Source/UnrealProject/Abilities/BombProjectile.h b/Source/UnrealProject/Abilities/BombProjectile.h new file mode 100644 index 0000000..b4aefe7 --- /dev/null +++ b/Source/UnrealProject/Abilities/BombProjectile.h @@ -0,0 +1,30 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "ProjectileBase.h" +#include "BombProjectile.generated.h" + +UCLASS() +class UNREALPROJECT_API ABombProjectile : public AProjectileBase +{ + GENERATED_BODY() + +public: + ABombProjectile(); + + virtual void BeginPlay() override; + + UPROPERTY(BlueprintReadWrite, Replicated, Category = "BombProjectile", meta = (ExposeOnSpawn)) + FVector source; + UPROPERTY(BlueprintReadWrite, Replicated, Category = "BombProjectile", meta = (ExposeOnSpawn)) + FVector target; + UPROPERTY(BlueprintReadWrite, Replicated, Category = "BombProjectile", meta = (ExposeOnSpawn)) + float travelTime; + UPROPERTY(BlueprintReadWrite, Replicated, Category = "BombProjectile", meta = (ExposeOnSpawn)) + float travelHeight; + virtual void NativeFixedProjectileTick(float DeltaTime) override; + +private: + float m_progress; +}; diff --git a/Source/UnrealProject/Abilities/BossBarageBunny.cpp b/Source/UnrealProject/Abilities/BossBarageBunny.cpp new file mode 100644 index 0000000..b739a1d --- /dev/null +++ b/Source/UnrealProject/Abilities/BossBarageBunny.cpp @@ -0,0 +1,97 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" + +#include "NPCBase.h" +#include "NetworkPlayer.h" +#include "BossBarageBunny.h" + + +ABossBarageBunny::ABossBarageBunny() +{ + PrimaryActorTick.bCanEverTick = true; + + bReplicates = true; + bReplicateMovement = true; + + boss = nullptr; + + BeamEmitter = CreateDefaultSubobject(TEXT("Visual")); + BeamEmitter->AttachTo(RootComponent); + + m_lifeTime = 1; +} + +void ABossBarageBunny::BeginPlay() +{ + Super::BeginPlay(); + + SpawnDefaultController(); +} + +void ABossBarageBunny::Tick( float DeltaTime ) +{ + Super::Tick( DeltaTime ); + + // Update the line material + if (IsValid(boss)) + { + BeamEmitter->SetBeamSourcePoint(0, GetActorLocation(), 0); + BeamEmitter->SetBeamTargetPoint(0, boss->GetActorLocation(), 0); + } + else + { + BeamEmitter->SetActive(false); + GetCharacterMovement()->MaxWalkSpeed = 0; + } + + // Server only + if (Role != ROLE_Authority) + return; + + m_lifeTime -= DeltaTime; + if (m_lifeTime <= 0) + { + Destroy(); + return; + } + + // Boss destroyed? + if (!IsValid(boss)) + return; + + UNavigationSystem* const nav = UNavigationSystem::GetCurrent(GetWorld()); + if (!IsValid(nav)) return; + + AController* const controller = GetController(); + if (!IsValid(controller)) + { + JERROR("BossBarageBase has no controller"); + return; + } + + ANPCBase* const asNPC = Cast(boss); + if (!IsValid(asNPC) || !IsValid(asNPC->target)) + return; + + nav->SimpleMoveToLocation(controller, asNPC->target->GetActorLocation()); +} + + +void ABossBarageBunny::Setup(AActor* boss, float lifeTime) +{ + this->boss = boss; + m_lifeTime = lifeTime; +} + +void ABossBarageBunny::ClearBoss() +{ + this->boss = nullptr; +} + +void ABossBarageBunny::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + + DOREPLIFETIME(ABossBarageBunny, boss); +} diff --git a/Source/UnrealProject/Abilities/BossBarageBunny.h b/Source/UnrealProject/Abilities/BossBarageBunny.h new file mode 100644 index 0000000..c1648b9 --- /dev/null +++ b/Source/UnrealProject/Abilities/BossBarageBunny.h @@ -0,0 +1,36 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GameFramework/Actor.h" +#include "BossBarageBunny.generated.h" + +UCLASS() +class UNREALPROJECT_API ABossBarageBunny : public ACharacter +{ + GENERATED_BODY() + +public: + ABossBarageBunny(); + + virtual void BeginPlay() override; + + virtual void Tick( float DeltaSeconds ) override; + + + UPROPERTY(EditAnywhere, Category = "Bunny") + class UParticleSystemComponent* BeamEmitter; + + UFUNCTION(BlueprintCallable, Category = "Bunny") + void Setup(class AActor* boss, float lifeTime); + + UFUNCTION(BlueprintCallable, Category = "Bunny") + void ClearBoss(); + + + UPROPERTY(Replicated) + class AActor* boss; + +private: + float m_lifeTime; +}; diff --git a/Source/UnrealProject/Abilities/BossTargetBunny.cpp b/Source/UnrealProject/Abilities/BossTargetBunny.cpp new file mode 100644 index 0000000..bfcc245 --- /dev/null +++ b/Source/UnrealProject/Abilities/BossTargetBunny.cpp @@ -0,0 +1,43 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "BossTargetBunny.h" + + +ABossTargetBunny::ABossTargetBunny() +{ + PrimaryActorTick.bCanEverTick = true; + + bReplicates = true; + bReplicateMovement = true; + + m_lifeTime = 0; +} + +void ABossTargetBunny::BeginPlay() +{ + Super::BeginPlay(); + +} + +void ABossTargetBunny::Tick( float DeltaTime ) +{ + Super::Tick( DeltaTime ); + + // Server only + if (Role != ROLE_Authority) + return; + + m_lifeTime -= DeltaTime; + if (m_lifeTime <= 0) + { + Destroy(); + return; + } +} + + +void ABossTargetBunny::Setup(float lifeTime) +{ + m_lifeTime = lifeTime; +} \ No newline at end of file diff --git a/Source/UnrealProject/Abilities/BossTargetBunny.h b/Source/UnrealProject/Abilities/BossTargetBunny.h new file mode 100644 index 0000000..a289f1c --- /dev/null +++ b/Source/UnrealProject/Abilities/BossTargetBunny.h @@ -0,0 +1,26 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GameFramework/Actor.h" +#include "BossTargetBunny.generated.h" + +UCLASS() +class UNREALPROJECT_API ABossTargetBunny : public AActor +{ + GENERATED_BODY() + +public: + ABossTargetBunny(); + + virtual void BeginPlay() override; + + virtual void Tick( float DeltaSeconds ) override; + + + UFUNCTION(BlueprintCallable, Category = "Bunny") + void Setup(float lifeTime); + +private: + float m_lifeTime; +}; diff --git a/Source/UnrealProject/Abilities/ConeComponent.cpp b/Source/UnrealProject/Abilities/ConeComponent.cpp new file mode 100644 index 0000000..b267915 --- /dev/null +++ b/Source/UnrealProject/Abilities/ConeComponent.cpp @@ -0,0 +1,110 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "ConeComponent.h" + +#define CONEARCVERTEXCOUNT 50 + +// Sets default values for this component's properties +UConeComponent::UConeComponent(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) +{ + ShapeColor = FColor(223, 149, 157, 255); + bUseEditorCompositing = true; +} + +void UConeComponent::BeginPlay() +{ + UpdateCapsule(); + Super::BeginPlay(); +} + +void UConeComponent::UpdateCapsule() +{ + SetCapsuleSize(coneRadius, 400); +} + +// Create sceneproxy to show the cone in the editor +FPrimitiveSceneProxy* UConeComponent::CreateSceneProxy() +{ + class FDrawConeSceneProxy : public FPrimitiveSceneProxy + { + public: + const UConeComponent* component; + FDrawConeSceneProxy(const UConeComponent* InComponent) + : FPrimitiveSceneProxy(InComponent) + , bDrawOnlyIfSelected(InComponent->bDrawOnlyIfSelected) + , component(InComponent) + { + bWillEverBeLit = false; + } + + + virtual void GetDynamicMeshElements(const TArray& Views, const FSceneViewFamily& ViewFamily, uint32 VisibilityMap, FMeshElementCollector& Collector) const + { + QUICK_SCOPE_CYCLE_COUNTER(STAT_GetDynamicMeshElements_DrawDynamicElements); + + for (int32 ViewIndex = 0; ViewIndex < Views.Num(); ViewIndex++) + { + + if (VisibilityMap & (1 << ViewIndex)) + { + const FSceneView* View = Views[ViewIndex]; + const FLinearColor DrawCapsuleColor = GetViewSelectionColor(ShapeColor, *View, IsSelected(), IsHovered(), false, IsIndividuallySelected()); + + FPrimitiveDrawInterface* PDI = Collector.GetPDI(ViewIndex); + + FTransform transform = component->GetComponentTransform(); + FVector base = transform.GetLocation(); + + const float scale = 1.0f / 180.0f * PI; + float baseRot = (360.0f - transform.GetRotation().Euler().Z) * scale; + + FVector scaleVec = transform.GetScale3D(); + FVector forward = FVector(scaleVec.X, 0, 0); + FVector right = FVector(0, scaleVec.Y, 0); + float angle = (component->coneAngle) / 180.0f * PI; + + FVector linePoints[CONEARCVERTEXCOUNT]; + float anglestep = (angle) / (CONEARCVERTEXCOUNT-1); + + float rot = baseRot - angle * 0.5f; + for (int i = 0; i < CONEARCVERTEXCOUNT;i++) + { + float f = cosf(rot); + float r = sinf(rot); + linePoints[i] = base + (forward * f - right * r) * component->coneRadius; + rot += anglestep; + } + + for (int i = 0; i < CONEARCVERTEXCOUNT-1; i++) + { + + PDI->DrawLine(linePoints[i], linePoints[i + 1], ShapeColor, SDPG_World); + } + PDI->DrawLine(base, linePoints[0], ShapeColor, SDPG_World); + PDI->DrawLine(base, linePoints[CONEARCVERTEXCOUNT - 1], ShapeColor, SDPG_World); + } + } + } + + virtual FPrimitiveViewRelevance GetViewRelevance(const FSceneView* View) const override + { + const bool bVisible = !bDrawOnlyIfSelected || IsSelected(); + FPrimitiveViewRelevance Result; + Result.bDrawRelevance = IsShown(View) && bVisible; + Result.bDynamicRelevance = true; + Result.bShadowRelevance = IsShadowCast(View); + Result.bEditorPrimitiveRelevance = UseEditorCompositing(View); + return Result; + } + + virtual uint32 GetMemoryFootprint(void) const override { return(sizeof(*this) + GetAllocatedSize()); } + uint32 GetAllocatedSize(void) const { return(FPrimitiveSceneProxy::GetAllocatedSize()); } + + private: + const uint32 bDrawOnlyIfSelected : 1; + const FColor ShapeColor = FColor(255,0,0,255); + const FTransform transform; + }; + return new FDrawConeSceneProxy(this); +} diff --git a/Source/UnrealProject/Abilities/ConeComponent.h b/Source/UnrealProject/Abilities/ConeComponent.h new file mode 100644 index 0000000..ea0a977 --- /dev/null +++ b/Source/UnrealProject/Abilities/ConeComponent.h @@ -0,0 +1,26 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Components/CapsuleComponent.h" +#include "ConeComponent.generated.h" + + +UCLASS(ClassGroup = "Collision", editinlinenew, hidecategories = (Object, LOD, Lighting, TextureStreaming), meta = (DisplayName = "Cone Collision", BlueprintSpawnableComponent)) +class UNREALPROJECT_API UConeComponent : public UCapsuleComponent +{ + GENERATED_UCLASS_BODY() + +public: + void BeginPlay() override; + + void UpdateCapsule(); + + UPROPERTY(EditAnywhere, export, Category = Shape, meta = (ClampMin = "0", UIMin = "0")) + float coneRadius = 500.0f; + + UPROPERTY(EditAnywhere, export, Category = Shape, meta = (ClampMin = "0", UIMin = "0")) + float coneAngle = 50; + + virtual FPrimitiveSceneProxy* CreateSceneProxy() override; +}; diff --git a/Source/UnrealProject/Abilities/ConeTrigger.cpp b/Source/UnrealProject/Abilities/ConeTrigger.cpp new file mode 100644 index 0000000..28ed5ee --- /dev/null +++ b/Source/UnrealProject/Abilities/ConeTrigger.cpp @@ -0,0 +1,50 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "ConeTrigger.h" +#include "ConeComponent.h" +#include "NetworkCharacter.h" +#include "BlueprintAbilityLibrary.h" // For Cone overlap code + +AConeTrigger::AConeTrigger() +{ + PrimaryActorTick.bCanEverTick = true; + + m_coneTrigger = CreateDefaultSubobject (TEXT("trigger")); + RootComponent = m_coneTrigger; + m_coneTrigger->SetCollisionProfileName(TEXT("Triggers")); +} + + +void AConeTrigger::BeginPlay() +{ + m_coneTrigger->SetWorldTransform(GetTransform()); + if (!delegatesSet) + { + m_coneTrigger->OnComponentBeginOverlap.AddDynamic(this, &AConeTrigger::OnOverlapBegin); + m_coneTrigger->OnComponentEndOverlap.AddDynamic(this, &AConeTrigger::OnOverlapEnd); + delegatesSet = true; + } + SetCone(radius, angle); + Super::BeginPlay(); +} + + +void AConeTrigger::Tick( float DeltaTime ) +{ + Super::Tick( DeltaTime ); +} + +void AConeTrigger::SetCone(float inputRadius, float inputAngle) +{ + m_coneTrigger->coneAngle = (inputAngle); + m_coneTrigger->coneRadius = (inputRadius); + m_coneTrigger->UpdateCapsule(); +} + + + +bool AConeTrigger::CollisionCheck(ANetworkCharacter* otheractor) +{ + return ULib::IsContainedInCone(GetActorLocation(), GetActorForwardVector(), m_coneTrigger->coneAngle, otheractor); +} \ No newline at end of file diff --git a/Source/UnrealProject/Abilities/ConeTrigger.h b/Source/UnrealProject/Abilities/ConeTrigger.h new file mode 100644 index 0000000..a629486 --- /dev/null +++ b/Source/UnrealProject/Abilities/ConeTrigger.h @@ -0,0 +1,27 @@ +// Project Lab - NHTV Igad + +#pragma once +#include "AbilityTriggerBase.h" +#include "GameFramework/Actor.h" +#include "ConeTrigger.generated.h" + +UCLASS() +class UNREALPROJECT_API AConeTrigger : public AAbilityTriggerBase +{ + GENERATED_BODY() + +public: + AConeTrigger(); + + virtual void BeginPlay() override; + virtual void Tick( float DeltaSeconds ) override; + virtual bool CollisionCheck(ANetworkCharacter* otheractor) override; + void SetCone(float radius, float angle); + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Trigger") + float radius; + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Trigger") + float angle; +private: + UPROPERTY(VisibleAnywhere, Category = "Trigger") + class UConeComponent* m_coneTrigger; +}; diff --git a/Source/UnrealProject/Abilities/DealDamageProxy.cpp b/Source/UnrealProject/Abilities/DealDamageProxy.cpp new file mode 100644 index 0000000..9592244 --- /dev/null +++ b/Source/UnrealProject/Abilities/DealDamageProxy.cpp @@ -0,0 +1,67 @@ +#include "UnrealProject.h" +#include "NetworkCharacter.h" +#include "DealDamageProxy.h" +#include "DefaultPlayerState.h" +#include "ScalingGraph.h" +#include "AbilityInfo.h" + +float ADealDamageProxy::GetAbilityPowerScale() const +{ + if(!character) + return 0.0f; + AAbilityState* state = character->GetAbilityState(abilityInfo); + if(!state) + return 0.0f; + return state->power; +} + +float ADealDamageProxy::ScaleGraphCurve(const UCurveFloat* val) +{ + if (!IsValid(val)) + { + GEngine->AddOnScreenDebugMessage((int32)abilityInfo->GetUniqueID(), 2.0f, FColor(255, 20, 20, 255), FString("Invalid curve argument in ") + GetName() + " [" + abilityInfo->GetName() + "]"); + JERROR("Invalid curve argument in " + GetName() + " [" + abilityInfo->GetName() + "]"); + return 0; + } + + if(abilityInfo->abilityType == EAbilityType::Basic) + { + return ScaleGraphCurveByLevel(val); + } + float f = GetAbilityPowerScale(); + f = FMath::Clamp(f, 0.0f, 1.0f); + return val->GetFloatValue(f); +} + +float ADealDamageProxy::ScaleGraphCurveByLevel(const UCurveFloat* val) +{ + if(!IsValid(val)) + { + GEngine->AddOnScreenDebugMessage((int32)abilityInfo->GetUniqueID(), 2.0f, FColor(255, 20, 20, 255), FString("Invalid curve argument in ") + GetName() + " [" + abilityInfo->GetName() + "]"); + JERROR("Invalid curve argument in " + GetName() + " [" + abilityInfo->GetName() + "]"); + return 0; + } + + float f = 0.0f; + if(character) + { + ADefaultPlayerState* ps = Cast(character->PlayerState); + if(ps) + { + f = FMath::Clamp((float)ps->GetLevel() / (float)ps->GetMaxLevel(), 0.0f, 1.0f); + } + } + return val->GetFloatValue(f); +} + +float ULevelScaleLibrary::ScaleGraphCurveFloat(float in, const UCurveFloat* val) +{ + if (!IsValid(val)) + { + JERROR("Invalid curve argument"); + return 0; + } + + in = FMath::Clamp(in, 0.0f, 1.0f); + return val->GetFloatValue(in); +} \ No newline at end of file diff --git a/Source/UnrealProject/Abilities/DealDamageProxy.h b/Source/UnrealProject/Abilities/DealDamageProxy.h new file mode 100644 index 0000000..3679fe4 --- /dev/null +++ b/Source/UnrealProject/Abilities/DealDamageProxy.h @@ -0,0 +1,28 @@ +#pragma once +#include "AbilityFilter.h" +#include "ScalingGraph.h" +#include "DealDamageProxy.Generated.h" + +UCLASS() +class ADealDamageProxy : public AActor +{ + GENERATED_BODY() + +public: + UFUNCTION(BlueprintCallable, Category = "Damage Scaling") + float GetAbilityPowerScale() const; + + // Scales samples the input curve anywhere from 0-1 based on the currently cast ability's power(or level for basic attacks) + UFUNCTION(BlueprintCallable, Category = "Scaling Graph") + float ScaleGraphCurve(const UCurveFloat* val); + // Same as ScaleGraphCurve but this one scales with the player level + UFUNCTION(BlueprintCallable, Category = "Scaling Graph") + float ScaleGraphCurveByLevel(const UCurveFloat* val); + + // The character that started this sequence of proxies and the dealer of the damage + UPROPERTY(BlueprintReadOnly, Category="Damage Proxy") + class ANetworkCharacter* character; + // The ability that was cast to spawn this object + UPROPERTY(BlueprintReadOnly, Category="Damage Proxy") + class UAbilityInfo* abilityInfo; +}; \ No newline at end of file diff --git a/Source/UnrealProject/Abilities/HomingProjectile.cpp b/Source/UnrealProject/Abilities/HomingProjectile.cpp new file mode 100644 index 0000000..d06805c --- /dev/null +++ b/Source/UnrealProject/Abilities/HomingProjectile.cpp @@ -0,0 +1,47 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "HomingProjectile.h" +#include "DefaultGameMode.h" +#include "NetworkPlayer.h" + +void AHomingProjectile::BeginPlay() +{ + Super::BeginPlay(); + + float maxdist = BIG_NUMBER; + if (Role == ROLE_Authority) + { + if (targetCreature == nullptr) + { + UWorld* const world = GetWorld(); + if (!world) return; + ADefaultGameMode* mode = Cast(world->GetAuthGameMode()); + if (!mode) return; + + TArray players = mode->GetPlayers(); + + for (ANetworkPlayer* player : players) + { + float dist = (player->GetActorLocation() - GetActorLocation()).SizeSquared(); + if (dist < maxdist) + { + maxdist = dist; + targetCreature = player; + } + } + } + } +} + +void AHomingProjectile::NativeMove(float DeltaTime) +{ + if (targetCreature == nullptr) + return; + FVector dir = targetCreature->GetActorLocation() - GetActorLocation(); + FRotator newrot = FRotationMatrix::MakeFromX(dir).Rotator(); + + SetActorRotation(newrot); + + Super::NativeMove(DeltaTime); +} diff --git a/Source/UnrealProject/Abilities/HomingProjectile.h b/Source/UnrealProject/Abilities/HomingProjectile.h new file mode 100644 index 0000000..d0726b9 --- /dev/null +++ b/Source/UnrealProject/Abilities/HomingProjectile.h @@ -0,0 +1,22 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "ProjectileBase.h" +#include "HomingProjectile.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API AHomingProjectile : public AProjectileBase +{ + GENERATED_BODY() + +public: + virtual void BeginPlay() override; + virtual void NativeMove(float DeltaTime) override; + + UPROPERTY(BlueprintReadWrite, category = "projectile", meta = (ExposeOnSpawn)) + class ANetworkCharacter* targetCreature; +}; diff --git a/Source/UnrealProject/Abilities/HoverProjectile.cpp b/Source/UnrealProject/Abilities/HoverProjectile.cpp new file mode 100644 index 0000000..a6b5f15 --- /dev/null +++ b/Source/UnrealProject/Abilities/HoverProjectile.cpp @@ -0,0 +1,22 @@ +// ProjeLab - NHTV Igad + +#include "UnrealProject.h" +#include "HoverProjectile.h" + + + + + +void AHoverProjectile::NativeMove(float DeltaTime) +{ + //moves with sweep to get collision + float distance = speed * DeltaTime; + FVector newpos = GetActorForwardVector() * distance + GetActorLocation(); + FHitResult outHit; + FVector offset; + if (GetWorld()->LineTraceSingleByChannel(outHit, newpos, newpos - FVector(0, 0, hoverHeight + 10), ECollisionChannel::ECC_GameTraceChannel7)) + offset = outHit.ImpactPoint + FVector(0, 0, hoverHeight) - GetActorLocation(); + else + offset = newpos - FVector(0, 0, 10) - GetActorLocation(); + AddActorWorldOffset(offset,true); +} \ No newline at end of file diff --git a/Source/UnrealProject/Abilities/HoverProjectile.h b/Source/UnrealProject/Abilities/HoverProjectile.h new file mode 100644 index 0000000..a6de365 --- /dev/null +++ b/Source/UnrealProject/Abilities/HoverProjectile.h @@ -0,0 +1,23 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Abilities/ProjectileBase.h" +#include "HoverProjectile.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API AHoverProjectile : public AProjectileBase +{ + GENERATED_BODY() + + +public: + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Projectile", meta = (ExposeOnSpawn)) + float hoverHeight; + + virtual void NativeMove(float DeltaTime)override; + +}; diff --git a/Source/UnrealProject/Abilities/IngameSkillTree.cpp b/Source/UnrealProject/Abilities/IngameSkillTree.cpp new file mode 100644 index 0000000..6d65e47 --- /dev/null +++ b/Source/UnrealProject/Abilities/IngameSkillTree.cpp @@ -0,0 +1,103 @@ +#include "UnrealProject.h" +#include "IngameSkillTree.h" +#include "HexMap.h" +#include "BaseSkillObject.h" +#include "DefaultPlayerState.h" + +void AIngameSkillTree::BuildFromState(const FSkillTreeState& state) +{ + for(int32 i = 0; i < state.objects.Num(); i++) + { + const FSkillTreeStateObject& obj = state.objects[i]; + if(!obj.skillObject) + { + GWARNING("Invalid skill object found in skill tree state, please reset your build."); + continue; + } + + FIngameSkillTreeSkill igs; + igs.placedPoints = obj.placedPoints; + igs.skillObject = obj.skillObject->GetDefaultObject(); + igs.selectedEffectIndex = obj.selectedEffect; + + // Check valid effect index + if(igs.selectedEffectIndex < 0 || igs.selectedEffectIndex >= igs.skillObject->abilityEffects.Num()) + { + GWARNING("Ability effect out of range for ability " + obj.skillObject->GetName()); + continue; + } + + igs.selectedEffect = igs.skillObject->abilityEffects[igs.selectedEffectIndex]; + + igs.abilityType = -1; + switch (igs.skillObject->skillShapeType) + { + case ESkillShapeType::Active: + igs.abilityType = 0; + break; + case ESkillShapeType::Coop: + case ESkillShapeType::Sustain: + igs.abilityType = 1; + break; + case ESkillShapeType::Passive: + igs.abilityType = 2; + break; + } + + if(igs.abilityType == -1) + { + GWARNING("Ability type invalid for ability " + obj.skillObject->GetName()); + continue; + } + + m_skills.Add(igs); + } +} + +AIngameSkillTree::AIngameSkillTree(const FObjectInitializer& init) +{ +} + +AIngameSkillTree::~AIngameSkillTree() +{ +} + +void AIngameSkillTree::BeginPlay() +{ +} + +TArray AIngameSkillTree::GetSkillsForLevel(ADefaultPlayerState* player) +{ + float powerLevel = player->GetLevel() / (float)player->GetMaxLevel(); + return GetSkillsForLevel(powerLevel); +} + +TArray AIngameSkillTree::GetSkillsForLevel(float powerLevel) +{ + TArray res; + for (int32 i = 0; i < m_skills.Num(); i++) + { + UpdatePowerForSkill(m_skills[i], powerLevel); + if (m_skills[i].power > 0.0f) + res.Add(m_skills[i]); + } + return res; +} + +void AIngameSkillTree::UpdatePowerForSkill(FIngameSkillTreeSkill& skill, float level) +{ + float offset = (1.0f - level) * 16.0f; + + int32 hexcount = 0; + + for(int32 i = 0; i < skill.placedPoints.Num(); i++) + { + float YPos = (skill.placedPoints[i].X & 1) ? + (float(skill.placedPoints[i].Y) + 0.5f) : + (float(skill.placedPoints[i].Y)); + if(YPos >= offset) hexcount++; + } + + skill.level = hexcount; + skill.power = float(hexcount) / float(skill.placedPoints.Num()); +} diff --git a/Source/UnrealProject/Abilities/IngameSkillTree.h b/Source/UnrealProject/Abilities/IngameSkillTree.h new file mode 100644 index 0000000..4e70286 --- /dev/null +++ b/Source/UnrealProject/Abilities/IngameSkillTree.h @@ -0,0 +1,45 @@ +#pragma once +#include "SkillTreeState.h" +#include "IngameSkillTree.Generated.h" + +USTRUCT() +struct FIngameSkillTreeSkill +{ + GENERATED_BODY() +public: + UPROPERTY() + TArray placedPoints; + UPROPERTY(BlueprintReadOnly) + class UBaseSkillObject* skillObject; + UPROPERTY(BlueprintReadOnly) + class UAbilityInfo* selectedEffect; + UPROPERTY(BlueprintReadOnly) + int32 selectedEffectIndex; + UPROPERTY(BlueprintReadOnly) + float power; + UPROPERTY(BlueprintReadOnly) + int32 level; + + // Kind of ability on the button bar + UPROPERTY(BlueprintReadOnly) + int32 abilityType; +}; + + UCLASS() +class AIngameSkillTree : public AActor +{ + GENERATED_BODY() +public: + AIngameSkillTree(const FObjectInitializer& init); + ~AIngameSkillTree(); + virtual void BeginPlay() override; + + void BuildFromState(const FSkillTreeState& state); + TArray GetSkillsForLevel(class ADefaultPlayerState* player); + TArray GetSkillsForLevel(float level); + void UpdatePowerForSkill(FIngameSkillTreeSkill& skill, float level); + +private: + UPROPERTY() + TArray m_skills; +}; \ No newline at end of file diff --git a/Source/UnrealProject/Abilities/IntimidatingAuraTrigger.cpp b/Source/UnrealProject/Abilities/IntimidatingAuraTrigger.cpp new file mode 100644 index 0000000..d5e4821 --- /dev/null +++ b/Source/UnrealProject/Abilities/IntimidatingAuraTrigger.cpp @@ -0,0 +1,60 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "IntimidatingAuraTrigger.h" +#include "NetworkCharacter.h" +#include "NativeModifiers.h" +#include "Modifier.h" + + + +AIntimidatingAuraTrigger::AIntimidatingAuraTrigger() +{ + +} +void AIntimidatingAuraTrigger::BeginPlay() +{ + Super::BeginPlay(); +} +void AIntimidatingAuraTrigger::Tick(float deltaTime) +{ + Super::Tick(deltaTime); +} +void AIntimidatingAuraTrigger::HitEvent(ANetworkCharacter* otherActor) +{ + + ModifierManager* manager = otherActor->GetModifierManager(); + if (playerMap.Find(otherActor)== nullptr) + { + RERROR("2 modifiers in the intimidatin aura"); + } + if (manager) + { + AAttackSpeedModifierConstant* ASModifier = GetWorld()->SpawnActor(); + ASModifier->lifeTime = 0; + ASModifier->attackSpeedMultiplier = attackSpeedMultiplier; + ASModifier->target = otherActor; + manager->AddModifier(ASModifier); + + ASpeedModifier* SModifier = GetWorld()->SpawnActor(); + SModifier->lifeTime = 0; + SModifier->speedMultiplier = MovementSpeedMultiplier; + SModifier->target = otherActor; + manager->AddModifier(ASModifier); + // std::pair pair = std::pair ((AModifier*)ASModifier, (AModifier*)SModifier); + playerMap.Add(otherActor, FIntimidatingAuraPair(ASModifier,SModifier)); + + } + return Super::HitEvent(otherActor); +} +void AIntimidatingAuraTrigger::LeaveEvent(ANetworkCharacter* otherActor) +{ + + auto it =playerMap.Find(otherActor); + if (it == nullptr) + return Super::LeaveEvent(otherActor); + it->modifier0->ForceDestroy(); + it->modifier1->ForceDestroy(); + playerMap.Remove(otherActor); + return Super::LeaveEvent(otherActor); +} \ No newline at end of file diff --git a/Source/UnrealProject/Abilities/IntimidatingAuraTrigger.h b/Source/UnrealProject/Abilities/IntimidatingAuraTrigger.h new file mode 100644 index 0000000..aa6cb17 --- /dev/null +++ b/Source/UnrealProject/Abilities/IntimidatingAuraTrigger.h @@ -0,0 +1,42 @@ +// Project Lab - NHTV Igad + +#pragma once +#include "Abilities/ConeTrigger.h" +#include "IntimidatingAuraTrigger.generated.h" + +/** + * + */ +USTRUCT() +struct FIntimidatingAuraPair +{ + GENERATED_BODY() +public: + FIntimidatingAuraPair(){} + FIntimidatingAuraPair(class AModifier* m0, class AModifier*m1) { modifier0 = m0; modifier1 = m1; } + UPROPERTY() + class AModifier* modifier0; + UPROPERTY() + class AModifier* modifier1; +}; + +UCLASS() +class UNREALPROJECT_API AIntimidatingAuraTrigger : public AConeTrigger +{ + GENERATED_BODY() + public: + AIntimidatingAuraTrigger(); + + virtual void BeginPlay() override; + virtual void Tick(float DeltaSeconds) override; + virtual void HitEvent(class ANetworkCharacter* otherActor)override; + virtual void LeaveEvent(class ANetworkCharacter* otherActor)override; + UPROPERTY() + TMap playerMap; + UPROPERTY(meta = (ExposeOnSpawn), BlueprintReadWrite) + float attackSpeedMultiplier; + UPROPERTY(meta = (ExposeOnSpawn), BlueprintReadWrite) + float MovementSpeedMultiplier; + + +}; diff --git a/Source/UnrealProject/Abilities/Modifier.cpp b/Source/UnrealProject/Abilities/Modifier.cpp new file mode 100644 index 0000000..e1ab98e --- /dev/null +++ b/Source/UnrealProject/Abilities/Modifier.cpp @@ -0,0 +1,477 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "Modifier.h" + +#include "NetworkCharacter.h" +#include "NativeModifiers.h" + +ModifierManager::ModifierManager(class ANetworkCharacter* character) + : m_character(character) +{ + check(m_character); +} +ModifierManager::~ModifierManager() +{ + ClearModifiers(false); +} + +void ModifierManager::ClearModifiers(bool shouldCallEnd) +{ + for (AModifier* modifier : m_modifiers) + { + if (shouldCallEnd) + modifier->m_started = false; + modifier->Destroy(); + } + m_modifiers.SetNum(0); + RecalculateCharacter(); +} +void ModifierManager::Tick(float DeltaSeconds) +{ + for (int32 i = 0; i < m_modifiers.Num();) + { + AModifier* modifier = m_modifiers[i]; + if (modifier != nullptr && IsValid(modifier)) + { + if (modifier->ShouldBeRemoved() || modifier->m_forceDestroy) + { + modifier->Destroy(); + m_modifiers.RemoveAt(i); + RecalculateCharacter(); + continue; + } + else + { + modifier->Tick(DeltaSeconds); + } + } + else + { + m_modifiers.RemoveAt(i); + if (modifier != 0) + { + GERROR("Modifier \"" + modifier->GetName() + "\" was destroyed, but not in the usual way"); + } + RecalculateCharacter(); + continue; + } + i++; + } +} + +AModifier* ModifierManager::AddModifier(TSubclassOf buffClass, float duration) +{ + if (!buffClass) + { + FWERROR(L"Invalid modifier class"); + return nullptr; + } + UWorld* world = m_character->GetWorld(); + check(world); + AModifier* modifier = world->SpawnActor(buffClass); + modifier->m_Init(m_character, duration); + return AddModifier(modifier); +} +AModifier* ModifierManager::AddModifier(AModifier* modifierInstance) +{ + if (!modifierInstance) + { + FWERROR(L"Invalid buff added"); + return nullptr; + } + m_modifiers.Add(modifierInstance); + m_modifiers.Sort([](const AModifier& i, const AModifier& j)->bool { return i > j; }); + modifierInstance->m_Start(); + RecalculateCharacter(); + return modifierInstance; +} + +TArray ModifierManager::GetModifiersOfClass(TSubclassOf modifierClass) +{ + TArray ret; + for (AModifier* mod : m_modifiers) + { + if (mod->IsA(modifierClass)) + { + ret.Add(mod); + } + } + return ret; +} +void ModifierManager::BroadcastManaDrainFailed() +{ + for(AModifier* modifier : m_modifiers) + { + if (modifier != nullptr && IsValid(modifier)) + { + modifier->onManaDrainFailed.Broadcast(); + } + } +} + +//reset all modifiable stats so that modifiers can recalculate them +void ModifierManager::m_Reset() +{ + m_character->ResetModifiers(); +} +void ModifierManager::RecalculateCharacter() +{ + m_Reset(); + for (AModifier* it : m_modifiers) + { + it->ModifyCharacter(); + } + m_character->CheckStatsOverflow(); +} + + +AModifier::AModifier() +{ + PrimaryActorTick.bCanEverTick = true; + bReplicates = true; + lifeTime = 0; + ticksPerSecond = 0; + m_dontDestroy = false; + RootComponent = CreateDefaultSubobject("Root"); +} + +bool AModifier::operator < (const AModifier& other) const +{ + return priority < other.priority; +} +bool AModifier::operator > (const AModifier& other) const +{ + return priority > other.priority; +} + + +void AModifier::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + if (m_started) + ModifierEnd(); +} + +void AModifier::ModifyCharacter() +{ +} +bool AModifier::ShouldBeRemoved() const +{ + return (lifeTime <= 0.0f) && !m_dontDestroy; +} +void AModifier::ForceDestroy() +{ + m_forceDestroy = true; +} +void AModifier::ModifierTick() +{ +} + +void AModifier::ModifierStart() +{ + +} + +void AModifier::ModifierEnd() +{ + +} +bool AModifier::OnDamage(int32& damage, ANetworkCharacter* damageDealer) +{ + return true; +} +bool AModifier::OnDealDamage(int32& damage, ANetworkCharacter* damageTaker) +{ + return true; +} +void AModifier::OnStandardAttack(ANetworkCharacter* character) +{ + return; +} +void AModifier::AfterDamage(int32) +{ + return; +} + +float AModifier::m_MultiplyEffect(float value, EffectType effectType, bool positive) +{ + switch (effectType) + { + case EffectType::additive: + { + if (!positive) + return value * target->m_negativeEffectMultiplier; + else + return value * target->m_positiveEffectMultiplier; + } + case EffectType::multiplicative: + { + if (!positive) + return value * (1.0f/target->m_negativeEffectMultiplier); + else + return value * target->m_positiveEffectMultiplier; + } + default: + return 0.0f; + } +} + +//character modification functions +void AModifier::m_AddMaxMana(int32 maxMana) +{ + if (IsValid(target)) + { + maxMana = m_MultiplyEffect(maxMana, additive, maxMana>0); + target->m_maxMana += maxMana; + target->AddMana(maxMana); + } +} +void AModifier::m_MultiplyManaRegenMultiplier(float manaRegenMultiplier) +{ + if (IsValid(target)) + { + manaRegenMultiplier = m_MultiplyEffect(manaRegenMultiplier, multiplicative, manaRegenMultiplier>1); + target->m_manaRegenMultiplier *= manaRegenMultiplier; + } +} +void AModifier::m_MultiplyManaUsageMultiplier(float manaUsageMultiplier) +{ + if (IsValid(target)) + { + manaUsageMultiplier = m_MultiplyEffect(manaUsageMultiplier, multiplicative, manaUsageMultiplier>1); + target->m_manaUsageMultiplier *= manaUsageMultiplier; + } +} +void AModifier::m_AddBlockedMana(int32 blockedMana) +{ + if (IsValid(target)) + { + if (target->m_blockedMana + blockedMana > target->m_maxMana) + { + ModifierManager* mod = character->GetModifierManager(); + if (mod != nullptr) + mod->BroadcastManaDrainFailed(); + } + else + target->m_blockedMana += blockedMana; + } +} +void AModifier::m_AddDamageMultiplier(float multiplier) +{ + if (IsValid(target)) + { + multiplier = m_MultiplyEffect(multiplier, additive, multiplier > 0); + target->m_damageMultiplier += multiplier; + } +} +void AModifier::m_AddMaxHealth(int32 health) +{ + if (IsValid(target)) + { + health = m_MultiplyEffect(health, additive, health >0); + target->m_maxHealth += health; + } +} +void AModifier::m_AddMovementSpeedMultiplier(float multiplier) +{ + if (IsValid(target)) + { + multiplier = m_MultiplyEffect(multiplier, multiplicative, multiplier > 0); + target->GetCharacterMovement()->MaxWalkSpeed *= multiplier; + } +} +void AModifier::m_AddIgnoreArmor(float normalizedPercentage) +{ + if (IsValid(target)) + { + normalizedPercentage = m_MultiplyEffect(normalizedPercentage, additive, normalizedPercentage > 0); + target->m_ignoreArmor += normalizedPercentage; + } +} +void AModifier::m_AddArmor(float armor) +{ + if (IsValid(target)) + { + armor = m_MultiplyEffect(armor, additive, armor > 0); + target->m_armor += armor; + } +} + +void AModifier::m_MultiplyArmor(float armor) +{ + if (IsValid(target)) + { + armor = m_MultiplyEffect(armor, multiplicative, armor > 1); + target->m_armor *= armor; + } +} +void AModifier::m_MultiplyAttackDamage(float damageMultiplier) +{ + if (IsValid(target)) + { + damageMultiplier = m_MultiplyEffect(damageMultiplier, multiplicative, damageMultiplier>1); + FPRINT(damageMultiplier); + target->m_attackDamageMultiplier *= damageMultiplier; + } +} +void AModifier::m_AddMagicDamage(float damageMultiplier) +{ + if (IsValid(target)) + { + damageMultiplier = m_MultiplyEffect(damageMultiplier, multiplicative, damageMultiplier > 1); + target->m_magicDamageMultiplier *= damageMultiplier; + } +} +void AModifier::m_AddAttackSpeed(float amount) +{ + if (IsValid(target)) + { + amount = m_MultiplyEffect(amount, additive, amount> 0); + target->m_attackSpeed += amount; + } +} +void AModifier::m_AddAttackSpeedMultiplier(float multiplier) +{ + if (IsValid(target)) + { + multiplier = m_MultiplyEffect(multiplier, multiplicative, multiplier > 1); + target->m_attackSpeed *= multiplier; + } +} +void AModifier::m_AddCooldownReduction(float amount) +{ + if (IsValid(target)) + { + amount = m_MultiplyEffect(amount, additive, amount > 0); + target->m_cooldownReduction += amount; + } +} +void AModifier::m_AddCooldownReductionMultiplier(float multiplier) +{ + if (IsValid(target)) + { + multiplier = m_MultiplyEffect(multiplier, multiplicative, multiplier > 1); + target->m_cooldownReduction *= multiplier; + } +} +void AModifier::m_MultiplyDamageTakenMultiplier(float multiplier) +{ + if (IsValid(target)) + { + multiplier = m_MultiplyEffect(multiplier, multiplicative, multiplier < 0); + target->m_damageTakenMultiplier *= multiplier; + } +} +void AModifier::m_MultiplyPositiveEffectMultiplier(float multiplier) +{ + if (IsValid(target)) + target->m_positiveEffectMultiplier *= multiplier; +} +void AModifier::m_MultiplyNegativeEffectMultiplier(float multiplier) +{ + if (IsValid(target)) + target->m_negativeEffectMultiplier *= multiplier; +} +void AModifier::m_addChannelMovementSpeedMultiplier(float channelMovementSpeedMultiplier) +{ + if (IsValid(target)) + { + channelMovementSpeedMultiplier = m_MultiplyEffect(channelMovementSpeedMultiplier, additive, channelMovementSpeedMultiplier > 0); + target->m_castingMovementspeedMultiplier += channelMovementSpeedMultiplier; + } +} +void AModifier::m_MultiplyMagicDamageMultiplier(float multiplier) +{ + if (IsValid(target)) + { + multiplier = m_MultiplyEffect(multiplier, additive, multiplier> 0); + target->m_magicDamageMultiplier *= multiplier; + } +} + +void AModifier::m_AddStunnedState() +{ + if (IsValid(target)) + if (target->canBeStunned) + { + target->m_stunned = true; + target->m_InteruptSpellcasting(); + } +} + +void AModifier::m_AddSilencedState() +{ + if (IsValid(target)) + if (target->canBeSilenced) + { + target->m_silenceCount++; + target->m_silenced = true; + target->m_InteruptSpellcasting(); + } +} + +void AModifier::m_RemoveSilencedState() +{ + if (IsValid(target)) + { + target->m_silenceCount--; + if (target->m_silenceCount == 0) + { + target->m_silenced = false; + } + else if (target->m_silenceCount < 0) + { + FERROR("m_silenceCount <0 in removeSilenceState"); + } + } +} +void AModifier::m_Start() +{ + if (!m_started) + { + if (IsValid(target)) + { + if (ticksPerSecond <= 0) + m_tickRate = 0.0f; + else + m_tickRate = 1.0f / ticksPerSecond; + m_started = true; + if (lifeTime == 0) + { + m_dontDestroy = true; + } + ModifierStart(); + } + else + { + GWERROR(L"Can't start modifier " + GetName() + " target not set"); + } + } + else + { + GWERROR(L"modifier started twice"); + } +} +void AModifier::Tick(float DeltaTime) +{ + Super::Tick(DeltaTime); + if (!IsValid(target) || !m_started) + return; + if (ShouldBeRemoved() || m_forceDestroy) + return; + if (m_tickRate > 0.0f) + { + m_tickTimer += DeltaTime; + while (m_tickTimer >= m_tickRate) + { + ModifierTick(); + m_tickTimer -= m_tickRate; + } + } + lifeTime -= DeltaTime; +} +void AModifier::m_Init(class ANetworkCharacter* a_character, float duration) +{ + target = a_character; + lifeTime = duration; +} diff --git a/Source/UnrealProject/Abilities/Modifier.h b/Source/UnrealProject/Abilities/Modifier.h new file mode 100644 index 0000000..b94e54a --- /dev/null +++ b/Source/UnrealProject/Abilities/Modifier.h @@ -0,0 +1,122 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "DealDamageProxy.h" +#include +#include "AbilityInfo.h" +#include "Modifier.generated.h" + +class ModifierManager +{ +public: + ModifierManager(class ANetworkCharacter* character); + ~ModifierManager(); + + void ClearModifiers(bool shouldCallEnd = true); + void Tick(float DeltaSeconds); + + class AModifier* AddModifier(TSubclassOf modifierClass, float duration); + class AModifier* AddModifier(AModifier* modifierInstance); + TArray GetModifiersOfClass(TSubclassOf modifierClass); + void RecalculateCharacter(); + void BroadcastManaDrainFailed(); + +private: + void m_Reset(); + + friend class ANetworkCharacter; + TArray m_modifiers; + class ANetworkCharacter* m_character; +}; + +UCLASS() +class UNREALPROJECT_API AModifier : public ADealDamageProxy +{ + GENERATED_BODY() + + friend class ADefaultPlayerController; + friend class ModifierManager; + friend class ANetworkCharacter; + friend class AOnDamageModifier; + +public: + AModifier(); + virtual void Tick(float DeltaSeconds) override final; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + + virtual void ModifierTick(); + virtual void ModifierStart(); + virtual void ModifierEnd(); + virtual bool OnDamage(int32& damage, ANetworkCharacter* damageDealer); + virtual bool OnDealDamage(int32& damage, ANetworkCharacter* damageTaker); + virtual void OnStandardAttack(ANetworkCharacter* character); + virtual void AfterDamage(int32 damage); + + UFUNCTION(BlueprintCallable, Category = "modifiers") + virtual bool ShouldBeRemoved() const; + virtual void ModifyCharacter(); + UFUNCTION(BlueprintCallable, Category = "modifiers") + void ForceDestroy(); + + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "modifiers", meta=(ExposeOnSpawn)) + float lifeTime; + UPROPERTY() + ANetworkCharacter* target; + UPROPERTY(EditDefaultsOnly, Category = "modifiers") + int32 ticksPerSecond; + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "modifiers", meta = (ExposeOnSpawn)) + int32 priority; + + DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnManaDrainFailed); + + UPROPERTY(BlueprintAssignable, Category = "Mana Drain") + FOnManaDrainFailed onManaDrainFailed; + + bool operator < (const AModifier&) const; + bool operator > (const AModifier&) const; +protected: + enum EffectType + { + additive = 0, + multiplicative + }; + float m_MultiplyEffect(float value, EffectType effectType, bool positive); + + // Modification Functions + void m_AddMaxMana(int32 maxMana); + void m_MultiplyManaRegenMultiplier(float manaRegenMultiplier); + void m_AddBlockedMana(int32 blockedMana); + void m_AddDamageMultiplier(float multiplier); + void m_AddIgnoreArmor(float normalizedPercentage); + void m_AddArmor(float armor); + void m_MultiplyArmor(float armor); + void m_MultiplyDamageTakenMultiplier(float multiplier); + void m_AddMaxHealth(int32 health); + void m_AddMovementSpeedMultiplier(float multiplier); + void m_AddAttackSpeed(float amount); + void m_AddAttackSpeedMultiplier(float multiplier); + void m_AddCooldownReduction(float amount); + void m_AddCooldownReductionMultiplier(float multiplier); + void m_AddStunnedState(); + void m_AddSilencedState(); + void m_RemoveSilencedState(); + void m_MultiplyAttackDamage(float damageMultiplier); + void m_AddMagicDamage(float damageMultiplier); + void m_MultiplyManaUsageMultiplier(float manaUsageMultiplier); + void m_MultiplyNegativeEffectMultiplier(float effectMultiplier); + void m_MultiplyPositiveEffectMultiplier(float effectMultiplier); + void m_MultiplyMagicDamageMultiplier(float effectMultiplier); + void m_addChannelMovementSpeedMultiplier(float channelMovementSpeedMultiplier); + float m_tickRate; + +private: + void m_Start(); + void m_Init(class ANetworkCharacter* character, float duration); + + bool m_forceDestroy; + int m_debugWarning; + bool m_started; + float m_tickTimer; + bool m_dontDestroy; +}; \ No newline at end of file diff --git a/Source/UnrealProject/Abilities/NativeModifiers.cpp b/Source/UnrealProject/Abilities/NativeModifiers.cpp new file mode 100644 index 0000000..840ac69 --- /dev/null +++ b/Source/UnrealProject/Abilities/NativeModifiers.cpp @@ -0,0 +1,704 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" + +#include "NetworkCharacter.h" +#include "NetworkPlayer.h" +#include "NativeModifiers.h" +#include "EffectFunctionLibrary.h" +#include "Effect.h" + +#define standardTicksPerSecond 20 +//SpeedModifier +ASpeedModifier::ASpeedModifier() +{ + +} + +void ASpeedModifier::ModifyCharacter() +{ + UCharacterMovementComponent* characterMovement = target->GetCharacterMovement(); + characterMovement->MaxWalkSpeed *= speedMultiplier; +} + +//RegenModifier +ARegenModifier::ARegenModifier() +{ + ticksPerSecond = 5; +} + +bool ARegenModifier::ShouldBeRemoved() const +{ + return false; +} + +void ARegenModifier::ModifierTick() +{ + if ( m_noDamageTime < target->GetTimeSinceDamage()) + target->AddHealth(regenPerTick); +} + +//RegenModier +AManaRegenModifier::AManaRegenModifier() +{ + ticksPerSecond = standardTicksPerSecond; +} + +bool AManaRegenModifier::ShouldBeRemoved() const +{ + return false; +} + +void AManaRegenModifier::ModifierTick() +{ + target->AddMana(regenPerTick); +} + +//DOTModifier +ADOTModifier::ADOTModifier() +{ + ticksPerSecond = 3; +} + +void ADOTModifier::ModifierTick() +{ + if (IsValid(target)) + target->DealDamage(this, damagePerTick, 0.0f); +} + +//ADModifier +AADModifier::AADModifier() +{ + +} + +void AADModifier::ModifyCharacter() +{ + float add = ScaleGraphCurve(scalingGraph); + m_MultiplyAttackDamage(add); +} +//ADModifier +AAPModifier::AAPModifier() +{ + +} + +void AAPModifier::ModifyCharacter() +{ + float add = ScaleGraphCurve(scalingGraph); + m_AddMagicDamage(add); +} + +//MaxHealthModifier +AMaxHealthModifier::AMaxHealthModifier() +{ +} + +void AMaxHealthModifier::ModifyCharacter() +{ + //m_AddMaxHealth(bonusMaxHealth); + float add = ScaleGraphCurve(scalingGraph); + m_AddMaxHealth(add); +} + +//AConstMaxHealthModifier +AConstMaxHealthModifier::AConstMaxHealthModifier() +{ +} + +void AConstMaxHealthModifier::ModifyCharacter() +{ + m_AddMaxHealth(add); +} + +//BlockManaModifier +ABlockManaModifier::ABlockManaModifier() +{ + +} + +void ABlockManaModifier::ModifyCharacter() +{ + m_AddBlockedMana(Mana); +} + +//ManaPerSecModifier +AManaDrainModifier::AManaDrainModifier() +{ + ticksPerSecond = standardTicksPerSecond; +} + +void AManaDrainModifier::ModifierTick() +{ + if (ManaPerTick > target->GetMana()) + { + ModifierManager* mod = character->GetModifierManager(); + if (mod != nullptr) + mod->BroadcastManaDrainFailed(); + } + else + { + target->RemoveMana(ManaPerTick); + } +} + + +//ManaPerSecModifier +AManaDrainCurveModifier::AManaDrainCurveModifier() +{ + ticksPerSecond = standardTicksPerSecond; +} + +void AManaDrainCurveModifier::ModifierTick() +{ + float mana = ScaleGraphCurve(ManaPerTick); + if (mana > target->GetMana()) + { + ModifierManager* mod = character->GetModifierManager(); + if (mod != nullptr) + mod->BroadcastManaDrainFailed(); + } + else + { + target->RemoveMana(mana); + } +} + +//HealthModifier +AHealModifier::AHealModifier() +{ + ticksPerSecond = standardTicksPerSecond; +} + +void AHealModifier::ModifierTick() +{ + target->AddHealth(health); + m_shouldBeRemoved = true; +} + +bool AHealModifier::ShouldBeRemoved() const +{ + return m_shouldBeRemoved; +} + +//stunModifier +static TSubclassOf stunEffectType; +AStunModifier::AStunModifier() +{ + stunEffectType = ConstructorHelpers::FClassFinder(TEXT("/Game/Assets/Art/Effects/FX_Stunned")).Class; +} +void AStunModifier::ModifierStart() +{ + if (target->CanBeStunned() && lifeTime > 0.0f) + UEffectFunctionLibrary::CreateEffect(target, stunEffectType, target,0.0f, lifeTime); +} +void AStunModifier::ModifierEnd() +{ +} +void AStunModifier::ModifierTick() +{ +} +void AStunModifier::ModifyCharacter() +{ + m_AddStunnedState(); +} +//stunModifier + +ASilenceModifier::ASilenceModifier() +{ +} +void ASilenceModifier::ModifierStart() +{ + m_AddSilencedState(); +} + + +void ASilenceModifier::ModifierEnd() +{ + m_RemoveSilencedState(); +} +//ADamageTakenModifier +ADamageTakenModifier::ADamageTakenModifier() +{ + +} + +void ADamageTakenModifier::ModifyCharacter() +{ + m_MultiplyDamageTakenMultiplier(damageTakenMultiplier); +} + + +bool ADamageTakenModifier::ShouldBeRemoved() const +{ + return false; +} + +//AVisibilityModifier +AVisibilityModifier::AVisibilityModifier() +{ + +} + +bool AVisibilityModifier::ShouldBeRemoved() const +{ + return false; +} + +void AVisibilityModifier::ModifierTick() +{ + m_timer -= m_tickRate; + if (m_timer < 0 && visibleTime > 0 && visibleBreak> 0) + { + if (m_visible) + { + m_timer = visibleBreak; + target->m_visible = false; + } + else + { + m_timer = visibleTime; + target->m_visible = true; + } + + m_visible = !m_visible; + } + +} + +//ADodgeDeathModifier +ADodgeDeathModifier::ADodgeDeathModifier() +{ + +} + +bool ADodgeDeathModifier::ShouldBeRemoved() const +{ + return false; +} + + +void ADodgeDeathModifier::ModifierTick() +{ + m_timer += m_tickRate; +} +bool ADodgeDeathModifier::OnDamage(int32& damage, ANetworkCharacter* damageDealer) +{ + if (damage >= target->GetHealth() && m_timer > ScaleGraphCurve(cooldown)) + { + float chance = (float)(rand() % 100) / 100.0f; + if (ScaleGraphCurve(dodgeChance) > chance) + { + target->AddHealth(ScaleGraphCurve(heal)); + m_timer = 0; + return false; + } + } + return true; +} + +//ACooldownReductionModifier +ACooldownReductionModifier::ACooldownReductionModifier() +{ +} + +void ACooldownReductionModifier::ModifyCharacter() +{ + float add = ScaleGraphCurve(scalingGraph); + m_AddCooldownReduction(add); +} + +//AAttackSpeedModifier +AAttackSpeedModifier::AAttackSpeedModifier() +{ + +} + +void AAttackSpeedModifier::ModifyCharacter() +{ + float add = ScaleGraphCurve(scalingGraph); + m_AddAttackSpeedMultiplier(add); +} + +//AAttackSpeedModifierConstant +AAttackSpeedModifierConstant::AAttackSpeedModifierConstant() +{ + +} + +void AAttackSpeedModifierConstant::ModifyCharacter() +{ + m_AddAttackSpeedMultiplier(attackSpeedMultiplier); +} + +bool AAttackSpeedModifierConstant::ShouldBeRemoved() const +{ + return false; +} + +//AArmorIgnoreModifier +AArmorIgnoreModifier::AArmorIgnoreModifier() +{ + +} + +void AArmorIgnoreModifier::ModifyCharacter() +{ + float add = ScaleGraphCurve(scalingGraph); + m_AddIgnoreArmor(add); +} + + +//ADodgeDeathModifier +ABeserkModifier::ABeserkModifier() +{ + ticksPerSecond = standardTicksPerSecond; + m_active = false; +} + +bool ABeserkModifier::ShouldBeRemoved() const +{ + return false; +} + +void ABeserkModifier::AfterDamage(int32 damage) +{ + float deltahealth = (float)target->GetHealth() / (float)target->GetMaxHealth(); + + if (deltahealth < ScaleGraphCurve(healthThreshold)) + { + if (!m_active) + { + m_hasToActivate = true; + } + } +} + + + +void ABeserkModifier::ModifierTick() +{ + float deltahealth = (float)target->GetHealth() / (float)target->GetMaxHealth(); + if (m_hasToActivate) + { + m_hasToActivate = false; + m_active = true; + m_ASModifier = GetWorld()->SpawnActor(); + m_ASModifier->lifeTime = 0.0f; + m_ASModifier->target = target; + m_ASModifier->attackSpeedMultiplier = ScaleGraphCurve(attackSpeedMultiplier); + target->GetModifierManager()->AddModifier(m_ASModifier); + } + if (deltahealth > ScaleGraphCurve(healthThreshold)) + { + if (m_active) + { + m_active = false; + m_ASModifier->ForceDestroy(); + } + } +} + +//AArmorReductionModifier +AArmorReductionModifier::AArmorReductionModifier() +{ + +} + + +void AArmorReductionModifier::ModifyCharacter() +{ + m_AddArmor(armorReduction); +} + + +//AHealthRegenModifier +AHealthRegenModifier::AHealthRegenModifier() +{ + ticksPerSecond = standardTicksPerSecond; +} + + +void AHealthRegenModifier::ModifierTick() +{ + float add = ScaleGraphCurve(scalingGraph); + target->AddHealth(add); +} + +//AOnStandardAttackDOTModifier +AOnStandardAttackDOTModifier::AOnStandardAttackDOTModifier() +{ + ticksPerSecond = standardTicksPerSecond; +} + + +void AOnStandardAttackDOTModifier::ModifierTick() +{ + m_cooldownTimer += m_tickRate; +} + +void AOnStandardAttackDOTModifier::OnStandardAttack(ANetworkCharacter* targetcharacter) +{ + if (!IsValid(targetcharacter)) + return; + ADOTModifier* DOTModifier = GetWorld()->SpawnActor(); + DOTModifier->lifeTime = ScaleGraphCurve(damageDuration); + DOTModifier->damagePerTick = ScaleGraphCurve(damagePerTick); +// DOTModifier->target = targetcharacter; + DOTModifier->character = character; + DOTModifier->abilityInfo = abilityInfo; + DOTModifier->target = targetcharacter; + targetcharacter->GetModifierManager()->AddModifier(DOTModifier); + m_cooldownTimer = ScaleGraphCurve(cooldown); +} + +//AReturnDamageModifier +AReturnDamageModifier::AReturnDamageModifier() +{ + ticksPerSecond = standardTicksPerSecond; + +} +bool AReturnDamageModifier::OnDamage(int32& damage, ANetworkCharacter* damageDealer) +{ + if (damage >= 10 && IsValid(damageDealer)) + { + + float returnDamage = ScaleGraphCurve(scalingGraph); + damageDealer->DealDamage(this, damage * returnDamage, 0.0f); + } + return true; +} + + +//AReturnDamageModifier +ARedirectDamageModifier::ARedirectDamageModifier() +{ + ticksPerSecond = standardTicksPerSecond; +} + +bool ARedirectDamageModifier::OnDamage(int32& damage, ANetworkCharacter* damageDealer) +{ + if (damage >= 10 && IsValid(character)) + { + float redirect = ScaleGraphCurve(redirectScalingGraph); + if (redirect > 1) + { + FWARNING("redirect > 1, will act as if it is 0.9f"); + redirect = 0.9f; + } + if (redirect < 0) + { + FWARNING("redirect < 0, will act as if it is 0.0f"); + redirect = 0.0f; + } + float absorb = ScaleGraphCurve(absorbScalingGraph); + + if (absorb > 1) + { + FWARNING("absorb > 1, will act as if it is 1.0f"); + absorb = 1.0f; + } + if (absorb < 0.0f ) + { + FWARNING("absorb < 0, will act as if it is 0.0f"); + absorb = 0.0f; + } + character->DealDamage(this, damage * (redirect * absorb), 0.0f); + damage *= (1 - redirect); + DamageEvent(); + } + return true; +} + + +//ATrustModifier + +//set delegate in gamestate to know when the teammate respawns. +ATrustModifier::ATrustModifier() +{ + ticksPerSecond = 2; +} + +void ATrustModifier::ModifierTick() +{ + if (IsValid(character)) + { + target->GetModifierManager()->RecalculateCharacter(); + } + else + ForceDestroy(); +} + +void ATrustModifier::ModifyCharacter() +{ + if (IsValid(character)) + { + float add = ScaleGraphCurve(damageScalingGraph); + float deltahealth =1 + ( 1.0f - ((float)character->GetHealth() / (float)character->GetMaxHealth())); + m_MultiplyAttackDamage(add * deltahealth); + } +} + + +//AArmorIncreaseModifier +AArmorIncreaseModifier::AArmorIncreaseModifier() +{ + ticksPerSecond = standardTicksPerSecond; +} + +void AArmorIncreaseModifier::ModifyCharacter() +{ + float add = ScaleGraphCurve(armorScalingGraph); + m_AddArmor(add); +} + +//AMoveToModifier +AMoveToModifier::AMoveToModifier() +{ + ticksPerSecond = standardTicksPerSecond; +} +void AMoveToModifier::ModifierStart() +{ + m_movePerTick = (targetPos - target->GetActorLocation()) / (moveTime * ticksPerSecond); + +} + +void AMoveToModifier::ModifierTick() +{ + target->AddActorWorldOffset(m_movePerTick, true); +} + +//AHealthRegenPercentageModifier +AHealthRegenPercentageModifier::AHealthRegenPercentageModifier() +{ + ticksPerSecond = standardTicksPerSecond; +} + + +void AHealthRegenPercentageModifier::ModifierTick() +{ + float add = ScaleGraphCurve(scalingGraph); + add /= ticksPerSecond; + int32 health = character->GetMaxHealth(); + health *= add; + target->AddHealth(health); +} + +//AManaRegenMultiplierModifier +AManaRegenMultiplierModifier::AManaRegenMultiplierModifier() +{ + ticksPerSecond = standardTicksPerSecond; +} + +void AManaRegenMultiplierModifier::ModifyCharacter() +{ + float add = ScaleGraphCurve(manaRegenMultiplierScalingGraph); + m_MultiplyManaRegenMultiplier(add); +} + +//AManaCostMultiplierModifier +AManaCostMultiplierModifier::AManaCostMultiplierModifier() +{ + ticksPerSecond = standardTicksPerSecond; +} + +void AManaCostMultiplierModifier::ModifyCharacter() +{ + float add = ScaleGraphCurve(manaCostMultiplierScalingGraph); + m_MultiplyManaUsageMultiplier(add); +} + +//AManaCostMultiplierModifier +AEffectMultiplierModifier::AEffectMultiplierModifier() +{ + ticksPerSecond = standardTicksPerSecond; +} + +void AEffectMultiplierModifier::ModifyCharacter() +{ + float add = ScaleGraphCurve(effectMultiplierScalingGraph); + if (positive) + m_MultiplyPositiveEffectMultiplier(add); + else + m_MultiplyNegativeEffectMultiplier(add); +} + +//ACastingMovementSpeedMultiplierModifier +ACastingMovementSpeedMultiplierModifier::ACastingMovementSpeedMultiplierModifier() +{ + ticksPerSecond = standardTicksPerSecond; +} + +void ACastingMovementSpeedMultiplierModifier::ModifyCharacter() +{ + float add = ScaleGraphCurve(movementSpeedMultiplierScalingGraph); + m_addChannelMovementSpeedMultiplier(add); +} + +//AReaperModifier +AReaperModifier::AReaperModifier() +{ + ticksPerSecond = standardTicksPerSecond; +} + +bool AReaperModifier::OnDealDamage(int32& damage, ANetworkCharacter* damageTaker) +{ + float multiplier = ScaleGraphCurve(damagemultiplier); + float norm = ScaleGraphCurve(threshhold); + + float deltahealth = (float)damageTaker->GetHealth() / (float)damageTaker->GetMaxHealth(); + if ((deltahealth < norm && smaller) || (deltahealth > norm && !smaller)) + { + damage *= multiplier; + } + + return true; +} + +//AMagicDamageMultiplierModifier +AMagicDamageMultiplierModifier::AMagicDamageMultiplierModifier() +{ + ticksPerSecond = standardTicksPerSecond; +} + +void AMagicDamageMultiplierModifier::ModifyCharacter() +{ + float add = ScaleGraphCurve(magicDamageMultiplierScalingGraph); + m_MultiplyMagicDamageMultiplier(add); +} + +//AStandardMeleeModifier +AStandardMeleeModifier::AStandardMeleeModifier() +{ + count = 0; + ticksPerSecond = standardTicksPerSecond; +} + +void AStandardMeleeModifier::ModifierTick() +{ + m_timer += m_tickRate; + if (m_timer >= maxTime) + { + ForceDestroy(); + } +} + +bool AStandardMeleeModifier::AddCount() +{ + count++; + count%=maxCount; + m_timer = 0; + return count == 0; +} + +//ADamageToManaModifier +ADamageToManaModifier::ADamageToManaModifier() +{ + +} + +void ADamageToManaModifier::AfterDamage(int32 damage) +{ + float addMultiplier = ScaleGraphCurve(multiplier); + target->AddMana(damage * addMultiplier); +} \ No newline at end of file diff --git a/Source/UnrealProject/Abilities/NativeModifiers.h b/Source/UnrealProject/Abilities/NativeModifiers.h new file mode 100644 index 0000000..6cae2bc --- /dev/null +++ b/Source/UnrealProject/Abilities/NativeModifiers.h @@ -0,0 +1,683 @@ +#pragma once +#include "Abilities/Modifier.h" +#include "ScalingGraph.h" +#include "NativeModifiers.generated.h" + +// Increase/Decrease movement speed +UCLASS() +class UNREALPROJECT_API ASpeedModifier : public AModifier +{ + GENERATED_BODY() + +public: + ASpeedModifier(); + + virtual void ModifyCharacter(); + + //adjusts the movementspeed of the character + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta=(ExposeOnSpawn), Category = "Modifier") + float speedMultiplier; +}; + + +// Health Regen over time +UCLASS() +class UNREALPROJECT_API ARegenModifier : public AModifier +{ + GENERATED_BODY() + +public: + ARegenModifier(); + + virtual void ModifierTick() override; + virtual bool ShouldBeRemoved() const override; + + //the ammount of regen per tick (5 ticks per second) + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta=(ExposeOnSpawn), Category = "Modifier") + float regenPerTick = 5.0f; + //the total ammount of time the modifier should tick + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta=(ExposeOnSpawn), Category = "Modifier") + float regenTime; + +private: + FVector m_pos; + float m_noDamageTime = 5.0f; +}; + +// Mana regen over time +UCLASS() +class UNREALPROJECT_API AManaRegenModifier : public AModifier +{ + GENERATED_BODY() + +public: + AManaRegenModifier(); + + virtual void ModifierTick() override; + virtual bool ShouldBeRemoved() const override; + + //the ammount of mana per tick (20 ticks per second) + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta=(ExposeOnSpawn), Category = "Modifier") + float regenPerTick; +}; + +// Damage over time +UCLASS() +class UNREALPROJECT_API ADOTModifier : public AModifier +{ + GENERATED_BODY() + +public: + ADOTModifier(); + + virtual void ModifierTick() override; + + //damage per tick (3 ticks per second) + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta=(ExposeOnSpawn), Category = "Modifier") + float damagePerTick = 5.0f; +}; + +// Attack speed multiplier that scales with ability power +UCLASS() +class UNREALPROJECT_API AAttackSpeedModifier : public AModifier +{ + GENERATED_BODY() + +public: + AAttackSpeedModifier(); + virtual void ModifyCharacter(); + + //adjusts the attack speed of the character + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta=(ExposeOnSpawn), Category = "Modifier") + UCurveFloat* scalingGraph; +}; + +// Attack speed multiplier +UCLASS() +class UNREALPROJECT_API AAttackSpeedModifierConstant : public AModifier +{ + GENERATED_BODY() + +public: + AAttackSpeedModifierConstant(); + virtual void ModifyCharacter(); + bool ShouldBeRemoved() const override; + + //adjusts the attack speed of the character + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + float attackSpeedMultiplier; +}; + +// Cooldown reduction +UCLASS() +class UNREALPROJECT_API ACooldownReductionModifier : public AModifier +{ + GENERATED_BODY() + +public: + ACooldownReductionModifier(); + virtual void ModifyCharacter(); + + //adjusts the cooldown of every ability of the character, except for that standard attack + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta=(ExposeOnSpawn), Category = "Modifier") + UCurveFloat* scalingGraph; +}; + +// Increase/Decrease Damage (multiplier) +UCLASS() +class UNREALPROJECT_API AADModifier : public AModifier +{ + GENERATED_BODY() + +public: + AADModifier(); + + virtual void ModifyCharacter() override; + + //adjusts the damage of the standard attack + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + UCurveFloat* scalingGraph; +}; + + +// Increase/Decrease magic Damage (multiplier) +UCLASS() +class UNREALPROJECT_API AAPModifier : public AModifier +{ + GENERATED_BODY() + +public: + AAPModifier(); + + virtual void ModifyCharacter() override; + + //adjusts the damage of all abilities of the character except for the standard attack + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + UCurveFloat* scalingGraph; +}; + +// Increase/Decrease max health +UCLASS() +class UNREALPROJECT_API AMaxHealthModifier : public AModifier +{ + GENERATED_BODY() + +public: + AMaxHealthModifier(); + virtual void ModifyCharacter(); + + //adjusts the max health of the character + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + UCurveFloat* scalingGraph; +}; + +// Increase/Decrease max health with a int32 +UCLASS() +class UNREALPROJECT_API AConstMaxHealthModifier : public AModifier +{ + GENERATED_BODY() + +public: + AConstMaxHealthModifier(); + virtual void ModifyCharacter(); + + //adjusts the max health of the character + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + int32 add; +}; + +// Increase/Decrease blocked mana +UCLASS() +class UNREALPROJECT_API ABlockManaModifier : public AModifier +{ + GENERATED_BODY() + +public: + ABlockManaModifier(); + + virtual void ModifyCharacter() override; + // mana blocked + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta=(ExposeOnSpawn), Category = "Modifier") + int32 Mana; +}; + +// Mana over time cost with a curve +UCLASS() +class UNREALPROJECT_API AManaDrainCurveModifier : public AModifier +{ + GENERATED_BODY() + +public: + AManaDrainCurveModifier(); + + virtual void ModifierTick() override; + + //mana drained per tick (20 ticks per second) + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta=(ExposeOnSpawn), Category = "Modifier") + UCurveFloat* ManaPerTick; +}; + + +// Mana over time cost +UCLASS() +class UNREALPROJECT_API AManaDrainModifier : public AModifier +{ + GENERATED_BODY() + +public: + AManaDrainModifier(); + + virtual void ModifierTick() override; + + //mana drained per tick (20 ticks per second) + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + float ManaPerTick; +}; + +// Heal health 1 time +UCLASS() +class UNREALPROJECT_API AHealModifier : public AModifier +{ + GENERATED_BODY() + +public: + AHealModifier(); + + virtual void ModifierTick() override; + virtual bool ShouldBeRemoved() const override; + //the ammount of health that is healed + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta=(ExposeOnSpawn), Category = "Modifier") + float health; + +private: + bool m_shouldBeRemoved = false; +}; + +// Stun +UCLASS() +class UNREALPROJECT_API AStunModifier : public AModifier +{ + GENERATED_BODY() + +public: + AStunModifier(); + virtual void ModifierStart() override; + virtual void ModifierEnd() override; + virtual void ModifierTick() override; + virtual void ModifyCharacter() override; +}; + +// Stun +UCLASS() +class UNREALPROJECT_API ASilenceModifier : public AModifier +{ + GENERATED_BODY() + +public: + ASilenceModifier(); + virtual void ModifierStart() override; + virtual void ModifierEnd() override; +}; + +// Damage taken multiplier (only meant for bosses, will not work with a timer) +UCLASS() +class UNREALPROJECT_API ADamageTakenModifier : public AModifier +{ + GENERATED_BODY() + +public: + ADamageTakenModifier(); + + virtual void ModifyCharacter() override; + virtual bool ShouldBeRemoved() const override; + + //adjusts the damage taken. + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta=(ExposeOnSpawn), Category = "Modifier") + float damageTakenMultiplier; +}; + + + +//gives invisibility on the minimap with set breaks DEPRECATED +UCLASS() +class UNREALPROJECT_API AVisibilityModifier : public AModifier +{ + GENERATED_BODY() +public: + AVisibilityModifier(); + + virtual void ModifierTick() override; + virtual bool ShouldBeRemoved() const override; + //DEPRECATED + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + float visibleBreak = 5.0f; + //DEPRECATED + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + float visibleTime = 1.0f; + +private: + float m_timer; + bool m_visible; +}; + + +//gives a chance at healing instead of damage if the blow is the killing blow +UCLASS() +class UNREALPROJECT_API ADodgeDeathModifier : public AModifier +{ + GENERATED_BODY() + + float m_timer; +public: + ADodgeDeathModifier(); + + virtual bool ShouldBeRemoved() const override; + virtual void ModifierTick() override; + //the chance between 0 and 1 and the effect will be proced + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + UCurveFloat* dodgeChance; + //the ammount of health that is healed on the effect + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + UCurveFloat* heal; + + //the cooldown for the dodgedeath in seconds + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + UCurveFloat* cooldown; + + + + virtual bool OnDamage(int32& damage, ANetworkCharacter* damageDealer) override; +}; + +//ignores a part of the enemy armor on all abilities +UCLASS() +class UNREALPROJECT_API AArmorIgnoreModifier : public AModifier +{ + GENERATED_BODY() + +public: + AArmorIgnoreModifier(); + virtual void ModifyCharacter(); + //the ammount of armor that is ignored (between 0 and 1) + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + UCurveFloat* scalingGraph; +}; + +//gives a chance at healing instead of damage if the blow is the killing blow +UCLASS() +class UNREALPROJECT_API ABeserkModifier : public AModifier +{ + GENERATED_BODY() +public: + ABeserkModifier(); + + + virtual bool ShouldBeRemoved() const override; + + //the threshhold (between 0 and 1) where the effect will be proced + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + UCurveFloat* healthThreshold; + //adjusts the attackspeed + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + UCurveFloat* attackSpeedMultiplier; + + + void m_Start(); + virtual void ModifierTick() override; +private: + bool m_active; + bool m_hasToActivate; + class AAttackSpeedModifierConstant* m_ASModifier; + + virtual void AfterDamage(int32 damage) override; +}; + + +// Increase/Decrease Damage (multiplier) +UCLASS() +class UNREALPROJECT_API AArmorReductionModifier : public AModifier +{ + GENERATED_BODY() + +public: + AArmorReductionModifier(); + + virtual void ModifyCharacter() override; + //adjusts the armor + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + float armorReduction; +}; + + +//regens health Per Tick +UCLASS() +class UNREALPROJECT_API AHealthRegenModifier : public AModifier +{ + GENERATED_BODY() + +public: + AHealthRegenModifier(); + //the ammount of health that is regened per tick (20 ticks per second) + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + UCurveFloat* scalingGraph; + + virtual void ModifierTick() override; +}; + +//deals DOT on a standard attack +UCLASS() +class UNREALPROJECT_API AOnStandardAttackDOTModifier : public AModifier +{ + GENERATED_BODY() + +private: + float m_cooldownTimer; +public: + AOnStandardAttackDOTModifier(); + //damage per tick on standard attack hit(3 ticks per second) + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + UCurveFloat* damagePerTick; + //the cooldown of the effect + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + UCurveFloat* cooldown; + //the duration of the effect( of the DOT) + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + UCurveFloat* damageDuration; + + virtual void ModifierTick() override; + virtual void OnStandardAttack(ANetworkCharacter* targetcharacter) override; +}; + +//returns a part of the damage +UCLASS() +class UNREALPROJECT_API AReturnDamageModifier : public AModifier +{ + GENERATED_BODY() +public: + AReturnDamageModifier(); + + //chance between 0 and 1 of procing the effect + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + UCurveFloat* scalingGraph; + + virtual bool OnDamage(int32& damage, ANetworkCharacter* damageDealer) override; +}; + +//redirects a part of the damage to the ally +UCLASS() +class UNREALPROJECT_API ARedirectDamageModifier : public AModifier +{ + GENERATED_BODY() +public: + ARedirectDamageModifier(); + + //chance between 0 and 1, the ammount that is being redirected (how much goes from the ally to the player + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + UCurveFloat* redirectScalingGraph; + //chance between 0 and 1, the ammount of what is redirected that is being absorbed + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + UCurveFloat* absorbScalingGraph; + + UFUNCTION(BlueprintImplementableEvent, Category = "Modifier") + void DamageEvent(); + + virtual bool OnDamage(int32& damage, ANetworkCharacter* damageDealer); +}; + +//increases attack damage of ally based on missing health +UCLASS() +class UNREALPROJECT_API ATrustModifier : public AModifier +{ + GENERATED_BODY() + +public: + ATrustModifier(); + virtual void ModifierTick() override; + virtual void ModifyCharacter() override; + //the ammount of damage the ally gets multiplied by the normalised value of the missing health + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + UCurveFloat* damageScalingGraph; +}; + + +//increases armor +UCLASS() +class UNREALPROJECT_API AArmorIncreaseModifier : public AModifier +{ + GENERATED_BODY() + +public: + AArmorIncreaseModifier(); + virtual void ModifyCharacter(); + + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + UCurveFloat* armorScalingGraph; +}; + +//increases attack damage of ally based on missing health +UCLASS() +class UNREALPROJECT_API AMoveToModifier : public AModifier +{ + GENERATED_BODY() + +public: + AMoveToModifier(); + virtual void ModifierStart(); + virtual void ModifierTick() override; + + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + FVector targetPos; + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + float moveTime; +private: + FVector m_movePerTick; +}; + +//increases attack damage of ally based on missing health +UCLASS() +class UNREALPROJECT_API AHealthRegenPercentageModifier : public AModifier +{ + GENERATED_BODY() + +public: + AHealthRegenPercentageModifier(); + + //normalised percentage (0-1) + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + UCurveFloat* scalingGraph; + + virtual void ModifierTick() override; +}; + +//increases mana regen multiplier +UCLASS() +class UNREALPROJECT_API AManaRegenMultiplierModifier : public AModifier +{ + GENERATED_BODY() + +public: + AManaRegenMultiplierModifier(); + virtual void ModifyCharacter(); + + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + UCurveFloat* manaRegenMultiplierScalingGraph; +}; + + +//increases mana regen multiplier +UCLASS() +class UNREALPROJECT_API AManaCostMultiplierModifier : public AModifier +{ + GENERATED_BODY() + +public: + AManaCostMultiplierModifier(); + virtual void ModifyCharacter(); + + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + UCurveFloat* manaCostMultiplierScalingGraph; +}; + +//debuffs positive effects +UCLASS() +class UNREALPROJECT_API AEffectMultiplierModifier : public AModifier +{ + GENERATED_BODY() + +public: + AEffectMultiplierModifier(); + virtual void ModifyCharacter(); + + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + bool positive; + + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + UCurveFloat* effectMultiplierScalingGraph; +}; + +//debuffs positive effects +UCLASS() +class UNREALPROJECT_API ACastingMovementSpeedMultiplierModifier : public AModifier +{ + GENERATED_BODY() + +public: + ACastingMovementSpeedMultiplierModifier(); + virtual void ModifyCharacter(); + + + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + UCurveFloat* movementSpeedMultiplierScalingGraph; +}; + +// deals more damage depending on the enemies hp (black/white threshhold) +UCLASS() +class UNREALPROJECT_API AReaperModifier : public AModifier +{ + GENERATED_BODY() + +public: + AReaperModifier(); + virtual bool OnDealDamage(int32& damage, ANetworkCharacter* damageTaker) override; + + //true == more damage when current health is less than threshhold false == more damage when current health is more than threshhold + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + bool smaller; + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + UCurveFloat* damagemultiplier; + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + UCurveFloat* threshhold; +}; + +//increases/decreases magic damage +UCLASS() +class UNREALPROJECT_API AMagicDamageMultiplierModifier : public AModifier +{ + GENERATED_BODY() + +public: + AMagicDamageMultiplierModifier(); + virtual void ModifyCharacter(); + + + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + UCurveFloat* magicDamageMultiplierScalingGraph; +}; + +//increases/decreases magic damage +UCLASS() +class UNREALPROJECT_API AStandardMeleeModifier : public AModifier +{ + GENERATED_BODY() + + float m_timer; +public: + virtual void ModifierTick() override; + AStandardMeleeModifier(); + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + float maxTime; + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + int32 maxCount; + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Modifier") + int32 count; + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + int32 team; + UFUNCTION(BlueprintCallable, Category = "Modifier") + bool AddCount(); +}; + +//converts damage recieved to mana +UCLASS() +class UNREALPROJECT_API ADamageToManaModifier : public AModifier +{ + GENERATED_BODY() +public: + ADamageToManaModifier(); + + //the threshhold (between 0 and 1) where the effect will be proced + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn), Category = "Modifier") + UCurveFloat* multiplier; +private: + + virtual void AfterDamage(int32 damage) override; +}; \ No newline at end of file diff --git a/Source/UnrealProject/Abilities/PreCastAbilityEventGroup.cpp b/Source/UnrealProject/Abilities/PreCastAbilityEventGroup.cpp new file mode 100644 index 0000000..229cc0d --- /dev/null +++ b/Source/UnrealProject/Abilities/PreCastAbilityEventGroup.cpp @@ -0,0 +1,69 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "AbilityInfo.h" +#include "NetworkCharacter.h" +#include "PreCastAbilityEventGroup.h" + + + + + +void APreCastAbilityEventGroup::BeginPlay() +{ + check(Role == ROLE_Authority); + Super::BeginPlay(); + + if (!character || character->IsActorBeingDestroyed()) + { + Destroy(); + } + else + { + // Handle the destruction of the caster + character->OnDestroyed.AddDynamic(this, &APreCastAbilityEventGroup::m_OnCharacterDestroyed); + } +} +void APreCastAbilityEventGroup::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + check(Role == ROLE_Authority); + if (EndPlayReason == EEndPlayReason::Destroyed) + { + Super::EndPlay(EndPlayReason); + StartAbility(); + } +} +void APreCastAbilityEventGroup::Tick(float DeltaTime) +{ + Super::Tick(DeltaTime); + + if (IsPendingKill()) + return; +} + +void APreCastAbilityEventGroup::m_OnCharacterDestroyed() +{ + Destroy(); +} + +void APreCastAbilityEventGroup::StartAbility() +{ + character->m_CastAbility_Server(abilityInfo); + Destroy(); +} + + +APreCastAbilityEventGroup* APreCastAbilityEventGroup::InitPreCast(UAbilityInfo* info, ANetworkCharacter* character) +{ + UWorld* world = character->GetWorld(); + check(world); + + APreCastAbilityEventGroup* group = world->SpawnActorDeferred(info->precastEvent, FTransform::Identity); + + group->character = character; + //group->abilityState = character->GetAbilityState(info); + group->abilityInfo = info; + + UGameplayStatics::FinishSpawningActor(group, FTransform::Identity); + return group; +} \ No newline at end of file diff --git a/Source/UnrealProject/Abilities/PreCastAbilityEventGroup.h b/Source/UnrealProject/Abilities/PreCastAbilityEventGroup.h new file mode 100644 index 0000000..8b5cd42 --- /dev/null +++ b/Source/UnrealProject/Abilities/PreCastAbilityEventGroup.h @@ -0,0 +1,26 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Abilities/DealDamageProxy.h" +#include "PreCastAbilityEventGroup.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API APreCastAbilityEventGroup : public ADealDamageProxy +{ + GENERATED_BODY() +public: + + virtual void BeginPlay() override final; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason); + virtual void Tick(float DeltaSeconds) override final; + + void StartAbility(); + static APreCastAbilityEventGroup* InitPreCast(UAbilityInfo* info, ANetworkCharacter* character); +private: + UFUNCTION() + void m_OnCharacterDestroyed(); +}; diff --git a/Source/UnrealProject/Abilities/ProjectileBase.cpp b/Source/UnrealProject/Abilities/ProjectileBase.cpp new file mode 100644 index 0000000..8812a40 --- /dev/null +++ b/Source/UnrealProject/Abilities/ProjectileBase.cpp @@ -0,0 +1,174 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "NetworkCharacter.h" + +#include "ProjectileBase.h" +#include "BlueprintAbilityLibrary.h" + +#include "AbilityTriggerBase.h" + +AProjectileBase::AProjectileBase() +{ + m_finishTimer = 0.0f; + m_fixedTimer = 0.0f; + maxDistance = 1000.0f; + distanceTraveled = 0.0f; + keepAliveAfterFinish = 1.0f; + filter = EAbilityFilter::EnemyAll; + m_finished = false; + + //server client replication + bReplicateMovement = true; + bReplicates = true; + bAlwaysRelevant = true; + PrimaryActorTick.bCanEverTick = true; +} + +void AProjectileBase::BeginPlay() +{ + // Get collider component + collider = Cast(GetRootComponent()); + if(!collider) + { + GWERROR(L"Projectile does not have a collider root!"); + Destroy(); + return; + } + + + if(Role != ROLE_Authority) + { + collider->SetCollisionEnabled(ECollisionEnabled::NoCollision); + } + else + { + collider->OnComponentHit.AddDynamic(this, &AProjectileBase::m_OnHit); + collider->OnComponentBeginOverlap.AddDynamic(this, &AProjectileBase::m_OnOverlapBegin); + // collider->SetCollisionProfileName("Projectiles"); + } + Super::BeginPlay(); +} + +void AProjectileBase::NativeFixedProjectileTick(float DeltaTime) +{ + FixedProjectileTick(DeltaTime); +} + +//call this in inherited classes, will call move +void AProjectileBase::Tick(float DeltaTime) +{ + Super::Tick(DeltaTime); + + // Fixed timestep for projectiles + m_fixedTimer += DeltaTime; + FVector startPos = GetActorLocation(); + const float delta = 1.0f / 60.0f; + while(m_fixedTimer >= delta) + { + NativeFixedProjectileTick(delta); + if (autoMove) + { + NativeMove(DeltaTime); + + FVector newLocation = GetActorLocation(); + FVector movedVector = newLocation - startPos; + startPos = newLocation; + + distanceTraveled += movedVector.Size(); + } + if (distanceTraveled > maxDistance) + { + Finish(); + break; + } + m_fixedTimer -= delta; + } + + if(m_finished && autoDestroy) + { + if((m_finishTimer -= DeltaTime) <= 0.0f) + { + Destroy(); + } + } +} + + +void AProjectileBase::m_OnOverlapBegin(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) +{ + ANetworkCharacter* netChar = Cast(OtherActor); + if(netChar && ULib::CheckAbilityFilter(filter, character, netChar)) + { + OnProjectileHit(netChar); + } +} +void AProjectileBase::m_OnHit(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit) +{ + Finish(); +} + +void AProjectileBase::Finish_Implementation() +{ + if(!m_finished) + { + if(Role == ROLE_Authority) + { + NativeServerOnFinish(); + } + NativeOnProjectileFinished(); + if(collider) + collider->SetCollisionEnabled(ECollisionEnabled::NoCollision); + m_finishTimer = keepAliveAfterFinish; + m_finished = true; + } +} + +void AProjectileBase::FixedProjectileTick_Implementation(float DeltaTime) +{ +} +void AProjectileBase::OnProjectileHit_Implementation(ANetworkCharacter* character) +{ + NativeOnProjectileHit(character); +} + +void AProjectileBase::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + + DOREPLIFETIME_CONDITION(AProjectileBase, speed, COND_InitialOnly); + DOREPLIFETIME_CONDITION(AProjectileBase, filter, COND_InitialOnly); + DOREPLIFETIME_CONDITION(AProjectileBase, maxDistance, COND_InitialOnly); + DOREPLIFETIME_CONDITION(AProjectileBase, autoMove, COND_InitialOnly); + DOREPLIFETIME_CONDITION(AProjectileBase, autoDestroy, COND_InitialOnly); +} + +void AProjectileBase::Move(float DeltaTime) +{ + NativeMove(DeltaTime); +} + +void AProjectileBase::NativeMove(float DeltaTime) +{ + //moves with sweep to get collision + float distance = speed * DeltaTime; + AddActorWorldOffset(GetActorForwardVector() * distance,true); +} + +void AProjectileBase::OnProjectileFinished_Implementation() +{ + +} +void AProjectileBase::NativeOnProjectileFinished() +{ + OnProjectileFinished(); +} + +void AProjectileBase::NativeOnProjectileHit(ANetworkCharacter* hitCharacter) +{ +} + +void AProjectileBase::NativeServerOnFinish() +{ + ServerOnFinish(); +} diff --git a/Source/UnrealProject/Abilities/ProjectileBase.h b/Source/UnrealProject/Abilities/ProjectileBase.h new file mode 100644 index 0000000..65917f3 --- /dev/null +++ b/Source/UnrealProject/Abilities/ProjectileBase.h @@ -0,0 +1,78 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "DealDamageProxy.h" +#include "ProjectileBase.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API AProjectileBase : public ADealDamageProxy +{ + GENERATED_BODY() + +public: + AProjectileBase(); + virtual void BeginPlay() override; + virtual void Tick(float DeltaSeconds) override; + + UFUNCTION(BlueprintNativeEvent, Category = "Projectile") + void FixedProjectileTick(float DeltaTime); + virtual void NativeFixedProjectileTick(float DeltaTime); + + UFUNCTION(BlueprintCallable, Category = "Projectile") + void Move(float DeltaTime); + virtual void NativeMove(float DeltaTime); + + UFUNCTION(BlueprintCallable, Category = "Projectile") + bool IsFinished() const { return m_finished; } + + UFUNCTION(BlueprintNativeEvent, Category = "Projectile") + void OnProjectileFinished(); + virtual void NativeOnProjectileFinished(); + + UFUNCTION(BlueprintNativeEvent, Category = "Projectile") + void OnProjectileHit(ANetworkCharacter* hitCharacter); + virtual void NativeOnProjectileHit(ANetworkCharacter* hitCharacter); + + virtual void NativeServerOnFinish(); + UFUNCTION(BlueprintImplementableEvent, Category = "Project") + void ServerOnFinish(); + + // Transfers projectile to the finished state, disabling collision, but still updating ticks + UFUNCTION(BlueprintCallable, NetMulticast, Reliable, Category = "Projectile") + void Finish(); + + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Replicated, Category = "Projectile", meta = (ExposeOnSpawn)) + float speed; + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Replicated, Category = "Projectile", meta = (ExposeOnSpawn)) + EAbilityFilter filter; + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Replicated, Category = "Projectile", meta = (ExposeOnSpawn)) + float maxDistance; + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Replicated, Category = "Projectile", meta = (ExposeOnSpawn)) + bool autoMove = true; + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Replicated, Category = "Projectile", meta = (ExposeOnSpawn)) + bool autoDestroy = true; + + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Projectile") + float distanceTraveled; + + UPROPERTY(BlueprintReadOnly, EditDefaultsOnly, Category = "Projectile") + float keepAliveAfterFinish; + + UPROPERTY(BlueprintReadOnly, Category = "Projectile") + UPrimitiveComponent* collider; + +protected: + // Internal event handlers + UFUNCTION() + void m_OnOverlapBegin(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult); + UFUNCTION() + void m_OnHit(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit); + + bool m_finished; + float m_finishTimer; + float m_fixedTimer; +}; diff --git a/Source/UnrealProject/Abilities/ScalingGraph.h b/Source/UnrealProject/Abilities/ScalingGraph.h new file mode 100644 index 0000000..2e1b25a --- /dev/null +++ b/Source/UnrealProject/Abilities/ScalingGraph.h @@ -0,0 +1,12 @@ +#pragma once +#include "ScalingGraph.Generated.h" + + +UCLASS() +class ULevelScaleLibrary : public UBlueprintFunctionLibrary +{ + GENERATED_BODY() +public: + UFUNCTION(BlueprintCallable, Category = "Scaling Graph") + static float ScaleGraphCurveFloat(float in, const UCurveFloat* val); +}; diff --git a/Source/UnrealProject/Abilities/SpiralProjectile.cpp b/Source/UnrealProject/Abilities/SpiralProjectile.cpp new file mode 100644 index 0000000..8015cf8 --- /dev/null +++ b/Source/UnrealProject/Abilities/SpiralProjectile.cpp @@ -0,0 +1,34 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "NetworkCharacter.h" +#include "SpiralProjectile.h" + +#define SPIRALTIMESTEP (0.02f) + +void ASpiralProjectile::BeginPlay() +{ + Super::BeginPlay(); + if (Role != ROLE_Authority) + return; + // Set the rotation of the projectile so that it is facing away from the caster. + SetActorRotation(FRotator((this->GetActorLocation() - character->GetActorLocation()).Rotation())); + m_elapsedTime = 0; +} + +void ASpiralProjectile::NativeMove(float DeltaTime) +{ + m_elapsedTime += DeltaTime; + // Fixed update + while (m_elapsedTime >= SPIRALTIMESTEP) + { + m_elapsedTime -= SPIRALTIMESTEP; + float distance = speed * SPIRALTIMESTEP; + // Rotate the projectile according to how far it has traveled. + FRotator rotation = FRotator(0, distance * 0.25f, 0); + AddActorWorldRotation(rotation); + // Move the projectile forwards. + AddActorWorldOffset(GetActorForwardVector() * (distance * 2), true); + } +} + diff --git a/Source/UnrealProject/Abilities/SpiralProjectile.h b/Source/UnrealProject/Abilities/SpiralProjectile.h new file mode 100644 index 0000000..914f404 --- /dev/null +++ b/Source/UnrealProject/Abilities/SpiralProjectile.h @@ -0,0 +1,22 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "ProjectileBase.h" +#include "SpiralProjectile.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API ASpiralProjectile : public AProjectileBase +{ + GENERATED_BODY() + +public: + virtual void BeginPlay() override; + virtual void NativeMove(float DeltaTime) override; + +private: + float m_elapsedTime; +}; diff --git a/Source/UnrealProject/Abilities/TrailActor.cpp b/Source/UnrealProject/Abilities/TrailActor.cpp new file mode 100644 index 0000000..c8ff999 --- /dev/null +++ b/Source/UnrealProject/Abilities/TrailActor.cpp @@ -0,0 +1,28 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "TrailActor.h" + + +ATrailActor::ATrailActor() +{ + +} + +void ATrailActor::BeginPlay() +{ + Super::BeginPlay(); + +} + + + +void ATrailActor::DynamicDestroy() +{ + Destroy(); +} + +void ATrailActor::DynamicAdd() +{ + GetOwner()->OnDestroyed.AddDynamic(this, &ATrailActor::DynamicDestroy); +} \ No newline at end of file diff --git a/Source/UnrealProject/Abilities/TrailActor.h b/Source/UnrealProject/Abilities/TrailActor.h new file mode 100644 index 0000000..8319197 --- /dev/null +++ b/Source/UnrealProject/Abilities/TrailActor.h @@ -0,0 +1,21 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GameFramework/Actor.h" +#include "TrailActor.generated.h" + +UCLASS() +class UNREALPROJECT_API ATrailActor : public AActor +{ + GENERATED_BODY() + +public: + ATrailActor(); + + virtual void BeginPlay() override; + + UFUNCTION() + void DynamicDestroy(); + void DynamicAdd(); +}; diff --git a/Source/UnrealProject/Abilities/TrailTrigger.cpp b/Source/UnrealProject/Abilities/TrailTrigger.cpp new file mode 100644 index 0000000..69a9633 --- /dev/null +++ b/Source/UnrealProject/Abilities/TrailTrigger.cpp @@ -0,0 +1,93 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "TrailTrigger.h" +#include "Networkcharacter.h" +#include "TrailActor.h" +#include "Effect.h" +#include "EffectFunctionLibrary.h" + +ATrailTrigger::ATrailTrigger() +{ +} + +void ATrailTrigger::BeginPlay() +{ + Super::BeginPlay(); + if (Role == ROLE_Authority) + { + if (character == NULL) + { + FERROR("m_character is NULL"); + Destroy(); + return; + } + m_lastPos = character->GetActorLocation(); + SpawnTrail(FVector(0, 0, 0), true); + } +} + +void ATrailTrigger::SpawnTrail(FVector offset, bool first) +{ + + m_lastPos += offset; + UCapsuleComponent* newobject = NewObject(this); + newobject->SetCollisionProfileName(TEXT("Triggers")); + newobject->SetCapsuleRadius(colliderRadius, false); + newobject->SetCapsuleHalfHeight(500, false); + newobject->SetWorldLocation(m_lastPos); + newobject->OnComponentBeginOverlap.AddDynamic(this, &AAbilityTriggerBase::OnOverlapBegin); + newobject->OnComponentEndOverlap.AddDynamic(this, &AAbilityTriggerBase::OnOverlapEnd); + newobject->RegisterComponent(); + if(first) + RootComponent = newobject; + + FTransform effectTransform; + effectTransform.SetTranslation(m_lastPos); + effectTransform.SetRotation(character->GetActorRotation().Quaternion()); + UEffectFunctionLibrary::CreateEffectAt(this, trailEffectClass, effectTransform,0.0f,lifeTime); + + //ATrailActor* newTrailActor = GetWorld()->SpawnActor(trailActors); + //if (newTrailActor == nullptr) + // return;6 + //newTrailActor->SetActorLocation(m_lastPos); + //newTrailActor->SetOwner(this); + //newTrailActor->DynamicAdd(); +} + +void ATrailTrigger::Tick(float DeltaTime) +{ + Super::Tick(DeltaTime); + if (Role != ROLE_Authority || !IsValid(this)) + return; + if (colliderSpawnDistance == 0) + { + FERROR("colliderSpawnDistance == 0"); + return; + } + //m_timer += DeltaTime; + if ( !character ) return; + FVector distvec = character->GetActorLocation() - m_lastPos; + distvec.Z = 0; + float dist = distvec.Size(); + m_totalTimer += DeltaTime; + lifeTime -= DeltaTime; + if (lifeTime < 0) + { + Destroy(); + return; + } + if (m_totalTimer > totalSpawnTime) + { + return; + } + while (dist > colliderSpawnDistance) + { + UCapsuleComponent* newobject = NewObject(this); + distvec.Normalize(); + dist -= colliderSpawnDistance; + + SpawnTrail(distvec *colliderSpawnDistance); + } + +} \ No newline at end of file diff --git a/Source/UnrealProject/Abilities/TrailTrigger.h b/Source/UnrealProject/Abilities/TrailTrigger.h new file mode 100644 index 0000000..b6648f7 --- /dev/null +++ b/Source/UnrealProject/Abilities/TrailTrigger.h @@ -0,0 +1,40 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Abilities/AbilityTriggerBase.h" +#include "TrailTrigger.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API ATrailTrigger : public AAbilityTriggerBase +{ + GENERATED_BODY() +public: + virtual void BeginPlay() override; + + ATrailTrigger(); + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Trigger", meta = (ClampMin = "0", UIMin = "0")) + float totalSpawnTime = 1.5f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Trigger", meta = (ClampMin = "0", UIMin = "0")) + float lifeTime = 5.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Trigger", meta = (ClampMin = "0", UIMin = "0")) + float colliderSpawnDistance = 50.0f; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Trigger", meta = (ClampMin = "0", UIMin = "0")) + float colliderRadius = 50.0f; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Trigger", meta = (ClampMin = "0", UIMin = "0")) + TSubclassOf trailEffectClass; + + + virtual void Tick(float DeltaSeconds) override; + +private: + void SpawnTrail(FVector offset, bool first = false); + float m_tickTimer = 0.0f; + FVector m_lastPos; + float m_totalTimer = 0.0f; +}; diff --git a/Source/UnrealProject/Abilities/poisonAuraTrigger.cpp b/Source/UnrealProject/Abilities/poisonAuraTrigger.cpp new file mode 100644 index 0000000..67e952d --- /dev/null +++ b/Source/UnrealProject/Abilities/poisonAuraTrigger.cpp @@ -0,0 +1,52 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "poisonAuraTrigger.h" +#include "NetworkCharacter.h" +#include "NativeModifiers.h" +#include "Modifier.h" + + + +ApoisonAuraTrigger::ApoisonAuraTrigger() +{ + +} +void ApoisonAuraTrigger::BeginPlay() +{ + Super::BeginPlay(); +} +void ApoisonAuraTrigger::Tick(float deltaTime) +{ + Super::Tick(deltaTime); +} +void ApoisonAuraTrigger::HitEvent(ANetworkCharacter* otherActor) +{ + + ModifierManager* manager = otherActor->GetModifierManager(); + if (playerMap.Find(otherActor) == nullptr) + { + RERROR("2 modifiers in the intimidatin aura"); + } + if (manager) + { + ADOTModifier* ASModifier = GetWorld()->SpawnActor(); + ASModifier->lifeTime = 0; + ASModifier->damagePerTick = damage; + ASModifier->target = otherActor; + manager->AddModifier(ASModifier); + playerMap.Add(otherActor, ASModifier); + + } + return Super::HitEvent(otherActor); +} +void ApoisonAuraTrigger::LeaveEvent(ANetworkCharacter* otherActor) +{ + + auto it = playerMap.Find(otherActor); + if (it == nullptr) + return Super::LeaveEvent(otherActor); + (*it)->ForceDestroy(); + playerMap.Remove(otherActor); + return Super::LeaveEvent(otherActor); +} \ No newline at end of file diff --git a/Source/UnrealProject/Abilities/poisonAuraTrigger.h b/Source/UnrealProject/Abilities/poisonAuraTrigger.h new file mode 100644 index 0000000..c249a1a --- /dev/null +++ b/Source/UnrealProject/Abilities/poisonAuraTrigger.h @@ -0,0 +1,28 @@ +// Project Lab - NHTV Igad + +#pragma once +#include +#include "Abilities/ConeTrigger.h" +#include "poisonAuraTrigger.generated.h" + +/** + * + */ + + +UCLASS() +class UNREALPROJECT_API ApoisonAuraTrigger : public AConeTrigger +{ + GENERATED_BODY() +public: + ApoisonAuraTrigger(); + + virtual void BeginPlay() override; + virtual void Tick(float DeltaSeconds) override; + virtual void HitEvent(class ANetworkCharacter* otherActor)override; + virtual void LeaveEvent(class ANetworkCharacter* otherActor)override; + UPROPERTY() + TMap playerMap; + UPROPERTY(meta = (ExposeOnSpawn), BlueprintReadWrite) + float damage; +}; diff --git a/Source/UnrealProject/Creatures/AnimationProxy.cpp b/Source/UnrealProject/Creatures/AnimationProxy.cpp new file mode 100644 index 0000000..cbe9d56 --- /dev/null +++ b/Source/UnrealProject/Creatures/AnimationProxy.cpp @@ -0,0 +1,37 @@ +#include "UnrealProject.h" +#include "AnimationProxy.h" + +bool FMainAnimProxy::Evaluate(FPoseContext& pose) +{ + // Evalueate the animation pose according to the blueprint + if(GetRootNode() != NULL) + { + GetRootNode()->Evaluate(pose); + } + + // Now set bone scales for character customizations + SetBoneScale(boneNames[0], FVector(charCustomization.headScale), pose); + + SetBoneScale(boneNames[1], FVector(1, charCustomization.legThicknessYScale, charCustomization.legThicknessZScale), pose); + SetBoneScale(boneNames[2], FVector(1, charCustomization.legThicknessYScale, charCustomization.legThicknessZScale), pose); + + SetBoneScale(boneNames[3], FVector(charCustomization.leftArmScale), pose); + SetBoneScale(boneNames[4], FVector(charCustomization.rightArmScale), pose); + + SetBoneScale(boneNames[5], FVector(charCustomization.torsoScale), pose); + + SetBoneScale(boneNames[6], FVector(charCustomization.overallScale), pose); + + return true; +} + +void FMainAnimProxy::SetBoneScale(const FName boneName, const FVector scale, FPoseContext& pose) +{ + int32 boneIndex = this->GetSkelMeshComponent()->GetBoneIndex(boneName); + // Check if bone is in the skeleton. + if(boneIndex != INDEX_NONE) + { + FTransform& boneTransform = pose.Pose[FCompactPoseBoneIndex(boneIndex)]; + boneTransform.SetScale3D(scale); + } +} \ No newline at end of file diff --git a/Source/UnrealProject/Creatures/AnimationProxy.h b/Source/UnrealProject/Creatures/AnimationProxy.h new file mode 100644 index 0000000..5355381 --- /dev/null +++ b/Source/UnrealProject/Creatures/AnimationProxy.h @@ -0,0 +1,22 @@ +#pragma once +#include "Animation/AnimInstanceProxy.h" +#include "PlayerSetupState.h" + +// Animation instance proxy that sets bone scales for character customizations +// This animation proxy just calculates the animation blueprint's pose and then applies bone scaled to them based on character customizations +struct FMainAnimProxy : FAnimInstanceProxy +{ + // The parent animation + FCharacterCustomization charCustomization; + + // Head + // Thigh L + // Thigh R + // UpperArm L + // UpperArm R + // Root + FName boneNames[7]; + + virtual bool Evaluate(FPoseContext& pose) override; + void SetBoneScale(const FName boneName, const FVector scale, FPoseContext& pose); +}; diff --git a/Source/UnrealProject/Creatures/BehaviorTree/BTTaskNodeClimb.cpp b/Source/UnrealProject/Creatures/BehaviorTree/BTTaskNodeClimb.cpp new file mode 100644 index 0000000..926610b --- /dev/null +++ b/Source/UnrealProject/Creatures/BehaviorTree/BTTaskNodeClimb.cpp @@ -0,0 +1,64 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "BTTaskNodeClimb.h" +#include "EnemyAIController.h" +#include "BehaviorTree/BehaviorTree.h" +#include "BehaviorTree/BlackboardComponent.h" +#include "BehaviorTree/Blackboard/BlackboardKeyType_Object.h" +#include "BehaviorTree/Blackboard/BlackboardKeyType_Vector.h" + + +UBTTaskNodeClimb::UBTTaskNodeClimb() +{ + NodeName = "Climb"; + bNotifyTick = true; + // accept only actors and vectors + BlackboardKey.AddObjectFilter(this, GET_MEMBER_NAME_CHECKED(UBTTaskNodeClimb, BlackboardKey), AActor::StaticClass()); + BlackboardKey.AddVectorFilter(this, GET_MEMBER_NAME_CHECKED(UBTTaskNodeClimb, BlackboardKey)); + directionKey.AddVectorFilter(this, GET_MEMBER_NAME_CHECKED(UBTTaskNodeClimb, directionKey)); + directionKey.AddObjectFilter(this, GET_MEMBER_NAME_CHECKED(UBTTaskNodeClimb, directionKey), AActor::StaticClass()); +} +void UBTTaskNodeClimb::InitializeFromAsset(UBehaviorTree& Asset) +{ + Super::InitializeFromAsset(Asset); + + UBlackboardData &BBAsset = *GetBlackboardAsset(); + BlackboardKey.ResolveSelectedKey(BBAsset); + directionKey.ResolveSelectedKey(BBAsset); +} + +EBTNodeResult::Type UBTTaskNodeClimb::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) +{ + EBTNodeResult::Type NodeResult = EBTNodeResult::InProgress; + NodeResult = PeformClimbTask(OwnerComp, NodeMemory); + return NodeResult; +} +EBTNodeResult::Type UBTTaskNodeClimb::PeformClimbTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) +{ + const UBlackboardComponent* MyBlackboard = OwnerComp.GetBlackboardComponent(); + AAIController* MyController = OwnerComp.GetAIOwner(); + AEnemyAIController* cont = Cast(OwnerComp.GetAIOwner()); + EBTNodeResult::Type NodeResult = EBTNodeResult::Failed; + if (cont && MyBlackboard) + { + const FVector TargetLocation = MyBlackboard->GetValue(BlackboardKey.GetSelectedKeyID()); + FVector TargetDirection = FVector::ZeroVector; + MyBlackboard->GetLocationFromEntry(directionKey.GetSelectedKeyID(), TargetDirection); + + if (cont->VerticleMoveTo(TargetLocation, TargetDirection,AcceptableRadius )) + { + NodeResult = EBTNodeResult::Succeeded; + } + else NodeResult = EBTNodeResult::InProgress; + } + return NodeResult; +} +void UBTTaskNodeClimb::TickTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, float DeltaSeconds) +{ + const EBTNodeResult::Type NodeResult = PeformClimbTask(OwnerComp, NodeMemory); + if (NodeResult != EBTNodeResult::InProgress) + { + FinishLatentTask(OwnerComp, NodeResult); + } +} \ No newline at end of file diff --git a/Source/UnrealProject/Creatures/BehaviorTree/BTTaskNodeClimb.h b/Source/UnrealProject/Creatures/BehaviorTree/BTTaskNodeClimb.h new file mode 100644 index 0000000..061d00e --- /dev/null +++ b/Source/UnrealProject/Creatures/BehaviorTree/BTTaskNodeClimb.h @@ -0,0 +1,36 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "BehaviorTree/Tasks/BTTask_BlackboardBase.h" +#include "BTTaskNodeClimb.generated.h" + +/** + * + */ +UCLASS(config = Game) +class UNREALPROJECT_API UBTTaskNodeClimb : public UBTTaskNode +{ + GENERATED_BODY() +public : + UPROPERTY(config, Category = Node, EditAnywhere, meta = (ClampMin = "0.0")) + float AcceptableRadius; + FName GetSelectedBlackboardKey() const; + UBTTaskNodeClimb(); + virtual EBTNodeResult::Type ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) override; + virtual void TickTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, float DeltaSeconds) override; + virtual void InitializeFromAsset(UBehaviorTree& Asset) override; + UPROPERTY(EditAnywhere, Category = Blackboard) + FBlackboardKeySelector directionKey; + UPROPERTY(EditAnywhere, Category = Blackboard) + FBlackboardKeySelector BlackboardKey; +protected: + EBTNodeResult::Type PeformClimbTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory); + + +}; + +FORCEINLINE FName UBTTaskNodeClimb::GetSelectedBlackboardKey() const +{ + return directionKey.SelectedKeyName; +} diff --git a/Source/UnrealProject/Creatures/BehaviorTree/BTTaskNodeJumpFence.cpp b/Source/UnrealProject/Creatures/BehaviorTree/BTTaskNodeJumpFence.cpp new file mode 100644 index 0000000..f1d7645 --- /dev/null +++ b/Source/UnrealProject/Creatures/BehaviorTree/BTTaskNodeJumpFence.cpp @@ -0,0 +1,56 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "BTTaskNodeJumpFence.h" +#include "EnemyAIController.h" +#include "BehaviorTree/BehaviorTree.h" +#include "BehaviorTree/BlackboardComponent.h" +#include "BehaviorTree/Blackboard/BlackboardKeyType_Object.h" +#include "BehaviorTree/Blackboard/BlackboardKeyType_Vector.h" + +UBTTaskNodeJumpFence::UBTTaskNodeJumpFence() +{ + NodeName = "Jump Fence"; + bNotifyTick = true; + BlackboardKey.AddObjectFilter(this, GET_MEMBER_NAME_CHECKED(UBTTaskNodeJumpFence, BlackboardKey), AActor::StaticClass()); + BlackboardKey.AddVectorFilter(this, GET_MEMBER_NAME_CHECKED(UBTTaskNodeJumpFence, BlackboardKey)); +} +void UBTTaskNodeJumpFence::InitializeFromAsset(UBehaviorTree& asset) +{ + Super::InitializeFromAsset(asset); + UBlackboardData& BBAsset = *GetBlackboardAsset(); + BlackboardKey.ResolveSelectedKey(BBAsset); +} +EBTNodeResult::Type UBTTaskNodeJumpFence::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) +{ + EBTNodeResult::Type NodeResult = EBTNodeResult::InProgress; + NodeResult = PefromJumpFenceTask(OwnerComp, NodeMemory); + return NodeResult; +} +EBTNodeResult::Type UBTTaskNodeJumpFence::PefromJumpFenceTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) +{ + const UBlackboardComponent* MyBlackboard = OwnerComp.GetBlackboardComponent(); + AAIController* MyController = OwnerComp.GetAIOwner(); + AEnemyAIController* cont = Cast(OwnerComp.GetAIOwner()); + EBTNodeResult::Type NodeResult = EBTNodeResult::Failed; + if (cont && MyBlackboard) + { + const FVector TargetLocation = MyBlackboard->GetValue(BlackboardKey.GetSelectedKeyID()); + FVector TargetDirection = FVector::ZeroVector; + if (cont->JumpFence(TargetLocation)) + { + NodeResult = EBTNodeResult::Succeeded; + } + else NodeResult = EBTNodeResult::InProgress; + } + return NodeResult; + +} +void UBTTaskNodeJumpFence::TickTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, float DeltaSeconds) +{ + const EBTNodeResult::Type NodeResult = PefromJumpFenceTask(OwnerComp, NodeMemory); + if (NodeResult != EBTNodeResult::InProgress) + { + FinishLatentTask(OwnerComp, NodeResult); + } +} \ No newline at end of file diff --git a/Source/UnrealProject/Creatures/BehaviorTree/BTTaskNodeJumpFence.h b/Source/UnrealProject/Creatures/BehaviorTree/BTTaskNodeJumpFence.h new file mode 100644 index 0000000..63c52b8 --- /dev/null +++ b/Source/UnrealProject/Creatures/BehaviorTree/BTTaskNodeJumpFence.h @@ -0,0 +1,25 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "BehaviorTree/BTTaskNode.h" +#include "BTTaskNodeJumpFence.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API UBTTaskNodeJumpFence : public UBTTaskNode +{ + GENERATED_BODY() +public: + UBTTaskNodeJumpFence(); + virtual EBTNodeResult::Type ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) override; + virtual void TickTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, float DeltaSeconds) override; + virtual void InitializeFromAsset(UBehaviorTree& Asset) override; + UPROPERTY(EditAnywhere, Category = Blackboard) + FBlackboardKeySelector BlackboardKey; +protected: + EBTNodeResult::Type PefromJumpFenceTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory); + +}; diff --git a/Source/UnrealProject/Creatures/BehaviorTree/EnemyAIController.cpp b/Source/UnrealProject/Creatures/BehaviorTree/EnemyAIController.cpp new file mode 100644 index 0000000..99a051b --- /dev/null +++ b/Source/UnrealProject/Creatures/BehaviorTree/EnemyAIController.cpp @@ -0,0 +1,178 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "EnemyAIController.h" +#include "EnemyBase.h" +#include "NetworkCharacter.h" +#include "Navigation/CrowdFollowingComponent.h" + +#include "BehaviorTree/BehaviorTree.h" +#include "BehaviorTree/BlackboardComponent.h" + +#include "BehaviorTree/BehaviorTreeComponent.h" +#include "BehaviorTree/BlackBoard/BlackboardKeyAllTypes.h" + +#include "DrawDebugHelpers.h" + +AEnemyAIController::AEnemyAIController(const FObjectInitializer& PCIP) + //: Super(PCIP.SetDefaultSubobjectClass(TEXT("PathFollowingComponent"))) +{ + blackBoardComp = CreateDefaultSubobject(FName("BlackBoardComp")); + behaviorTreeComp = CreateDefaultSubobject(FName("BehaviorTreeComp")); + climbSpeed = 1.0f; +} +void AEnemyAIController::Tick(float deltaTime) +{ + Super::Tick(deltaTime); + +} +void AEnemyAIController::Possess(APawn* pawn) +{ + Super::Possess(pawn); + AEnemyBase* enemy = Cast(pawn); + if (enemy &&enemy->treeBehavior) + { + if (!enemy->treeBehavior->BlackboardAsset) + { + RERROR("There is no blackboard asset in the behavior tree"); + return; + } + blackBoardComp->InitializeBlackboard(*(enemy->treeBehavior->BlackboardAsset)); + behaviorTreeComp->StartTree(*enemy->treeBehavior); + } +} +bool AEnemyAIController::VerticleMoveTo(FVector destination, FVector direction,float acceptRadius) +{ + FVector location =GetPawn()->GetActorLocation(); + FVector dest = destination; + dest -= location; + + dest *= direction; + FVector newDest= dest; + float height = newDest.Size(); + + + + if (height < acceptRadius&&destination.Z GetCharacterMovement()->GravityScale = 1; + + return true; + } + + GetPawn()->SetActorLocation(FVector(location.X+(direction.X*10), location.Y+(direction.Y*10) , (location.Z)+(direction.Z*10))); + GetCharacter()->GetCharacterMovement()->GravityScale = 0; + + return false; + +} +bool AEnemyAIController::JumpFence(FVector destination) +{ + TArray result; + UNavigationSystem* navsys = UNavigationSystem::GetCurrent(GetWorld()); + if (!navsys) + { + RERROR("There is no navigation system in the current level, please check if there is one or contact a developer!"); + return false; + } + ANPCBase* character = Cast(GetPawn()); + FVector direction; + FNavLocation navLocation; + character->SetActorEnableCollision(false); + DrawDebugLine(GetWorld(), GetPawn()->GetActorLocation(), GetPawn()->GetActorLocation() + GetActorUpVector()*-10000.0f, FColor(255, 0, 0),false, -1, 0, 12.333); + FCollisionQueryParams collisionParams; + collisionParams.AddIgnoredActor(this->GetPawn()); + GetWorld()->LineTraceMultiByChannel(result, GetPawn()->GetActorLocation(), GetPawn()->GetActorLocation() + GetActorUpVector()*-10000.0f, ECollisionChannel::ECC_WorldStatic, collisionParams); + for (int i = 0; i < result.Num(); i++) + { + + if(result[i].ImpactPoint!=GetPawn()->GetActorLocation()) + { + if (!navsys->ProjectPointToNavigation(GetPawn()->GetActorLocation(), navLocation)) + { + continue; + } + GetCharacter()->GetCharacterMovement()->GravityScale = 1; + SetBool(false,FName("ClimbKey")); + navsys->SimpleMoveToLocation(this,destination); + character->PlayNormalAnimation(); + character->SetActorEnableCollision(true); + return true; + } + } + character->PlayFencAnimation(); + direction = destination - GetPawn()->GetActorLocation(); + direction.Normalize(); + GetPawn()->SetActorLocation(GetPawn()->GetActorLocation()+(direction * 10)); + return false; +} +void AEnemyAIController::BeginInactiveState() +{ + Super::BeginInactiveState(); +} +void AEnemyAIController::SetVector(FVector vector, FName name) +{ + if (blackBoardComp) + { + blackBoardComp->SetValueAsVector(name, (vector)); + } + +} +void AEnemyAIController::SetBool(bool boolean, FName name) +{ + if (blackBoardComp) + { + blackBoardComp->SetValueAsBool(name, (boolean)); + } + +} +void AEnemyAIController::SetTarget(ANetworkCharacter* player) +{ + if (blackBoardComp) + { + blackBoardComp->SetValueAsObject((FName("Target")), (player)); + } +} +ANetworkCharacter* AEnemyAIController::GetTarget() +{ + if (blackBoardComp) + { + return Cast(blackBoardComp->GetValue(FName("Target"))); + } + return nullptr; + +} + +FVector AEnemyAIController::GetLocationTarget() +{ + if (blackBoardComp) + { + return FVector(blackBoardComp->GetValue(FName("TargetLocation"))); + } + return FVector(); +} + +FVector AEnemyAIController::GetHomeLocation() +{ + if (blackBoardComp) + { + return FVector(blackBoardComp->GetValue(FName("HomeLocation"))); + } + return FVector(); +} +FVector AEnemyAIController::GetSelfLocation() +{ + if (blackBoardComp) + { + return FVector(blackBoardComp->GetValue(FName("SelfLocation"))); + } + return FVector(); +} +bool AEnemyAIController::GetClimbKey() +{ + if (blackBoardComp) + { + return blackBoardComp->GetValue((FName("ClimbKey"))); + } + else return false; +} \ No newline at end of file diff --git a/Source/UnrealProject/Creatures/BehaviorTree/EnemyAIController.h b/Source/UnrealProject/Creatures/BehaviorTree/EnemyAIController.h new file mode 100644 index 0000000..531c0c5 --- /dev/null +++ b/Source/UnrealProject/Creatures/BehaviorTree/EnemyAIController.h @@ -0,0 +1,56 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "AIController.h" +#include "EnemyAIController.generated.h" + +/** +* +*/ +UCLASS() +class UNREALPROJECT_API AEnemyAIController : public AAIController +{ + GENERATED_BODY() + +public: + AEnemyAIController(const FObjectInitializer& PCIP); + UPROPERTY(transient) + class UBlackboardComponent* blackBoardComp; + + UPROPERTY(transient) + class UBehaviorTreeComponent* behaviorTreeComp; + UPROPERTY(transient) + float climbSpeed; + virtual void Tick(float deltaTime)override; + virtual void Possess(APawn* pawn) override; + virtual void BeginInactiveState() override; + bool VerticleMoveTo(FVector destination,FVector direction, float acceptRadius); + bool JumpFence(FVector destination); + + + + UFUNCTION(BlueprintCallable, Category = Behavior) + void SetVector(FVector vector, FName name); + UFUNCTION(BlueprintCallable, Category = Behavior) + void SetBool(bool boolean, FName name); + UFUNCTION(BlueprintCallable, Category = Behavior) + void SetTarget(class ANetworkCharacter* player); + UFUNCTION(BlueprintCallable, Category = Behavior) + class ANetworkCharacter* GetTarget(); + UFUNCTION(BlueprintCallable, Category = Behavior) + FVector GetLocationTarget(); + UFUNCTION(BlueprintCallable, Category = Behavior) + FVector GetHomeLocation(); + UFUNCTION(BlueprintCallable, Category = Behavior) + FVector GetSelfLocation(); + // UFUNCTION(BlueprintCallable, Category = Behavior) + // bool GetEnableTree(); + UFUNCTION(BlueprintCallable, Category = Behavior) + bool GetClimbKey(); +protected: + uint8 targetkey; + + +}; + diff --git a/Source/UnrealProject/Creatures/BossBase.cpp b/Source/UnrealProject/Creatures/BossBase.cpp new file mode 100644 index 0000000..54b6560 --- /dev/null +++ b/Source/UnrealProject/Creatures/BossBase.cpp @@ -0,0 +1,96 @@ + // Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "BossBase.h" +#include "MusicPlayer.h" +#include "SpawnerBase.h" +#include "NetworkPlayer.h" +#include "KingOfTheHillGameMode.h" +#include "KOTHBossSpawner.h" + + +ABossBase::ABossBase() +{ + PrimaryActorTick.bCanEverTick = true; + +} + +void ABossBase::BeginPlay() +{ + Super::BeginPlay(); + + m_usesMana = false; + m_musicPlayer = nullptr; + + // Search for a music player in the world. + for (TActorIterator actorItr(GetWorld()); actorItr; ++actorItr) + { + m_musicPlayer = *actorItr; + break; + } + + if (Role != ROLE_Authority) + return; +} +void ABossBase::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + + if (Role != ROLE_Authority) + return; + + // Stop playing boss music. + if (m_musicPlayer != nullptr) + m_musicPlayer->SetInCombat(false); + +} +void ABossBase::Tick(float deltaTime) +{ + Super::Tick(deltaTime); + if (Role != ROLE_Authority) + return; + + if((!IsPendingKill() || !IsPendingKill()) && GetTeam() < 5) + { + AKOTHBossSpawner* bSpawner = Cast(m_spawn); + AKingOfTheHillGameMode* kothMode = Cast(GetWorld()->GetAuthGameMode()); + if(kothMode&&bSpawner) + kothMode->AddScore(GetTeam(), deltaTime); + } +} + + +void ABossBase::m_Engaged() +{ + // Set music to combat music. + if (m_musicPlayer != nullptr) + m_musicPlayer->SetInCombat(true); +} +void ABossBase::m_Disengaged() +{ + // Set music to regular music. + if (m_musicPlayer != nullptr) + m_musicPlayer->SetInCombat(false); +} +void ABossBase::NativeOnKilled(class ANetworkCharacter* killer, class UAbilityInfo* ability) +{ + Super::NativeOnKilled(killer, ability); + if (Role != ROLE_Authority) + return; + if (m_spawn &&m_spawn->possesable) + { + // m_spawn->CaptureCamp(killer->GetTeam()); + //AKOTHBossSpawner* bSpawner = Cast(m_spawn); + //AKingOfTheHillGameMode* kothMode = Cast(GetWorld()->GetAuthGameMode()); + //if (kothMode&&bSpawner) + //{ + /* for (TActorIteratoractorIt(GetWorld()); actorIt; ++actorIt) + { + + ASpawnerBase *spawn = *actorIt; + if(!spawn->possesable) + spawn->SetTeam(killer->GetTeam()); + } + }*/ + } +} \ No newline at end of file diff --git a/Source/UnrealProject/Creatures/BossBase.h b/Source/UnrealProject/Creatures/BossBase.h new file mode 100644 index 0000000..4e9d96f --- /dev/null +++ b/Source/UnrealProject/Creatures/BossBase.h @@ -0,0 +1,28 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Creatures/NPCBase.h" +#include "BossBase.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API ABossBase : public ANPCBase +{ + GENERATED_BODY() +public: + ABossBase(); + virtual void BeginPlay() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + virtual void Tick(float deltaTime) override; + virtual void NativeOnKilled(class ANetworkCharacter* killer, class UAbilityInfo* ability) override; +protected: + virtual void m_Engaged(); + virtual void m_Disengaged(); + float timer; +private: + UPROPERTY() + class AMusicPlayer* m_musicPlayer; +}; diff --git a/Source/UnrealProject/Creatures/CharacterBase.cpp b/Source/UnrealProject/Creatures/CharacterBase.cpp new file mode 100644 index 0000000..6237a49 --- /dev/null +++ b/Source/UnrealProject/Creatures/CharacterBase.cpp @@ -0,0 +1,300 @@ +#include "UnrealProject.h" +#include "SpawnerBase.h" +#include "CharacterBase.h" +#include "ItemBase.h" +#include "BaseSkillObject.h" +#include "WiebertAnimation.h" +#include "DefaultGameState.h" +#include "MainCharacterAnimation.h" +#include "SkillTreeState.h" + + +ACharacterBase::ACharacterBase() +{ + m_team = 0; + bReplicates = true; + + visionRadius = 1000; +} + +void ACharacterBase::BeginPlay() +{ + Super::BeginPlay(); + + // If this actor is attached to a spawner base, it must be ignored + AActor* const parent = GetAttachParentActor(); + if (parent != nullptr && parent->IsA()) + return; + + // Register to the minimap + UWorld* const world = GetWorld(); + if (IsValid(world)) + { + ADefaultGameState* const gameState = Cast(world->GetGameState()); + if (IsValid(gameState)) + { + const FVector location = GetActorLocation(); + minimapHandle.position = FVector2D(location.X, location.Y); + minimapHandle.character = this; + gameState->minimapQuadtree.AddObject(minimapHandle); + } + } +} +void ACharacterBase::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + + // Unregister to the minimap + ADefaultGameState* const gameState = Cast(GetWorld()->GetGameState()); + if (IsValid(gameState) && minimapHandle.root) + gameState->minimapQuadtree.RemoveObject(minimapHandle); + + minimapHandle.root = nullptr; + minimapHandle.node = nullptr; + minimapHandle.character = nullptr; +} +void ACharacterBase::Tick(float deltaTime) +{ + Super::Tick(deltaTime); + + const FVector location = GetActorLocation(); + minimapHandle.position = FVector2D(location.X, location.Y); +} + +void ACharacterBase::m_EquipSkills_Implementation(const TArray& skills) +{ + for(UBaseSkillObject* skill : skills) + { + // Check if not yet equiped + if(!m_equipedSkills.Contains(skill)) + { + AItemBase::CreateItemsFromSkill(GetWorld(), skill, this); + m_equipedSkills.Add(skill); + } + } +} + +void ACharacterBase::EquipSkills(const TArray& skills) +{ + m_EquipSkills(skills); +} +void ACharacterBase::EquipSkillsFromSkillTreeState(const struct FSkillTreeState& skState) +{ + TArray skillObjects; + for(const FSkillTreeStateObject& obj : skState.objects) + { + UBaseSkillObject* skillObj = obj.skillObject->GetDefaultObject(); + if(!skillObj) + continue; + skillObjects.Add(skillObj); + } + m_EquipSkills(skillObjects); +} +void ACharacterBase::EquipItems_Implementation(const TArray>& itemClasses) +{ + for(auto& itemClass : itemClasses) + { + EquipItem_Implementation(itemClass); + } +} +void ACharacterBase::EquipItem_Implementation(TSubclassOf itemClass) +{ + if(itemClass == nullptr) + return; + + AItemBase* item = GetWorld()->SpawnActor(itemClass); + AItemBase* existing = AItemBase::CheckSlotOccupied(item->type, this); + if(existing) + existing->Destroy(); + if(item) + { + if(!item->AttachItemToCharacter(this)) + { + item->Destroy(); + } + } +} + +void ACharacterBase::SendInitialAppearance(APlayerController* pc) +{ + if(Role == ROLE_Authority) + { + m_ReceiveInitialAppearance(pc, GetEquipedSkills(), GetCharacterCustomization()); + } +} + +void ACharacterBase::m_ReceiveInitialAppearance_Implementation(APlayerController* pc, const TArray& itemClasses, const FCharacterCustomization& cc) +{ + APlayerController* localPC = GetGameInstance()->GetFirstLocalPlayerController(); + if(pc == localPC) + { + EquipSkills(itemClasses); + SetCustomizations_Implementation(cc); + } +} + +void ACharacterBase::Destroyed() +{ + auto destroyItems = m_items; + for(auto item : destroyItems) + { + if(IsValid(item)) + { + item->Destroy(); + } + } + Super::Destroyed(); +} + +TArray> ACharacterBase::GetEquipedItemClasses() const +{ + TArray> ret; + for(auto item : m_items) + { + ret.Add(item->GetClass()); + } + return ret; +} +const TArray& ACharacterBase::GetEquipedItems() const +{ + return m_items; +} + +const FCharacterCustomization& ACharacterBase::GetCharacterCustomization() const +{ + static FCharacterCustomization dummy; + USkeletalMeshComponent* skMesh = GetMesh(); + if(skMesh) + { + UWiebertAnimation* animBP = Cast(skMesh->GetAnimInstance()); + if(animBP) + { + return animBP->charCustomization; + } + else + { + UMainCharacterAnimation* charBP = Cast(skMesh->GetAnimInstance()); + if (charBP) + { + return charBP->charCustomization; + } + } + } + return dummy; +} + +const TArray& ACharacterBase::GetEquipedSkills() const +{ + return m_equipedSkills; +} + +void ACharacterBase::UnequipSkills_Implementation(const TArray& skills) +{ + for(auto skill : skills) + { + if(m_equipedSkills.Contains(skill)) + { + TArray items; + m_mappedItems.MultiFind(skill, items); + for(auto item : items) + item->Destroy(); + m_equipedSkills.Remove(skill); + } + } +} + +void ACharacterBase::ClearEquipment_Implementation() +{ + auto clearItems = m_items; + for(auto item : clearItems) + { + if(IsValid(item)) + { + item->Destroy(); + } + } + m_mappedItems.Reset(); + m_equipedSkills.SetNum(0); + m_items.SetNum(0); +} +void ACharacterBase::SetCustomizations_Implementation(const FCharacterCustomization& cc) +{ + USkeletalMeshComponent* skMesh = GetMesh(); + if(skMesh) + { + UWiebertAnimation* animBP = Cast(skMesh->GetAnimInstance()); + if(animBP) + { + animBP->SetCharacterCustomization(cc); + } + else + { + UMainCharacterAnimation* charBP = Cast(skMesh->GetAnimInstance()); + if (charBP) + { + charBP->SetCharacterCustomization(cc); + } + } + } + else + { + GERROR("Can't set customization, no skeletal mesh on character"); + } +} + +void ACharacterBase::m_OnItemAdded(AItemBase* item) +{ + // Add item to list of items assigned to given skill object + if(item->skillObject) + m_mappedItems.Add(item->skillObject, item); + m_items.Add(item); +} +void ACharacterBase::m_OnItemRemoved(AItemBase* item) +{ + // Remove mapped item + m_mappedItems.RemoveSingle(item->skillObject, item); + m_items.Remove(item); +} + +void ACharacterBase::m_OnRep_Team() +{ + +} + +int32 ACharacterBase::GetTeam() const +{ + return m_team; +} +void ACharacterBase::SetTeam(int32 team) +{ + check(Role == ROLE_Authority); // Server only call + m_team = team; + m_OnRep_Team(); +} + +void ACharacterBase::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + + DOREPLIFETIME(ACharacterBase, m_team); + DOREPLIFETIME(ACharacterBase, playerName); +} + +void ACharacterBase::RegisterEffect(class AEffect* effect) +{ + if(effect != nullptr) + m_effects.Add(effect); +} +void ACharacterBase::UnRegisterEffect(class AEffect* effect) +{ + if(effect == nullptr) + { + FWARNING("invalid effect is unregistering"); + return; + } + m_effects.Remove(effect); +} +TArray ACharacterBase::GetEffects() +{ + return m_effects; +} \ No newline at end of file diff --git a/Source/UnrealProject/Creatures/CharacterBase.h b/Source/UnrealProject/Creatures/CharacterBase.h new file mode 100644 index 0000000..2faa58e --- /dev/null +++ b/Source/UnrealProject/Creatures/CharacterBase.h @@ -0,0 +1,94 @@ +#pragma once +#include "GameFramework/Character.h" +#include "PlayerSetupState.h" +#include "MiniMap.h" +#include "CharacterBase.generated.h" + +UCLASS() +class ACharacterBase : public ACharacter +{ + GENERATED_BODY() + friend class AItemBase; +public: + ACharacterBase(); + + virtual void BeginPlay() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + virtual void Tick(float deltaTime) override; + + UFUNCTION(BlueprintCallable, Category = "Appearance") + void EquipSkills(const TArray& skills); + UFUNCTION(BlueprintCallable, Category = "Appearance") + void EquipSkillsFromSkillTreeState(const struct FSkillTreeState& skState); + UFUNCTION(NetMulticast, Reliable) + void EquipItems(const TArray>& itemClasses); + UFUNCTION(NetMulticast, Reliable) + void EquipItem(TSubclassOf itemClasses); + + void SendInitialAppearance(APlayerController* pc); + + void Destroyed() override; + + UFUNCTION(BlueprintCallable, NetMulticast, Reliable, Category = "Appearance") + void UnequipSkills(const TArray& skills); + UFUNCTION(BlueprintCallable, NetMulticast, Reliable, Category = "Appearance") + void ClearEquipment(); + UFUNCTION(BlueprintCallable, NetMulticast, Reliable, Category = "Appearance") + void SetCustomizations(const FCharacterCustomization& cc); + + UFUNCTION(BlueprintCallable, Category = "Appearance") + const TArray& GetEquipedSkills() const; + UFUNCTION(BlueprintCallable, Category = "Appearance") + const TArray& GetEquipedItems() const; + UFUNCTION(BlueprintCallable, Category = "Appearance") + TArray> GetEquipedItemClasses() const; + UFUNCTION(BlueprintCallable, Category = "Appearance") + const FCharacterCustomization& GetCharacterCustomization() const; + + UFUNCTION(BlueprintCallable, Category = "Team") + int32 GetTeam() const; + UFUNCTION(BlueprintCallable, Category = "Team") + virtual void SetTeam(int32 team); + + // Tracking functions for effects on characters + UFUNCTION(BlueprintCallable, Category = "Effect") + void RegisterEffect(class AEffect* effect); + UFUNCTION(BlueprintCallable, Category = "Effect") + void UnRegisterEffect(class AEffect* effect); + UFUNCTION(BlueprintCallable, Category = "Effect") + TArray GetEffects(); + + // The name of the player that controls this unit (Only for ghosts, players and illusions) + UPROPERTY(BlueprintReadOnly, Replicated) + FString playerName; + + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Vision") + float visionRadius; + + MiniMap::MinimapHandle minimapHandle; + +private: + // Trigerred from RequestInitialAppearance send back to the client + UFUNCTION(NetMulticast, Reliable) + void m_ReceiveInitialAppearance(APlayerController* pc, const TArray& itemClasses, const FCharacterCustomization& cc); + // Internal usage EquipSkills to allow multiple ways to call this function from blueprints + UFUNCTION(NetMulticast, Reliable) + void m_EquipSkills(const TArray& skills); + void m_OnItemAdded(AItemBase* item); + void m_OnItemRemoved(AItemBase* item); + +protected: + UFUNCTION() + virtual void m_OnRep_Team(); + + UPROPERTY(ReplicatedUsing=m_OnRep_Team) + int32 m_team; + + // Maps skills to the items it spawned + TMultiMap m_mappedItems; + TArray m_equipedSkills; + UPROPERTY() + TArray m_items; + + TArray m_effects; +}; diff --git a/Source/UnrealProject/Creatures/EnemyBase.cpp b/Source/UnrealProject/Creatures/EnemyBase.cpp new file mode 100644 index 0000000..fb31bc9 --- /dev/null +++ b/Source/UnrealProject/Creatures/EnemyBase.cpp @@ -0,0 +1,190 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "SpawnerBase.h" +#include "EnemyBase.h" +#include "AbilityInfo.h" +#include "NetworkPlayer.h" +#include "GeneralEnemy.h" +#include "BehaviorTree/EnemyAIController.h" +#include "BehaviorTree/BehaviorTree.h" +#include "MinionAnimInstance.h" + +AEnemyBase::AEnemyBase() +{ + PrimaryActorTick.bCanEverTick = true; + finnishedAttack = false; + informGeneralTime = 2.0f; + m_tempTarget = nullptr; + // AIControllerClass = AEnemyAIController::StaticClass(); +} +void AEnemyBase::BeginPlay() +{ + Super::BeginPlay(); + + specialAbilityChance = m_ReCalcChance(specialAbilityChance); + enemycontroller = Cast(GetController()); + if (enemycontroller && m_spawn) + { + enemycontroller->SetBool(true, FName("ClimbKey")); + enemycontroller->SetVector(FVector(0, 0, 1), FName("ClimbDirection")); + enemycontroller->SetVector(m_spawn->GetActorLocation() + FVector(0, 0, 100), FName("ClimbLocation")); + + } + else + { + + FActorSpawnParameters SpawnInfo; + SpawnInfo.Instigator = Instigator; + SpawnInfo.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn; + SpawnInfo.OverrideLevel = GetLevel(); + SpawnInfo.ObjectFlags |= RF_Transient; // We never want to save AI controllers into a map + AController* NewController = GetWorld()->SpawnActor(AEnemyAIController::StaticClass(), GetActorLocation(), GetActorRotation(), SpawnInfo); + if (NewController != NULL) + { + // if successful will result in setting this->Controller + // as part of possession mechanics + NewController->Possess(this); + } + enemycontroller = Cast(GetController()); + if (enemycontroller && m_spawn) + { + if (m_spawn->SpawnLocation.Num() > 0) + { + PlayClimbingAnimation(); + enemycontroller->SetBool(true, FName("ClimbKey")); + enemycontroller->SetVector(FVector(0, 0, 1), FName("ClimbDirection")); + enemycontroller->SetVector(m_spawn->GetActorLocation() + FVector(0, 0, 100), FName("ClimbLocation")); + } + } + else + { + // RERROR("There is no valid controller on this enemy"); + } + } + hasSpawned = false; + +} +void AEnemyBase::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + general = nullptr; + if (m_spawn) + { + + if (m_spawn->hasGeneral) + { + m_spawn->formationEnemies.Remove(this); + } + } +} + +void AEnemyBase::Tick(float deltaTime) +{ + Super::Tick(deltaTime); + if (Role != ROLE_Authority) + { + return; + } + m_confusionTimer -= deltaTime; + if (!IsA(AGeneralEnemy::StaticClass())) + m_hasGeneral = hasGeneral; + if (!hasGeneral && enemycontroller && enemycontroller->IsA(AEnemyAIController::StaticClass())) + { + + enemycontroller->SetBool(false, FName("EnableTree")); + } + + if (IsValid(target)) + { + if (hasGeneral) + { + m_informGeneralTimer -= deltaTime; + if (m_informGeneralTimer < 0.0f&&IsValid(general)) + InformGeneral(); + } + else + { + SwitchAgro(); + } + } + else if(!hasGeneral) + { + FVector randpos = FMath::VRand(); + randpos.Z = 0.0f; + float randomRange = FMath::FRandRange(m_spawn->aggroRadius / 4, m_spawn->aggroRadius); + + randpos = randpos*randomRange; + + MoveToPointSlow(randpos + m_spawn->GetActorLocation(), 50.0f); + } +} +void AEnemyBase::InformGeneral() +{ + if (!IsValid(general) || !IsValid(target)) + return; + if (FVector::DistSquared(m_spawn->GetActorLocation(), target->GetActorLocation()) > m_spawn->deaggroRadius*m_spawn->deaggroRadius) + return; + if( !IsValid(general->target)) + { + general->target = m_tempTarget; + ChangeNPCAnimation((uint8)EMinionAnimState::MAS_Pointing); + //CHANGEANIMATION(EMinionAnimState::MAS_Pointing); + + m_informGeneralTimer = informGeneralTime; + m_tempTarget = nullptr; + } +} +void AEnemyBase::SwitchAgro() +{ + if (m_spawn->GetNearbyPlayers().Num() <= 1) + return; + float mostDamage =0.0f; + ANetworkCharacter* character = nullptr; + for (int i = 0; i < m_spawn->GetNearbyPlayers().Num(); i++) + { + if (m_spawn->GetNearbyPlayers()[i]->GetTotalDamage()>mostDamage) + { + mostDamage = m_spawn->GetNearbyPlayers()[i]->GetTotalDamage(); + character = m_spawn->GetNearbyPlayers()[i]; + } + } + if(IsValid(character)) + this->target = character; +} +void AEnemyBase::ConfusionBehavior() +{ + FVector randpos = FMath::VRand(); + randpos.Z = 0.0f; + float randomRange = FMath::FRandRange(m_spawn->aggroRadius / 4, m_spawn->aggroRadius); + + randpos = randpos*randomRange; + + MoveToPointSlow(randpos + m_spawn->GetActorLocation(), 50.0f); +} +void AEnemyBase::ChargeBehavior() +{ + +} +void AEnemyBase::OffensiveBehavior() +{ + + +} +void AEnemyBase::RangedBehavior() +{ +} +void AEnemyBase::ResetConfusionTimer(float confusionTime) +{ + m_confusionTimer = confusionTime; +} +float AEnemyBase::m_ReCalcChance(float chance) +{ + return (1000 - (chance * 10)); +} +int32 AEnemyBase::NativeDealDamage(class ANetworkCharacter* dealer, int32 damage, float armorPercentageIgnore, class UAbilityInfo* ability) +{ + m_tempTarget = dealer; + m_informGeneralTimer = informGeneralTime; + return Super::NativeDealDamage(dealer, damage, armorPercentageIgnore, ability); +} \ No newline at end of file diff --git a/Source/UnrealProject/Creatures/EnemyBase.h b/Source/UnrealProject/Creatures/EnemyBase.h new file mode 100644 index 0000000..2582df1 --- /dev/null +++ b/Source/UnrealProject/Creatures/EnemyBase.h @@ -0,0 +1,60 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Creatures/NPCBase.h" +#include "EnemyBase.generated.h" + +/** + * + */ + +UCLASS() +class UNREALPROJECT_API AEnemyBase : public ANPCBase +{ + GENERATED_BODY() +public: + AEnemyBase(); + virtual void BeginPlay() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + virtual void Tick(float deltaTime) override; + virtual int32 NativeDealDamage(class ANetworkCharacter* dealer, int32 damage, float armorPercentageIgnore, class UAbilityInfo* ability) override; + + void OffensiveBehavior(); + void RangedBehavior(); + void ChargeBehavior(); + void InformGeneral(); + void SwitchAgro(); + void ConfusionBehavior(); + void ResetConfusionTimer(float confusionTime); + UPROPERTY(EditAnywhere, Category = Behavior) + class UBehaviorTree* treeBehavior; + UPROPERTY(EditAnywhere, Category = "Attack Settings") + float informGeneralTime; + UPROPERTY(EditAnywhere, Category = "Ability Settings") + class UAbilityInfo* specialAbility; + UPROPERTY(EditAnywhere, Category = "Ability Settings") + class UAbilityInfo* meleeAbility; + UPROPERTY(EditAnywhere, Category = "Ability Settings") + class UAbilityInfo* rangedAbility; + UPROPERTY(EditAnywhere, Category = "Ability Settings") + float specialAbilityChance; + FVector scatterLocation; + bool hasGeneral; + bool finnishedAttack; + bool hasSpawned; + UPROPERTY() + class AEnemyAIController* enemycontroller; + UPROPERTY() + class AGeneralEnemy* general; + UPROPERTY() + ANetworkCharacter* m_tempTarget; +protected: + float m_ReCalcChance(float chance); + bool m_rotateToPlayer; + float m_lastPercentage; + class UAbilityInfo* m_tempAbility; + float m_informGeneralTimer; + float m_confusionTimer; + +}; diff --git a/Source/UnrealProject/Creatures/GeneralEnemy.cpp b/Source/UnrealProject/Creatures/GeneralEnemy.cpp new file mode 100644 index 0000000..e8b6c34 --- /dev/null +++ b/Source/UnrealProject/Creatures/GeneralEnemy.cpp @@ -0,0 +1,237 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "GeneralEnemy.h" +#include "SpawnerBase.h" +#include "BehaviorTree/EnemyAIController.h" +#include "NetworkPlayer.h" +#include "OffensiveEnemy.h" +#include "MinionAnimInstance.h" + +AGeneralEnemy::AGeneralEnemy() +{ + + PrimaryActorTick.bCanEverTick = true; +} +void AGeneralEnemy::BeginPlay() +{ + Super::BeginPlay(); + if (Role != ROLE_Authority) + return; + if (m_spawn) + { + m_spawn->hasGeneral = true; + FVector addVector; + for (int i = 0; i < 4; i++) + { + addVector = m_spawn->GetActorForwardVector().RotateAngleAxis(i * 90, FVector::UpVector); + patrolLocations.Add(addVector); + } + } + if (distance == 0) + { + distance = 100.0f; + } +/* for (int i = 0; i < formationEnemies.Num(); i++) + { + formationEnemies[i]->general = this; + }*/ + + +} +void AGeneralEnemy::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + if (Role != ROLE_Authority) + return; + for (int i = 0; i < formationEnemies.Num(); i++) + { + formationEnemies[i]->ResetConfusionTimer(3.0f); + formationEnemies[i]->general = nullptr; + } + if (m_spawn != nullptr) + m_spawn->hasGeneral = false; + //formationEnemies.Empty(); +} +void AGeneralEnemy::Tick(float deltaTime) +{ + Super::Tick(deltaTime); + if (Role != ROLE_Authority) + return; + if (!IsValid(m_spawn)) + { + RERROR("There is no spawn for the general enemy"); + return; + } + for (int i = 0; i < formationEnemies.Num(); i++) + { + if (IsValid(formationEnemies[i]->general)) + continue; + formationEnemies[i]->general = this; + + } + + if (IsValid(target)) + { + + + FVector2D locationVec = FVector2D(target->GetActorLocation()) - FVector2D(GetActorLocation()); + locationVec.Normalize(); + if (FVector::DistSquaredXY(GetActorLocation(), target->GetActorLocation()) > m_spawn->formationDistance* m_spawn->formationDistance) + { + + MoveToPoint((target->GetActorLocation()));// +(FVector(locationVec, 0))* m_spawn->formationDistance)); + DefaultFormation(); + + } + else + { + GetCharacterMovement()->Velocity = FVector::ZeroVector; + MoveToPoint(GetActorLocation()); + GetCharacterMovement()->Velocity = FVector::ZeroVector; + SetActorRotation(FVector(target->GetActorLocation() - GetActorLocation()).Rotation()); + ChargeFormation(); + } + + } + else + { + IdleFormation(deltaTime); + } +} +void AGeneralEnemy::SingleTargetFormation(int enemyNum) +{ + if ((formationEnemies[enemyNum]->enemycontroller)->IsA(AEnemyAIController::StaticClass())) + { + formationEnemies[enemyNum]->target = target; + formationEnemies[enemyNum]->enemycontroller->SetBool(true, FName("EnableTree")); + formationEnemies[enemyNum]->SetActorRotation(FVector(target->GetActorLocation() - formationEnemies[enemyNum]->GetActorLocation()).Rotation()); + if (count < 3) + { + formationEnemies[enemyNum]->enemycontroller->SetBool(false, FName("GuardKey")); + formationEnemies[enemyNum]->enemycontroller->SetVector(target->GetActorLocation() + target->GetActorForwardVector() * 200, FName("FrontLoc")); + formationEnemies[enemyNum]->enemycontroller->SetVector(target->GetActorLocation() + target->GetActorForwardVector() * -200, FName("BacktLoc")); + formationEnemies[enemyNum]->enemycontroller->SetVector(target->GetActorLocation() + target->GetActorRightVector() *-200, FName("LeftLoc")); + formationEnemies[enemyNum]->enemycontroller->SetVector(target->GetActorLocation() + target->GetActorRightVector() * 200, FName("RightLoc")); + } + else + { + formationEnemies[enemyNum]->enemycontroller->SetBool(true, FName("GuardKey")); + formationEnemies[enemyNum]->enemycontroller->SetVector(GetActorLocation() + GetActorForwardVector() * 100, FName("HomeLocation")); + } + count++; + } + +} +void AGeneralEnemy::ChargeFormation() +{ + if (!IsValid(target)) + return; + count = 0; + TArray targetArray = m_spawn->GetNearbyPlayers(); + if (targetArray.Num() == 0) + return; + for (int i = 0; i < formationEnemies.Num(); i++) + { + if (targetArray.Num() == 1) + { + SingleTargetFormation(i); + continue; + } + if (Cast(formationEnemies[i])) + { + formationEnemies[i]->target = m_spawn->GetClosestPlayer(); + formationEnemies[i]->MoveToPoint(target->GetActorLocation()); + } + else + { + ANetworkPlayer* newTarget = nullptr; + for (int j = 0; j < targetArray.Num(); j++) + { + if(targetArray[j]==m_spawn->GetClosestPlayer()) + continue; + newTarget = targetArray[j]; + continue; + } + formationEnemies[i]->target = newTarget; + } + } +} +void AGeneralEnemy::DefaultFormation() +{ + FVector rotatedFormation; + for (int i = 0; i < formationEnemies.Num(); i++) + { + if (!IsValid(formationEnemies[i]) || !IsValid(m_spawn) || (m_spawn->formationPoints.Num() + 1) < formationEnemies.Num()) + { + continue; + } + + + formationEnemies[i]->target = target; + rotatedFormation = GetActorRotation().RotateVector(FVector(m_spawn->formationPoints[i + 1].X - m_spawn->formationPoints[0].X, m_spawn->formationPoints[i + 1].Y - m_spawn->formationPoints[0].Y, 0)); + + formationEnemies[i]->MoveToPoint(GetActorLocation() + rotatedFormation); + formationEnemies[i]->SetActorRotation(FRotator(0, m_spawn->formationRotation[i + 1], 0) + (GetActorRotation())); + + formationEnemies[i]->enemycontroller->SetBool(false, FName("EnableTree")); + formationEnemies[i]->enemycontroller->SetVector(formationEnemies[i]->GetActorLocation(), FName("HomeLocation")); + + + } +} +int AGeneralEnemy::NativeDealDamage(class ANetworkCharacter* dealer, int32 damage, float armorPercentageIgnore, class UAbilityInfo* ability) +{ + //CHANGEANIMATION(EMinionAnimState::MAS_Pointing); + ChangeNPCAnimation((uint8)EMinionAnimState::MAS_Pointing); + return Super::NativeDealDamage(dealer, damage, armorPercentageIgnore, ability); +} +void AGeneralEnemy::NativeOnKilled(class ANetworkCharacter* killer, class UAbilityInfo* ability) +{ + Super::NativeOnKilled(killer, ability); + if (Role != ROLE_Authority) + return; + if (m_spawn &&m_spawn->possesable) + { + int32 team = killer->GetTeam(); + m_spawn->CaptureCamp(team); + + } +} +void AGeneralEnemy::IdleFormation(float deltaTime) +{ + // Move to a random point near the spawn point; + + //controll enemies in the formation + int counter = 0; + for (int i = 0; i < formationEnemies.Num(); i++) + { + if (!IsValid(formationEnemies[i]) || !IsValid(m_spawn) || (m_spawn->formationPoints.Num() + 1) < formationEnemies.Num()) + { + continue; + } + + if (!formationEnemies[i]->m_tempTarget) + { + if (Cast(formationEnemies[i])&&counter<4) + { + formationEnemies[i]->PatrolBetweenLocations (patrolLocations[counter].RotateAngleAxis( 90, FVector::UpVector)*500+ patrolLocations[counter]* 500 + m_spawn->GetActorLocation(), patrolLocations[counter].RotateAngleAxis( 270, FVector::UpVector) * 500 + patrolLocations[counter] * 500 + m_spawn->GetActorLocation(), deltaTime); + counter++; + continue; + } + + formationEnemies[i]->MoveToPoint(FVector(m_spawn->formationPoints[i + 1],0)+m_spawn->GetActorLocation()); + //formationEnemies[i]->MoveToPointSlow(randpos + m_spawn->GetActorLocation(), 50.0f); + + + } + else + { + if(formationEnemies[i]->IsA(AOffensiveEnemy::StaticClass())) + Cast(formationEnemies[i])->BasicBehavior(); + if(formationEnemies[i]->IsA(ARangedEnemy::StaticClass())) + Cast(formationEnemies[i])->BasicBehavior(); + } + formationEnemies[i]->target = nullptr; + } +} \ No newline at end of file diff --git a/Source/UnrealProject/Creatures/GeneralEnemy.h b/Source/UnrealProject/Creatures/GeneralEnemy.h new file mode 100644 index 0000000..539db51 --- /dev/null +++ b/Source/UnrealProject/Creatures/GeneralEnemy.h @@ -0,0 +1,40 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Creatures/RangedEnemy.h" +#include "GeneralEnemy.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API AGeneralEnemy : public ARangedEnemy +{ + GENERATED_BODY() + + + public: + AGeneralEnemy(); + virtual void BeginPlay() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + virtual void Tick(float deltaTime) override; + virtual void NativeOnKilled(class ANetworkCharacter* killer, class UAbilityInfo* ability) override; + virtual int NativeDealDamage(class ANetworkCharacter* dealer, int32 damage, float armorPercentageIgnore, class UAbilityInfo* ability)override; + void IdleFormation(float deltaTime); + void ChargeFormation(); + void DefaultFormation(); + void SingleTargetFormation(int enemyNum ); + TArray formationPoints; + TArray patrolLocations; + UPROPERTY() + TArray formationEnemies; + UPROPERTY(EditAnywhere, Category = "General settings") + float distance; + UPROPERTY(EditAnywhere, Category = "General settings") + float oFormationRadius; + private: + int count; + + +}; diff --git a/Source/UnrealProject/Creatures/IllusionCharacter.cpp b/Source/UnrealProject/Creatures/IllusionCharacter.cpp new file mode 100644 index 0000000..303f0d3 --- /dev/null +++ b/Source/UnrealProject/Creatures/IllusionCharacter.cpp @@ -0,0 +1,189 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "Creatures/NetworkCharacter.h" +#include "Creatures/NetworkPlayer.h" +#include "IllusionCharacter.h" +#include "BlueprintAbilityLibrary.h" +#include "AIController.h" +#include "DealDamageProxy.h" +#include "AbilityInfo.h" +#include "NativeModifiers.h" + +AIllusionCharacter::AIllusionCharacter() +{ + PrimaryActorTick.bCanEverTick = true; + aggroRange = 400; + acceptenceDistance = 200; + lifeTime = 30; +} + +void AIllusionCharacter::BeginPlay() +{ + Super::BeginPlay(); + + if (Role != ROLE_Authority) + { + return; + } + FActorSpawnParameters SpawnInfo; + SpawnInfo.Instigator = Instigator; + SpawnInfo.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn; + SpawnInfo.OverrideLevel = GetLevel(); + SpawnInfo.ObjectFlags |= RF_Transient; // We never want to save AI controllers into a map + AController* NewController = GetWorld()->SpawnActor(AAIController::StaticClass(), GetActorLocation(), GetActorRotation(), SpawnInfo); + + if (NewController != NULL) + { + // if successful will result in setting this->Controller + // as part of possession mechanics + NewController->Possess(this); + } + + if (IsValid(illOwner)) + { + m_maxHealth = illOwner->GetMaxHealth(); + m_health = illOwner->GetHealth(); + } + else + { + FERROR("NO ILLOWNER IN ILLUSIONCHARACTER"); + } + if (illOwner) + { + abilities.Add(illOwner->abilities[0]); + m_attackSpeed =illOwner->m_attackSpeed; + } + m_isdying = false; +} +void AIllusionCharacter::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); +} +void AIllusionCharacter::Tick(float deltaTime) +{ + Super::Tick(deltaTime); + if (Role != ROLE_Authority) + { + return; + } + lifeTime -= deltaTime; + if (lifeTime <= 0) + { + if(!m_isdying) + Kill(); + return; + } + UNavigationSystem* NavSys = UNavigationSystem::GetCurrent(GetWorld()); + if (!NavSys) + { + RERROR("there is no nav sys"); + } + if (!GetController()) + { + RERROR("there is no controller"); + } + if (!IsValid(illOwner)) + { + Kill(); + return; + } + if (!IsValid(target)) + { + attacking = false; + //targetList = ULib::GetCharacterOverlaps(); + target = GetClosestTarget(); + if (FVector::DistSquared(illOwner->GetActorLocation(), GetActorLocation()) > acceptenceDistance*acceptenceDistance) + { + MoveTo(illOwner->GetActorLocation()); + FPRINT("moving to the illOwner"); + } + else MoveTo(GetActorLocation()); + return; + } + if (!attacking) + { + attacking = IsAttacking(1.0f); + return; + } + Attack(); + +} +void AIllusionCharacter::Attack() +{ + int randdistance =0; + randdistance += ((int)abilities[0]->AICastRange / 2); + if (FVector::Dist(GetActorLocation(), target->GetActorLocation()) < randdistance) + { + MoveTo(GetActorLocation()); + SetActorRotation(FVector(target->GetActorLocation() - GetActorLocation()).Rotation()); + } + else MoveTo(target->GetActorLocation()); + for (int i = 0; i < abilities.Num(); i++) + { + if ((abilities[i])&&FVector::DistSquared(GetActorLocation(),target->GetActorLocation())AICastRange*abilities[i]->AICastRange) + { + CastAbility(abilities[i]); + } + } +} +ANetworkCharacter* AIllusionCharacter::GetClosestTarget() +{ + ANetworkCharacter* returnTarget = nullptr; + float distance = 1e34; + for (ANetworkCharacter* character : targetList) + { + if(!IsValid(character)||character==this || character->GetTeam()==GetTeam()) + continue; + float tempdistance = FVector::DistSquared(character->GetActorLocation(), GetActorLocation()); + if (distance > tempdistance) + { + distance = tempdistance; + returnTarget = character; + } + } + return returnTarget; +} +void AIllusionCharacter::MoveTo(FVector Location) +{ + UNavigationSystem* NavSys = UNavigationSystem::GetCurrent(GetWorld()); + if (IsPendingKill() || IsPendingKillPending()) + return; + if (!IsStunned()) + { + NavSys->SimpleMoveToLocation(this->Controller, Location); + } + else + { + NavSys->SimpleMoveToLocation(this->Controller, GetActorLocation()); + } +} +bool AIllusionCharacter::IsAttacking(float changePercentage) +{ + int num = rand() % 100; + if (num > (int)changePercentage) + { + return false; + } + return true; +} + +void AIllusionCharacter::Kill() +{ + if (IsPendingKill() || IsPendingKillPending()) + { + RERROR("the character is pending kill"); + return; + + } + ADOTModifier* deathMod = GetWorld()->SpawnActor(); + deathMod->damagePerTick = 500; + deathMod->lifeTime = 0; + deathMod->target = this; + deathMod->character = this; + deathMod->abilityInfo = abilityInfo; + m_modifierManager->AddModifier(deathMod); + m_isdying = true; + //m_health = 0; +// m_shouldBeDestroyed = true; +} \ No newline at end of file diff --git a/Source/UnrealProject/Creatures/IllusionCharacter.h b/Source/UnrealProject/Creatures/IllusionCharacter.h new file mode 100644 index 0000000..fb6e2a3 --- /dev/null +++ b/Source/UnrealProject/Creatures/IllusionCharacter.h @@ -0,0 +1,46 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Creatures/NetworkCharacter.h" +#include "IllusionCharacter.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API AIllusionCharacter : public ANetworkCharacter +{ + GENERATED_BODY() +public: + AIllusionCharacter(); + virtual void BeginPlay() override; + virtual void Tick(float deltaTime)override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + void MoveTo(FVector Location); + void Attack(); + UFUNCTION(BluePrintCallable, Category = "Illusion Properties") + void Kill(); + class ANetworkCharacter* target; + class ANetworkCharacter* GetClosestTarget(); + // float percentage is a range between 0 and 100 where 100 is always attacking and 0 never attacking + bool IsAttacking(float changePercentage); + UPROPERTY(EditAnywhere, BlueprintReadWrite,Category = "Illusion Properties", meta = (ExposeOnSpawn)) + class ANetworkPlayer* illOwner; + UPROPERTY(editAnywhere, Category = "Illusion Properties") + float aggroRange; + + UPROPERTY(editAnywhere, BlueprintReadWrite,Category = "Illusion Properties", meta = (ExposeOnSpawn)) + float lifeTime; + UPROPERTY(editAnywhere, BlueprintReadWrite, Category = "Illusion Properties", meta = (ExposeOnSpawn)) + class UAbilityInfo* abilityInfo; + UPROPERTY(editAnywhere, Category = "Illusion Properties") + float acceptenceDistance; + UPROPERTY(editAnywhere, BlueprintReadWrite, Category = "Illusion Properties", meta = (ExposeOnSpawn)) + TArray targetList; + bool attacking; + +private: + bool m_isdying; + +}; diff --git a/Source/UnrealProject/Creatures/MainCharacterAnimation.cpp b/Source/UnrealProject/Creatures/MainCharacterAnimation.cpp new file mode 100644 index 0000000..18e0d13 --- /dev/null +++ b/Source/UnrealProject/Creatures/MainCharacterAnimation.cpp @@ -0,0 +1,69 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "MainCharacterAnimation.h" +#include "NetworkCharacter.h" +#include "Animation/AnimNodeBase.h" +#include "AnimationProxy.h" + +UMainCharacterAnimation::UMainCharacterAnimation(const FObjectInitializer& init) + : Super(init) +{ + m_mainAnimProxy = nullptr; + character = nullptr; + attacking = false; + charCustomization = FCharacterCustomization(); + m_swingAnimationSequence = 0; +} +void UMainCharacterAnimation::NativeInitializeAnimation() +{ + attacking = false; + Super::NativeInitializeAnimation(); + character = Cast(this->GetOwningActor()); + if (character) + { + m_swingAnimationSequence = character->swingAnimationSequence; + } +} +void UMainCharacterAnimation::NativeUpdateAnimation(float DeltaSeconds) +{ + if(character && character->swingAnimationSequence > m_swingAnimationSequence) + { + attacking = true; + m_swingAnimationSequence = character->swingAnimationSequence; + } +} +void UMainCharacterAnimation::SetCharacterCustomization(const FCharacterCustomization& characterCustomization) +{ + charCustomization = characterCustomization; + if(m_mainAnimProxy) + { + m_mainAnimProxy->charCustomization = charCustomization; + } +} +FAnimInstanceProxy* UMainCharacterAnimation::CreateAnimInstanceProxy() +{ + check(!m_mainAnimProxy); + m_mainAnimProxy = new FMainAnimProxy(); + + m_mainAnimProxy->boneNames[0] = "Slave_Head_Ctrl_Jnt"; + m_mainAnimProxy->boneNames[1] = "Slave_L_Hip_Ctrl_Jnt"; + m_mainAnimProxy->boneNames[2] = "Slave_R_Hip_Ctrl_Jnt"; + m_mainAnimProxy->boneNames[3] = "Slave_L_Result_Shoulder_Ctrl_Jnt"; + m_mainAnimProxy->boneNames[4] = "Slave_R_Result_Shoulder_Ctrl_Jnt"; + m_mainAnimProxy->boneNames[5] = "Slave_Result_Spine06"; + m_mainAnimProxy->boneNames[6] = "skeleton"; + + + return m_mainAnimProxy; +} +void UMainCharacterAnimation::DestroyAnimInstanceProxy(FAnimInstanceProxy* InProxy) +{ + check(InProxy == m_mainAnimProxy); + delete InProxy; + m_mainAnimProxy = nullptr; +} +void UMainCharacterAnimation::OnSwingAnimation_Implementation() +{ +} + diff --git a/Source/UnrealProject/Creatures/MainCharacterAnimation.h b/Source/UnrealProject/Creatures/MainCharacterAnimation.h new file mode 100644 index 0000000..344d1ac --- /dev/null +++ b/Source/UnrealProject/Creatures/MainCharacterAnimation.h @@ -0,0 +1,43 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Animation/AnimInstance.h" +#include "PlayerSetupState.h" +#include "MainCharacterAnimation.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API UMainCharacterAnimation : public UAnimInstance +{ + GENERATED_BODY() + +public: + UMainCharacterAnimation(const FObjectInitializer& init); + + virtual void NativeInitializeAnimation() override; + virtual void NativeUpdateAnimation(float DeltaSeconds) override; + + virtual FAnimInstanceProxy* CreateAnimInstanceProxy(); + virtual void DestroyAnimInstanceProxy(FAnimInstanceProxy* InProxy); + + UFUNCTION(BlueprintNativeEvent, Category = "Animation") + void OnSwingAnimation(); + + UFUNCTION(BlueprintCallable, Category = "Animation") + void SetCharacterCustomization(const FCharacterCustomization& characterCustomization); + + UPROPERTY(BlueprintReadOnly, Category = "Animation") + class ANetworkCharacter* character; + UPROPERTY(BlueprintReadWrite, Category = "Animation") + bool attacking; + FCharacterCustomization charCustomization; + +private: + // Keeps track of how many times an animation was triggered + int32 m_swingAnimationSequence; + struct FMainAnimProxy* m_mainAnimProxy; + +}; diff --git a/Source/UnrealProject/Creatures/MiniBossCreature.cpp b/Source/UnrealProject/Creatures/MiniBossCreature.cpp new file mode 100644 index 0000000..b1fb5f8 --- /dev/null +++ b/Source/UnrealProject/Creatures/MiniBossCreature.cpp @@ -0,0 +1,113 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "MiniBossCreature.h" +#include "NetworkPlayer.h" +#include "CreatureSpawn.h" +#include "AbilityInfo.h" +#include "Effect.h" + + +AMiniBossCreature::AMiniBossCreature() +{ + PrimaryActorTick.bCanEverTick = true; + m_usesMana = false; + + target = nullptr; + m_spawn = nullptr; + + m_castTimer = 0; + + keyDropped = PlayerKeyType::None; +} + +void AMiniBossCreature::BeginPlay() +{ + Super::BeginPlay(); + + if (Role != ROLE_Authority) + return; + + // Select two random abilities to cast + if (IsValid(inheritAbilities) && IsValid(inheritAbilities.GetDefaultObject())) + { + TArray& bossAbilities = inheritAbilities.GetDefaultObject()->abilities; + if (bossAbilities.Num() > 1) + { + TArray abilityIndices; + for (int32 i = 0; i < bossAbilities.Num(); i++) + abilityIndices.Add(i); + + while (m_bossAbilityPattern.Num() < 2) + { + const int32 index = FMath::Rand() % abilityIndices.Num(); + const int32 ability = abilityIndices[index]; + abilityIndices.RemoveAt(index); + m_bossAbilityPattern.Add(ability); + } + } + else if (bossAbilities.Num() == 1) + m_bossAbilityPattern.Add(0); + } +} +void AMiniBossCreature::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + + if (Role != ROLE_Authority) + return; + + // Drop a key + if (m_health <= 0) + { + ANetworkPlayer* const killedBy = Cast(GetLastPlayerDamage()); + if (IsValid(killedBy) && keyDropped != PlayerKeyType::None && IsValid(m_spawn) && !m_spawn->hasDroppedKey) + { + killedBy->AssignKey(keyDropped, m_spawn); + } + } +} + +void AMiniBossCreature::Tick(float deltaTime) +{ + Super::Tick(deltaTime); + + if (Role != ROLE_Authority) + return; + + // If the distance of the target to the spawn is greater than the aggro range of the spawner, + // then lose the target. + if (IsValid(target)) + { + float targetDistSqr = FVector::DistSquared(target->GetActorLocation(), m_spawn->SpawnResetPosition()); + float aggroSqr = m_spawn->deaggroRadius * m_spawn->deaggroRadius; + if (aggroSqr < targetDistSqr) + { + // Reset + target = nullptr; + m_castTimer = 0; + } + } + + if (!IsValid(target)) + return; + + // Boss casting logic + MoveToPoint(target->GetActorLocation()); + m_castTimer += deltaTime; + + if (m_castTimer > 2.5f && IsValid(inheritAbilities) && IsValid(inheritAbilities.GetDefaultObject())) + { + TArray& bossAbilities = inheritAbilities.GetDefaultObject()->abilities; + + if (bossAbilities.Num() > 0 && m_bossAbilityPattern.Num() > 0) + { + // Cast a random ability + UAbilityInfo* ability = bossAbilities[m_bossAbilityPattern[FMath::Rand() % m_bossAbilityPattern.Num()]]; + if (IsValid(ability)&& ability->AICastRange*ability->AICastRange>FVector::DistSquared(GetActorLocation(),target->GetActorLocation())) + CastAbility(ability); + } + + m_castTimer = 0; + } +} \ No newline at end of file diff --git a/Source/UnrealProject/Creatures/MiniBossCreature.h b/Source/UnrealProject/Creatures/MiniBossCreature.h new file mode 100644 index 0000000..314798b --- /dev/null +++ b/Source/UnrealProject/Creatures/MiniBossCreature.h @@ -0,0 +1,34 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Creatures/BossBase.h" +#include "PlayerKeyType.h" +#include "MiniBossCreature.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API AMiniBossCreature : public ABossBase +{ + GENERATED_BODY() + +public: + AMiniBossCreature(); + virtual void BeginPlay() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + virtual void Tick(float deltaTime) override; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Miniboss") + TSubclassOf inheritAbilities; + + PlayerKeyType keyDropped; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Miniboss") + TSubclassOf keyEffect; +private: + TArray m_bossAbilityPattern; + float m_castTimer; + +}; diff --git a/Source/UnrealProject/Creatures/MinionAnimInstance.cpp b/Source/UnrealProject/Creatures/MinionAnimInstance.cpp new file mode 100644 index 0000000..a91d339 --- /dev/null +++ b/Source/UnrealProject/Creatures/MinionAnimInstance.cpp @@ -0,0 +1,61 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "MinionAnimInstance.h" + +UMinionAnimInstance::UMinionAnimInstance(const FObjectInitializer& init) + : Super(init) +{ + m_animationState = EMinionAnimState::MAS_Idle; +} + +void UMinionAnimInstance::NativeInitializeAnimation() +{ + Super::NativeInitializeAnimation(); + m_animationState = EMinionAnimState::MAS_Idle; +} + +void UMinionAnimInstance::NativeUpdateAnimation(float deltaSeconds) +{ + Super::NativeUpdateAnimation(deltaSeconds); + + APawn* ownerPawn = TryGetPawnOwner(); + + if (IsValid(ownerPawn)) + { + const FVector velocity = ownerPawn->GetVelocity(); + const FVector forward = ownerPawn->GetActorForwardVector().GetSafeNormal2D(); + + m_movementSpeed = velocity.Size(); + + float angleBetween = FMath::FindDeltaAngle(forward.HeadingAngle(), velocity.GetSafeNormal2D().HeadingAngle()); + m_movementDirectionRelative = FVector(cos(angleBetween), sin(angleBetween), 0); + } +} + +EMinionAnimState UMinionAnimInstance::GetAnimationState() +{ + return m_animationState; +} + +bool UMinionAnimInstance::IsInAnimationState(const EMinionAnimState minionStateCheck) +{ + return (m_animationState == minionStateCheck); +} + +void UMinionAnimInstance::ChangeAnimationStateTo(EMinionAnimState newState) +{ + m_animationState = newState; +} + +void UMinionAnimInstance::BPChangeAnimationStateTo(EMinionAnimState newState) +{ + m_animationState = newState; + OnAnimationStateChanged.Broadcast(newState); +} + +void UMinionAnimInstance::PlaySpecificAnimationByInt(int32 animationToPlay) +{ + m_specificAnimationIndex = animationToPlay; + ChangeAnimationStateTo(EMinionAnimState::MAS_Specific); +} \ No newline at end of file diff --git a/Source/UnrealProject/Creatures/MinionAnimInstance.h b/Source/UnrealProject/Creatures/MinionAnimInstance.h new file mode 100644 index 0000000..30acea5 --- /dev/null +++ b/Source/UnrealProject/Creatures/MinionAnimInstance.h @@ -0,0 +1,66 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Animation/AnimInstance.h" +#include "MinionAnimInstance.generated.h" + +// Enum that shows in what state the Animation Instance is in. +UENUM(BlueprintType) +enum class EMinionAnimState : uint8 +{ + MAS_Idle UMETA(DisplayName = "Idle"), + MAS_Pointing UMETA(DisplayName = "Pointing"), + MAS_Attacking UMETA(DisplayName = "Attacking"), + MAS_Casting UMETA(DisplayName = "Casting"), + MAS_Guarding UMETA(DisplayName = "Guarding"), + MAS_Staggered UMETA(DisplayName = "Staggered"), + MAS_Stunned UMETA(DisplayName = "Stunned"), + MAS_Killed UMETA(DisplayName = "Killed"), + MAS_Specific UMETA(DisplayName = "Specific") +}; + +// Delegate declaration for when the Animation Instance changes its state from within. +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnAnimationStateChanged, EMinionAnimState, newState); + +/** + * Animation instance that handles all state changing, variable gathering and notifying the AI class. + */ +UCLASS() +class UNREALPROJECT_API UMinionAnimInstance : public UAnimInstance +{ + GENERATED_BODY() +public: + UMinionAnimInstance(const FObjectInitializer& init); + + virtual void NativeInitializeAnimation() override; + virtual void NativeUpdateAnimation(float deltaSeconds) override; + + // Function to get the animation state of the animation instance. + EMinionAnimState GetAnimationState(); + // Helper function for checking if the minion is in a certain state. + bool IsInAnimationState(const EMinionAnimState minionStateCheck); + // Function that changes the state of the minion. Does not trigger OnAnimationStateChanged. + UFUNCTION(BlueprintCallable, Category = "Animation State") + void ChangeAnimationStateTo(EMinionAnimState newState); + // Function that changes the state of the minion. Triggers OnAnimationStateChanged. + // Made specifically for use in the Animation Blueprint. + UFUNCTION(BlueprintCallable, Category = "Animation State") + void BPChangeAnimationStateTo(EMinionAnimState newState); + // Delegate for when the state of the minion changes. + UPROPERTY(BlueprintAssignable, Category = "Animation State") + FOnAnimationStateChanged OnAnimationStateChanged; + + UFUNCTION() + void PlaySpecificAnimationByInt(int32 animationToPlay); + +protected: // Member variables are protected. + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Animation State") + EMinionAnimState m_animationState; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Animation State") + float m_movementSpeed; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Animation State") + FVector m_movementDirectionRelative; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Animation State") + int32 m_specificAnimationIndex; +}; diff --git a/Source/UnrealProject/Creatures/NPCBase.cpp b/Source/UnrealProject/Creatures/NPCBase.cpp new file mode 100644 index 0000000..47acc4e --- /dev/null +++ b/Source/UnrealProject/Creatures/NPCBase.cpp @@ -0,0 +1,349 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "NPCBase.h" +#include "MinionAnimInstance.h" +#include "SpawnerBase.h" +#include "modifier.h" +#include "NetworkPlayer.h" +#include "TeamData.h" +#include "BossBase.h" +#include "DrawDebugHelpers.h" +#include "AI/Navigation/NavigationPath.h" + +static UTeamData* teamData; + +ANPCBase::ANPCBase() +{ + teamData = ConstructorHelpers::FObjectFinder(L"/Game/Assets/TeamData").Object; + + PrimaryActorTick.bCanEverTick = true; + m_spawn = nullptr; + m_dead = false; + baseAttackSpeed = 2.0f; + baseMaxHealth = 200.0f; + baseArmor = 30.0f; + baseMaxMana = 1000.0f; + baseAttackSpeed = 1.0f; + maxAvoidanceForce = 200.0f; + m_reachedStart = false; + //visionTrigger = CreateDefaultSubobject(TEXT("Vision Trigger")); + +} +void ANPCBase::BeginPlay() +{ + Super::BeginPlay(); + if (Role != ROLE_Authority) + return; + + m_health = m_maxHealth = baseMaxHealth; + m_mana = m_maxMana = baseMaxMana; + if (m_spawn) + m_targetPoint = m_spawn->GetActorLocation(); + else m_targetPoint = GetActorLocation(); + collisionRadius = GetCapsuleComponent()->GetScaledCapsuleRadius(); + m_walkSpeed = GetCharacterMovement()->MaxWalkSpeed; + m_OnRep_Team(); + GetCapsuleComponent()->BodyInstance.bLockXRotation = true; + GetCapsuleComponent()->BodyInstance.bLockYRotation = true; + animInstance = Cast(GetMesh()->GetAnimInstance()); + patrolTime = 5.0f; +} +void ANPCBase::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + if (Role != ROLE_Authority) + return; + if(m_spawn && EndPlayReason == EEndPlayReason::Destroyed) + m_spawn->OnMobDie(this); + +} +void ANPCBase::Tick(float deltaTime) +{ + Super::Tick(deltaTime); + if (Role != ROLE_Authority) + return; + UNavigationSystem* navSys = UNavigationSystem::GetCurrent(GetWorld()); + if (!navSys || !GetController() || !m_spawn) + { + //RERROR("Boss base does not have a navigation system"); + return; + } + + if (!IsValid(target)) + target = nullptr; + + if (m_dead) + { + return; + } + if (!IsValid(target)) + { + m_spawn->GetNewTarget(this); + } + + if (!IsValid(target) && !m_hasGeneral) + { + MoveToPoint(m_targetPoint); + } + else + { + if (FVector::DistSquared(m_spawn->GetActorLocation(), GetActorLocation()) > m_spawn->deaggroRadius * m_spawn->deaggroRadius) + { + // Reset aggro radius + target = nullptr; + m_isPulled = false; + } + } + + + +} +int32 ANPCBase::NativeDealDamage(class ANetworkCharacter* dealer, int32 damage, float armorPercentageIgnore, class UAbilityInfo* ability) +{ + target = dealer; + m_OnRep_Team(); + return Super::NativeDealDamage(dealer, damage, armorPercentageIgnore, ability); +} +void ANPCBase::ResetModifiers() +{ + Super::ResetModifiers(); + m_maxHealth = baseMaxHealth; + m_maxMana = baseMaxMana; + m_attackSpeed = baseAttackSpeed; + m_armor = baseArmor; +} + +void ANPCBase::OnDeath(UAbilityInfo* ability) +{ + //should be removed later, this is in here untill the animations are actually in the game + Super::OnDeath(ability); + return; + target = nullptr; + m_dead = true; + m_modifierManager->ClearModifiers(); +} + +void ANPCBase::CalcAvoidance(const FVector& target) +{ + UNavigationSystem* NavSys = UNavigationSystem::GetCurrent(GetWorld()); +// NavSys->SimpleMoveToLocation(this->Controller, target); + if (Cast(this)) + { + NavSys->SimpleMoveToLocation(this->Controller, target); + return; + } + FVector newLoc = FVector::ZeroVector; + newLoc = GetClosestPathLocation(target) - GetActorLocation(); + newLoc.Normalize(); + newLoc *= GetCharacterMovement()->GetMaxSpeed(); + newLoc = newLoc + CalcAvoidanceVector(); //+ calc avoicance vector; + FVector vel = TruncateVector(GetCharacterMovement()->Velocity + newLoc, GetCharacterMovement()->GetMaxSpeed()); + vel += GetActorLocation(); + NavSys->SimpleMoveToLocation(this->Controller, vel); + SetActorRotation(FVector(FVector(vel.X, vel.Y, GetActorLocation().Z) - GetActorLocation()).Rotation()); + +} + +void ANPCBase::PatrolBetweenLocations(FVector startlocation, FVector endLocation, float deltaTime) +{ + FVector actorlocation = GetActorLocation(); + if (m_reachedStart) + { + MoveToPoint(endLocation); + enableVisonCone = false; + } + else + { + MoveToPoint(startlocation); + enableVisonCone = false; + } + //wait a few second to walk back + float dist = FVector::DistSquaredXY(startlocation, actorlocation); + if (dist < 50.0f*50.0f) + { + m_patrolTimer -= deltaTime; + enableVisonCone = true; + if (m_patrolTimer <= 0) + { + m_reachedStart = true; + m_patrolTimer = patrolTime; + + } + + + } + dist = FVector::DistSquaredXY(endLocation, actorlocation); + if (dist< 50.0f*50.0f) + { + m_patrolTimer -= deltaTime; + enableVisonCone = true; + if (m_patrolTimer <= 0) + { + m_reachedStart = false; + m_patrolTimer = patrolTime; + } + } + +} +void ANPCBase::MoveToPoint(const FVector& target) +{ + UNavigationSystem* NavSys = UNavigationSystem::GetCurrent(GetWorld()); + GetCharacterMovement()->MaxWalkSpeed = m_walkSpeed; + float distance = FVector::DistSquared(target, GetActorLocation()); + if (IsPendingKill() || IsPendingKillPending()) + return; + + if (!IsStunned()) + { + CalcAvoidance( target); + SetActorRotation(FVector(FVector(target.X, target.Y, GetActorLocation().Z) - GetActorLocation()).Rotation()); + + } + else + { + + NavSys->SimpleMoveToLocation(this->Controller, GetActorLocation()); + } + + + +} +void ANPCBase::MoveToPointSlow(const FVector& target, float dist) +{ + UNavigationSystem* NavSys = UNavigationSystem::GetCurrent(GetWorld()); + if (IsPendingKill() || IsPendingKillPending()) + return; + GetCharacterMovement()->MaxWalkSpeed = m_walkSpeed/2; + if (m_lastLoc != target) + { + if (m_lastLoc == FVector::ZeroVector || FVector::DistSquaredXY(m_lastLoc, GetActorLocation()) < dist*dist) + { + //RPRINT("test"); + m_lastLoc =UNavigationSystem::ProjectPointToNavigation(GetWorld(), target); + //m_lastLoc = target; + } + } + MoveToPoint(m_lastLoc); + +} +void ANPCBase::OnOverlapBegin(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) +{ + if (!IsValid(OtherActor)) + return; + if (!OtherActor->IsA(ANPCBase::StaticClass())) + return; + collisionList.Add(Cast(OtherActor)); + +} +void ANPCBase::OnOverlapEnd(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex) +{ + if (!IsValid(OtherActor)) + return; + if (!OtherActor->IsA(ANPCBase::StaticClass())) + return; + collisionList.Remove(Cast(OtherActor)); +} +void ANPCBase::SetSpawn(class ASpawnerBase* spawn) +{ + check(Role == ROLE_Authority); + check(!m_spawn); + m_spawn = spawn; +} +void ANPCBase::SetControlPoint(FVector controlPoint) +{ + check(Role == ROLE_Authority); + m_targetPoint = controlPoint; +} + +void ANPCBase::m_OnRep_Team() +{ + Super::m_OnRep_Team(); + if(!m_materialInstance) + { + m_materialInstance = GetMesh()->CreateDynamicMaterialInstance(0); + } + if(m_materialInstance) + { + float scalar = (float)m_health / (float)m_maxHealth; + m_materialInstance->SetVectorParameterValue("TeamColor", teamData->GetTeamColor(GetTeam())); + m_materialInstance->SetScalarParameterValue("FlameEdgeSoftness", 100.0f - (100.0f*scalar)); + m_materialInstance->SetScalarParameterValue("FlameEffectIntensity", (scalar)); + m_materialInstance->SetScalarParameterValue("RandomOffset", FMath::FRand()); + } +} + +void ANPCBase::UnsetSpawn() +{ + check(Role == ROLE_Authority); + m_spawn = nullptr; +} +void ANPCBase::ChangeNPCAnimation_Implementation(uint8 state ) +{ + if (IsValid(animInstance)) + animInstance->ChangeAnimationStateTo((EMinionAnimState)(state)); +} +FVector ANPCBase::CalcAvoidanceVector() +{ + FVector retVector = FVector::ZeroVector; + float dynLenght = GetCharacterMovement()->Velocity.Size() / GetCharacterMovement()->GetMaxSpeed(); + //change getactorforward by velocity + FVector vel = GetCharacterMovement()->Velocity; + vel.Normalize(); + aheadvec1 =GetActorLocation()+ vel*dynLenght; + aheadvec2 = GetActorLocation() + vel*dynLenght*0.5; + // DrawDebugSphere(GetWorld(), aheadvec1, 24, 32, FColor(255, 255, 255)); + // DrawDebugSphere(GetWorld(), aheadvec2, 24, 32, FColor(255, 0, 0)); + ANPCBase* obstacle = GetClosestObstacle(); + if (IsValid(obstacle)) + { + retVector = aheadvec1 - obstacle->GetActorLocation(); + retVector.Z = 0.0f; + retVector.Normalize(); + retVector *= maxAvoidanceForce; + + } +// DrawDebugLine(GetWorld(), GetActorLocation(), GetActorLocation() + retVector, FColor(255, 255, 0)); + return retVector; +}/// +ANPCBase* ANPCBase::GetClosestObstacle() +{ + ANPCBase* obstacle = nullptr; + float distance = 1e34; + for (int i = 0; i < m_spawn->m_mobs.Num(); i++) + { + ANPCBase* current = m_spawn->m_mobs[i]; + if(!IsValid(current)||current==this) + continue; + float tempdistance = FVector::DistSquared(current->GetActorLocation(), this->GetActorLocation()); + if (tempdistance < distance) + { + distance = tempdistance; + obstacle = current; + } + } + if (!IsValid(obstacle)) + return nullptr; + if (FVector::DistSquared(aheadvec1, obstacle->GetActorLocation())>100 * 100 && FVector::DistSquared(aheadvec2, obstacle->GetActorLocation())>100 * 100) + obstacle = nullptr; + return obstacle; +} +FVector ANPCBase::TruncateVector(FVector inVector, float maxForce) +{ + if (inVector.Size() > maxForce) + { + inVector.Normalize(); + inVector *= maxForce; + } + return inVector; +} +FVector ANPCBase::GetClosestPathLocation(FVector endlocation) +{ + FVector returnVec = FVector(); + UNavigationPath *tpath; + UNavigationSystem* navsys = UNavigationSystem::GetCurrent(GetWorld()); + tpath = navsys->FindPathToLocationSynchronously(GetWorld(), GetActorLocation(), endlocation); + if (tpath == nullptr||tpath->PathPoints.Num()<=1) + return endlocation; + return tpath->PathPoints[tpath->PathPoints.Num()-1]; +} \ No newline at end of file diff --git a/Source/UnrealProject/Creatures/NPCBase.h b/Source/UnrealProject/Creatures/NPCBase.h new file mode 100644 index 0000000..4b80208 --- /dev/null +++ b/Source/UnrealProject/Creatures/NPCBase.h @@ -0,0 +1,109 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Creatures/NetworkCharacter.h" +#include "NPCBase.generated.h" + +/** + * + */ + +UCLASS() +class UNREALPROJECT_API ANPCBase : public ANetworkCharacter +{ + GENERATED_BODY() +public: + + ANPCBase(); + virtual void BeginPlay() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + virtual void Tick(float deltaTime) override; + virtual int32 NativeDealDamage(class ANetworkCharacter* dealer, int32 damage, float armorPercentageIgnore, class UAbilityInfo* ability) override; + // Clears all the modifier stat modifications from this character + virtual void ResetModifiers(); + + void SetSpawn(class ASpawnerBase* spawn); + void UnsetSpawn(); + void SetControlPoint(FVector controlPoint); + + UPROPERTY(BlueprintAssignable, Category = "Collision") + FComponentBeginOverlapSignature OnComponentBeginOverlap; + UPROPERTY(BlueprintAssignable, Category = "Collision") + FComponentBeginOverlapSignature OnComponentExitOverlap; + + + UPROPERTY(VisibleAnywhere, Category = "Custom Collision") + float maxAvoidanceForce; + UPROPERTY(BlueprintReadWrite) + TArray< class ANPCBase*>collisionList; + UPROPERTY(BlueprintReadWrite) + class ANetworkCharacter* target; + UFUNCTION(BlueprintImplementableEvent, Category = "Animation") + void PlayFencAnimation(); + UFUNCTION(BlueprintImplementableEvent, Category = "Animation") + void PlayNormalAnimation(); + UFUNCTION(BlueprintImplementableEvent, Category = "Animation") + void PlayClimbingAnimation(); + UFUNCTION(BlueprintImplementableEvent, Category = "Animation") + void PlayPointAnimation(); + UFUNCTION(NetMulticast, Reliable, Category = "Animation") + void ChangeNPCAnimation(uint8 state); + //Trigger components for the vision of the npcs + float patrolTime; + float collisionRadius; + void CalcAvoidance(const FVector& target); + virtual void MoveToPoint(const FVector& target); + virtual void MoveToPointSlow(const FVector& target, float dist); + void PatrolBetweenLocations(FVector startlocation, FVector endLocation,float deltaTime); + ANPCBase* GetClosestObstacle(); + FVector CalcAvoidanceVector(); + FVector TruncateVector(FVector inVector, float maxForce); + FVector GetClosestPathLocation(FVector endlocation); + FVector aheadvec1; + FVector aheadvec2; +protected: + virtual void m_OnRep_Team() override; + + UFUNCTION(BlueprintImplementableEvent, category = "death") + void PlayDeathAnimation(UAbilityInfo* ability); + + virtual void OnDeath(UAbilityInfo* ability) override; + UFUNCTION() + void OnOverlapBegin(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult); + UFUNCTION() + void OnOverlapEnd(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex); + + UPROPERTY() + UMaterialInstanceDynamic* m_materialInstance; + + // Base Stats + UPROPERTY(EditDefaultsOnly, Category = "Stats") + int32 baseMaxHealth; + UPROPERTY(EditDefaultsOnly, Category = "Stats") + int32 baseMaxMana; + // AKA Attacks per second + UPROPERTY(EditDefaultsOnly, Category = "Stats") + float baseAttackSpeed; + UPROPERTY(BlueprintReadWrite) + bool enableVisonCone; + + bool m_dead; + + UPROPERTY() + class ASpawnerBase* m_spawn; + + FVector m_targetPoint; + bool m_isPulled; + bool m_hasGeneral; + class UMinionAnimInstance* animInstance; +private: + FVector m_lastLoc; + float m_walkSpeed; + bool lastcollision; + bool m_reachedStart; + FVector previousDirection; + float m_patrolTimer; + + +}; diff --git a/Source/UnrealProject/Creatures/NetworkCharacter.cpp b/Source/UnrealProject/Creatures/NetworkCharacter.cpp new file mode 100644 index 0000000..7018a15 --- /dev/null +++ b/Source/UnrealProject/Creatures/NetworkCharacter.cpp @@ -0,0 +1,1232 @@ +// Project Lab - NHTV Igad +#include "UnrealProject.h" +#if PLATFORM_SPECIFIC_WIN == 0 +#include "InputManager.hpp" +using namespace Input; +#endif + +#include "NetworkCharacter.h" + +#include "AbilityInfo.h" +#include "ItemBase.h" +#include "BaseSkillObject.h" +#include "IngameSkillTree.h" +#include "DefaultPlayerController.h" +#include "DefaultGameMode.h" +#include "NetworkPlayer.h" +#include "Modifier.h" +#include "AbilityEventGroup.h" +#include "PreCastAbilityEventGroup.h" +#include "NativeModifiers.h" +#include "DefaultGameState.h" +#include "DefaultPlayerState.h" +#include "Effect.h" + +TSubclassOf expGainEffect; + +ANetworkCharacter::ANetworkCharacter() +{ + expGainEffect = ConstructorHelpers::FClassFinder(L"/Game/Assets/Art/Effects/FX_ExpParticle").Class; + + // Set size for collision capsule + GetCapsuleComponent()->InitCapsuleSize(42.f, 96.0f); + + // Network init + bReplicates = true; + bAlwaysRelevant = true; + bReplicateMovement = true; + + // Configure character movement + GetCharacterMovement()->bOrientRotationToMovement = true; // Rotate character to moving direction + GetCharacterMovement()->RotationRate = FRotator(0.f, 640.f, 0.f); + GetCharacterMovement()->bConstrainToPlane = true; + GetCharacterMovement()->bSnapToPlaneAtStart = true; + baseMovementSpeed = GetCharacterMovement()->MaxWalkSpeed; + + experienceGainOnKill = 50; + m_maxHealth = 1000; + m_maxMana = 100; + canBeStunned = true; + m_visible = true; + m_usesMana = true; + + // Default to neutral + GetMesh()->bRenderCustomDepth = true; + GetMesh()->CustomDepthStencilValue = 0; + + PrimaryActorTick.bCanEverTick = true; + m_lastPlayerDamage = nullptr; + + + healthAccumTimer = 1.0f; + damageAccumTimer = 0.1f; + + teamDamageTimer = 5.0f; + + m_healAccumValue = 0; + m_healAccumTimer = 0; +} + +void ANetworkCharacter::BeginPlay() +{ + Super::BeginPlay(); + + m_cooldownReduction = 0.0f; + m_channelStun = false; + m_channelGroup = nullptr; + m_castingAbility = nullptr; + m_initialised = true; + m_hitable = true; + + m_silenceCount = 0; + m_silenced = false; + swingAnimationSequence = 0; + + // Filter out NULL abilities + TArray actualAbilities; + for (int32 i = 0; i < abilities.Num(); i++) + { + if (!IsValid(abilities[i])) + continue; + actualAbilities.Add(abilities[i]); + } + abilities = actualAbilities; + + + for (int32 i = 0; i < abilities.Num(); i++) + { + GetAbilityState(abilities[i]); + } + + RegisterHealthBar(); + + // Initialize the character modifiers on the server + if (Role == ROLE_Authority) + { + m_modifierManager = new ModifierManager(this); + m_SpawnModifiers(); + for(UAbilityInfo* info : passives) + { + CastAbility(info); + } + m_health = m_maxHealth; + m_mana = m_maxMana; + } +} + +void ANetworkCharacter::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + + if (m_modifierManager) + { + delete m_modifierManager; + m_modifierManager = nullptr; + } + +#if UE_INCLUDE_METRICS + // Record trivial player death + if(metricsHandle && EndPlayReason == EEndPlayReason::Type::Destroyed) + metricsHandle->OnPlayerDie(0); +#endif +} + +void ANetworkCharacter::Destroyed() +{ + UnregisterHealthBar(); + Super::Destroyed(); +} + +void ANetworkCharacter::RegisterHealthBar() +{ + // Notify UI of character spawn + ULocalPlayer* localPlayer = GetGameInstance()->GetFirstGamePlayer(); + if(localPlayer) + { + ADefaultPlayerController* localPlayerController = Cast(localPlayer->PlayerController); + if(localPlayerController) + { + localPlayerController->OnCharacterCreated(this); + + } + else + { + GWWARNING(L"No local player found to send OnCharacterCreated"); + } + } +} +void ANetworkCharacter::UnregisterHealthBar() +{ + // Notify UI of character destroy + UGameInstance* inst = GetGameInstance(); + if(!inst) + return; + ULocalPlayer* player = inst->GetFirstGamePlayer(); + if(player) + { + APlayerController* controller = player->PlayerController; + + ADefaultPlayerController* localPlayer = Cast(controller); + if(localPlayer) + { + localPlayer->OnCharacterDestroyed(this); + } + else + { + GWWARNING(L"No local player found to send OnCharacterDestroyed"); + } + } +} +void ANetworkCharacter::Tick(float DeltaSeconds) +{ + Super::Tick(DeltaSeconds); + + // Update the damage accumolation table + if (m_damageAccum.size() > 0) + { + for (auto iter = m_damageAccum.begin(); iter != m_damageAccum.end();) + { + // Controller no longer exists + if (!IsValid(iter->first)) + { + iter = m_damageAccum.erase(iter); + continue; + } + + DamagePeriod& value = iter->second; + value.timer -= DeltaSeconds; + + // Time has expired + if (value.timer <= 0) + { + if (value.damage > 0) + iter->first->SpawnArcingCombatText(GetActorLocation(), FString::FromInt(value.damage), FLinearColor::White); + m_totalDamage = value.damage; + iter = m_damageAccum.erase(iter); + continue; + } + + iter++; + } + } + + // Update the team damage dealt table + if (m_teamDamageDealt.size() > 0) + { + for (auto iter = m_teamDamageDealt.begin(); iter != m_teamDamageDealt.end();) + { + DamagePeriod& value = iter->second; + value.timer -= DeltaSeconds; + + // Time has expired, this team is no longer entitled for the experience + if (value.timer <= 0) + { + iter = m_teamDamageDealt.erase(iter); + continue; + } + + iter++; + } + } + + ADefaultPlayerController* const controller = Cast(GetController()); + + // Update the heal accumolation + if (IsValid(controller) && m_healAccumValue > 0) + { + m_healAccumTimer -= DeltaSeconds; + if (m_healAccumTimer <= 0) + { + m_healAccumTimer = 0; + controller->SpawnCombatText(GetActorLocation(), FString::FromInt(m_healAccumValue), FLinearColor::Green); + m_healAccumValue = 0; + } + } + + if(GetMesh()) + { + // Check if ally or player for silhouette material + // (0 = neutral, 1 = player, 2 = ally, 3 = enemy) + UWorld* const world = GetWorld(); + const int32 current = GetMesh()->CustomDepthStencilValue; + int32 target = 0; // Default to neutral + + if(controller == world->GetFirstPlayerController()) + target = 1; // Self + else + { + // Get the local team + int32 localTeam = -1; + ADefaultPlayerController* controller = Cast(world->GetFirstPlayerController()); + if(IsValid(controller)) + { + APlayerStateBase* playerState = Cast(controller->PlayerState); + if(IsValid(playerState)) + localTeam = playerState->GetTeam(); + } + if(localTeam != -1) + { + if(GetTeam() == localTeam) + target = 2; // Ally + else if(GetTeam() != 0) + target = 3; // Enemy + } + } + if(target != current) + { + GetMesh()->CustomDepthStencilValue = target; + GetMesh()->MarkRenderStateDirty(); + } + } + + m_TickAbilities(DeltaSeconds); + +#if UE_INCLUDE_METRICS + if (metricsHandle) + { + // Record player stats + metricsHandle->OnPlayerUpdate(GetActorLocation().X, GetActorLocation().Y); + ADefaultPlayerState* const state = Cast(PlayerState); + if(state) + metricsHandle->OnPlayerLevel(uint8(state->GetLevel())); + metricsHandle->OnPlayerMaxHealth(m_maxHealth); + metricsHandle->OnPlayerMaxMana(m_maxMana); + metricsHandle->OnPlayerHealth(m_health); + metricsHandle->OnPlayerMana(m_mana); + } +#endif + if (m_shouldBeDestroyed) + Destroy(); +} +void ANetworkCharacter::OnDeath(UAbilityInfo* ability) +{ + m_shouldBeDestroyed = true; +} +void ANetworkCharacter::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + + DOREPLIFETIME(ANetworkCharacter, basicAttack); + DOREPLIFETIME(ANetworkCharacter, m_health); + DOREPLIFETIME(ANetworkCharacter, m_maxHealth); + DOREPLIFETIME(ANetworkCharacter, m_mana); + DOREPLIFETIME(ANetworkCharacter, m_maxMana); + DOREPLIFETIME(ANetworkCharacter, m_stunned); + DOREPLIFETIME(ANetworkCharacter, m_silenced); + DOREPLIFETIME(ANetworkCharacter, m_channelStun); + DOREPLIFETIME(ANetworkCharacter, m_allowChannelRotation); + DOREPLIFETIME(ANetworkCharacter, m_castingAbility); + DOREPLIFETIME(ANetworkCharacter, m_cooldownReduction); + DOREPLIFETIME(ANetworkCharacter, m_attackSpeed); + DOREPLIFETIME(ANetworkCharacter, m_attackDamageMultiplier); + DOREPLIFETIME(ANetworkCharacter, m_magicDamageMultiplier); + DOREPLIFETIME(ANetworkCharacter, m_blockedMana); + DOREPLIFETIME(ANetworkCharacter, m_damageMultiplier); + DOREPLIFETIME(ANetworkCharacter, m_ignoreArmor); + DOREPLIFETIME(ANetworkCharacter, m_armor); + DOREPLIFETIME(ANetworkCharacter, m_manaRegenMultiplier); + DOREPLIFETIME(ANetworkCharacter, m_visible); + DOREPLIFETIME(ANetworkCharacter, m_hitable); + DOREPLIFETIME(ANetworkCharacter, m_manaUsageMultiplier); + DOREPLIFETIME(ANetworkCharacter, m_positiveEffectMultiplier); + DOREPLIFETIME(ANetworkCharacter, m_negativeEffectMultiplier); + DOREPLIFETIME(ANetworkCharacter, m_castingMovementspeedMultiplier); + DOREPLIFETIME(ANetworkCharacter, swingAnimationSequence); +} + +void ANetworkCharacter::TriggerSwingAnimation_Server() +{ + check(Role == ROLE_Authority); + swingAnimationSequence++; +} + +void ANetworkCharacter::LearnSkills_Implementation(const TArray& skills) +{ + ADefaultPlayerController* pc = Cast(GetController()); + + for(size_t i = 0; i < skills.Num(); i++) + { + const FIngameSkillTreeSkill& obj = skills[i]; + UAbilityInfo* ability = obj.selectedEffect; + + if(ability) + { + // Initialize ability power in the ability state + AAbilityState* aState = GetAbilityState(ability); + if(aState) + aState->power = obj.power; + + if(ability->passive) + { + if(!passives.Contains(ability)) + { + // Learn passive + passives.Add(obj.selectedEffect); + + // Only Cast the actual passive ability on the server + if(Role == ROLE_Authority) + { + CastAbility(ability); + } + } + } + else + { + // Learn ability + if(!abilities.Contains(ability)) + { + abilities.Add(ability); + } + } + } + } +} +void ANetworkCharacter::LearnSkills_Server(const TArray& skills) +{ + // Server side call + LearnSkills_Implementation(skills); + // Client side call + LearnSkills(skills); +} + +void ANetworkCharacter::m_SpawnModifiers() +{ + ARegenModifier* regenMod = Cast(m_modifierManager->AddModifier(ARegenModifier::StaticClass(), 0)); + regenMod->regenPerTick = passiveHealthRegen; + AManaRegenModifier* manaMod = Cast(m_modifierManager->AddModifier(AManaRegenModifier::StaticClass(), 0)); + manaMod->regenPerTick = passiveManaRegen; +} + +bool ANetworkCharacter::m_AllowedToMove() +{ + return !IsStunned(); +} +bool ANetworkCharacter::m_AllowedToRotate() +{ + return CanRotate(); +} + +void ANetworkCharacter::m_OnAbilityCastConfirm_Implementation(UAbilityInfo* ability, bool success, bool toggleState, float cooldown, float cooldownTime) +{ + if (!ability) + { + GWWARNING(L"Out of range value received for OnAbilityCastConfirm"); + return; + } + + AAbilityState* state = GetAbilityState(ability); + + //GWPRINT(L"Ability toggle " + ability->GetName() + L" toggles from " + state->toggleState + L" to " + toggleState); + + state->toggleState = toggleState; + + state->onCooldownTimer = cooldown; + state->currentCooldownDuration = cooldownTime; + state->cooldownRate = cooldown/cooldownTime; +} +bool ANetworkCharacter::m_CastAbility_Server_Validate(UAbilityInfo* ability) +{ + if(ability == nullptr) + return false; + if(ability->events.Num() == 0) + { + GWERROR(L"No events in ability->events for ability " + ability->GetName()); + return false; + } + // Validate AbilityInfo Array + for(int32 i = 0; i < ability->events.Num(); i++) + { + if(ability->events[i] == nullptr) + { + GWERROR(L"Null entry in ability->events[" + i + L"] for ability " + ability->GetName()); + return false; + } + } + return true; +} +void ANetworkCharacter::m_CastAbility_Server_Implementation(UAbilityInfo* ability) +{ + AAbilityState* state = GetAbilityState(ability); + + // Check if this is a toggle ability, and is toggled off + bool toggleOffAbility = ability->IsHoldOrToggle() && state->toggleState == true; + + // Check if we're not channeling (if this is not a toggle off ability) + if(IsPendingKill() || IsPendingKillPending()) + return; + + // Check if stunned or already casting an ability + // allow if this is a toggle ability and currently on + if(!toggleOffAbility && (IsStunned() || IsChanneling() )) + { + m_OnAbilityCastConfirm_Server(ability, false); + return; + } + + // Check if silenced, block all non-basic attacks in this case + // also, don't block passives + if (ability->abilityType != EAbilityType::Basic && IsSilenced() && !ability->passive) + { + m_OnAbilityCastConfirm_Server(ability, false); + return; + } + + // Check if ability is not on cooldown (if not toggling off) + if(state->onCooldownTimer > 0.1f && !toggleOffAbility) + { + m_OnAbilityCastConfirm_Server(ability, false); + return; + } + + // Use mana state for current ability / character mana usage chained together with ability state (toggle off ability?) + bool currentUsesMana = m_usesMana && !toggleOffAbility; + + UWorld* const world = GetWorld(); + if (ability && world && (ability->mana * m_manaUsageMultiplier <= m_mana || !currentUsesMana)) + { + if (currentUsesMana) + RemoveMana(ability->mana * m_manaUsageMultiplier); + + // Handle cooldown setting + if(ability->IsHoldOrToggle() && state->toggleState == false) + { + // No cooldown when casting toggle abilities + state->onCooldownTimer = 0.0f; + state->cooldownRate = 0.0f; + } + else + { + // Go on cooldown if it is a toggle ability, or a regular ability + m_SetAbilityCooldown(ability, state); + } + + if(ability->IsHoldOrToggle()) + { + AAbilityEventGroup** activeAbility = m_activeAbilities.Find(ability); + bool isAbilityActive = activeAbility && *activeAbility; + + // Check if ability is enabled + if(state->toggleState == false) + { + // Check if ability does not yet exist + if(!isAbilityActive) + { + state->toggleState = true; + + // Activate toggle ability + m_InitAbilitySequence(ability, state); + } + else + { + m_OnAbilityCastConfirm_Server(ability, false); + } + } + else + { + // Deactivate ability + if(isAbilityActive) + { + state->toggleState = false; + (*activeAbility)->NextGroup(); + *activeAbility = nullptr; + m_OnAbilityCastConfirm_Server(ability, true); + } + else + { + m_OnAbilityCastConfirm_Server(ability, false); + } + } + } + else + { + m_InitAbilitySequence(ability, state); + } + } + else + { + m_OnAbilityCastConfirm_Server(ability, false); + } +} +void ANetworkCharacter::m_InitAbilitySequence(class UAbilityInfo* ability, class AAbilityState* state) +{ + AAbilityEventGroup* group = AAbilityEventGroup::SpawnSequence(this, ability, state, ability->events); + check(group); + if(group->channelEvent) + { + //GWPRINT(L"Begin channel ability " + group->GetName()); + m_channelGroup = group; + m_castingAbility = ability; + m_allowChannelRotation = group->allowRotateWhileChannel; + if(m_castingMovementspeedMultiplier == 0.0f || ability->abilityType == EAbilityType::Basic) + m_channelStun = group->stunWhileChannel; + else + { + if (group->stunWhileChannel) + { + ASpeedModifier* sModifier = GetWorld()->SpawnActor(); + sModifier->lifeTime = group->duration; + sModifier->speedMultiplier = m_castingMovementspeedMultiplier; + sModifier->target = this; + GetModifierManager()->AddModifier(sModifier); + } + } + } + else + { + m_allowChannelRotation = false; + m_channelGroup = nullptr; + } + + group->onAbilityEventGroupEnded.AddDynamic(this, &ANetworkCharacter::m_OnAbilityEventGroupEnded); + m_activeAbilities.Add(ability, group); + + m_OnAbilityCastConfirm_Server(ability, true); +} + +void ANetworkCharacter::m_PreCast(UAbilityInfo* ability) +{ + if(ability->mana * m_manaUsageMultiplier <= m_mana) + m_currentPreCast = APreCastAbilityEventGroup::InitPreCast(ability, this); +} +void ANetworkCharacter::m_TickAbilities(float DeltaSeconds) +{ + for(auto it = m_abilityStates.CreateIterator(); it; ++it) + { + AAbilityState* state = it.Value(); + if((state->onCooldownTimer -= (DeltaSeconds * (1.0f + m_cooldownReduction))) <= 0.0f) + { + state->onCooldownTimer = 0.0f; + } + state->cooldownRate = state->onCooldownTimer / it.Key()->cooldown; + } + if(m_modifierManager) + m_modifierManager->Tick(DeltaSeconds); + m_timeSinceDamage += DeltaSeconds; +} + +void ANetworkCharacter::m_SetAbilityCooldown(class UAbilityInfo* ability, class AAbilityState* state) +{ + if(ability->abilityType == EAbilityType::Basic) + { + // This is the character's basic attack + state->onCooldownTimer = state->currentCooldownDuration = 1.0f / m_attackSpeed; + state->cooldownRate = (state->currentCooldownDuration > 0.0f) ? (state->onCooldownTimer / state->currentCooldownDuration) : 0.0f; + } + else + { + // This is an ability + state->NativeSetCooldown(); + } +} + +void ANetworkCharacter::m_OnAbilityCastConfirm_Server(UAbilityInfo* ability, bool success) +{ + AAbilityState* state = GetAbilityState(ability); + m_OnAbilityCastConfirm(ability, success, state->toggleState, state->onCooldownTimer, state->currentCooldownDuration); + +#if UE_INCLUDE_METRICS + if (metricsHandle && success && !ability->passive) + { + // Record ability cast + if (!ability->IsHoldOrToggle() || state->toggleState) + { + std::wstring abilityName = std::wstring() + ability->name; + if (abilityName.size() > 512) + abilityName.resize(512); + + Metrics::RegisterAbility(ability->GetStaticHash(), abilityName); + metricsHandle->OnPlayerCast(ability->GetStaticHash()); + } + } +#endif + + return; +} +void ANetworkCharacter::m_OnAbilityEventGroupEnded(class UAbilityInfo* ability, class AAbilityEventGroup* current, class AAbilityEventGroup* next) +{ + check(Role == ROLE_Authority); + check(ability); + AAbilityEventGroup** group = m_activeAbilities.Find(ability); + check(group); + *group = next; + + // Check end of channeling ability + if(m_channelGroup == current) + { + if(!next || !next->channelEvent) + { + //GWPRINT(L"End ability channel on ability " + m_castingAbility->GetName()); + m_castingAbility = nullptr; + m_channelGroup = nullptr; + m_channelStun = false; + } + else + { + m_channelGroup = next; + m_channelStun = m_channelGroup->stunWhileChannel; + } + } + + if(!next) + { + // Turn of toggle state if it was active + AAbilityState* state = GetAbilityState(ability); + if(state->toggleState == true) + { + state->toggleState = false; + m_SetAbilityCooldown(ability, state); + m_OnAbilityCastConfirm_Server(ability, true); + } + } + else + { + // Subscribe to next group ended event + next->onAbilityEventGroupEnded.AddDynamic(this, &ANetworkCharacter::m_OnAbilityEventGroupEnded); + } + //GWPRINT(L"Ability " + ability->GetName() + L" reached next state " + (next ? next->GetName() : FString(L"end"))); +} + +void ANetworkCharacter::CastAbility(int32 abilityIndex) +{ + if (abilityIndex < 0 || abilityIndex >= abilities.Num()) + { + GWERROR(L"Ability index out of range"); + return; + } + UAbilityInfo* ability = abilities[abilityIndex]; + if (!ability) + { + GWERROR(L"Null ability assigned and casted on character character[" + GetName() + L"] slot[" + abilityIndex + L"]"); + return; + } + CastAbility(ability); +} +void ANetworkCharacter::CastAbility(UAbilityInfo* ability) +{ + if (!ability) + { + GWERROR(L"Ability pointer invalid"); + return; + } + + if(IsPendingKill() || IsPendingKillPending()) + return; + + AAbilityState* state = GetAbilityState(ability); + if(state->onCooldownTimer <= 0.0f && ability->precastEvent == nullptr) + { + m_CastAbility_Server(ability); + } + else if(ability->precastEvent != nullptr && state->onCooldownTimer <= 0.0f) + { + m_PreCast(ability); + } +} + +class UAbilityInfo* ANetworkCharacter::GetCastingAbility() +{ + return m_castingAbility; +} + +AAbilityState* ANetworkCharacter::GetAbilityState(UAbilityInfo* abilityInfo) +{ + AAbilityState** state = m_abilityStates.Find(abilityInfo); + if (!state) + { + // Don't check anymore if this character is allowed to cast an ability + // TODO: check this only for players in CastAbility_Validate when the new character class hierarchy is implemented + //check(abilities.Contains(abilityInfo) || passives.Contains(abilityInfo)); + if (abilityInfo == nullptr) + { + FERROR("abilityInfo == nullptr"); + return nullptr; + } + if(!abilityInfo->abilityState) + { + GWERROR(L"Ability " + abilityInfo->GetName() + L" does not have an ability state class assigned"); + abilityInfo->abilityState = AAbilityState::StaticClass(); + } + AAbilityState* abs = GetWorld()->SpawnActor(abilityInfo->abilityState); + abs->onCooldownTimer = 0.0f; + abs->cooldownRate = 0.0f; + abs->power = 0.0f; + abs->info = abilityInfo; + return m_abilityStates.Add(abilityInfo, abs); + } + return *state; +} + +bool ANetworkCharacter::GetAbilityToggleState(class UAbilityInfo* abilityInfo) +{ + AAbilityState* state = GetAbilityState(abilityInfo); + if(state) + { + return state->toggleState; + } + return false; +} + +void ANetworkCharacter::m_InteruptSpellcasting() +{ + if (m_channelGroup) + { + m_channelGroup->Interrupt(); + m_channelGroup = nullptr; + m_castingAbility = nullptr; + m_channelStun = false; + } +} + +ModifierManager* ANetworkCharacter::GetModifierManager() +{ + return m_modifierManager; +} + +TArray ANetworkCharacter::GetModifiersOfClass(TSubclassOf modifierClass) +{ + if (m_modifierManager) + return m_modifierManager->GetModifiersOfClass(modifierClass); + return TArray(); +} +void ANetworkCharacter::ResetModifiers() +{ + m_blockedMana = 0; + m_attackDamageMultiplier = 1.0f; + m_magicDamageMultiplier = 1.0f; + m_damageMultiplier = 1.0f; + m_manaRegenMultiplier = 1.0f; + m_stunned = false; + m_stunned = false; + m_damageTakenMultiplier = 1.0f; + m_cooldownReduction = 0.0f; + m_ignoreArmor = 0.0f; + m_manaUsageMultiplier = 1.0f; + m_positiveEffectMultiplier = 1.0f; + m_negativeEffectMultiplier = 1.0f; + m_castingMovementspeedMultiplier = 0.0f; + m_armor = baseArmor; + GetCharacterMovement()->MaxWalkSpeed = baseMovementSpeed; + m_SetLevelStats(); +} + +void ANetworkCharacter::m_SetLevelStats() +{ + +} + +void ANetworkCharacter::CheckStatsOverflow() +{ + if (m_health > m_maxHealth || !m_initialised) + m_health = m_maxHealth; + if (m_mana > m_maxMana || !m_initialised) + m_mana = m_maxMana; +} + +int32 ANetworkCharacter::DealDamage(UObject* WorldContextObject, int32 damage, float armorPercentageIgnore) +{ + ADealDamageProxy* damageProxy = Cast(WorldContextObject); + if(!damageProxy) + { + GWERROR(L"DealDamage can not be called from an object that does not inherit from ADealDamageProxy"); + return 0; + } + + int32 damageDealth = NativeDealDamage(damageProxy->character, damage, armorPercentageIgnore, damageProxy->abilityInfo); + + return damageDealth; +} +int32 ANetworkCharacter::NativeDealDamage(class ANetworkCharacter* dealer, int32 damage, float armorPercentageIgnore, UAbilityInfo* ability) +{ + // Ensure that this is only called on the server + check(Role == ROLE_Authority); + if(dealer == NULL || dealer->IsPendingKill()) + { + FWARNING("character in dealdamage is null or pendingkill"); + return 0; + } + + + // Scale the damage done or taken by creatures and players + if (dealer->IsA() != this->IsA()) + { + ANetworkPlayer* const player = dealer->IsA() ? Cast(dealer) : Cast(this); + if (IsValid(player)) + { + ADefaultPlayerState* const state = Cast(player->PlayerState); + if (IsValid(state)) + { + UCurveFloat* const curve = player == this ? player->creatureDamageDealtCurve : player->creatureDamageTakenCurve; + if (curve) + { + const float scalar = curve->GetFloatValue((float)state->GetLevel()); + damage = int32((float)damage * (scalar < 0.0f ? 0.0f : scalar)); + } + } + } + } + + + + if(damage < 0) + { + GWERROR(L"Negative damage dealt by " + ability->GetName()); + return 0; + } + const int32 damageCap = 1000; + if(damage > damageCap) + { + GWERROR(L"A lot of damage (>" + damageCap + L") dealt by " + ability->GetName() + ", is this intended?"); + } + if(armorPercentageIgnore > 1.0f || armorPercentageIgnore < 0.0f) + { + GWERROR(L"Invalid armorPercentageIgnore given by " + ability->GetName() + "will use 0.0f"); + armorPercentageIgnore = 0.0f; + // return 0; + } + + float totalArmorPercentage = armorPercentageIgnore + dealer->m_ignoreArmor; + totalArmorPercentage = std::fmax(0.0f, std::fmin(totalArmorPercentage, 1.0f)); + + if(m_damageTakenMultiplier == 0.0f || dealer->m_damageMultiplier <= 0.0f) + return 0; + float divider = 1 + 0.01f * ((float)m_armor * (1 - totalArmorPercentage)); + float damageToDeal; + // The damage to deal + damageToDeal = damage / divider; + + damageToDeal *= dealer->m_damageMultiplier; + // Multiply by weakness aka damage taken multiplier + damageToDeal *= m_damageTakenMultiplier; + + // Magic damage has a different multiplier + if (ability->abilityType == EAbilityType::Ability) + damageToDeal *= dealer->m_magicDamageMultiplier; + + int32 iDamageToDeal = damageToDeal; + bool dealdamage = true; + for (AModifier* mod : m_modifierManager->m_modifiers) + { + if (!mod->OnDamage(iDamageToDeal, dealer)) + { + dealdamage = false; + } + } + if (dealer->GetModifierManager() == nullptr) + return 0; + for (AModifier* mod : dealer->GetModifierManager()->m_modifiers) + { + if (!mod->OnDealDamage(iDamageToDeal, this)) + { + dealdamage = false; + } + } + if(!dealdamage) + return 0; + +#if UE_INCLUDE_METRICS + if (dealer->metricsHandle && IsValid(dealer)) + { + // Record ability damage dealt + dealer->metricsHandle->OnPlayerDealDamage(ability->GetStaticHash(), iDamageToDeal); + } +#endif + + if(iDamageToDeal > m_health) + iDamageToDeal = m_health; + RemoveHealth(iDamageToDeal); + m_lastPlayerDamage = dealer; + + onDamageTaken.Broadcast(dealer, damage, ability); + + // Update the entry for this team in the damage dealt table + const int32 team = dealer->GetTeam(); + if (experienceGainOnKill > 0 && team < 5) + { + auto find = m_teamDamageDealt.find(team); + if (find != m_teamDamageDealt.end()) + { + find->second.damage += iDamageToDeal; + find->second.timer = teamDamageTimer; + } + else + m_teamDamageDealt.emplace(team, DamagePeriod(iDamageToDeal, teamDamageTimer)); + } + + // Spawn combat text + ADefaultPlayerController* const controller = Cast(dealer->GetController()); + if (IsValid(controller)) + { + auto find = m_damageAccum.find(controller); + if (find == m_damageAccum.end()) + m_damageAccum.emplace(controller, DamagePeriod(iDamageToDeal, damageAccumTimer)); + else + find->second.damage += iDamageToDeal; + } + + for (AModifier* mod : m_modifierManager->m_modifiers) + mod->AfterDamage(iDamageToDeal); + + m_timeSinceDamage = 0; + + if(m_health <= 0) + { + NativeOnKilled(dealer, ability); + OnDeath(ability); + } + return iDamageToDeal; +} + +void ANetworkCharacter::NativeOnKilled(class ANetworkCharacter* killer, class UAbilityInfo* ability) +{ + // Score counting + ANetworkPlayer* const thisPlayer = Cast(this); + if (IsValid(thisPlayer)) + { + ADefaultPlayerState* state = Cast(thisPlayer->PlayerState); + if (IsValid(state)) state->deaths++; + + ANetworkPlayer* const killerPlayer = Cast(killer); + if (IsValid(killerPlayer)) + { + state = Cast(killerPlayer->PlayerState); + if (IsValid(state)) state->kills++; + } + } + + if (experienceGainOnKill > 0 && !m_teamDamageDealt.empty()) + { + ADefaultGameState* gameState = Cast(GetWorld()->GetGameState()); + TArray players = gameState->GetPlayers(); + + // Fetch highest team + int32 highestTeam = -1; + int32 highestDamage = 0; + for (auto i : m_teamDamageDealt) + { + if (i.second.damage > highestDamage) + { + highestDamage = i.second.damage; + highestTeam = i.first; + } + } + m_teamDamageDealt.clear(); + + // Apply experience + if (highestTeam > 0) + { + for (size_t i = 0; i < players.Num(); i++) + { + if (!players[i]) + continue; + + // Award the experience + if(players[i]->GetTeam() == highestTeam) + { + players[i]->GainExperience(experienceGainOnKill); + + // Spawn EXP gain effect + FTransform t; + if(players[i]->character) + { + t.SetTranslation(players[i]->character->GetActorLocation()); + ATargetedEffect* fx = GetWorld()->SpawnActorDeferred(expGainEffect, t); + fx->Init(0.0f, players[i]->character); + fx->target = GetActorLocation(); + UGameplayStatics::FinishSpawningActor(fx, t); + } + } + } + } + } + + // Clear the damage accum table + if (!m_damageAccum.empty()) + { + for (auto iter = m_damageAccum.begin(); iter != m_damageAccum.end();) + { + // Controller no longer exists + if (IsValid(iter->first)) + { + DamagePeriod& value = iter->second; + + if (value.damage > 0) + iter->first->SpawnArcingCombatText(GetActorLocation(), FString::FromInt(value.damage), FLinearColor::White); + } + + iter = m_damageAccum.erase(iter); + } + } + +#if UE_INCLUDE_METRICS + if(metricsHandle && IsValid(killer)) + { + // Record player death + if(killer->metricsHandle) + metricsHandle->OnPlayerDie(killer->metricsHandle->Id()); + else + metricsHandle->OnPlayerDie(0); + } +#endif + + onCharacterKilled.Broadcast(killer, ability); +} + +void ANetworkCharacter::OnStandardAttack(ANetworkCharacter* targetCharacter) +{ + if (m_modifierManager==nullptr) + { + FWARNING("m_modifierManager==nullptr"); + return; + } + for (AModifier* mod : m_modifierManager->m_modifiers) + { + if(IsValid(mod)) + mod->OnStandardAttack(targetCharacter); + } +} +void ANetworkCharacter::AddHealth(int32 health) +{ + NativeAddHealth(health); +} +void ANetworkCharacter::NativeAddHealth(int32 health) +{ + check(Role == ROLE_Authority); // server call only + check(health >= 0); + + if (m_health < m_maxHealth) + { + // Spawn combat text + ADefaultPlayerController* const controller = Cast(GetController()); + if (IsValid(controller)) + { + m_healAccumValue += health; + if (m_healAccumTimer <= 0.0f) m_healAccumTimer += healthAccumTimer; + } + + m_health += health; + if (m_health > m_maxHealth) + m_health = m_maxHealth; + } +} + +void ANetworkCharacter::RemoveHealth(int32 health) +{ + check(Role == ROLE_Authority); // Server only call + m_health -= health; +} +void ANetworkCharacter::AddMana(float mana) +{ + check(Role == ROLE_Authority); // Server only call + m_mana += mana * m_manaRegenMultiplier; + if (m_mana > (m_maxMana-m_blockedMana)) + m_mana = (m_maxMana - m_blockedMana); +} +void ANetworkCharacter::RemoveMana(float mana) +{ + check(Role == ROLE_Authority); // Server only call + if(mana > m_mana) + { + mana = m_mana; // mana has to remain positive or 0 + } + m_mana -= mana; +} +int32 ANetworkCharacter::GetMana() const +{ + return m_mana; +} +int32 ANetworkCharacter::GetBlockedMana() const +{ + return m_blockedMana; +} +int32 ANetworkCharacter::GetMaxMana() const +{ + return m_maxMana; +} +int32 ANetworkCharacter::GetHealth() const +{ + return m_health; +} +int32 ANetworkCharacter::GetMaxHealth() const +{ + return m_maxHealth; +} +int32 ANetworkCharacter::GetArmor() const +{ + return m_armor; +} +float ANetworkCharacter::GetDamageMultiplier() const +{ + return m_damageMultiplier; +} +float ANetworkCharacter::GetCooldownReduction() const +{ + return m_cooldownReduction; +} +float ANetworkCharacter::GetAttackSpeed() const +{ + return m_attackSpeed; +} +float ANetworkCharacter::GetAttackDamage() const +{ + return m_attackDamageMultiplier; +} +float ANetworkCharacter::GetMagicDamage() const +{ + return m_magicDamageMultiplier; +} +float ANetworkCharacter::GetTotalDamage() const +{ + return m_totalDamage; +} +bool ANetworkCharacter::GetHitable() const +{ + return m_hitable; +} +void ANetworkCharacter::SetHitable(bool hittable) +{ + m_hitable = hittable; +} +bool ANetworkCharacter::IsStunned() const +{ + return m_stunned || m_channelStun; +} +bool ANetworkCharacter::CanRotate() const +{ + if(m_stunned) + return false; + if(m_channelStun && !m_allowChannelRotation) + return false; + return true; +} + +bool ANetworkCharacter::IsSilenced() const +{ + return m_silenced; +} +bool ANetworkCharacter::IsChanneling() const +{ + return m_castingAbility != nullptr; +} +bool ANetworkCharacter::IsRanged() const +{ + return m_isRanged; +} +ANetworkCharacter* ANetworkCharacter::GetLastPlayerDamage() const +{ + return IsValid(m_lastPlayerDamage) ? m_lastPlayerDamage : nullptr; +} + +bool ANetworkCharacter::CanBeStunned() const +{ + return canBeStunned; +} + +float ANetworkCharacter::GetTimeSinceDamage() const +{ + return m_timeSinceDamage; +} + +bool ANetworkCharacter::IsVisible() const +{ + return m_visible; +} \ No newline at end of file diff --git a/Source/UnrealProject/Creatures/NetworkCharacter.h b/Source/UnrealProject/Creatures/NetworkCharacter.h new file mode 100644 index 0000000..68cebe6 --- /dev/null +++ b/Source/UnrealProject/Creatures/NetworkCharacter.h @@ -0,0 +1,324 @@ +// Project Lab - NHTV Igad + +#pragma once +#include +using std::unordered_map; +#include "AbilityState.h" +#include "ScalingGraph.h" +#include "NetworkPossessable.h" +#include "IngameSkillTree.h" +#include "NetworkCharacter.generated.h" + +class ACreatureSpawn; + +DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FCharacterKilled, ANetworkCharacter*, killer, UAbilityInfo*, ability); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnDamageTaken, ANetworkCharacter*, dealer, int32, damage, UAbilityInfo*, ability); + +UCLASS(config = Game) +class ANetworkCharacter : public ANetworkPossessable +{ + GENERATED_BODY() +public: + ANetworkCharacter(); + + virtual void BeginPlay() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + virtual void Destroyed() override; + virtual void OnDeath(UAbilityInfo* ability); + void RegisterHealthBar(); + void UnregisterHealthBar(); + + virtual void Tick(float DeltaSeconds) override; + + // This processes the learned abilities on the server and calls LearnSkills on the owning client + void LearnSkills_Server(const TArray& skills); + // This creates a list of all learned skills on the client's version of the character so that he gets an updated casting bar, etc. + UFUNCTION(Client, Reliable) + void LearnSkills(const TArray& skills); + + // The Buff/Modifier manager, for server side characters + class ModifierManager* GetModifierManager(); + UFUNCTION(BlueprintCallable, Category = "modifiers") + TArray GetModifiersOfClass(TSubclassOf modifierClass); + + virtual void ResetModifiers(); + void CheckStatsOverflow(); + + // Damage dealing + UFUNCTION(BlueprintCallable, Category = "Damage", meta = (WorldContext="WorldContextObject")) + int32 DealDamage(class UObject* WorldContextObject, int32 damage, float armorPercentageIgnore = 0.0f); + virtual int32 NativeDealDamage(class ANetworkCharacter* dealer, int32 damage, float armorPercentageIgnore = 0.0f, UAbilityInfo* ability = nullptr); + + virtual void NativeOnKilled(class ANetworkCharacter* killer, class UAbilityInfo* ability); + + UFUNCTION(BlueprintCallable, Category = "Damage") + void OnStandardAttack(ANetworkCharacter* targetCharacter); + + + + // Healing + UFUNCTION(BlueprintCallable, Category = "Healing") + void AddHealth(int32 health); + virtual void NativeAddHealth(int32 health); + + void RemoveHealth(int32 health); + void AddMana(float mana); + void RemoveMana(float mana); + UFUNCTION(BlueprintCallable, Category = "Damage") + float GetTimeSinceDamage() const; + + UFUNCTION(BlueprintCallable, Category = "Animation") + void TriggerSwingAnimation_Server(); + + UFUNCTION(BlueprintCallable, Category = "State") + int32 GetHealth() const; + UFUNCTION(BlueprintCallable, Category = "State") + int32 GetMana() const; + UFUNCTION(BlueprintCallable, Category = "State") + int32 GetBlockedMana() const; + UFUNCTION(BlueprintCallable, Category = "State") + int32 GetMaxHealth() const; + UFUNCTION(BlueprintCallable, Category = "State") + int32 GetMaxMana() const; + UFUNCTION(BlueprintCallable, Category = "State") + int32 GetArmor() const; + UFUNCTION(BlueprintCallable, Category = "State") + bool GetHitable() const; + UFUNCTION(BlueprintCallable, Category = "State") + void SetHitable(bool hitable); + UFUNCTION(BlueprintCallable, Category = "State") + float GetDamageMultiplier() const; + UFUNCTION(BlueprintCallable, Category = "State") + float GetCooldownReduction() const; + UFUNCTION(BlueprintCallable, Category = "State") + float GetAttackSpeed() const; + UFUNCTION(BlueprintCallable, Category = "State") + float GetAttackDamage() const; + UFUNCTION(BlueprintCallable, Category = "State") + float GetMagicDamage() const; + UFUNCTION(BlueprintCallable, Category = "State") + float GetTotalDamage() const; + UFUNCTION(BlueprintCallable, Category = "State") + bool IsStunned() const; + UFUNCTION(BlueprintCallable, Category = "State") + bool CanRotate() const; + UFUNCTION(BlueprintCallable, Category = "State") + bool IsSilenced() const; + UFUNCTION(BlueprintCallable, Category = "State") + bool IsChanneling() const; + UFUNCTION(BlueprintCallable, Category = "State") + bool IsRanged() const; + bool CanBeStunned() const; + + ANetworkCharacter* GetLastPlayerDamage() const; + + void CastAbility(int32 abilityIndex); + void CastAbility(class UAbilityInfo* abilityInfo); + + // Returns the ability that is currently being casted(channeling) + UFUNCTION(BlueprintCallable, Category = "Ability") + class UAbilityInfo* GetCastingAbility(); + + // Gets the persistent state of an ability between casts + class AAbilityState* GetAbilityState(class UAbilityInfo* abilityInfo); + + // Gets the toggle state for abilities that have isToggleAbility set + bool GetAbilityToggleState(class UAbilityInfo* abilityInfo); + bool m_initialised; + + // Minimap/FoW visibility + bool IsVisible() const; + + // The collection of abilities this character has, for players. + // The first ability in this array is always treated the character's basic attack, + // and thus is affected by the attack speed variable of the character + UPROPERTY(EditDefaultsOnly, Category = "Ability") + TArray abilities; + + UPROPERTY(BlueprintReadOnly, Replicated, Category = "Ability") + class UAbilityInfo* basicAttack; + + UPROPERTY(EditDefaultsOnly, Category = "Ability") + TArray passives; + + UPROPERTY(Replicated, BlueprintReadOnly, Category = "Animation") + int32 swingAnimationSequence; + + UPROPERTY(EditAnywhere, Category = "Experience Settings") + int32 experienceGainOnKill; + + // Intervals at which damage and healing combat text are spawned + UPROPERTY(EditAnywhere, Category = "Combat Text") + float healthAccumTimer; + UPROPERTY(EditAnywhere, Category = "Combat Text") + float damageAccumTimer; + + // Duration before a team's damage is no longer valid + // Gets refreshed when a team deals damage to the creature + UPROPERTY(EditAnywhere, Category = "Team Damage Table") + float teamDamageTimer; + + UPROPERTY(BlueprintAssignable, Category = "Character") + FCharacterKilled onCharacterKilled; + // SERVER ONLY + UPROPERTY(BlueprintAssignable, Category = "Character") + FOnDamageTaken onDamageTaken; + + METRICS_EXPR(Metrics::PlayerHandle* metricsHandle); + +protected: + // Called when the character is spawned or reset to set initial modifiers like fixed health/mana-regen + // overridable + virtual void m_SpawnModifiers(); + + // This checks stunn state, etc. to allow NetworkPossessable to move + virtual bool m_AllowedToMove() override; + virtual bool m_AllowedToRotate() override; + virtual void m_SetLevelStats(); + + UPROPERTY(EditDefaultsOnly, Category = "Stats") + int32 baseMovementSpeed; + UPROPERTY(EditDefaultsOnly, Category = "Stats") + int32 baseArmor; + UPROPERTY(EditDefaultsOnly, Category = "Stats") + int32 passiveManaRegen; + UPROPERTY(EditDefaultsOnly, Category = "Stats") + int32 passiveHealthRegen; + + UPROPERTY(Replicated) + int32 m_blockedMana; + UPROPERTY(Replicated) + float m_damageMultiplier; + UPROPERTY(Replicated) + float m_ignoreArmor; + UPROPERTY(Replicated) + float m_manaRegenMultiplier; + UPROPERTY(Replicated) + float m_manaUsageMultiplier; + UPROPERTY(Replicated) + float m_positiveEffectMultiplier; + UPROPERTY(Replicated) + float m_negativeEffectMultiplier; + UPROPERTY(Replicated) + float m_damageTakenMultiplier; + UPROPERTY(Replicated) + int32 m_armor; + UPROPERTY(Replicated) + bool m_stunned; + UPROPERTY(Replicated) + bool m_silenced; + //sileneCount is the ammount of silences by modifiers, silence by casting is not taking into account. + UPROPERTY(Replicated) + uint32 m_silenceCount; + UPROPERTY(Replicated) + bool m_visible; + UPROPERTY(Replicated) + bool m_hitable; + UPROPERTY(Replicated) + bool m_isRanged; + + UPROPERTY(EditDefaultsOnly, Category = "Stats") + bool canBeStunned; + UPROPERTY(EditDefaultsOnly, Category = "Stats") + bool canBeSilenced; + + UPROPERTY(Replicated) + int32 m_health; + UPROPERTY(Replicated) + int32 m_maxHealth; + UPROPERTY(Replicated) + float m_mana; + UPROPERTY(Replicated) + int32 m_maxMana; + UPROPERTY(Replicated) + float m_cooldownReduction; + UPROPERTY(Replicated) + float m_attackSpeed; + UPROPERTY(Replicated) + float m_attackDamageMultiplier; + UPROPERTY(Replicated) + float m_magicDamageMultiplier; + + UPROPERTY(Replicated) + bool m_usesMana; + + UPROPERTY(Replicated) + float m_castingMovementspeedMultiplier; + + friend class ModifierManager; + friend class APreCastAbilityEventGroup; + friend class AIllusionCharacter; + friend class ADefaultPlayerController; + class ModifierManager* m_modifierManager; + + bool m_shouldBeDestroyed = false; +private: + // Request to the server to cast an ability + UFUNCTION(Reliable, Server, WithValidation) + void m_CastAbility_Server(class UAbilityInfo* ability); + void m_InitAbilitySequence(class UAbilityInfo* ability, class AAbilityState* state); + + // Updates all the cooldown timers and ticks modifiers + void m_TickAbilities(float DeltaSeconds); + + void m_SetAbilityCooldown(class UAbilityInfo* ability, class AAbilityState* state); + + // Server only casting interupt + void m_InteruptSpellcasting(); + + // Called if we know an ability is successfully casted or not + UFUNCTION(Reliable, Client) + void m_OnAbilityCastConfirm(UAbilityInfo* ability, bool success, bool toggleState, float cooldown, float cooldownTime); + + void m_PreCast(UAbilityInfo* ability); + // Called if we know an ability is successfully casted or not (server-side) + virtual void m_OnAbilityCastConfirm_Server(UAbilityInfo* ability, bool success); + + // Callback for when an ability progresses to it's next state + UFUNCTION() + void m_OnAbilityEventGroupEnded(class UAbilityInfo* ability, class AAbilityEventGroup* current, class AAbilityEventGroup* next); + + friend class ADefaultPlayerState; + + // Active Stats + struct DamagePeriod + { + DamagePeriod(int32 damage, float timer) : damage(damage), timer(timer) {} + int32 damage; + float timer; + }; + unordered_map m_damageAccum; + int32 m_damageAccumValue; + float m_damageAccumTimer; + int32 m_healAccumValue; + float m_healAccumTimer; + float m_totalDamage; + unordered_map m_teamDamageDealt; + + UPROPERTY() + ANetworkCharacter* m_lastPlayerDamage; + + // Keeps ability persistent state between casts + UPROPERTY() + TMap m_abilityStates; + // Keeps ability execution states / active group (server-side) + UPROPERTY() + TMap m_activeAbilities; + + friend class AModifier; + friend class AVisibilityModifier; + float m_timeSinceDamage; + UPROPERTY() + class AAbilityEventGroup* m_channelGroup; + UPROPERTY(Replicated) + class UAbilityInfo* m_castingAbility; + UPROPERTY(Replicated) + bool m_channelStun; + UPROPERTY(Replicated) + bool m_allowChannelRotation; + + + class APreCastAbilityEventGroup* m_currentPreCast; + +}; + diff --git a/Source/UnrealProject/Creatures/NetworkGhost.cpp b/Source/UnrealProject/Creatures/NetworkGhost.cpp new file mode 100644 index 0000000..4b9fa33 --- /dev/null +++ b/Source/UnrealProject/Creatures/NetworkGhost.cpp @@ -0,0 +1,91 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "NetworkGhost.h" +#include "NetworkPlayer.h" +#include "DefaultPlayerState.h" + + +// Sets default values +ANetworkGhost::ANetworkGhost() +{ + bReplicates = true; + + postProcess = CreateDefaultSubobject(TEXT("PostProcess")); + postProcess->bEnabled = false; + postProcess->AttachTo(RootComponent); + + m_SetupCamera(); + + // Configure character movement + GetCharacterMovement()->bOrientRotationToMovement = true; // Rotate character to moving direction + GetCharacterMovement()->RotationRate = FRotator(0.f, 640.f, 0.f); + GetCharacterMovement()->bConstrainToPlane = true; + GetCharacterMovement()->bSnapToPlaneAtStart = true; + + shrinesInRange = 0; + respawnDuration = 15; + allyRespawnRange = 300; +} + +void ANetworkGhost::BeginPlay() +{ + Super::BeginPlay(); + + m_respawnTime = respawnDuration; +} + +void ANetworkGhost::Tick(float DeltaTime) +{ + Super::Tick(DeltaTime); + + // Update the respawn timer (server only) + if (Role == ROLE_Authority) + { + if (m_respawnTime > 0) + m_respawnTime -= DeltaTime; + } + + // Enable the post process on clients + if (IsValid(GetController())) + postProcess->bEnabled = GetController()->IsLocalController(); +} + + +bool ANetworkGhost::CanRespawn() const +{ + // Cannot respawn yet + if (m_respawnTime > 0) + return false; + + // If we're falling, were unable to respawn + if (!GetCharacterMovement()->IsMovingOnGround()) + return false; + + // We're at a shrine + if (shrinesInRange > 0) + return true; + + // Check if the ally is within the radius, so we can respawn next to him + ADefaultPlayerState* state = Cast(PlayerState); + bool inAllyRange = false; + if (IsValid(state) && IsValid(state->teamMate) && IsValid(state->teamMate->character)) + { + if (FVector::DistSquared(GetActorLocation(), state->teamMate->character->GetActorLocation()) <= (allyRespawnRange * allyRespawnRange)) + return true; + } + return false; +} + +float ANetworkGhost::RespawnTime() const +{ + return m_respawnTime; +} + + +void ANetworkGhost::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + + DOREPLIFETIME(ANetworkGhost, m_respawnTime); +} \ No newline at end of file diff --git a/Source/UnrealProject/Creatures/NetworkGhost.h b/Source/UnrealProject/Creatures/NetworkGhost.h new file mode 100644 index 0000000..876961c --- /dev/null +++ b/Source/UnrealProject/Creatures/NetworkGhost.h @@ -0,0 +1,44 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Creatures/NetworkPossessable.h" +#include "NetworkGhost.generated.h" + +UCLASS() +class UNREALPROJECT_API ANetworkGhost : public ANetworkPossessable +{ + GENERATED_BODY() + +public: + ANetworkGhost(); + + virtual void BeginPlay() override; + + virtual void Tick(float DeltaSeconds) override; + + + bool CanRespawn() const; + + UPROPERTY(BlueprintReadonly, Category = "Respawn") + int32 shrinesInRange; + + // Range to ally for respawn + UPROPERTY(EditAnywhere, Category = "Respawn") + float allyRespawnRange; + + // Time it takes before the player is allowed to respawn + UPROPERTY(EditAnywhere, Category = "Respawn") + float respawnDuration; + + // Get time it takes before respawning + UFUNCTION(BlueprintCallable, Category = "Respawn") + float RespawnTime() const; + + UPROPERTY(EditAnywhere, Category = "PostProcess") + UPostProcessComponent* postProcess; + +private: + UPROPERTY(Replicated) + float m_respawnTime; +}; \ No newline at end of file diff --git a/Source/UnrealProject/Creatures/NetworkPlayer.cpp b/Source/UnrealProject/Creatures/NetworkPlayer.cpp new file mode 100644 index 0000000..6e1e8ea --- /dev/null +++ b/Source/UnrealProject/Creatures/NetworkPlayer.cpp @@ -0,0 +1,474 @@ +// Project Lab - NHTV Igad +#include "UnrealProject.h" +#include "NetworkPlayer.h" +#include "DefaultPlayerController.h" +#include "ItemBase.h" +#include "BaseSkillObject.h" +#include "AbilityInfo.h" +#include "NetworkSwitch.h" +#include "DefaultGameMode.h" +#include "DefaultPlayerState.h" +#include "IngameSkillTree.h" + +#include "Modifier.h" +#include "SpawnerBase.h" +#include "TeamData.h" + +static UTeamData* teamData; + +ANetworkPlayer::ANetworkPlayer() +{ + bReplicates = true; + + m_SetupCamera(); + + m_initialised = false; + m_keyState = 0; + + healthCurve = ConstructorHelpers::FObjectFinder(TEXT("/Game/ScalingCurves/CF_PlayerHealth")).Object; + healthRegenCurve = ConstructorHelpers::FObjectFinder(TEXT("/Game/ScalingCurves/CF_PlayerHealthRegen")).Object; + manaCurve = ConstructorHelpers::FObjectFinder(TEXT("/Game/ScalingCurves/CF_PlayerMana")).Object; + manaRegenCurve = ConstructorHelpers::FObjectFinder(TEXT("/Game/ScalingCurves/CF_PlayerManaRegen")).Object; + armorCurve = ConstructorHelpers::FObjectFinder(TEXT("/Game/ScalingCurves/CF_PlayerArmor")).Object; + attackSpeedCurve = ConstructorHelpers::FObjectFinder(TEXT("/Game/ScalingCurves/CF_PlayerAttackSpeed")).Object; + + creatureDamageTakenCurve = ConstructorHelpers::FObjectFinder(TEXT("/Game/ScalingCurves/CF_CreatureDamageTaken")).Object; + creatureDamageDealtCurve = ConstructorHelpers::FObjectFinder(TEXT("/Game/ScalingCurves/CF_CreatureDamageDealt")).Object; + teamData = ConstructorHelpers::FObjectFinder(TEXT("/Game/Assets/TeamData")).Object; + + playerCircle = CreateDefaultSubobject("Player Circle"); + playerCircle->AttachTo(RootComponent); + + visionRadius = 2500; +} +void ANetworkPlayer::BeginPlay() +{ + m_levelStatsInitialized = false; + Super::BeginPlay(); + m_initialised = false; +} +void ANetworkPlayer::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + + if (Role != ROLE_Authority) + return; + + // Return the keys + ANetworkPlayer* const killedBy = Cast(GetLastPlayerDamage()); + if (m_health <= 0 && IsValid(killedBy) && killedBy->GetTeam() != GetTeam()) + { + FText Source = FText::FromString(killedBy->playerName); + FText Target = FText::FromString(playerName); + onPlayerKilled.Broadcast(Source, Target, killedBy->GetTeam(), GetTeam()); + // Assign keys to the player that killed us + for (auto iter = m_keyOrigins.CreateIterator(); iter; ++iter) + { + ASpawnerBase** find = killedBy->m_keyOrigins.Find(iter->Key); + if (!find) + killedBy->m_keyOrigins.Add(iter->Key, iter->Value); + else + iter->Value->hasDroppedKey = false; + } + killedBy->m_keyState |= m_keyState; + } + else + { + // Return the keys we have + for (auto iter = m_keyOrigins.CreateIterator(); iter; ++iter) + { + if (IsValid(iter->Value)) + iter->Value->hasDroppedKey = false; + } + } + m_keyState = 0; + m_keyOrigins.Reset(); + + // Clean up screen effects and delegates. + m_filterTimelines.Empty(); + for (int32 i = 0; i < m_delegates.Num(); i++) + { + GetWorldTimerManager().ClearTimer(m_delegates[i]); + } + m_delegates.Empty(); +} +void ANetworkPlayer::Tick(float DeltaSeconds) +{ + Super::Tick(DeltaSeconds); + + for (auto& timeline : m_filterTimelines) + { + timeline.Value.TickTimeline(DeltaSeconds); + } + + // Server only + if(Role == ROLE_Authority) + { + ADefaultPlayerState* state = Cast(PlayerState); + if(!m_levelStatsInitialized) + { + m_modifierManager->RecalculateCharacter(); + CheckStatsOverflow(); + if(!m_initialised) + { + m_health = m_maxHealth; + m_mana = m_maxMana; + m_initialised = true; + } + m_levelStatsInitialized = true; + } + } + +} + +void ANetworkPlayer::PossessedBy(AController* NewController) +{ + Super::PossessedBy(NewController); + OnRep_PlayerState(); +} +void ANetworkPlayer::OnRep_PlayerState() +{ + Super::OnRep_PlayerState(); + + // Initialize player circle + UMaterialInstanceDynamic* mi = playerCircle->CreateDynamicMaterialInstance(0); + FLinearColor teamColor = teamData->GetTeamColor(Cast(PlayerState)->GetTeam()); + mi->SetVectorParameterValue("Color", teamColor); +} + +void ANetworkPlayer::ResetModifiers() +{ + // Learn abilities + m_SetLevelStats(); + Super::ResetModifiers(); +} + +void ANetworkPlayer::OnLevelUp_Server(int32 newLevel) +{ + check(Role == ROLE_Authority); + + // Learn abilities + //m_SetLevelStats(); + + // Recalculate modifiers for new level + if(m_modifierManager) + m_modifierManager->RecalculateCharacter(); + CheckStatsOverflow(); + + // Call blueprint level up event (server-side) + OnLevelUp(newLevel); +} + +class ANetworkPlayer* ANetworkPlayer::GetTeamMate() const +{ + ADefaultPlayerState* state = Cast(PlayerState); + if (state && state->teamMate) + return state->teamMate->character; + return nullptr; +} + +void ANetworkPlayer::m_SetLevelStats() +{ + Super::m_SetLevelStats(); + // Update stats + ADefaultPlayerState* state = Cast(PlayerState); + + float level = 1; + if(IsValid(state)) + level = (float)state->GetLevel(); + + float newHealth = SampleHealthCurve(level); + float newMana = SampleManaCurve(level); + float newArmor = SampleArmorCurve(level); + float newAttackSpeed = SampleAttackSpeedCurve(level); + + //GWPRINT(L"Setting level bases stats for level " + level + L"(" + levelScale + L")"); + //GWPRINT(L"Health = " + m_maxHealth + L"->" + newHealth); + //GWPRINT(L"Mana = " + m_maxMana + L"->" + newMana); + //GWPRINT(L"Armor = " + m_armor + L"->" + newArmor); + //GWPRINT(L"Attack Speed = " + m_attackSpeed + L"->" + newAs); + + if(!m_levelStatsInitialized) + { + m_health = newHealth; + m_mana = newMana; + } + + m_maxHealth = newHealth; + m_maxMana = newMana; + baseArmor = newArmor; + m_attackSpeed = newAttackSpeed; + + if(Role == ROLE_Authority) + { + // Send level-up/learn skill command + ADefaultPlayerController* controller = Cast(GetController()); + if(controller) + { + controller->LearnSkillsForLevel(); + } + } +} + +void ANetworkPlayer::OnLevelUp_Implementation(int32 newLevel) +{ + m_levelStatsInitialized = false; +} + +bool ANetworkPlayer::ToggleSwitch_Validate(ANetworkSwitch* networkSwitch) +{ + return networkSwitch && FVector::Dist(GetActorLocation(), networkSwitch->GetActorLocation()) < 600; +} +void ANetworkPlayer::ToggleSwitch_Implementation(ANetworkSwitch* networkSwitch) +{ + if(FVector::Dist(GetActorLocation(), networkSwitch->GetActorLocation()) < 300) + networkSwitch->Toggle(); +} + +float ANetworkPlayer::SampleHealthCurve(float in) +{ + if(GetCharacterClassProperties().healthCurve) + { + return GetCharacterClassProperties().healthCurve->GetFloatValue(in); + } + return healthCurve->GetFloatValue(in); +} +float ANetworkPlayer::SampleManaCurve(float in) +{ + if(GetCharacterClassProperties().manaCurve) + { + return GetCharacterClassProperties().manaCurve->GetFloatValue(in); + } + return manaCurve->GetFloatValue(in); +} +float ANetworkPlayer::SampleArmorCurve(float in) +{ + if(GetCharacterClassProperties().armorCurve) + { + return GetCharacterClassProperties().armorCurve->GetFloatValue(in); + } + return armorCurve->GetFloatValue(in); +} +float ANetworkPlayer::SampleAttackSpeedCurve(float in) +{ + if(GetCharacterClassProperties().attackSpeedCurve) + { + return GetCharacterClassProperties().attackSpeedCurve->GetFloatValue(in); + } + return attackSpeedCurve->GetFloatValue(in); +} + +bool ANetworkPlayer::HasKey(PlayerKeyType keyType) const +{ + if (keyType == PlayerKeyType::None) + return m_keyState == 0; + return ((1 << (int32)keyType) & m_keyState) != 0; +} +bool ANetworkPlayer::HasAnyKey() const +{ + return m_keyState != 0; +} +bool ANetworkPlayer::AssignKey(PlayerKeyType keyType, ASpawnerBase* origin) +{ + check(Role == ROLE_Authority); + + if (HasKey(keyType)) + return false; + + origin->hasDroppedKey = true; + + // Store the origin for later + m_keyOrigins.Add((uint8)keyType, origin); + m_keyState += (1 << (int32)keyType); + return true; +} +bool ANetworkPlayer::ClearKey(PlayerKeyType keyType) +{ + check(Role == ROLE_Authority); + + if (!HasKey(keyType)) + return false; + + // Allow the boss to drop keys again + ASpawnerBase** find = m_keyOrigins.Find((uint8)keyType); + if (find) + { + if(IsValid(*find)) (*find)->hasDroppedKey = false; + m_keyOrigins.Remove((uint8)keyType); + } + m_keyState -= (1 << (int32)keyType); + return true; +} + +void ANetworkPlayer::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + + DOREPLIFETIME(ANetworkPlayer, m_keyState); +} + +FCharacterClassProperty ANetworkPlayer::GetCharacterClassProperties() const +{ + static FCharacterClassProperty dummy; + if(!Controller) + return dummy; + return Cast(Controller)->GetCharacterClassProperties(); +} + +//Screen Filters +void ANetworkPlayer::SetFilterDuration(float duration, UPostProcessComponent* filter) +{ + FTimerHandle uniqueHandle; + FTimerDelegate stopFilterDelegate = FTimerDelegate::CreateUObject(this, &ANetworkPlayer::StopFilter, filter, uniqueHandle); + GetWorldTimerManager().SetTimer(uniqueHandle, stopFilterDelegate, duration, false); + m_delegates.Add(uniqueHandle); +} + +void ANetworkPlayer::SetTimelineDuration(float duration, UPostProcessComponent* filter) +{ + FTimerHandle uniqueHandle; + FTimerDelegate stopFilterDelegate = FTimerDelegate::CreateUObject(this, &ANetworkPlayer::StopTimeline, filter, uniqueHandle); + GetWorldTimerManager().SetTimer(uniqueHandle, stopFilterDelegate, duration, false); + m_delegates.Add(uniqueHandle); +} + +void ANetworkPlayer::StartFilter(float duration, UPostProcessComponent* filter, UCurveFloat* timelineCurve) +{ + if ( m_filterTimelines.Contains(filter) ) return; + if (timelineCurve) + { + FTimeline timeLine; + FOnTimelineFloatStatic timelineDelegate; + timelineDelegate.BindUObject(this, &ANetworkPlayer::FilterUpdate, filter); + timeLine.AddInterpFloat(timelineCurve, timelineDelegate); + timeLine.SetPlayRate(1.0f / duration); + timeLine.PlayFromStart(); + m_filterTimelines.Add(filter, timeLine); + SetFilterDuration(duration, filter); + } + filter->bEnabled = true; +} + +void ANetworkPlayer::StartFilterWithDelegate(float duration, UPostProcessComponent* filter, UCurveFloat* timelineCurve, FPostAction action) +{ + if ( m_filterTimelines.Contains(filter) ) return; + if (timelineCurve) + { + FTimeline timeLine; + FOnTimelineFloatStatic timelineDelegate; + timelineDelegate.BindUObject(this, &ANetworkPlayer::FilterUpdate, filter, action); + timeLine.AddInterpFloat(timelineCurve, timelineDelegate); + timeLine.SetPlayRate(1.0f / duration); + timeLine.PlayFromStart(); + m_filterTimelines.Add(filter, timeLine); + SetFilterDuration(duration, filter); + } + filter->bEnabled = true; +} + +void ANetworkPlayer::EnableFilter(float duration, UPostProcessComponent* filter, UCurveFloat* timelineCurve) +{ + if (m_filterTimelines.Contains(filter)) return; + if (!timelineCurve) + { + YERROR("No timelineCurve given."); + return; + } + + FTimeline timeLine; + FOnTimelineFloatStatic timelineDelegate; + timelineDelegate.BindUObject(this, &ANetworkPlayer::FilterUpdate, filter); + timeLine.AddInterpFloat(timelineCurve, timelineDelegate); + timeLine.SetPlayRate(1.0f / duration); + timeLine.PlayFromStart(); + m_filterTimelines.Add(filter, timeLine); + SetTimelineDuration(duration, filter); + filter->bEnabled = true; +} + +void ANetworkPlayer::DisableFilter(float duration, UPostProcessComponent* filter, UCurveFloat* timeline) +{ + StartFilter(duration, filter, timeline); +} + +void ANetworkPlayer::EnableFilterWithDelegate(float duration, UPostProcessComponent* filter, UCurveFloat* timelineCurve, FPostAction action) +{ + if (m_filterTimelines.Contains(filter)) return; + if (!timelineCurve) + { + YERROR("No timelineCurve given."); + return; + } + + FTimeline timeLine; + FOnTimelineFloatStatic timelineDelegate; + timelineDelegate.BindUObject(this, &ANetworkPlayer::FilterUpdate, filter, action); + timeLine.AddInterpFloat(timelineCurve, timelineDelegate); + timeLine.SetPlayRate(1.0f / duration); + timeLine.PlayFromStart(); + m_filterTimelines.Add(filter, timeLine); + SetTimelineDuration(duration, filter); + filter->bEnabled = true; +} + +void ANetworkPlayer::DisableFilterWithDelegate(float duration, UPostProcessComponent* filter, UCurveFloat* timeline, FPostAction action) +{ + StartFilterWithDelegate(duration, filter, timeline, action); +} + +void ANetworkPlayer::StopFilter(UPostProcessComponent* filter, FTimerHandle handle) +{ + filter->bEnabled = false; + m_delegates.Remove(handle); + if (!m_filterTimelines.Contains(filter)) + { + YERROR("Can't find filter in timeline."); + return; + } + m_filterTimelines.Remove(filter); +} + +void ANetworkPlayer::StopTimeline( UPostProcessComponent* filter, FTimerHandle handle ) +{ + m_delegates.Remove(handle); + if (!m_filterTimelines.Contains(filter)) + { + YERROR("Can't find filter in timeline."); + return; + } + m_filterTimelines.Remove(filter); +} + +void ANetworkPlayer::FilterUpdate(float value, UPostProcessComponent* filter) +{ + filter->BlendWeight = value; +} + +void ANetworkPlayer::FilterUpdate(float value, UPostProcessComponent* filter, FPostAction action) +{ + action.ExecuteIfBound(value, filter); +} + +void ANetworkPlayer::AddThreatLevel_Client_Implementation(const float a_NewThreat) +{ + threats.Add(a_NewThreat); + + threatLevel = a_NewThreat > threatLevel ? a_NewThreat : threatLevel; +} + +void ANetworkPlayer::RemoveThreatLevel_Client_Implementation(const float a_NewThreat) +{ + threats.RemoveSingle(a_NewThreat); + + if (a_NewThreat == threatLevel) + { + threatLevel = 0; + for (int32 i = 0; i < threats.Num(); i++) + { + if (threats[i] > threatLevel) + { + threatLevel = threats[i]; + } + } + } +} diff --git a/Source/UnrealProject/Creatures/NetworkPlayer.h b/Source/UnrealProject/Creatures/NetworkPlayer.h new file mode 100644 index 0000000..c2c9184 --- /dev/null +++ b/Source/UnrealProject/Creatures/NetworkPlayer.h @@ -0,0 +1,155 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Creatures/NetworkCharacter.h" +#include "IngameSkillTree.h" +#include "PlayerKeyType.h" +#include "NetworkPlayer.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API ANetworkPlayer : public ANetworkCharacter +{ + GENERATED_BODY() + +public: + ANetworkPlayer(); + virtual void BeginPlay() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + virtual void Tick(float DeltaSeconds) override; + + // For detecting when the player is possessed + virtual void PossessedBy(AController* NewController) override; + virtual void OnRep_PlayerState() override; + + // Clears all the modifier stat modifications from this character + virtual void ResetModifiers(); + + UFUNCTION(Server, Reliable, WithValidation) + void ToggleSwitch(class ANetworkSwitch* networkSwitch); + + // Server-Side level up event + UFUNCTION(BlueprintNativeEvent, Category = "LevelUp") + void OnLevelUp(int32 newLevel); + // Called server-side when a character levels up + void OnLevelUp_Server(int32 newLevel); + + // Get the class properties of this player + UFUNCTION(BlueprintCallable, Category = "State") + FCharacterClassProperty GetCharacterClassProperties() const; + + UFUNCTION(BlueprintCallable, Category = "Team") + class ANetworkPlayer* GetTeamMate() const; + + DECLARE_DYNAMIC_MULTICAST_DELEGATE_FourParams(FOnPlayerKilled, FText, source, FText, target, int32, sourceNum, int32, targetNum); + UPROPERTY(BlueprintAssignable, Category = "Game") + FOnPlayerKilled onPlayerKilled; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Music") + float threatLevel; + TArray threats; + UFUNCTION(Client, Reliable) + void AddThreatLevel_Client(const float a_NewThreat); + UFUNCTION(Client, Reliable) + void RemoveThreatLevel_Client(const float a_NewThreat); + + // Base Stats for all characters + UPROPERTY(VisibleAnywhere, Category = "Stats") + UCurveFloat* healthCurve; + UPROPERTY(VisibleAnywhere, Category = "Stats") + UCurveFloat* healthRegenCurve; + UPROPERTY(VisibleAnywhere, Category = "Stats") + UCurveFloat* manaCurve; + UPROPERTY(VisibleAnywhere, Category = "Stats") + UCurveFloat* manaRegenCurve; + UPROPERTY(VisibleAnywhere, Category = "Stats") + UCurveFloat* armorCurve; + UPROPERTY(VisibleAnywhere, Category = "Stats") + UCurveFloat* attackSpeedCurve; + + // Use these functions to sample the above curves, these functions also check class specific overrides + float SampleHealthCurve(float in); + float SampleManaCurve(float in); + float SampleArmorCurve(float in); + float SampleAttackSpeedCurve(float in); + + // Creature level scaling logic + // Damage done to creatures + UPROPERTY(VisibleAnywhere, Category = "Stats") + UCurveFloat* creatureDamageTakenCurve; + // Damage dealt by creatures + UPROPERTY(VisibleAnywhere, Category = "Stats") + UCurveFloat* creatureDamageDealtCurve; + + UFUNCTION(BlueprintCallable, Category = "Key") + bool HasKey(PlayerKeyType keyType) const; + UFUNCTION(BlueprintCallable, Category = "Key") + bool HasAnyKey() const; + bool AssignKey(PlayerKeyType keyType, class ASpawnerBase* origin); + bool ClearKey(PlayerKeyType keyType); + + // Starts a filter for a duration with a timeline to control the blending. + UFUNCTION(BlueprintCallable, Category = "ScreenFilter") + void StartFilter(float duration, UPostProcessComponent* filter, UCurveFloat* timeline); + + DECLARE_DYNAMIC_DELEGATE_TwoParams(FPostAction, float, value, UPostProcessComponent*, filter); + + // Starts a filter for a duration with a timeline to control the blending. + UFUNCTION(BlueprintCallable, Category = "ScreenFilter") + void StartFilterWithDelegate(float duration, UPostProcessComponent* filter, UCurveFloat* timeline, FPostAction action); + + // Starts a filter with a timeline to control the blending. + UFUNCTION(BlueprintCallable, Category = "ScreenFilter") + void EnableFilter(float duration, UPostProcessComponent* filter, UCurveFloat* timeline); + + // Stops a filter after a duration with a timeline to control the blending. + UFUNCTION(BlueprintCallable, Category = "ScreenFilter") + void DisableFilter(float duration, UPostProcessComponent* filter, UCurveFloat* timeline); + + // Starts a filter with a timeline to control the blending. + UFUNCTION(BlueprintCallable, Category = "ScreenFilter") + void EnableFilterWithDelegate(float duration, UPostProcessComponent* filter, UCurveFloat* timeline, FPostAction action); + + // Stops a filter after a duration with a timeline to control the blending. + UFUNCTION(BlueprintCallable, Category = "ScreenFilter") + void DisableFilterWithDelegate(float duration, UPostProcessComponent* filter, UCurveFloat* timeline, FPostAction action); + + // The ring below the player + UPROPERTY(BlueprintReadOnly, VisibleAnywhere) + UStaticMeshComponent* playerCircle; + +protected: + void m_SetLevelStats() override; +private: + // Sets the duration of the filter. + // Creates a delagate for StopFilter. + void SetFilterDuration(float duration, UPostProcessComponent* filter); + + // Sets the duration of the timeline. + // Creates a delagate for StopTimeline. + void SetTimelineDuration(float duration, UPostProcessComponent* filter); + + // Disables the filter. + void StopFilter(UPostProcessComponent* filter, FTimerHandle handle); + + // Clears the timeline. + void StopTimeline(UPostProcessComponent* filter, FTimerHandle handle); + + // Updates the blending weight of the filter. + void FilterUpdate(float value, UPostProcessComponent* filter); + void FilterUpdate(float value, UPostProcessComponent* filter, FPostAction action); + + // TODO: Add filter queue. + + bool m_levelStatsInitialized; + + UPROPERTY(Replicated) + uint8 m_keyState; + TMap m_keyOrigins; + + TMap m_filterTimelines; + TArray m_delegates; +}; diff --git a/Source/UnrealProject/Creatures/NetworkPossessable.cpp b/Source/UnrealProject/Creatures/NetworkPossessable.cpp new file mode 100644 index 0000000..6916eee --- /dev/null +++ b/Source/UnrealProject/Creatures/NetworkPossessable.cpp @@ -0,0 +1,106 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "NetworkPossessable.h" +#include "DefaultPlayerController.h" + + +// Sets default values +ANetworkPossessable::ANetworkPossessable() +{ + +} + +// Called every frame +void ANetworkPossessable::Tick( float DeltaTime ) +{ + Super::Tick( DeltaTime ); + + m_UpdateCamera(); +} + + +void ANetworkPossessable::AddMovementInput(FVector WorldDirection, float ScaleValue /*= 1.0f*/, bool bForce /*= false*/) +{ + check(!WorldDirection.ContainsNaN()); + check(!FMath::IsNaN(ScaleValue)); + if(m_AllowedToMove()) + Super::AddMovementInput(WorldDirection, ScaleValue, bForce); +} +void ANetworkPossessable::SetCharacterRotation(FRotator rotator) +{ + if (m_AllowedToRotate()) + SetActorRotation(rotator); + if(Role != ROLE_Authority) + { + m_SetCharacterRotation_Server(rotator.Yaw); + } +} +void ANetworkPossessable::AddControllerYawInput(float Val) +{ + if(m_AllowedToRotate()) + Super::AddControllerYawInput(Val); +} + +bool ANetworkPossessable::m_SetCharacterRotation_Server_Validate(float rotation) +{ + return true; +} +void ANetworkPossessable::m_SetCharacterRotation_Server_Implementation(float rotation) +{ + SetActorRotation(FRotator(0.0f, rotation, 0.0f)); +} + + +bool ANetworkPossessable::m_AllowedToMove() +{ + return true; +} +bool ANetworkPossessable::m_AllowedToRotate() +{ + return true; +} + + +void ANetworkPossessable::m_SetupCamera() +{ + // Create a camera boom + CameraBoom = CreateDefaultSubobject(TEXT("CameraBoom")); + CameraBoom->AttachTo(RootComponent); + CameraBoom->bAbsoluteRotation = true; + CameraBoom->TargetArmLength = 1500.f; + CameraBoom->RelativeRotation = FRotator(-60.f, 45.f, 0.f); + CameraBoom->bDoCollisionTest = false; + CameraBoom->bInheritPitch = false; + CameraBoom->bInheritYaw = false; + CameraBoom->bInheritRoll = false; + + // Create a camera + TopDownCamera = CreateDefaultSubobject(TEXT("TopDownCamera")); + TopDownCamera->AttachTo(CameraBoom, USpringArmComponent::SocketName); + TopDownCamera->bUsePawnControlRotation = false; + + // Don't rotate character to camera direction + bUseControllerRotationPitch = false; + bUseControllerRotationYaw = false; + bUseControllerRotationRoll = false; +} +void ANetworkPossessable::m_UpdateCamera() +{ + if (!IsValid(CameraBoom)) return; + + ADefaultPlayerController* const controller = Cast(GetController()); + if (IsValid(controller)) + { + // Ensure the camera does not fall under the ground + const FVector playerCoord = GetActorLocation(); + if (playerCoord.Z < 0) + CameraBoom->SetRelativeLocation(FVector(0, 0, -playerCoord.Z)); + else if (CameraBoom->GetComponentLocation().Z < 0) + CameraBoom->SetRelativeLocation(FVector()); + + // Update last position + if (GetCharacterMovement()->IsMovingOnGround()) + controller->UpdatePlayerPosition(GetActorLocation(), GetActorRotation()); + } +} \ No newline at end of file diff --git a/Source/UnrealProject/Creatures/NetworkPossessable.h b/Source/UnrealProject/Creatures/NetworkPossessable.h new file mode 100644 index 0000000..f68e922 --- /dev/null +++ b/Source/UnrealProject/Creatures/NetworkPossessable.h @@ -0,0 +1,35 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "CharacterBase.h" +#include "NetworkPossessable.generated.h" + +UCLASS(Abstract) +class UNREALPROJECT_API ANetworkPossessable : public ACharacterBase +{ + GENERATED_BODY() +public: + ANetworkPossessable(); + + virtual void Tick( float DeltaSeconds ) override; + + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true")) + class USpringArmComponent* CameraBoom; + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true")) + class UCameraComponent* TopDownCamera; + + virtual void AddMovementInput(FVector WorldDirection, float ScaleValue = 1.0f, bool bForce = false) override; + virtual void SetCharacterRotation(FRotator rotator); + virtual void AddControllerYawInput(float Val) override; + +protected: + UFUNCTION(Server, Reliable, WithValidation) + void m_SetCharacterRotation_Server(float rotation); + + virtual bool m_AllowedToMove(); + virtual bool m_AllowedToRotate(); + + void m_SetupCamera(); + void m_UpdateCamera(); +}; diff --git a/Source/UnrealProject/Creatures/OffensiveEnemy.cpp b/Source/UnrealProject/Creatures/OffensiveEnemy.cpp new file mode 100644 index 0000000..6650b75 --- /dev/null +++ b/Source/UnrealProject/Creatures/OffensiveEnemy.cpp @@ -0,0 +1,140 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "OffensiveEnemy.h" +#include "AbilityInfo.h" +#include "SpawnerBase.h" +#include "NetworkPlayer.h" +#include "MinionAnimInstance.h" +#include "BehaviorTree/EnemyAIController.h" + + +AOffensiveEnemy::AOffensiveEnemy() +{ + PrimaryActorTick.bCanEverTick = true; +} +void AOffensiveEnemy::BeginPlay() +{ + Super::BeginPlay(); + if (Role != ROLE_Authority) + return; + +} +void AOffensiveEnemy::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + if (Role != ROLE_Authority) + return; +} +void AOffensiveEnemy::Tick(float deltaTime) +{ + Super::Tick(deltaTime); + if (Role != ROLE_Authority) + return; + + if (IsValid(target)) + { + if (hasGeneral) + { + GeneralBehavior(); + } + else + { + if (m_confusionTimer > 0.0f) + { + ConfusionBehavior(); + return; + } + BasicBehavior(); + } + // Move to target + + } + +} + +void AOffensiveEnemy::GeneralBehavior() +{ + if (!meleeAbility || !specialAbility) + { + //RERROR("there is no abilities"); + return; + } + + const FVector2D actorLocation = FVector2D(GetActorLocation().X, GetActorLocation().Y); + const FVector2D targetLocation = FVector2D(target->GetActorLocation().X, target->GetActorLocation().Y); + const float targetDistSqr = FVector2D::DistSquared(targetLocation, actorLocation); + m_tempAbility = meleeAbility; + if (((m_tempAbility->AICastRange + 150)*(m_tempAbility->AICastRange + 150)) < targetDistSqr) + return; + if (GetAbilityState(m_tempAbility)->onCooldownTimer <= 0) + { + CastAbility(m_tempAbility); + + UMinionAnimInstance* animInstance = Cast(GetMesh()->GetAnimInstance()); + if (IsValid(animInstance)) + { + animInstance->ChangeAnimationStateTo(EMinionAnimState::MAS_Attacking); + } + + //m_rotateToPlayer = m_tempAbility->rotateTowardsPlayer; + } +} +void AOffensiveEnemy::BasicBehavior() +{ + if (!IsValid(target)) + return; + if (FVector::DistSquared(target->GetActorLocation(), GetActorLocation()) > 200 * 200) + { + MoveToPoint(target->GetActorLocation()); + } + else + { + FVector addvec = GetActorLocation() - target->GetActorLocation(); + addvec.Normalize(); + MoveToPoint(target->GetActorLocation()+addvec*200.0f); + GetCharacterMovement()->Velocity = FVector::ZeroVector; + } + SetActorRotation(FVector(target->GetActorLocation() - GetActorLocation()).Rotation()); + if (!meleeAbility || !specialAbility) + { + //RERROR("there is no abilities"); + return; + } + const FVector2D actorLocation = FVector2D(GetActorLocation().X, GetActorLocation().Y); + const FVector2D targetLocation = FVector2D(target->GetActorLocation().X, target->GetActorLocation().Y); + const float targetDistSqr = FVector2D::DistSquared(targetLocation, actorLocation); + m_tempAbility = meleeAbility; + if ((rand() % 1000) > specialAbilityChance&&!m_isPulled) + { + m_tempAbility = specialAbility; + } + m_isPulled = true; + if (((m_tempAbility->AICastRange + 150)*(m_tempAbility->AICastRange + 150)) < targetDistSqr) + return; + if (GetAbilityState(m_tempAbility)->onCooldownTimer <= 0) + { + CastAbility(m_tempAbility); + + UMinionAnimInstance* animInstance = Cast(GetMesh()->GetAnimInstance()); + if (IsValid(animInstance)) + { + animInstance->ChangeAnimationStateTo(EMinionAnimState::MAS_Attacking); + } + + + } + +} +int32 AOffensiveEnemy::NativeDealDamage(class ANetworkCharacter* dealer, int32 damage, float armorPercentageIgnore, class UAbilityInfo* ability) +{ + if (hasGeneral) + { + float damageMultiplier = FVector::DotProduct(dealer->GetActorForwardVector(), GetActorForwardVector()); + damageMultiplier += 1.0f; + damageMultiplier *= 0.5f; + damageMultiplier += 0.5f; + return Super::NativeDealDamage(dealer, damage*damageMultiplier, armorPercentageIgnore, ability); + } + else return Super::NativeDealDamage(dealer, damage, armorPercentageIgnore, ability); +} \ No newline at end of file diff --git a/Source/UnrealProject/Creatures/OffensiveEnemy.h b/Source/UnrealProject/Creatures/OffensiveEnemy.h new file mode 100644 index 0000000..2fa1209 --- /dev/null +++ b/Source/UnrealProject/Creatures/OffensiveEnemy.h @@ -0,0 +1,24 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Creatures/EnemyBase.h" +#include "OffensiveEnemy.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API AOffensiveEnemy : public AEnemyBase +{ + GENERATED_BODY() + +public: + AOffensiveEnemy(); + virtual void BeginPlay() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + virtual void Tick(float deltaTime) override; + virtual int32 NativeDealDamage(class ANetworkCharacter* dealer, int32 damage, float armorPercentageIgnore, class UAbilityInfo* ability) override; + void BasicBehavior(); + void GeneralBehavior(); +}; diff --git a/Source/UnrealProject/Creatures/PlayerKeyType.h b/Source/UnrealProject/Creatures/PlayerKeyType.h new file mode 100644 index 0000000..d530068 --- /dev/null +++ b/Source/UnrealProject/Creatures/PlayerKeyType.h @@ -0,0 +1,16 @@ +// Project Lab - NHTV Igad + +#pragma once + +UENUM(BlueprintType) +enum class PlayerKeyType : uint8 +{ + BossRoomKeyPart0 = 0, + BossRoomKeyPart1 = 1, + BossRoomKeyPart2 = 2, + TreasureRoomKey = 3, + None = 4, +}; + +constexpr int32 keyFragmentMin = (int32)PlayerKeyType::BossRoomKeyPart0; +constexpr int32 keyFragmentMax = (int32)PlayerKeyType::BossRoomKeyPart2; diff --git a/Source/UnrealProject/Creatures/RangedEnemy.cpp b/Source/UnrealProject/Creatures/RangedEnemy.cpp new file mode 100644 index 0000000..e99d253 --- /dev/null +++ b/Source/UnrealProject/Creatures/RangedEnemy.cpp @@ -0,0 +1,136 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "RangedEnemy.h" +#include "AbilityInfo.h" +#include "SpawnerBase.h" +#include "NetworkPlayer.h" +#include "MinionAnimInstance.h" + +ARangedEnemy::ARangedEnemy() +{ + PrimaryActorTick.bCanEverTick = true; +} +void ARangedEnemy::BeginPlay() +{ + Super::BeginPlay(); + if (Role != ROLE_Authority) + return; +} +void ARangedEnemy::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + if (Role != ROLE_Authority) + return; +} +void ARangedEnemy::Tick(float deltaTime) +{ + Super::Tick(deltaTime); + if (Role != ROLE_Authority) + return; + if (IsValid(target)) + { + + if (!hasGeneral) + { + if (m_confusionTimer > 0.0f) + { + ConfusionBehavior(); + return; + } + BasicBehavior(); + } + else + { + GeneralBehavior(); + } + // Move to target + + } + +} +void ARangedEnemy::BasicBehavior() +{ + if (!IsValid(target)) + return; + const FVector2D actorLocation = FVector2D(GetActorLocation().X, GetActorLocation().Y); + const FVector2D targetLocation = FVector2D(target->GetActorLocation().X, target->GetActorLocation().Y); + const FVector2D spawnLocation = FVector2D(m_spawn->GetActorLocation()); + const float targetDistSqr = FVector2D::DistSquared(targetLocation, actorLocation); + const float spawnTargetDistSqr = FVector2D::DistSquared(targetLocation, spawnLocation); + + if (!meleeAbility || !specialAbility) + { + RERROR("there is no abilities"); + return; + } + if (!rangedAbility) + { + RERROR("Ranged enemy does not have a ranged ability"); + } + float castRange = rangedAbility->AICastRange; + // walking code + float testPercentage = (spawnTargetDistSqr) / ((m_spawn->aggroRadius + castRange)*(m_spawn->aggroRadius + castRange)); + + FVector newLocation = (target->GetActorLocation() - m_spawn->GetActorLocation()); + newLocation.Normalize(); + newLocation *= m_spawn->aggroRadius*testPercentage; + FVector walkLocation = newLocation + m_spawn->GetActorLocation(); + if (m_lastPercentage < testPercentage) + MoveToPoint(walkLocation); + m_lastPercentage = testPercentage; + + m_tempAbility = rangedAbility; + if (targetDistSqr < (200 * 200)) + { + m_tempAbility = meleeAbility; + if ((rand() % 1000) > specialAbilityChance) + { + m_tempAbility = specialAbility; + } + } + if (((m_tempAbility->AICastRange + 100)*(m_tempAbility->AICastRange + 100)) < targetDistSqr) + return; + if (GetAbilityState(m_tempAbility)->onCooldownTimer <= 0) + { + ChangeNPCAnimation((uint8)EMinionAnimState::MAS_Casting); + CastAbility(m_tempAbility); + } + SetActorRotation(FVector(target->GetActorLocation() - GetActorLocation()).Rotation()); +} +void ARangedEnemy::GeneralBehavior() +{ + const FVector2D actorLocation = FVector2D(GetActorLocation().X, GetActorLocation().Y); + const FVector2D targetLocation = FVector2D(target->GetActorLocation().X, target->GetActorLocation().Y); + const FVector2D spawnLocation = FVector2D(m_spawn->GetActorLocation()); + const float targetDistSqr = FVector2D::DistSquared(targetLocation, actorLocation); + const float spawnTargetDistSqr = FVector2D::DistSquared(targetLocation, spawnLocation); + + if (!meleeAbility || !specialAbility) + { + RERROR("there is no abilities"); + return; + } + if (!rangedAbility) + { + RERROR("Ranged enemy does not have a ranged ability"); + } + float castRange = rangedAbility->AICastRange; + // walking code + + + m_tempAbility = rangedAbility; + if (targetDistSqr < (200 * 200)) + { + m_tempAbility = meleeAbility; + } + if (((m_tempAbility->AICastRange + 100)*(m_tempAbility->AICastRange + 100)) < targetDistSqr) + return; + if (GetAbilityState(m_tempAbility)->onCooldownTimer <= 0) + { + ChangeNPCAnimation((uint8)EMinionAnimState::MAS_Casting); + CastAbility(m_tempAbility); + m_rotateToPlayer = m_tempAbility->rotateTowardsPlayer; + } + SetActorRotation(FVector(target->GetActorLocation() - GetActorLocation()).Rotation()); +} \ No newline at end of file diff --git a/Source/UnrealProject/Creatures/RangedEnemy.h b/Source/UnrealProject/Creatures/RangedEnemy.h new file mode 100644 index 0000000..24afff7 --- /dev/null +++ b/Source/UnrealProject/Creatures/RangedEnemy.h @@ -0,0 +1,26 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Creatures/EnemyBase.h" +#include "RangedEnemy.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API ARangedEnemy : public AEnemyBase +{ + GENERATED_BODY() + +public: + ARangedEnemy(); + virtual void BeginPlay() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + virtual void Tick(float deltaTime) override; + void BasicBehavior(); + void GeneralBehavior(); +private: + float m_lastPercentage; + class UAbilityInfo* m_tempAbility; +}; diff --git a/Source/UnrealProject/Creatures/TouhouBoss.cpp b/Source/UnrealProject/Creatures/TouhouBoss.cpp new file mode 100644 index 0000000..0443979 --- /dev/null +++ b/Source/UnrealProject/Creatures/TouhouBoss.cpp @@ -0,0 +1,175 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "TouhouBoss.h" +#include "CreatureSpawn.h" +#include "AbilityEventGroup.h" +#include "AbilityInfo.h" +#include "Modifier.h" +#include "NativeModifiers.h" +#include "DefaultGameMode.h" +#include "NetworkPlayer.h" + +ATouhouBoss::ATouhouBoss() +{ + PrimaryActorTick.bCanEverTick = true; + +/* AudioComp = CreateDefaultSubobject(TEXT("Boss Audio")); + if (AudioComp) + { + + AudioComp->bAutoActivate = false; // with this true the sounds play at spawn (game starts) + } + */ + outOfCombatRegen = 25.0f; + secondPhasePercentage = 0.5f; + rotationSpeed = 1; + cooldown = 2.5f; +} + +void ATouhouBoss::BeginPlay() +{ + Super::BeginPlay(); + if (Role != ROLE_Authority) + return; + + m_engaged = false; +} +void ATouhouBoss::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + + if (Role != ROLE_Authority) + return; + m_walkTimer = 0.0f; + + // Drop a key + if (m_health <= 0) + { + ANetworkPlayer* const killedBy = Cast(GetLastPlayerDamage()); + if (IsValid(killedBy) && IsValid(m_spawn)) + { + killedBy->AssignKey(PlayerKeyType::TreasureRoomKey, m_spawn); + onBossKilled.Broadcast(killedBy->GetTeam()); + } + } +} + +void ATouhouBoss::m_Engaged() +{ + Super::m_Engaged(); + m_engaged = true; + ModifierManager* mod = GetModifierManager(); + if (mod != nullptr && m_regenModifier != nullptr) + { + + // Stop regenerating health. + m_regenModifier->ForceDestroy(); + m_regenModifier = nullptr; + SetShield(false); + // Plays a sound indicating that the boss was engaged and start playing the boss music. + //PlayEngageSound(); + } +} + +void ATouhouBoss::m_Disengaged() +{ + Super::m_Disengaged(); + + ModifierManager* mod = GetModifierManager(); + if (mod != nullptr && m_regenModifier == nullptr) + { + m_engaged = false; + // Start regenerating health. + m_regenModifier = mod->AddModifier(ARegenModifier::StaticClass(), 0); + Cast(m_regenModifier)->regenPerTick = outOfCombatRegen; + // Remove invincibility if it's active. + if (m_invincibilityModifier) + { + m_invincibilityModifier->ForceDestroy(); + m_invincibilityModifier = nullptr; + SetShield(false); + } + } +} + +void ATouhouBoss::Tick(float deltaTime) +{ + Super::Tick(deltaTime); + + // Only execute boss code on the server. + if (Role != ROLE_Authority) + return; + + // Calculate health as percentage for deciding which phase the boss should be in. + float healthPerc = (float)m_health / (float)m_maxHealth; + + // If the distance of the target to the spawn is greater than the aggro range of the spawner, +// then lose the target. + if (IsValid(target)) + { + float targetDistSqr = FVector::DistSquared(target->GetActorLocation(), m_spawn->SpawnResetPosition()); + float aggroSqr = m_spawn->deaggroRadius * m_spawn->deaggroRadius; + if (aggroSqr < targetDistSqr) + { + target = nullptr; + } + } + + //disengage + if (!IsValid(target) && m_regenModifier == nullptr) + { + m_Disengaged(); + } + //engage + else if (target && !m_engaged) + { + m_Engaged(); + } + + if (m_engaged) + { + if (m_invincibilityModifier) + { + m_invincibilityModifier->ForceDestroy(); + m_invincibilityModifier = nullptr; + SetShield(false); + } + if (!IsValid(target)) + return; + WalkPhase(deltaTime); + } + +} + +void ATouhouBoss::WalkPhase(float deltaTime) +{ + MoveToPoint(target->GetActorLocation()); + m_walkTimer += deltaTime; + + // After 2.5 seconds, cast a random ability. + if (m_walkTimer > cooldown && abilities.Num() > 0 && target) + { + // Cast a random ability + UAbilityInfo* ability = abilities[FMath::Rand() % abilities.Num()]; + if(IsValid(ability)) + CastAbility(ability); + + m_walkTimer = 0; + } +} + +void ATouhouBoss::m_SpawnModifiers() +{ + /*ModifierManager* mod = GetModifierManager(); + if (mod != nullptr) + { + //m_regenModifier = mod->AddModifier(ARegenModifier::StaticClass(), 0); + }*/ +} + +void ATouhouBoss::SetShield_Implementation(bool on) +{ + FWARNING("shield implemtentation not set in ATouHouBoss"); + return; +} \ No newline at end of file diff --git a/Source/UnrealProject/Creatures/TouhouBoss.h b/Source/UnrealProject/Creatures/TouhouBoss.h new file mode 100644 index 0000000..33b5a51 --- /dev/null +++ b/Source/UnrealProject/Creatures/TouhouBoss.h @@ -0,0 +1,60 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Creatures/BossBase.h" +#include "TouhouBoss.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API ATouhouBoss : public ABossBase +{ + GENERATED_BODY() + +public: + ATouhouBoss(); + virtual void BeginPlay() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + virtual void Tick(float deltaTime) override; + void WalkPhase(float deltaTime); + virtual void m_SpawnModifiers() override; + + //UFUNCTION(NetMulticast, Reliable) + //void PlayEngageSound(); + + //UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Audio Component") + //UAudioComponent* AudioComp; + + DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnBossKilled, int32, team); + UPROPERTY(BlueprintAssignable, Category = "Game") + FOnBossKilled onBossKilled; + + UPROPERTY(EditDefaultsOnly, Category = "Shoot Phase") + class UAbilityInfo* ability; + UPROPERTY(EditDefaultsOnly, Category = "Shoot Phase") + class UAbilityInfo* abilityChannel; + UPROPERTY(EditDefaultsOnly, Category = "Shoot Phase") + float rotationSpeed; + UPROPERTY(EditDefaultsOnly, Category = "Shoot Phase") + float cooldown; + UPROPERTY(EditAnywhere, Category = "Modifiers") + float outOfCombatRegen; + UPROPERTY(EditAnywhere, Category = "State Transition", meta = (ClampMin = "0.0", ClampMax = "1.0", UIMin = "0.0", UIMax = "1.0")) + float secondPhasePercentage; + + UFUNCTION(BlueprintNativeEvent) + void SetShield(bool on); +private: + virtual void m_Engaged(); + virtual void m_Disengaged(); + float m_walkTimer; + bool m_engaged; + + UPROPERTY() + class AModifier* m_regenModifier; + + UPROPERTY() + class AModifier* m_invincibilityModifier; +}; diff --git a/Source/UnrealProject/Creatures/WiebertAnimation.cpp b/Source/UnrealProject/Creatures/WiebertAnimation.cpp new file mode 100644 index 0000000..4295ade --- /dev/null +++ b/Source/UnrealProject/Creatures/WiebertAnimation.cpp @@ -0,0 +1,62 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "WiebertAnimation.h" +#include "NetworkCharacter.h" +#include "Animation/AnimNodeBase.h" +#include "AnimationProxy.h" + +UWiebertAnimation::UWiebertAnimation(const FObjectInitializer& init) + : Super(init) +{ + character = nullptr; + attacking = false; + charCustomization = FCharacterCustomization(); + m_swingAnimationSequence = 0; +} +void UWiebertAnimation::NativeInitializeAnimation() +{ + attacking = false; + Super::NativeInitializeAnimation(); + character = Cast(this->GetOwningActor()); + if (character) + { + m_swingAnimationSequence = character->swingAnimationSequence; + } +} +void UWiebertAnimation::NativeUpdateAnimation(float DeltaSeconds) +{ + if(character && character->swingAnimationSequence > m_swingAnimationSequence) + { + attacking = true; + m_swingAnimationSequence = character->swingAnimationSequence; + } +} +void UWiebertAnimation::SetCharacterCustomization(const FCharacterCustomization& characterCustomization) +{ + charCustomization = characterCustomization; +} +FAnimInstanceProxy* UWiebertAnimation::CreateAnimInstanceProxy() +{ + check(!m_mainAnimProxy); + m_mainAnimProxy = new FMainAnimProxy(); + + m_mainAnimProxy->boneNames[0] = "head"; + m_mainAnimProxy->boneNames[1] = "thigh_l"; + m_mainAnimProxy->boneNames[2] = "thigh_r"; + m_mainAnimProxy->boneNames[3] = "upperarm_l"; + m_mainAnimProxy->boneNames[4] = "upperarm_r"; + m_mainAnimProxy->boneNames[5] = "spine_03"; + m_mainAnimProxy->boneNames[6] = "root"; + + return m_mainAnimProxy; +} +void UWiebertAnimation::DestroyAnimInstanceProxy(FAnimInstanceProxy* InProxy) +{ + check(InProxy == m_mainAnimProxy); + delete InProxy; + m_mainAnimProxy = nullptr; +} +void UWiebertAnimation::OnSwingAnimation_Implementation() +{ +} diff --git a/Source/UnrealProject/Creatures/WiebertAnimation.h b/Source/UnrealProject/Creatures/WiebertAnimation.h new file mode 100644 index 0000000..6ff00c5 --- /dev/null +++ b/Source/UnrealProject/Creatures/WiebertAnimation.h @@ -0,0 +1,42 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Animation/AnimInstance.h" +#include "PlayerSetupState.h" +#include "WiebertAnimation.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API UWiebertAnimation : public UAnimInstance +{ + GENERATED_BODY() + +public: + UWiebertAnimation(const FObjectInitializer& init); + + virtual void NativeInitializeAnimation() override; + virtual void NativeUpdateAnimation(float DeltaSeconds) override; + + virtual FAnimInstanceProxy* CreateAnimInstanceProxy(); + virtual void DestroyAnimInstanceProxy(FAnimInstanceProxy* InProxy); + + UFUNCTION(BlueprintNativeEvent, Category="Animation") + void OnSwingAnimation(); + + UFUNCTION(BlueprintCallable, Category = "Animation") + void SetCharacterCustomization(const FCharacterCustomization& characterCustomization); + + UPROPERTY(BlueprintReadOnly, Category="Animation") + class ANetworkCharacter* character; + UPROPERTY(BlueprintReadWrite, Category = "Animation") + bool attacking; + + FCharacterCustomization charCustomization; +private: + // Keeps track of how many times an animation was triggered + int32 m_swingAnimationSequence; + struct FMainAnimProxy* m_mainAnimProxy; +}; diff --git a/Source/UnrealProject/Doodads/BaseSkillObject.cpp b/Source/UnrealProject/Doodads/BaseSkillObject.cpp new file mode 100644 index 0000000..0f0fe9f --- /dev/null +++ b/Source/UnrealProject/Doodads/BaseSkillObject.cpp @@ -0,0 +1,15 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "BaseSkillObject.h" + +/* +void UBaseSkillObject::Serialize( FArchive& a_ar ) +{ + Super::Serialize( a_ar ); + + UE_LOG( LogTemp, Warning, TEXT( "UBaseSkillObject: Serializing..." ) ); + + a_ar << *this; +} +*/ \ No newline at end of file diff --git a/Source/UnrealProject/Doodads/BaseSkillObject.h b/Source/UnrealProject/Doodads/BaseSkillObject.h new file mode 100644 index 0000000..7a9805f --- /dev/null +++ b/Source/UnrealProject/Doodads/BaseSkillObject.h @@ -0,0 +1,70 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "SkillObject.h" +#include "Items/ItemBase.h" +#include "BaseSkillObject.generated.h" + +class AModifier; + +USTRUCT() +struct FSkillItem +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere) + USkeletalMesh* mesh; + UPROPERTY(EditAnywhere) + EItemTypeEnum type; +}; + +USTRUCT() +struct FSkillItemHolder +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere) + bool isVisible; + UPROPERTY(EditAnywhere, meta = (EditCondition = "isVisible")) + TArray itemsToEquip; + UPROPERTY(EditDefaultsOnly, meta = (EditCondition = "isVisible")) + UParticleSystem* particleEffect; +}; + +UENUM(BlueprintType) +enum class ESkillShapeType : uint8 +{ + Active = 0, + Passive, + Sustain, + Coop, +}; + +UCLASS(Blueprintable) +class UNREALPROJECT_API UBaseSkillObject : public USkillObject +{ + GENERATED_BODY() + +public: + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Skill") + TArray> modifiers; + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Skill") + TArray abilityEffects; + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Skill") + ESkillShapeType skillShapeType; + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Skill") + FSkillItemHolder visibleItems; + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Skill") + FIntPoint pivot; + + /* + virtual void Serialize( FArchive& a_ar ) override; + + friend FArchive& operator<<( FArchive& a_ar, UBaseSkillObject& a_v ) + { + UE_LOG( LogTemp, Warning, TEXT( "UBaseSkillObject: << Operator..." ) ); + return a_ar; + } + */ +}; diff --git a/Source/UnrealProject/Doodads/CharacterCarousel.cpp b/Source/UnrealProject/Doodads/CharacterCarousel.cpp new file mode 100644 index 0000000..742e777 --- /dev/null +++ b/Source/UnrealProject/Doodads/CharacterCarousel.cpp @@ -0,0 +1,256 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "CharacterCarousel.h" +#include "CharacterBase.h" +#include "DefaultGameInstance.h" + + + +ACharacterCarousel::ACharacterCarousel() +{ + PrimaryActorTick.bCanEverTick = true; + + selectedCharacterIndex = 0; + m_visualSelected = 0; + selected = false; + + m_zoom = 0; + + selectedCharacterOffset = FVector(30, -120, 0); +} + + +void ACharacterCarousel::BeginPlay() +{ + check(IsValid(characterBlueprint)); + + Super::BeginPlay(); + + // Fix the rotation + FRotator rotation = GetActorRotation(); + SetActorRotation(FRotator(0, rotation.Yaw, 0)); + + const FVector position = GetActorLocation(); + const FVector forward = GetActorForwardVector(); + const FVector right = GetActorRightVector(); + + UDefaultGameInstance* instance = Cast(GetGameInstance()); + check(instance); + UCharacterSettings* settings = instance->GetCharacterSettings(); + check(settings); + + for (int32 i = 0; i < settings->characterSaves.Num(); i++) + { + FActorSpawnParameters spawnParams; + spawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn; + ACharacterBase* actor = GetWorld()->SpawnActor(characterBlueprint, GetActorLocation(), GetActorRotation(), spawnParams); + m_characters.Add(actor); + } +} +void ACharacterCarousel::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + + for (int32 i = 0; i < m_characters.Num(); i++) + { + if (IsValid(m_characters[i])) + m_characters[i]->Destroy(); + } + m_characters.SetNum(0); +} + + +inline float MoveTowardsTarget(float current, float target, float delta, float min = 0.0005f) +{ + const int32 moveDir = target > current ? 1 : -1; + float d = FMath::Abs((target - current) * delta); + if (d < 0.0005f) d = 0.0005f; + + current += d * moveDir; + + // Clamp + current = (moveDir == 1) ? + (current > target ? target : current) : + (current < target ? target : current); + + return current; +} +void ACharacterCarousel::Tick(float DeltaTime) +{ + Super::Tick(DeltaTime); + + if (m_characters.Num() == 0) + return; + + // Zoom towards the target + const float zoomTarget = selected ? 1 : 0; + m_zoom = MoveTowardsTarget(m_zoom, zoomTarget, DeltaTime * 10); + + const FVector position = GetActorLocation(); + const FVector forward = GetActorForwardVector(); + const FVector right = GetActorRightVector(); + + const float carouselRadius = 1200; + const float carouselAngle = 10; + const FVector pivot = position - forward * carouselRadius; + + // Clamp the selected index (may be altered from a blueprint) + selectedCharacterIndex = selectedCharacterIndex < 0 ? 0 : selectedCharacterIndex >= m_characters.Num() ? m_characters.Num() - 1 : selectedCharacterIndex; + + // Animate the carousel + const float target = float(selectedCharacterIndex); + m_visualSelected = MoveTowardsTarget(m_visualSelected, target, DeltaTime * (selected ? 10 : 5)); + + // Spawn and set the characters + const FRotator rotation = GetActorRotation(); + const FVector arm = forward * carouselRadius; + const FVector selectedOffset = rotation.RotateVector(selectedCharacterOffset) * m_zoom; + + for (int32 i = 0; i < m_characters.Num(); i++) + { + const int32 distance = i - selectedCharacterIndex; + if (distance < -2 || distance > 2) + { + // Dont render characters off screen + m_characters[i]->GetRootComponent()->SetVisibility(false, true); + } + else + { + m_characters[i]->GetRootComponent()->SetVisibility(true, true); + + // Set the position relative from the pivot + FRotator rotator(0, -carouselAngle * (float(i) - m_visualSelected), 0); + if (m_zoom > 0) rotator.Yaw *= (m_zoom + 1); + FVector offset = rotator.RotateVector(arm); + if (i == selectedCharacterIndex) + offset += selectedOffset; + m_characters[i]->SetActorLocation(pivot + offset); + m_characters[i]->SetActorRotation(rotator + FRotator(0, rotation.Yaw, 0)); + } + } +} + + +void ACharacterCarousel::Reset() +{ + selectedCharacterIndex = 0; + m_visualSelected = 0; + selected = false; + + m_zoom = 0; +} + +void ACharacterCarousel::Next() +{ + if(!selected && m_characters.Num() > 0 && selectedCharacterIndex < m_characters.Num() - 1) + selectedCharacterIndex++; +} +void ACharacterCarousel::Previous() +{ + if (!selected && selectedCharacterIndex > 0) + selectedCharacterIndex--; +} + +void ACharacterCarousel::ToggleSelect(bool enabled) +{ + selected = enabled; +} + +void ACharacterCarousel::CreateNewCharacter(const FString& name) +{ + UDefaultGameInstance* instance = Cast(GetGameInstance()); + check(instance); + UCharacterSettings* settings = instance->GetCharacterSettings(); + check(settings); + + // Create a scene actor + ACharacterBase* actor = GetWorld()->SpawnActor(characterBlueprint, GetActorLocation(), GetActorRotation()); + m_characters.Add(actor); + + // Select this character + selected = false; + selectedCharacterIndex = m_characters.Num() - 1; + m_zoom = 0; + + // Add to save + FCharacterSave save; + save.name = name; + settings->characterSaves.Add(save); + instance->SaveSettings(); +} +void ACharacterCarousel::DeleteCharacter(int32 index) +{ + UDefaultGameInstance* instance = Cast(GetGameInstance()); + check(instance); + UCharacterSettings* settings = instance->GetCharacterSettings(); + check(settings); + + if (index < 0 || index >= settings->characterSaves.Num()) + { + JERROR("Invalid character index"); + return; + } + + // Destroy scene actor + m_characters[index]->Destroy(); + m_characters.RemoveAt(index); + if (index == selectedCharacterIndex) + selectedCharacterIndex--; + + // Unselect + selected = false; + m_zoom = 0; + + // Remove from save + settings->characterSaves.RemoveAt(index); + instance->SaveSettings(); +} + +ACharacterBase* ACharacterCarousel::GetCharacterModel(int32 index) +{ + if (index < 0 || index >= m_characters.Num()) + { + JERROR("Invalid character index"); + return nullptr; + } + + return m_characters[index]; +} +int32 ACharacterCarousel::GetCharacterNum() +{ + return m_characters.Num(); +} + + +void ACharacterCarousel::SaveCharacterName(const FString& name, int32 index) +{ + UDefaultGameInstance* instance = Cast(GetGameInstance()); + check(instance); + UCharacterSettings* settings = instance->GetCharacterSettings(); + check(settings); + + if (index < 0 || index >= settings->characterSaves.Num()) + { + JERROR("Invalid character index"); + return; + } + + settings->characterSaves[index].name = name; + instance->SaveSettings(); +} +FString ACharacterCarousel::GetCharacterName(int32 index) +{ + UDefaultGameInstance* instance = Cast(GetGameInstance()); + check(instance); + UCharacterSettings* settings = instance->GetCharacterSettings(); + check(settings); + + if (index < 0 || index >= settings->characterSaves.Num()) + { + JERROR("Invalid character index"); + return FString(); + } + + return settings->characterSaves[index].name; +} \ No newline at end of file diff --git a/Source/UnrealProject/Doodads/CharacterCarousel.h b/Source/UnrealProject/Doodads/CharacterCarousel.h new file mode 100644 index 0000000..a9011aa --- /dev/null +++ b/Source/UnrealProject/Doodads/CharacterCarousel.h @@ -0,0 +1,70 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GameFramework/Actor.h" +#include "CharacterSettings.h" +#include "CharacterCarousel.generated.h" + +UCLASS() +class UNREALPROJECT_API ACharacterCarousel : public AActor +{ + GENERATED_BODY() + +public: + // Sets default values for this actor's properties + ACharacterCarousel(); + + // Called when the game starts or when spawned + virtual void BeginPlay() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + + // Called every frame + virtual void Tick(float DeltaSeconds) override; + + + UFUNCTION(BlueprintCallable, Category = "Carousel") + void Reset(); + + UFUNCTION(BlueprintCallable, Category = "Carousel") + void Next(); + UFUNCTION(BlueprintCallable, Category = "Carousel") + void Previous(); + + UFUNCTION(BlueprintCallable, Category = "Carousel") + void ToggleSelect(bool enabled); + + UFUNCTION(BlueprintCallable, Category = "Carousel") + void CreateNewCharacter(const FString& name); + UFUNCTION(BlueprintCallable, Category = "Carousel") + void DeleteCharacter(int32 index); + + // Index of the current selected character + UPROPERTY(BlueprintReadWrite, Category = "Carousel") + int32 selectedCharacterIndex; + + // Wether the current character is also selected + UPROPERTY(BlueprintReadWrite, Category = "Carousel") + bool selected; + + UPROPERTY(EditAnywhere, Category = "Carousel") + TSubclassOf characterBlueprint; + + UFUNCTION(BlueprintCallable, Category = "Carousel") + class ACharacterBase* GetCharacterModel(int32 index); + UFUNCTION(BlueprintCallable, Category = "Carousel") + int32 GetCharacterNum(); + + UPROPERTY(EditAnywhere, Category = "Carousel") + FVector selectedCharacterOffset; + + UFUNCTION(BlueprintCallable, Category = "Carousel") + void SaveCharacterName(const FString& name, int32 index); + UFUNCTION(BlueprintCallable, Category = "Carousel") + FString GetCharacterName(int32 index); + +private: + TArray m_characters; + float m_visualSelected; + float m_zoom; +}; diff --git a/Source/UnrealProject/Doodads/CharacterSettings.cpp b/Source/UnrealProject/Doodads/CharacterSettings.cpp new file mode 100644 index 0000000..e0263f2 --- /dev/null +++ b/Source/UnrealProject/Doodads/CharacterSettings.cpp @@ -0,0 +1,66 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "CharacterSettings.h" +#include "SkillTreeWidget.h" +#include "UserWidget.h" + +#define SAVE_SLOT_NAME TEXT("WIEBERSAVE tm") + +static UClass* skillTreeWidgetClass; + +UCharacterSettings::UCharacterSettings(const FObjectInitializer& ObjectInitializer) + : Super(ObjectInitializer) +{ + skillTreeWidgetClass = ConstructorHelpers::FClassFinder(TEXT("/Game/Assets/GUI/WEEGEE_SkillTree")).Class; +} + +UCharacterSettings* UCharacterSettings::Load() +{ + UCharacterSettings* settings = Cast(UGameplayStatics::LoadGameFromSlot(SAVE_SLOT_NAME, 0)); + if (!settings) + { + settings = Cast(UGameplayStatics::CreateSaveGameObject(UCharacterSettings::StaticClass())); + } + check(settings); + + for (auto& save : settings->characterSaves) + { + for (TFieldIterator PropIt(FCharacterCustomization::StaticStruct()); PropIt; ++PropIt) + { + UFloatProperty* fProperty = Cast(*PropIt); + + if (IsValid(fProperty)) + { + float* valPtr = fProperty->GetPropertyValuePtr_InContainer(&save.characterCustomization); + *valPtr = FMath::Clamp(*valPtr, 0.5f, 1.5f); + } + + } + } + + return settings; +} + +void UCharacterSettings::Save(UCharacterSettings* settings) +{ + UGameplayStatics::SaveGameToSlot(settings, SAVE_SLOT_NAME, 0); +} + +TArray UCharacterSettings::GetValidCharacters() const +{ + UCharacterSettings* settings = Cast(UGameplayStatics::LoadGameFromSlot(SAVE_SLOT_NAME, 0)); + if (!settings) + { + settings = Cast(UGameplayStatics::CreateSaveGameObject(UCharacterSettings::StaticClass())); + } + check(settings); + + TArray result; + for (FCharacterSave& save : settings->characterSaves) + { + if (save.skillTreeState.ValidateSkillTree()) + result.Add(save); + } + return result; +} \ No newline at end of file diff --git a/Source/UnrealProject/Doodads/CharacterSettings.h b/Source/UnrealProject/Doodads/CharacterSettings.h new file mode 100644 index 0000000..0474aea --- /dev/null +++ b/Source/UnrealProject/Doodads/CharacterSettings.h @@ -0,0 +1,47 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GameFramework/SaveGame.h" +#include "SkillTreeState.h" +#include "PlayerSetupState.h" +#include "CharacterSettings.generated.h" + +USTRUCT(BlueprintType) +struct FCharacterSave +{ + GENERATED_BODY() + +public: + UPROPERTY(BlueprintReadWrite, Category = "Save") + FString name; + + UPROPERTY(BlueprintReadWrite, Category = "Save") + FSkillTreeState skillTreeState; + + UPROPERTY(BlueprintReadWrite, Category = "Save") + FCharacterCustomization characterCustomization; + + UPROPERTY(BlueprintReadWrite, Category = "Save") + int32 characterClass; +}; + +UCLASS() +class UNREALPROJECT_API UCharacterSettings : public USaveGame +{ + GENERATED_BODY() +private: + +public: + UCharacterSettings(const FObjectInitializer& ObjectInitializer); + + UPROPERTY(BlueprintReadWrite, Category = "Basic") + TArray characterSaves; + + UFUNCTION(BlueprintCallable, Category = "Basic") + TArray GetValidCharacters() const; +public: + static UCharacterSettings* Load(); + static void Save(UCharacterSettings* settings); + +}; \ No newline at end of file diff --git a/Source/UnrealProject/Doodads/FixupUtility.cpp b/Source/UnrealProject/Doodads/FixupUtility.cpp new file mode 100644 index 0000000..2f4b8df --- /dev/null +++ b/Source/UnrealProject/Doodads/FixupUtility.cpp @@ -0,0 +1,74 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "FixupUtility.h" +#include "AbilityInfo.h" +#include "AssetRegistryInterface.h" +#include "AssetRegistryModule.h" +#include "SpawnerBase.h" + +void UFixupUtility::FixupAbilityInfos() +{ + FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked("AssetRegistry"); + TArray AssetData; + FARFilter Filter; + Filter.ClassNames.Add(UAbilityInfo::StaticClass()->GetFName()); + //Filter.PackagePaths.Add("/Content/Assets/Abilities"); + AssetRegistryModule.Get().GetAssets(Filter, AssetData); + + for(auto& d : AssetData) + { + UAbilityInfo* info = Cast(d.GetAsset()); + if(info) + { + GPRINT("Fixing up " + info->GetName()); + //info->actionType = info->isToggleAbility ? EAbilityActionType::Toggle : EAbilityActionType::Normal; + //info->abilityCategory = EAbilityCategory::Unassigned; + //info->Modify(); + } + } +} +void UFixupUtility::FixAICastRanges(const FString& filter, float setRange, bool evenIfNotZero) +{ + FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked("AssetRegistry"); + TArray AssetData; + FARFilter Filter; + Filter.ClassNames.Add(UAbilityInfo::StaticClass()->GetFName()); + //Filter.PackagePaths.Add("/Content/Assets/Abilities/Boss"); + if(filter.Len() > 0) + { + Filter.PackagePaths.Add(*filter); + } + AssetRegistryModule.Get().GetAssets(Filter, AssetData); + + for(auto& d : AssetData) + { + UAbilityInfo* info = Cast(d.GetAsset()); + if(info) + { + GPRINT("Fixing up AIRange on " + info->GetName()); + if(info->AICastRange == 0 || evenIfNotZero) + { + info->AICastRange = setRange; + info->Modify(); + } + } + } +} +void UFixupUtility::FixupSpawners() +{ + UWorld* world = GEngine->GetWorld(); + if(world) + { + for(TActorIterator it(world); it; ++it) + { + ASpawnerBase* sp = *it; + sp->displayMesh->SetRelativeLocation(FVector(0.0f, 0.0f, 0.0f)); + } + } +} +void UFixupUtility::CrashTheEditor() +{ + uint32* funPointer = (uint32*)0x1; + GPRINT(*funPointer); +} diff --git a/Source/UnrealProject/Doodads/FixupUtility.h b/Source/UnrealProject/Doodads/FixupUtility.h new file mode 100644 index 0000000..908e885 --- /dev/null +++ b/Source/UnrealProject/Doodads/FixupUtility.h @@ -0,0 +1,25 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GlobalEditorUtilityBase.h" +#include "FixupUtility.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API UFixupUtility : public UGlobalEditorUtilityBase +{ + GENERATED_BODY() + +public: + UFUNCTION(BlueprintCallable, Category="HACKS") + void FixupAbilityInfos(); + UFUNCTION(BlueprintCallable, Category = "HACKS") + void FixAICastRanges(const FString& filter, float setRange, bool evenIfNotZero = false); + UFUNCTION(BlueprintCallable, Category = "HACKS") + void FixupSpawners(); + UFUNCTION(BlueprintCallable, Category = "HACKS") + void CrashTheEditor(); +}; diff --git a/Source/UnrealProject/Doodads/NetworkDoodad.cpp b/Source/UnrealProject/Doodads/NetworkDoodad.cpp new file mode 100644 index 0000000..8ecbde4 --- /dev/null +++ b/Source/UnrealProject/Doodads/NetworkDoodad.cpp @@ -0,0 +1,11 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "NetworkDoodad.h" + + +ANetworkDoodad::ANetworkDoodad() +{ + bReplicates = true; + PrimaryActorTick.bCanEverTick = true; +} \ No newline at end of file diff --git a/Source/UnrealProject/Doodads/NetworkDoodad.h b/Source/UnrealProject/Doodads/NetworkDoodad.h new file mode 100644 index 0000000..963b95f --- /dev/null +++ b/Source/UnrealProject/Doodads/NetworkDoodad.h @@ -0,0 +1,23 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GameFramework/Actor.h" +#include "NetworkDoodad.generated.h" + +UENUM(BlueprintType) +enum class ToggleType : uint8 +{ + ToggleObject, + OpenObject, + CloseObject, +}; + +UCLASS() +class UNREALPROJECT_API ANetworkDoodad : public AActor +{ + GENERATED_BODY() + +public: + ANetworkDoodad(); +}; diff --git a/Source/UnrealProject/Doodads/NetworkDoor.cpp b/Source/UnrealProject/Doodads/NetworkDoor.cpp new file mode 100644 index 0000000..2a2dcb6 --- /dev/null +++ b/Source/UnrealProject/Doodads/NetworkDoor.cpp @@ -0,0 +1,91 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" + +#include "NetworkDoor.h" + + +ANetworkDoor::ANetworkDoor() +{ + PrimaryActorTick.bCanEverTick = true; + debugColorCode = FColor::Red; + + doorCollider = CreateDefaultSubobject(TEXT("Cube")); + doorCollider->SetCollisionProfileName(TEXT("BlockAll")); + RootComponent = doorCollider; + + meshComponent = CreateDefaultSubobject(TEXT("Mesh")); + meshComponent->AttachTo(doorCollider); + + isDoorClosed = true; + closeAfterTime = 0.0f; + + debugSinkDepth = 250; +} + + +void ANetworkDoor::BeginPlay() +{ + Super::BeginPlay(); + m_openTime = 0.0f; +} + +void ANetworkDoor::Tick(float DeltaTime) +{ + Super::Tick(DeltaTime); + + if (doorCollider) + { + // Enable or disable the door collider + doorCollider->SetCollisionEnabled(isDoorClosed ? ECollisionEnabled::QueryAndPhysics : ECollisionEnabled::NoCollision); + } + + if (meshComponent) + { + const FVector localPos = meshComponent->GetRelativeTransform().GetLocation(); + const FVector targetPos = FVector(0, 0, isDoorClosed ? 0.0f : -debugSinkDepth); + + const float distanceSqr = FVector::DistSquared(localPos, targetPos); + if (distanceSqr > 0.01f) + { + FVector dif = targetPos - localPos; + dif.Normalize(); + float speed = DeltaTime * 800 * (debugSinkDepth / 250.0f); + const float distance = FMath::Sqrt(distanceSqr); + if (speed > distance) speed = distance; + dif *= speed; + meshComponent->SetRelativeLocation(localPos + dif); + } + } + + if(Role == ROLE_Authority && !isDoorClosed && closeAfterTime > 0) + { + m_openTime += DeltaTime; + if(m_openTime >= closeAfterTime) + { + SetDoorState(true); + m_openTime = 0.0f; + } + } +} + +void ANetworkDoor::ToggleDoor() +{ + // Server only function + check(Role == ROLE_Authority); + isDoorClosed = !isDoorClosed; +} + +void ANetworkDoor::SetDoorState(bool NewState) +{ + // Server only function + check(Role == ROLE_Authority); + isDoorClosed = NewState; +} + +void ANetworkDoor::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + + DOREPLIFETIME(ANetworkDoor, isDoorClosed); +} \ No newline at end of file diff --git a/Source/UnrealProject/Doodads/NetworkDoor.h b/Source/UnrealProject/Doodads/NetworkDoor.h new file mode 100644 index 0000000..b28d632 --- /dev/null +++ b/Source/UnrealProject/Doodads/NetworkDoor.h @@ -0,0 +1,40 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "NetworkDoodad.h" +#include "NetworkDoor.generated.h" + + +UCLASS() +class UNREALPROJECT_API ANetworkDoor : public ANetworkDoodad +{ + GENERATED_BODY() + +public: + ANetworkDoor(); + + virtual void BeginPlay() override; + virtual void Tick(float DeltaSeconds) override; + + void ToggleDoor(); + void SetDoorState(bool NewState); + + UPROPERTY(Replicated, EditAnywhere, Category = "Switch Components") + bool isDoorClosed; + UPROPERTY(EditAnywhere, Category = "Switch Components") + float closeAfterTime; + UPROPERTY(EditAnywhere) + FColor debugColorCode; + + UPROPERTY(EditAnywhere, Category = "Switch Components") + float debugSinkDepth; + + UPROPERTY(EditAnywhere, Category = "Switch Components") + class UBoxComponent* doorCollider; + UPROPERTY(EditAnywhere) + class UStaticMeshComponent* meshComponent; + +private: + float m_openTime; +}; diff --git a/Source/UnrealProject/Doodads/NetworkSwitch.cpp b/Source/UnrealProject/Doodads/NetworkSwitch.cpp new file mode 100644 index 0000000..d33290e --- /dev/null +++ b/Source/UnrealProject/Doodads/NetworkSwitch.cpp @@ -0,0 +1,92 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "NetworkDoor.h" + +#include "NetworkCharacter.h" +#include "NetworkSwitchComponent.h" +#include "CreatureSpawn.h" +#include "NetworkSwitch.h" + + + +ANetworkSwitch::ANetworkSwitch() +{ + cooldown = m_elapsedTime = 0.0f; + cubeCollider = CreateDefaultSubobject(TEXT("Cube")); + cubeCollider->SetCollisionProfileName(TEXT("BlockAll")); + RootComponent = cubeCollider; + + meshComponent = CreateDefaultSubobject(TEXT("Static Mesh")); + meshComponent->AttachTo(RootComponent); + + visualizerComponent = CreateDefaultSubobject(TEXT("Visualizer")); + visualizerComponent->AttachTo(RootComponent); + + isSwitchClosed = false; + + toggles = false; +} + +void ANetworkSwitch::BeginPlay() +{ + Super::BeginPlay(); + m_elapsedTime = cooldown; + + if (Role != ROLE_Authority) + return; + + // Init the door states + if (!toggles) + { + for (int32 i = 0; i < doorsToOpen.Num(); i++) + { + if (doorsToOpen[i]) + doorsToOpen[i]->SetDoorState(isSwitchClosed); + } + } +} + +void ANetworkSwitch::Tick(float DeltaTime) +{ + Super::Tick(DeltaTime); + + // Animate the switch (must be replaced with an actual animated mesh in future) + meshComponent->SetRelativeRotation(FRotator(isSwitchClosed ? 30 : -30, 0, 0)); + + if (Role != ROLE_Authority) + return; + + if (cooldown > 0) + m_elapsedTime += DeltaTime; +} + +void ANetworkSwitch::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + + DOREPLIFETIME(ANetworkSwitch, isSwitchClosed); +} + +void ANetworkSwitch::Toggle() +{ + check(Role == ROLE_Authority); + + if (m_elapsedTime < cooldown) + return; + + m_elapsedTime = 0; + isSwitchClosed = !isSwitchClosed; + + // Toggle all linked doors + for (int32 i = 0; i < doorsToOpen.Num(); i++) + { + if (doorsToOpen[i]) + { + if (toggles) + doorsToOpen[i]->ToggleDoor(); + else + doorsToOpen[i]->SetDoorState(isSwitchClosed); + } + } +} \ No newline at end of file diff --git a/Source/UnrealProject/Doodads/NetworkSwitch.h b/Source/UnrealProject/Doodads/NetworkSwitch.h new file mode 100644 index 0000000..a6c880f --- /dev/null +++ b/Source/UnrealProject/Doodads/NetworkSwitch.h @@ -0,0 +1,41 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "NetworkDoodad.h" +#include "NetworkSwitch.generated.h" + + +UCLASS() +class UNREALPROJECT_API ANetworkSwitch : public ANetworkDoodad +{ + GENERATED_BODY() + +public: + ANetworkSwitch(); + + virtual void BeginPlay() override; + virtual void Tick(float DeltaSeconds) override; + + void Toggle(); + + UPROPERTY(EditAnywhere, Category = "Switch Components") + TArray doorsToOpen; + UPROPERTY(EditAnywhere, Category = "Switch Components") + float cooldown; + UPROPERTY(EditAnywhere, Category = "Switch Components") + bool toggles; + + UPROPERTY(Replicated, EditAnywhere, Category = "Switch Components") + bool isSwitchClosed; + +private: + float m_elapsedTime; + + UPROPERTY(EditAnywhere, Category = "Switch Components") + class UBoxComponent* cubeCollider; + UPROPERTY(EditAnywhere, Category = "Switch Components") + class UStaticMeshComponent* meshComponent; + UPROPERTY(EditAnywhere, Category = "Switch Components") + class UNetworkSwitchComponent* visualizerComponent; +}; diff --git a/Source/UnrealProject/Doodads/NetworkSwitchComponent.cpp b/Source/UnrealProject/Doodads/NetworkSwitchComponent.cpp new file mode 100644 index 0000000..86ce22f --- /dev/null +++ b/Source/UnrealProject/Doodads/NetworkSwitchComponent.cpp @@ -0,0 +1,108 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "NetworkSwitchComponent.h" +#include "NetworkDoor.h" +#include "NetworkSwitch.h" +#include "NetworkTrigger.h" +#include "Spawners/CreatureSpawn.h" + +UNetworkSwitchComponent::UNetworkSwitchComponent(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) +{ + ShapeColor = FColor(223, 149, 157, 255); + + bUseEditorCompositing = true; + + networkDoodad = Cast(GetAttachmentRootActor()); + creatureSpawn = Cast(GetAttachmentRootActor()); +} + +FPrimitiveSceneProxy* UNetworkSwitchComponent::CreateSceneProxy() +{ + class FDrawConeSceneProxy : public FPrimitiveSceneProxy + { + public: + const UNetworkSwitchComponent* component; + FDrawConeSceneProxy(const UNetworkSwitchComponent* InComponent) + : FPrimitiveSceneProxy(InComponent) + , networkDoodad(InComponent->networkDoodad) + , creatureSpawn(InComponent->creatureSpawn) + , bDrawOnlyIfSelected(InComponent->bDrawOnlyIfSelected) + , component(InComponent) + { + bWillEverBeLit = false; + } + + + virtual void GetDynamicMeshElements(const TArray& Views, const FSceneViewFamily& ViewFamily, uint32 VisibilityMap, FMeshElementCollector& Collector) const override + { + QUICK_SCOPE_CYCLE_COUNTER(STAT_GetDynamicMeshElements_DrawDynamicElements); + + const FMatrix& LocalToWorld = GetLocalToWorld(); + + for (int32 ViewIndex = 0; ViewIndex < Views.Num(); ViewIndex++) + { + const FSceneView* View = Views[ViewIndex]; + + FPrimitiveDrawInterface* PDI = Collector.GetPDI(ViewIndex); + if (networkDoodad) + { + if (networkDoodad->IsA(ANetworkTrigger::StaticClass())) + { + const ANetworkTrigger* const obj = Cast(networkDoodad); + for (int32 i = 0; i < obj->doorsToOpen.Num(); i++) + { + if (obj->doorsToOpen[i]) + PDI->DrawLine(obj->GetActorLocation() + FVector(0, 0, 100), obj->doorsToOpen[i]->GetActorLocation() + FVector(0, 0, 100), obj->doorsToOpen[i]->debugColorCode, SDPG_World); + } + for (int32 i = 0; i < obj->creaturesToSpawn.Num(); i++) + { + if (obj->creaturesToSpawn[i]) + PDI->DrawLine(obj->GetActorLocation() + FVector(0, 0, 100), obj->creaturesToSpawn[i]->GetActorLocation() + FVector(0, 0, 100), obj->creaturesToSpawn[i]->debugColorCode, SDPG_World); + } + } + if (networkDoodad->IsA(ANetworkSwitch::StaticClass())) + { + const ANetworkSwitch* const obj = Cast(networkDoodad); + for (int32 i = 0; i < obj->doorsToOpen.Num(); i++) + { + if (obj->doorsToOpen[i]) + PDI->DrawLine(obj->GetActorLocation() + FVector(0, 0, 100), obj->doorsToOpen[i]->GetActorLocation() + FVector(0, 0, 100), obj->doorsToOpen[i]->debugColorCode, SDPG_World); + } + } + } + if (creatureSpawn) + { + + for (int32 i = 0; i < creatureSpawn->doorsToOpen.Num(); i++) + { + if (creatureSpawn->doorsToOpen[i]) + PDI->DrawLine(creatureSpawn->GetActorLocation() + FVector(0, 0, 100), creatureSpawn->doorsToOpen[i]->GetActorLocation() + FVector(0, 0, 100), creatureSpawn->doorsToOpen[i]->debugColorCode, SDPG_World); + } + } + } + } + + virtual FPrimitiveViewRelevance GetViewRelevance(const FSceneView* View) const override + { + FPrimitiveViewRelevance Result; + Result.bDrawRelevance = IsSelected(); + Result.bDynamicRelevance = true; + Result.bShadowRelevance = IsShadowCast(View); + Result.bEditorPrimitiveRelevance = UseEditorCompositing(View); + return Result; + } + + virtual uint32 GetMemoryFootprint(void) const override { return(sizeof(*this) + GetAllocatedSize()); } + uint32 GetAllocatedSize(void) const { return(FPrimitiveSceneProxy::GetAllocatedSize()); } + + private: + const uint32 bDrawOnlyIfSelected : 1; + const ANetworkDoodad* networkDoodad; + const ACreatureSpawn* creatureSpawn; + const FColor ShapeColor = FColor(255, 0, 0, 255); + const FTransform transform; + }; + + return new FDrawConeSceneProxy(this); +} diff --git a/Source/UnrealProject/Doodads/NetworkSwitchComponent.h b/Source/UnrealProject/Doodads/NetworkSwitchComponent.h new file mode 100644 index 0000000..409ddfd --- /dev/null +++ b/Source/UnrealProject/Doodads/NetworkSwitchComponent.h @@ -0,0 +1,21 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Components/CapsuleComponent.h" +#include "NetworkSwitchComponent.generated.h" + +class ANetworkSwitch; + +UCLASS() +class UNREALPROJECT_API UNetworkSwitchComponent : public UCapsuleComponent +{ + GENERATED_UCLASS_BODY() + +public: + class ANetworkDoodad* networkDoodad; + class ACreatureSpawn* creatureSpawn; + + virtual FPrimitiveSceneProxy* CreateSceneProxy() override; + +}; diff --git a/Source/UnrealProject/Doodads/NetworkTrigger.cpp b/Source/UnrealProject/Doodads/NetworkTrigger.cpp new file mode 100644 index 0000000..2f77245 --- /dev/null +++ b/Source/UnrealProject/Doodads/NetworkTrigger.cpp @@ -0,0 +1,123 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "NetworkDoor.h" +#include "NetworkPlayer.h" +#include "NetworkSwitchComponent.h" +#include "CreatureSpawn.h" +#include "DefaultGameMode.h" +#include "NetworkTrigger.h" + + + +ANetworkTrigger::ANetworkTrigger() +{ + openMode = OpenMode::NoKeyRequired; + cooldown = m_elapsedTime = 0.0f; + cubeCollider = CreateDefaultSubobject(TEXT("Cube")); + RootComponent = cubeCollider; + + meshComponent = CreateDefaultSubobject(TEXT("Static Mesh")); + meshComponent->AttachTo(RootComponent); + + visualizerComponent = CreateDefaultSubobject(TEXT("Visualizer")); + visualizerComponent->AttachTo(RootComponent); + cubeCollider->OnComponentBeginOverlap.AddDynamic(this, &ANetworkTrigger::OnOverlapBegin); // set up a notification for when this component overlaps something +} + +void ANetworkTrigger::BeginPlay() +{ + Super::BeginPlay(); + m_elapsedTime = cooldown; +} + +void ANetworkTrigger::Tick(float DeltaTime) +{ + Super::Tick(DeltaTime); + + if (Role != ROLE_Authority) + return; + + if (cooldown > 0) + m_elapsedTime += DeltaTime; +} + +void ANetworkTrigger::OnOverlapBegin(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) +{ + if (Role != ROLE_Authority) + return; + + if (!(OtherActor && (OtherActor != this) && OtherComp)) + return; + if (!OtherActor->IsA(ANetworkPlayer::StaticClass())) + return; + if (m_elapsedTime < cooldown) + return; + ANetworkPlayer* player = Cast(OtherActor); + AController* const controller = player->GetController(); + if (!controller) + return; + + if (openMode != OpenMode::NoKeyRequired) + { + if (openMode == OpenMode::TreasureRoomKey) + { + if (!player->HasKey(PlayerKeyType::TreasureRoomKey)) + return; + ADefaultGameMode* gameMode = (ADefaultGameMode*)GetWorld()->GetAuthGameMode(); + gameMode->BossHasBeenKilled(player->GetTeam()); + } + else if (openMode == OpenMode::BossRoomKeyParts) + { + // Check if this team has all key fragments + ANetworkPlayer* const teamMate = player->GetTeamMate(); + int32 playerKeyCompletion = 0, requiredKeyCompletion = 0; + for (int32 i = keyFragmentMin; i <= keyFragmentMax; i++) + { + const int32 lsl = (1 << i); + requiredKeyCompletion += lsl; + playerKeyCompletion += player->HasKey(PlayerKeyType(i)) ? lsl : 0; + if (IsValid(teamMate)) + playerKeyCompletion |= teamMate->HasKey(PlayerKeyType(i)) ? lsl : 0; + } + + // Key is not complete + if (requiredKeyCompletion != playerKeyCompletion) + return; + + // Remove the key fragments + for (int32 i = keyFragmentMin; i <= keyFragmentMax; i++) + { + player->ClearKey(PlayerKeyType(i)); + if (IsValid(teamMate)) + teamMate->ClearKey(PlayerKeyType(i)); + } + } + } + + m_elapsedTime = 0; + + for (size_t i = 0; i < creaturesToSpawn.Num(); i++) + { + if (!creaturesToSpawn[i]->spawnContinuous) + creaturesToSpawn[i]->SpawnMobs(); + } + for (int32 i = 0; i < doorsToOpen.Num(); i++) + { + if (doorsToOpen[i]) + { + switch (toggleMode) + { + case ToggleType::CloseObject: + doorsToOpen[i]->SetDoorState(true); + break; + case ToggleType::OpenObject: + doorsToOpen[i]->SetDoorState(false); + break; + case ToggleType::ToggleObject: + doorsToOpen[i]->ToggleDoor(); + break; + } + } + } +} \ No newline at end of file diff --git a/Source/UnrealProject/Doodads/NetworkTrigger.h b/Source/UnrealProject/Doodads/NetworkTrigger.h new file mode 100644 index 0000000..b9ab8f7 --- /dev/null +++ b/Source/UnrealProject/Doodads/NetworkTrigger.h @@ -0,0 +1,52 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "NetworkDoodad.h" +#include "NetworkPlayer.h" +#include "NetworkTrigger.generated.h" + +UENUM(BlueprintType) +enum class OpenMode : uint8 +{ + NoKeyRequired = 0, + BossRoomKeyParts = 1, + TreasureRoomKey = 2, +}; + +UCLASS() +class UNREALPROJECT_API ANetworkTrigger : public ANetworkDoodad +{ + GENERATED_BODY() + +public: + ANetworkTrigger(); + virtual void BeginPlay() override; + + UPROPERTY(EditAnywhere, Category = "Switch Components") + TArray doorsToOpen; + UPROPERTY(EditAnywhere, Category = "Switch Components") + TArray creaturesToSpawn; + UPROPERTY(EditAnywhere, Category = "Switch Components") + float cooldown; + UPROPERTY(EditAnywhere, Category = "Switch Components") + OpenMode openMode; + + UFUNCTION() + void OnOverlapBegin(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult); + + virtual void Tick(float DeltaSeconds) override; + +private: + float m_elapsedTime; + + UPROPERTY(EditAnywhere, Category = "Switch Components") + class UBoxComponent* cubeCollider; + + UPROPERTY(EditAnywhere, Category = "Switch Components") + class UStaticMeshComponent* meshComponent; + UPROPERTY(EditAnywhere, Category = "Switch Components") + class UNetworkSwitchComponent* visualizerComponent; + UPROPERTY(EditAnywhere, Category = "Switch Components") + ToggleType toggleMode; +}; diff --git a/Source/UnrealProject/Doodads/ParticleEffect.cpp b/Source/UnrealProject/Doodads/ParticleEffect.cpp new file mode 100644 index 0000000..c369151 --- /dev/null +++ b/Source/UnrealProject/Doodads/ParticleEffect.cpp @@ -0,0 +1,40 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "ParticleEffect.h" + + +AParticleEffect::AParticleEffect() +{ + // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it. + PrimaryActorTick.bCanEverTick = true; + duration = 5.0f; + RootComponent = particleComponent = CreateDefaultSubobject("PSys"); + followActor = nullptr; +} + +void AParticleEffect::BeginPlay() +{ + Super::BeginPlay(); + +} + +void AParticleEffect::Tick( float DeltaTime ) +{ + Super::Tick( DeltaTime ); + duration -= DeltaTime; + if (followActor) + SetActorTransform(followActor->GetTransform()); + if (duration <= 0.0f) + { + Destroy(); + } +} + +void AParticleEffect::Init(UParticleSystem* particleSystem, float duration) +{ + this->duration = duration; + particleComponent->SetTemplate(particleSystem); + particleComponent->InitializeSystem(); +} + diff --git a/Source/UnrealProject/Doodads/ParticleEffect.h b/Source/UnrealProject/Doodads/ParticleEffect.h new file mode 100644 index 0000000..6a85b7f --- /dev/null +++ b/Source/UnrealProject/Doodads/ParticleEffect.h @@ -0,0 +1,29 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GameFramework/Actor.h" +#include "ParticleEffect.generated.h" + +UCLASS() +class UNREALPROJECT_API AParticleEffect : public AActor +{ + GENERATED_BODY() + +public: + AParticleEffect(); + + virtual void BeginPlay() override; + virtual void Tick( float DeltaSeconds ) override; + + void Init(UParticleSystem* particleSystem, float duration); + + UPROPERTY() + UParticleSystemComponent* particleComponent; + + UPROPERTY(BlueprintReadWrite, Category = "Target") + AActor* followActor; + + float duration; + +}; diff --git a/Source/UnrealProject/Doodads/Prefs.cpp b/Source/UnrealProject/Doodads/Prefs.cpp new file mode 100644 index 0000000..b9a822e --- /dev/null +++ b/Source/UnrealProject/Doodads/Prefs.cpp @@ -0,0 +1,37 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "Prefs.h" + +#define PREFS_SLOT_NAME TEXT("WIEBERPREFS tm") + +UPrefs::UPrefs(const FObjectInitializer& ObjectInitializer) + : Super(ObjectInitializer) +{ + useControllerName = ""; + + musicVolume = 1.0f; + sfxVolume = 1.0f; + + while (customGraphicsSettings.Num() < 6) + customGraphicsSettings.Add(3); + + usingCustomGraphicsSettings = false; +} + +UPrefs* UPrefs::Load() +{ + UPrefs* settings = Cast(UGameplayStatics::LoadGameFromSlot(PREFS_SLOT_NAME, 0)); + if (!settings) + { + settings = Cast(UGameplayStatics::CreateSaveGameObject(UPrefs::StaticClass())); + } + check(settings); + + return settings; +} + +void UPrefs::Save(UPrefs* settings) +{ + UGameplayStatics::SaveGameToSlot(settings, PREFS_SLOT_NAME, 0); +} diff --git a/Source/UnrealProject/Doodads/Prefs.h b/Source/UnrealProject/Doodads/Prefs.h new file mode 100644 index 0000000..e5f5295 --- /dev/null +++ b/Source/UnrealProject/Doodads/Prefs.h @@ -0,0 +1,33 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GameFramework/SaveGame.h" +#include "Prefs.generated.h" + + +UCLASS() +class UNREALPROJECT_API UPrefs : public USaveGame +{ + GENERATED_BODY() + +public: + UPrefs(const FObjectInitializer& ObjectInitializer); + + UPROPERTY(BlueprintReadWrite, Category = "Basic") + FString useControllerName; + + UPROPERTY(BlueprintReadWrite, Category = "Basic") + float musicVolume; + UPROPERTY(BlueprintReadWrite, Category = "Basic") + float sfxVolume; + + UPROPERTY(BlueprintReadWrite, Category = "Graphics") + bool usingCustomGraphicsSettings; + UPROPERTY(BlueprintReadWrite, Category = "Graphics") + TArray customGraphicsSettings; + +public: + static UPrefs* Load(); + static void Save(UPrefs* settings); +}; \ No newline at end of file diff --git a/Source/UnrealProject/Doodads/Shrine.cpp b/Source/UnrealProject/Doodads/Shrine.cpp new file mode 100644 index 0000000..ee200c2 --- /dev/null +++ b/Source/UnrealProject/Doodads/Shrine.cpp @@ -0,0 +1,44 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "NetworkGhost.h" +#include "Shrine.h" + + +// Sets default values +AShrine::AShrine() +{ + // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it. + PrimaryActorTick.bCanEverTick = true; + + displayMesh = CreateDefaultSubobject(TEXT("Mesh")); + displayMesh->bHiddenInGame = true; + displayMesh->bGenerateOverlapEvents = false; + displayMesh->SetCollisionEnabled(ECollisionEnabled::NoCollision); + RootComponent = displayMesh; + + shrineTrigger = CreateDefaultSubobject(TEXT("RespawnArea")); + shrineTrigger->SetCollisionProfileName(TEXT("GhostOverlap")); + shrineTrigger->AttachTo(RootComponent); + shrineTrigger->OnComponentBeginOverlap.AddDynamic(this, &AShrine::OnOverlapBegin); + shrineTrigger->OnComponentEndOverlap.AddDynamic(this, &AShrine::OnOverlapEnd); + shrineTrigger->SetSphereRadius(300); + shrineTrigger->AttachTo(RootComponent); +} + + +void AShrine::OnOverlapBegin(AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) +{ + ANetworkGhost* ghost = Cast(OtherActor); + if (!IsValid(ghost)) return; + + ghost->shrinesInRange++; +} +void AShrine::OnOverlapEnd(AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex) +{ + ANetworkGhost* ghost = Cast(OtherActor); + if (!IsValid(ghost)) return; + + if (ghost->shrinesInRange > 0) + ghost->shrinesInRange--; +} \ No newline at end of file diff --git a/Source/UnrealProject/Doodads/Shrine.h b/Source/UnrealProject/Doodads/Shrine.h new file mode 100644 index 0000000..21ade2c --- /dev/null +++ b/Source/UnrealProject/Doodads/Shrine.h @@ -0,0 +1,28 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GameFramework/Actor.h" +#include "Shrine.generated.h" + +UCLASS() +class UNREALPROJECT_API AShrine : public AActor +{ + GENERATED_BODY() + +public: + // Sets default values for this actor's properties + AShrine(); + + + UPROPERTY(VisibleAnywhere, Category = "Respawn") + class UStaticMeshComponent* displayMesh; + UPROPERTY(EditAnywhere, Category = "Respawn") + class USphereComponent* shrineTrigger; + + UFUNCTION() + void OnOverlapBegin(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult); + UFUNCTION() + void OnOverlapEnd(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex); + +}; diff --git a/Source/UnrealProject/Effects/AbilityIndicator.cpp b/Source/UnrealProject/Effects/AbilityIndicator.cpp new file mode 100644 index 0000000..08a639e --- /dev/null +++ b/Source/UnrealProject/Effects/AbilityIndicator.cpp @@ -0,0 +1,241 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "UnrealNetwork.h" +#include "AbilityIndicator.h" + + +// Sets default values +AAbilityIndicator::AAbilityIndicator() +{ + PrimaryActorTick.bCanEverTick = true; + m_followActor = nullptr; + m_duration = 0.0f; + bReplicates = true; + +} + +AFillingAbilityIndicator::AFillingAbilityIndicator() +{ + +} +void AAbilityIndicator::BeginPlay() +{ + FVector pos; + FRotator rot; + + if (m_followActor) + { + pos = m_followActor->GetActorLocation(); + rot = m_followActor->GetActorRotation() + m_rotationOffset; + } + else + { + pos = GetActorLocation(); + rot = GetActorRotation() + m_rotationOffset; + } + + m_outlineDecal = GetWorld()->SpawnActor(pos, rot); + m_outlineDecal->SetDecalMaterial(outlineMat); + m_outlineMat = m_outlineDecal->CreateDynamicMaterialInstance(); + m_outlineMat->SetTextureParameterValue(FName("OutlineTexture"), outlineTexture); + m_outlineDecal->SetActorScale3D(m_scale); + m_outlineDecal->AddActorLocalOffset(-m_offset); + m_outlineDecal->SetLifeSpan(m_duration); + m_outlineMat->SetVectorParameterValue("TeamColor", m_color); + Super::BeginPlay(); +} + + +void AAbilityIndicator::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + // m_outlineDecal->Destroy(); + + if (IsValid(m_outlineDecal)) + m_outlineDecal->Destroy(); + Super::EndPlay(EndPlayReason); +} +void AFillingAbilityIndicator::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + +// m_fillDecal->Destroy(); + + if (IsValid(m_fillDecal)) + m_fillDecal->Destroy(); + Super::EndPlay(EndPlayReason); +} + +void AFillingAbilityIndicator::BeginPlay() +{ + Super::BeginPlay(); + FVector pos ; + FRotator rot; + if (m_followActor) + { + pos = m_followActor->GetActorLocation(); + rot = m_followActor->GetActorRotation() + m_rotationOffset; + } + else + { + pos = GetActorLocation(); + rot = GetActorRotation() + m_rotationOffset; + } + m_fillDecal = GetWorld()->SpawnActor(pos, rot); + m_fillDecal->SetDecalMaterial(fillMat); + m_fillMat = m_fillDecal->CreateDynamicMaterialInstance(); + m_fillMat->SetTextureParameterValue(FName("FillTexture"), fillTexture); + + m_fillDecal->SetActorScale3D(m_scale); + m_fillDecal->AddActorLocalOffset(-m_offset); + m_fillDecal->SetLifeSpan(m_duration); + +} + +void AAbilityIndicator::CalculatePosition_Implementation() +{ + if (Role != ROLE_Authority) + return; + if (IsValid(m_followActor)) + { + FTransform newtrans = m_followActor->GetTransform(); + SetActorTransform(newtrans); + } + +} + +void AAbilityIndicator::ForceDestroy() +{ + if (Role != ROLE_Authority) + return; + m_lifeTime = m_duration; + m_duration += 0.1f; +} + + +void AAbilityIndicator::Init(float duration, FVector offset, FRotator rotationOffset, FVector scale, bool center, AActor* followActor, FLinearColor color) +{ + m_duration = duration; + m_followActor = followActor; + m_offset = offset; + m_rotationOffset = rotationOffset; + m_scale = scale; + m_color = color; + m_center = center; +} + +void AAbilityIndicator::Tick(float DeltaTime) +{ + Super::Tick(DeltaTime); + + CalculatePosition(); + SetDecalLocations(); + if (m_duration > 0.0f) // Only use timer if duration was set + { + m_lifeTime += DeltaTime; + if (m_lifeTime >= m_duration) + { + if (Role == ROLE_Authority) + { + Destroy(); + } + } + } +} + +void AAbilityIndicator::SetDecalLocations() +{ + + if (Role != ROLE_Authority) + return; + if (IsValid(m_followActor)) + { + if (m_center) + { + m_outlineDecal->SetActorLocation(m_followActor->GetActorLocation()); + } + else if (IsValid(m_followActor)) + { + + m_outlineDecal->SetActorLocation(m_followActor->GetActorLocation()); + m_outlineDecal->AddActorLocalOffset(-m_offset); + } + } + else + { + if (m_center) + { + m_outlineDecal->SetActorLocation(GetActorLocation()); + } + else + { + m_outlineDecal->SetActorLocation(GetActorLocation()); + m_outlineDecal->AddActorLocalOffset(-m_offset); + } + } +} + +void AFillingAbilityIndicator::Tick(float DeltaTime) +{ + Super::Tick(DeltaTime); + + if (m_duration > 0.0f) // Only use timer if duration was set + { + if (m_fillMat != nullptr) + m_fillMat->SetScalarParameterValue(FName("AlphaMultiplier"), m_lifeTime / m_duration); + if (m_lifeTime >= m_duration) + { + if (Role == ROLE_Authority) + { + } + } + } +} +void AAbilityIndicator::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + + DOREPLIFETIME_CONDITION(AAbilityIndicator, m_followActor, COND_InitialOnly); + DOREPLIFETIME_CONDITION(AAbilityIndicator, m_duration, COND_InitialOnly); + DOREPLIFETIME_CONDITION(AAbilityIndicator, m_scale, COND_InitialOnly); + DOREPLIFETIME_CONDITION(AAbilityIndicator, m_offset, COND_InitialOnly); + DOREPLIFETIME_CONDITION(AAbilityIndicator, m_rotationOffset, COND_InitialOnly); + DOREPLIFETIME_CONDITION(AAbilityIndicator, m_color, COND_InitialOnly); + DOREPLIFETIME_CONDITION(AAbilityIndicator, m_center, COND_InitialOnly); +} +void AAbilityIndicator::SetOffset(FVector offset) +{ + m_offset = offset; +} +void AAbilityIndicator::SetRotationOffset(FRotator rotationOffset) +{ + m_rotationOffset = rotationOffset; +} +void AFillingAbilityIndicator::SetDecalLocations() +{ + Super::SetDecalLocations(); + + if (IsValid(m_followActor)) + { + if (m_center) + { + m_fillDecal->SetActorLocation(m_followActor->GetActorLocation()); + } + else if (IsValid(m_followActor)) + { + m_fillDecal->SetActorLocation(m_followActor->GetActorLocation()); + m_fillDecal->AddActorLocalOffset(-m_offset); + } + } + else + { + if (m_center) + { + m_fillDecal->SetActorLocation(GetActorLocation()); + } + else + { + m_fillDecal->SetActorLocation(GetActorLocation()); + m_fillDecal->AddActorLocalOffset(-m_offset); + } + } +} \ No newline at end of file diff --git a/Source/UnrealProject/Effects/AbilityIndicator.h b/Source/UnrealProject/Effects/AbilityIndicator.h new file mode 100644 index 0000000..210b6b0 --- /dev/null +++ b/Source/UnrealProject/Effects/AbilityIndicator.h @@ -0,0 +1,101 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GameFramework/Actor.h" +#include "NetworkCharacter.h" +#include "TeamData.h" +#include "DealDamageProxy.h" +#include "AbilityIndicator.generated.h" + + UCLASS() +class UNREALPROJECT_API AAbilityIndicator : public AActor +{ + GENERATED_BODY() + +public: + // Sets default values for this actor's properties + AAbilityIndicator(); + + UFUNCTION() + void Init(float duration, FVector offset, FRotator rotationOffset, FVector scale, bool center, AActor* followActor = nullptr, FLinearColor color = FLinearColor(1,1,1,1)); + + virtual void BeginPlay() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + + virtual void Tick(float DeltaSeconds) override; + + UFUNCTION(BlueprintNativeEvent) + void CalculatePosition(); + UFUNCTION(BluePrintCallable, category = "AbilityIndicators") + void ForceDestroy(); + + UPROPERTY(EditDefaultsOnly, category = "AbilityIndicators") + UMaterial* outlineMat; + UPROPERTY(EditDefaultsOnly, category = "AbilityIndicators") + UTexture2D* outlineTexture; + + UPROPERTY(BlueprintReadWrite, Replicated, ReplicatedUsing = CalculatePosition, meta = (ExposeOnSpawn), category = "AbilityIndicators") + AActor* m_followActor; + + void SetOffset(FVector offset); + void SetRotationOffset(FRotator rotationOffset); + + UPROPERTY(EditDefaultsOnly) + UTeamData* teamData; +protected: + UPROPERTY() + UMaterialInstanceDynamic* m_outlineMat; + + virtual void SetDecalLocations(); + UPROPERTY() + ADecalActor* m_outlineDecal; + UPROPERTY(Replicated) + bool m_center; + + UPROPERTY(Replicated) + float m_duration; + UPROPERTY(Replicated) + FLinearColor m_color; + UPROPERTY(Replicated) + FVector m_offset; + UPROPERTY(Replicated) + FRotator m_rotationOffset; + UPROPERTY(Replicated) + FVector m_scale; + + UPROPERTY() + float m_lifeTime; +}; + +UCLASS() +class UNREALPROJECT_API AFillingAbilityIndicator : public AAbilityIndicator +{ + GENERATED_BODY() + +public: + // Sets default values for this actor's properties + AFillingAbilityIndicator(); + + virtual void BeginPlay() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + + + virtual void Tick(float DeltaSeconds) override; + + UPROPERTY(EditDefaultsOnly, category = "AbilityIndicators") + UMaterial* fillMat; + UPROPERTY(EditDefaultsOnly, category = "AbilityIndicators") + UTexture2D* fillTexture; + + + +private: + virtual void SetDecalLocations() override; + UPROPERTY() + UMaterialInstanceDynamic* m_fillMat; + + UPROPERTY() + ADecalActor* m_fillDecal; + +}; diff --git a/Source/UnrealProject/Effects/Effect.cpp b/Source/UnrealProject/Effects/Effect.cpp new file mode 100644 index 0000000..6e4f731 --- /dev/null +++ b/Source/UnrealProject/Effects/Effect.cpp @@ -0,0 +1,166 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" + +#include "NetworkCharacter.h" +#include "Effect.h" +#include "DefaultGameInstance.h" +#include "Prefs.h" + +AEffect::AEffect() +{ + // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it. + PrimaryActorTick.bCanEverTick = true; + //RootComponent = m_particleComponent = CreateDefaultSubobject("PSys"); + m_followActor = nullptr; + m_duration = 0.0f; + deactivateParticlesBefore = 0; + bReplicates = true; + +} +void AEffect::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + + DOREPLIFETIME_CONDITION(AEffect, m_followActor, COND_InitialOnly); + DOREPLIFETIME_CONDITION(AEffect, m_duration, COND_InitialOnly); +} +void AEffect::BeginPlay() +{ + m_particleSystems = GetComponentsByClass(UParticleSystemComponent::StaticClass()); + m_rootParticleSystem = Cast(RootComponent); + m_rootAudio = Cast(RootComponent); + + // Bind root component finished actions + if(m_rootParticleSystem) + { + if(m_duration == 0.0f) + m_rootParticleSystem->bAutoDestroy = true; + + float WarmupTimeRemember = m_rootParticleSystem->Template->WarmupTime; + m_rootParticleSystem->Template->WarmupTime = m_lifeTime; + m_rootParticleSystem->ActivateSystem(); + m_rootParticleSystem->Template->WarmupTime = WarmupTimeRemember; + m_rootParticleSystem->OnSystemFinished.AddDynamic(this, &AEffect::OnRootParticleSystemFinished); + } + else if(m_rootAudio) + { + m_rootAudio->OnAudioFinished.AddDynamic(this, &AEffect::OnRootAudioFinished); + } + else + { + GWWARNING(L"Effect root is not a particles system or an audio component [" + GetName() + L"]"); + } + + Super::BeginPlay(); + TArray audioComponents = GetComponentsByClass(UAudioComponent::StaticClass()); + float volume = Cast(GetGameInstance())->GetPrefs()->sfxVolume; + for (int32 i = 0; i < audioComponents.Num(); i++) + { + Cast(audioComponents[i])->SetVolumeMultiplier(volume); + } + + if (IsValid(m_followActor)) + { + ANetworkCharacter* networkcharacter = Cast(m_followActor); + if(networkcharacter) + networkcharacter->RegisterEffect(this); + } +} +void AEffect::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + if (IsValid(m_followActor)) + { + ANetworkCharacter* networkcharacter = Cast(m_followActor); + if (networkcharacter) + networkcharacter->UnRegisterEffect(this); + } +} +void AEffect::OnRootParticleSystemFinished(UParticleSystemComponent*) +{ + if(m_duration == 0.0f) // Only auto-destroy if duration was not set + Destroy(); +} +void AEffect::OnRootAudioFinished() +{ + if(m_duration == 0.0f) // Only auto-destroy if duration was not set + Destroy(); +} +AActor* AEffect::GetFollower() const +{ + return m_followActor; +} +void AEffect::DeactivateParticles() +{ + for(int32 i = 0; i < m_particleSystems.Num(); i++) + { + Cast(m_particleSystems[i])->DeactivateSystem(); + } + deactivateParticlesBefore = 0.0f; +} +void AEffect::CalculatePosition_Implementation() +{ + if (m_followActor) + { + SetActorLocation(m_followActor->GetActorLocation()); + SetActorRotation(m_followActor->GetActorRotation()); + } +} +void AEffect::BeginEffect_Implementation() +{ +} +void AEffect::Tick( float DeltaTime ) +{ + Super::Tick( DeltaTime ); + + CalculatePosition(); + + m_lifeTime += DeltaTime; + if(m_duration > 0.0f) // Only use timer if duration was set + { + if(deactivateParticlesBefore > 0.0f) + { + if((m_lifeTime + deactivateParticlesBefore) >= m_duration) + { + DeactivateParticles(); + } + } + + if(m_lifeTime >= m_duration) + { + Destroy(); + } + } + if (m_follow && !IsValid(m_followActor)) + DeactivateParticles(); +} +void AEffect::Init(float duration, AActor* followActor, bool clientSideOnly) +{ + if(clientSideOnly) + bReplicates = false; + m_duration = duration; + m_followActor = followActor; + BeginEffect(); + m_follow = IsValid(followActor); +} +void AEffect::End_Implementation() +{ + //check(Role == ROLE_Authority); + if(deactivateParticlesBefore > 0.0f) + { + m_duration = deactivateParticlesBefore; + m_lifeTime = 0.0f; + DeactivateParticles(); + check(m_duration > 0.0f); + } + else + { + Destroy(); + } +} + +void ATargetedEffect::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + DOREPLIFETIME(ATargetedEffect, target); +} diff --git a/Source/UnrealProject/Effects/Effect.h b/Source/UnrealProject/Effects/Effect.h new file mode 100644 index 0000000..45306d0 --- /dev/null +++ b/Source/UnrealProject/Effects/Effect.h @@ -0,0 +1,74 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GameFramework/Actor.h" +#include "Effect.generated.h" + +UCLASS() +class UNREALPROJECT_API AEffect : public AActor +{ + GENERATED_BODY() + +public: + AEffect(); + + virtual void BeginPlay() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + + virtual void Tick( float DeltaSeconds ) override; + + UFUNCTION() + void Init(float duration, AActor* followActor = nullptr, bool clientSideOnly = false); + + UFUNCTION(BlueprintNativeEvent) + void BeginEffect(); + + // Destroys this particle system + waits for deactivateParticlesBefore seconds after deactivating particle systems + UFUNCTION(BlueprintCallable, NetMulticast, Reliable, Category="Effect") + void End(); + + // Event fired when end is called + UFUNCTION(BlueprintImplementableEvent) + void OnEnd(); + + // Function used to update the position of this effect + UFUNCTION(BlueprintNativeEvent) + void CalculatePosition(); + + UFUNCTION() + void OnRootParticleSystemFinished(UParticleSystemComponent* sys); + UFUNCTION() + void OnRootAudioFinished(); + + UFUNCTION(BlueprintCallable, Category="Effect") + AActor* GetFollower() const; + + // Time before the end of the duration in which the particle system is deactivated + UPROPERTY(BlueprintReadOnly, EditDefaultsOnly, Category="Particles") + float deactivateParticlesBefore; + + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Effect", meta = (ExposeOnSpawn)) + float m_lifeTime; +private: + void DeactivateParticles(); + + TArray m_particleSystems; + UParticleSystemComponent* m_rootParticleSystem; + UAudioComponent* m_rootAudio; + + UPROPERTY(Replicated, ReplicatedUsing = CalculatePosition) + AActor* m_followActor; + UPROPERTY(Replicated) + float m_duration; + bool m_follow; +}; + +UCLASS() +class ATargetedEffect : public AEffect +{ + GENERATED_BODY() +public: + UPROPERTY(Replicated, BlueprintReadOnly) + FVector target; +}; \ No newline at end of file diff --git a/Source/UnrealProject/Effects/EffectFunctionLibrary.cpp b/Source/UnrealProject/Effects/EffectFunctionLibrary.cpp new file mode 100644 index 0000000..288a6e2 --- /dev/null +++ b/Source/UnrealProject/Effects/EffectFunctionLibrary.cpp @@ -0,0 +1,185 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "DefaultGameInstance.h" +#include "Prefs.h" +#include "ItemBase.h" +#include "Effect.h" +#include "AbilityIndicator.h" +#include "NetworkCharacter.h" +#include "NetworkPlayer.h" +#include "EffectFunctionLibrary.h" + +AEffect* UEffectFunctionLibrary::CreateEffect(UObject* worldContextObject, TSubclassOf effectClass, + class AActor* followObject, float startTime, float durationOverride, bool clientSideOnly) +{ + UWorld* world = GEngine->GetWorldFromContextObject(worldContextObject); + if(!effectClass) + { + GWERROR(L"Can't create effect, class not set"); + return nullptr; + } + if(!world) + { + GWERROR(L"Can't create effect, world not set"); + return nullptr; + } + if(!world->GetAuthGameMode()) + return nullptr; // Only server can spawn replicated effects + + FTransform spawnTransform = FTransform::Identity; + if(followObject) + { + spawnTransform = followObject->GetTransform(); + } + + else + { + AActor* spawnActor = Cast(worldContextObject); + if(spawnActor) + spawnTransform = spawnActor->GetTransform(); + } + + spawnTransform.SetScale3D(FVector(1.0f, 1.0f, 1.0f)); // Reset scale, only inherit parent position + rotation + + AEffect* pfx = world->SpawnActorDeferred(effectClass, spawnTransform); + if(!pfx) + return nullptr; + pfx->m_lifeTime = startTime; + pfx->Init(durationOverride, followObject, clientSideOnly); + UGameplayStatics::FinishSpawningActor(pfx, spawnTransform); + return pfx; +} + + + AEffect* UEffectFunctionLibrary::CreateEffectAt(UObject* worldContextObject, TSubclassOf effectClass, + const FTransform& transform, float startTime, float durationOverride, bool clientSideOnly) + { + UWorld* world = GEngine->GetWorldFromContextObject(worldContextObject); + if (!effectClass) + { + GWERROR(L"Can't create effect, class not set"); + return nullptr; + } + if (!world) + { + GWERROR(L"Can't create effect, world not set"); + return nullptr; + } + if (!world->GetAuthGameMode()) + return nullptr; // Only server can spawn replicated effects + AEffect* pfx = world->SpawnActorDeferred(effectClass, transform); + check(pfx); + pfx->m_lifeTime = startTime; + pfx->Init(durationOverride, nullptr, clientSideOnly); + + UGameplayStatics::FinishSpawningActor(pfx, transform); + return pfx; + } + + AEffect* UEffectFunctionLibrary::CreateEffectAttached(UObject* worldContextObject, TSubclassOf effectClass, + const FTransform& transform, USceneComponent* InParent, FName InSocketName, EAttachLocation::Type AttachLocationType, float startTime, float durationOverride, bool clientSideOnly) + { + UWorld* world = GEngine->GetWorldFromContextObject(worldContextObject); + if (!effectClass) + { + GWERROR(L"Can't create effect, class not set"); + return nullptr; + } + if (!world) + { + GWERROR(L"Can't create effect, world not set"); + return nullptr; + } + if (!world->GetAuthGameMode()) + return nullptr; // Only server can spawn replicated effects + AEffect* pfx = world->SpawnActorDeferred(effectClass, transform); + check(pfx); + pfx->m_lifeTime = startTime; + pfx->Init(durationOverride, nullptr, clientSideOnly); + UGameplayStatics::FinishSpawningActor(pfx, transform); + pfx->AttachRootComponentTo(InParent, InSocketName, AttachLocationType); + return pfx; + } + +AAbilityIndicator * UEffectFunctionLibrary::CreateAbilityIndicator(TSubclassOf AAbilityIndicatorClass, ANetworkCharacter* spawner, AActor* followObject, FVector scale, float durationOverride, bool center) +{ + if (!spawner) + { + FWERROR(L"Can't create abilityIndicator, spawner not set"); + return nullptr; + } + //transforming from cm to m duo to 4.11 + FVector newscale = scale * 0.01f; + UWorld* world = spawner->GetWorld(); + FTransform spawnTransform = spawner->GetTransform(); + AAbilityIndicator* pai = world->SpawnActorDeferred(AAbilityIndicatorClass, spawnTransform); + check(pai); + if (center) + pai->Init(durationOverride, FVector(0, 0.0, 0), FRotator(0, 90, 0), newscale * 0.5f, center, followObject, pai->teamData->GetTeamColor(spawner->GetTeam())); + else + pai->Init(durationOverride, FVector(0, scale.Y, 0) + FVector(0,100,0), FRotator(0, 90, 0), newscale * 0.5f, center, followObject, pai->teamData->GetTeamColor(spawner->GetTeam())); + UGameplayStatics::FinishSpawningActor(pai, spawnTransform); + return pai; +} + +AAbilityIndicator * UEffectFunctionLibrary::CreateAbilityIndicatorAt(TSubclassOf AAbilityIndicatorClass, ANetworkCharacter * spawner, const FTransform& transform, FVector scale, float durationOverride, bool center) +{ + if (!spawner) + { + FWERROR(L"Can't create abilityIndicator, spawner not set"); + return nullptr; + } + FVector newscale = scale * 0.01f; + UWorld* world = spawner->GetWorld(); + FTransform spawnTransform = transform; + AAbilityIndicator* pai = world->SpawnActorDeferred(AAbilityIndicatorClass, spawnTransform); + check(pai); + if (center) + pai->Init(durationOverride, FVector(0, 0.0, 0), FRotator(0, 90, 0), newscale * 0.5f, center, nullptr, pai->teamData->GetTeamColor(spawner->GetTeam())); + else + pai->Init(durationOverride, FVector(0, scale.Y * 0.5f, 0), FRotator(0, 90, 0), newscale * 0.5f, center, nullptr, pai->teamData->GetTeamColor(spawner->GetTeam())); + UGameplayStatics::FinishSpawningActor(pai, spawnTransform); + return pai; +} + +void UEffectFunctionLibrary::PlaySoundEffect2D(UObject* worldContextObject, USoundBase* sound) +{ + UWorld* world = GEngine->GetWorldFromContextObject(worldContextObject); + float volume = Cast(world->GetGameInstance())->GetPrefs()->sfxVolume; + UGameplayStatics::PlaySound2D(worldContextObject, sound, volume); +} + +void UEffectFunctionLibrary::DuplicateAppearance(ACharacterBase* from, ACharacterBase* to) +{ + if (from == nullptr) + { + FWARNING("from == nullptr"); + return; + } + USkeletalMeshComponent* fromMesh = from->GetMesh(); + if (fromMesh == nullptr) + { + FWARNING("from->mesh == nullptr"); + return; + } + if (to == nullptr) + { + FWARNING("to == nullptr"); + return; + } + // Copy equiped items + TArray> itemsToSpawn; + for(auto i : from->GetEquipedItems()) + { + itemsToSpawn.Add(i->GetClass()); + } + to->EquipItems(itemsToSpawn); + + // Copy CUstomization + to->SetCustomizations(from->GetCharacterCustomization()); + + to->playerName = from->playerName; + + return; +} \ No newline at end of file diff --git a/Source/UnrealProject/Effects/EffectFunctionLibrary.h b/Source/UnrealProject/Effects/EffectFunctionLibrary.h new file mode 100644 index 0000000..7c6379a --- /dev/null +++ b/Source/UnrealProject/Effects/EffectFunctionLibrary.h @@ -0,0 +1,42 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Kismet/BlueprintFunctionLibrary.h" +#include "EffectFunctionLibrary.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API UEffectFunctionLibrary : public UBlueprintFunctionLibrary +{ + GENERATED_BODY() + +public: + UFUNCTION(BlueprintCallable, Category = "Effect", meta = (WorldContext="worldContextObject")) + static class AEffect* CreateEffect(UObject* worldContextObject, TSubclassOf effectClass, + class AActor* followObject = nullptr, float startTime = 0.0f, float durationOverride = 0.0f, bool clientSideOnly = false); + + UFUNCTION(BlueprintCallable, Category = "Effect", meta = (WorldContext = "worldContextObject")) + static class AEffect* CreateEffectAt(UObject* worldContextObject, TSubclassOf effectClass, + const FTransform& transform, float startTime = 0.0f, float durationOverride = 0.0f, bool clientSideOnly = false); + + UFUNCTION(BlueprintCallable, Category = "Effect", meta = (WorldContext = "worldContextObject")) + static class AEffect* CreateEffectAttached(UObject* worldContextObject, TSubclassOf effectClass, + const FTransform& transform, USceneComponent* InParent, FName InSocketName, EAttachLocation::Type AttachLocationType, float startTime = 0.0f, float durationOverride = 0.0f, bool clientSideOnly = false); + + UFUNCTION(BlueprintCallable, Category = "Effect") + static class AAbilityIndicator* CreateAbilityIndicator(TSubclassOf AAbilityIndicatorClass, + class ANetworkCharacter* spawner, class AActor* followObject, FVector scale, float durationOverride = 0.0f, bool center = true); + + UFUNCTION(BlueprintCallable, Category = "Effect") + static class AAbilityIndicator* CreateAbilityIndicatorAt(TSubclassOf AAbilityIndicatorClass, ANetworkCharacter * spawner, const FTransform& transform, FVector scale, float durationOverride, bool center); + + UFUNCTION(BlueprintCallable, Category = "Effect", meta = (WorldContext="worldContextObject")) + static void PlaySoundEffect2D(UObject* worldContextObject, USoundBase* sound); + + //from is the character who's skeleton is cloned, to is who gets the cloned skeleton + UFUNCTION(BlueprintCallable, Category = "Effect") + static void DuplicateAppearance(class ACharacterBase* from, class ACharacterBase* to); +}; diff --git a/Source/UnrealProject/Effects/TeamData.cpp b/Source/UnrealProject/Effects/TeamData.cpp new file mode 100644 index 0000000..138c442 --- /dev/null +++ b/Source/UnrealProject/Effects/TeamData.cpp @@ -0,0 +1,20 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "TeamData.h" + + + + +FLinearColor UTeamData::GetTeamColor(int32 team) +{ + + for (FTeamDataStruct it : teamColors) + { + if (it.team == team) + { + return it.color; + } + } + return FLinearColor(1, 1, 1, 1); +} \ No newline at end of file diff --git a/Source/UnrealProject/Effects/TeamData.h b/Source/UnrealProject/Effects/TeamData.h new file mode 100644 index 0000000..3ec65d1 --- /dev/null +++ b/Source/UnrealProject/Effects/TeamData.h @@ -0,0 +1,36 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Engine/DataAsset.h" +#include "TeamData.generated.h" + +/** + * + */ + +USTRUCT() +struct UNREALPROJECT_API FTeamDataStruct +{ + GENERATED_BODY() +public: + UPROPERTY(EditDefaultsOnly) + int32 team; + UPROPERTY(EditDefaultsOnly) + FLinearColor color; +}; + + +UCLASS(BlueprintType) +class UNREALPROJECT_API UTeamData : public UDataAsset +{ + GENERATED_BODY() + +public: + UPROPERTY(EditDefaultsOnly) + TArray teamColors; + + UFUNCTION(BlueprintCallable, Category="Team Data") + FLinearColor GetTeamColor(int32 team); + +}; diff --git a/Source/UnrealProject/External/Events.hpp b/Source/UnrealProject/External/Events.hpp new file mode 100644 index 0000000..128adb8 --- /dev/null +++ b/Source/UnrealProject/External/Events.hpp @@ -0,0 +1,171 @@ +#pragma once + + +#pragma pack(push, 1) +enum class EventCode : uint8_t +{ + PlayerSpawn = 0, + PlayerUpdate, + PlayerDie, + PlayerCast, + PlayerHealth, + PlayerMana, + PlayerMaxHealth, + PlayerMaxMana, + PlayerDealDamage, + PlayerLevel, + SessionEnd, + + MetaEvents = 64, + + MapData, + MapImage, + PlayerName, + PlayerTeam, + AbilityName, +}; + +struct PlayerSpawn +{ + PlayerSpawn() = default; + PlayerSpawn(uint32_t time, uint8_t player, float playerX, float playerY) : event(EventCode::PlayerSpawn), time(time), player(player), playerX(playerX), playerY(playerY) {} + EventCode event; + uint32_t time; + uint8_t player; + float playerX; + float playerY; +}; +struct PlayerUpdate +{ + PlayerUpdate() = default; + PlayerUpdate(uint32_t time, uint8_t player, float playerX, float playerY) : event(EventCode::PlayerUpdate), time(time), player(player), playerX(playerX), playerY(playerY) {} + EventCode event; + uint32_t time; + uint8_t player; + float playerX; + float playerY; +}; +struct PlayerDie +{ + PlayerDie() = default; + PlayerDie(uint32_t time, uint8_t player, uint8_t source) : event(EventCode::PlayerDie), time(time), player(player), source(source) {} + EventCode event; + uint32_t time; + uint8_t player; + uint8_t source; +}; +struct PlayerCast +{ + PlayerCast() = default; + PlayerCast(uint32_t time, uint8_t player, uint32_t ability) : event(EventCode::PlayerCast), time(time), player(player), ability(ability) {} + EventCode event; + uint32_t time; + uint8_t player; + uint32_t ability; +}; +struct PlayerHealth +{ + PlayerHealth() = default; + PlayerHealth(uint32_t time, uint8_t player, int32_t health) : event(EventCode::PlayerHealth), time(time), player(player), health(health) {} + EventCode event; + uint32_t time; + uint8_t player; + int32_t health; +}; +struct PlayerMana +{ + PlayerMana() = default; + PlayerMana(uint32_t time, uint8_t player, int32_t mana) : event(EventCode::PlayerMana), time(time), player(player), mana(mana) {} + EventCode event; + uint32_t time; + uint8_t player; + int32_t mana; +}; +struct PlayerMaxHealth +{ + PlayerMaxHealth() = default; + PlayerMaxHealth(uint32_t time, uint8_t player, int32_t maxHealth) : event(EventCode::PlayerMaxHealth), time(time), player(player), maxHealth(maxHealth) {} + EventCode event; + uint32_t time; + uint8_t player; + int32_t maxHealth; +}; +struct PlayerMaxMana +{ + PlayerMaxMana() = default; + PlayerMaxMana(uint32_t time, uint8_t player, int32_t maxMana) : event(EventCode::PlayerMaxMana), time(time), player(player), maxMana(maxMana) {} + EventCode event; + uint32_t time; + uint8_t player; + int32_t maxMana; +}; +struct PlayerDealDamage +{ + PlayerDealDamage() = default; + PlayerDealDamage(uint32_t time, uint8_t player, uint32_t ability, int32_t damage) : event(EventCode::PlayerDealDamage), time(time), player(player), ability(ability), damage(damage) {} + EventCode event; + uint32_t time; + uint8_t player; + uint32_t ability; + int32_t damage; +}; +struct PlayerLevel +{ + PlayerLevel() = default; + PlayerLevel(uint32_t time, uint8_t player, uint8_t level) : event(EventCode::PlayerLevel), time(time), player(player), level(level) {} + EventCode event; + uint32_t time; + uint8_t player; + uint8_t level; +}; +struct SessionEnd +{ + SessionEnd() = default; + SessionEnd(uint32_t time) : event(EventCode::SessionEnd), time(time) {} + EventCode event; + uint32_t time; +}; + +struct MapData +{ + MapData() = default; + MapData(float minX, float maxX, float minY, float maxY) : event(EventCode::MapData), minX(minX), maxX(maxX), minY(minY), maxY(maxY) {} + EventCode event; + float minX; + float maxX; + float minY; + float maxY; +}; +struct MapImage +{ + MapImage() = default; + MapImage(uint32_t width, uint32_t height) : event(EventCode::MapImage), width(width), height(height) {} + EventCode event; + uint32_t width; + uint32_t height; +}; +struct PlayerName +{ + PlayerName() = default; + PlayerName(uint8_t player, uint16_t length) : event(EventCode::PlayerName), player(player), length(length) {} + EventCode event; + uint8_t player; + uint16_t length; +}; +struct PlayerTeam +{ + PlayerTeam() = default; + PlayerTeam(uint8_t player, uint8_t team) : event(EventCode::PlayerTeam), player(player), team(team) {} + EventCode event; + uint8_t player; + uint8_t team; +}; +struct AbilityName +{ + AbilityName() = default; + AbilityName(uint32_t ability, uint16_t length) : event(EventCode::AbilityName), ability(ability), length(length) {} + EventCode event; + uint32_t ability; + uint16_t length; +}; +#pragma pack(pop) \ No newline at end of file diff --git a/Source/UnrealProject/External/HeatMapMetrics.cpp b/Source/UnrealProject/External/HeatMapMetrics.cpp new file mode 100644 index 0000000..5abdcb4 --- /dev/null +++ b/Source/UnrealProject/External/HeatMapMetrics.cpp @@ -0,0 +1,96 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" + +#if PLATFORM_SPECIFIC_WIN == 0 + +#include "HeatMapMetrics.h" + +#include +#include +#include +#include +#include + + +using namespace std; + +float HeatMapMetrics::s_timeMap[3][512][512]; + +void HeatMapMetrics::ResetMap() +{ + memset(&s_timeMap, 0, sizeof(s_timeMap)); +} + +void HeatMapMetrics::AddTime(FVector2D position, float time, size_t team) +{ + position *= 512.0f; + s_timeMap[team][(int)position.Y][(int)position.X] += time; +} + +void HeatMapMetrics::ExportToFile() +{ + char* envPath; + size_t envPathSize; + getenv_s(&envPathSize, NULL, 0, "APPDATA"); + if (envPathSize == 0) + { + TERROR("APPDATA does not exist."); + return; + } + + envPath = (char*)malloc(envPathSize * sizeof(char)); + if (!envPath) + { + TERROR("Failed to allocate memory."); + return; + } + + getenv_s(&envPathSize, envPath, envPathSize, "APPDATA"); + + + string path = envPath; + + free(envPath); + + path.append("\\Haxis\\HaxisHeatmap"); + path.append(m_GetCurrentDateTime()); + path.append(".HME"); + fstream fs; + fs.open(path.c_str(), fstream::out | fstream::binary); + if (!fs.is_open()) + { + TERROR("failed to export metrics"); + return; + } + + fs.write((char*)&s_timeMap[0][0][0], sizeof(s_timeMap)); + + fs.close(); +} + +void HeatMapMetrics::m_RetrieveCurrentTM(std::tm& a_TM) +{ + time_t currentTime = time(0); + localtime_s(&a_TM, ¤tTime); +} +string HeatMapMetrics::m_GetCurrentTime() +{ + tm tstruct; + char buffer[80]; + m_RetrieveCurrentTM(tstruct); + strftime(buffer, sizeof(buffer), "(%H:%M:%S) ", &tstruct); + + return buffer; +} +string HeatMapMetrics::m_GetCurrentDateTime() +{ + tm tstruct; + char buffer[80]; + m_RetrieveCurrentTM(tstruct); + strftime(buffer, sizeof(buffer), "%Y-%m-%d_%H-%M-%S", &tstruct); + + return buffer; +} + +#endif \ No newline at end of file diff --git a/Source/UnrealProject/External/HeatMapMetrics.h b/Source/UnrealProject/External/HeatMapMetrics.h new file mode 100644 index 0000000..cf2967a --- /dev/null +++ b/Source/UnrealProject/External/HeatMapMetrics.h @@ -0,0 +1,27 @@ +// Project Lab - NHTV Igad + +#pragma once + +#if PLATFORM_SPECIFIC_WIN == 0 + +#include +#include +/** + * + */ + +class UNREALPROJECT_API HeatMapMetrics +{ +public: + static void AddTime(struct FVector2D position, float time, size_t team); + static void ExportToFile(); + static void ResetMap(); +protected: + static void m_RetrieveCurrentTM(std::tm& a_TM); + static std::string m_GetCurrentTime(); + static std::string m_GetCurrentDateTime(); +private: + static float s_timeMap[3][512][512]; +}; + +#endif \ No newline at end of file diff --git a/Source/UnrealProject/External/InputDeviceBases.hpp b/Source/UnrealProject/External/InputDeviceBases.hpp new file mode 100644 index 0000000..9e82a50 --- /dev/null +++ b/Source/UnrealProject/External/InputDeviceBases.hpp @@ -0,0 +1,46 @@ +#ifndef _HEADER_INPUT_DEVICE_BASES +#define _HEADER_INPUT_DEVICE_BASES + +#include "InputEnums.hpp" +#include "TeaVector2.hpp" +#include "TeaVector3.hpp" + +namespace Input +{ + enum InputDeviceType + { + IDT_NONE, + IDT_NOTDEFINED, + IDT_XBOX, + IDT_DS4 + }; + + class InputDevice + { + public: + virtual void Update() = 0; + }; + + class Keyboard : public InputDevice + { + public: + virtual bool GetKey(const InputKey a_Key) = 0; + virtual bool GetKeyDown(const InputKey a_Key) = 0; + }; + class Joystick : public InputDevice + { + public: + virtual ~Joystick() {}; + virtual bool GetButton(const InputJoystickButton a_JoystickButton) = 0; + virtual bool GetButton(const InputJoystickPhysical a_JoystickButton) = 0; + virtual bool GetButtonDown(const InputJoystickButton a_JoystickButton) = 0; + virtual bool GetButtonDown(const InputJoystickPhysical a_JoystickButton) = 0; + virtual bool GetButtonUp(const InputJoystickButton a_JoystickButton) = 0; + virtual bool GetButtonUp(const InputJoystickPhysical a_JoystickButton) = 0; + virtual bool IsValid() = 0; + virtual TeaLib::Math::Vector2f GetDelta(const InputJoystickAxis a_InputStick) = 0; + virtual InputDeviceType GetDeviceType() = 0; + }; +} + +#endif diff --git a/Source/UnrealProject/External/InputEnums.hpp b/Source/UnrealProject/External/InputEnums.hpp new file mode 100644 index 0000000..f03811b --- /dev/null +++ b/Source/UnrealProject/External/InputEnums.hpp @@ -0,0 +1,285 @@ +#ifndef _HEADER_INPUT_ENUMS +#define _HEADER_INPUT_ENUMS + +namespace Input +{ + + // Keyboard input keys + enum InputKey : unsigned char + { + IK_ESCAPE = 0x01, + IK_1 = 0x02, + IK_2 = 0x03, + IK_3 = 0x04, + IK_4 = 0x05, + IK_5 = 0x06, + IK_6 = 0x07, + IK_7 = 0x08, + IK_8 = 0x09, + IK_9 = 0x0A, + IK_0 = 0x0B, + IK_MINUS = 0x0C, + IK_EQUALS = 0x0D, + IK_BACK = 0x0E, + IK_TAB = 0x0F, + IK_Q = 0x10, + IK_W = 0x11, + IK_E = 0x12, + IK_R = 0x13, + IK_T = 0x14, + IK_Y = 0x15, + IK_U = 0x16, + IK_I = 0x17, + IK_O = 0x18, + IK_P = 0x19, + IK_LBRACKET = 0x1A, + IK_RBRACKET = 0x1B, + IK_RETURN = 0x1C, + IK_LCONTROL = 0x1D, + IK_A = 0x1E, + IK_S = 0x1F, + IK_D = 0x20, + IK_F = 0x21, + IK_G = 0x22, + IK_H = 0x23, + IK_J = 0x24, + IK_K = 0x25, + IK_L = 0x26, + IK_SEMICOLON = 0x27, + IK_APOSTROPHE = 0x28, + IK_GRAVE = 0x29, + IK_LSHIFT = 0x2A, + IK_BACKSLASH = 0x2B, + IK_Z = 0x2C, + IK_X = 0x2D, + IK_C = 0x2E, + IK_V = 0x2F, + IK_B = 0x30, + IK_N = 0x31, + IK_M = 0x32, + IK_COMMA = 0x33, + IK_PERIOD = 0x34, + IK_SLASH = 0x35, + IK_RSHIFT = 0x36, + IK_MULTIPLY = 0x37, + IK_LMENU = 0x38, + IK_SPACE = 0x39, + IK_CAPITAL = 0x3A, + IK_F1 = 0x3B, + IK_F2 = 0x3C, + IK_F3 = 0x3D, + IK_F4 = 0x3E, + IK_F5 = 0x3F, + IK_F6 = 0x40, + IK_F7 = 0x41, + IK_F8 = 0x42, + IK_F9 = 0x43, + IK_F10 = 0x44, + IK_NUMLOCK = 0x45, + IK_SCROLL = 0x46, + IK_NUMPAD7 = 0x47, + IK_NUMPAD8 = 0x48, + IK_NUMPAD9 = 0x49, + IK_SUBTRACT = 0x4A, + IK_NUMPAD4 = 0x4B, + IK_NUMPAD5 = 0x4C, + IK_NUMPAD6 = 0x4D, + IK_ADD = 0x4E, + IK_NUMPAD1 = 0x4F, + IK_NUMPAD2 = 0x50, + IK_NUMPAD3 = 0x51, + IK_NUMPAD0 = 0x52, + IK_DECIMAL = 0x53, + IK_OEM_102 = 0x56, + IK_F11 = 0x57, + IK_F12 = 0x58, + IK_F13 = 0x64, + IK_F14 = 0x65, + IK_F15 = 0x66, + IK_KANA = 0x70, + IK_ABNT_C1 = 0x73, + IK_CONVERT = 0x79, + IK_NOCONVERT = 0x7B, + IK_YEN = 0x7D, + IK_ABNT_C2 = 0x7E, + IK_NUMPADEQUALS = 0x8D, + IK_PREVTRACK = 0x90, + IK_AT = 0x91, + IK_COLON = 0x92, + IK_UNDERLINE = 0x93, + IK_KANJI = 0x94, + IK_STOP = 0x95, + IK_AX = 0x96, + IK_UNLABELED = 0x97, + IK_NEXTTRACK = 0x99, + IK_NUMPADENTER = 0x9C, + IK_RCONTROL = 0x9D, + IK_MUTE = 0xA0, + IK_CALCULATOR = 0xA1, + IK_PLAYPAUSE = 0xA2, + IK_MEDIASTOP = 0xA4, + IK_VOLUMEDOWN = 0xAE, + IK_VOLUMEUP = 0xB0, + IK_WEBHOME = 0xB2, + IK_NUMPADCOMMA = 0xB3, + IK_DIVIDE = 0xB5, + IK_SYSRQ = 0xB7, + IK_RMENU = 0xB8, + IK_PAUSE = 0xC5, + IK_HOME = 0xC7, + IK_UP = 0xC8, + IK_PRIOR = 0xC9, + IK_LEFT = 0xCB, + IK_RIGHT = 0xCD, + IK_END = 0xCF, + IK_DOWN = 0xD0, + IK_NEXT = 0xD1, + IK_INSERT = 0xD2, + IK_DELETE = 0xD3, + IK_LWIN = 0xDB, + IK_RWIN = 0xDC, + IK_APPS = 0xDD, + IK_POWER = 0xDE, + IK_SLEEP = 0xDF, + IK_WAKE = 0xE3, + IK_WEBSEARCH = 0xE5, + IK_WEBFAVORITES = 0xE6, + IK_WEBREFRESH = 0xE7, + IK_WEBSTOP = 0xE8, + IK_WEBFORWARD = 0xE9, + IK_WEBBACK = 0xEA, + IK_MYCOMPUTER = 0xEB, + IK_MAIL = 0xEC, + IK_MEDIASELECT = 0xED, + IK_BACKSPACE = IK_BACK, + IK_NUMPADSTAR = IK_MULTIPLY, + IK_LALT = IK_LMENU, + IK_CAPSLOCK = IK_CAPITAL, + IK_NUMPADMINUS = IK_SUBTRACT, + IK_NUMPADPLUS = IK_ADD, + IK_NUMPADPERIOD = IK_DECIMAL, + IK_NUMPADSLASH = IK_DIVIDE, + IK_RALT = IK_RMENU, + IK_UPARROW = IK_UP, + IK_PGUP = IK_PRIOR, + IK_LEFTARROW = IK_LEFT, + IK_RIGHTARROW = IK_RIGHT, + IK_DOWNARROW = IK_DOWN, + IK_PGDN = IK_NEXT, + }; + + // Joystick axis + enum InputJoystickAxis + { + IJA_LSTICK, + IJA_RSTICK, + IJA_LRTRIGGER, + IJA_DPAD, + }; + + // Joystick buttons + enum InputJoystickButton : unsigned char + { + IJB_BUTTON0, + IJB_BUTTON1, + IJB_BUTTON2, + IJB_BUTTON3, + IJB_BUTTON4, + IJB_BUTTON5, + IJB_BUTTON6, + IJB_BUTTON7, + IJB_BUTTON8, + IJB_BUTTON9, + IJB_BUTTON10, + IJB_BUTTON11, + IJB_BUTTON12, + IJB_BUTTON13, + IJB_BUTTON14, + IJB_BUTTON15, + IJB_BUTTON16, + IJB_BUTTON17, + IJB_BUTTON18, + IJB_BUTTON19, + IJB_BUTTON20, + IJB_BUTTON21, + IJB_BUTTON22, + IJB_BUTTON23, + IJB_BUTTON24, + IJB_BUTTON25, + IJB_BUTTON26, + IJB_BUTTON27, + IJB_BUTTON28, + IJB_BUTTON29, + IJB_BUTTON30, + IJB_BUTTON31, + IJB_DPADUP = 200, + IJB_DPADRIGHT = 201, + IJB_DPADLEFT = 202, + IJB_DPADDOWN = 203, + // Xbox 360 buttons + IJB_XBOXA = IJB_BUTTON0, + IJB_XBOXB = IJB_BUTTON1, + IJB_XBOXX = IJB_BUTTON2, + IJB_XBOXY = IJB_BUTTON3, + IJB_XBOXLB = IJB_BUTTON4, + IJB_XBOXRB = IJB_BUTTON5, + IJB_XBOXBACK = IJB_BUTTON6, + IJB_XBOXSTART = IJB_BUTTON7, + IJB_XBOXLEFTSTICK = IJB_BUTTON8, + IJB_XBOXRIGHTSTICK = IJB_BUTTON9, + IJB_XBOXDPADUP = IJB_DPADUP, + IJB_XBOXDPADRIGHT = IJB_DPADRIGHT, + IJB_XBOXDPADLEFT = IJB_DPADLEFT, + IJB_XBOXDPADDOWN = IJB_DPADDOWN, + IJB_XBOXLT = 204, + IJB_XBOXRT = 205, + // Dualshock 4 buttons + IJB_DS4SQUARE = IJB_BUTTON0, + IJB_DS4CROSS = IJB_BUTTON1, + IJB_DS4CIRCLE = IJB_BUTTON2, + IJB_DS4TRIANGLE = IJB_BUTTON3, + IJB_DS4L1 = IJB_BUTTON4, + IJB_DS4R1 = IJB_BUTTON5, + IJB_DS4L2 = IJB_BUTTON6, + IJB_DS4R2 = IJB_BUTTON7, + IJB_DS4SHARE = IJB_BUTTON8, + IJB_DS4OPTIONS = IJB_BUTTON9, + IJB_DS4LEFTSTICK = IJB_BUTTON10, + IJB_DS4RIGHTSTICK = IJB_BUTTON11, + IJB_DS4PLAYSTATION = IJB_BUTTON12, + IJB_DS4TOUCH = IJB_BUTTON13, + IJB_DS4DPADUP = IJB_DPADUP, + IJB_DS4DPADRIGHT = IJB_DPADRIGHT, + IJB_DS4DPADLEFT = IJB_DPADLEFT, + IJB_DS4DPADDOWN = IJB_DPADDOWN, + }; + + enum InputJoystickPhysical : unsigned char + { + IJP_FACEDOWN = 0, + IJP_FACERIGHT = 1, + IJP_FACELEFT = 2, + IJP_FACEUP = 3, + IJP_DPADDOWN = 4, + IJP_DPADRIGHT = 5, + IJP_DPADLEFT = 6, + IJP_DPADUP = 7, + IJP_SHOULDERRIGHT = 8, + IJP_SHOULDERLEFT = 9, + IJP_TRIGGERRIGHT = 10, + IJP_TRIGGERLEFT = 11, + IJP_START = 12, + IJP_SELECT = 13, + IJP_STICKLEFT = 14, + IJP_STICKRIGHT = 15, + }; + + enum InputManagerEvent : unsigned char + { + IME_PRESSED = 0, + IME_RELEASED = 1, + IME_REPEAT = 2, + }; +} + +#endif diff --git a/Source/UnrealProject/External/InputManager.cpp b/Source/UnrealProject/External/InputManager.cpp new file mode 100644 index 0000000..45d4dc7 --- /dev/null +++ b/Source/UnrealProject/External/InputManager.cpp @@ -0,0 +1,688 @@ +#include "UnrealProject.h" +#if PLATFORM_SPECIFIC_WIN == 0 + +#define _SOURCE_INPUT_MANAGER +#include "InputManager.hpp" + +#include "AllowWindowsPlatformTypes.h" + +#pragma comment(lib, "dinput8.lib") +#pragma comment (lib, "dxguid.lib") + +#define DIRECTINPUT_VERSION 0x0800 +#include + +#include +#include + +using namespace std; + +#define DUALSHOCK4PRODUCTDATA (0x05C4054CUL) +#define DUALSHOCK4DEVTYPE (0x00010318UL) +#define WIREDXBOXDEVTYPE (0x00010215UL) +#define PI 3.14159265359f + +namespace Input +{ + struct GUID_Impl + { + GUID instance; + DWORD devType; + unsigned long productData1; + }; + + + LPDIRECTINPUT8 g_DirectInput; + HWND g_HWND; + InputManager* InputManager::s_instance; + bool InputManager::s_isInitialized = false; + vector g_GUIDs; + + bool InputManager::IsInitialized() + { + return s_isInitialized; + } + bool InputManager::Initialize() + { + if (!IsInitialized()) + { + g_HWND = GetActiveWindow(); + HRESULT hr; + HINSTANCE hInstance = GetModuleHandle(nullptr); + + hr = DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&g_DirectInput, NULL); + + if (FAILED(hr)) + { + return false; + } + + s_instance = new InputManager(); + + + s_isInitialized = true; + return true; + } + return false; + } + void InputManager::Cleanup() + { + if (IsInitialized()) + { + delete s_instance; + s_instance = nullptr; + g_DirectInput->Release(); + s_isInitialized = false; + } + } + InputManager* InputManager::GetInstance() + { + if (!s_isInitialized) + Initialize(); + return s_instance; + } + + + // Implementation of Input Devices + class Keyboard_Impl : public Keyboard + { + public: + Keyboard_Impl() + { + HRESULT hr; + + hr = g_DirectInput->CreateDevice(GUID_SysKeyboard, &m_Device, NULL); + if (FAILED(hr)) + { + } + hr = m_Device->SetDataFormat(&c_dfDIKeyboard); + if (FAILED(hr)) + { + } + hr = m_Device->SetCooperativeLevel(g_HWND, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE); + if (FAILED(hr)) + { + } + } + ~Keyboard_Impl() + { + m_Device->Unacquire(); + } + virtual void Update() override final + { + HRESULT hr; + hr = m_Device->Acquire(); + memcpy(m_PreviousState, m_CurrentState, sizeof(BYTE) * 256); + m_Device->GetDeviceState(sizeof(m_CurrentState), (LPVOID)&m_CurrentState); + } + virtual bool GetKey(const InputKey a_Key) override final + { + return (m_CurrentState[a_Key] & 0x80) != 0; + } + virtual bool GetKeyDown(const InputKey a_Key) override final + { + return m_CurrentState[a_Key] & 0x80 && !(m_PreviousState[a_Key] & 0x80); + } + + private: + IDirectInputDevice8* m_Device; + BYTE m_CurrentState[256]; + BYTE m_PreviousState[256]; + }; + class Joystick_Impl : public Joystick + { + public: + Joystick_Impl(IDirectInputDevice8* a_Device) + { + HRESULT hr; + + m_Device = a_Device; + + hr = m_Device->SetDataFormat(&c_dfDIJoystick); + if (FAILED(hr)) + { + } + hr = m_Device->SetCooperativeLevel(g_HWND, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE); + if (FAILED(hr)) + { + } + } + virtual ~Joystick_Impl() + { + m_Device->Unacquire(); + m_Device->Release(); + } + virtual void Update() override final + { + HRESULT hr; + + m_PreviousState = m_CurrentState; + hr = m_Device->Acquire(); + if (FAILED(hr)) + { + m_IsValid = false; + return; + } + hr = m_Device->GetDeviceState(sizeof(DIJOYSTATE), (LPVOID)&m_CurrentState); + if (FAILED(hr)) + { + m_IsValid = false; + return; + } + m_IsValid = true; + } + virtual bool IsValid() override final + { + return m_IsValid; + } + virtual bool GetButton(const InputJoystickButton a_JoystickButton) + { + return (m_CurrentState.rgbButtons[a_JoystickButton] & 0x80) != 0; + } + virtual bool GetButton(const InputJoystickPhysical a_JoystickButton) + { + return false; + } + virtual bool GetButtonDown(const InputJoystickButton a_JoystickButton) + { + return m_CurrentState.rgbButtons[a_JoystickButton] & 0x80 && !(m_PreviousState.rgbButtons[a_JoystickButton] & 0x80); + } + virtual bool GetButtonDown(const InputJoystickPhysical a_JoystickButton) + { + return false; + } + virtual bool GetButtonUp(const InputJoystickButton a_JoystickButton) + { + return m_PreviousState.rgbButtons[a_JoystickButton] & 0x80 && !(m_CurrentState.rgbButtons[a_JoystickButton] & 0x80); + } + virtual bool GetButtonUp(const InputJoystickPhysical a_JoystickButton) + { + return false; + } + virtual TeaLib::Math::Vector2f GetDelta(const InputJoystickAxis a_InputStick) + { + if (IsValid()) + { + switch (a_InputStick) + { + case Input::IJA_LSTICK: + return TeaLib::Math::Vector2f((float)m_CurrentState.lX, (float)m_CurrentState.lY) / 32767.0f; + case Input::IJA_RSTICK: + return TeaLib::Math::Vector2f((float)m_CurrentState.lRx, (float)m_CurrentState.lRy) / 32767.0f; + case Input::IJA_LRTRIGGER: + return TeaLib::Math::Vector2f((float)m_CurrentState.lZ, (float)m_CurrentState.lRz) / 32767.0f; + default: + return TeaLib::Math::Vector2f(); + } + } + return TeaLib::Math::Vector2f(); + } + virtual InputDeviceType GetDeviceType() + { + return IDT_NOTDEFINED; + } + protected: + bool m_IsValid = false; + IDirectInputDevice8* m_Device; + DIJOYSTATE m_CurrentState, m_PreviousState; + }; + class JoystickDS4_Impl : public Joystick_Impl + { + public: + JoystickDS4_Impl(IDirectInputDevice8* a_Device) : Joystick_Impl(a_Device) + { + m_PhysicalBindings[IJP_FACEDOWN] = IJB_DS4CROSS; + m_PhysicalBindings[IJP_FACERIGHT] = IJB_DS4CIRCLE; + m_PhysicalBindings[IJP_FACELEFT] = IJB_BUTTON0; + m_PhysicalBindings[IJP_FACEUP] = IJB_BUTTON3; + m_PhysicalBindings[IJP_DPADDOWN] = IJB_DS4DPADDOWN; + m_PhysicalBindings[IJP_DPADRIGHT] = IJB_DS4DPADRIGHT; + m_PhysicalBindings[IJP_DPADLEFT] = IJB_DS4DPADLEFT; + m_PhysicalBindings[IJP_DPADUP] = IJB_DS4DPADUP; + m_PhysicalBindings[IJP_SHOULDERRIGHT] = IJB_DS4R1; + m_PhysicalBindings[IJP_SHOULDERLEFT] = IJB_DS4L1; + m_PhysicalBindings[IJP_TRIGGERRIGHT] = IJB_DS4R2; + m_PhysicalBindings[IJP_TRIGGERLEFT] = IJB_DS4L2; + m_PhysicalBindings[IJP_START] = IJB_DS4OPTIONS; + m_PhysicalBindings[IJP_SELECT] = IJB_DS4SHARE; + m_PhysicalBindings[IJP_STICKLEFT] = IJB_DS4LEFTSTICK; + m_PhysicalBindings[IJP_STICKRIGHT] = IJB_DS4RIGHTSTICK; + } + virtual bool GetButton(const InputJoystickButton a_JoystickButton) override final + { + if (a_JoystickButton < 200) + return (m_CurrentState.rgbButtons[a_JoystickButton] & 0x80) != 0; + else + { + switch (a_JoystickButton) + { + case Input::IJB_DS4DPADUP: + if (m_CurrentState.rgdwPOV[0] < 36000 && m_CurrentState.rgdwPOV[0] > 27000 || m_CurrentState.rgdwPOV[0] < 9000) + return true; + break; + case Input::IJB_DS4DPADRIGHT: + if (m_CurrentState.rgdwPOV[0] > 0 && m_CurrentState.rgdwPOV[0] < 18000) + return true; + break; + case Input::IJB_DS4DPADDOWN: + if (m_CurrentState.rgdwPOV[0] > 9000 && m_CurrentState.rgdwPOV[0] < 27000) + return true; + break; + case Input::IJB_DS4DPADLEFT: + if (m_CurrentState.rgdwPOV[0] > 18000 && m_CurrentState.rgdwPOV[0] < 36000) + return true; + break; + default: + break; + } + return false; + } + } + virtual bool GetButton(const InputJoystickPhysical a_JoystickButton) override final + { + return GetButton(m_PhysicalBindings[a_JoystickButton]); + } + virtual bool GetButtonDown(const InputJoystickButton a_JoystickButton) override final + { + if (a_JoystickButton < 200) + return m_CurrentState.rgbButtons[a_JoystickButton] & 0x80 && !(m_PreviousState.rgbButtons[a_JoystickButton] & 0x80); + else + { + switch (a_JoystickButton) + { + case Input::IJB_DS4DPADUP: + if (m_CurrentState.rgdwPOV[0] == 0 && m_PreviousState.rgdwPOV[0] != 0) + return true; + break; + case Input::IJB_DS4DPADRIGHT: + if (m_CurrentState.rgdwPOV[0] == 9000 && m_PreviousState.rgdwPOV[0] != 9000) + return true; + break; + case Input::IJB_DS4DPADDOWN: + if (m_CurrentState.rgdwPOV[0] == 18000 && m_PreviousState.rgdwPOV[0] != 18000) + return true; + break; + case Input::IJB_DS4DPADLEFT: + if (m_CurrentState.rgdwPOV[0] == 27000 && m_PreviousState.rgdwPOV[0] != 27000) + return true; + break; + default: + break; + } + return false; + } + } + virtual bool GetButtonDown(const InputJoystickPhysical a_JoystickButton) override final + { + return GetButtonDown(m_PhysicalBindings[a_JoystickButton]); + } + virtual bool GetButtonUp(const InputJoystickButton a_JoystickButton) override final + { + if (a_JoystickButton < 200) + return m_PreviousState.rgbButtons[a_JoystickButton] & 0x80 && !(m_CurrentState.rgbButtons[a_JoystickButton] & 0x80); + else + { + switch (a_JoystickButton) + { + case Input::IJB_DS4DPADUP: + if (m_PreviousState.rgdwPOV[0] == 0 && m_CurrentState.rgdwPOV[0] != 0) + return true; + break; + case Input::IJB_DS4DPADRIGHT: + if (m_PreviousState.rgdwPOV[0] == 9000 && m_CurrentState.rgdwPOV[0] != 9000) + return true; + break; + case Input::IJB_DS4DPADDOWN: + if (m_PreviousState.rgdwPOV[0] == 18000 && m_CurrentState.rgdwPOV[0] != 18000) + return true; + break; + case Input::IJB_DS4DPADLEFT: + if (m_PreviousState.rgdwPOV[0] == 27000 && m_CurrentState.rgdwPOV[0] != 27000) + return true; + break; + default: + break; + } + return false; + } + } + virtual bool GetButtonUp(const InputJoystickPhysical a_JoystickButton) override final + { + return GetButtonUp(m_PhysicalBindings[a_JoystickButton]); + } + virtual TeaLib::Math::Vector2f GetDelta(const InputJoystickAxis a_InputStick) override final + { + if (IsValid()) + { + float angle; + switch (a_InputStick) + { + case Input::IJA_LSTICK: + return TeaLib::Math::Vector2f((float)m_CurrentState.lX - 32767.0f, (float)m_CurrentState.lY - 32767.0f) / 32767.0f; + case Input::IJA_RSTICK: + return TeaLib::Math::Vector2f((float)m_CurrentState.lZ - 32767.0f, (float)m_CurrentState.lRz - 32767.0f) / 32767.0f; + case Input::IJA_LRTRIGGER: + return TeaLib::Math::Vector2f((float)m_CurrentState.lRx, (float)m_CurrentState.lRy) / 65534.0f; + case Input::IJA_DPAD: + if (m_PreviousState.rgdwPOV[0] < 90000) + { + angle = (((float)m_PreviousState.rgdwPOV[0] / 100.0f) * PI / 180.0f); + return TeaLib::Math::Vector2f(sinf(angle), -cosf(angle)); + } + return TeaLib::Math::Vector2f(); + default: + return TeaLib::Math::Vector2f(); + } + } + return TeaLib::Math::Vector2f(); + } + virtual InputDeviceType GetDeviceType() override final + { + return IDT_DS4; + } + private: + map m_PhysicalBindings; + }; + class JoystickXbox360_Impl : public Joystick_Impl + { + public: + JoystickXbox360_Impl(IDirectInputDevice8* a_Device) : Joystick_Impl(a_Device) + { + m_PhysicalBindings[IJP_FACEDOWN] = IJB_XBOXA; + m_PhysicalBindings[IJP_FACERIGHT] = IJB_XBOXB; + m_PhysicalBindings[IJP_FACELEFT] = IJB_XBOXX; + m_PhysicalBindings[IJP_FACEUP] = IJB_XBOXY; + m_PhysicalBindings[IJP_DPADDOWN] = IJB_XBOXDPADDOWN; + m_PhysicalBindings[IJP_DPADRIGHT] = IJB_XBOXDPADRIGHT; + m_PhysicalBindings[IJP_DPADLEFT] = IJB_XBOXDPADLEFT; + m_PhysicalBindings[IJP_DPADUP] = IJB_XBOXDPADUP; + m_PhysicalBindings[IJP_SHOULDERRIGHT] = IJB_XBOXRB; + m_PhysicalBindings[IJP_SHOULDERLEFT] = IJB_XBOXLB; + m_PhysicalBindings[IJP_TRIGGERRIGHT] = IJB_XBOXRT; + m_PhysicalBindings[IJP_TRIGGERLEFT] = IJB_XBOXLT; + m_PhysicalBindings[IJP_START] = IJB_XBOXSTART; + m_PhysicalBindings[IJP_SELECT] = IJB_XBOXBACK; + m_PhysicalBindings[IJP_STICKLEFT] = IJB_XBOXLEFTSTICK; + m_PhysicalBindings[IJP_STICKRIGHT] = IJB_XBOXRIGHTSTICK; + } + virtual TeaLib::Math::Vector2f GetDelta(const InputJoystickAxis a_InputStick) override final + { + if (IsValid()) + { + float result; + float angle; + switch (a_InputStick) + { + case Input::IJA_LSTICK: + return TeaLib::Math::Vector2f((float)m_CurrentState.lX - 32767.0f, (float)m_CurrentState.lY - 32767.0f) / 32767.0f; + case Input::IJA_RSTICK: + return TeaLib::Math::Vector2f((float)m_CurrentState.lRx - 32767.0f, (float)m_CurrentState.lRy - 32767.0f) / 32767.0f; + case Input::IJA_LRTRIGGER: + result = ((float)m_CurrentState.lZ - 32767.0f) / 32767.0f; + return TeaLib::Math::Vector2f(result, result); + case Input::IJA_DPAD: + if (m_PreviousState.rgdwPOV[0] < 90000) + { + angle = (((float)m_PreviousState.rgdwPOV[0] / 100.0f) * PI / 180.0f); + return TeaLib::Math::Vector2f(sinf(angle), -cosf(angle)); + } + return TeaLib::Math::Vector2f(); + default: + return TeaLib::Math::Vector2f(); + } + } + return TeaLib::Math::Vector2f(); + } + virtual bool GetButton(const InputJoystickButton a_JoystickButton) override final + { + if (a_JoystickButton < 200) + return (m_CurrentState.rgbButtons[a_JoystickButton] & 0x80) != 0; + else + { + float val; + switch (a_JoystickButton) + { + case Input::IJB_XBOXDPADUP: + if (m_CurrentState.rgdwPOV[0] < 36000 && m_CurrentState.rgdwPOV[0] > 27000 || m_CurrentState.rgdwPOV[0] < 9000) + return true; + break; + case Input::IJB_XBOXDPADRIGHT: + if (m_CurrentState.rgdwPOV[0] > 0 && m_CurrentState.rgdwPOV[0] < 18000) + return true; + break; + case Input::IJB_XBOXDPADDOWN: + if (m_CurrentState.rgdwPOV[0] > 9000 && m_CurrentState.rgdwPOV[0] < 27000) + return true; + break; + case Input::IJB_XBOXDPADLEFT: + if (m_CurrentState.rgdwPOV[0] > 18000 && m_CurrentState.rgdwPOV[0] < 36000) + return true; + break; + case Input::IJB_XBOXLT: + val = ((float)m_CurrentState.lZ - 32767.0f) / 32767.0f;; + return val > 0.1f; + case Input::IJB_XBOXRT: + val = ((float)m_CurrentState.lZ - 32767.0f) / 32767.0f;; + return val < -0.1f; + default: + break; + } + return false; + } + } + virtual bool GetButton(const InputJoystickPhysical a_JoystickButton) override final + { + return GetButton(m_PhysicalBindings[a_JoystickButton]); + } + virtual bool GetButtonDown(const InputJoystickButton a_JoystickButton) override final + { + if (a_JoystickButton < 200) + return m_CurrentState.rgbButtons[a_JoystickButton] & 0x80 && !(m_PreviousState.rgbButtons[a_JoystickButton] & 0x80); + else + { + float curr, prev; + switch (a_JoystickButton) + { + case Input::IJB_XBOXDPADUP: + if (m_CurrentState.rgdwPOV[0] == 0 && m_PreviousState.rgdwPOV[0] != 0) + return true; + break; + case Input::IJB_XBOXDPADRIGHT: + if (m_CurrentState.rgdwPOV[0] == 9000 && m_PreviousState.rgdwPOV[0] != 9000) + return true; + break; + case Input::IJB_XBOXDPADDOWN: + if (m_CurrentState.rgdwPOV[0] == 18000 && m_PreviousState.rgdwPOV[0] != 18000) + return true; + break; + case Input::IJB_XBOXDPADLEFT: + if (m_CurrentState.rgdwPOV[0] == 27000 && m_PreviousState.rgdwPOV[0] != 27000) + return true; + break; + case Input::IJB_XBOXLT: + curr = ((float)m_CurrentState.lZ - 32767.0f) / 32767.0f; + prev = ((float)m_PreviousState.lZ - 32767.0f) / 32767.0f; + return curr > 0.1f && prev <= 0.1f; + case Input::IJB_XBOXRT: + curr = ((float)m_CurrentState.lZ - 32767.0f) / 32767.0f; + prev = ((float)m_PreviousState.lZ - 32767.0f) / 32767.0f; + return curr < -0.1f && prev >= -0.1f; + default: + break; + } + return false; + } + } + virtual bool GetButtonDown(const InputJoystickPhysical a_JoystickButton) override final + { + if (m_PhysicalBindings.find(a_JoystickButton) != m_PhysicalBindings.end()) + return GetButtonDown(m_PhysicalBindings[a_JoystickButton]); + return false; + } + virtual bool GetButtonUp(const InputJoystickButton a_JoystickButton) override final + { + if (a_JoystickButton < 200) + return m_PreviousState.rgbButtons[a_JoystickButton] & 0x80 && !(m_CurrentState.rgbButtons[a_JoystickButton] & 0x80); + else + { + float curr, prev; + switch (a_JoystickButton) + { + case Input::IJB_XBOXDPADUP: + if (m_PreviousState.rgdwPOV[0] == 0 && m_CurrentState.rgdwPOV[0] != 0) + return true; + break; + case Input::IJB_XBOXDPADRIGHT: + if (m_PreviousState.rgdwPOV[0] == 9000 && m_CurrentState.rgdwPOV[0] != 9000) + return true; + break; + case Input::IJB_XBOXDPADDOWN: + if (m_PreviousState.rgdwPOV[0] == 18000 && m_CurrentState.rgdwPOV[0] != 18000) + return true; + break; + case Input::IJB_XBOXDPADLEFT: + if (m_PreviousState.rgdwPOV[0] == 27000 && m_CurrentState.rgdwPOV[0] != 27000) + return true; + break; + case Input::IJB_XBOXLT: + curr = ((float)m_CurrentState.lZ - 32767.0f) / 32767.0f; + prev = ((float)m_PreviousState.lZ - 32767.0f) / 32767.0f; + return curr <= 0.1f && prev > 0.1f; + case Input::IJB_XBOXRT: + curr = ((float)m_CurrentState.lZ - 32767.0f) / 32767.0f; + prev = ((float)m_PreviousState.lZ - 32767.0f) / 32767.0f; + return curr >= -0.1f && prev < -0.1f; + default: + break; + } + return false; + } + } + virtual bool GetButtonUp(const InputJoystickPhysical a_JoystickButton) override final + { + if (m_PhysicalBindings.find(a_JoystickButton) != m_PhysicalBindings.end()) + return GetButtonUp(m_PhysicalBindings[a_JoystickButton]); + return false; + } + virtual InputDeviceType GetDeviceType() override final + { + return IDT_XBOX; + } + private: + map m_PhysicalBindings; + }; + + InputManager::InputManager() : joystick(nullptr) + { + keyboard = new Keyboard_Impl(); + } + + void InputManager::Update() + { + keyboard->Update(); + if (joystick) + { + joystick->Update(); + + if (joystick->IsValid()) + { + for (auto it : m_joystickCallbacks) + { + switch (it.first.second) + { + case IME_PRESSED: + if (joystick->GetButtonDown(it.first.first)) + { + it.second->Call(); + } + break; + case IME_RELEASED: + if (joystick->GetButtonUp(it.first.first)) + { + it.second->Call(); + } + break; + case IME_REPEAT: + if (joystick->GetButton(it.first.first)) + { + it.second->Call(); + } + break; + } + } + } + } + } + BOOL __stdcall JoystickEnumCallback(LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef) + { + InputManager* inputInstance = InputManager::GetInstance(); + + inputInstance->AddJoystickName(lpddi->tszProductName); + + GUID_Impl newGUID; + newGUID.devType = lpddi->dwDevType; + newGUID.instance = lpddi->guidInstance; + newGUID.productData1 = lpddi->guidProduct.Data1; + + g_GUIDs.push_back(newGUID); + + return DIENUM_CONTINUE; + } + + void InputManager::AddJoystickName(std::wstring a_name) + { + m_joystickNames.push_back(a_name); + } + + void InputManager::SearchForJoystick() + { + m_joystickNames.clear(); + g_GUIDs.clear(); + g_DirectInput->EnumDevices(DI8DEVCLASS_GAMECTRL, &JoystickEnumCallback, NULL, DIEDFL_ATTACHEDONLY); + } + + vector& InputManager::GetJoystickNames() + { + return m_joystickNames; + } + + void InputManager::ConnectJoystickByIndex(size_t a_index) + { + if (joystick) + delete joystick; + + if (a_index >= g_GUIDs.size()) + return; + + HRESULT hr; + IDirectInputDevice8* device; + hr = g_DirectInput->CreateDevice(g_GUIDs[a_index].instance, &device, NULL); + if (!FAILED(hr)) + { + if (g_GUIDs[a_index].devType == DUALSHOCK4DEVTYPE || g_GUIDs[a_index].productData1 == DUALSHOCK4PRODUCTDATA) + joystick = new JoystickDS4_Impl(device); + else if (g_GUIDs[a_index].devType == WIREDXBOXDEVTYPE) + joystick = new JoystickXbox360_Impl(device); + else + joystick = new Joystick_Impl(device); + } + } + + InputManager::~InputManager() + { + delete keyboard; + delete joystick; + ClearCallbacks(); + } + + void InputManager::ClearCallbacks() + { + for (auto it : m_joystickCallbacks) + { + delete it.second; + } + m_joystickCallbacks.clear(); + } +} + +#endif \ No newline at end of file diff --git a/Source/UnrealProject/External/InputManager.hpp b/Source/UnrealProject/External/InputManager.hpp new file mode 100644 index 0000000..b6777ad --- /dev/null +++ b/Source/UnrealProject/External/InputManager.hpp @@ -0,0 +1,95 @@ +#ifndef _HEADER_INPUT_MANAGER +#define _HEADER_INPUT_MANAGER + +#include "InputDeviceBases.hpp" +#include "TeaCallback.hpp" +#include +#include +#include + +namespace Input +{ + class InputManager + { + public: + static bool IsInitialized(); + static bool Initialize(); + static void Cleanup(); + static InputManager* GetInstance(); + + private: + static bool s_isInitialized; + static InputManager* s_instance; + + public: + InputManager(); + ~InputManager(); + + InputDeviceType GetConnectedType() + { + if (joystick) + return joystick->GetDeviceType(); + return IDT_NONE; + } + bool IsJoystickConnected(const unsigned int a_Channel); + + void SearchForJoystick(); + + std::vector& GetJoystickNames(); + void AddJoystickName(std::wstring a_name); + + void ConnectJoystickByIndex(size_t m_index); + + void Update(); + + void RegisterCallback(InputJoystickPhysical a_Button, InputManagerEvent a_Event, void(*a_CallbackFunction)()) + { + std::pair newEvent(a_Button, a_Event); + if (m_joystickCallbacks.find(newEvent) == m_joystickCallbacks.end()) + { + m_joystickCallbacks[newEvent] = new TeaLib::Utility::Callback<>(); + } + m_joystickCallbacks[newEvent]->Register(a_CallbackFunction); + } + template void RegisterCallback(InputJoystickPhysical a_Button, InputManagerEvent a_Event, ClassType* a_ClassInstance, void(ClassType::*a_CallbackFunction)()) + { + std::pair newEvent(a_Button, a_Event); + if (m_joystickCallbacks.find(newEvent) == m_joystickCallbacks.end()) + { + m_joystickCallbacks[newEvent] = new TeaLib::Utility::Callback<>(); + } + m_joystickCallbacks[newEvent]->Register(a_ClassInstance, a_CallbackFunction); + } + void DeregisterCallback(InputJoystickPhysical a_Button, InputManagerEvent a_Event, void(*a_CallbackFunction)()) + { + if (!this) + return; + std::pair newEvent(a_Button, a_Event); + if (m_joystickCallbacks.find(newEvent) != m_joystickCallbacks.end()) + { + m_joystickCallbacks[newEvent]->Deregister(a_CallbackFunction); + }; + } + template void DeregisterCallback(InputJoystickPhysical a_Button, InputManagerEvent a_Event, ClassType* a_ClassInstance, void(ClassType::*a_CallbackFunction)()) + { + if (!this) + return; + std::pair newEvent(a_Button, a_Event); + if (m_joystickCallbacks.find(newEvent) != m_joystickCallbacks.end()) + { + m_joystickCallbacks[newEvent]->Deregister(a_ClassInstance, a_CallbackFunction); + } + } + + void ClearCallbacks(); + + Keyboard* keyboard; + Joystick* joystick; + + private: + std::vector m_joystickNames; + std::map, TeaLib::Utility::Callback<>*> m_joystickCallbacks; + }; +} + +#endif diff --git a/Source/UnrealProject/External/Metrics.cpp b/Source/UnrealProject/External/Metrics.cpp new file mode 100644 index 0000000..ab7494e --- /dev/null +++ b/Source/UnrealProject/External/Metrics.cpp @@ -0,0 +1,362 @@ +#include "UnrealProject.h" + +#if WITH_EDITOR + +#include "Metrics.hpp" +//#include +#include + +#include +#include +#include +#include +#include + +#if PLATFORM_SPECIFIC_WIN == 0 +#include "AllowWindowsPlatformTypes.h" +#include +#endif + +using namespace jlib; +using namespace std; +using namespace std::chrono; + +#include "Events.hpp" + +#include + +namespace Metrics +{ + ofstream writeStream; + timer writeTime; + uint32_t lastWriteTime; + + unordered_map players; + + uint32_t CurrentTime() + { + return uint32_t(writeTime.milliseconds()); + } + uint32_t TimeOffset() + { + const uint32_t currentTime = uint32_t(writeTime.milliseconds()); + const uint32_t offset = currentTime - lastWriteTime; + lastWriteTime = currentTime; + return offset; + } + wstring FormatNumber(uint16_t number, size_t desiredLength) + { + wstring result = wstring() + number; + while (result.size() < desiredLength) + result = wstring(L"0") + result; + return result; + } + + template void WriteEvent(const Event& event) + { + writeStream.write((const char*)&event, streamsize(sizeof(Event))); + } + void WriteBinary(void* addr, size_t size) + { + writeStream.write((const char*)addr, size); + } + + void Clear() + { + for (auto iter = players.begin(); iter != players.end(); iter++) + delete iter->second; + players.clear(); + } +} + +bool Metrics::StartSession(const wstring& filePath) +{ + EndSession(); + + time_t timePoint = system_clock::to_time_t(std::chrono::system_clock::now()); + const char* timeData = ctime(&timePoint); + wstring dateTime = convert_cstring_type(timeData); + + wstring dateTimeFiltered; + for (size_t i = 0; i < dateTime.size(); i++) + { + if (dateTime[i] == L'\n' || dateTime[i] == L'\r') + continue; + dateTimeFiltered += dateTime[i]; + } + dateTime = dateTimeFiltered; + + wstring sessionName = L"MetricsSession"; +#if PLATFORM_SPECIFIC_WIN == 0 + sessionName.clear(); + sessionName.resize(256); + DWORD length = 256; + GetComputerName(&sessionName[0], &length); + sessionName.resize(length); + wstring sessionNameFiltered; + for (size_t i = 0; i < sessionName.size(); i++) + { + wchar_t character = sessionName[i]; + if ((character >= L'0' && character <= L'9') || (character >= L'a' && character <= L'z') || (character >= L'A' && character <= L'Z') || character == L'-' || character == L'_') + sessionNameFiltered += character; + } + sessionName = sessionNameFiltered; +#endif + + wstring fileName = sessionName + L" - " + dateTime + L".hms"; + replace(fileName.begin(), fileName.end(), L':', L'-'); + writeStream.open(convert_string_type(filePath + fileName), ios::out | ios::binary | ios::trunc); + writeTime.restart(); + lastWriteTime = 0; + + // Write the header + writeStream.write("HMS", 3); + + return writeStream.is_open(); +} +bool Metrics::EndSession() +{ + if (writeStream.is_open()) + { + WriteEvent(SessionEnd(TimeOffset())); + + Clear(); + writeStream.close(); + return true; + } + + Clear(); + return false; +} + +struct Metrics::PlayerHandleSet +{ + static void Enable(PlayerHandle& handle, uint8_t id, uint8_t team) + { + handle.m_id = id; + handle.m_isValid = true; + handle.m_team = team; + } +}; + +void Metrics::SetMapData(float minX, float maxX, float minY, float maxY) +{ + if (!writeStream.is_open()) + return; + + WriteEvent(MapData(minX, maxX, minY, maxY)); +} +void Metrics::SetMapImage(uint8_t* ptr, uint32_t width, uint32_t height) +{ + if (!writeStream.is_open()) + return; + + WriteEvent(MapImage(width, height)); + WriteBinary(ptr, width * height * 4); +} + +Metrics::PlayerHandle::PlayerHandle() : m_isValid(false), m_id(-1), m_team(-1), m_updateTime(0), m_alive(false), m_health(INT_MAX), m_mana(INT_MAX), m_maxHealth(INT_MAX), m_maxMana(INT_MAX), m_level(255), m_playerX(FLT_MAX), m_playerY(FLT_MAX) +{ + +} + +void Metrics::PlayerHandle::OnPlayerSpawn(float playerX, float playerY) +{ + if (!writeStream.is_open() || !m_isValid) + return; + + if (m_alive) + return; + m_alive = true; + + m_playerX = playerX; + m_playerY = playerY; + + WriteEvent(PlayerSpawn(TimeOffset(), m_id, playerX, playerY)); +} +void Metrics::PlayerHandle::OnPlayerUpdate(float playerX, float playerY) +{ + if (!writeStream.is_open() || !m_isValid) + return; + + if (!m_alive) + return; + + // No need to write an event if the player hasnt moved + if (fabsf(playerX - m_playerX) < 0.01f && fabsf(playerY - m_playerY) < 0.01f) + return; + + // Only update position 30 times per second + const uint32_t currentTime = CurrentTime(); + if (currentTime - m_updateTime < 33) + return; + m_updateTime = currentTime; + + m_playerX = playerX; + m_playerY = playerY; + + WriteEvent(PlayerUpdate(TimeOffset(), m_id, playerX, playerY)); +} +void Metrics::PlayerHandle::OnPlayerDie(uint8_t source) +{ + if (!writeStream.is_open() || !m_isValid) + return; + + if (!m_alive) + return; + m_alive = false; + + WriteEvent(PlayerDie(TimeOffset(), m_id, source)); +} +void Metrics::PlayerHandle::OnPlayerCast(uint32_t ability) +{ + if (!writeStream.is_open() || !m_isValid) + return; + + if (!m_alive) + return; + + WriteEvent(PlayerCast(TimeOffset(), m_id, ability)); +} +void Metrics::PlayerHandle::OnPlayerHealth(int32_t health) +{ + if (!writeStream.is_open() || !m_isValid) + return; + + if (!m_alive) + return; + + // No need to write an event if the player hasnt lost/gained health + if (m_health == health) + return; + + m_health = health; + + WriteEvent(PlayerHealth(TimeOffset(), m_id, health)); +} +void Metrics::PlayerHandle::OnPlayerMana(int32_t mana) +{ + if (!writeStream.is_open() || !m_isValid) + return; + + if (!m_alive) + return; + + // No need to write an event if the player hasnt lost/gained mana + if (m_mana == mana) + return; + + m_mana = mana; + + WriteEvent(PlayerMana(TimeOffset(), m_id, mana)); +} +void Metrics::PlayerHandle::OnPlayerMaxHealth(int32_t maxHealth) +{ + if (!writeStream.is_open() || !m_isValid) + return; + + if (!m_alive) + return; + + // No need to write an event if the player hasnt changed max health + if (m_maxHealth == maxHealth) + return; + + m_maxHealth = maxHealth; + + WriteEvent(PlayerMaxHealth(TimeOffset(), m_id, maxHealth)); +} +void Metrics::PlayerHandle::OnPlayerMaxMana(int32_t maxMana) +{ + if (!writeStream.is_open() || !m_isValid) + return; + + if (!m_alive) + return; + + // No need to write an event if the player hasnt changed max mana + if (m_maxMana == maxMana) + return; + + m_maxMana = maxMana; + + WriteEvent(PlayerMaxMana(TimeOffset(), m_id, maxMana)); +} +void Metrics::PlayerHandle::OnPlayerDealDamage(uint32_t ability, int32_t damage) +{ + if (!writeStream.is_open() || !m_isValid) + return; + + if (!m_alive) + return; + + WriteEvent(PlayerDealDamage(TimeOffset(), m_id, ability, damage)); +} +void Metrics::PlayerHandle::OnPlayerLevel(uint8_t level) +{ + if (!writeStream.is_open() || !m_isValid) + return; + + if (m_level == level) + return; + + m_level = level; + + WriteEvent(PlayerLevel(TimeOffset(), m_id, level)); +} + +bool Metrics::PlayerHandle::IsValid() const +{ + return m_isValid; +} +uint8_t Metrics::PlayerHandle::Id() const +{ + return m_id; +} +uint8_t Metrics::PlayerHandle::Team() const +{ + return m_team; +} + +Metrics::PlayerHandle& Metrics::RegisterPlayer(const wstring& name, uint8_t team) +{ + static PlayerHandle errorHandle; + if (!writeStream.is_open()) + return errorHandle; + + const uint8_t id = uint8_t(players.size() + 1); + + PlayerHandle* newHandle = new PlayerHandle(); + PlayerHandleSet::Enable(*newHandle, id, team); + + players.emplace(id, newHandle); + + wstring copy = name; + if (copy.size() > 128) + copy.resize(128); + else if (copy.empty()) + copy = L"UNKNOWN PLAYER"; + + WriteEvent(PlayerName(id, (uint16_t)copy.size())); + WriteBinary((void*)copy.data(), copy.size() * sizeof(wstring::value_type)); + + WriteEvent(PlayerTeam(id, team)); + + return *newHandle; +} +void Metrics::RegisterAbility(uint32_t ability, const std::wstring& name) +{ + if (!writeStream.is_open()) + return; + + wstring copy = name; + if (copy.size() > 128) + copy.resize(128); + else if (copy.empty()) + copy = L"UNKNOWN ABILITY"; + + WriteEvent(AbilityName(ability, (uint16_t)copy.size())); + WriteBinary((void*)copy.data(), copy.size() * sizeof(wstring::value_type)); +} + +#endif \ No newline at end of file diff --git a/Source/UnrealProject/External/Metrics.hpp b/Source/UnrealProject/External/Metrics.hpp new file mode 100644 index 0000000..2288251 --- /dev/null +++ b/Source/UnrealProject/External/Metrics.hpp @@ -0,0 +1,71 @@ +#pragma once + +#include + +#if WITH_EDITOR + +#define UE_INCLUDE_METRICS 1 + +#define METRICS_EXPR(expr) expr + +namespace Metrics +{ + bool StartSession(const std::wstring& filePath); + bool EndSession(); + + void SetMapData(float minX, float maxX, float minY, float maxY); + void SetMapImage(uint8_t* ptr, uint32_t width, uint32_t height); + + struct PlayerHandleSet; + struct PlayerHandle + { + public: + PlayerHandle(); + + void OnPlayerSpawn(float playerX, float playerY); + void OnPlayerUpdate(float playerX, float playerY); + void OnPlayerDie(uint8_t source); + void OnPlayerCast(uint32_t ability); + void OnPlayerHealth(int32_t health); + void OnPlayerMana(int32_t mana); + void OnPlayerMaxHealth(int32_t maxHealth); + void OnPlayerMaxMana(int32_t maxMana); + void OnPlayerDealDamage(uint32_t ability, int32_t damage); + void OnPlayerLevel(uint8_t level); + + bool IsValid() const; + uint8_t Id() const; + uint8_t Team() const; + + private: + PlayerHandle(const PlayerHandle& other) = delete; + PlayerHandle& operator=(const PlayerHandle& other) = delete; + + friend struct PlayerHandleSet; + + bool m_isValid; + uint8_t m_id; + uint8_t m_team; + uint32_t m_updateTime; + + bool m_alive; + int32_t m_health; + int32_t m_mana; + int32_t m_maxHealth; + int32_t m_maxMana; + uint8_t m_level; + float m_playerX; + float m_playerY; + }; + + PlayerHandle& RegisterPlayer(const std::wstring& name, uint8_t team); + void RegisterAbility(uint32_t ability, const std::wstring& name); +} + +#else + +#define UE_INCLUDE_METRICS 0 + +#define METRICS_EXPR(expr) + +#endif \ No newline at end of file diff --git a/Source/UnrealProject/External/TeaCallback.hpp b/Source/UnrealProject/External/TeaCallback.hpp new file mode 100644 index 0000000..f50ff53 --- /dev/null +++ b/Source/UnrealProject/External/TeaCallback.hpp @@ -0,0 +1,137 @@ +#ifndef _HEADER_TEA_CALLBACK +#define _HEADER_TEA_CALLBACK + +#include +#include + +namespace TeaLib +{ + namespace Utility + { +#define NOVOIDFUNC(FuncRetVal) template typename std::enable_if::value, FuncRetVal>::type + template + class ReturnCallback + { + private: + // Typedef for comparing function pointers. + typedef ReturnValue(ReturnCallback::*CompareHandle)(Arguments...); + struct CallbackStructBase + { + public: + virtual ~CallbackStructBase() {}; + virtual ReturnValue Call(Arguments...) = 0; + virtual bool Compare(ReturnValue(*a_CallbackFunction)(Arguments...)) + { + return false; + }; + virtual bool Compare(void* a_ClassInstance, CompareHandle a_CallbackFunction) + { + return false; + }; + }; + struct CallbackStruct : public CallbackStructBase + { + public: + virtual ReturnValue Call(Arguments... a_Arg) + { + return m_CallbackFunction(a_Arg...); + } + virtual bool Compare(ReturnValue(*a_CallbackFunction)(Arguments...)) + { + return (a_CallbackFunction == m_CallbackFunction); + }; + ReturnValue(*m_CallbackFunction)(Arguments...); + }; + template struct ClassCallbackStruct : public CallbackStructBase + { + public: + virtual ReturnValue Call(Arguments... a_Arg) + { + return (m_ClassInstance->*m_CallbackFunction)(a_Arg...); + } + virtual bool Compare(void* a_ClassInstance, CompareHandle a_CallbackFunction) + { + CompareHandle compareHandle; + memcpy(&compareHandle, &m_CallbackFunction, sizeof(CompareHandle)); + + return ((a_ClassInstance == m_ClassInstance) && (a_CallbackFunction == compareHandle)); + }; + ClassType* m_ClassInstance; + ReturnValue(ClassType::*m_CallbackFunction)(Arguments...); + }; + public: + virtual ~ReturnCallback() + { + for (int i = (int)m_CallbackFunctions.size() - 1; i >= 0; i--) + { + delete m_CallbackFunctions[i]; + } + m_CallbackFunctions.clear(); + } + void Call(Arguments... a_Arg) + { + for (auto it : m_CallbackFunctions) + { + it->Call(a_Arg...); + } + } + NOVOIDFUNC(void) Call(std::vector* a_ReturnValues, Arguments... a_Arg) + { + for (auto it : m_CallbackFunctions) + { + a_ReturnValues->push_back(it->Call(a_Arg...)); + } + } + void Register(ReturnValue(*a_CallbackFunction)(Arguments...)) + { + CallbackStruct* newCallback = new CallbackStruct(); + newCallback->m_CallbackFunction = a_CallbackFunction; + m_CallbackFunctions.push_back(newCallback); + } + template void Register(ClassType* a_ClassInstance, ReturnValue(ClassType::*a_CallbackFunction)(Arguments...)) + { + ClassCallbackStruct* newCallback = new ClassCallbackStruct(); + newCallback->m_ClassInstance = a_ClassInstance; + newCallback->m_CallbackFunction = a_CallbackFunction; + m_CallbackFunctions.push_back(newCallback); + } + // Removes the first registered callback that matches the function. + void Deregister(ReturnValue(*a_CallbackFunction)(Arguments...)) + { + for (unsigned int i = 0; i < m_CallbackFunctions.size(); i++) + { + if (m_CallbackFunctions[i]->Compare(a_CallbackFunction)) + { + delete m_CallbackFunctions[i]; + m_CallbackFunctions.erase(m_CallbackFunctions.begin() + i); + break; + } + } + } + // Removes the first registered callback that matches the class instance and the function. + template void Deregister(ClassType* a_ClassInstance, ReturnValue(ClassType::*a_CallbackFunction)(Arguments...)) + { + CompareHandle compareHandle; + memcpy(&compareHandle, &a_CallbackFunction, sizeof(CompareHandle)); + for (unsigned int i = 0; i < m_CallbackFunctions.size(); i++) + { + if (m_CallbackFunctions[i]->Compare(a_ClassInstance, compareHandle)) + { + delete m_CallbackFunctions[i]; + m_CallbackFunctions.erase(m_CallbackFunctions.begin() + i); + break; + } + } + } + private: + std::vector m_CallbackFunctions; + }; + // Alias template for callbacks that return void. + template + using Callback = ReturnCallback; +#undef NOVOIDFUNC + }; +}; + + +#endif \ No newline at end of file diff --git a/Source/UnrealProject/External/TeaVector2.hpp b/Source/UnrealProject/External/TeaVector2.hpp new file mode 100644 index 0000000..23f784b --- /dev/null +++ b/Source/UnrealProject/External/TeaVector2.hpp @@ -0,0 +1,91 @@ +#ifndef _HEADER_TEA_MATH_VECTOR2 +#define _HEADER_TEA_MATH_VECTOR2 + +namespace TeaLib +{ + namespace Math + { + template + class Vector2 + { + public: + Vector2() : x(0), y(0){}; + Vector2(const T a_X, const T a_Y) : x(a_X), y(a_Y){}; + + Vector2& operator+=(const Vector2& rhs) + { + this->x += rhs.x; + this->y += rhs.y; + return *this; + } + Vector2& operator-=(const Vector2& rhs) + { + this->x -= rhs.x; + this->y -= rhs.y; + return *this; + } + Vector2& operator*=(const float& rhs) + { + this->x *= rhs; + this->y *= rhs; + return *this; + } + Vector2& operator/=(const float& rhs) + { + this->x /= rhs; + this->y /= rhs; + return *this; + } + + Vector2 operator+(const Vector2& rhs) + { + Vector2 retVal; + retVal.x = this->x + rhs.x; + retVal.y = this->y + rhs.y; + return retVal; + } + Vector2 operator-(const Vector2& rhs) + { + Vector2 retVal; + retVal.x = this->x - rhs.x; + retVal.y = this->y - rhs.y; + return retVal; + } + Vector2 operator*(const float& rhs) + { + Vector2 retVal; + retVal.x = this->x * rhs; + retVal.y = this->y * rhs; + return retVal; + } + Vector2 operator/(const float& rhs) + { + Vector2 retVal; + retVal.x = this->x / rhs; + retVal.y = this->y / rhs; + return retVal; + } + + bool operator==(const Vector2& rhs) + { + return ((this->x == rhs.x) && (this->y == rhs.y)); + } + + float LengthSquared() + { + return ((x*x) + (y*y)); + } + + float Length() + { + return sqrtf(LengthSquared()); + } + + T x, y; + }; + typedef Vector2 Vector2f; + typedef Vector2 Vector2i; + typedef Vector2 Vector2u; + }; +}; +#endif \ No newline at end of file diff --git a/Source/UnrealProject/External/TeaVector3.hpp b/Source/UnrealProject/External/TeaVector3.hpp new file mode 100644 index 0000000..ef52e93 --- /dev/null +++ b/Source/UnrealProject/External/TeaVector3.hpp @@ -0,0 +1,149 @@ +#ifndef _HEADER_TEA_MATH_VECTOR3 +#define _HEADER_TEA_MATH_VECTOR3 + +namespace TeaLib +{ + namespace Math + { + template + class Vector3 + { + public: + Vector3() : x(0), y(0), z(0){}; + Vector3(const T a_X, const T a_Y, const T a_Z) : x(a_X), y(a_Y), z(a_Z){}; + + Vector3& operator+=(const Vector3& rhs) + { + this->x += rhs.x; + this->y += rhs.y; + this->z += rhs.z; + return *this; + } + Vector3& operator-=(const Vector3& rhs) + { + this->x -= rhs.x; + this->y -= rhs.y; + this->z -= rhs.z; + return *this; + } + Vector3& operator*=(const float& rhs) + { + this->x *= rhs; + this->y *= rhs; + this->z *= rhs; + return *this; + } + Vector3& operator/=(const float& rhs) + { + this->x /= rhs; + this->y /= rhs; + this->z /= rhs; + return *this; + } + + Vector3 operator+(const Vector3& rhs) + { + Vector3 retVal; + retVal.x = this->x + rhs.x; + retVal.y = this->y + rhs.y; + retVal.z = this->z + rhs.z; + return retVal; + } + Vector3 operator-(const Vector3& rhs) + { + Vector3 retVal; + retVal.x = this->x - rhs.x; + retVal.y = this->y - rhs.y; + retVal.z = this->z - rhs.z; + return retVal; + } + Vector3 operator*(const float& rhs) + { + Vector3 retVal; + retVal.x = this->x * rhs; + retVal.y = this->y * rhs; + retVal.z = this->z * rhs; + return retVal; + } + friend Vector3 operator*(const float& lhs, const Vector3& rhs) + { + Vector3 retVal; + retVal.x = rhs.x * lhs; + retVal.y = rhs.y * lhs; + retVal.z = rhs.z * lhs; + return retVal; + } + Vector3 operator/(const float& rhs) + { + Vector3 retVal; + retVal.x = this->x / rhs; + retVal.y = this->y / rhs; + retVal.z = this->z / rhs; + return retVal; + } + Vector3 operator-() + { + Vector3 retVal; + retVal.x = -this->x; + retVal.y = -this->y; + retVal.z = -this->z; + return retVal; + } + + bool operator==(const Vector3& rhs) + { + return ((this->x == rhs.x) && (this->y == rhs.y) && (this->z == rhs.z)); + } + + + float LengthSquared() + { + return ((x*x) + (y*y) + (z*z)); + } + float Length() + { + return sqrtf(LengthSquared()); + } + + Vector3 Normalized() + { + return ((*this) / Length()); + } + + T x, y, z; + + public: + static Vector3 Cross(Vector3& lhs, Vector3& rhs) + { + Vector3 retVal; + + retVal.x = lhs.y * rhs.z - lhs.z * rhs.y; + retVal.y = lhs.z * rhs.x - lhs.x * rhs.z; + retVal.z = lhs.x * rhs.y - lhs.y * rhs.x; + + return retVal; + } + static float Dot(Vector3& lhs, Vector3& rhs) + { + float retVal; + + retVal = lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z; + + return retVal; + } + static Vector3 Lerp(Vector3& a_Source, Vector3& a_Destination, float a_Scale) + { + Vector3 between = a_Destination - a_Source; + + return a_Source + between * a_Scale; + } + }; + + typedef Vector3 Vector3f; + typedef Vector3 Vector3i; + typedef Vector3 Vector3u; + typedef Vector3 Vector3l; + + }; +}; +#endif \ No newline at end of file diff --git a/Source/UnrealProject/External/append b/Source/UnrealProject/External/append new file mode 100644 index 0000000..352c6ce --- /dev/null +++ b/Source/UnrealProject/External/append @@ -0,0 +1,146 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// Copyright (c) 2012-2015, Jan de Graaf (jan@jlib.nl) // +// // +// Permission to use, copy, modify, and/or distribute this software for any purpose with or // +// without fee is hereby granted, provided that the above copyright notice and this permission // +// notice appear in all copies. // +// // +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS // +// SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL // +// THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE // +// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // +// // +/////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef _JLIB_HEADER_APPEND +#define _JLIB_HEADER_APPEND + +#include +#include +#include +#include + +namespace std +{ + // Stream operator + template inline basic_string& operator<<(basic_string& lhs, const input_type_t& rhs) + { + basic_ostringstream stream; + return lhs.append(static_cast*>(&(stream << rhs))->str()); + } + + // Parsing numbers + template inline bool operator>>(const basic_string& lhs, input_type_t& rhs) + { + return (bool)(basic_istringstream(lhs) >> rhs); + } + + // Addition operators + // Utilizes enable_if to prevent colliding with string's existing operators + template struct is_string_operand + { + static const bool value = std::is_same::type, char_type_t>::value || std::is_same::type, char_type_t*>::value || std::is_same::type, std::basic_string>::value; + }; + template inline typename std::enable_if::value, basic_string&>::type operator+=(basic_string& lhs, const input_type_t& rhs) + { + basic_ostringstream stream; + return lhs.append(static_cast*>(&(stream << rhs))->str()); + } + template inline typename std::enable_if::value, basic_string>::type operator+(const basic_string& lhs, const input_type_t& rhs) + { + basic_ostringstream stream; + return basic_string(lhs).append(static_cast*>(&(stream << rhs))->str()); + } +} + +template inline std::basic_string convert_cstring_type(const from_type_t* cstr) +{ + static_assert(std::is_same::value, "Invalid char overload"); + return std::basic_string(cstr); +} +template<> inline std::basic_string convert_cstring_type(const wchar_t* wcstr) +{ + std::string str; + size_t i = 0; + while (wcstr[i] != L'\0') + { + const uint32_t c = uint32_t(wcstr[i]); + str.resize(i + 1); + str[i++] = (c < 32 || c >= 126) ? '?' : char(c); + } + return str; +} +template<> inline std::basic_string convert_cstring_type(const char* cstr) +{ + std::wstring wstr; + size_t i = 0; + while (cstr[i] != L'\0') + { + const wchar_t c = wchar_t(cstr[i]); + wstr.resize(i + 1); + wstr[i++] = c; + } + return wstr; +} +template inline std::basic_string convert_string_type(const std::basic_string& from_string) +{ + static_assert(std::is_same::value, "Invalid char overload"); + return from_string; +} +template<> inline std::basic_string convert_string_type(const std::basic_string& wstr) +{ + return convert_cstring_type(wstr.data()); +} +template<> inline std::basic_string convert_string_type(const std::basic_string& str) +{ + return convert_cstring_type(str.data()); +} + +namespace std +{ +#ifndef _NOUNREAL + template inline basic_string operator+(const basic_string& lhs, const class FString& rhs) + { + if (rhs.GetCharArray().GetData()) + return basic_string(lhs).append((convert_cstring_type(rhs.GetCharArray().GetData()))); + return basic_string(lhs); + } + template inline basic_string operator+(const basic_string& lhs, const class FName& rhs) + { + return basic_string(lhs) + rhs.ToString(); + } + template inline basic_string operator+(const basic_string& lhs, const class FText& rhs) + { + return basic_string(lhs) + rhs.ToString(); + } + + template inline basic_string operator+(const basic_string& lhs, const struct FVector& rhs) + { + static const char __LogSpace = ' '; + static const char __FVectorOpen = '{'; + static const char __FVectorEnd = '}'; + static const char __LogSep = ','; + return lhs + (char_type_t)__FVectorOpen + rhs.X + (char_type_t)__LogSep + (char_type_t)__LogSpace + rhs.Y + (char_type_t)__LogSep + (char_type_t)__LogSpace + rhs.Z + (char_type_t)__FVectorEnd; + } + template inline basic_string operator+(const basic_string& lhs, const struct FVector2D& rhs) + { + static const char __LogSpace = ' '; + static const char __FVectorOpen = '{'; + static const char __FVectorEnd = '}'; + static const char __LogSep = ','; + return lhs + (char_type_t)__FVectorOpen + rhs.X + (char_type_t)__LogSep + (char_type_t)__LogSpace + rhs.Y + (char_type_t)__FVectorEnd; + } + template inline basic_string operator+(const basic_string& lhs, const struct FRotator& rhs) + { + static const char __LogSpace = ' '; + static const char __FVectorOpen = '{'; + static const char __FVectorEnd = '}'; + static const char __LogSep = ','; + return lhs + (char_type_t)__FVectorOpen + rhs.Pitch + (char_type_t)__LogSep + (char_type_t)__LogSpace + rhs.Yaw + (char_type_t)__LogSep + (char_type_t)__LogSpace + rhs.Roll + (char_type_t)__FVectorEnd; + } +#endif +} + +#endif \ No newline at end of file diff --git a/Source/UnrealProject/External/timer b/Source/UnrealProject/External/timer new file mode 100644 index 0000000..2bdbb3f --- /dev/null +++ b/Source/UnrealProject/External/timer @@ -0,0 +1,106 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// Copyright (c) 2012-2015, Jan de Graaf (jan@jlib.nl) // +// // +// Permission to use, copy, modify, and/or distribute this software for any purpose with or // +// without fee is hereby granted, provided that the above copyright notice and this permission // +// notice appear in all copies. // +// // +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS // +// SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL // +// THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE // +// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // +// // +/////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef _JLIB_HEADER_TIMER +#define _JLIB_HEADER_TIMER + +/* + +Template chrono timer class + +Wraps std chrono basic time functions in a timer object. + +*/ + +#include + +namespace jlib +{ + class timer + { + public: + // Constructors + timer() : m_start(std::chrono::high_resolution_clock::now()) {} + template timer(std::chrono::duration duration) : m_start(std::chrono::high_resolution_clock::now()) + { + m_start -= duration; + } + template timer& operator=(std::chrono::duration duration) + { + restart(); + m_start -= duration; + return *this; + } + + inline void restart() + { + m_start = std::chrono::high_resolution_clock::now(); + } + + template inline dur duration() const + { + return std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - m_start); + } + + // Simplified get functions + inline std::chrono::nanoseconds::rep nanoseconds() const + { + return duration().count(); + } + inline std::chrono::microseconds::rep microseconds() const + { + return duration().count(); + } + inline std::chrono::milliseconds::rep milliseconds() const + { + return duration().count(); + } + inline std::chrono::seconds::rep seconds() const + { + return duration().count(); + } + inline std::chrono::minutes::rep minutes() const + { + return duration().count(); + } + inline std::chrono::hours::rep hours() const + { + return duration().count(); + } + inline float seconds_float() const + { + return duration>().count(); + } + + // Addition or substraction + // Allows to add or substract time periods from the timer + template inline timer& operator+=(std::chrono::duration duration) + { + m_start -= duration; + return *this; + } + template inline timer& operator-=(std::chrono::duration duration) + { + m_start += duration; + return *this; + } + + private: + std::chrono::high_resolution_clock::time_point m_start; + }; +} + +#endif \ No newline at end of file diff --git a/Source/UnrealProject/GUI/CombatText/CombatTextText.cpp b/Source/UnrealProject/GUI/CombatText/CombatTextText.cpp new file mode 100644 index 0000000..c6ac189 --- /dev/null +++ b/Source/UnrealProject/GUI/CombatText/CombatTextText.cpp @@ -0,0 +1,22 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "CombatTextText.h" + + + +void UCombatTextText::NativeConstruct() +{ + Super::NativeConstruct(); + lifeTime = 0; +} + + +void UCombatTextText::SetText_Implementation(const FString& text) +{ + +} +void UCombatTextText::SetColor_Implementation(const FLinearColor& color) +{ + +} \ No newline at end of file diff --git a/Source/UnrealProject/GUI/CombatText/CombatTextText.h b/Source/UnrealProject/GUI/CombatText/CombatTextText.h new file mode 100644 index 0000000..1bd4a17 --- /dev/null +++ b/Source/UnrealProject/GUI/CombatText/CombatTextText.h @@ -0,0 +1,29 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Blueprint/UserWidget.h" +#include "CombatTextText.generated.h" + +/** + * + */ + +UCLASS() +class UNREALPROJECT_API UCombatTextText : public UUserWidget +{ + GENERATED_BODY() + +public: + virtual void NativeConstruct(); + + UFUNCTION(BlueprintNativeEvent, Category = "CombatText") + void SetText(const FString& text); + + UFUNCTION(BlueprintNativeEvent, Category = "CombatText") + void SetColor(const FLinearColor& color); + + + float lifeTime; + FVector position; +}; diff --git a/Source/UnrealProject/GUI/CombatText/CombatTextWidget.cpp b/Source/UnrealProject/GUI/CombatText/CombatTextWidget.cpp new file mode 100644 index 0000000..11dc8d7 --- /dev/null +++ b/Source/UnrealProject/GUI/CombatText/CombatTextWidget.cpp @@ -0,0 +1,106 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "CombatTextWidget.h" +#include "CombatTextText.h" +#include "WidgetLayoutLibrary.h" + +#define TEXT_LIFETIME 1.0f + +void UCombatTextWidget::NativeConstruct() +{ + Super::NativeConstruct(); + + +} +void UCombatTextWidget::NativeDestruct() +{ + Super::NativeDestruct(); +} + +void UCombatTextWidget::NativeTick(const FGeometry& geometry, float deltaTime) +{ + Super::NativeTick(geometry, deltaTime); + + UWorld* const world = GetWorld(); + if (!IsValid(world)) return; + APlayerController* const controller = world->GetFirstPlayerController(); + if (!IsValid(controller)) return; + + const FVector2D screenSize = FVector2D(world->GetGameViewport()->Viewport->GetSizeXY().X, world->GetGameViewport()->Viewport->GetSizeXY().Y); + const float viewportScale = UWidgetLayoutLibrary::GetViewportScale(this); + + + for (int32 i = 0; i < m_combatTexts.Num();) + { + // Check the lifetime + CombatText& text = m_combatTexts[i]; + text.lifeTime += deltaTime; + if (text.lifeTime >= TEXT_LIFETIME) + { + text.textObject->RemoveFromParent(); + m_combatTexts.RemoveAt(i); + continue; + } + + // Set the color + UCanvasPanelSlot* asSlot = Cast(text.textObject->Slot); + if (asSlot) + { + const float progress = text.lifeTime / TEXT_LIFETIME; + text.textObject->SetColor(FLinearColor(text.color.R, text.color.G, text.color.B, text.color.A * (1.0f - progress))); + + // Update position + FVector2D position; + if (controller->ProjectWorldLocationToScreen(text.position + FVector(0, 0, progress * 200), position)) + { + if (text.arc) + { + position -= FVector2D(progress * text.arcDir.X, FMath::Sin(progress * PI) * text.arcDir.Y) * 100; + asSlot->SetPosition(position / viewportScale); + } + else + asSlot->SetPosition(position / viewportScale); + } + } + + i++; + } +} + + +void UCombatTextWidget::CreateCombatText(const FVector& position, const FString& text, const FLinearColor& color) +{ + CombatText combatText(position, text, color, false); + + combatText.textObject = m_CreateTextObject(text, color); + + m_combatTexts.Add(combatText); +} +void UCombatTextWidget::CreateArcingCombatText(const FVector& position, const FString& text, const FLinearColor& color) +{ + CombatText combatText(position, text, color, true); + + combatText.arcDir.X = FMath::SRand() * 0.5f + 0.3f; + combatText.arcDir.Y = FMath::SRand() * 0.5f + 0.3f; + if (FMath::Rand() % 2 == 0) + combatText.arcDir.X = -combatText.arcDir.X; + + combatText.textObject = m_CreateTextObject(text, color); + + m_combatTexts.Add(combatText); +} + +UCombatTextText* UCombatTextWidget::m_CreateTextObject(const FString& text, const FLinearColor& color) +{ + UCombatTextText* newObject = CreateWidget(GetWorld(), textWidget); + canvas->AddChild(newObject); + UCanvasPanelSlot* asSlot = Cast(newObject->Slot); + asSlot->SetSize(FVector2D(1000, 500)); + asSlot->SetAlignment(FVector2D(0.5f, 0.05f)); + + newObject->SetText(text); + newObject->SetColor(color); + + return newObject; +} \ No newline at end of file diff --git a/Source/UnrealProject/GUI/CombatText/CombatTextWidget.h b/Source/UnrealProject/GUI/CombatText/CombatTextWidget.h new file mode 100644 index 0000000..b7fec4c --- /dev/null +++ b/Source/UnrealProject/GUI/CombatText/CombatTextWidget.h @@ -0,0 +1,54 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Blueprint/UserWidget.h" +#include "CombatTextWidget.generated.h" + +/** + * + */ + + + +UCLASS() +class UNREALPROJECT_API UCombatTextWidget : public UUserWidget +{ + GENERATED_BODY() + +public: + virtual void NativeConstruct(); + virtual void NativeDestruct(); + virtual void NativeTick(const FGeometry& geometry, float deltaTime) override; + + UPROPERTY(EditAnywhere, Category = "CombatText") + TSubclassOf textWidget; + + UPROPERTY(BlueprintReadWrite, Category = "CombatText") + class UCanvasPanel* canvas; + + UFUNCTION(BlueprintCallable, Category = "CombatText") + void CreateCombatText(const FVector& position, const FString& text, const FLinearColor& color); + + UFUNCTION(BlueprintCallable, Category = "CombatText") + void CreateArcingCombatText(const FVector& position, const FString& text, const FLinearColor& color); + + +private: + struct CombatText + { + CombatText(const FVector& position, const FString& text, const FLinearColor& color, bool arc) : position(position), text(text), color(color), lifeTime(0), arc(arc) {} + FVector position; + FString text; + FLinearColor color; + float lifeTime; + bool arc; + FVector2D arcDir; + + UCombatTextText* textObject; + }; + + TArray m_combatTexts; + + UCombatTextText* m_CreateTextObject(const FString& text, const FLinearColor& color); +}; diff --git a/Source/UnrealProject/GUI/EventHUD.cpp b/Source/UnrealProject/GUI/EventHUD.cpp new file mode 100644 index 0000000..00a8d3a --- /dev/null +++ b/Source/UnrealProject/GUI/EventHUD.cpp @@ -0,0 +1,19 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "EventHUD.h" + +void UEventHUD::NativeConstruct() +{ + Super::NativeConstruct(); +} + +void UEventHUD::NativeDestruct() +{ + Super::NativeDestruct(); +} + +void UEventHUD::AddEvent_Implementation( const FEventObject& event ) +{ + +} \ No newline at end of file diff --git a/Source/UnrealProject/GUI/EventHUD.h b/Source/UnrealProject/GUI/EventHUD.h new file mode 100644 index 0000000..6a3e733 --- /dev/null +++ b/Source/UnrealProject/GUI/EventHUD.h @@ -0,0 +1,47 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Blueprint/UserWidget.h" +#include "EventHUD.generated.h" + +UENUM(BlueprintType) +enum class EEventType : uint8 +{ + ET_Kill UMETA(DisplayName = "Kill Event"), + ET_Capture UMETA(DisplayName = "Capture Event"), + ET_KOTH UMETA(DisplayName = "KOTH Event") +}; + +USTRUCT() +struct FEventObject +{ + GENERATED_USTRUCT_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Event Struct") + FText Source; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Event Struct") + FText Target; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Event Struct") + EEventType Type; + + UPROPERTY( EditAnywhere, BlueprintReadWrite, Category = "Event Struct" ) + int32 SourceNum; + + UPROPERTY( EditAnywhere, BlueprintReadWrite, Category = "Event Struct" ) + int32 TargetNum; +}; + +UCLASS() +class UNREALPROJECT_API UEventHUD : public UUserWidget +{ + GENERATED_BODY() +public: + virtual void NativeConstruct() override; + virtual void NativeDestruct() override; + + UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "UI") + void AddEvent( const FEventObject& event ); +}; diff --git a/Source/UnrealProject/GUI/EventWidget.cpp b/Source/UnrealProject/GUI/EventWidget.cpp new file mode 100644 index 0000000..4585423 --- /dev/null +++ b/Source/UnrealProject/GUI/EventWidget.cpp @@ -0,0 +1,19 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "EventWidget.h" + +void UEventWidget::NativeConstruct() +{ + Super::NativeConstruct(); +} + +void UEventWidget::NativeDestruct() +{ + Super::NativeDestruct(); +} + +void UEventWidget::SetVariables_Implementation(const FEventObject& event) +{ + +} diff --git a/Source/UnrealProject/GUI/EventWidget.h b/Source/UnrealProject/GUI/EventWidget.h new file mode 100644 index 0000000..8166890 --- /dev/null +++ b/Source/UnrealProject/GUI/EventWidget.h @@ -0,0 +1,18 @@ +// Project Lab - NHTV Igad + +#pragma once +#include "Blueprint/UserWidget.h" +#include "EventHUD.h" +#include "EventWidget.generated.h" + +UCLASS() +class UNREALPROJECT_API UEventWidget : public UUserWidget +{ + GENERATED_BODY() +public: + virtual void NativeConstruct() override; + virtual void NativeDestruct() override; + + UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "UI") + void SetVariables( const FEventObject& event ); +}; diff --git a/Source/UnrealProject/GUI/HUD/AbilityButton.cpp b/Source/UnrealProject/GUI/HUD/AbilityButton.cpp new file mode 100644 index 0000000..a95c1af --- /dev/null +++ b/Source/UnrealProject/GUI/HUD/AbilityButton.cpp @@ -0,0 +1,61 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "AbilityButton.h" +#include "NetworkCharacter.h" +#include "AbilityInfo.h" +#include "AbilityState.h" + +void UAbilityButton::NativeConstruct() +{ + m_globalEnable = true; + Super::NativeConstruct(); + SetCooldown(1.0f); + SetToggled(false); + SetupButton(nullptr, false); +} + +UAbilityInfo* UAbilityButton::GetAbility() +{ + return m_abilityInfo; +} + +void UAbilityButton::InitButton(class UAbilityInfo* info, int32 index, bool alt) +{ + if (info) + { + SetCooldown(1.0f); + SetToggled(false); + SetupButton(info, false); + SetIndex(index, alt); + SetAbilityAvailable(true); + m_index = index; + m_abilityInfo = info; + } +} + +bool UAbilityButton::IsAssigned() const +{ + return m_abilityInfo != nullptr; +} + +void UAbilityButton::UpdateState(class AAbilityState* state, ANetworkCharacter* character) +{ + SetToggled(state->toggleState); + SetCooldown(state->cooldownRate); + SetAbilityAvailable(character->GetMana() >= state->info->mana); +} + +void UAbilityButton::SetButtonEnabled(bool enabled) +{ + m_enabled = enabled; + if (m_abilityInfo) + { + SetupButton(m_abilityInfo, m_enabled && m_globalEnable); + } +} +void UAbilityButton::SetGlobalEnable(bool enabled) +{ + m_globalEnable = enabled; + SetupButton(m_abilityInfo, m_enabled && m_globalEnable); +} \ No newline at end of file diff --git a/Source/UnrealProject/GUI/HUD/AbilityButton.h b/Source/UnrealProject/GUI/HUD/AbilityButton.h new file mode 100644 index 0000000..ab4a4ca --- /dev/null +++ b/Source/UnrealProject/GUI/HUD/AbilityButton.h @@ -0,0 +1,42 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Blueprint/UserWidget.h" +#include "AbilityButton.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API UAbilityButton : public UUserWidget +{ + GENERATED_BODY() + +public: + void NativeConstruct() override; + + UFUNCTION(BlueprintImplementableEvent, Category = "Button") + void SetupButton(class UAbilityInfo* info, bool enabled); + UFUNCTION(BlueprintImplementableEvent, Category = "Button") + void SetCooldown(float cooldown); + UFUNCTION(BlueprintImplementableEvent, Category = "Button") + void SetToggled(bool toggled); + UFUNCTION(BlueprintImplementableEvent, Category = "Button") + void SetIndex(int32 index, bool alt); + UFUNCTION(BlueprintImplementableEvent, Category = "Button") + void SetAbilityAvailable(bool available); + + class UAbilityInfo* GetAbility(); + + void InitButton(class UAbilityInfo* info, int32 index, bool alt); + bool IsAssigned() const; + void UpdateState(class AAbilityState* state, class ANetworkCharacter* character); + void SetButtonEnabled(bool enabled); + void SetGlobalEnable(bool enabled); +private: + int32 m_index; + bool m_enabled; + bool m_globalEnable; + class UAbilityInfo* m_abilityInfo; +}; diff --git a/Source/UnrealProject/GUI/HUD/ButtonBarSwitcher.cpp b/Source/UnrealProject/GUI/HUD/ButtonBarSwitcher.cpp new file mode 100644 index 0000000..e26f6f7 --- /dev/null +++ b/Source/UnrealProject/GUI/HUD/ButtonBarSwitcher.cpp @@ -0,0 +1,160 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "AbilityButton.h" +#include "ButtonBarSwitcher.h" +#include "BaseSkillObject.h" +#include "AbilityState.h" +#include "NetworkPlayer.h" +#include "IngameSkillTree.h" +#include "AbilityInfo.h" + +void UButtonBarSwitcher::NativeConstruct() +{ + Super::NativeConstruct(); + + m_globalEnable = true; + m_alternateSkillSet = false; + m_FindAndAddButtonBar("ButtonBarMain"); + m_FindAndAddButtonBar("ButtonBarAlt"); +} + +bool UButtonBarSwitcher::AssignSkillButton(const FIngameSkillTreeSkill& skill, bool isAlt) +{ + if (m_mappedButtons.Find(skill.selectedEffect)) + return true; + + int32 bar = isAlt ? 1 : 0; + if (bar >= m_buttonBars.Num()) + return false; + + UAbilityButton* targetButton; + if(!m_buttonBars[bar]->AssignSkillButton(skill, targetButton, isAlt)) + { + GERROR("Too many skills, can't assign " + skill.selectedEffect->GetName() + " to bar " + bar); + return false; + } + + m_mappedButtons.Add(skill.selectedEffect, targetButton); + return true; +} + +void UButtonBarSwitcher::UpdateCooldowns(TArray abilityStates, ANetworkPlayer* player) +{ + for (int32 i = 0; i < abilityStates.Num(); i++) + { + UAbilityButton** button = m_mappedButtons.Find(abilityStates[i]->info); + if (button) + { + (*button)->UpdateState(abilityStates[i], player); + } + } +} + +UButtonBar* UButtonBarSwitcher::m_FindAndAddButtonBar(const FName& name) +{ + UButtonBar* bar = Cast(WidgetTree->FindWidget(name)); + if (bar) + { + m_buttonBars.Add(bar); + } + return bar; +} + +void UButtonBarSwitcher::SetSkillButtonEnabled(const FIngameSkillTreeSkill& skill, bool enabled) +{ + UAbilityButton** button = m_mappedButtons.Find(skill.selectedEffect); + if (button) + { + (*button)->SetButtonEnabled(enabled); + } +} + +void UButtonBarSwitcher::SetGlobalEnable(bool enabled) +{ + for(UButtonBar* bb : m_buttonBars) + { + bb->SetGlobalEnable(enabled); + } +} + +class UAbilityInfo* UButtonBarSwitcher::GetAbilityMapping(int32 index) +{ + if(m_buttonBars.Num() != 2) + { + GERROR("m_buttonBars.Num() != 2"); + return nullptr; + } + UButtonBar* currentBar = m_buttonBars[m_alternateSkillSet ? 1 : 0]; + if(index < 0 || index >= currentBar->buttons.Num()) + return nullptr; + return currentBar->buttons[index]->GetAbility(); +} +class UAbilityInfo* UButtonBarSwitcher::GetAbilityMapping(int32 index, bool isAlt) +{ + if(m_buttonBars.Num() != 2) + { + GERROR("m_buttonBars.Num() != 2"); + return nullptr; + } + UButtonBar* currentBar = m_buttonBars[isAlt ? 1 : 0]; + if(index < 0 || index >= currentBar->buttons.Num()) + return nullptr; + return currentBar->buttons[index]->GetAbility(); +} + +void UButtonBarSwitcher::TransitionToAlternateSkillSet_Implementation() +{ +} +void UButtonBarSwitcher::TransitionToMainSkillSet_Implementation() +{ +} +void UButtonBarSwitcher::ToggleSkillSet(bool useAlternateSkillSet) +{ + if (m_alternateSkillSet != useAlternateSkillSet) + { + if(useAlternateSkillSet) + TransitionToAlternateSkillSet(); + else + TransitionToMainSkillSet(); + m_alternateSkillSet = useAlternateSkillSet; + } +} + +void UButtonBar::NativeConstruct() +{ + TArray widgets; + WidgetTree->GetAllWidgets(widgets); + for (int32 i = 0; i < widgets.Num(); i++) + { + UAbilityButton* button = Cast(widgets[i]); + if (button) + { + buttons.Add(button); + } + } +} + +bool UButtonBar::AssignSkillButton(const FIngameSkillTreeSkill& skill, class UAbilityButton*& buttonOut, bool alt) +{ + for (int32 i = 0; i < buttons.Num(); i++) + { + if (buttons[i]->IsAssigned()) + continue; + buttonOut = buttons[i]; + buttonOut->InitButton(skill.selectedEffect, i, alt); + return true; + } + return false; +} + +void UButtonBar::SetGlobalEnable(bool enabled) +{ + for(UAbilityButton* button : buttons) + { + if(button) + { + button->SetGlobalEnable(enabled); + } + } +} diff --git a/Source/UnrealProject/GUI/HUD/ButtonBarSwitcher.h b/Source/UnrealProject/GUI/HUD/ButtonBarSwitcher.h new file mode 100644 index 0000000..84e9293 --- /dev/null +++ b/Source/UnrealProject/GUI/HUD/ButtonBarSwitcher.h @@ -0,0 +1,58 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Blueprint/UserWidget.h" +#include "ButtonBarSwitcher.generated.h" + +UCLASS() +class UNREALPROJECT_API UButtonBar : public UUserWidget +{ + GENERATED_BODY() +public: + virtual void NativeConstruct() override; + + bool AssignSkillButton(const struct FIngameSkillTreeSkill& skill, class UAbilityButton*& buttonOut, bool alt); + + void SetGlobalEnable(bool enabled); + + UPROPERTY() + TArray buttons; +}; + +UCLASS() +class UNREALPROJECT_API UButtonBarSwitcher : public UUserWidget +{ + GENERATED_BODY() +public: + virtual void NativeConstruct() override; + + bool AssignSkillButton(const struct FIngameSkillTreeSkill& skill, bool isAlt); + void UpdateCooldowns(TArray abilityStates, class ANetworkPlayer* player); + + void SetSkillButtonEnabled(const struct FIngameSkillTreeSkill& skill, bool enabled); + + // Set the global enabled button state + void SetGlobalEnable(bool enabled); + + class UAbilityInfo* GetAbilityMapping(int32 index); + class UAbilityInfo* GetAbilityMapping(int32 index, bool isAlt); + + UFUNCTION(BlueprintNativeEvent, Category="Animation") + void TransitionToAlternateSkillSet(); + UFUNCTION(BlueprintNativeEvent, Category="Animation") + void TransitionToMainSkillSet(); + + void ToggleSkillSet(bool useAlternateSkillSet); + +private: + UButtonBar* m_FindAndAddButtonBar(const FName& name); + + bool m_globalEnable; + bool m_alternateSkillSet; + + UPROPERTY() + TArray m_buttonBars; + UPROPERTY() + TMap m_mappedButtons; +}; diff --git a/Source/UnrealProject/GUI/HUD/HealthBar.cpp b/Source/UnrealProject/GUI/HUD/HealthBar.cpp new file mode 100644 index 0000000..ea68af0 --- /dev/null +++ b/Source/UnrealProject/GUI/HUD/HealthBar.cpp @@ -0,0 +1,126 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "HealthBar.h" +#include "StatBar.h" + +// 1 = Crown +// 2 = Mini-Boss +// 3 = Dot +// 4 = Camp +// 5 = PlayerIcon +static UTexture2D* barIcons[6]; +UHealthBar::UHealthBar(const FObjectInitializer& init) : Super(init) +{ + barIcons[0] = ConstructorHelpers::FObjectFinder(L"/Game/Assets/Art/UI/Minimap/T_IconCrown").Object; + barIcons[1] = ConstructorHelpers::FObjectFinder(L"/Game/Assets/Art/UI/Minimap/T_IconMini").Object; + barIcons[2] = ConstructorHelpers::FObjectFinder(L"/Game/Assets/Art/UI/Minimap/T_IconDot").Object; + barIcons[3] = ConstructorHelpers::FObjectFinder(L"/Game/Assets/Art/UI/Minimap/T_IconCamp").Object; + barIcons[4] = ConstructorHelpers::FObjectFinder(L"/Game/Assets/Art/UI/Minimap/T_IconPlayer").Object; +} + +void UHealthBar::NativeConstruct() +{ + Super::NativeConstruct(); + m_currentIcon = (EMinimapIcon)-1; + m_HP = Cast(WidgetTree->FindWidget("HP")); + m_mana = Cast(WidgetTree->FindWidget("Mana")); + m_styleSwitcher = Cast(WidgetTree->FindWidget("StyleSwitcher")); + m_HP1 = Cast(WidgetTree->FindWidget("HP1")); + m_icon = Cast(WidgetTree->FindWidget("Icon")); + m_name = Cast(WidgetTree->FindWidget("Name")); + SetName(""); + SetIcon(EMinimapIcon::None); + if(m_mana) + { + m_mana->SetBarColor(EBarColor::Blue); + } + m_style = 0; + m_friendly = false; +} + +void UHealthBar::NativeDestruct() +{ + Super::NativeDestruct(); +} + +void UHealthBar::SetIcon(EMinimapIcon _iconID) +{ + if(!m_icon) + return; + if(_iconID == m_currentIcon) + return; + int32 iconID = FMath::Clamp((int32)_iconID, 0, 5); + if(iconID == 0) + m_icon->SetVisibility(ESlateVisibility::Collapsed); + else + { + m_icon->SetBrushFromTexture(barIcons[iconID - 1]); + m_icon->SetVisibility(ESlateVisibility::SelfHitTestInvisible); + } +} + +void UHealthBar::SetStyle(int32 style) +{ + if(style == m_style) + return; + m_style = FMath::Clamp(style, 0, 1); + m_styleSwitcher->SetActiveWidgetIndex(m_style); +} +void UHealthBar::UpdateHealth(int32 curr, int32 max) +{ + m_updateCount++; + bool showAnimation = m_updateCount > 8; + if(m_style == 0) + { + m_HP->SetStat(curr, max, showAnimation); + } + else + { + m_HP1->SetStat(curr, max, showAnimation); + } +} + +void UHealthBar::UpdateMana(int32 curr, int32 max, float blocked) +{ + if(m_style == 0) + { + m_mana->SetStat(curr, max, true); + } +} + +void UHealthBar::UpdateAlignment(bool friendly) +{ + m_friendly = friendly; + + const FLinearColor colorFriendly = FLinearColor(0.18f, 0.8f, 0.23f); + const FLinearColor colorEnemy = FLinearColor(0.73f, 0.1f, 0.13f); + + if(m_style == 0) + { + m_HP->SetBarColor(friendly ? EBarColor::Green : EBarColor::Red); + } + else + { + m_HP1->SetBarColor(friendly ? EBarColor::Green : EBarColor::Red); + } +} + +void UHealthBar::SetName(FString name) +{ + if(!m_name) + return; + if(name.IsEmpty()) + { + m_name->SetVisibility(ESlateVisibility::Collapsed); + } + else + { + if(name.Len() > 16) + { + name = name.Left(13) + "..."; + } + m_name->SetText(FText::FromString(name)); + m_name->SetVisibility(ESlateVisibility::SelfHitTestInvisible); + } +} diff --git a/Source/UnrealProject/GUI/HUD/HealthBar.h b/Source/UnrealProject/GUI/HUD/HealthBar.h new file mode 100644 index 0000000..c7b8322 --- /dev/null +++ b/Source/UnrealProject/GUI/HUD/HealthBar.h @@ -0,0 +1,53 @@ +// Project Lab - NHTV Igad + +#pragma once +#include "Blueprint/UserWidget.h" +#include "HealthBar.generated.h" + +UENUM() +enum class EMinimapIcon : uint8 +{ + None = 0, + Crown, + MiniBoss, + Dot, + Camp, + Player +}; + +UCLASS() +class UNREALPROJECT_API UHealthBar : public UUserWidget +{ + GENERATED_BODY() + +public: + UHealthBar(const FObjectInitializer& init); + virtual void NativeConstruct() override; + virtual void NativeDestruct() override; + + // Icon ID's + // 0 = nothing + // 1 = Crown + // 2 = Mini-Boss + // 3 = Dot + // 4 = Camp + // 5 = PlayerIcon + void SetIcon(EMinimapIcon iconID); + void SetStyle(int32 style); + void UpdateHealth(int32 curr, int32 max); + void UpdateMana(int32 curr, int32 max, float blocked = 0.0f); + void UpdateAlignment(bool friendly); + void SetName(FString name); + +private: + int32 m_style; + bool m_friendly; + class UWidgetSwitcher* m_styleSwitcher; + class UStatBar* m_HP; + class UStatBar* m_mana; + class UStatBar* m_HP1; + UTextBlock* m_name; + UImage* m_icon; + EMinimapIcon m_currentIcon; + int32 m_updateCount = 0; +}; diff --git a/Source/UnrealProject/GUI/HUD/IngameHUD.cpp b/Source/UnrealProject/GUI/HUD/IngameHUD.cpp new file mode 100644 index 0000000..4549daf --- /dev/null +++ b/Source/UnrealProject/GUI/HUD/IngameHUD.cpp @@ -0,0 +1,347 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "DefaultPlayerController.h" +#include "IngameHUD.h" +#include "AbilityInfo.h" +#include "AbilityState.h" +#include "NetworkPlayer.h" +#include "HealthBar.h" +#include "CreatureSpawn.h" +#include "PlayerSlot.h" +#include "DefaultGameState.h" +#include "DefaultPlayerState.h" +#include "MiniMapWidget.h" +#include "ToolTipWidget.h" +#include "CombatText/CombatTextWidget.h" +#include "SpellInfoDisplay.h" +#include "ButtonBarSwitcher.h" +#include "BaseSkillObject.h" +#include "WidgetLayoutLibrary.h" +#include "NetworkGhost.h" +#include "TouhouBoss.h" +#include "MiniBossCreature.h" +#include "StatBar.h" +#include + +static UClass* healthBarWidgetClass; +static UClass* playerSlotWidgetClass; + +UIngameHUD::UIngameHUD(const FObjectInitializer& init) + :Super(init) +{ + ConstructorHelpers::FClassFinder HealthBarWidgetCF(TEXT("/Game/Assets/GUI/WEEGEE_HealthBar")); + healthBarWidgetClass = HealthBarWidgetCF.Class; + + miniMap = nullptr; +} + +void UIngameHUD::NativeConstruct() +{ + m_myTeam = 0; + m_character = nullptr; + Super::NativeConstruct(); + + m_spellInfoDisplay = Cast(WidgetTree->FindWidget("SpellInfoDisplay")); + miniMap = Cast(WidgetTree->FindWidget("Minimap")); + toolTips = Cast(WidgetTree->FindWidget("ToolTipLayer")); + combatText = Cast(WidgetTree->FindWidget("CombatTextLayer")); + buttonBarSwitcher = Cast(WidgetTree->FindWidget("ButtonBarSwitcher")); + healthBarLayer = Cast(WidgetTree->FindWidget("HealthBarLayer")); + + // Find stat display items + m_playerStatDisplay.hpBar = Cast(WidgetTree->FindWidget("HP")); + m_playerStatDisplay.manaBar = Cast(WidgetTree->FindWidget("Mana")); + m_playerStatDisplay.expBar = Cast(WidgetTree->FindWidget("Exp")); + m_allyStatDisplay.hpBar = Cast(WidgetTree->FindWidget("HP1")); + m_allyStatDisplay.manaBar = Cast(WidgetTree->FindWidget("Mana1")); + m_allyStatDisplay.name = Cast(WidgetTree->FindWidget("Name1")); + m_InitStatDisplay(m_playerStatDisplay); + m_InitStatDisplay(m_allyStatDisplay); + + check(healthBarLayer); +} +void UIngameHUD::NativeDestruct() +{ + Super::NativeDestruct(); +} +void UIngameHUD::NativeTick(const FGeometry& MyGeometry, float InDeltaTime) +{ + Super::NativeTick(MyGeometry, InDeltaTime); + auto p = m_healthBars.CreateIterator(); + while (p) + { + m_UpdateHealthBar(p.Key(), p.Value()); + ++p; + } + + ADefaultPlayerState* ps = Cast(GetOwningPlayer()->PlayerState); + if (IsValid(ps)) + { + m_UpdateStatDisplay(ps, m_playerStatDisplay); + m_UpdateStatDisplay(ps->teamMate, m_allyStatDisplay); + } + + //UWorld* world = GetWorld(); + //check(world); + //ADefaultGameState* state = Cast(world->GetGameState()); +} + +void UIngameHUD::NativeOnAssignCharacter(class ANetworkPossessable* pawn /*= nullptr*/, TArray skillsetPrototype /*= TArray()*/) +{ + m_character = pawn; + + // Cast to ghost or player + ANetworkPlayer* player = Cast(pawn); + ANetworkGhost* ghost = Cast(pawn); + if(ghost) + { + // Grey out buttons in ghost mode + buttonBarSwitcher->SetGlobalEnable(false); + } + else if(player) + { + // Enable buttons back in player mode + buttonBarSwitcher->SetGlobalEnable(true); + + // Set skill prototypes + if(buttonBarSwitcher) + { + for(int32 i = 0; i < skillsetPrototype.Num(); i++) + { + // Don't assign buttons for passive skills + if(skillsetPrototype[i].selectedEffect->passive) + continue; + + switch(skillsetPrototype[i].abilityType) + { + case 0: + buttonBarSwitcher->AssignSkillButton(skillsetPrototype[i], false); + break; + case 1: + buttonBarSwitcher->AssignSkillButton(skillsetPrototype[i], true); + break; + case 2: + if(skillsetPrototype[i].selectedEffect && !skillsetPrototype[i].selectedEffect->passive) + { + GERROR("Non-passive skill added to skill with shape type == passive, " + + skillsetPrototype[i].skillObject->GetName() + " <= " + + skillsetPrototype[i].selectedEffect->GetName()); + } + } + } + } + m_myTeam = player->GetTeam(); + } + + OnAssignCharacter(pawn); +} + +void UIngameHUD::OnLevelUp(TArray updatedSkills) +{ + if (m_spellInfoDisplay && GetPlayer()) + m_spellInfoDisplay->OnLevelUp(GetPlayer(), updatedSkills); + + if (buttonBarSwitcher) + { + for (int32 i = 0; i < updatedSkills.Num(); i++) + { + buttonBarSwitcher->SetSkillButtonEnabled(updatedSkills[i], true); + } + } +} + +void UIngameHUD::UpdateCooldowns(TArray abilityStates, ANetworkPlayer* player) +{ + if (buttonBarSwitcher) + buttonBarSwitcher->UpdateCooldowns(abilityStates, player); +} + +void UIngameHUD::OnCharacterCreated(ANetworkCharacter* character) +{ + if (m_healthBars.Find(character)) + { + // When OnCharacterCreated is called twice + GWWARNING(L"OnCharacterCreated called more thatn once"); + return; + } + UHealthBar* widget = CreateWidget(GetOwningPlayer(), healthBarWidgetClass); + check(widget); + healthBarLayer->AddChild(widget); + m_healthBars.Add(character, widget); + m_UpdateHealthBar(character, widget); +} +void UIngameHUD::OnCharacterDestroyed(ANetworkCharacter* character) +{ + auto it = m_healthBars.Find(character); + if (it) + { + (*it)->RemoveFromViewport(); + m_healthBars.Remove(character); + } + else + { + // When OnCharacterDestroyed is called twice + GWWARNING(L"OnCharacterDestroyed called more than once"); + } +} + +ANetworkPlayer* UIngameHUD::GetTeamMate() const +{ + if (Cast(m_character)) + { + ANetworkPlayer* teamMate = Cast(m_character)->GetTeamMate(); + return teamMate; + } + return nullptr; +} +ANetworkPlayer* UIngameHUD::GetPlayer() const +{ + return Cast(m_character); +} +ANetworkGhost* UIngameHUD::GetGhost() const +{ + return Cast(m_character); +} + +class ADefaultPlayerState* UIngameHUD::GetPlayerState() const +{ + if (!m_character) + return nullptr; + return Cast(m_character->PlayerState); +} + +void UIngameHUD::m_UpdateHealthBar(class ANetworkCharacter* character, class UHealthBar* bar) +{ + APlayerController* pc = GetOwningPlayer(); + if (!IsValid(pc)) return; + + FVector screenPos; + const float height = character->GetCapsuleComponent()->GetScaledCapsuleHalfHeight(); + const FVector position = character->GetActorLocation(); + const FVector worldLocation = FVector(position.X, position.Y, position.Z + height); + + // Check if is approximately in camera view + const FVector forward = pc->PlayerCameraManager->GetCameraRotation().RotateVector(FVector(1.0f, 0.0f, 0.0f)); + const FVector dir = (worldLocation - pc->PlayerCameraManager->GetCameraLocation()).GetSafeNormal(); + float dot = FVector::DotProduct(forward, dir); + if (dot < 0.01f) + { + bar->SetVisibility(ESlateVisibility::Hidden); + return; + } + bar->SetVisibility(ESlateVisibility::Visible); + + pc->ProjectWorldLocationToScreenWithDistance(FVector(position.X, position.Y, position.Z + height), screenPos); + const float viewportScale = UWidgetLayoutLibrary::GetViewportScale(healthBarLayer); + + uint32 otherTeam = character->GetTeam(); + + // Check witch bar style to use + bool useExtendedBarStyle = character->playerName.Len() > 0; + if(useExtendedBarStyle) + { + bar->SetStyle(0); + bar->UpdateMana(character->GetMana(), character->GetMaxMana(), character->GetBlockedMana()); + bar->SetName(character->playerName); + } + else + { + bar->SetStyle(1); + bar->SetName(""); + } + bar->UpdateAlignment(otherTeam == m_myTeam); + bar->UpdateHealth(character->GetHealth(), character->GetMaxHealth()); + + // Set the icon next to the bar + EMinimapIcon icon = EMinimapIcon::None; + if(character->IsA()) + { + icon = EMinimapIcon::Crown; + } + else if(character->IsA()) + { + icon = EMinimapIcon::MiniBoss; + } + bar->SetIcon(icon); + + // Set the on-screen position + UCanvasPanelSlot* asSlot = Cast(bar->Slot); + if (IsValid(asSlot)) + { + asSlot->SetAutoSize(true); + asSlot->SetAlignment(FVector2D(0.5f, 1)); + const FVector2D setPos = FVector2D(screenPos.X, screenPos.Y) / viewportScale; + asSlot->SetPosition(FVector2D(FPlatformMath::RoundToFloat(setPos.X), FPlatformMath::RoundToFloat(setPos.Y))); + } +} + +void UIngameHUD::m_UpdateStatDisplay(class ADefaultPlayerState* state, const FStatDisplay& sd) +{ + ANetworkPlayer* player = state ? state->character : nullptr; + if(sd.hpBar) + { + if(!player) + sd.hpBar->SetStat(0.0f, true); + else + { + sd.hpBar->SetStat(player->GetHealth(), player->GetMaxHealth(), true); + } + } + if(sd.manaBar) + { + if(!player) + { + sd.manaBar->SetBlocked(0.0f); + sd.manaBar->SetStat(0, 1, true); + } + else + { + sd.manaBar->SetStat(player->GetMana(), player->GetMaxMana(), true); + sd.manaBar->SetBlocked((float)player->GetBlockedMana() / (float)player->GetMaxMana()); + } + } + + if(sd.expBar) + { + if(state) + { + if(state->GetLevel() == state->GetMaxLevel()) + sd.expBar->Update(1.0f, state->GetMaxLevel(), true); + else + sd.expBar->Update((float)state->GetExperience() / (float)state->GetExperienceToLevel(), state->GetLevel(), false); + } + else + { + sd.expBar->Update(0.0f, 0, false); + } + } + if(sd.name) + { + if(state) + { + state->UpdatePersona(); + sd.name->SetText(FText::FromString(state->nickname)); + } + else + { + sd.name->SetText(FText()); + } + } + if(sd.avatar && state) + { + sd.avatar->SetBrushFromTexture(state->avatar); + } +} + +void UIngameHUD::m_InitStatDisplay(const FStatDisplay& sd) +{ + if(sd.hpBar) + { + sd.hpBar->SetBarColor(EBarColor::GreenGradient); + } + if(sd.manaBar) + { + sd.manaBar->SetBarColor(EBarColor::BlueGradient); + } +} diff --git a/Source/UnrealProject/GUI/HUD/IngameHUD.h b/Source/UnrealProject/GUI/HUD/IngameHUD.h new file mode 100644 index 0000000..a305f9a --- /dev/null +++ b/Source/UnrealProject/GUI/HUD/IngameHUD.h @@ -0,0 +1,93 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Blueprint/UserWidget.h" +#include "IngameSkillTree.h" +#include +#include +#include "IngameHUD.generated.h" + +UCLASS() +class UExperienceBar : public UUserWidget +{ + GENERATED_BODY() +public: + UFUNCTION(BlueprintImplementableEvent) + void Update(float rate, int32 level, bool max); +}; + +struct FStatDisplay +{ + class UStatBar* hpBar; + class UStatBar* manaBar; + class UExperienceBar* expBar; + class UImage* avatar; + class UTextBlock* name; +}; + +UCLASS() +class UNREALPROJECT_API UIngameHUD : public UUserWidget +{ + GENERATED_BODY() + +public: + UIngameHUD(const FObjectInitializer& init); + virtual void NativeConstruct() override; + virtual void NativeDestruct() override; + virtual void NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override; + + // Sets the player owned character + void NativeOnAssignCharacter(class ANetworkPossessable* pawn = nullptr, TArray skillsetPrototype = TArray()); + + UFUNCTION(BlueprintImplementableEvent, Category = "HUD") + void OnAssignCharacter(ANetworkPossessable* pawn); + + // Called when the character levels up + void OnLevelUp(TArray updatedSkills); + + // Updates the displayed cooldowns in the UI with the provided ability states + void UpdateCooldowns(TArray abilityStates, class ANetworkPlayer* player); + + // Called when a character spawns + // this makes it display a health-bar in the HUD + void OnCharacterCreated(class ANetworkCharacter* character); + // Called when a character despawns(destroyed, killed) + // this removes all the health-bars, etc. for this character + void OnCharacterDestroyed(class ANetworkCharacter* character); + + UFUNCTION(BlueprintCallable, Category = "UI") + class ANetworkPlayer* GetTeamMate() const; + UFUNCTION(BlueprintCallable, Category = "UI") + class ANetworkPlayer* GetPlayer() const; + UFUNCTION(BlueprintCallable, Category = "UI") + class ANetworkGhost* GetGhost() const; + UFUNCTION(BlueprintCallable, Category = "UI") + class ADefaultPlayerState* GetPlayerState() const; + + class UMiniMapWidget* miniMap; + class UToolTipWidget* toolTips; + class UCombatTextWidget* combatText; + class UButtonBarSwitcher* buttonBarSwitcher; + class UCanvasPanel* healthBarLayer; + +private: + // This updates an on screen health bar for a given network character + void m_UpdateHealthBar(class ANetworkCharacter* character, class UHealthBar* bar); + void m_UpdateStatDisplay(class ADefaultPlayerState* player, const FStatDisplay& statDisplay); + void m_InitStatDisplay(const FStatDisplay& statDisplay); + + FStatDisplay m_playerStatDisplay; + FStatDisplay m_allyStatDisplay; + + // Maps every character in the game to a health bar widget on-screen + UPROPERTY() + TMap m_healthBars; + + UPROPERTY() + class ANetworkPossessable* m_character; + UPROPERTY() + class USpellInfoDisplay* m_spellInfoDisplay; + + uint32 m_myTeam; +}; diff --git a/Source/UnrealProject/GUI/HUD/KOTHHUD.cpp b/Source/UnrealProject/GUI/HUD/KOTHHUD.cpp new file mode 100644 index 0000000..d42eec7 --- /dev/null +++ b/Source/UnrealProject/GUI/HUD/KOTHHUD.cpp @@ -0,0 +1,13 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "KOTHHUD.h" + + +void UKOTHHUD::NativeConstruct() +{ + Super::NativeConstruct(); +} +void UKOTHHUD::Update(TArray teamStates) +{ +} diff --git a/Source/UnrealProject/GUI/HUD/KOTHHUD.h b/Source/UnrealProject/GUI/HUD/KOTHHUD.h new file mode 100644 index 0000000..71e5eef --- /dev/null +++ b/Source/UnrealProject/GUI/HUD/KOTHHUD.h @@ -0,0 +1,16 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Blueprint/UserWidget.h" +#include "KOTHTeamState.h" +#include "KOTHHUD.generated.h" + +UCLASS() +class UNREALPROJECT_API UKOTHHUD : public UUserWidget +{ + GENERATED_BODY() +public: + void NativeConstruct() override; + void Update(TArray teamStates); +}; diff --git a/Source/UnrealProject/GUI/HUD/KeyDisplay.cpp b/Source/UnrealProject/GUI/HUD/KeyDisplay.cpp new file mode 100644 index 0000000..efa4c95 --- /dev/null +++ b/Source/UnrealProject/GUI/HUD/KeyDisplay.cpp @@ -0,0 +1,14 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "KeyDisplay.h" + +void UKeyDisplay::NativeConstruct() +{ + Super::NativeConstruct(); +} + +void UKeyDisplay::NativeDestruct() +{ + Super::NativeDestruct(); +} \ No newline at end of file diff --git a/Source/UnrealProject/GUI/HUD/KeyDisplay.h b/Source/UnrealProject/GUI/HUD/KeyDisplay.h new file mode 100644 index 0000000..c9fe873 --- /dev/null +++ b/Source/UnrealProject/GUI/HUD/KeyDisplay.h @@ -0,0 +1,16 @@ +// Project Lab - NHTV Igad + +#pragma once +#include "Blueprint/UserWidget.h" +#include "KeyDisplay.generated.h" + + +UCLASS() +class UNREALPROJECT_API UKeyDisplay : public UUserWidget +{ + GENERATED_BODY() + +public: + virtual void NativeConstruct() override; + virtual void NativeDestruct() override; +}; diff --git a/Source/UnrealProject/GUI/HUD/StatBar.cpp b/Source/UnrealProject/GUI/HUD/StatBar.cpp new file mode 100644 index 0000000..fbb769f --- /dev/null +++ b/Source/UnrealProject/GUI/HUD/StatBar.cpp @@ -0,0 +1,192 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "StatBar.h" + +static UTexture2D* barTextures[6]; +static FLinearColor barColors[4]; +static UMaterial* textureBarMaterialClass; + +UStatBar::UStatBar(const FObjectInitializer& init) : Super(init) +{ + textureBarMaterialClass = ConstructorHelpers::FObjectFinder(L"/Game/Assets/Art/UI/M_HealthBar2.M_HealthBar2").Object; + + barColors[0] = FLinearColor::Green * 0.5f; + barColors[1] = FLinearColor::Red * 0.6f; + barColors[2] = FLinearColor::Blue * 0.8f; + barColors[3] = FLinearColor(1.0f, 0.0f, 1.0f, 1.0f); + barTextures[0] = ConstructorHelpers::FObjectFinder(L"/Game/Assets/Art/UI/HealthBar/UI_MainStatusBarHealth").Object; + barTextures[1] = ConstructorHelpers::FObjectFinder(L"/Game/Assets/Art/UI/HealthBar/UI_MainStatusBarMana").Object; + + m_lastValue = 1.0f; + m_currentValue = 1.0f; + damageAnimationDuration = 0.3f; + m_damageAnimation = 0.0f; + showText = false; +} + +void UStatBar::NativeConstruct() +{ + Super::NativeConstruct(); + m_base = Cast(WidgetTree->FindWidget("Base")); + m_blocked = Cast(WidgetTree->FindWidget("Blocked")); + m_damage = Cast(WidgetTree->FindWidget("Damage")); + m_text = Cast(WidgetTree->FindWidget("BarText")); + if(m_damage) + { + m_damage->SetVisibility(ESlateVisibility::Hidden); + UMaterialInstanceDynamic* damageMat = m_damage->GetDynamicMaterial(); + damageMat->SetScalarParameterValue("Brightness", 4.0f); + } + if(m_blocked) + m_blocked->SetVisibility(ESlateVisibility::Hidden); +} + +#pragma optimize("", off) +void UStatBar::NativeTick(const FGeometry& MyGeometry, float InDeltaTime) +{ + Super::NativeTick(MyGeometry, InDeltaTime); + + if(m_damageAnimation > 0.0f && m_damage) + { + float r = m_damageAnimation / damageAnimationDuration; + float damageSize = (m_currentValue - m_lastValue); + + UMaterialInstanceDynamic* matDamage = m_damage->GetDynamicMaterial(); + if(damageSize < 0.0f) + { + damageSize *= (1.0f - r); + matDamage->SetScalarParameterValue("Start", m_currentValue); + matDamage->SetScalarParameterValue("End", m_lastValue + damageSize); + } + else + { + damageSize *= (1.0f-r); + matDamage->SetScalarParameterValue("Start", m_lastValue + damageSize); + matDamage->SetScalarParameterValue("End", m_currentValue); + } + + m_damageAnimation -= InDeltaTime; + if(m_damageAnimation <= 0.0f) + { + m_damageAnimation = 0.0f; + m_damage->SetVisibility(ESlateVisibility::Hidden); + } + } +} + +#pragma optimize("", off) +void UStatBar::SetStat(float newStat, bool applyAnimation) +{ + if(!m_base) + return; + if(newStat == m_currentValue) + return; + + float delta = newStat - m_currentValue; + if(delta != 0 && m_damageAnimation > 0.0f) + { + // Append animation + float r = m_damageAnimation / damageAnimationDuration; + float damageSize = (m_currentValue - m_lastValue); + if(damageSize < 0.0f) + damageSize *= (1.0f - r); + else + damageSize *= (1.0f - r); + delta += damageSize; + m_lastValue = m_lastValue + damageSize; + } + else + { + m_lastValue = m_currentValue; + } + m_currentValue = newStat; + + // Apply animation + if(delta != 0.0f && applyAnimation && m_damage) + { + const FLinearColor deltaColor = FLinearColor(1.0f, 0.0f, 0.0f, 1.0f); + m_damageAnimation = damageAnimationDuration; + + UMaterialInstanceDynamic* matDamage = m_base->GetDynamicMaterial(); + if(delta < 0.0f) + { + matDamage->SetScalarParameterValue("Start", newStat); + matDamage->SetScalarParameterValue("End", m_lastValue); + } + else + { + matDamage->SetScalarParameterValue("Start", m_lastValue); + matDamage->SetScalarParameterValue("End", newStat); + } + m_damage->SetVisibility(ESlateVisibility::SelfHitTestInvisible); + } + + UMaterialInstanceDynamic* matBase = m_base->GetDynamicMaterial(); + matBase->SetScalarParameterValue("Start", 0.0f); + matBase->SetScalarParameterValue("End", newStat); +} + +void UStatBar::SetStat(int32 newStat, int32 max, bool applyAnimation) +{ + if(showText && m_text) + { + FText t = FText::FromString(FString::Printf(L"%d / %d", newStat, max)); + m_text->SetText(t); + m_text->SetVisibility(ESlateVisibility::SelfHitTestInvisible); + } + else + { + m_text->SetVisibility(ESlateVisibility::Hidden); + } + + float r = (float)newStat / (float)max; + SetStat(r, applyAnimation); +} + +void UStatBar::SetBlocked(float newBlocked) +{ + if(!m_blocked) + return; + UMaterialInstanceDynamic* mat = m_blocked->GetDynamicMaterial(); + if(newBlocked > 0.0f) + { + mat->SetScalarParameterValue("Start", 1.0f - newBlocked); + mat->SetScalarParameterValue("End", 1.0f); + m_blocked->SetVisibility(ESlateVisibility::SelfHitTestInvisible); + } + else + { + m_blocked->SetVisibility(ESlateVisibility::Hidden); + } +} + +void UStatBar::SetBarColor(EBarColor _colorID) +{ + int32 colorID = (int32)_colorID; + if(!m_base) + return; + + if((colorID & 0x80) != 0) + { + colorID = colorID & 0x7F; + colorID = FMath::Clamp(colorID, 0, (int32)(sizeof(barTextures) / sizeof(UTexture2D*))); + + m_base->SetBrushFromMaterial(textureBarMaterialClass); + m_blocked->SetBrushFromMaterial(textureBarMaterialClass); + m_damage->SetBrushFromMaterial(textureBarMaterialClass); + UMaterialInstanceDynamic* baseMat = m_base->GetDynamicMaterial(); + baseMat->SetTextureParameterValue("Texture", barTextures[colorID]); + baseMat = m_damage->GetDynamicMaterial(); + baseMat->SetTextureParameterValue("Texture", barTextures[colorID]); + baseMat = m_blocked->GetDynamicMaterial(); + baseMat->SetTextureParameterValue("Texture", barTextures[colorID]); + } + else + { + colorID = FMath::Clamp(colorID, 0, (int32)(sizeof(barColors) / sizeof(FLinearColor))); + + UMaterialInstanceDynamic* baseMat = m_base->GetDynamicMaterial(); + baseMat->SetVectorParameterValue("Color", barColors[colorID]); + } +} diff --git a/Source/UnrealProject/GUI/HUD/StatBar.h b/Source/UnrealProject/GUI/HUD/StatBar.h new file mode 100644 index 0000000..d520f3e --- /dev/null +++ b/Source/UnrealProject/GUI/HUD/StatBar.h @@ -0,0 +1,49 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Blueprint/UserWidget.h" +#include "StatBar.generated.h" + +enum class EBarColor +{ + Green = 0, + Red, + Blue, + Purple, + GreenGradient = 0x80, + BlueGradient +}; + +/** + * + */ +UCLASS() +class UNREALPROJECT_API UStatBar : public UUserWidget +{ + GENERATED_BODY() + +public: + UStatBar(const FObjectInitializer& init); + void NativeConstruct() override; + void NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override; + + void SetStat(int32 newStat, int32 max, bool applyAnimation); + void SetStat(float newStat, bool applyAnimation); + void SetBlocked(float newBlocked); + void SetBarColor(EBarColor colorID); + + UPROPERTY(EditDefaultsOnly, Category = "Stat Bar") + float damageAnimationDuration; + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Stat Bar") + bool showText; + +private: + float m_damageAnimation; + float m_lastValue; + float m_currentValue; + UImage* m_base; + UImage* m_blocked; + UImage* m_damage; + UTextBlock* m_text; +}; diff --git a/Source/UnrealProject/GUI/HUD/Timer.cpp b/Source/UnrealProject/GUI/HUD/Timer.cpp new file mode 100644 index 0000000..de5abe6 --- /dev/null +++ b/Source/UnrealProject/GUI/HUD/Timer.cpp @@ -0,0 +1,49 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "Timer.h" +#include "Kismet/KismetStringLibrary.h" + +void UTimer::NativeConstruct() +{ + m_duration = 0.0f; + m_text = Cast(WidgetTree->FindWidget("Text")); + m_timerText = Cast(WidgetTree->FindWidget("Time")); + m_clock = Cast(WidgetTree->FindWidget("Klokje")); + if(!m_text) + GWARNING("No \"Text\" text widget found in " + GetName()); + if(!m_text) + GWARNING("No \"Time\" text widget found in " + GetName()); + if(!m_clock) + GWARNING("No \"Klokje\" image widget found in " + GetName()); + Super::NativeConstruct(); +} + +void UTimer::NativeTick(const FGeometry& MyGeometry, float InDeltaTime) +{ + m_time = FMath::Clamp(m_time - InDeltaTime, 0.0f, m_duration); + if(m_duration == 0.0f) + OnSetTimer(0.0f); + else + OnSetTimer(m_time / m_duration); + + if(m_timerText) + { + FString msg = UKismetStringLibrary::TimeSecondsToString(m_time); + m_timerText->SetText(FText::FromString(msg)); + } + + Super::NativeTick(MyGeometry, InDeltaTime); +} + +void UTimer::SetTimer(float duration, bool reset) +{ + m_duration = duration; + if(reset) + m_time = duration; +} +void UTimer::SetText(const FString& text) +{ + if(m_text) + m_text->SetText(FText::FromString(text)); +} diff --git a/Source/UnrealProject/GUI/HUD/Timer.h b/Source/UnrealProject/GUI/HUD/Timer.h new file mode 100644 index 0000000..ebd13af --- /dev/null +++ b/Source/UnrealProject/GUI/HUD/Timer.h @@ -0,0 +1,44 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Blueprint/UserWidget.h" +#include "Timer.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API UTimer : public UUserWidget +{ + GENERATED_BODY() + +public: + // Calbacks handling timer changes + UFUNCTION(BlueprintImplementableEvent, Category = "HUDTimer") + void OnSetTimer(float rate); + UFUNCTION(BlueprintImplementableEvent, Category = "HUDTimer") + void OnHide(); // Play animation + UFUNCTION(BlueprintImplementableEvent, Category = "HUDTimer") + void OnShow(); // Play animation + + void NativeConstruct(); + void NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override; + + UFUNCTION(BlueprintCallable, Category = "HUDTimer") + void SetTimer(float duration, bool reset = true); + UFUNCTION(BlueprintCallable, Category = "HUDTimer") + void SetText(const FString& text); + UFUNCTION(BlueprintCallable, Category = "HUDTimer") + float GetTime() const + { + return m_time; + } + +private: + float m_time; + float m_duration; + UImage* m_clock; + UTextBlock* m_text; + UTextBlock* m_timerText; +}; diff --git a/Source/UnrealProject/GUI/Lobby/LobbyCharacterSelect.cpp b/Source/UnrealProject/GUI/Lobby/LobbyCharacterSelect.cpp new file mode 100644 index 0000000..23e0795 --- /dev/null +++ b/Source/UnrealProject/GUI/Lobby/LobbyCharacterSelect.cpp @@ -0,0 +1,285 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "DefaultGameInstance.h" +#include "MenuController.h" +#include "LobbySpawn.h" +#include "GameStateBase.h" +#include "PlayerStateBase.h" +#include "PlayerControllerBase.h" +#include "CharacterBase.h" +#include "LobbyCharacterSelect.h" +#include "MenuGameMode.h" + +void ULobbyCharacterSelect::m_OnPlayerJoined(APlayerController* pc) +{ + for(auto it = m_visualCharacters.CreateIterator(); it; ++it) + { + (it.Value()).character->SendInitialAppearance(pc); + } +} + +void ULobbyCharacterSelect::NativeConstruct() +{ + Super::NativeConstruct(); + + // Add GameMode callback + AMenuGameMode* gm = Cast(GetWorld()->GetAuthGameMode()); + if(gm) + { + m_onPlayerJoinedDH = gm->onPlayerJoined.AddUObject(this, &ULobbyCharacterSelect::m_OnPlayerJoined); + } + + UWorld* const world = GetWorld(); + for (TActorIterator iter(world); iter; ++iter) + { + TArray* find = m_spawnPoints.Find(iter->assignedTeam); + if (!find) + { + TArray arr; + arr.Add(*iter); + m_spawnPoints.Add(iter->assignedTeam, arr); + } + else + find->Add(*iter); + } + + m_requireUpdate = false; + m_updateInterval = 0; + + AGameStateBase* gameState = Cast(world->GetGameState()); + check(gameState); + gameState->OnPlayerStateChange.AddDynamic(this, &ULobbyCharacterSelect::UpdateVisualCharacters); +} +void ULobbyCharacterSelect::NativeDestruct() +{ + Super::NativeDestruct(); + + // Remove GameMode Callback + AMenuGameMode* gm = Cast(GetWorld()->GetAuthGameMode()); + if(gm) + { + gm->onPlayerJoined.Remove(m_onPlayerJoinedDH); + } + + UWorld* const world = GetWorld(); + check(world); + AGameStateBase* gameState = Cast(world->GetGameState()); + check(gameState); + gameState->OnPlayerStateChange.RemoveAll(this); +} +void ULobbyCharacterSelect::NativeTick(const FGeometry& MyGeometry, float InDeltaTime) +{ + // The updating is called once per frame + // This is to prevent double calls when two players leave in one cycle + + // Ensure that only the server runs this + if (!GetOwningPlayer()->HasAuthority()) + return; + + // No need to update this frame + if (!m_requireUpdate) + return; + + // Await the interval + m_updateInterval -= InDeltaTime; + if (m_updateInterval > 0) + return; + + m_requireUpdate = false; + m_updateInterval = 0.3f; + + UWorld* world = GetWorld(); + check(world); + AGameStateBase* gameState = Cast(world->GetGameState()); + check(gameState); + TArray teamSizes = gameState->GetTeamSizes(); + TArray> playersPerTeam = gameState->GetPlayersByTeam(); + + // Check if players have left + TMap outdatedCharacters = m_visualCharacters; + TArray players = gameState->GetPlayers(); + for (int32 i = 0; i < players.Num(); i++) + { + VisualSlot* find = outdatedCharacters.Find(players[i]); + if (find) + outdatedCharacters.Remove(players[i]); + } + for (auto iter = outdatedCharacters.CreateIterator(); iter; ++iter) + { + if (IsValid(iter->Value.character)) + iter->Value.character->Destroy(); + m_visualCharacters.Remove(iter->Key); + } + + // Check if players switched team + TMap newCharacters; + TMap newMap; + for (int32 i = 1; i < playersPerTeam.Num(); i++) + { + auto& set = playersPerTeam[i]; + for (int32 j = 0; j < set.Num(); j++) + { + APlayerStateBase* playerState = set[j]; + + VisualSlot* find = m_visualCharacters.Find(playerState); + const int32 team = i - 1; + if (!find || find->team != team || find->slot != j) + { + // Fetch the spawn coordinates if the spawnpoint exists + FVector position; + FRotator rotation; + if (team < m_spawnPoints.Num() && j < m_spawnPoints[team].Num()) + { + position = m_spawnPoints[team][j]->GetActorLocation(); + rotation = m_spawnPoints[team][j]->GetActorRotation(); + } + + // Check if we need to create a new character, else we just repurpose the previous character (like when the player switched slot) + ACharacterBase* character; + if (!find || !IsValid(find->character)) + { + FActorSpawnParameters params; + params.bNoFail = true; + params.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn; + character = GetWorld()->SpawnActor(characterBlueprint, FTransform::Identity, params); + if (!IsValid(character)) + { + JERROR("Failed to spawn Actor"); + return; + } + } + else + { + find->character->ClearEquipment(); + character = find->character; + } + + // Set and add + character->SetActorLocation(position); + character->SetActorRotation(rotation.Quaternion()); + newMap.Add(playerState, VisualSlot(team, j, character)); + newCharacters.Add(playerState, character); + } + else + newMap.Add(playerState, *find); + } + } + m_visualCharacters = newMap; + + // Apply the customizations + TMap controllers = gameState->GetPlayersByController(); + for (auto iter = controllers.CreateIterator(); iter; ++iter) + { + ACharacterBase** character = newCharacters.Find(iter->Value); + if (!character || !IsValid(*character)) continue; + (*character)->SetCustomizations(iter->Key->setupState.customizations); + (*character)->EquipSkillsFromSkillTreeState(iter->Key->setupState.skills); + + // Set class specific equipment + if(characterClassProperties) + { + FCharacterClassProperty properties = characterClassProperties->GetCharacterClass(iter->Key->setupState.characterClass); + (*character)->EquipItems(properties.classItems); + } + } +} + +void ULobbyCharacterSelect::Init() +{ + UWorld* const world = GetWorld(); + check(world); + UDefaultGameInstance* const instance = Cast(world->GetGameInstance()); + check(instance); + UCharacterSettings* const settings = instance->GetCharacterSettings(); + check(settings); + + // Fetch the characters from the save + check(settings->characterSaves.Num() > 0); + m_playerCharacterSaves = settings->GetValidCharacters(); + + m_selection = 0; + + m_ApplyCharacter(); +} + +void ULobbyCharacterSelect::OnNextCharacter() +{ + if (m_selection == m_playerCharacterSaves.Num() - 1) + return; + m_selection++; + + m_ApplyCharacter(); +} +void ULobbyCharacterSelect::OnPreviousCharacter() +{ + if (m_selection == 0) + return; + m_selection--; + + m_ApplyCharacter(); +} + +void ULobbyCharacterSelect::UpdateCharacter_Implementation(FCharacterSave save) +{ + // Blueprint implementation +} + +void ULobbyCharacterSelect::m_ApplyCharacter() +{ + UpdateCharacter(m_playerCharacterSaves[m_selection]); + + // Apply the selected character to the player controller + UWorld* const world = GetWorld(); + check(world); + AMenuController* const controller = Cast(world->GetFirstPlayerController()); + check(controller); + + FPlayerSetupState state; + state.skills = m_playerCharacterSaves[m_selection].skillTreeState; + state.customizations = m_playerCharacterSaves[m_selection].characterCustomization; + state.characterClass = m_playerCharacterSaves[m_selection].characterClass; + controller->SetSetupState(state); +} + +void ULobbyCharacterSelect::UpdateVisualCharacters(APlayerControllerBase* playerController) +{ + if (!IsValid(characterBlueprint)) + { + JERROR("Character blueprint not assigned"); + return; + } + if (!IsValid(playerController) && playerController != nullptr) + return; + + // Ensure that only the server runs this + if (!GetOwningPlayer()->HasAuthority()) + return; + + if (playerController != nullptr) + { + // Just update the visuals on the specific player + APlayerStateBase* playerState = Cast(playerController->PlayerState); + if (IsValid(playerState)) + { + VisualSlot* slot = m_visualCharacters.Find(playerState); + if (slot && IsValid(slot->character)) + { + slot->character->SetCustomizations(playerController->setupState.customizations); + slot->character->ClearEquipment(); + slot->character->EquipSkillsFromSkillTreeState(playerController->setupState.skills); + + // Set class specific equipment + if(characterClassProperties) + { + FCharacterClassProperty properties = characterClassProperties->GetCharacterClass(playerController->setupState.characterClass); + slot->character->EquipItems(properties.classItems); + } + } + else // Failed to find the character, refresh all + m_requireUpdate = true; + } + } + else + m_requireUpdate = true; +} \ No newline at end of file diff --git a/Source/UnrealProject/GUI/Lobby/LobbyCharacterSelect.h b/Source/UnrealProject/GUI/Lobby/LobbyCharacterSelect.h new file mode 100644 index 0000000..8ec57e2 --- /dev/null +++ b/Source/UnrealProject/GUI/Lobby/LobbyCharacterSelect.h @@ -0,0 +1,65 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GUI/Menu/SubMenu.h" +#include "CharacterSettings.h" +#include "LobbyCharacterSelect.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API ULobbyCharacterSelect : public USubMenu +{ + GENERATED_BODY() + +public: + virtual void NativeConstruct() override; + virtual void NativeDestruct() override; + virtual void NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override; + + UFUNCTION(BlueprintCallable, Category = "Lobby") + void Init(); + + // On next/previous player character + UFUNCTION(BlueprintCallable, Category = "Lobby") + void OnNextCharacter(); + UFUNCTION(BlueprintCallable, Category = "Lobby") + void OnPreviousCharacter(); + + // Called to set the name of the selected character + UFUNCTION(BlueprintNativeEvent, Category = "Lobby") + void UpdateCharacter(FCharacterSave save); + + // Called to update all visual characters in the lobby (specify a controller if one player only requires a visual update, or nullptr if all characters need to be updated) + UFUNCTION(BlueprintCallable, Category = "Lobby") + void UpdateVisualCharacters(class APlayerControllerBase* playerController); + + UPROPERTY(EditAnywhere, Category = "Lobby") + TSubclassOf characterBlueprint; + + UPROPERTY(BlueprintReadOnly, EditDefaultsOnly, Category = "Character Sub Menu") + class UCharacterClassPropertySet* characterClassProperties; + +private: + void m_OnPlayerJoined(APlayerController* pc); + FDelegateHandle m_onPlayerJoinedDH; + + TArray m_playerCharacterSaves; + int32 m_selection; + + TMap> m_spawnPoints; + struct VisualSlot + { + VisualSlot(int32 team, int32 slot, ACharacterBase* character) : team(team), slot(slot), character(character) {} + int32 team; + int32 slot; + ACharacterBase* character; + }; + TMap m_visualCharacters; + + void m_ApplyCharacter(); + bool m_requireUpdate; + float m_updateInterval; +}; diff --git a/Source/UnrealProject/GUI/Lobby/LobbyMenu.cpp b/Source/UnrealProject/GUI/Lobby/LobbyMenu.cpp new file mode 100644 index 0000000..8075ae2 --- /dev/null +++ b/Source/UnrealProject/GUI/Lobby/LobbyMenu.cpp @@ -0,0 +1,204 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "LobbyMenu.h" +#include "LobbySlot.h" +#include "DefaultPlayer.h" +#include "PlayerStateBase.h" +#include "MenuController.h" +#include "DefaultGameInstance.h" +#include "MenuGameMode.h" +#include "GameStateBase.h" +#include "SubMenu.h" +#include "SessionManager.h" +#include "Engine.h" +#include "ScreenOverlay.h" +#include "CharacterSettings.h" + +ULobbyMenu::ULobbyMenu(const FObjectInitializer& init) + : Super(init) +{ +} + +void ULobbyMenu::NativeConstruct() +{ + m_teamContainer = Cast(WidgetTree->FindWidget("Container")); + Super::NativeConstruct(); +} +void ULobbyMenu::NativeDestruct() +{ + Super::NativeDestruct(); +} +void ULobbyMenu::NativeTick(const FGeometry& MyGeometry, float InDeltaTime) +{ + Super::NativeTick(MyGeometry, InDeltaTime); + + if(!m_myState) + { + // Try to aquire my local player state, this is in Tick because player states are not guaranteed during BeginPlay + UWorld* const world = GetWorld(); + check(world); + APlayerControllerBase* player = Cast(world->GetGameInstance()->GetFirstLocalPlayerController()); + check(player); + m_myState = Cast(player->PlayerState); + } + + UWorld* world = GetWorld(); + check(world); + AGameStateBase* gameState = Cast(world->GetGameState()); + check(gameState); + TArray teamSizes = gameState->GetTeamSizes(); + TArray> playersPerTeam = gameState->GetPlayersByTeam(); + + // Update team slots with their respective player arrays + for (int32 i = 0; i < (int32)m_numTeams; i++) + { + if((i + 1) < playersPerTeam.Num()) + { + m_lobbySlots[i]->UpdatePlayers(playersPerTeam[i+1]); + } + else + m_lobbySlots[i]->UpdatePlayers(TArray()); + + if (i > teamSizes.Num()) + { + m_lobbySlots[i]->SetState(false); + } + else + { + m_lobbySlots[i]->SetState(true); + } + } +} +void ULobbyMenu::Init() +{ + // Generate the selectable builds + UWorld* world = GetWorld(); + check(world); + UDefaultGameInstance* instance = Cast(world->GetGameInstance()); + check(instance); + UCharacterSettings* settings = instance->GetCharacterSettings(); + check(settings); + m_characters = settings->characterSaves; + + + // Remove existing lobby slots + for(ULobbySlot* s : m_lobbySlots) + { + s->RemoveFromParent(); + } + m_lobbySlots.SetNum(0); + + if(!m_teamContainer) + { + GWERROR("Container not set, can't initialize lobby menu"); + return; + } + + UPanelWidget* panel = Cast(m_teamContainer->WidgetTree->RootWidget); + if (!panel) + { + GWERROR(L"No UPanelWidget found"); + return; + } + + // Create team slots in this menu for the amount of selected teams in the game setup screen + AGameStateBase* gameState = Cast(world->GetGameState()); + check(gameState); + m_numTeams = gameState->GetMapTeamCount(); + for (uint32 i = 0; i < m_numTeams; i++) + { + ULobbySlot* slot = CreateWidget(GetWorld(), lobbySlotClass); + check(slot); + + panel->AddChild(slot); + slot->SetTeamIndex(i+1); + m_lobbySlots.Add(slot); + } + + m_teamContainer->RescanItems(); +} + +void ULobbyMenu::ToggleReadyState() +{ + // Toggle my player state's ready state + if(!m_myState) + { + UWorld* const world = GetWorld(); + check(world); + APlayerControllerBase* player = Cast(world->GetGameInstance()->GetFirstLocalPlayerController()); + check(player); + m_myState = Cast(player->PlayerState); + } + + if(m_myState) + m_myState->SetReadyState(!m_myState->GetReadyState()); +} +void ULobbyMenu::StartGame() +{ + UWorld* world = GetWorld(); + check(world); + AGameStateBase* gameState = Cast(world->GetGameState()); + check(gameState); + TArray players = gameState->GetPlayers(); + + // Check if we're the host + AMenuGameMode* gameMode = world->GetAuthGameMode(); + if(gameMode) + { + // Check if everyone's ready + for (size_t i = 0; i < players.Num(); i++) + { + if (!players[i]->GetReadyState()) + return; + } + + // Tell the game to start + GPRINT("Starting game"); + if(!gameMode->StartGame()) + { + GERROR("Failed to start game"); + TArray options; + options.Add("OK"); + Cast(GetOwningPlayer())->overlay->ShowMessageBox("Error", "Failed to start game", options); + } + } +} + +void ULobbyMenu::GotoTeamSelector() +{ + if (m_teamContainer) + { + OpenSubMenu(m_teamContainer); + } +} +void ULobbyMenu::BackToMenu() +{ + // Close active session + UDefaultGameInstance* inst = Cast(GetOwningPlayer()->GetGameInstance()); + inst->sessionManager->DestroySession(); + inst->sessionManager->CloseNetConnections(); + + // Goto menu + AMenuController* mc = Cast(GetOwningPlayer()); + mc->SwitchToMenu(); +} +bool ULobbyMenu::IsHost() const +{ + if (!GetOwningPlayer()) + return false; + return GetOwningPlayer()->Role == ROLE_Authority; +} + +void ULobbyMenu::OnLobbyEnter() +{ + // Register session callbacks + UDefaultGameInstance* inst = Cast(GetOwningPlayer()->GetGameInstance()); + Init(); +} + + +TArray ULobbyMenu::GetCharacterSaves() +{ + return m_characters; +} \ No newline at end of file diff --git a/Source/UnrealProject/GUI/Lobby/LobbyMenu.h b/Source/UnrealProject/GUI/Lobby/LobbyMenu.h new file mode 100644 index 0000000..91355d6 --- /dev/null +++ b/Source/UnrealProject/GUI/Lobby/LobbyMenu.h @@ -0,0 +1,63 @@ +// Project Lab - NHTV Igad + +#pragma once +#include "MenuScreenBase.h" +#include "CharacterSettings.h" +#include "LobbyMenu.generated.h" + + +UCLASS() +class UNREALPROJECT_API ULobbyMenu : public UMenuScreenBase +{ + GENERATED_BODY() + +public: + virtual void NativeConstruct() override; + virtual void NativeDestruct() override; + virtual void NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override; + + // Must be called from blueprint to setup this element + void Init(); + + UFUNCTION(BlueprintCallable, Category = "Ready") + void ToggleReadyState(); + UFUNCTION(BlueprintCallable, Category = "Ready") + void StartGame(); + UFUNCTION(BlueprintCallable, Category = "Ready") + void GotoTeamSelector(); + + UFUNCTION(BlueprintCallable, Category = "Game") + void BackToMenu(); + UFUNCTION(BlueprintCallable, Category = "Game") + bool IsHost() const; + + // Called when the local player enters the lobby menu & state + void OnLobbyEnter(); + + // When this menu needs to be hidden + UFUNCTION(BlueprintImplementableEvent) + void OnShow(); + // When this menu needs to be shown + UFUNCTION(BlueprintImplementableEvent) + void OnHide(); + + UPROPERTY(EditDefaultsOnly, Category = "Lobby") + TSubclassOf lobbySlotClass; + + UFUNCTION(BlueprintCallable, Category = "Lobby") + TArray GetCharacterSaves(); + +private: + ULobbyMenu(const FObjectInitializer& init); + + UPROPERTY() + class APlayerStateBase* m_myState; + UPROPERTY() + TArray m_lobbySlots; + UPROPERTY() + class USubMenu* m_teamContainer; + + uint32 m_numTeams; + + TArray m_characters; +}; diff --git a/Source/UnrealProject/GUI/Lobby/LobbyPlayerSlot.cpp b/Source/UnrealProject/GUI/Lobby/LobbyPlayerSlot.cpp new file mode 100644 index 0000000..aade5c5 --- /dev/null +++ b/Source/UnrealProject/GUI/Lobby/LobbyPlayerSlot.cpp @@ -0,0 +1,4 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "LobbyPlayerSlot.h" \ No newline at end of file diff --git a/Source/UnrealProject/GUI/Lobby/LobbyPlayerSlot.h b/Source/UnrealProject/GUI/Lobby/LobbyPlayerSlot.h new file mode 100644 index 0000000..66fa7b7 --- /dev/null +++ b/Source/UnrealProject/GUI/Lobby/LobbyPlayerSlot.h @@ -0,0 +1,16 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GUI/PlayerSlot.h" +#include "PlayerSlot.h" +#include "LobbyPlayerSlot.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API ULobbyPlayerSlot : public UPlayerSlot +{ + GENERATED_BODY() +}; diff --git a/Source/UnrealProject/GUI/Lobby/LobbySlot.cpp b/Source/UnrealProject/GUI/Lobby/LobbySlot.cpp new file mode 100644 index 0000000..bc1cb9f --- /dev/null +++ b/Source/UnrealProject/GUI/Lobby/LobbySlot.cpp @@ -0,0 +1,125 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "LobbySlot.h" +#include "LobbyPlayerSlot.h" +#include "PlayerStateBase.h" +#include "PlayerControllerBase.h" + +#include "SubMenu.h" +#include "MenuScreenBase.h" +#include "GameStateBase.h" + +ULobbySlot::ULobbySlot(const FObjectInitializer& init) + : Super(init) +{ +} + +void ULobbySlot::NativeConstruct() +{ + Super::NativeConstruct(); + m_open = false; +} +void ULobbySlot::NativeTick(const FGeometry& MyGeometry, float InDeltaTime) +{ + Super::NativeTick(MyGeometry, InDeltaTime); + this->bIsEnabled = m_open; +} + +void ULobbySlot::SetTeamIndex(uint32 idx) +{ + m_teamIndex = idx; + m_UpdateTeamTitle(); +} +void ULobbySlot::m_UpdateTeamTitle() +{ + // Set the title of this team slot + if (m_teamName) + { + std::wstring teamName = std::wstring() + L"Team " + m_teamIndex + L" (" + m_players.Num() + L"/2)"; + SetButtonText(FString(teamName.c_str())); + } +} + +void ULobbySlot::UpdatePlayers(TArray players) +{ + check(m_playerList); + check(m_playerSlots.Num() == 2); + + UWorld* const world = GetWorld(); + check(world); + APlayerControllerBase* player = Cast(world->GetGameInstance()->GetFirstLocalPlayerController()); + check(player); + APlayerStateBase* myState = Cast(player->PlayerState); + + // Set all the player slots in this team to show their respective player / no player placeholder + m_players = players; + for (int32 i = 0; i < 2; i++) + { + if (i < m_players.Num()) + { + APlayerStateBase* player = players[i]; + m_playerSlots[i]->Init(player, player == myState); + } + else + { + m_playerSlots[i]->Init(nullptr); + } + } + m_UpdateTeamTitle(); +} +bool ULobbySlot::OnSlotSelected() +{ + UWorld* const world = GetWorld(); + check(world); + APlayerControllerBase* player = Cast(world->GetGameInstance()->GetFirstLocalPlayerController()); + check(player); + APlayerStateBase* myState = Cast(player->PlayerState); + + AGameStateBase* gameState = Cast(world->GetGameState()); + + if (myState->GetReadyState()) + return false; + + if (gameState) + { + auto pbt = gameState->GetPlayersByTeam(); + if (m_teamIndex < (uint32)pbt.Num() && pbt[m_teamIndex].Num() == 2) + { + return false; + } + } + + // Try for the local player to join this team + if (myState) // Check the state cause it can be null + myState->RequestTeamEntry(m_teamIndex); + else + GWERROR(L"Player not set in " + GetName()); + + // Make sure this item is now selected + GetSubMenu()->SelectNewItem(this); + + return true; +} + +void ULobbySlot::Init(UTextBlock* teamName, UVerticalBox* playerList) +{ + m_teamName = teamName; + m_playerList = playerList; + + // Add fixed 2 player slots to this team + m_playerList->ClearChildren(); + for (int32 i = 0; i < 2; i++) + { + ULobbyPlayerSlot* playerSlot = CreateWidget(GetWorld(), lobbyPlayerSlotClass); + check(playerSlot); + playerSlot->Init(nullptr); + m_playerSlots.Add(playerSlot); + m_playerList->AddChild(playerSlot); + } +} + +void ULobbySlot::SetState(bool open) +{ + m_open = open; +} diff --git a/Source/UnrealProject/GUI/Lobby/LobbySlot.h b/Source/UnrealProject/GUI/Lobby/LobbySlot.h new file mode 100644 index 0000000..a33b5f7 --- /dev/null +++ b/Source/UnrealProject/GUI/Lobby/LobbySlot.h @@ -0,0 +1,55 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Blueprint/UserWidget.h" +#include "MenuButton.h" +#include +#include "LobbySlot.generated.h" + +UCLASS() +class UNREALPROJECT_API ULobbySlot : public UMenuButton +{ + GENERATED_BODY() + +public: + virtual void NativeConstruct() override; + virtual void NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override; + + void SetTeamIndex(uint32 idx); + + // Must be called from blueprint to setup this element + UFUNCTION(BlueprintCallable, Category = "Lobby") + void Init(UTextBlock* teamName, UVerticalBox* playerList); + + void UpdatePlayers(TArray players); + void SetState(bool open); + + UFUNCTION(BlueprintCallable, Category = "Lobby") + bool OnSlotSelected(); + + UPROPERTY(EditDefaultsOnly, Category = "Lobby") + UFont* font; + + UPROPERTY(EditDefaultsOnly, Category="Lobby") + TSubclassOf lobbyPlayerSlotClass; + +private: + ULobbySlot(const FObjectInitializer& init); + + void m_UpdateTeamTitle(); + + UPROPERTY() + UTextBlock* m_teamName; + UPROPERTY() + UVerticalBox* m_playerList; + UPROPERTY() + TArray m_playerSlots; + + UPROPERTY() + UButton* m_joinButton; + uint32 m_teamIndex; + UPROPERTY() + TArray m_players; + bool m_open; +}; diff --git a/Source/UnrealProject/GUI/Menu/ButtonHintBar.cpp b/Source/UnrealProject/GUI/Menu/ButtonHintBar.cpp new file mode 100644 index 0000000..addbf63 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/ButtonHintBar.cpp @@ -0,0 +1,4 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "ButtonHintBar.h" diff --git a/Source/UnrealProject/GUI/Menu/ButtonHintBar.h b/Source/UnrealProject/GUI/Menu/ButtonHintBar.h new file mode 100644 index 0000000..6b8a9d5 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/ButtonHintBar.h @@ -0,0 +1,13 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "UserWidget.h" +#include "ButtonHintBar.generated.h" + +UCLASS() +class UNREALPROJECT_API UButtonHintBar : public UUserWidget +{ + GENERATED_BODY() +public: +}; diff --git a/Source/UnrealProject/GUI/Menu/GameList.cpp b/Source/UnrealProject/GUI/Menu/GameList.cpp new file mode 100644 index 0000000..189df86 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/GameList.cpp @@ -0,0 +1,246 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "GameList.h" +#include "GameListItem.h" +#include "DefaultGameInstance.h" +#include "SessionManager.h" +#include "ScreenOverlay.h" +#include "PlayerControllerBase.h" + +static UClass* itemWidgetClass; + +UGameList::UGameList(const FObjectInitializer& init) + : Super(init) +{ + itemWidgetClass = ConstructorHelpers::FClassFinder(TEXT("/Game/Assets/GUI/Components/WEEGEE_GameListItem")).Class; + m_quickJoining = false; +} + +void UGameList::NativeConstruct() +{ + Super::NativeConstruct(); + m_searchingSessions = false; + m_joining = false; + + UWorld* world = this->GetWorld(); + if (!world) + return; + m_gameInstance = Cast(world->GetGameInstance()); + if (!m_gameInstance) + return; + + onItemSelectionConfirmed.AddDynamic(this, &UGameList::OnListItemPressed); +} +void UGameList::NativeDestruct() +{ + m_StopPingingGames(); + Super::NativeDestruct(); +} +void UGameList::NativeTick(const FGeometry& MyGeometry, float InDeltaTime) +{ + Super::NativeTick(MyGeometry, InDeltaTime); +} + +void UGameList::OnStartSearching_Implementation() +{ +} +void UGameList::OnEndSearching_Implementation(int32) +{ +} +void UGameList::SetInitialSearchMode_Implementation(bool useLan) +{ +} +void UGameList::OnQuickJoin() +{ + OnSearchButton(); + m_quickJoining = true; +} +void UGameList::JoinSession(const class FOnlineSessionSearchResult& result) +{ + m_StopPingingGames(); + + if(!m_joining) + { + APlayerControllerBase* pc = Cast(GetOwningPlayer()); + check(!m_joiningOverlay); + m_joiningOverlay = pc->overlay->ShowOverlay("Joining game"); + m_joining = true; + + UDefaultGameInstance* inst = Cast(GetGameInstance()); + inst->sessionManager->onJoinSessionComplete.AddUObject(this, &UGameList::m_OnJoinSessionComplete); + inst->sessionManager->JoinSession(result); + } +} +void UGameList::SetSearchMode(bool useLan) +{ +} +void UGameList::OnSearchButton() +{ + UDefaultGameInstance* inst = Cast(GetGameInstance()); + if (!m_searchingSessions) + { + check(!m_searchingOverlay); + inst->sessionManager->onFindSessionsComplete.AddUObject(this, &UGameList::m_OnFindSessionsComplete); + inst->sessionManager->FindSessions(); + m_searchingSessions = true; + container->ClearChildren(); + + m_StopPingingGames(); + m_gameItems.SetNum(0); + + RescanItems(); + OnStartSearching(); + + APlayerControllerBase* pc = Cast(GetOwningPlayer()); + m_searchingOverlay = pc->overlay->ShowOverlay("Searching for games"); + } +} + +void UGameList::OnListItemPressed(UMenuItemBase* item) +{ + GWPRINT(L"Pressed item " + item); + UGameListItem* listItem = Cast(item); + if(listItem) + { + JoinSession(*listItem->result); + } +} + +void UGameList::m_OnFindSessionsComplete(bool success) +{ + UDefaultGameInstance* inst = Cast(GetGameInstance()); + + // Hide searching overlay + m_searchingOverlay->Close(); + m_searchingOverlay = nullptr; + + m_searchingSessions = false; + + if(!success) + { + APlayerControllerBase* pc = Cast(GetOwningPlayer()); + TArray options; + options.Add("OK"); + pc->overlay->ShowMessageBox("Error", "Error occured while fining games", options); + return; + } + + if(m_quickJoining) + { + // Find session with most players in, that is not full + auto& results = inst->sessionManager->sessionSearch->SearchResults; + if(results.Num() > 0) + { + FOnlineSessionSearchResult* optimal = &results[0]; + int32 largest = 0; + for(int32 i = 1; i < results.Num(); i++) + { + const int32 available = results[i].Session.NumOpenPublicConnections; + if(available == 0) continue; + const int32 max = results[i].Session.SessionSettings.NumPublicConnections; + const int32 current = max - available; + if(current > largest) + { + optimal = &results[i]; + largest = current; + } + } + JoinSession(*optimal); + } + m_quickJoining = false; + } + else + { + // Get session results + auto& results = inst->sessionManager->sessionSearch->SearchResults; + for(int32 i = 0; i < results.Num(); i++) + { + // Create a selectable slot in the game list + UGameListItem* childItem = CreateWidget(GetWorld(), itemWidgetClass); + check(container); + container->AddChild(childItem); + childItem->SetItem(this, results[i]); + m_gameItems.Add(childItem); + } + + OnEndSearching(results.Num()); + RescanItems(); + + // Give ping data for games + m_StartPingingGames(); + } + + m_searchingSessions = false; + + // Remove callback + inst->sessionManager->onFindSessionsComplete.RemoveAll(this); +} +void UGameList::m_OnJoinSessionComplete(int32 result) +{ + UDefaultGameInstance* inst = Cast(GetGameInstance()); + APlayerControllerBase* pc = Cast(GetOwningPlayer()); + + m_joining = false; + + // Remove callback + inst->sessionManager->onJoinSessionComplete.RemoveAll(this); + + if(result != EOnJoinSessionCompleteResult::Success) + { + FString error = "Unknown"; + switch(result) + { + case EOnJoinSessionCompleteResult::AlreadyInSession: + error = "Already in session"; + break; + case EOnJoinSessionCompleteResult::CouldNotRetrieveAddress: + error = "Could not retrieve address"; + break; + case EOnJoinSessionCompleteResult::SessionDoesNotExist: + error = "Session does not exist"; + break; + case EOnJoinSessionCompleteResult::SessionIsFull: + error = "Session is full"; + break; + } + + // Close joining overlay + m_joiningOverlay->Close(); + m_joiningOverlay = nullptr; + + // Show error message + TArray options; + options.Add("OK"); + pc->overlay->ShowMessageBox("Error", FString("Failed to join session:\n") + error, options); + } + else + { + // Travel to destination player lobby + pc->ClientTravel(inst->sessionManager->joinConnectionString, ETravelType::TRAVEL_Absolute, false); + //UWorld* world = GetWorld(); + //world->SeamlessTravel(inst->sessionManager->joinConnectionString, true); + //world->ServerTravel() + //AMenuGameMode* mgm = Cast(world->GetAuthGameMode()); + } +} + +void UGameList::m_PingGames() +{ + for(auto& g : m_gameItems) + { + g->Ping(); + } +} +void UGameList::m_StartPingingGames() +{ + GetGameInstance()->GetTimerManager().SetTimer(m_pinger, this, &UGameList::m_PingGames, 1.0f, true); +} +void UGameList::m_StopPingingGames() +{ + GetGameInstance()->GetTimerManager().ClearTimer(m_pinger); + for(UGameListItem* i : m_gameItems) + { + i->Ping(); + } +} diff --git a/Source/UnrealProject/GUI/Menu/GameList.h b/Source/UnrealProject/GUI/Menu/GameList.h new file mode 100644 index 0000000..02faade --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/GameList.h @@ -0,0 +1,75 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "MenuScreen.h" +#include "OnlineSessionInterface.h" +#include "GameList.generated.h" +using namespace std; + +struct SessionItemData +{ + FString name; + int32 index; + FOnlineSessionSearchResult* result; +}; + +UCLASS() +class UNREALPROJECT_API UGameList : public UPersistentSideView +{ + GENERATED_BODY() + +public: + UGameList(const FObjectInitializer& init); + + virtual void NativeConstruct() override; + virtual void NativeDestruct() override; + virtual void NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override; + + UFUNCTION(BlueprintNativeEvent, Category = "UI") + void OnStartSearching(); + UFUNCTION(BlueprintNativeEvent, Category = "UI") + void OnEndSearching(int32 gamesFound); + UFUNCTION(BlueprintNativeEvent, Category = "UI") + void SetInitialSearchMode(bool useLan); + UFUNCTION(BlueprintCallable, Category = "UI") + void OnQuickJoin(); + + void JoinSession(const class FOnlineSessionSearchResult& result); + UFUNCTION(BlueprintCallable, Category = "UI") + void SetSearchMode(bool useLan); + UFUNCTION(BlueprintCallable, Category = "UI") + void OnSearchButton(); + + UFUNCTION() + void OnListItemPressed(UMenuItemBase* item); + + UFUNCTION(BlueprintCallable, Category = "UI") + int32 GetNumGames() const { return m_gameItems.Num(); } + UFUNCTION(BlueprintCallable, Category = "UI") + TArray GetGames() const { return m_gameItems; } + +private: + UFUNCTION() + void m_OnFindSessionsComplete(bool success); + UFUNCTION() + void m_OnJoinSessionComplete(int32 result); + + void m_PingGames(); + void m_StartPingingGames(); + void m_StopPingingGames(); + FTimerHandle m_pinger; + + TArray m_gameItems; + + bool m_searchingSessions; + bool m_quickJoining; + bool m_joining; + + UPROPERTY() + class UOverlayInfo* m_searchingOverlay; + UPROPERTY() + class UOverlayInfo* m_joiningOverlay; + UPROPERTY() + class UDefaultGameInstance* m_gameInstance; +}; diff --git a/Source/UnrealProject/GUI/Menu/GameListItem.cpp b/Source/UnrealProject/GUI/Menu/GameListItem.cpp new file mode 100644 index 0000000..2efe42d --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/GameListItem.cpp @@ -0,0 +1,53 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" + +#include "GameListItem.h" +#include "GameList.h" +#include "DefaultGameInstance.h" +#include "SessionManager.h" + +UGameListItem::UGameListItem(const FObjectInitializer& init) + : Super(init) +{ + valid = false; +} + +void UGameListItem::NativeConstruct() +{ + Super::NativeConstruct(); + OnGameInfoUpdated(); +} + +void UGameListItem::SetItem(UGameList* parent, const FOnlineSessionSearchResult& _result) +{ + // Set the sesion result to be displayed in this item + check(parent); + m_parent = parent; + result = &_result; + valid = result != nullptr; + if(valid) + { + UWorld* world = GetWorld(); + check(world); + UDefaultGameInstance* inst = Cast(world->GetGameInstance()); + FString nickname = inst->sessionManager->GetPlayerName(*result->Session.OwningUserId); + // Game Name = Online platform nickname of host + gameHost = nickname; + gamePing = result->PingInMs; + if(!result->Session.SessionSettings.Get(SETTING_MAPNAME, gameMapName)) + { + GWWARNING(L"Game does not have a map name set"); + } + gamePlayersMax = result->Session.SessionSettings.NumPublicConnections; + gamePlayers = gamePlayersMax - result->Session.NumOpenPublicConnections; + } + OnGameInfoUpdated(); +} + +void UGameListItem::Ping() +{ + UDefaultGameInstance* inst = Cast(GetWorld()->GetGameInstance()); + inst->sessionManager->PingResult(*result); + OnGameInfoUpdated(); +} \ No newline at end of file diff --git a/Source/UnrealProject/GUI/Menu/GameListItem.h b/Source/UnrealProject/GUI/Menu/GameListItem.h new file mode 100644 index 0000000..41a2694 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/GameListItem.h @@ -0,0 +1,41 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "MenuButton.h" +#include "GameListItem.generated.h" + +UCLASS() +class UNREALPROJECT_API UGameListItem : public UMenuButton +{ + GENERATED_BODY() + +public: + UGameListItem(const FObjectInitializer& init); + virtual void NativeConstruct() override; + + void SetItem(class UGameList* parent, const FOnlineSessionSearchResult& result); + + UFUNCTION(BlueprintImplementableEvent, Category = "UI") + void OnGameInfoUpdated(); + + void Ping(); + + UPROPERTY(BlueprintReadOnly, Category = "Game") + bool valid; + UPROPERTY(BlueprintReadOnly, Category = "Game") + FString gameHost; + UPROPERTY(BlueprintReadOnly, Category = "Game") + FString gameMapName; + UPROPERTY(BlueprintReadOnly, Category = "Game") + int32 gamePlayers; + UPROPERTY(BlueprintReadOnly, Category = "Game") + int32 gamePlayersMax; + UPROPERTY(BlueprintReadOnly, Category = "Game") + int32 gamePing; + + const class FOnlineSessionSearchResult* result; +private: + UPROPERTY() + class UGameList* m_parent; +}; diff --git a/Source/UnrealProject/GUI/Menu/GraphicsMenu.cpp b/Source/UnrealProject/GUI/Menu/GraphicsMenu.cpp new file mode 100644 index 0000000..d74afa9 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/GraphicsMenu.cpp @@ -0,0 +1,103 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "SelectButton.h" +#include "DefaultGameInstance.h" +#include "Prefs.h" +#include "GraphicsMenu.h" + + + +void UGraphicsMenu::NativeTick(const FGeometry& MyGeometry, float InDeltaTime) +{ + Super::NativeTick(MyGeometry, InDeltaTime); + + m_Update(); +} + + +void UGraphicsMenu::InitButtons(USelectButton* templateButton, TArray settingButtons) +{ + m_templateButton = templateButton; + m_settingButtons = settingButtons; + + if (!IsValid(m_templateButton) || m_settingButtons.Num() != 6) + { + JERROR("InitButton arguments invalid"); + m_templateButton = nullptr; + return; + } + + UDefaultGameInstance* instance = Cast(GetGameInstance()); + if (!IsValid(instance)) + return; + + UPrefs* const prefs = instance->GetPrefs(); + int32 fetchPreset = instance->GetScalabilityQuality(); + templateButton->selected = prefs->usingCustomGraphicsSettings ? 0 : fetchPreset + 1; + + m_previousSelection = -5; + m_Update(); +} + + +void UGraphicsMenu::Apply() +{ + UDefaultGameInstance* instance = Cast(GetGameInstance()); + if (!IsValid(m_templateButton) || !IsValid(instance)) + return; + + const int32 current = m_templateButton->selected; + if (current > 0) + { + // Store the template setting + instance->SetScalabilityQuality(current - 1); + } + else + { + // Store the individual sub settings + instance->SetScalabilityQualityValues( + m_settingButtons[0]->selected, + m_settingButtons[1]->selected, + m_settingButtons[2]->selected, + m_settingButtons[3]->selected, + m_settingButtons[4]->selected, + m_settingButtons[5]->selected); + } +} + +void UGraphicsMenu::m_Update() +{ + UDefaultGameInstance* instance = Cast(GetGameInstance()); + if (!IsValid(m_templateButton) || !IsValid(instance)) + return; + + const int32 current = m_templateButton->selected; + if (m_previousSelection != current) // Only update when the value has changed + { + if (current == 0) + { + // Enable the sub setting buttons + for (int32 i = 0; i < m_settingButtons.Num(); i++) + m_settingButtons[i]->SetIsEnabled(true); + + // Fetch the stored sub settings from prefs + TArray customSettings = instance->GetPrefs()->customGraphicsSettings; + if (customSettings.Num() <= m_settingButtons.Num()) + { + for (int32 i = 0; i < customSettings.Num(); i++) + m_settingButtons[i]->selected = customSettings[i]; + } + } + else + { + // Disable the subsetting buttons and set them to the template + for (int32 i = 0; i < m_settingButtons.Num(); i++) + { + m_settingButtons[i]->SetIsEnabled(false); + m_settingButtons[i]->selected = current - 1; + } + } + m_previousSelection = current; + } +} \ No newline at end of file diff --git a/Source/UnrealProject/GUI/Menu/GraphicsMenu.h b/Source/UnrealProject/GUI/Menu/GraphicsMenu.h new file mode 100644 index 0000000..a7a8332 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/GraphicsMenu.h @@ -0,0 +1,32 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "MenuScreen.h" +#include "GraphicsMenu.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API UGraphicsMenu : public USideView +{ + GENERATED_BODY() + +public: + virtual void NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override; + + UFUNCTION(BlueprintCallable, Category = "Graphics") + void InitButtons(class USelectButton* templateButton, TArray settingButtons); + + UFUNCTION(BlueprintCallable, Category = "Graphics") + void Apply(); + +private: + void m_Update(); + + USelectButton* m_templateButton; + TArray m_settingButtons; + + int32 m_previousSelection; +}; diff --git a/Source/UnrealProject/GUI/Menu/MapSelectionScreen.cpp b/Source/UnrealProject/GUI/Menu/MapSelectionScreen.cpp new file mode 100644 index 0000000..ad900c8 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/MapSelectionScreen.cpp @@ -0,0 +1,161 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "MapData.h" +#include "MapSelectionScreen.h" +#include "AssetRegistryModule.h" +#include "DefaultGameInstance.h" +#include "MapSlot.h" +#include "SessionManager.h" +#include "MenuController.h" +#include "ScreenOverlay.h" +#include "MenuGameMode.h" + +static UClass* mapSlotWidgetClass; + +UMapSelectionScreen::UMapSelectionScreen(const FObjectInitializer& init) + : Super(init) +{ + mapSlotWidgetClass = ConstructorHelpers::FClassFinder(TEXT("/Game/Assets/GUI/Components/WEEGEE_MapListItem")).Class; +} + +void UMapSelectionScreen::NativeConstruct() +{ + Super::NativeConstruct(); + if(container) + { + // Get all the available maps and create selection buttons for them + UWorld* world = GetWorld(); + check(world); + auto& maps = Cast(world->GetGameInstance())->maps; + for(int32 i = 0; i < maps.Num(); i++) + { + UMapSlot* mapSlot = CreateWidget(GetWorld(), mapSlotWidgetClass); + check(mapSlot); + mapSlot->mapData = maps[i]; + mapSlot->mapScreen = this; + mapSlot->OnMapSet(); + m_mapSlots.Add(mapSlot); + container->AddChild(mapSlot); + } + + onItemSelected.RemoveAll(this); + onItemSelected.AddDynamic(this, &UMapSelectionScreen::OnSelectionChanged); + RescanItems(); + SelectMap(0); + } +} + +void UMapSelectionScreen::OnSelectionChanged(UMenuItemBase* item) +{ + UMapSlot* mapSlot = Cast(item); + if(mapSlot) + { + //SelectMap(mapSlot->index); + } +} +void UMapSelectionScreen::SelectMap(int32 index) +{ + UWorld* world = GetWorld(); + check(world); + UDefaultGameInstance* inst = Cast(world->GetGameInstance()); + + TArray& maps = inst->maps; + if(index < 0 || index > maps.Num()) + { + GWERROR(L"Selected map out of range"); + return; + } + + mapData = maps[index]; + check(mapData); + + // Set the asset path to the selected map in the session manager + AMenuGameMode* gameMode = Cast(world->GetAuthGameMode()); + if(gameMode) + { + gameMode->SetMap(mapData->pathToAsset); + GWPRINT(L"Selected map: " + maps[index]->friendlyName); + } + else + { + GWARNING(L"Can't select map, no game mode!"); + } +} + +void UMapSelectionScreen::CreateGame() +{ + SelectMap(GetSelectedItem()); + + if(!mapData) + { + GERROR("No map set"); + return; + } + + UWorld* world = GetWorld(); + check(world); + UDefaultGameInstance* inst = Cast(world->GetGameInstance()); + + AMenuGameMode* gameMode = Cast(world->GetAuthGameMode()); + if(!gameMode) + { + GERROR("Can't start game, no menu game mode set"); + return; + } + + APlayerControllerBase* pc = Cast(GetOwningPlayer()); + if(m_sessionCreateOverlay) + return; // Already creating session + m_sessionCreateOverlay = pc->overlay->ShowOverlay("Creating session"); + + // Set the map setting in the game mode + gameMode->AssignMapData(mapData); + + // Make sure there is no connection already + inst->sessionManager->CloseNetConnections(); + + // Set host settings + FOnlineSessionSettings& sessionSettings = inst->sessionManager->sessionSettings; + sessionSettings.NumPublicConnections = mapData->maxTeamCount * 2; // Team count setting translated to max connected players (x2) + sessionSettings.Set(SETTING_MAPNAME, mapData->pathToAsset, EOnlineDataAdvertisementType::ViaOnlineServiceAndPing); + + // Create a new session + inst->sessionManager->onCreateSessionComplete.AddUObject(this, &UMapSelectionScreen::m_OnCreateSessionCompleted); + inst->sessionManager->CreateSession(); +} + +void UMapSelectionScreen::m_OnCreateSessionCompleted(bool success) +{ + if(m_sessionCreateOverlay) + { + m_sessionCreateOverlay->Close(); + m_sessionCreateOverlay = nullptr; + } + + UDefaultGameInstance* inst = Cast(GetWorld()->GetGameInstance()); + inst->sessionManager->onCreateSessionComplete.RemoveAll(this); + + AMenuController* mc = Cast(GetOwningPlayer()); + if(success) + { + // Goto the lobby + mc->OnEnterLobby(); + + // Start the session, @note not sure if this is needed + //inst->sessionManager->StartSession(); + } + else + { + TArray options; + options.Add("OK"); + mc->overlay->ShowMessageBox("Error", "Failed to create game session", options); + } +} + +UMapData::UMapData() +{ + maxTeamCount = 3; + friendlyName = "Map Name"; + description = ""; +} \ No newline at end of file diff --git a/Source/UnrealProject/GUI/Menu/MapSelectionScreen.h b/Source/UnrealProject/GUI/Menu/MapSelectionScreen.h new file mode 100644 index 0000000..968a657 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/MapSelectionScreen.h @@ -0,0 +1,40 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "MenuScreen.h" +#include "MapSelectionScreen.generated.h" + +UCLASS() +class UNREALPROJECT_API UMapSelectionScreen : public USideView +{ + GENERATED_BODY() + +public: + UMapSelectionScreen(const FObjectInitializer& init); + virtual void NativeConstruct() override; + + UFUNCTION() + void OnSelectionChanged(UMenuItemBase* item); + + UFUNCTION(BlueprintCallable, Category = "Level") + void SelectMap(int32 mapIndex); + UFUNCTION(BlueprintCallable, Category = "Level") + void CreateGame(); + + // Currently Selected map data + UPROPERTY(BlueprintReadOnly, Category = "Level") + class UMapData* mapData; + UPROPERTY() + class UMapSlot* selectedMapSlot; + +private: + UPROPERTY() + class UOverlayInfo* m_sessionCreateOverlay; + + UFUNCTION() + void m_OnCreateSessionCompleted(bool success); + + UPROPERTY() + TArray m_mapSlots; +}; diff --git a/Source/UnrealProject/GUI/Menu/MapSlot.cpp b/Source/UnrealProject/GUI/Menu/MapSlot.cpp new file mode 100644 index 0000000..79cb98b --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/MapSlot.cpp @@ -0,0 +1,14 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "MapSlot.h" +#include "MapData.h" + +void UMapSlot::NativeConstruct() +{ + Super::NativeConstruct(); +} + +void UMapSlot::OnMapSet_Implementation() +{ +} \ No newline at end of file diff --git a/Source/UnrealProject/GUI/Menu/MapSlot.h b/Source/UnrealProject/GUI/Menu/MapSlot.h new file mode 100644 index 0000000..c7c6715 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/MapSlot.h @@ -0,0 +1,26 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "MenuButton.h" +#include "MapSlot.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API UMapSlot : public UMenuButton +{ + GENERATED_BODY() + +public: + virtual void NativeConstruct() override; + + UFUNCTION(BlueprintNativeEvent, Category = "Slot") + void OnMapSet(); + + UPROPERTY(BlueprintReadOnly, Category = "Slot") + class UMapSelectionScreen* mapScreen; + UPROPERTY(BlueprintReadOnly, Category = "Slot") + class UMapData* mapData; +}; diff --git a/Source/UnrealProject/GUI/Menu/MenuAction.h b/Source/UnrealProject/GUI/Menu/MenuAction.h new file mode 100644 index 0000000..4f6a912 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/MenuAction.h @@ -0,0 +1,32 @@ +#pragma once + +#include "MenuAction.Generated.h" + +UENUM(BlueprintType) +enum class EMenuActionBinding : uint8 +{ + Confirm, + Back, + Opt1, + Opt2, + Start, + Up, + Down, + Left, + Right, + Repeat_Left, + Repeat_Right, + Trigger_Left, + Trigger_Right, + Shoulder_Left, + Shoulder_Right, + Options, + + // These are actually just for button hint icons + // don't use these for actual actions as they wont get used + LeftStick, + RightStick, + DPad, + ShoulderButtons, + Triggers +}; \ No newline at end of file diff --git a/Source/UnrealProject/GUI/Menu/MenuButton.cpp b/Source/UnrealProject/GUI/Menu/MenuButton.cpp new file mode 100644 index 0000000..5615c82 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/MenuButton.cpp @@ -0,0 +1,147 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "MenuButton.h" +#include "SubMenu.h" + + +FLinearColor uiIdleColor = FLinearColor(1.0f, 1.0f, 1.0f, 0.3f); +FLinearColor uiSelectedColor = FLinearColor(0.8f, 1.0f, 0.8f, 0.4f); +FLinearColor uiSelectedFocusedColor = FLinearColor(0.2f, 1.0f, 0.2f, 0.8f); + +TSubclassOf defaultButtonClass; + +UMenuButton::UMenuButton(const FObjectInitializer& init) + : Super(init) +{ + defaultButtonClass = ConstructorHelpers::FClassFinder(L"/Game/Assets/GUI/Components/WEEGEE_Button").Class; +} +void UMenuButton::NativeConstruct() +{ + m_button = WidgetTree->FindWidget("Button"); + m_label = WidgetTree->FindWidget("Label"); + m_textOverlay = WidgetTree->FindWidget("TextOverlay"); + if(!m_button) + { + GWERROR(L"Widget " + GetName() + L" does not contain a Button componenet"); + } + else + { + m_button->OnClicked.AddDynamic(this, &UMenuButton::m_OnPressed); + } + + + NativeOnSelectionChanged(false, true); + Super::NativeConstruct(); + + if(m_textOverlay && m_label) + { + m_blurOverlay = NewObject(GetWorld()); + UOverlaySlot* slot = m_textOverlay->AddChildToOverlay(m_blurOverlay); + slot->SetHorizontalAlignment(EHorizontalAlignment::HAlign_Fill); + slot->SetVerticalAlignment(EVerticalAlignment::VAlign_Fill); + + UOverlaySlot* labelSlot = Cast(m_label->Slot); + EHorizontalAlignment textAlignH = labelSlot ? labelSlot->HorizontalAlignment.GetValue() : HAlign_Fill; + EVerticalAlignment textAlignV = labelSlot ? labelSlot->VerticalAlignment.GetValue() : VAlign_Fill; + + m_label->RemoveFromParent(); + + static int32 quality = 16; + static float distance = 2.0f; + for(int32 i = 0; i < quality; i++) + { + float r = (float)i / (float)(quality - 1); + FVector2D offset = FVector2D(cos(r*PI), sin(r*PI)) * distance; + // Create Glow effect + UTextBlock* blurText = NewObject(GetWorld()); + UOverlaySlot* textSlot = m_blurOverlay->AddChildToOverlay(blurText); + textSlot->SetHorizontalAlignment(textAlignH); + textSlot->SetVerticalAlignment(textAlignV); + + FSlateFontInfo font = m_label->Font; + blurText->SetFont(font); + blurText->SetColorAndOpacity(FSlateColor(FLinearColor(0.6f, 0.6f, 1.0f, 0.5f))); + blurText->SetRenderTranslation(offset); + blurText->SetText(m_label->GetText()); + } + m_blurOverlay->SetVisibility(ESlateVisibility::Hidden); + + labelSlot = m_textOverlay->AddChildToOverlay(m_label); + labelSlot->SetHorizontalAlignment(textAlignH); + labelSlot->SetVerticalAlignment(textAlignV); + } +} + +void UMenuButton::FocusTick(float DeltaTime) +{ + Super::FocusTick(DeltaTime); + if(m_button && m_button->IsHovered() && GetSubMenu()->GetSelectedItem() != index) + { + GetSubMenu()->SelectNewItemByIndex(index); + } +} + +void UMenuButton::m_OnPressed() +{ + if(HasFocus()) + { + NativeOnPressed(false); + } +} +void UMenuButton::NativeOnMenuAction(EMenuActionBinding binding) +{ + Super::NativeOnMenuAction(binding); + if(binding == EMenuActionBinding::Confirm) + NativeOnPressed(true); +} + +void UMenuButton::NativeOnSelectionChanged(bool selected, bool controller) +{ + Super::NativeOnSelectionChanged(selected, controller); + if(!m_button) + return; + + UScrollBox* sb = Cast(Slot->Parent); + if(sb && selected) + { + sb->ScrollWidgetIntoView(this, true); + } + + if(m_blurOverlay) + { + if(selected) + { + m_blurOverlay->SetVisibility(ESlateVisibility::SelfHitTestInvisible); + } + else + { + m_blurOverlay->SetVisibility(ESlateVisibility::Hidden); + } + } +} + +void UMenuButton::NativeOnPressed(bool controllerInput) +{ + // Simulate OnSelectionConfirmed event if this button is pressed by a mouse + GetSubMenu()->NativeOnSelectionConfirmed(this); + onPressed.Broadcast(); +} + +void UMenuButton::SetButtonText(FString textStr) +{ + FText text = FText::FromString(textStr); + if(m_label) + m_label->SetText(text); + if(m_blurOverlay) + { + for(int32 i = 0; i < m_blurOverlay->GetChildrenCount(); i++) + { + UTextBlock* tb = Cast(m_blurOverlay->GetChildAt(i)); + if(tb) + { + tb->SetText(text); + } + } + } +} diff --git a/Source/UnrealProject/GUI/Menu/MenuButton.h b/Source/UnrealProject/GUI/Menu/MenuButton.h new file mode 100644 index 0000000..c60214b --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/MenuButton.h @@ -0,0 +1,48 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GUI/Menu/MenuItemBase.h" +#include "MenuButton.generated.h" + +extern FLinearColor uiIdleColor; +extern FLinearColor uiSelectedColor; + +/** + * + */ +UCLASS() +class UNREALPROJECT_API UMenuButton : public UMenuItemBase +{ + GENERATED_BODY() +public: + UMenuButton(const FObjectInitializer& init); + void NativeConstruct() override; + void FocusTick(float DeltaTime) override; + + DECLARE_DYNAMIC_MULTICAST_DELEGATE(FButtonPressed); + UPROPERTY(BlueprintAssignable, Category = "MenuButton") + FButtonPressed onPressed; + + virtual void NativeOnMenuAction(EMenuActionBinding binding) override; + virtual void NativeOnSelectionChanged(bool selected, bool controller) override; + + // Called when this button is pressed, and if it was a controller or a mouse + virtual void NativeOnPressed(bool controllerInput); + + // Updates button text + glow + UFUNCTION(BlueprintCallable, Category="MenuButton") + void SetButtonText(FString text); + + void SimulatePressed() { m_OnPressed(); } + +protected: + UFUNCTION() + virtual void m_OnPressed(); + + UOverlay* m_textOverlay; + UOverlay* m_blurOverlay; + UPROPERTY() + UTextBlock* m_label; + UButton* m_button; +}; diff --git a/Source/UnrealProject/GUI/Menu/MenuEnum.h b/Source/UnrealProject/GUI/Menu/MenuEnum.h new file mode 100644 index 0000000..89e10f2 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/MenuEnum.h @@ -0,0 +1,9 @@ +#pragma once + +UENUM(BlueprintType) +enum class MenuButtonID : uint8 +{ + OptionsGeneral, + OptionsGraphics, + Options, +}; \ No newline at end of file diff --git a/Source/UnrealProject/GUI/Menu/MenuItemBase.cpp b/Source/UnrealProject/GUI/Menu/MenuItemBase.cpp new file mode 100644 index 0000000..6f1eed6 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/MenuItemBase.cpp @@ -0,0 +1,92 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "MenuItemBase.h" +#include "SubMenu.h" +#include "PlayerControllerBase.h" +#include "ScreenOverlay.h" + +void UMenuItemBase::NativeConstruct() +{ + m_selected = false; + blockInput = false; + m_subMenu = nullptr; + priority = 0; + Super::NativeConstruct(); +} +void UMenuItemBase::NativeDestruct() +{ + Super::NativeDestruct(); +} + +void UMenuItemBase::FocusTick(float DeltaTime) +{ + +} + +UMsgBoxInfo* UMenuItemBase::ShowMessageBox(FOverlayItemClosed cb, FString caption, FString message, TArray options, FString defaultOption) +{ + UScreenOverlay* overlay = Cast(GetOwningPlayer())->overlay; + if(!overlay) + return nullptr; + return overlay->ShowMessageBoxCallback(cb, caption, message, options, defaultOption); +} + +void UMenuItemBase::NativeOnSelectionChanged(bool selected, bool controller) +{ + if(selected != m_selected) + { + m_selected = selected; + onSelectionChanged.Broadcast(selected); + } +} + +bool UMenuItemBase::IsSelected() const +{ + return m_selected; +} + +class USubMenu* UMenuItemBase::GetSubMenu() const +{ + return m_subMenu; +} + +bool UMenuItemBase::HasFocus() const +{ + return GetSubMenu() && GetSubMenu()->HasFocus(); +} + +void UMenuItemBase::AddActionBinding(EMenuActionBinding binding, FMenuAction action) +{ + m_actionBindings.Add(binding, action); +} + +void UMenuItemBase::ClearActionBinding(EMenuActionBinding binding) +{ + m_actionBindings.Remove(binding); +} + +void UMenuItemBase::OnMenuAction_Implementation(EMenuActionBinding binding) +{ +} +void UMenuItemBase::NativeOnMenuAction(EMenuActionBinding binding) +{ + OnMenuAction(binding); + + TArray actions; + m_actionBindings.MultiFind(binding, actions); + for(int32 i = 0; i < actions.Num(); i++) + { + actions[i].Execute(); + } +} + +FText UMenuItemBase::GetDescription_Implementation() +{ + return FText(); +} + +FText UMenuItemBase::GetTitle_Implementation() +{ + return FText(); +} diff --git a/Source/UnrealProject/GUI/Menu/MenuItemBase.h b/Source/UnrealProject/GUI/Menu/MenuItemBase.h new file mode 100644 index 0000000..fe115bd --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/MenuItemBase.h @@ -0,0 +1,83 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "MenuAction.h" +#include "Blueprint/UserWidget.h" +#include "MenuItemBase.generated.h" + +DECLARE_DYNAMIC_DELEGATE_OneParam(FOverlayItemClosed, int32, choice); + +extern TSubclassOf defaultButtonClass; +extern TSubclassOf defaultSliderClass; + +/** + * Base class for a menu item with controller navigation/input support + */ +UCLASS() +class UNREALPROJECT_API UMenuItemBase : public UUserWidget +{ + GENERATED_BODY() + +public: + void NativeConstruct() override; + void NativeDestruct() override; + + // Called when the item's menu has focus every frame + virtual void FocusTick(float DeltaTime); + + UFUNCTION(BlueprintCallable, Category="MenuItem") + virtual void NativeOnSelectionChanged(bool selected, bool controller); + + // Shows a message box and fires a delegate when the user chooses an option + UFUNCTION(BlueprintCallable, Category = "SubMenu") + class UMsgBoxInfo* ShowMessageBox(FOverlayItemClosed cb, FString caption, FString message, TArray options, FString defaultOption); + + DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSelectionChanged, bool, selected); + UPROPERTY(BlueprintAssignable, Category = "MenuItem") + FSelectionChanged onSelectionChanged; + +// UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "MenuItem") + int32 priority; + + UPROPERTY(BlueprintReadOnly) + int32 index; + + UFUNCTION(BlueprintCallable, Category = "MenuItem") + bool IsSelected() const; + UFUNCTION(BlueprintCallable, Category = "MenuItem") + class USubMenu* GetSubMenu() const; + + UFUNCTION(BlueprintCallable, Category = "MenuItem") + bool HasFocus() const; + + DECLARE_DYNAMIC_DELEGATE(FMenuAction); + UFUNCTION(BlueprintCallable, Category = "MenuItem") + void AddActionBinding(EMenuActionBinding binding, FMenuAction action); + UFUNCTION(BlueprintCallable, Category = "MenuItem") + void ClearActionBinding(EMenuActionBinding binding); + + UFUNCTION(BlueprintNativeEvent, Category = "MenuItem") + void OnMenuAction(EMenuActionBinding binding); + virtual void NativeOnMenuAction(EMenuActionBinding binding); + + UFUNCTION(BlueprintNativeEvent, Category = "MenuItem") + FText GetDescription(); + UFUNCTION(BlueprintNativeEvent, Category = "MenuItem") + FText GetTitle(); + + UPROPERTY(BlueprintReadOnly, Category="MenuItem") + bool blockInput; + +private: + + bool m_selected; + friend class APlayerControllerBase; + friend class USubMenu; + + TMultiMap m_actionBindings; + +protected: + UPROPERTY() + class USubMenu* m_subMenu; +}; diff --git a/Source/UnrealProject/GUI/Menu/MenuScreen.cpp b/Source/UnrealProject/GUI/Menu/MenuScreen.cpp new file mode 100644 index 0000000..26913f5 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/MenuScreen.cpp @@ -0,0 +1,337 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "MenuScreen.h" +#include "ButtonHintBar.h" +#include "SubMenu.h" +#include "MenuButton.h" + +void UMenuScreen::NativeConstruct() +{ + Super::NativeConstruct(); + m_sideViewActive = false; + m_buttonHintBar = Cast(WidgetTree->FindWidget("ButtonHintBar")); + m_menuContainer = Cast(WidgetTree->FindWidget("MenuContainer")); + m_sideViewContainer = Cast(WidgetTree->FindWidget("SideViewContainer")); + m_menuTitle = Cast(WidgetTree->FindWidget("MenuTitle")); + m_sideViewTitle = Cast(WidgetTree->FindWidget("SideViewTitle")); +} + +UMenuPanel* UMenuScreen::OpenScreenMenu(TSubclassOf cls) +{ + UMenuPanel* menu = CreateWidget(GetWorld(), cls); + if(!menu) + { + GERROR("Failed to create menu for screen " + GetName()); + return nullptr; + } + + m_menuContainer->AddChildToOverlay(menu); + OpenSubMenu(menu); + + menu->FadeIn(); + + return menu; +} +USideView* UMenuScreen::OpenSideView(TSubclassOf cls) +{ + USideView* view = CreateWidget(GetWorld(), cls); + if(!view) + { + GERROR("Failed to create side view for screen " + GetName()); + return nullptr; + } + UPersistentSideView* pview = Cast(view); + + UOverlaySlot* slot = m_sideViewContainer->AddChildToOverlay(view); + slot->SetHorizontalAlignment(HAlign_Fill); + slot->SetVerticalAlignment(VAlign_Fill); + + if(pview) + m_OpenSubMenu(view, false); + else + OpenSubMenu(view); + + view->FadeIn(); + + // Switch side view active event + if(!m_sideViewActive) + { + SwitchSideViewVisible(true); + m_sideViewActive = true; + } + + return view; +} + +void UMenuScreen::CloseAllSideViews() +{ + TArray viewsToRemove; + for(int32 i = 0; i < m_sideViewContainer->GetChildrenCount(); i++) + { + USideView* sv = Cast(m_sideViewContainer->GetChildAt(i)); + if(sv && !sv->IsA()) + viewsToRemove.Add(sv); + } + + for(USideView* sv : viewsToRemove) + { + CloseSubMenu(sv); + } +} + +void UMenuScreen::OpenPersistentSideView(UPersistentSideView* sideView) +{ + UMenuScreen::OpenSubMenu(sideView); +} +void UMenuScreen::ClosePersistentSideView(UPersistentSideView* sideView) +{ + m_CloseSubMenu(sideView, true); +} + +void UMenuScreen::OpenSubMenu(class USubMenu* submenu) +{ + m_OpenSubMenu(submenu); +} +void UMenuScreen::CloseSubMenu(class USubMenu* submenu) +{ + m_CloseSubMenu(submenu); +} + +void UMenuScreen::m_OpenSubMenu(class USubMenu* submenu, bool transferFocus) +{ + CloseAllSideViews(); + + if(transferFocus) + Super::OpenSubMenu(submenu); + UMenuScreenSubMenu* mssm = Cast(submenu); + if(!m_menuTitle || !mssm) + return; + + // Update titles and sub-titles + UMenuPanel* panel = Cast(submenu); + if(panel) + m_menuTitle->SetText(FText::FromString(mssm->menuName)); + USideView* view = Cast(submenu); + if(view) + { + m_sideViewTitle->SetText(FText::FromString(mssm->menuName)); + m_currentSideViews.Add(view); + } +} +void UMenuScreen::m_CloseSubMenu(class USubMenu* submenu, bool persist) +{ + UMenuScreenSubMenu* mssm = Cast(submenu); + if(mssm) + mssm->m_isBeingClosed = true; + UMenuPanel* panel = Cast(submenu); + if(panel) + { + CloseAllSideViews(); + panel->onAnimationEnded.RemoveAll(this); + panel->onAnimationEnded.AddUObject(this, &UMenuScreen::m_OnFadeOutComplete); + panel->FadeOut(); + } + USideView* view = Cast(submenu); + if(view && !persist) + { + view->onAnimationEnded.RemoveAll(this); + view->onAnimationEnded.AddUObject(this, &UMenuScreen::m_OnFadeOutComplete); + view->FadeOut(); + + // Switch side view active event + if(m_currentSideViews.Num() > 0 && m_sideViewActive) + { + SwitchSideViewVisible(false); + m_sideViewActive = false; + } + + m_currentSideViews.Remove(view); + } + + Super::CloseSubMenu(submenu); + + // Update titles and sub-titles + if(panel) + { + if(m_subMenus.Num() > 0) + { + UMenuPanel* newMenu = Cast(m_subMenus.Last()); + if(newMenu) + m_menuTitle->SetText(FText::FromString(newMenu->menuName)); + else + goto _set_no_panel_text; + } + else + { + _set_no_panel_text: + m_menuTitle->SetText(FText()); + } + } + else if(view && !persist) + { + if(m_subMenus.Num() > 0) + { + USideView* newMenu = Cast(m_subMenus.Last()); + if(newMenu) + m_sideViewTitle->SetText(FText::FromString(newMenu->menuName)); + else + goto _set_no_view_text; + } + else + { + _set_no_view_text: + m_sideViewTitle->SetText(FText()); + } + } + if(mssm) + mssm->m_isBeingClosed = false; +} + +void UMenuScreen::m_OnFadeOutComplete(UMenuScreenSubMenu* panel, int32 type) +{ + if(type == 2) // Fade Out + { + panel->RemoveFromParent(); + } +} + +static float animationDuration = 0.35f; +void UMenuScreenSubMenu::NativeConstruct() +{ + m_animationType = 0; + m_animationTime = 0.0f; + m_isBeingClosed = false; + Super::NativeConstruct(); +} +UMenuScreenSubMenu::UMenuScreenSubMenu(const FObjectInitializer& init) + : Super(init) +{ + menuName = ""; +} +void UMenuScreenSubMenu::NativeTick(const FGeometry& MyGeometry, float InDeltaTime) +{ + Super::NativeTick(MyGeometry, InDeltaTime); + + float r = FMath::Clamp(m_animationTime / animationDuration, 0.0f, 1.0f); + if(m_animationType == 1) // Fade In + { + SetRenderTranslation(FVector2D(0.0f - ((1.0f - r)*(1.0f - r)) * 100.0f, 0.0f)); + FLinearColor color = FLinearColor(1.0f, 1.0f, 1.0f, r); + SetColorAndOpacity(color); + } + else if(m_animationType == 2) // Fade Out + { + SetRenderTranslation(FVector2D(0.0f + (r*r) * 100.0f, 0.0f)); + FLinearColor color = FLinearColor(1.0f, 1.0f, 1.0f, (1.0f-r)); + SetColorAndOpacity(color); + } + + if(m_animationType != 0) + { + if(r >= 1.0f) + { + onAnimationEnded.Broadcast(this, m_animationType); + m_animationType = 0; + } + m_animationTime += InDeltaTime; + } +} + +void UMenuScreenSubMenu::OnSuspend(USubMenu* newSubMenu, bool loseFocus) +{ + // Don't fade out / lose focus when side view is opened + USideView* sv = Cast(newSubMenu); + + if(sv) + loseFocus = false; + else + FadeOut(); + Super::OnSuspend(newSubMenu, loseFocus); +} +void UMenuScreenSubMenu::OnRestore(USubMenu* removedMenu) +{ + // To prevent playing the fade in animation again when we receive focus from closing side views when we are actually closing this menu + if(!m_isBeingClosed && !Cast(removedMenu)) + FadeIn(); + Super::OnRestore(removedMenu); +} + +void UMenuScreenSubMenu::FadeIn() +{ + m_animationTime = 0.0f; + m_animationType = 1; +} +void UMenuScreenSubMenu::FadeOut() +{ + m_animationTime = 0.0f; + m_animationType = 2; +} +UMenuPanel* UMenuScreenSubMenu::OpenScreenMenu(TSubclassOf cls) +{ + UMenuScreen* screen = Cast(GetScreen()); + if(screen) + { + return screen->OpenScreenMenu(cls); + } + return nullptr; +} +USideView* UMenuScreenSubMenu::OpenSideView(TSubclassOf cls) +{ + UMenuScreen* screen = Cast(GetScreen()); + if(screen) + { + screen->CloseAllSideViews(); + return screen->OpenSideView(cls); + } + return nullptr; +} + +class UMenuButton* UMenuScreenSubMenu::AddButton(FString label) +{ + if(!container) + return nullptr; + + UMenuButton* button = CreateWidget(GetWorld(), defaultButtonClass); + if(!button) + return nullptr; + + container->AddChild(button); + RescanItems(); + + button->SetButtonText(label); + + return button; +} + +void UMenuScreenSubMenu::RescanItems() +{ + m_backButton = nullptr; + + Super::RescanItems(); + + for(UMenuItemBase* item : m_items) + { + UMenuButton* button = Cast(item); + if(button) + { + if(button->GetName() == "Back") + { + m_backButton = button; + break; + } + } + } +} +void UMenuScreenSubMenu::NativeOnMenuAction(EMenuActionBinding binding) +{ + Super::NativeOnMenuAction(binding); + if(binding == EMenuActionBinding::Back) + { + if(m_backButton) + { + m_backButton->SimulatePressed(); + } + } +} + diff --git a/Source/UnrealProject/GUI/Menu/MenuScreen.h b/Source/UnrealProject/GUI/Menu/MenuScreen.h new file mode 100644 index 0000000..5784039 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/MenuScreen.h @@ -0,0 +1,135 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GUI/Menu/MenuScreenBase.h" +#include "SubMenu.h" +#include "MenuScreen.generated.h" + +UCLASS() +class UMenuScreenSubMenu : public USubMenu +{ + GENERATED_BODY() +public: + UMenuScreenSubMenu(const FObjectInitializer& init); + virtual void NativeConstruct() override; + virtual void NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override; + + virtual void OnSuspend(USubMenu* newSubMenu, bool loseFocus); + virtual void OnRestore(USubMenu* removedMenu); + + void FadeIn(); + void FadeOut(); + + UFUNCTION(BlueprintCallable, Category = "Menu Screen") + UMenuPanel* OpenScreenMenu(TSubclassOf cls); + UFUNCTION(BlueprintCallable, Category = "Menu Screen") + USideView* OpenSideView(TSubclassOf cls); + + class UMenuButton* AddButton(FString label); + + virtual void RescanItems() override; + virtual void NativeOnMenuAction(EMenuActionBinding binding) override; + + // Assigns a button to be the back button, this button will receive a pressed event when the player presses the circle button + void SetBackButton(UMenuButton* button) { m_backButton = button; } + + DECLARE_MULTICAST_DELEGATE_TwoParams(FOnAnimationEnded, UMenuScreenSubMenu*, int32) + FOnAnimationEnded onAnimationEnded; + + UPROPERTY(EditDefaultsOnly, Category = "SubMenu") + FString menuName; + +private: + UPROPERTY() + UMenuButton* m_backButton; + + int32 m_animationType; + float m_animationTime; + bool m_isBeingClosed; + friend class UMenuScreen; +}; + +UCLASS() +class USideView : public UMenuScreenSubMenu +{ + GENERATED_BODY() +public: + virtual ~USideView() = default; +}; + +UCLASS() +class UPersistentSideView : public USideView +{ + GENERATED_BODY() +public: + virtual ~UPersistentSideView() = default; +}; + +UCLASS() +class UMenuPanel : public UMenuScreenSubMenu +{ + GENERATED_BODY() +public: +}; + +/** + * + */ +UCLASS() +class UNREALPROJECT_API UMenuScreen : public UMenuScreenBase +{ + GENERATED_BODY() +public: + void NativeConstruct() override; + + UFUNCTION(BlueprintCallable, Category = "Menu Screen") + UMenuPanel* OpenScreenMenu(TSubclassOf cls); + UFUNCTION(BlueprintCallable, Category = "Menu Screen") + USideView* OpenSideView(TSubclassOf cls); + UFUNCTION(BlueprintCallable, Category = "Menu Screen") + void CloseAllSideViews(); + + UFUNCTION(BlueprintImplementableEvent, Category="Menu Screen") + void SwitchSideViewVisible(bool visible); + + UFUNCTION(BlueprintCallable, Category = "Menu Screen") + void OpenPersistentSideView(UPersistentSideView* sideView); + UFUNCTION(BlueprintCallable, Category = "Menu Screen") + void ClosePersistentSideView(UPersistentSideView* sideView); + + // When this menu needs to be hidden + UFUNCTION(BlueprintImplementableEvent) + void OnShow(); + // When this menu needs to be shown + UFUNCTION(BlueprintImplementableEvent) + void OnHide(); + + virtual void OpenSubMenu(class USubMenu* submenu) override; + virtual void CloseSubMenu(class USubMenu* submenu) override; + +private: + void m_OpenSubMenu(class USubMenu* submenu, bool transferFocus = true); + void m_CloseSubMenu(class USubMenu* submenu, bool persist = false); + void m_OnFadeOutComplete(UMenuScreenSubMenu* panel, int32 type); + + bool m_sideViewActive; + + UButtonHintBar* m_buttonHintBar; + UOverlay* m_menuContainer; + UOverlay* m_sideViewContainer; + UTextBlock* m_menuTitle; + UTextBlock* m_sideViewTitle; + + UPROPERTY() + TArray m_currentSideViews; + + friend class UMenuScreenSubMenu; +}; + +UCLASS() +class UMainMenuScreen : public UMenuScreen +{ + GENERATED_BODY() +public: +}; \ No newline at end of file diff --git a/Source/UnrealProject/GUI/Menu/MenuScreenBase.cpp b/Source/UnrealProject/GUI/Menu/MenuScreenBase.cpp new file mode 100644 index 0000000..b48e3bb --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/MenuScreenBase.cpp @@ -0,0 +1,122 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "MenuScreenBase.h" +#include "PlayerControllerBase.h" +#include "SubMenu.h" +#include "WidgetBlueprintLibrary.h" + +UMenuScreenBase::UMenuScreenBase(const FObjectInitializer& init) + : Super(init) +{ + registerMenuActions = false; +} +void UMenuScreenBase::NativeConstruct() +{ + Super::NativeConstruct(); + APlayerControllerBase* pcb = Cast(GetWorld()->GetFirstPlayerController()); + if(registerMenuActions && pcb) + { + pcb->AddMenuInputItem(this); + } +} +void UMenuScreenBase::NativeDestruct() +{ + Super::NativeDestruct(); + APlayerControllerBase* pcb = Cast(GetWorld()->GetFirstPlayerController()); + if(registerMenuActions && pcb) + { + pcb->RemoveMenuInputItem(this); + } +} + +void UMenuScreenBase::OpenSubMenu(class USubMenu* submenu) +{ + if(m_subMenus.Contains(submenu)) + { + GWARNING("Submenu already active"); + return; + } + + if(!submenu) + { + GWWARNING(L"Invalid submenu passed to OpenSubMenu"); + return; + } + + submenu->OnEnter(this); + if(m_subMenus.Num() > 0) + { + m_subMenus.Last()->OnSuspend(submenu, true); + } + m_subMenus.Add(submenu); + + UWidgetBlueprintLibrary::SetFocusToGameViewport(); +} +void UMenuScreenBase::CloseActiveSubMenu() +{ + if(m_subMenus.Num() > 0) + { + CloseSubMenu(m_subMenus.Last()); + } + else + { + GWWARNING("No SubMenus to close"); + return; + } +} + +void UMenuScreenBase::CloseSubMenu(class USubMenu* submenu) +{ + if(!m_subMenus.Contains(submenu)) + return; + + submenu->OnLeave(); + + // Restore underlying menus if that was the top-most menu + if(m_subMenus.Num() > 1) + { + bool wasLast = m_subMenus.Last() == submenu; + m_subMenus.Remove(submenu); + if(wasLast) + { + m_subMenus.Last()->OnRestore(submenu); + } + } + else + { + // Remove last menu + m_subMenus.Remove(submenu); + } + + UWidgetBlueprintLibrary::SetFocusToGameViewport(); +} + +TArray UMenuScreenBase::GetSubMenus() +{ + return m_subMenus; +} +class USubMenu* UMenuScreenBase::GetActiveSubMenu() +{ + if(m_subMenus.Num() == 0) + return nullptr; + return m_subMenus.Last(); +} + +void UMenuScreenBase::SetButtonHintBar(class UButtonHintBar* bar) +{ + m_buttonHintBar = bar; +} +class UButtonHintBar* UMenuScreenBase::GetButtonHintBar() const +{ + return m_buttonHintBar; +} + +void UMenuScreenBase::NativeOnMenuAction(EMenuActionBinding action) +{ + if(m_subMenus.Num() > 0) + { + m_subMenus.Last()->NativeOnMenuAction(action); + } + Super::NativeOnMenuAction(action); +} \ No newline at end of file diff --git a/Source/UnrealProject/GUI/Menu/MenuScreenBase.h b/Source/UnrealProject/GUI/Menu/MenuScreenBase.h new file mode 100644 index 0000000..c767c0a --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/MenuScreenBase.h @@ -0,0 +1,52 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "MenuItemBase.h" +#include "Blueprint/UserWidget.h" +#include "MenuScreenBase.generated.h" + +/** + * Base class for a menu item with controller navigation/input support + */ +UCLASS() +class UNREALPROJECT_API UMenuScreenBase : public UMenuItemBase +{ + GENERATED_BODY() + +public: + UMenuScreenBase(const FObjectInitializer& init); + void NativeConstruct() override; + void NativeDestruct() override; + + UFUNCTION(BlueprintCallable, Category = "MenuScreen") + virtual void OpenSubMenu(class USubMenu* submenu); + UFUNCTION(BlueprintCallable, Category = "MenuScreen") + void CloseActiveSubMenu(); + UFUNCTION(BlueprintCallable, Category = "MenuScreen") + virtual void CloseSubMenu(class USubMenu* submenu); + + UFUNCTION(BlueprintCallable, Category = "MenuScreen") + TArray GetSubMenus(); + UFUNCTION(BlueprintCallable, Category = "MenuScreen") + class USubMenu* GetActiveSubMenu(); + + UFUNCTION(BlueprintCallable, Category = "MenuScreen") + void SetButtonHintBar(class UButtonHintBar* bar); + UFUNCTION(BlueprintCallable, Category = "MenuScreen") + class UButtonHintBar* GetButtonHintBar() const; + + void OnItemSelected(); + + virtual void NativeOnMenuAction(EMenuActionBinding action) override; + + UPROPERTY(BlueprintReadOnly, EditDefaultsOnly, Category = "MenuScreen") + bool registerMenuActions; + +protected: + UPROPERTY() + TArray m_subMenus; + + UPROPERTY() + class UButtonHintBar* m_buttonHintBar; +}; diff --git a/Source/UnrealProject/GUI/Menu/MenuSlider.cpp b/Source/UnrealProject/GUI/Menu/MenuSlider.cpp new file mode 100644 index 0000000..4fb0a09 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/MenuSlider.cpp @@ -0,0 +1,139 @@ +#include "UnrealProject.h" +#include "MenuSlider.h" +#include "SizeBorder.h" + +void UMenuSliderButton::NativeConstruct() +{ + m_button = Cast(WidgetTree->FindWidget("Button")); + m_dragBorder = Cast(WidgetTree->FindWidget("DragBorder")); + m_text = Cast(WidgetTree->FindWidget("Text")); + m_button->OnPressed.AddDynamic(this, &UMenuSliderButton::m_OnPressed); + m_panel = Cast(GetParent()); + + m_dragging = false; + + Super::NativeConstruct(); + SetSelected(false); +} +void UMenuSliderButton::NativeTick(const FGeometry& MyGeometry, float InDeltaTime) +{ + UCanvasPanelSlot* canvasSlot = Cast(Slot); + canvasSlot->SetAlignment(FVector2D(0.0f, 0.0f)); + + if(m_parent) + { + float totalPixelWidth = m_parent->m_sizeBorder->pixelSize.X; + float totalWidth = m_parent->m_sizeBorder->viewportSize.X; + float totalHeight = m_parent->m_sizeBorder->viewportSize.Y; + + float buttonSize = totalWidth * 0.2f; + totalPixelWidth -= totalPixelWidth * 0.2f; + totalWidth -= buttonSize; + + if(m_dragging) + { + float mouseX, mouseY; + GetOwningPlayer()->GetMousePosition(mouseX, mouseY); + float delta = (mouseX - m_dragStart.X) / (totalPixelWidth); + m_parent->value = FMath::Clamp(m_dragStartValue + delta, 0.0f, 1.0f); + + if(!m_dragBorder->IsHovered() && !m_button->IsHovered()) + { + m_EndDrag(); + } + UpdateText(); + } + + canvasSlot->SetPosition(FVector2D(m_parent->value * totalWidth, 0.0f)); + canvasSlot->SetSize(FVector2D(buttonSize, totalHeight)); + } + Super::NativeTick(MyGeometry, InDeltaTime); +} + +void UMenuSliderButton::UpdateText() +{ + FString txt = FString::FromInt((int)(m_parent->value * 100)) + "%"; + m_text->SetText(FText::FromString(txt)); +} + +void UMenuSliderButton::SetSelected(bool selected) +{ + if(selected) + { + m_button->SetBackgroundColor(FLinearColor(0.3f, 0.3f, 1.0f, 0.8f)); + } + else + { + m_button->SetBackgroundColor(FLinearColor(0.7f, 0.7f, 0.7f, 0.8f)); + } +} + +void UMenuSliderButton::m_OnPressed() +{ + float mouseX, mouseY; + if(m_parent) + { + GetOwningPlayer()->GetMousePosition(mouseX, mouseY); + m_dragStart = FVector2D(mouseX, mouseY); + m_dragStartValue = m_parent->value; + m_dragging = true; + m_dragBorder->SetVisibility(ESlateVisibility::Visible); + } +} + +void UMenuSliderButton::m_EndDrag() +{ + m_dragging = false; + m_dragBorder->SetVisibility(ESlateVisibility::SelfHitTestInvisible); +} + +FReply UMenuSliderButton::NativeOnMouseButtonUp(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) +{ + m_EndDrag(); + return FReply::Unhandled(); +} + +UMenuSlider::UMenuSlider(const FObjectInitializer& init) + : Super(init) +{ + stepGranularity = 1.0f / 25; + value = 0.5f; +} + +void UMenuSlider::NativeConstruct() +{ + Super::NativeConstruct(); + + m_sizeBorder = Cast(WidgetTree->FindWidget("SizeBorder")); + m_sliderButton = Cast(WidgetTree->FindWidget("SliderButton")); + m_sliderButton->m_parent = this; +} + +void UMenuSlider::SetValue(float _value) +{ + value = FMath::Clamp(_value, 0.0f, 1.0f); + m_sliderButton->UpdateText(); +} + +void UMenuSlider::NativeOnMenuAction(EMenuActionBinding binding) +{ + switch(binding) + { + case EMenuActionBinding::Left: + case EMenuActionBinding::Repeat_Left: + SetValue(value - stepGranularity); + break; + case EMenuActionBinding::Right: + case EMenuActionBinding::Repeat_Right: + SetValue(value + stepGranularity); + break; + } + Super::NativeOnMenuAction(binding); +} + +void UMenuSlider::NativeOnSelectionChanged(bool selected, bool controller) +{ + Super::NativeOnSelectionChanged(selected, controller); + if(m_sliderButton) + m_sliderButton->SetSelected(selected); +} diff --git a/Source/UnrealProject/GUI/Menu/MenuSlider.h b/Source/UnrealProject/GUI/Menu/MenuSlider.h new file mode 100644 index 0000000..d93ed26 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/MenuSlider.h @@ -0,0 +1,61 @@ +#pragma once + +#include "MenuButton.h" +#include "MenuSlider.generated.h" + +UCLASS() +class UMenuSliderButton : public UMenuItemBase +{ + GENERATED_BODY() +public: + void NativeConstruct() override ; + void NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override; + + void UpdateText(); + + void SetSelected(bool selected); + +private: + UFUNCTION() + void m_OnPressed(); + void m_EndDrag(); + + FReply NativeOnMouseButtonUp(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) override; + + friend class UMenuSlider; + class UMenuSlider* m_parent; + UBorder* m_dragBorder; + UButton* m_button; + UTextBlock* m_text; + UCanvasPanel* m_panel; + FVector2D m_dragStart; + float m_dragStartValue; + bool m_dragging; +}; + +UCLASS() +class UMenuSlider : public UMenuButton +{ + GENERATED_BODY() +public: + UMenuSlider(const FObjectInitializer& init); + void NativeConstruct() override; + void NativeOnMenuAction(EMenuActionBinding binding) override; + + void NativeOnSelectionChanged(bool selected, bool controller) override; + + UFUNCTION(BlueprintCallable, Category="Slider") + void SetValue(float value); + + UPROPERTY(BlueprintReadOnly, Category = "Slider") + float value; + + UPROPERTY(EditAnywhere, Category = "Slider") + float stepGranularity; + +private: + friend class UMenuSliderButton; + class USizeBorder* m_sizeBorder; + class UMenuSliderButton* m_sliderButton; + +}; \ No newline at end of file diff --git a/Source/UnrealProject/GUI/Menu/OverlayMessageBox.cpp b/Source/UnrealProject/GUI/Menu/OverlayMessageBox.cpp new file mode 100644 index 0000000..5a4fe39 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/OverlayMessageBox.cpp @@ -0,0 +1,78 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "OverlayMessageBox.h" +#include "ScreenOverlay.h" + +void UOverlayMessageBoxItem::NativeConstruct() +{ + m_label = Cast(WidgetTree->FindWidget("Label")); + onPressed.AddDynamic(this, &UOverlayMessageBoxItem::m_OnPressed); + Super::NativeConstruct(); +} +void UOverlayMessageBoxItem::SetText(const FString& text) +{ + if(!m_label) + { + GERROR("UOverlayMessageBoxItem Label not set on " + GetName()); + return; + } + m_label->SetText(FText::FromString(text)); +} + +void UOverlayMessageBoxItem::m_OnPressed() +{ + //Cast(GetSubMenu())->returnCode = index; + //UMenuScreenBase* screen = GetSubMenu()->GetScreen(); + //check(m_info); + m_info->Close(index); + //if(screen) + // screen->CloseActiveSubMenu(); + //else + // GERROR("screen == nullptr, should not happen"); +} + +void UOverlayMessageBox::NativeConstruct() +{ + Super::NativeConstruct(); + + m_buttonContainer = Cast(WidgetTree->FindWidget("ButtonContainer")); + m_caption = Cast(WidgetTree->FindWidget("Caption")); + m_message = Cast(WidgetTree->FindWidget("Message")); +} + +void UOverlayMessageBox::SetMessageBoxInfo(class UMsgBoxInfo* info) +{ + if(!buttonItemClass) + { + GERROR("Button item class not set on " + GetName()); + return; + } + + m_buttonContainer->ClearChildren(); + + m_info = info; + + UOverlayMessageBoxItem* selectItem = 0; + for(FString option : info->options) + { + UOverlayMessageBoxItem* item = CreateWidget(GetWorld(), buttonItemClass); + item->m_info = info; + + UHorizontalBoxSlot* slot = Cast(m_buttonContainer->AddChild(item)); + slot->SetHorizontalAlignment(HAlign_Fill); + slot->SetVerticalAlignment(VAlign_Fill); + slot->SetSize(FSlateChildSize(ESlateSizeRule::Fill)); + item->SetButtonText(option); + if(option == info->defaultOption) + selectItem = item; + else if(!selectItem) + selectItem = item; + } + + m_caption->SetText(FText::FromString(info->caption)); + m_message->SetText(FText::FromString(info->message)); + + RescanItems(); + SelectNewItem(selectItem); +} \ No newline at end of file diff --git a/Source/UnrealProject/GUI/Menu/OverlayMessageBox.h b/Source/UnrealProject/GUI/Menu/OverlayMessageBox.h new file mode 100644 index 0000000..87b603b --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/OverlayMessageBox.h @@ -0,0 +1,46 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "SubMenu.h" +#include "MenuButton.h" +#include "OverlayMessageBox.generated.h" + +UCLASS() +class UOverlayMessageBoxItem : public UMenuButton +{ + GENERATED_BODY() +public: + virtual void NativeConstruct() override; + void SetText(const FString& text); +private: + void m_OnPressed(); + + friend class UOverlayMessageBox; + UTextBlock* m_label; + class UMsgBoxInfo* m_info; +}; + +UCLASS() +class UOverlayMessageBox : public USubMenu +{ + GENERATED_BODY() +public: + virtual void NativeConstruct() override; + + void SetMessageBoxInfo(class UMsgBoxInfo* info); + + UPROPERTY(BlueprintReadWrite, Category = "MsgBox") + int32 returnCode; + UPROPERTY(EditDefaultsOnly, Category = "MsgBox") + TSubclassOf buttonItemClass; + +private: + UPROPERTY() + UHorizontalBox* m_buttonContainer; + UPROPERTY() + UTextBlock* m_caption; + UPROPERTY() + UTextBlock* m_message; + class UMsgBoxInfo* m_info; +}; diff --git a/Source/UnrealProject/GUI/Menu/OverlayProgressBar.cpp b/Source/UnrealProject/GUI/Menu/OverlayProgressBar.cpp new file mode 100644 index 0000000..1d56f9c --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/OverlayProgressBar.cpp @@ -0,0 +1,24 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "OverlayProgressBar.h" +#include "ScreenOverlay.h" + +void UOverlayProgressBar::NativeConstruct() +{ + m_text = Cast(WidgetTree->FindWidget("Text")); + if(!m_text) + { + GERROR("No \"Text\" element in overlay progress bar"); + } + + Super::NativeConstruct(); +} + +void UOverlayProgressBar::SetOverlayInfo(class UOverlayInfo* info) +{ + if(m_text) + { + m_text->SetText(FText::FromString(info->message)); + } +} diff --git a/Source/UnrealProject/GUI/Menu/OverlayProgressBar.h b/Source/UnrealProject/GUI/Menu/OverlayProgressBar.h new file mode 100644 index 0000000..3a24cfc --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/OverlayProgressBar.h @@ -0,0 +1,23 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GUI/Menu/SubMenu.h" +#include "OverlayProgressBar.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API UOverlayProgressBar : public USubMenu +{ + GENERATED_BODY() +public: + virtual void NativeConstruct(); + + // Updates the text,etc. on the progress bar overlay + void SetOverlayInfo(class UOverlayInfo* info); + +private: + UTextBlock* m_text; +}; diff --git a/Source/UnrealProject/GUI/Menu/ScoreBoard.cpp b/Source/UnrealProject/GUI/Menu/ScoreBoard.cpp new file mode 100644 index 0000000..ce3181f --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/ScoreBoard.cpp @@ -0,0 +1,78 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "ScoreBoardSlot.h" +#include "DefaultPlayerState.h" +#include "GameStateBase.h" +#include "TeamData.h" +#include "ScoreBoard.h" + + +UScoreBoard::UScoreBoard(const FObjectInitializer& init) : Super(init) +{ + teamData = ConstructorHelpers::FObjectFinder(TEXT("/Game/Assets/TeamData")).Object; +} + +void UScoreBoard::Init(UVerticalBox* container) +{ + m_container = container; + + // Precreate the widgets so that we can utilize them later + if (IsValid(scoreBoardSlot) && IsValid(m_container)) + { + for (int32 i = 0; i < 8; i++) + { + UScoreBoardSlot* widget = CreateWidget(GetWorld(), scoreBoardSlot); + m_container->AddChild(widget); + m_slots.Add(widget); + widget->SetVisibility(ESlateVisibility::Hidden); + } + } +} + +void UScoreBoard::UpdateScoreBoard(int32 sort) +{ + UWorld* world = GetWorld(); + if (!IsValid(world)) return; + AGameStateBase* gameState = Cast(world->GetGameState()); + if (!IsValid(gameState)) return; + + TArray players = gameState->GetPlayers(); + + // Fetch and update + TArray playersSorted; + for (int32 i = 0; i < players.Num(); i++) + { + ADefaultPlayerState* const state = Cast(players[i]); + if (!IsValid(state)) continue; + state->UpdatePersona(); + playersSorted.Add(state); + } + + // Sort based on category + if(sort == 0) + playersSorted.Sort([](const ADefaultPlayerState& i, const ADefaultPlayerState& j)->bool { return i.nickname < j.nickname; }); + else if(sort == 1) + playersSorted.Sort([](const ADefaultPlayerState& i, const ADefaultPlayerState& j)->bool { return i.kills > j.kills; }); + else if (sort == 2) + playersSorted.Sort([](const ADefaultPlayerState& i, const ADefaultPlayerState& j)->bool { return i.deaths > j.deaths; }); + else if (sort == 3) + playersSorted.Sort([](const ADefaultPlayerState& i, const ADefaultPlayerState& j)->bool { return float(i.kills) / float(i.deaths) > float(j.kills) / float(j.deaths); }); + + // Activate the slots and set them to the person + for (int32 i = 0; i < m_slots.Num(); i++) + { + if (i >= playersSorted.Num()) + { + m_slots[i]->SetVisibility(ESlateVisibility::Hidden); + continue; + } + else + m_slots[i]->SetVisibility(ESlateVisibility::Visible); + + ADefaultPlayerState* const state = playersSorted[i]; + + m_slots[i]->SetVisibility(ESlateVisibility::Visible); + m_slots[i]->Update(state->avatar, FText::FromString(state->nickname), state->kills, state->deaths, teamData->GetTeamColor(state->GetTeam())); + } +} \ No newline at end of file diff --git a/Source/UnrealProject/GUI/Menu/ScoreBoard.h b/Source/UnrealProject/GUI/Menu/ScoreBoard.h new file mode 100644 index 0000000..a038d97 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/ScoreBoard.h @@ -0,0 +1,34 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Blueprint/UserWidget.h" +#include "ScoreBoard.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API UScoreBoard : public UUserWidget +{ + GENERATED_BODY() + + +public: + UScoreBoard(const FObjectInitializer& init); + + UPROPERTY(EditAnywhere, Category = "Score Board") + TSubclassOf scoreBoardSlot; + + UFUNCTION(BlueprintCallable, Category = "Score Board") + void Init(class UVerticalBox* container); + + UFUNCTION(BlueprintCallable, Category = "Score Board") + void UpdateScoreBoard(int32 sort); + + UPROPERTY(BlueprintReadonly, Category = "SCore Board") + class UTeamData* teamData; +private: + class UVerticalBox* m_container; + TArray m_slots; +}; diff --git a/Source/UnrealProject/GUI/Menu/ScoreBoardSlot.cpp b/Source/UnrealProject/GUI/Menu/ScoreBoardSlot.cpp new file mode 100644 index 0000000..86c0db5 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/ScoreBoardSlot.cpp @@ -0,0 +1,4 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "ScoreBoardSlot.h" diff --git a/Source/UnrealProject/GUI/Menu/ScoreBoardSlot.h b/Source/UnrealProject/GUI/Menu/ScoreBoardSlot.h new file mode 100644 index 0000000..8a4622e --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/ScoreBoardSlot.h @@ -0,0 +1,19 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Blueprint/UserWidget.h" +#include "ScoreBoardSlot.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API UScoreBoardSlot : public UUserWidget +{ + GENERATED_BODY() + +public: + UFUNCTION(BlueprintImplementableEvent, Category = "Score Board Slot") + void Update(UTexture2D* image, const FText& name, int32 kills, int32 deaths, const FLinearColor& color); +}; diff --git a/Source/UnrealProject/GUI/Menu/ScreenOverlay.cpp b/Source/UnrealProject/GUI/Menu/ScreenOverlay.cpp new file mode 100644 index 0000000..f9f32ae --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/ScreenOverlay.cpp @@ -0,0 +1,195 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "ScreenOverlay.h" +#include "OverlayMessageBox.h" +#include "OverlayProgressBar.h" + +UScreenOverlay::UScreenOverlay(const FObjectInitializer& init) + : Super(init) +{ +} +void UScreenOverlay::NativeConstruct() +{ + Super::NativeConstruct(); + m_msgBox = Cast(WidgetTree->FindWidget("MessageBox")); + m_progressBar = Cast(WidgetTree->FindWidget("ProgressBar")); + m_background = Cast(WidgetTree->FindWidget("Background")); + check(m_msgBox); + check(m_progressBar); + check(m_background); + UpdateOverlays(); + UpdateMsgBoxes(); + UpdateVisiblity(); + m_msgBox->onClosed.AddDynamic(this, &UScreenOverlay::OnMessageBoxClosed); +} +void UScreenOverlay::NativeTick(const FGeometry& MyGeometry, float InDeltaTime) +{ + Super::NativeTick(MyGeometry, InDeltaTime); + + // Check all active screen overlays, remove the inactive ones + for(int32 i = 0; i < m_overlayItems.Num();) + { + if(m_overlayItems[i]->m_remove) + { + m_overlayItems.RemoveAt(i); + UpdateOverlays(); + UpdateVisiblity(); + } + else + { + i++; + } + } + + // Check the currently shown message box, remove it if inactive + UMsgBoxInfo* msgBox = GetMessageBoxItem(); + if(msgBox && msgBox->m_remove) + { + if(msgBox->onClosed.IsBound()) + { + msgBox->onClosed.Execute(msgBox->m_closeResult); + } + m_messageBoxItems.Remove(msgBox); + UpdateMsgBoxes(); + UpdateVisiblity(); + + // Show remaining message boxes + if(m_messageBoxItems.Num() > 0) + { + OpenSubMenu(m_msgBox); + } + } +} + +UOverlayInfo* UScreenOverlay::ShowOverlay(FString message) +{ + // Add a new overlay item to the list + UOverlayInfo* info = NewObject(); + info->message = message; + m_overlayItems.Add(info); + + // Update Widget blueprint + UpdateOverlays(); + UpdateVisiblity(); + return info; +} + +UMsgBoxInfo* UScreenOverlay::ShowMessageBox(FString caption, FString message, TArray options, FString def /*= FString()*/) +{ + // Add a new message box at the end of the queue + UMsgBoxInfo* info = NewObject(); + info->message = message; + info->caption = caption; + info->options = options; + info->defaultOption = def; + m_messageBoxItems.Add(info); + + // Update Widget blueprint + UpdateMsgBoxes(); + UpdateVisiblity(); + + OpenSubMenu(m_msgBox); + + return info; +} +UMsgBoxInfo* UScreenOverlay::ShowMessageBoxCallback(FOverlayItemClosed cb, FString caption, FString message, TArray options, FString def /*= ""*/) +{ + // Add a new message box at the end of the queue + UMsgBoxInfo* info = NewObject(); + info->message = message; + info->caption = caption; + info->options = options; + info->onClosed = cb; + info->defaultOption = def; + m_messageBoxItems.Add(info); + + // Update Widget blueprint + UpdateMsgBoxes(); + UpdateVisiblity(); + + OpenSubMenu(m_msgBox); + + return info; +} + +void UScreenOverlay::OnMessageBoxClosed() +{ + m_messageBoxItems.Last()->Close(m_msgBox->returnCode); +} + +TArray& UScreenOverlay::GetOverlayItems() +{ + return m_overlayItems; +} + +UMsgBoxInfo* UScreenOverlay::GetMessageBoxItem() +{ + if(m_messageBoxItems.Num() == 0) + { + return nullptr; + } + return m_messageBoxItems[0]; +} +void UScreenOverlay::UpdateOverlays() +{ + if(m_overlayItems.Num() != 0) + { + m_progressBar->SetVisibility(ESlateVisibility::Visible); + m_progressBar->SetOverlayInfo(m_overlayItems.Last()); + } + else + { + m_progressBar->SetVisibility(ESlateVisibility::Hidden); + } +} +void UScreenOverlay::UpdateMsgBoxes() +{ + if(m_messageBoxItems.Num() != 0) + { + m_msgBox->SetMessageBoxInfo(GetMessageBoxItem()); + m_msgBox->SetVisibility(ESlateVisibility::Visible); + } + else + { + m_msgBox->SetVisibility(ESlateVisibility::Hidden); + } +} +void UScreenOverlay::UpdateVisiblity() +{ + if(m_messageBoxItems.Num() != 0 || m_overlayItems.Num() != 0) + { + m_background->SetVisibility(ESlateVisibility::Visible); + blockInput = true; + } + else + { + m_background->SetVisibility(ESlateVisibility::Hidden); + blockInput = false; + } +} + +UOverlayQueueItem::UOverlayQueueItem(const FObjectInitializer& init) + : Super(init) +{ + m_remove = false; +} +void UOverlayQueueItem::Close(int32 result) +{ + m_remove = true; + m_closeResult = result; +} + +UMsgBoxInfo::UMsgBoxInfo(const FObjectInitializer& init) + : Super(init) +{ + message = "nothing"; + options.Add("OK"); +} + +UOverlayInfo::UOverlayInfo(const FObjectInitializer& init) + : Super(init) +{ + blockInput = true; + message = "nothing"; +} \ No newline at end of file diff --git a/Source/UnrealProject/GUI/Menu/ScreenOverlay.h b/Source/UnrealProject/GUI/Menu/ScreenOverlay.h new file mode 100644 index 0000000..fe96324 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/ScreenOverlay.h @@ -0,0 +1,104 @@ +// Project Lab - NHTV Igad + +#pragma once +#include "MenuScreenBase.h" +#include "ScreenOverlay.generated.h" + +UENUM(BlueprintType) +enum class EMessageBoxType : uint8 +{ + Ok, + OkCancel, + YesNo +}; + +UCLASS() +class UOverlayQueueItem : public UObject +{ + GENERATED_BODY() +public: + UOverlayQueueItem(const FObjectInitializer& init); + // Close this overlay item + UFUNCTION(BlueprintCallable, Category = "Overlay") + void Close(int32 result = 0); + + UPROPERTY() + FOverlayItemClosed onClosed; + +private: + friend class UScreenOverlay; + bool m_remove; + int32 m_closeResult; +}; + +UCLASS() +class UMsgBoxInfo : public UOverlayQueueItem +{ + GENERATED_BODY() +public: + UMsgBoxInfo(const FObjectInitializer& init); + UPROPERTY(BlueprintReadOnly, Category = "MsgBox") + FString caption; + UPROPERTY(BlueprintReadOnly, Category = "MsgBox") + FString message; + UPROPERTY(BlueprintReadOnly, Category = "MsgBox") + TArray options; + UPROPERTY(BlueprintReadOnly, Category = "MsgBox") + FString defaultOption; + +}; +UCLASS() +class UOverlayInfo : public UOverlayQueueItem +{ + GENERATED_BODY() +public: + UOverlayInfo(const FObjectInitializer& init); + UPROPERTY(BlueprintReadOnly, Category = "MsgBox") + FString message; + UPROPERTY(BlueprintReadOnly, Category = "Overlay") + bool blockInput; + +}; + +UCLASS() +class UNREALPROJECT_API UScreenOverlay : public UMenuScreenBase +{ + GENERATED_BODY() +public: + UScreenOverlay(const FObjectInitializer& init); + virtual void NativeConstruct() override; + virtual void NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override; + + UFUNCTION(BlueprintCallable, Category = "Overlay") + UOverlayInfo* ShowOverlay(FString message); + UMsgBoxInfo* ShowMessageBox(FString caption, FString message, TArray options, FString def = ""); + UMsgBoxInfo* ShowMessageBoxCallback(FOverlayItemClosed cb, FString caption, FString message, TArray options, FString def); + //UFUNCTION(BlueprintCallable, Category = "Overlay") + //UMsgBoxInfo* ShowMessageBox(FOnOverlayItemClosedSingle cb, FString caption, FString message, TArray options, FString def = ""); + + UFUNCTION() + void OnMessageBoxClosed(); + + UFUNCTION(BlueprintCallable, Category = "Overlay") + TArray& GetOverlayItems(); + UFUNCTION(BlueprintCallable, Category = "Overlay") + UMsgBoxInfo* GetMessageBoxItem(); + +private: + void UpdateOverlays(); + void UpdateMsgBoxes(); + void UpdateVisiblity(); + + UPROPERTY() + class UOverlayMessageBox* m_msgBox; + UPROPERTY() + class UOverlayProgressBar* m_progressBar; + UPROPERTY() + class UBorder* m_background; + + UPROPERTY() + TArray m_overlayItems; + UPROPERTY() + TArray m_messageBoxItems; + +}; diff --git a/Source/UnrealProject/GUI/Menu/SelectButton.cpp b/Source/UnrealProject/GUI/Menu/SelectButton.cpp new file mode 100644 index 0000000..d07bea2 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/SelectButton.cpp @@ -0,0 +1,10 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "SelectButton.h" + + +USelectButton::USelectButton(const FObjectInitializer& init) : UMenuButton(init) +{ + selected = 0; +} \ No newline at end of file diff --git a/Source/UnrealProject/GUI/Menu/SelectButton.h b/Source/UnrealProject/GUI/Menu/SelectButton.h new file mode 100644 index 0000000..6f508e3 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/SelectButton.h @@ -0,0 +1,22 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "MenuButton.h" +#include "SelectButton.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API USelectButton : public UMenuButton +{ + GENERATED_BODY() + +public: + USelectButton(const FObjectInitializer& init); + + UPROPERTY(BlueprintReadWrite, Category = "SelectButton") + int32 selected; + +}; diff --git a/Source/UnrealProject/GUI/Menu/SkillSelector.cpp b/Source/UnrealProject/GUI/Menu/SkillSelector.cpp new file mode 100644 index 0000000..dd59a3b --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/SkillSelector.cpp @@ -0,0 +1,130 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "SkillSelector.h" +#include "SkillTreeObject.h" +#include "SkillObject.h" +#include "SkillWidget.h" +#include "SkillSelectorItem.h" +#include "SkillTreeWidget.h" +#include "BaseSkillObject.h" +#include "AbilityInfo.h" + +TSubclassOf defaultSkillSelector; + +USkillSelector::USkillSelector(const FObjectInitializer& init) + : Super(init) +{ + defaultSkillSelector = ConstructorHelpers::FClassFinder(L"/Game/Assets/GUI/Components/WEEGEE_SkillSelector").Class; +} +void USkillSelector::NativeConstruct() +{ + Super::NativeConstruct(); + + m_selectedItem = 0; + + TArray swidgets; + m_scrollBox = WidgetTree->FindWidget("ScrollBox"); + m_border = WidgetTree->FindWidget("Border"); + m_sizeRoot = WidgetTree->FindWidget("SizeRoot"); + if(!m_sizeRoot) + { + GWERROR(L"USkillSelector doesn't have a SizeRoot set"); + } + if(!m_scrollBox) + { + GWERROR(L"USkillSelector doesn't have a ScrollBox set"); + } + if(!ItemWidgetTemplate) + { + GWERROR(L"USkillSelector doesn't have a Item Widget Template set"); + return; + } +} + +void USkillSelector::NativeOnMenuAction(EMenuActionBinding binding) +{ + switch(binding) + { + case EMenuActionBinding::Left: + SetSelection(m_selectedItem - 1); + break; + case EMenuActionBinding::Right: + SetSelection(m_selectedItem + 1); + break; + default: + Super::NativeOnMenuAction(binding); + break; + } +} + +void USkillSelector::SetSelection(int32 idx) +{ + if(idx < 0 || idx >= m_scrollBox->GetChildrenCount()) + return; + + if(m_selectedItem < m_scrollBox->GetChildrenCount()) + SetItemSelected(m_selectedItem, false); + SetItemSelected(idx, true); + + m_selectedItem = idx; + + if(m_sizeRoot && m_scrollBox) + { + m_scrollBox->ScrollWidgetIntoView(m_items[m_selectedItem], true); + } +} + +void USkillSelector::SetItemSelected(int32 item, bool selected) +{ + m_items[item]->NativeOnSelectionChanged(selected, false); + if(selected) + onSkillSelectionChanged.Broadcast(m_items[item]); +} + +void USkillSelector::SetSkillTree(class USkillTreeWidget* skillTree) +{ + if(!skillTree) + return; + this->skillTree = skillTree; + USkillTreeObject* treeObject = skillTree->skillTreeAsset; + if(!m_scrollBox) + return; + if(!ItemWidgetTemplate) + return; + + m_scrollBox->ClearChildren(); + m_items.SetNum(0); + + uint32 itemIndex = 0; + for(int32 i = 0; i < treeObject->skills.Num(); i++) + { + UBaseSkillObject* skill = treeObject->skills[i]->GetDefaultObject(); + if(!skillShapeFilter.Contains(skill->skillShapeType)) + continue; + + USkillSelectorItem* widget = CreateWidget(GetWorld(), ItemWidgetTemplate); + widget->baseSkillObject = skill; + widget->index = itemIndex++; + widget->parent = this; + widget->skillTree = skillTree; + m_scrollBox->AddChild(widget); + m_items.Add(widget); + } + + SetSelection(FMath::Min(m_selectedItem, m_items.Num() - 1)); +} + +USkillWidget* USkillSelector::GetSelectedSkillWidget() +{ + if(m_selectedItem >= m_items.Num()) + return nullptr; + return m_items[m_selectedItem]->GetSkillWidget(); +} + +UBaseSkillObject* USkillSelector::GetSelectedSkillAsset() +{ + if(m_selectedItem >= m_items.Num()) + return nullptr; + return m_items[m_selectedItem]->baseSkillObject; +} \ No newline at end of file diff --git a/Source/UnrealProject/GUI/Menu/SkillSelector.h b/Source/UnrealProject/GUI/Menu/SkillSelector.h new file mode 100644 index 0000000..226a7df --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/SkillSelector.h @@ -0,0 +1,54 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GUI/Menu/MenuButton.h" +#include "BaseSkillObject.h" +#include "SkillSelector.generated.h" + +extern TSubclassOf defaultSkillSelector; + +UCLASS() +class UNREALPROJECT_API USkillSelector : public UMenuButton +{ + GENERATED_BODY() + +public: + USkillSelector(const FObjectInitializer& init); + void NativeConstruct() override; + virtual void NativeOnMenuAction(EMenuActionBinding binding) override; + + UFUNCTION(BlueprintCallable, Category="Skill Selector") + void SetSkillTree(class USkillTreeWidget* skillTree); + + UPROPERTY(BlueprintReadOnly, Category = "UI") + class USkillTreeWidget* skillTree; + + UPROPERTY(EditAnywhere, Category = "UI") + TArray skillShapeFilter; + + int32 GetSelection() const { return m_selectedItem; } + void SetSelection(int32 idx); + void SetItemSelected(int32 item, bool selected); + + DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnSkillSelectionChanged, USkillSelectorItem*, item); + UPROPERTY(BlueprintAssignable) + FOnSkillSelectionChanged onSkillSelectionChanged; + + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "UI") + TSubclassOf ItemWidgetTemplate; + + UFUNCTION(BlueprintCallable, Category = UI) + class USkillWidget* GetSelectedSkillWidget(); + + UFUNCTION(BlueprintCallable, Category = UI) + class UBaseSkillObject* GetSelectedSkillAsset(); +private: + UPROPERTY() + TArray m_items; + int32 m_selectedItem; + + USizeBox* m_sizeRoot; + UScrollBox* m_scrollBox; + UBorder* m_border; +}; diff --git a/Source/UnrealProject/GUI/Menu/SkillSelectorItem.cpp b/Source/UnrealProject/GUI/Menu/SkillSelectorItem.cpp new file mode 100644 index 0000000..5b1c40d --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/SkillSelectorItem.cpp @@ -0,0 +1,76 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "SkillSelectorItem.h" +#include "SkillSelector.h" +#include "SkillWidget.h" +#include "SkillTreeWidget.h" + +void USkillSelectorItem::NativeConstruct() +{ + Super::NativeConstruct(); + + m_skillWidget = WidgetTree->FindWidget("InnerSkillWidget"); + if(!m_skillWidget) + { + GWERROR(L"InnerSkillWidget not found on " + GetName()); + return; + } + else + { + m_skillWidget->skillAsset = baseSkillObject; + m_skillWidget->parent = skillTree; + m_skillWidget->UpdateSkill(); + } + + if(m_button) + { + m_button->OnPressed.AddDynamic(this, &USkillSelectorItem::m_OnPressed1); + } + else + { + GWERROR(L"No button found on " + GetName()); + } +} + +void USkillSelectorItem::NativeTick(const FGeometry& MyGeometry, float InDeltaTime) +{ + if(skillTree->IsUsingSkill(baseSkillObject)) + { + this->SetIsEnabled(false); + } + else + { + this->SetIsEnabled(true); + } +} + +void USkillSelectorItem::NativeOnSelectionChanged(bool selected, bool controller) +{ + if(selected) + { + m_button->SetBackgroundColor(FLinearColor(1.0f, 1.0f, 1.0f, 0.5f)); + } + else + { + m_button->SetBackgroundColor(FLinearColor(1.0f, 1.0f, 1.0f, 0.0f)); + } +} + +void USkillSelectorItem::m_OnPressed1() +{ + if(!GetIsEnabled()) + return; + + if(parent) + { + USubMenu* menu = parent->GetSubMenu(); + if(menu) + menu->SelectNewItem(parent); + + //if(parent->GetSelection() == index) + skillTree->NewSkill(m_skillWidget); + parent->SetSelection(index); + //else + } +} diff --git a/Source/UnrealProject/GUI/Menu/SkillSelectorItem.h b/Source/UnrealProject/GUI/Menu/SkillSelectorItem.h new file mode 100644 index 0000000..04a74f5 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/SkillSelectorItem.h @@ -0,0 +1,50 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "MenuButton.h" +#include "SkillSelectorItem.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API USkillSelectorItem : public UMenuButton +{ + GENERATED_BODY() + +public: + virtual void NativeConstruct() override; + virtual void NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override; + + virtual void NativeOnSelectionChanged(bool selected, bool controller) override; + //virtual FReply NativeOnMouseButtonDown(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) override; + + int32 index; + class USkillSelector* parent; + class UBaseSkillObject* baseSkillObject; + + UPROPERTY(BlueprintReadOnly, Category = UI) + class USkillTreeWidget* skillTree; + + UPROPERTY(EditDefaultsOnly, Category = UI) + TSubclassOf skillWidget; + + UFUNCTION(BlueprintCallable, Category = UI) + USkillSelector* GetSelector() const + { + return parent; + } + + UFUNCTION(BlueprintCallable, Category = UI) + class USkillWidget* GetSkillWidget() + { + return m_skillWidget; + } + +private: + UFUNCTION() + void m_OnPressed1(); + + class USkillWidget* m_skillWidget; +}; diff --git a/Source/UnrealProject/GUI/Menu/SplashScreen.cpp b/Source/UnrealProject/GUI/Menu/SplashScreen.cpp new file mode 100644 index 0000000..9f46290 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/SplashScreen.cpp @@ -0,0 +1,96 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "SplashScreen.h" +#include "SplashScreenItem.h" +#include "DefaultGameInstance.h" +#include "SessionManager.h" + +USplashScreen::USplashScreen(const FObjectInitializer& init) + : Super(init) +{ +} + +void USplashScreen::NativeConstruct() +{ + m_currentItem = -1; + Super::NativeConstruct(); +} +void USplashScreen::NativeTick(const FGeometry& MyGeometry, float InDeltaTime) +{ + Super::NativeTick(MyGeometry, InDeltaTime); + if(m_currentItem == -1) + return; + + if(m_currentItem >= m_activeScreens.Num()) + { + OnEnd(); + // Send done event + onDone.Broadcast(); + m_currentItem = -1; + } + else + { + m_switcher->SetActiveWidget(m_activeScreens[m_currentItem]); + if(m_activeScreens[m_currentItem]->GetRate() >= 1.0f) + { + m_activeScreens[m_currentItem]->End(); + m_currentItem++; + if(m_currentItem < m_activeScreens.Num()) + { + m_activeScreens[m_currentItem]->Start(); + } + } + } +} + +void USplashScreen::NativeOnMenuAction(EMenuActionBinding binding) +{ + if(binding == EMenuActionBinding::Start) + { + if(m_currentItem >= 0 && m_currentItem < m_activeScreens.Num()) + { + m_activeScreens[m_currentItem]->Skip(); + } + } +} + +void USplashScreen::OnEnd_Implementation() +{ + +} + +void USplashScreen::Init(UWidgetSwitcher* witcher) +{ + m_switcher = witcher; + m_currentItem = 0; + + for(int32 i = 0; i < splashItems.Num(); i++) + { + USplashScreenItem* item = CreateWidget(GetWorld(), splashItems[i]); + m_activeScreens.Add(item); + m_switcher->AddChild(item); + if(i == 0) + { + item->Start(); + if((i + 1) == splashItems.Num()) + item->fadeEnabled = false; + m_switcher->SetActiveWidget(item); + } + } +} + +float USplashScreen::GetFade() const +{ + if(m_currentItem == -1) + return 0.0f; + if(m_currentItem >= m_activeScreens.Num()) + { + return 0.0f; + } + if((m_currentItem + 1) == m_activeScreens.Num()) + { + return m_activeScreens[m_currentItem]->GetFadeOut(); + } + return 1.0f; +} diff --git a/Source/UnrealProject/GUI/Menu/SplashScreen.h b/Source/UnrealProject/GUI/Menu/SplashScreen.h new file mode 100644 index 0000000..f7057f7 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/SplashScreen.h @@ -0,0 +1,45 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "MenuScreenBase.h" +#include "SplashScreen.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API USplashScreen : public UMenuScreenBase +{ + GENERATED_BODY() + +public: + USplashScreen(const FObjectInitializer& init); + + virtual void NativeConstruct() override; + virtual void NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override; + + virtual void NativeOnMenuAction(EMenuActionBinding binding) override; + + UFUNCTION(BlueprintNativeEvent, Category = "Splash") + void OnEnd(); + + UFUNCTION(BlueprintCallable, Category="Splash") + void Init(UWidgetSwitcher* witcher); + + UFUNCTION(BlueprintCallable, Category="Splash") + float GetFade() const; + + UPROPERTY(BlueprintReadWrite, EditDefaultsOnly, Category="Splash") + TArray> splashItems; + + DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnSplashScreenDone); + UPROPERTY(BlueprintAssignable, Category = "Splash") + FOnSplashScreenDone onDone; + +public: + UPROPERTY() + TArray m_activeScreens; + int32 m_currentItem; + UWidgetSwitcher* m_switcher; +}; diff --git a/Source/UnrealProject/GUI/Menu/SplashScreenItem.cpp b/Source/UnrealProject/GUI/Menu/SplashScreenItem.cpp new file mode 100644 index 0000000..88a1c53 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/SplashScreenItem.cpp @@ -0,0 +1,104 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "SplashScreenItem.h" +#include "MediaTexture.h" + +USplashScreenItem::USplashScreenItem(const FObjectInitializer& init) + : Super(init) +{ + duration = 2.0f; + fadeDuration = 0.5f; + m_lifetime = 0.0f; + fadeEnabled = true; +} + +void USplashScreenItem::NativeConstruct() +{ + if(duration <= 0.0f) + { + GWWARNING(L"Splash screen duration is zero! " + GetName()); + duration = 1.0f; + } + if(fadeDuration * 2.0f > duration) + { + GWWARNING(L"Splash screen fade time is greater than duration! " + GetName()); + fadeDuration = duration * 0.25f; + } + + m_started = false; + Super::NativeConstruct(); +} +void USplashScreenItem::NativeTick(const FGeometry& MyGeometry, float InDeltaTime) +{ + if(m_started) + m_lifetime += InDeltaTime; + Super::NativeTick(MyGeometry, InDeltaTime); +} + +void USplashScreenItem::OnStarted_Implementation() +{ + +} +void USplashScreenItem::OnEnd_Implementation() +{ + +} +void USplashScreenItem::Skip() +{ + if((m_lifetime + fadeDuration) < duration) + { + m_lifetime = duration - fadeDuration; + } +} + +void USplashScreenItem::Start() +{ + if(!m_started) + { + m_started = true; + m_lifetime = 0.0f; + OnStarted(); + } +} +void USplashScreenItem::End() +{ + if(m_started) + { + OnEnd(); + m_started = false; + } +} + +FVector2D USplashScreenItem::GetMediaSize(UMediaTexture* mediaTexture) const +{ + if(!mediaTexture) + return FVector2D(); + return FVector2D(mediaTexture->GetSurfaceWidth(), mediaTexture->GetSurfaceHeight()); +} + +float USplashScreenItem::GetFade() const +{ + float base = GetFadeOut(); + if(m_lifetime < fadeDuration) + { + base *= m_lifetime / fadeDuration; + } + return base; +} +float USplashScreenItem::GetFadeOut() const +{ + if((duration - m_lifetime) < fadeDuration) + { + return FMath::Min((duration - m_lifetime) / fadeDuration, 1.0f); + } + else + { + return 1.0f; + } +} + +float USplashScreenItem::GetRate() const +{ + return FMath::Clamp(m_lifetime / duration, 0.0f, 1.0f); +} diff --git a/Source/UnrealProject/GUI/Menu/SplashScreenItem.h b/Source/UnrealProject/GUI/Menu/SplashScreenItem.h new file mode 100644 index 0000000..58d1cf1 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/SplashScreenItem.h @@ -0,0 +1,52 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "MenuItemBase.h" +#include "SplashScreenItem.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API USplashScreenItem : public UMenuItemBase +{ + GENERATED_BODY() + +public: + USplashScreenItem(const FObjectInitializer& init); + + virtual void NativeConstruct() override; + virtual void NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override; + + UFUNCTION(BlueprintNativeEvent, Category = "SplashItem") + void OnStarted(); + UFUNCTION(BlueprintNativeEvent, Category = "SplashItem") + void OnEnd(); + UFUNCTION(BlueprintCallable, Category = "SplashItem") + void Skip(); + + void Start(); + void End(); + + UFUNCTION(BlueprintCallable, Category="Media") + FVector2D GetMediaSize(class UMediaTexture* mediaTexture) const; + + UFUNCTION(BlueprintCallable, Category="SplashItem") + float GetFade() const; + UFUNCTION(BlueprintCallable, Category = "SplashItem") + float GetFadeOut() const; + UFUNCTION(BlueprintCallable, Category="SplashItem") + float GetRate() const; + + UPROPERTY(BlueprintReadWrite, EditDefaultsOnly, Category = "SplashItem") + float fadeDuration; + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="SplashItem") + float duration; + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "SplashItem") + bool fadeEnabled; + +private: + bool m_started; + float m_lifetime; +}; diff --git a/Source/UnrealProject/GUI/Menu/StartPromptScreen.cpp b/Source/UnrealProject/GUI/Menu/StartPromptScreen.cpp new file mode 100644 index 0000000..1d5c3a6 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/StartPromptScreen.cpp @@ -0,0 +1,10 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "StartPromptScreen.h" + +void UStartPromptScreen::Close() +{ + onClosed.Broadcast(); + OnClose(); +} diff --git a/Source/UnrealProject/GUI/Menu/StartPromptScreen.h b/Source/UnrealProject/GUI/Menu/StartPromptScreen.h new file mode 100644 index 0000000..4d300a7 --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/StartPromptScreen.h @@ -0,0 +1,26 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GUI/Menu/MenuScreenBase.h" +#include "StartPromptScreen.generated.h" + + +/** + * + */ +UCLASS() +class UNREALPROJECT_API UStartPromptScreen : public UMenuScreenBase +{ + GENERATED_BODY() + +public: + UFUNCTION(BlueprintCallable, Category="Start Prompt") + void Close(); + + UFUNCTION(BlueprintImplementableEvent) + void OnClose(); + + DECLARE_MULTICAST_DELEGATE(FClosedEvent) + FClosedEvent onClosed; +}; diff --git a/Source/UnrealProject/GUI/Menu/SubMenu.cpp b/Source/UnrealProject/GUI/Menu/SubMenu.cpp new file mode 100644 index 0000000..5d4e2ed --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/SubMenu.cpp @@ -0,0 +1,319 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "SubMenu.h" +#include "PlayerControllerBase.h" +#include "MenuButton.h" +#include "DefaultGameInstance.h" +#include "MenuScreenBase.h" +#include "EffectFunctionLibrary.h" +#include "ScreenOverlay.h" + +USoundBase* confirmAudioClass; +USoundBase* backAudioClass; +USoundBase* selectionChangedAudioClass; +USoundBase* clickAudioClass; + +USubMenu::USubMenu(const FObjectInitializer& init) +{ + selectionChangedAudioClass = ConstructorHelpers::FObjectFinder(TEXT("/Game/Assets/GUI/Components/InterfaceSounds/Select2")).Object; + backAudioClass = ConstructorHelpers::FObjectFinder(TEXT("/Game/Assets/GUI/Components/InterfaceSounds/Select0")).Object; + confirmAudioClass = ConstructorHelpers::FObjectFinder(TEXT("/Game/Assets/GUI/Components/InterfaceSounds/Select1")).Object; + clickAudioClass = ConstructorHelpers::FObjectFinder(TEXT("/Game/Assets/Sound/T_SkillDrop")).Object; +} + +void USubMenu::NativeConstruct() +{ + m_focus = false; + m_layoutDirection = 0; + container = Cast(WidgetTree->FindWidget("SubMenuContainer")); + if(!container) + { + container = Cast(GetRootWidget()); + if(!container) + { + GERROR("No \"Container\" found in widget " + GetName() + ", root widget was not a PanelWidget"); + } + } + Super::NativeConstruct(); + + m_selectedItem = 0; + RescanItems(); +} +void USubMenu::NativeDestruct() +{ + Super::NativeDestruct(); +} + +void USubMenu::NativeTick(const FGeometry& MyGeometry, float InDeltaTime) +{ + Super::NativeTick(MyGeometry, InDeltaTime); + if(HasFocus()) + { + for(UMenuItemBase* item : m_items) + { + item->FocusTick(InDeltaTime); + } + } +} + +void USubMenu::m_ScanContainer(UWidget* widget, int32 depth /*= 0*/) +{ + // Loop through panel widgets + UPanelWidget* panel = Cast(widget); + if(panel) + { + for(int32 i = 0; i < panel->GetChildrenCount(); i++) + { + m_ScanContainer(panel->GetChildAt(i), depth+1); + } + return; + } + + // Process Menu items + UMenuItemBase* item = Cast(widget); + if(item) + { + bool hidden = item->GetVisibility() == ESlateVisibility::Hidden || item->GetVisibility() == ESlateVisibility::Collapsed; + if(!hidden) + { + m_items.Add(item); + + // Assign item to a submenu + item->m_subMenu = this; + } + return; + } + + UPanelUserWidget* puw = Cast(widget); + if(puw) + { + m_ScanContainer(puw->GetRootWidget()); + return; + } +} + +void USubMenu::RescanItems() +{ + m_items.SetNum(0); + if(container) + { + if(Cast(container)) + { + m_layoutDirection = 1; + } + else + { + m_layoutDirection = 0; + } + + // Scan for buttons + m_ScanContainer(container); + + int32 childCount = m_items.Num(); + + // Clamp selection + m_selectedItem = FMath::Clamp(m_selectedItem, 0, childCount - 1); + + // Set active selection + for(int32 i = 0; i < childCount; i++) + { + UMenuItemBase* item = m_items[i]; + item->index = i; + + if(i == m_selectedItem) + { + item->NativeOnSelectionChanged(true, true); + } + else + { + item->NativeOnSelectionChanged(false, true); + } + } + + // Reselect single items + if(childCount == 1) + { + m_items[0]->NativeOnSelectionChanged(false, true); + m_items[0]->NativeOnSelectionChanged(true, true); + } + + if(childCount > 0) + { + // Selection event + onItemSelected.Broadcast(m_items[m_selectedItem]); + } + } + else + { + GWWARNING(L"SubMenu Container not set"); + return; + } +} + +void USubMenu::CloseSubMenu() +{ + if(m_screen) + m_screen->CloseSubMenu(this); +} + +void USubMenu::OnEnter(class UMenuScreenBase* screen) +{ + check(screen); + m_screen = screen; + SetButtonHints(); + onOpened.Broadcast(); + m_SetFocus(true); +} +void USubMenu::OnLeave() +{ + onClosed.Broadcast(); + m_screen = nullptr; + m_SetFocus(false); +} + +bool USubMenu::HasFocus() const +{ + return m_focus; +} + +void USubMenu::OnSuspend(USubMenu* newSubMenu, bool loseFocus) +{ + if(loseFocus) + m_SetFocus(false); + onSuspend.Broadcast(); +} +void USubMenu::OnRestore(USubMenu* removedMenu) +{ + SetButtonHints(); + m_SetFocus(true); + onRestore.Broadcast(); +} + +class UButtonHintBar* USubMenu::GetButtonHintBar() const +{ + return GetScreen()->GetButtonHintBar(); +} + +class UCharacterSettings* USubMenu::GetCharacterSettings() const +{ + return GetGameInstance()->GetCharacterSettings(); +} +class UPrefs* USubMenu::GetPrefs() const +{ + return GetGameInstance()->GetPrefs(); +} +class UDefaultGameInstance* USubMenu::GetGameInstance() const +{ + return Cast(GetWorld()->GetGameInstance()); +} +void USubMenu::NativeOnMenuAction(EMenuActionBinding binding) +{ + if(m_items.Num() > 0) + m_items[m_selectedItem]->NativeOnMenuAction(binding); + + switch(binding) + { + case EMenuActionBinding::Down: + if(m_items.Num() > 0 && m_layoutDirection == 0) + SelectNewItemByIndex(FMath::Clamp(m_selectedItem + 1, 0, GetNumItems()-1), true); + break; + case EMenuActionBinding::Up: + if(m_items.Num() > 0 && m_layoutDirection == 0) + SelectNewItemByIndex(FMath::Clamp(m_selectedItem - 1, 0, GetNumItems()-1), true); + break; + case EMenuActionBinding::Left: + if(m_items.Num() > 0 && m_layoutDirection == 1) + SelectNewItemByIndex(FMath::Clamp(m_selectedItem - 1, 0, GetNumItems() - 1), true); + break; + case EMenuActionBinding::Right: + if(m_items.Num() > 0 && m_layoutDirection == 1) + SelectNewItemByIndex(FMath::Clamp(m_selectedItem + 1, 0, GetNumItems() - 1), true); + break; + case EMenuActionBinding::Confirm: + break; + case EMenuActionBinding::Back: + onBack.Broadcast(); + UEffectFunctionLibrary::PlaySoundEffect2D(GetWorld(), backAudioClass); + break; + } + + Super::NativeOnMenuAction(binding); +} + +void USubMenu::NativeOnSelectionConfirmed(UMenuItemBase* item) +{ + UEffectFunctionLibrary::PlaySoundEffect2D(GetWorld(), clickAudioClass); + onItemSelectionConfirmed.Broadcast(m_items[m_selectedItem]); +} + +UMenuItemBase* USubMenu::GetItem(int32 index) const +{ + if(index >= m_items.Num() || index < 0) + { + GWWARNING(L"Item index out of range"); + return nullptr; + } + return m_items[index]; +} +int32 USubMenu::GetNumItems() const +{ + return m_items.Num(); +} +int32 USubMenu::GetSelectedItem() const +{ + return m_selectedItem; +} +void USubMenu::SelectNewItemByIndex(int32 idx) +{ + SelectNewItemByIndex(idx, false); +} +void USubMenu::SelectNewItemByIndex(int32 idx, bool controller) +{ + if(idx >= m_items.Num() || idx < 0) + { + GWWARNING(L"Item index out of range"); + return; + } + if(m_selectedItem != idx) + { + check(m_selectedItem < m_items.Num()); + m_items[m_selectedItem]->NativeOnSelectionChanged(false, controller); + m_items[idx]->NativeOnSelectionChanged(true, controller); + m_selectedItem = idx; + onItemSelected.Broadcast(m_items[m_selectedItem]); + SetButtonHints(); + UEffectFunctionLibrary::PlaySoundEffect2D(GetWorld(), selectionChangedAudioClass); + } +} +void USubMenu::SelectNewItem(UMenuItemBase* item) +{ + int32 idx = 0; + if (m_items.Find(item, idx)) + { + SelectNewItemByIndex(idx); + } +} +int32 USubMenu::GetItemIndex(UMenuItemBase* item) +{ + int32 idx = 0; + if (m_items.Find(item, idx)) + return idx; + return -1; +} +UMenuScreenBase* USubMenu::GetScreen() const +{ + return m_screen; +} + +void USubMenu::m_SetFocus(bool focus) +{ + m_focus = focus; + + // Get Selected button + UMenuItemBase* item = GetItem(GetSelectedItem()); + if (item) + { + item->NativeOnSelectionChanged(true, false); + } +} diff --git a/Source/UnrealProject/GUI/Menu/SubMenu.h b/Source/UnrealProject/GUI/Menu/SubMenu.h new file mode 100644 index 0000000..b80c82e --- /dev/null +++ b/Source/UnrealProject/GUI/Menu/SubMenu.h @@ -0,0 +1,127 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GUI/Menu/MenuItemBase.h" +#include "SubMenu.generated.h" + +DECLARE_DYNAMIC_MULTICAST_DELEGATE(FMenuChange); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSubMenuItemSelected, UMenuItemBase*, item); + +UCLASS() +class UNREALPROJECT_API UPanelUserWidget : public UUserWidget +{ + GENERATED_BODY() +public: +}; + +UCLASS() +class UNREALPROJECT_API USubMenu : public UMenuItemBase +{ + GENERATED_BODY() +public: + USubMenu(const FObjectInitializer& init); + virtual void NativeConstruct() override; + virtual void NativeDestruct() override; + virtual void NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override; + + UFUNCTION(BlueprintCallable, Category = "SubMenu") + virtual void RescanItems(); + + UFUNCTION(BlueprintCallable, Category = "SubMenu") + void CloseSubMenu(); + + virtual void OnEnter(class UMenuScreenBase* screen); + virtual void OnLeave(); + + UFUNCTION(BlueprintCallable, Category = "SubMenu") + bool HasFocus() const; + + virtual void OnSuspend(USubMenu* newSubMenu, bool loseFocus); + virtual void OnRestore(USubMenu* removedMenu); + + // Callback that gets called whenever the button hits should update when showing this menu + UFUNCTION(BlueprintImplementableEvent, Category = "SubMenu") + void SetButtonHints(); + + UFUNCTION(BlueprintCallable, Category = "SubMenu") + class UButtonHintBar* GetButtonHintBar() const; + + UFUNCTION(BlueprintCallable, Category = "SubMenu") + class UCharacterSettings* GetCharacterSettings() const; + UFUNCTION(BlueprintCallable, Category = "SubMenu") + class UPrefs* GetPrefs() const; + UFUNCTION(BlueprintCallable, Category = "SubMenu") + class UDefaultGameInstance* GetGameInstance() const; + + virtual void NativeOnMenuAction(EMenuActionBinding binding) override; + virtual void NativeOnSelectionConfirmed(UMenuItemBase* item); + + UFUNCTION(BlueprintCallable, Category="SubMenu") + UMenuItemBase* GetItem(int32 itemIndex) const; + UFUNCTION(BlueprintCallable, Category = "SubMenu") + int32 GetNumItems() const; + UFUNCTION(BlueprintCallable, Category = "SubMenu") + int32 GetSelectedItem() const; + + UFUNCTION(BlueprintCallable, Category = "SubMenu") + void SelectNewItemByIndex(int32 idx); + UFUNCTION(BlueprintCallable, Category = "SubMenu") + void SelectNewItem(UMenuItemBase* item); + void SelectNewItemByIndex(int32 idx, bool controller); + + UFUNCTION(BlueprintCallable, Category = "SubMenu") + int32 GetItemIndex(UMenuItemBase* item); + + UFUNCTION(BlueprintCallable, Category = "SubMenu") + UMenuScreenBase* GetScreen() const; + + // Called when an item is selected + UPROPERTY(BlueprintAssignable, Category="SubMenu") + FSubMenuItemSelected onItemSelected; + // Called when a button is pressed + UPROPERTY(BlueprintAssignable, Category="SubMenu") + FSubMenuItemSelected onItemSelectionConfirmed; + + // Called when the back button is pressed + UPROPERTY(BlueprintAssignable, Category = "SubMenu") + FMenuChange onBack; + + UPROPERTY(BlueprintAssignable, Category = "SubMenu") + FMenuChange onClosed; + UPROPERTY(BlueprintAssignable, Category = "SubMenu") + FMenuChange onOpened; + + // Called when another menu is opened on top of this menu + UPROPERTY(BlueprintAssignable, Category = "SubMenu") + FMenuChange onSuspend; + // Called when this menu is displayed again after a menu was closed on top of this + UPROPERTY(BlueprintAssignable, Category = "SubMenu") + FMenuChange onRestore; + + // The panel widget that contains all the buttons selectable in this menu + UPROPERTY(BlueprintReadWrite, Category="SubMenu") + UPanelWidget* container; + +protected: + void m_ScanContainer(UWidget* widget, int32 depth = 0); + // Set the allowance of mouse focus & presses of the buttons in this menu + void m_SetFocus(bool focus); + + // The list of selectable items in the menu + UPROPERTY() + TArray m_items; + +private: + friend class UMenuItemBase; + int32 m_selectedItem; + + // Horizontal or vertical input handling + int m_layoutDirection; + + UPROPERTY() + class UMenuScreenBase* m_screen; + + // True if this is the topmost screen and if the buttons in this screen are allowed to be pressed. + bool m_focus; +}; diff --git a/Source/UnrealProject/GUI/Minimap/MiniMap.cpp b/Source/UnrealProject/GUI/Minimap/MiniMap.cpp new file mode 100644 index 0000000..ee7864c --- /dev/null +++ b/Source/UnrealProject/GUI/Minimap/MiniMap.cpp @@ -0,0 +1,20 @@ +#include "UnrealProject.h" +#include "MiniMap.h" + + +namespace MiniMap +{ + void NodeBase::CircleOverlap(const FVector2D& position, float radius_sqr, TArray& out_objects) + { + if (objects.empty()) + return; + + for (auto iter = objects.begin(); iter != objects.end(); iter++) + { + MinimapHandle& obj = **iter; + if (FVector2D::DistSquared(obj.position, position) <= radius_sqr) + out_objects.Add(&obj); + } + } +} + diff --git a/Source/UnrealProject/GUI/Minimap/MiniMap.h b/Source/UnrealProject/GUI/Minimap/MiniMap.h new file mode 100644 index 0000000..cd2048f --- /dev/null +++ b/Source/UnrealProject/GUI/Minimap/MiniMap.h @@ -0,0 +1,325 @@ +#pragma once + +#include "UnrealProject.h" +#include +using namespace std; + + +class ACharacterBase; +namespace MiniMap +{ + struct Rect + { + Rect() = default; + Rect(float x, float y, float width, float height) : x(x), y(y), width(width), height(height) {} + Rect(const FVector2D& position, const FVector2D& size) : x(position.X), y(position.Y), width(size.X), height(size.Y) {} + float x; + float y; + float width; + float height; + + inline FVector2D position() const + { + return FVector2D(x, y); + } + inline FVector2D size() const + { + return FVector2D(width, height); + } + inline bool contains(const FVector2D& pos) const + { + return pos.X >= x && pos.X <= (x + width) && pos.Y >= y && pos.Y <= (y + height); + } + }; + + + inline Rect GetSubArea(const Rect& area, size_t idx) + { + const FVector2D half_size = area.size() / 2; + const FVector2D position = area.position(); + switch (idx) + { + case 0: return Rect(position, half_size); + case 1: return Rect(position + FVector2D(half_size.X, 0), half_size); + case 2: return Rect(position + half_size, half_size); + case 3: return Rect(position + FVector2D(0, half_size.Y), half_size); + } + return area; + } + inline bool RectCircleOverlapSquared(const Rect& area, const FVector2D& position, float radius_sqr) + { + const FVector2D pos = area.position(); + const float left = area.x; + const float bottom = area.y; + const float right = area.x + area.width; + const float top = area.y + area.height; + + const float x = position.X > right ? right : position.X < left ? left : position.X; + const float y = position.Y > top ? top : position.Y < bottom ? bottom : position.Y; + + return FVector2D::DistSquared(position, FVector2D(x, y)) <= radius_sqr; + } + + class NonCopyable + { + public: + NonCopyable() = default; + NonCopyable(const NonCopyable& other) = delete; + NonCopyable& operator=(const NonCopyable& other) = delete; + }; + + class MinimapHandle; + class NodeBase : private NonCopyable + { + protected: + NodeBase(const Rect& area, NodeBase* parent) : area(area), parent(parent) {} + + public: + virtual void AddObject(MinimapHandle& obj) = 0; + virtual void RemoveObject(MinimapHandle& obj) = 0; + virtual void ClearRecursive() + { + objects.clear(); + } + virtual void ResizeRecursive(const Rect& area) + { + this->area = area; + } + + virtual void CircleOverlap(const FVector2D& position, float radius_sqr, TArray& out_objects); + + unordered_set objects; + Rect area; + NodeBase* parent; + }; + + class MinimapHandle : private NonCopyable + { + public: + MinimapHandle() : character(nullptr), node(nullptr), root(nullptr) {} + MinimapHandle(const FVector2D& position) : character(nullptr), position(position), node(nullptr), root(nullptr) {} + ~MinimapHandle() + { + + } + + FVector2D position; + class ::ACharacterBase* character; + NodeBase* node; + NodeBase* root; + }; + + template class TreeNode : public NodeBase + { + public: + TreeNode(const Rect& area, NodeBase* parent) : NodeBase(area, parent), child0(GetSubArea(area, 0), this), child1(GetSubArea(area, 1), this), child2(GetSubArea(area, 2), this), child3(GetSubArea(area, 3), this) {} + + typedef TreeNode child_type; + child_type child0; + child_type child1; + child_type child2; + child_type child3; + unordered_set child_objects; + + virtual void AddObject(MinimapHandle& obj) override + { + child_type* children = &child0; + for (size_t i = 0; i < 4; i++) + { + if (children[i].area.contains(obj.position)) + { + // Register to child + child_objects.emplace(&obj); + children[i].AddObject(obj); + return; + } + } + + // Register to this node + objects.emplace(&obj); + obj.node = this; + } + virtual void RemoveObject(MinimapHandle& obj) override + { + // Check if present in children + auto find_child = child_objects.find(&obj); + if (find_child != child_objects.end()) + { + child_type* children = &child0; + for (size_t i = 0; i < 4; i++) + children[i].RemoveObject(obj); + + child_objects.erase(find_child); + } + else + { + // Remove from node + auto find = objects.find(&obj); + if (find != objects.end()) + objects.erase(find); + } + } + virtual void ClearRecursive() override + { + child_type* children = &child0; + for (size_t i = 0; i < 4; i++) + children[i].ClearRecursive(); + + NodeBase::ClearRecursive(); + child_objects.clear(); + } + virtual void ResizeRecursive(const Rect& area) override + { + child_type* children = &child0; + for (size_t i = 0; i < 4; i++) + children[i].ResizeRecursive(GetSubArea(area, i)); + + NodeBase::ResizeRecursive(area); + } + + virtual void CircleOverlap(const FVector2D& position, float radius_sqr, TArray& out_objects) override + { + if (!child_objects.empty()) + { + child_type* children = &child0; + for (size_t i = 0; i < 4; i++) + { + child_type& child = children[i]; + if (RectCircleOverlapSquared(child.area, position, radius_sqr)) + child.CircleOverlap(position, radius_sqr, out_objects); + } + } + + NodeBase::CircleOverlap(position, radius_sqr, out_objects); + } + }; + template class RootNode : public TreeNode + { + public: + RootNode(const Rect& area, NodeBase* parent) : TreeNode(area, parent) + { + + } + + virtual void AddObject(MinimapHandle& obj) override + { + TreeNode::AddObject(obj); + all_objects.emplace(&obj); + } + virtual void RemoveObject(MinimapHandle& obj) override + { + TreeNode::RemoveObject(obj); + auto find = all_objects.find(&obj); + if (find != all_objects.end()) + all_objects.erase(find); + } + virtual void ClearRecursive() override + { + for (auto iter = all_objects.begin(); iter != all_objects.end(); iter++) + { + (*iter)->node = nullptr; + (*iter)->root = nullptr; + } + all_objects.clear(); + + TreeNode::ClearRecursive(); + } + + void Reparent(MinimapHandle& obj) + { + TreeNode::RemoveObject(obj); + TreeNode::AddObject(obj); + } + + unordered_set all_objects; + }; + template<> class TreeNode<0> : public NodeBase + { + public: + TreeNode(const Rect& area, NodeBase* parent) : NodeBase(area, parent) + { + + } + + void AddObject(MinimapHandle& obj) override + { + objects.emplace(&obj); + obj.node = this; + } + void RemoveObject(MinimapHandle& obj) override + { + auto find = objects.find(&obj); + if (find != objects.end()) + objects.erase(find); + } + }; + + template class QuadTree : private NonCopyable + { + public: + QuadTree() : m_root_node(Rect(0, 0, 1, 1), nullptr) {} + QuadTree(const Rect& area) : m_root_node(area, nullptr) {} + ~QuadTree() + { + m_root_node.ClearRecursive(); + } + + void AddObject(MinimapHandle& obj) + { + if (obj.root == &m_root_node) + return; + if (obj.root != nullptr) + obj.root->RemoveObject(obj); + + // Add object to root + m_root_node.AddObject(obj); + obj.root = &m_root_node; + } + void RemoveObject(MinimapHandle& obj) + { + if (obj.root == nullptr) + return; + if (obj.root != &m_root_node) + return; + + // Remove from root + m_root_node.RemoveObject(obj); + obj.node = nullptr; + obj.root = nullptr; + } + + void Update() + { + // Update positioning + for (auto iter = m_root_node.all_objects.begin(); iter != m_root_node.all_objects.end(); iter++) + { + MinimapHandle& obj = **iter; + + if (!obj.node->area.contains(obj.position) && obj.node->parent) + m_root_node.Reparent(obj); + } + } + void Clear() + { + m_root_node->ClearRecursive(); + } + void Resize(const Rect& area) + { + m_root_node.ResizeRecursive(area); + } + + int32 Num() const + { + return int32(m_root_node.all_objects.size()); + } + + bool CircleOverlap(const FVector2D& position, float radius, TArray& out_objects) + { + out_objects.SetNum(0); + m_root_node.CircleOverlap(position, radius * radius, out_objects); + return out_objects.Num() > 0; + } + + RootNode m_root_node; + }; +} \ No newline at end of file diff --git a/Source/UnrealProject/GUI/Minimap/MiniMapIconWidget.cpp b/Source/UnrealProject/GUI/Minimap/MiniMapIconWidget.cpp new file mode 100644 index 0000000..adb560f --- /dev/null +++ b/Source/UnrealProject/GUI/Minimap/MiniMapIconWidget.cpp @@ -0,0 +1,10 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "MiniMapIconWidget.h" + + +void UMiniMapIconWidget::SetObjectIcon_Implementation(UTexture2D* texture) +{ + // No implementation +} \ No newline at end of file diff --git a/Source/UnrealProject/GUI/Minimap/MiniMapIconWidget.h b/Source/UnrealProject/GUI/Minimap/MiniMapIconWidget.h new file mode 100644 index 0000000..0edb9b7 --- /dev/null +++ b/Source/UnrealProject/GUI/Minimap/MiniMapIconWidget.h @@ -0,0 +1,22 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Blueprint/UserWidget.h" +#include "MiniMapIconWidget.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API UMiniMapIconWidget : public UUserWidget +{ + GENERATED_BODY() + +public: + UPROPERTY(BlueprintReadWrite, Category = "Image") + UImage* image; + + UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "MiniMap") + void SetObjectIcon(class UTexture2D* texture); +}; diff --git a/Source/UnrealProject/GUI/Minimap/MiniMapVisionCircle.cpp b/Source/UnrealProject/GUI/Minimap/MiniMapVisionCircle.cpp new file mode 100644 index 0000000..5447d6c --- /dev/null +++ b/Source/UnrealProject/GUI/Minimap/MiniMapVisionCircle.cpp @@ -0,0 +1,15 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "MiniMapVisionCircle.h" + + +UMiniMapVisionCircle::UMiniMapVisionCircle(const FObjectInitializer& init) : Super(init) +{ + +} + +void UMiniMapVisionCircle::NativeConstruct() +{ + Super::NativeConstruct(); +} \ No newline at end of file diff --git a/Source/UnrealProject/GUI/Minimap/MiniMapVisionCircle.h b/Source/UnrealProject/GUI/Minimap/MiniMapVisionCircle.h new file mode 100644 index 0000000..a2aca79 --- /dev/null +++ b/Source/UnrealProject/GUI/Minimap/MiniMapVisionCircle.h @@ -0,0 +1,26 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Blueprint/UserWidget.h" +#include "MiniMapVisionCircle.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API UMiniMapVisionCircle : public UUserWidget +{ + GENERATED_BODY() + +public: + UMiniMapVisionCircle(const FObjectInitializer& init); + + virtual void NativeConstruct() override; + + UFUNCTION(BlueprintImplementableEvent, Category = "Vision") + void SetTexture(UTexture2D* texture); + + UFUNCTION(BlueprintImplementableEvent, Category = "Vision") + void SetUV(const FVector2D& uv, const FVector2D& scale); +}; diff --git a/Source/UnrealProject/GUI/Minimap/MiniMapWidget.cpp b/Source/UnrealProject/GUI/Minimap/MiniMapWidget.cpp new file mode 100644 index 0000000..e05e005 --- /dev/null +++ b/Source/UnrealProject/GUI/Minimap/MiniMapWidget.cpp @@ -0,0 +1,393 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "MiniMapVolume.h" +#include "MiniMapIconWidget.h" +#include "MiniMapVisionCircle.h" +#include "NetworkPlayer.h" +#include "BossBase.h" +#include "NPCBase.h" +#include "KOTHBossSpawner.h" +#include "KOTHMinionSpawner.h" +#include "NetworkCharacter.h" +#include "DefaultGameState.h" +#include "DefaultPlayerState.h" +#include "DefaultPlayerController.h" +#include "MiniMapWidget.h" +#include "WidgetLayoutLibrary.h" + +#if PLATFORM_SPECIFIC_WIN == 0 +#include "HeatMapMetrics.h" +#endif + + +float AngleTowards(const FVector2D& from, const FVector2D& to) +{ + const float angle_rad = FMath::Atan2(from.X - to.X, to.Y - from.Y) + PI; + return FMath::RadiansToDegrees(angle_rad); +} + +UMiniMapWidget::UMiniMapWidget(const FObjectInitializer& init) : Super(init) +{ + viewRadius = 2000; +} + +void UMiniMapWidget::NativeConstruct() +{ + Super::NativeConstruct(); + + // Find the minimap volume + ADefaultGameState* const gameState = Cast(GetWorld()->GetGameState()); + if(IsValid(gameState)) + { + for (TActorIterator iter(GetWorld()); iter; ++iter) + { + AMiniMapVolume* const volume = *iter; + volume->SetActorRotation(FRotator(0, 0, 0)); + + const FVector pos = volume->GetActorLocation(); + const FVector area = volume->area->GetScaledBoxExtent(); + m_size = FMath::Max(area.X, area.Y); + m_min.X = -m_size + pos.X; + m_min.Y = -m_size + pos.Y; + m_max.X = m_size + pos.X; + m_max.Y = m_size + pos.Y; + m_size *= 2; + + m_viewRadius = (viewRadius / (area.X * 2)); + + gameState->minimapQuadtree.Resize(MiniMap::Rect(FVector2D(m_min), FVector2D(m_size, m_size))); + + return; + } + } + + JERROR("Failed to locate Mini Map volume"); +} + +void UMiniMapWidget::NativeTick(const FGeometry& geometry, float deltaTime) +{ + Super::NativeTick(geometry, deltaTime); + + m_arrowAnim = FMath::Fmod(m_arrowAnim + deltaTime, 1.0f); + + // Reset the state of all current widgets + { + // Set widgets hidden + for (int32 i = 0; i < m_miniMapIconWidgetPool.Num(); i++) + { + m_miniMapIconWidgetPool[i]->SetVisibility(ESlateVisibility::Hidden); + // Reset rotations + FWidgetTransform trans = m_miniMapIconWidgetPool[i]->image->RenderTransform; + trans.Angle = 0; + m_miniMapIconWidgetPool[i]->image->SetRenderTransform(trans); + } + + // Set existing arrows hidden + for (int32 i = 0; i < m_arrowMapIconWidgetPool.Num(); i++) + m_arrowMapIconWidgetPool[i]->SetVisibility(ESlateVisibility::Hidden); + + // Allocate the neccesairy vision circles + for (int32 i = 0; i < m_viewCircleWidgetPool.Num(); i++) + m_viewCircleWidgetPool[i]->SetVisibility(ESlateVisibility::Hidden); + } + + // Begin the rendering + UWorld* const world = GetWorld(); + if (!IsValid(world)) return; + ADefaultGameState* const gameState = Cast(world->GetGameState()); + if (!IsValid(gameState)) + return; + + // Get the local team + m_localTeam = -1; + AController* controller = world->GetGameInstance()->GetFirstLocalPlayerController(); + ACharacterBase* localPlayer = nullptr; + if (IsValid(controller)) + { + ADefaultPlayerController* const playerController = Cast(controller); + localPlayer = Cast(playerController->GetPawn()); + if (playerController->PlayerState) + m_localTeam = Cast(playerController->PlayerState)->GetTeam(); + } + + // Failed to fetch local team + if (m_localTeam == -1) + return; + + gameState->minimapQuadtree.Update(); + + map> drawActors; + unordered_set& friendlyPlayerSet = drawActors.emplace(m_localTeam, unordered_set()).first->second; + + // Fetch the friendly viewpoints + for (TActorIterator iter(world); iter; ++iter) + { + ACharacterBase* const character = *iter; + if (IsValid(character)) + { + if (character->GetTeam() == m_localTeam) + friendlyPlayerSet.emplace(character); + } + } + + // Fetch all the visible units around the friendly viewpoints + for (auto iter = friendlyPlayerSet.begin(); iter != friendlyPlayerSet.end(); iter++) + { + ACharacterBase* const character = (*iter); + FVector2D position = FVector2D(character->GetActorLocation().X, character->GetActorLocation().Y); + if (gameState->minimapQuadtree.CircleOverlap(position, character->visionRadius, m_handleBuffer)) + { + for (int32 i = 0; i < m_handleBuffer.Num(); i++) + { + ACharacterBase* const visibleCharacter = m_handleBuffer[i]->character; + if(IsValid(visibleCharacter)) + drawActors[visibleCharacter->GetTeam()].emplace(visibleCharacter); + } + } + } + + // Fetch the minion camps + TArray minionCamps; + AKOTHBossSpawner* bossCamp = nullptr; + FVector2D bossCampPos; + for (TActorIterator iter(world); iter; ++iter) + { + AKOTHSpawnerBase* camp = *iter; + if (camp->IsA()) + { + bossCamp = Cast(camp); + const FVector2D charPos = FVector2D(camp->GetActorLocation().X, camp->GetActorLocation().Y); + bossCampPos = ConvertWorldToMinimap(charPos); + } + minionCamps.Add(camp); + } + + // Draw the minion camps + m_widgetIndex = 0; + m_arrowIndex = 0; + m_circleIndex = 0; + for (int32 i = 0; i < minionCamps.Num(); i++) + { + UMiniMapIconWidget* const widget = m_AllocateWidget(); + UCanvasPanelSlot* const slot = Cast(widget->Slot); + widget->SetVisibility(ESlateVisibility::Visible); + + AKOTHSpawnerBase* const camp = minionCamps[i]; + const FVector2D charPos = FVector2D(camp->GetActorLocation().X, camp->GetActorLocation().Y); + FVector2D relativePos = ConvertWorldToMinimap(charPos); + + // Set sprite position + FVector2D spriteSize = geometry.GetLocalSize() * 0.07f; + + slot->SetPosition(geometry.GetLocalSize() * relativePos - spriteSize * 0.5f); + slot->SetSize(spriteSize); + SetObjectIcon(campIcon, widget); + + FLinearColor color = enemyColor; + if (camp->team >= NPCTeam::Team1) // NPC Controlled + color = playerColor; + else if (int32(camp->team) == int32(m_localTeam)) // Friendly + color = allyColor; + else if (int32(camp->team) == 0) // Contested + color = neutralColor; + widget->image->Brush.TintColor = color; + + // Draw arrows + if (bossCamp && int32(camp->team) > 0 && camp->team < NPCTeam::Team1 && camp != bossCamp) + { + const int32 arrowCount = int32(FVector2D::Distance(relativePos, bossCampPos) * 25); + if (arrowCount > 0) + { + const float step = 1.0f / float(arrowCount); + for (int32 i = 0; i < arrowCount; i++) + { + UMiniMapIconWidget* arrow = m_AllocateArrow(); + arrow->SetVisibility(ESlateVisibility::Visible); + UCanvasPanelSlot* const slot = Cast(arrow->Slot); + + // Lerp towards the target + color.A = arrowCount > 1 ? (i == 0 ? m_arrowAnim : i == arrowCount - 1 ? (1.f - m_arrowAnim) : 1) : 1; + const FVector2D setPos = FMath::Lerp(relativePos, bossCampPos, step * float(i) + step * m_arrowAnim); + FWidgetTransform trans = arrow->image->RenderTransform; + trans.Angle = AngleTowards(setPos, bossCampPos); + arrow->image->SetRenderTransform(trans); + arrow->image->Brush.TintColor = color; + + const FVector2D spriteSize = geometry.GetLocalSize() * 0.04f; + slot->SetSize(spriteSize); + slot->SetPosition(geometry.GetLocalSize() * setPos - spriteSize * 0.5f); + } + } + } + } + + // Generate draw order (Draw local team last) + TArray teamDrawOrder; + for (auto iter = drawActors.rbegin(); iter != drawActors.rend(); iter++) + { + if (iter->first == m_localTeam) + continue; + teamDrawOrder.Add(iter->first); + } + teamDrawOrder.Add(m_localTeam); + + // Draw the actual characters to the minimap + int32 circleIndex = 0; + for (size_t i = 0; i < teamDrawOrder.Num(); i++) + { + const int32 team = teamDrawOrder[i]; + auto& set = drawActors[team]; + for (auto charIter = set.begin(); charIter != set.end(); charIter++) + { + ACharacterBase* const character = *charIter; + if (character == localPlayer) + continue; + + UMiniMapIconWidget* const widget = m_AllocateWidget(); + m_DrawCreature(geometry, widget, character); + } + } + + // Draw the local player last + if (localPlayer) + m_DrawCreature(geometry, m_AllocateWidget(), localPlayer); +} + +void UMiniMapWidget::m_DrawCreature(const FGeometry& geometry, UMiniMapIconWidget* widget, class ACharacterBase* character) +{ + widget->SetVisibility(ESlateVisibility::Visible); + UCanvasPanelSlot* const slot = Cast(widget->Slot); + + const int32 actorTeam = character->GetTeam(); + const FVector2D charPos = FVector2D(character->GetActorLocation().X, character->GetActorLocation().Y); + FVector2D relativePos = ConvertWorldToMinimap(charPos); + + // Rotation + const float drawPlayerAngle = character->GetActorRotation().Yaw; + + // Set sprite position + FVector2D spriteSize = geometry.GetLocalSize() * 0.07f; + + slot->SetPosition(geometry.GetLocalSize() * relativePos - spriteSize * 0.5f); + slot->SetSize(spriteSize); + + FWidgetTransform trans = widget->image->RenderTransform; + trans.Angle = 0; + + // Set icon based on the object type + if (character->IsA()) + SetObjectIcon(bossIcon, widget); + else if (character->IsA()) + SetObjectIcon(creatureIcon, widget); + else + { + trans.Angle = drawPlayerAngle; + SetObjectIcon(playerIcon, widget); + } + widget->image->SetRenderTransform(trans); + + // Set the color + if (!(character->IsA() && character->IsLocallyControlled())) + { + if (actorTeam != m_localTeam) + { + // Neutral or enemy? + if (actorTeam == 0) + widget->image->Brush.TintColor = neutralColor; + else + widget->image->Brush.TintColor = enemyColor; + } + else + widget->image->Brush.TintColor = allyColor; + } + else + widget->image->Brush.TintColor = playerColor; + + // Update the view circle + if (actorTeam == m_localTeam) + { + UMiniMapVisionCircle* const circle = m_AllocateVisionCircle(); + circle->SetVisibility(ESlateVisibility::Visible); + + UCanvasPanelSlot* const circleSlot = Cast(circle->Slot); + if (IsValid(circleSlot)) + { + const float diameter = (character->visionRadius * 2) / m_size; + FVector2D size = geometry.GetLocalSize() * diameter; + size = FVector2D(FMath::RoundToFloat(size.X), FMath::RoundToFloat(size.Y)); + FVector2D pos = geometry.GetLocalSize() * relativePos - size * 0.5f; + pos = FVector2D(FMath::RoundToFloat(pos.X), FMath::RoundToFloat(pos.Y)); + + circleSlot->SetPosition(pos); + circleSlot->SetSize(size); + circle->SetUV(pos / geometry.GetLocalSize(), size / geometry.GetLocalSize()); + } + } +} +UMiniMapIconWidget* UMiniMapWidget::m_AllocateWidget() +{ + UMiniMapIconWidget* widget = nullptr; + if (m_widgetIndex >= m_miniMapIconWidgetPool.Num()) + { + widget = CreateWidget(GetWorld(), iconWidget); + iconLayer->AddChild(widget); + m_miniMapIconWidgetPool.Add(widget); + } + else + widget = m_miniMapIconWidgetPool[m_widgetIndex]; + + m_widgetIndex++; + return widget; +} +UMiniMapIconWidget* UMiniMapWidget::m_AllocateArrow() +{ + UMiniMapIconWidget* arrow = nullptr; + if (m_arrowIndex >= m_arrowMapIconWidgetPool.Num()) + { + arrow = CreateWidget(GetWorld(), iconWidget); + arrowLayer->AddChild(arrow); + m_arrowMapIconWidgetPool.Add(arrow); + SetObjectIcon(arrowIcon, arrow); + } + else + arrow = m_arrowMapIconWidgetPool[m_arrowIndex]; + + m_arrowIndex++; + return arrow; +} +UMiniMapVisionCircle* UMiniMapWidget::m_AllocateVisionCircle() +{ + UMiniMapVisionCircle* circle = nullptr; + if (m_circleIndex >= m_viewCircleWidgetPool.Num()) + { + circle = CreateWidget(GetWorld(), visionCircleWidget); + visionLayer->AddChild(circle); + m_viewCircleWidgetPool.Add(circle); + circle->SetTexture(backgroundTexture); + } + else + circle = m_viewCircleWidgetPool[m_circleIndex]; + + m_circleIndex++; + return circle; +} + +FVector2D UMiniMapWidget::ConvertWorldToMinimap(const FVector2D& pos) +{ + const FVector2D scale = FVector2D(m_max.X - m_min.X, m_max.Y - m_min.Y); + FVector2D relativePos = (pos - m_min) / scale; + FVector2D returnPos = FVector2D(relativePos.Y, relativePos.X); + returnPos.Y = 1.0f - returnPos.Y; + return returnPos; +} + +void UMiniMapWidget::SetObjectIcon_Implementation(UTexture2D* texture, UMiniMapIconWidget* widget) +{ + // No implementation +} + +void UMiniMapWidget::SetMinimapInfo_Implementation(FVector2D player0, FVector2D player1, float radius) +{ + // No implementation +} \ No newline at end of file diff --git a/Source/UnrealProject/GUI/Minimap/MiniMapWidget.h b/Source/UnrealProject/GUI/Minimap/MiniMapWidget.h new file mode 100644 index 0000000..b172e6e --- /dev/null +++ b/Source/UnrealProject/GUI/Minimap/MiniMapWidget.h @@ -0,0 +1,89 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Blueprint/UserWidget.h" +#include +#include "Minimap.h" +#include "MiniMapWidget.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API UMiniMapWidget : public UUserWidget +{ + GENERATED_BODY() + +public: + UMiniMapWidget(const FObjectInitializer& init); + + UFUNCTION(BlueprintNativeEvent, Category = "MiniMap") + void SetObjectIcon(class UTexture2D* texture, class UMiniMapIconWidget* widget); + + virtual void NativeConstruct() override; + virtual void NativeTick(const FGeometry& geometry, float deltaTime) override; + + UPROPERTY(EditAnywhere, Category = "MiniMap") + float viewRadius; + + UPROPERTY(EditAnywhere, Category = "Minimap") + FLinearColor playerColor; + UPROPERTY(EditAnywhere, Category = "Minimap") + FLinearColor allyColor; + UPROPERTY(EditAnywhere, Category = "Minimap") + FLinearColor enemyColor; + UPROPERTY(EditAnywhere, Category = "Minimap") + FLinearColor neutralColor; + + UPROPERTY(EditAnywhere, Category = "MiniMap") + UTexture2D* playerIcon; + UPROPERTY(EditAnywhere, Category = "MiniMap") + UTexture2D* creatureIcon; + UPROPERTY(EditAnywhere, Category = "MiniMap") + UTexture2D* bossIcon; + UPROPERTY(EditAnywhere, Category = "MiniMap") + UTexture2D* campIcon; + UPROPERTY(EditAnywhere, Category = "MiniMap") + UTexture2D* arrowIcon; + + UFUNCTION(BlueprintNativeEvent, Category = "MiniMap") + void SetMinimapInfo(FVector2D player0, FVector2D player1, float radius); + + FVector2D ConvertWorldToMinimap(const FVector2D& pos); + + UPROPERTY(EditAnywhere, Category = "MiniMap") + TSubclassOf iconWidget; + UPROPERTY(EditAnywhere, Category = "MiniMap") + TSubclassOf visionCircleWidget; + UPROPERTY(BlueprintReadWrite, Category = "MiniMap") + UCanvasPanel* iconLayer; + UPROPERTY(BlueprintReadWrite, Category = "MiniMap") + UCanvasPanel* arrowLayer; + UPROPERTY(BlueprintReadWrite, Category = "MiniMap") + UTexture2D* backgroundTexture; + UPROPERTY(BlueprintReadWrite, Category = "MiniMap") + UCanvasPanel* visionLayer; + +private: + void m_DrawCreature(const FGeometry& geometry, UMiniMapIconWidget* widget, class ACharacterBase* character); + UMiniMapIconWidget* m_AllocateWidget(); + UMiniMapIconWidget* m_AllocateArrow(); + UMiniMapVisionCircle* m_AllocateVisionCircle(); + + TArray m_miniMapIconWidgetPool; + TArray m_arrowMapIconWidgetPool; + TArray m_viewCircleWidgetPool; + TArray m_handleBuffer; + + FVector2D m_min; + FVector2D m_max; + float m_size; + float m_viewRadius; + float m_arrowAnim; + int32 m_localTeam; + + int32 m_widgetIndex; + int32 m_arrowIndex; + int32 m_circleIndex; +}; \ No newline at end of file diff --git a/Source/UnrealProject/GUI/PlayerSlot.cpp b/Source/UnrealProject/GUI/PlayerSlot.cpp new file mode 100644 index 0000000..e5a733d --- /dev/null +++ b/Source/UnrealProject/GUI/PlayerSlot.cpp @@ -0,0 +1,58 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "PlayerSlot.h" +#include "DefaultGameInstance.h" +#include "PlayerStateBase.h" + +UPlayerSlot::UPlayerSlot(const FObjectInitializer& init) + : Super(init) +{ +} +void UPlayerSlot::NativeConstruct() +{ + Super::NativeConstruct(); + currentPlayerState = nullptr; + isLocal = false; + OnChanged(); +} +void UPlayerSlot::Init(APlayerStateBase* playerState, bool isLocal) +{ + if(!playerState && m_playerStateSet) + { + // Clear this slot + m_playerStateSet = false; + OnChanged(); + return; + } + if (currentPlayerState == playerState) + return; + + this->isLocal = isLocal; + if (playerState) + { + // Get the player info to display in this player slot + const TSharedPtr netID = playerState->UniqueId.GetUniqueNetId(); + if (netID.IsValid()) + { + UWorld* const world = GetWorld(); + check(world); + UDefaultGameInstance* gameInstance = Cast(world->GetGameInstance()); + playerState->UpdatePersona(); + } + else + { + // Invalid NetID somehow + GWWARNING(L"NetID is invalid"); + return; + } + m_playerStateSet = true; + } + currentPlayerState = playerState; + + OnChanged(); +} + +void UPlayerSlot::OnChanged_Implementation() +{ +} \ No newline at end of file diff --git a/Source/UnrealProject/GUI/PlayerSlot.h b/Source/UnrealProject/GUI/PlayerSlot.h new file mode 100644 index 0000000..796649a --- /dev/null +++ b/Source/UnrealProject/GUI/PlayerSlot.h @@ -0,0 +1,33 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Blueprint/UserWidget.h" +#include "PlayerSlot.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API UPlayerSlot : public UUserWidget +{ + GENERATED_BODY() + +public: + UPlayerSlot(const FObjectInitializer& init); + virtual void NativeConstruct() override; + void Init(class APlayerStateBase* playerState, bool isLocal = false); + + UFUNCTION(BlueprintNativeEvent, Category = "Player") + void OnChanged(); + + UPROPERTY(BlueprintReadOnly, Category = "Player") + class APlayerStateBase* currentPlayerState; + UPROPERTY(BlueprintReadOnly, Category = "Player") + bool isLocal; + +private: + // Keep this boolean to detect currentPlayerState becoming invalid(nullptr) + bool m_playerStateSet; + +}; diff --git a/Source/UnrealProject/GUI/SizeBorder.cpp b/Source/UnrealProject/GUI/SizeBorder.cpp new file mode 100644 index 0000000..9d8441e --- /dev/null +++ b/Source/UnrealProject/GUI/SizeBorder.cpp @@ -0,0 +1,16 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "SizeBorder.h" +#include "SlateBlueprintLibrary.h" + +void USizeBorder::NativeTick(const FGeometry& MyGeometry, float DeltaTime) +{ + USlateBlueprintLibrary::LocalToViewport(this, MyGeometry, MyGeometry.GetLocalSize(), + pixelSize, viewportSize); + USlateBlueprintLibrary::LocalToViewport(this, MyGeometry, FVector2D(0.0f, 0.0f), + pixelPosition, viewportPosition); + pixelSize -= pixelPosition; + viewportSize -= viewportPosition; + Super::NativeTick(MyGeometry, DeltaTime); +} diff --git a/Source/UnrealProject/GUI/SizeBorder.h b/Source/UnrealProject/GUI/SizeBorder.h new file mode 100644 index 0000000..277d0f7 --- /dev/null +++ b/Source/UnrealProject/GUI/SizeBorder.h @@ -0,0 +1,28 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Blueprint/UserWidget.h" +#include "SizeBorder.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API USizeBorder : public UUserWidget +{ + GENERATED_BODY() + +public: + UPROPERTY(BlueprintReadOnly, Category = "Size") + FVector2D pixelPosition; + UPROPERTY(BlueprintReadOnly, Category = "Size") + FVector2D pixelSize; + UPROPERTY(BlueprintReadOnly, Category = "Size") + FVector2D viewportPosition; + UPROPERTY(BlueprintReadOnly, Category = "Size") + FVector2D viewportSize; + + void NativeTick(const FGeometry& MyGeometry, float DeltaTime) override; + +}; diff --git a/Source/UnrealProject/GUI/SkillTree/EffectSelector.cpp b/Source/UnrealProject/GUI/SkillTree/EffectSelector.cpp new file mode 100644 index 0000000..190dc5f --- /dev/null +++ b/Source/UnrealProject/GUI/SkillTree/EffectSelector.cpp @@ -0,0 +1,130 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "EffectSelector.h" +#include "EffectSlot.h" +#include "BaseSkillObject.h" +#include "AbilityInfo.h" +#include "SkillWidget.h" + +TSubclassOf defaultEffectSelectorClass; + +UEffectSelector::UEffectSelector(const FObjectInitializer& init) + : Super(init) +{ + defaultEffectSelectorClass = ConstructorHelpers::FClassFinder(L"/Game/Assets/GUI/WEEGEE_SkillEffectSelector").Class; +} +void UEffectSelector::NativeConstruct() +{ + m_container = Cast(WidgetTree->FindWidget("EffectSlotContainer")); + if(!m_container) + { + GERROR("\"Container\" not found in effect selector widget " + GetName()); + } + + onItemSelected.AddDynamic(this, &UEffectSelector::m_OnItemSelected); + onItemSelectionConfirmed.AddDynamic(this, &UEffectSelector::m_OnItemSelectionConfirmed); + + m_nameField = Cast(WidgetTree->FindWidget("NameField")); + m_descriptionField = Cast(WidgetTree->FindWidget("DescField")); + + Super::NativeConstruct(); +} + +void UEffectSelector::Init(class USkillWidget* widget) +{ + this->skill = widget->skillAsset; + this->widget = widget; + + // Remove old items + for(UEffectSlot* slot : m_effectSlots) + { + if(slot) + slot->RemoveFromParent(); + } + + if(!skill) + { + m_effectSlots.SetNum(0); + RescanItems(); + return; + } + + // Add effect slot buttons + for(UAbilityInfo* abilityEffect : skill->abilityEffects) + { + if(abilityEffect) + { + UEffectSlot* slot = CreateWidget(GetWorld(), effectSlotClass); + m_container->AddChild(slot); + slot->Init(abilityEffect); + m_effectSlots.Add(slot); + } + else + { + GERROR("Didn't set ability on skill " + skill->GetName()); + } + } + + RescanItems(); +} + +void UEffectSelector::Init2(class TArray abilities) +{ + this->skill = nullptr; + this->widget = nullptr; + // Remove old items + for(UEffectSlot* slot : m_effectSlots) + { + if(slot) + slot->RemoveFromParent(); + } + + // Add effect slot buttons + for(UAbilityInfo* abilityEffect : abilities) + { + if(abilityEffect) + { + UEffectSlot* slot = CreateWidget(GetWorld(), effectSlotClass); + m_container->AddChild(slot); + slot->Init(abilityEffect); + m_effectSlots.Add(slot); + } + else + { + GERROR("Didn't set ability on skill " + skill->GetName()); + } + } + + RescanItems(); +} + +void UEffectSelector::m_OnItemSelected(UMenuItemBase* item) +{ + UEffectSlot* slot = Cast(item); + if(slot && slot->ability) + { + if(m_nameField) + m_nameField->SetText(FText::FromString(slot->ability->name)); + if(m_descriptionField) + m_descriptionField->SetText(FText::FromString(slot->ability->description)); + } +} + +void UEffectSelector::m_OnItemSelectionConfirmed(UMenuItemBase* item) +{ + UEffectSlot* slot = Cast(item); + if(slot && slot->ability) + { + if(widget) + { + widget->SetSelectedEffect(slot->index); + } + onEffectSelected.Broadcast(slot->index); + OnSelectionConfirmed(slot); + } + else + { + GERROR(L"Invalid ability selected"); + } +} diff --git a/Source/UnrealProject/GUI/SkillTree/EffectSelector.h b/Source/UnrealProject/GUI/SkillTree/EffectSelector.h new file mode 100644 index 0000000..fc11655 --- /dev/null +++ b/Source/UnrealProject/GUI/SkillTree/EffectSelector.h @@ -0,0 +1,52 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GUI/Menu/SubMenu.h" +#include "EffectSelector.generated.h" + +extern TSubclassOf defaultEffectSelectorClass; + +UCLASS() +class UNREALPROJECT_API UEffectSelector : public USubMenu +{ + GENERATED_BODY() +public: + UEffectSelector(const FObjectInitializer& init); + virtual void NativeConstruct(); + + UFUNCTION(BlueprintImplementableEvent) + void OnSelectionConfirmed(UEffectSlot* effect); + + UFUNCTION(BlueprintCallable, Category="EffectSelector") + void Init(class USkillWidget* widget); + UFUNCTION(BlueprintCallable, Category = "EffectSelector") + void Init2(TArray abilities); + + UPROPERTY(EditDefaultsOnly) + TSubclassOf effectSlotClass; + + UPROPERTY(BlueprintReadOnly) + class UBaseSkillObject* skill; + UPROPERTY(BlueprintReadOnly) + class USkillWidget* widget; + + DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnEffectSelected, int32, selected); + UPROPERTY(BlueprintAssignable) + FOnEffectSelected onEffectSelected; + +private: + UFUNCTION() + void m_OnItemSelected(UMenuItemBase* item); + UFUNCTION() + void m_OnItemSelectionConfirmed(UMenuItemBase* item); + + UPROPERTY() + UTextBlock* m_nameField; + UPROPERTY() + UMultiLineEditableTextBox* m_descriptionField; + UPROPERTY() + UPanelWidget* m_container; + UPROPERTY() + TArray m_effectSlots; +}; diff --git a/Source/UnrealProject/GUI/SkillTree/EffectSlot.cpp b/Source/UnrealProject/GUI/SkillTree/EffectSlot.cpp new file mode 100644 index 0000000..d7a36ee --- /dev/null +++ b/Source/UnrealProject/GUI/SkillTree/EffectSlot.cpp @@ -0,0 +1,31 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "EffectSlot.h" +#include "AbilityInfo.h" + +void UEffectSlot::NativeConstruct() +{ + m_name = Cast(WidgetTree->FindWidget("NameField")); + m_image = Cast(WidgetTree->FindWidget("Icon")); + + Super::NativeConstruct(); +} +void UEffectSlot::Init(class UAbilityInfo* ability) +{ + this->ability = ability; + + if(!ability) + return; + + if(m_name) + { + m_name->SetText(FText::FromString(ability->name)); + } + if(m_image) + { + m_image->SetBrushFromTexture(ability->icon); + } + + OnInit(ability); +} diff --git a/Source/UnrealProject/GUI/SkillTree/EffectSlot.h b/Source/UnrealProject/GUI/SkillTree/EffectSlot.h new file mode 100644 index 0000000..971f39f --- /dev/null +++ b/Source/UnrealProject/GUI/SkillTree/EffectSlot.h @@ -0,0 +1,31 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GUI/Menu/MenuButton.h" +#include "EffectSlot.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API UEffectSlot : public UMenuButton +{ + GENERATED_BODY() + +public: + virtual void NativeConstruct(); + + UFUNCTION(BlueprintCallable, Category = "EffectSelector") + void Init(class UAbilityInfo* ability); + + UFUNCTION(BlueprintImplementableEvent, Category = "EffectSelector") + void OnInit(class UAbilityInfo* ability); + + UPROPERTY(BlueprintReadOnly) + class UAbilityInfo* ability; + +private: + UImage* m_image; + UTextBlock* m_name; +}; diff --git a/Source/UnrealProject/GUI/SkillTree/HexagonTile.cpp b/Source/UnrealProject/GUI/SkillTree/HexagonTile.cpp new file mode 100644 index 0000000..b983c42 --- /dev/null +++ b/Source/UnrealProject/GUI/SkillTree/HexagonTile.cpp @@ -0,0 +1,22 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "HexagonTile.h" + +void UHexagonTile::NativeConstruct() +{ + TArray widgets; + WidgetTree->GetAllWidgets(widgets); + + for (int32 i = 0; i < widgets.Num(); i++) + { + UImage* tmp = Cast(widgets[i]); + if (tmp) + { + material = tmp->GetDynamicMaterial(); + break; + } + } +} + + diff --git a/Source/UnrealProject/GUI/SkillTree/HexagonTile.h b/Source/UnrealProject/GUI/SkillTree/HexagonTile.h new file mode 100644 index 0000000..b6d0151 --- /dev/null +++ b/Source/UnrealProject/GUI/SkillTree/HexagonTile.h @@ -0,0 +1,30 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Blueprint/UserWidget.h" +#include "HexagonTile.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API UHexagonTile : public UUserWidget +{ + GENERATED_BODY() +public: + UPROPERTY( EditAnywhere, Category = "UI" ) + int32 x; + + UPROPERTY( EditAnywhere, Category = "UI" ) + int32 y; + + FMargin GetMargins() + { + return GetFullScreenOffset(); + } + + class UMaterialInstanceDynamic* material; + + virtual void NativeConstruct() override; +}; diff --git a/Source/UnrealProject/GUI/SkillTree/SkillTreeState.h b/Source/UnrealProject/GUI/SkillTree/SkillTreeState.h new file mode 100644 index 0000000..5b0475a --- /dev/null +++ b/Source/UnrealProject/GUI/SkillTree/SkillTreeState.h @@ -0,0 +1,155 @@ +#pragma once +#include "SkillTreeState.Generated.h" + +USTRUCT(BlueprintType) +struct FSkillTreeStateObject +{ + GENERATED_BODY(); + UPROPERTY() + FVector2D gridIndex; + UPROPERTY() + float rotation; + UPROPERTY() + TArray placedPoints; + UPROPERTY() + UClass* skillObject; + UPROPERTY() + int32 selectedEffect; + + bool ContainsRoot(FIntPoint root) + { + for (int32 i = 0; i < placedPoints.Num(); i++) + { + if (placedPoints[i] == root) return true; + } + return false; + } + TArray ConnectedSkills( TMap& skillsMap ) + { + TArray result; + const FIntPoint offsets[2][6]{ + { FIntPoint(0, -1), FIntPoint(1, -1), FIntPoint(1, 0), FIntPoint(0, 1), FIntPoint(-1, 0), FIntPoint(-1, -1) }, + { FIntPoint(0, -1), FIntPoint(1, 0), FIntPoint(1, 1), FIntPoint(0, 1), FIntPoint(-1, 1), FIntPoint(-1, 0) } }; + for (int32 i = 0; i < placedPoints.Num(); i++) + { + int32 k = placedPoints[i].X & 1; + for (int32 j = 0; j < 6; j++) + { + FIntPoint checkPoint = placedPoints[i] + offsets[k][j]; + if (placedPoints.Contains(checkPoint)) continue; + if (skillsMap.Contains(checkPoint)) + { + FSkillTreeStateObject* skill = *skillsMap.Find(checkPoint); + if (result.Contains(skill)) continue; + result.Push(skill); + } + } + } + return result; + } +}; + +USTRUCT(BlueprintType) +struct FSkillTreeState +{ + GENERATED_BODY(); + + UPROPERTY(BlueprintReadOnly) + TArray objects; + +private: + void WalkTree(TMap>* a_map, TArray* a_checked, TArray a_nodes) + { + for (int32 i = 0; i < a_nodes.Num(); i++) + { + if (a_checked->Contains(a_nodes[i])) continue; + a_checked->Push(a_nodes[i]); + TArray* connected = a_map->Find(a_nodes[i]); + if (!connected) + { + YERROR("Could not find the connected skills."); + continue; + } + WalkTree(a_map, a_checked, *connected); + } + } + +public: + bool ValidateSkillTree() + { + bool rootResult = false; + bool connectResult = true; + + if (objects.Num() == 0) return true; + + + TMap> connectedSkillsMap; + TMap skillsMap; + FSkillTreeStateObject* rootSkill = NULL; + for (int32 i = 0; i < objects.Num(); i++) + { + TArray points = objects[i].placedPoints; + for (int32 j = 0; j < points.Num(); j++) + { + skillsMap.Add(points[j], &objects[i]); + } + } + + for (int32 i = 0; i < objects.Num(); i++) + { + TArray points = objects[i].placedPoints; + if (!rootResult) + { + bool rootTest = objects[i].ContainsRoot(FIntPoint(6,15)); + if (rootTest) + { + rootResult = true; + rootSkill = &objects[i]; + } + } + TArray connectedSkills = objects[i].ConnectedSkills(skillsMap); + connectedSkillsMap.Add(&objects[i], connectedSkills); + if (connectedSkills.Num() == 0) + { + connectResult = false; + break; + } + } + + if (connectResult && rootResult) + { + if (!rootSkill) + { + YERROR("Root Skill is NULL!"); + return false; + } + TArray checkedSkills; + checkedSkills.Push(rootSkill); + TArray* connected = connectedSkillsMap.Find(rootSkill); + if (!connected) + { + YPRINT("Root Skill is not attached to any skills!"); + return false; + } + WalkTree(&connectedSkillsMap, &checkedSkills, *connected); + if (objects.Num() != checkedSkills.Num()) + connectResult = false; + else + { + for (int32 i = 0; i < objects.Num(); i++) + { + if (!checkedSkills.Contains(&objects[i])) + { + connectResult = false; + } + } + } + } + bool isValid = false; + if (objects.Num() == 1 && rootResult) + isValid = true; + else + isValid = (rootResult && connectResult); + return isValid; + } +}; \ No newline at end of file diff --git a/Source/UnrealProject/GUI/SkillTree/SkillTreeWidget.cpp b/Source/UnrealProject/GUI/SkillTree/SkillTreeWidget.cpp new file mode 100644 index 0000000..598cd3d --- /dev/null +++ b/Source/UnrealProject/GUI/SkillTree/SkillTreeWidget.cpp @@ -0,0 +1,678 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "SkillTreeWidget.h" +#include "SkillTreeObject.h" +#include "BaseSkillObject.h" +#include "HexagonTile.h" +#include "ScrollBox.h" +#include "SkillWidget.h" +#include "CanvasPanel.h" +#include "PlayerControllerBase.h" +#include "DefaultGameInstance.h" +#include "CharacterSettings.h" +#include "SlateBlueprintLibrary.h" +#include "ToolTipWidget.h" +#include "AbilityInfo.h" +#include "SizeBorder.h" +#include "WidgetLayoutLibrary.h" + +int32 roundToNearestOdd1(float a_in) +{ + return 2 * FMath::FloorToInt((a_in / 2) + 0.5f) - 2; +} + +int32 roundToNearestEven1(float a_in) +{ + return 2 * FMath::FloorToInt(a_in / 2); +} + +void USkillTreeWidget::NativeOnSkillTreeChanged(ESkillTreeChangeEvent event, UBaseSkillObject* relevantObject) +{ + // Recalculate dominantDamageType + int32_t categoryCounters[] = { 0,0,0 }; + int32_t largest = 0; + for(USkillWidget* skill : m_skillWidgets) + { + if(skill->selectedEffect >= 0 && skill->skillAsset) + { + if(skill->selectedEffect >= skill->skillAsset->abilityEffects.Num()) + { + GERROR("CORRUPT SKILL TREE"); + continue; + } + + UAbilityInfo* info = skill->skillAsset->abilityEffects[skill->selectedEffect]; + int32_t& myCounter = categoryCounters[(size_t)info->abilityCategory]; + myCounter++; + + if(myCounter >= largest) + { + largest = myCounter; + dominantAbilityCategory = info->abilityCategory; + } + } + } + + onSkillTreeChanged.Broadcast(event, relevantObject); +} + +USkillTreeWidget::USkillTreeWidget(const FObjectInitializer& init) + : Super( init ) +{ + m_interactive = true; + m_shown = false; + m_lastFocusedWidget = nullptr; + isValid = false; + placedSkillHexMap = new FHexMap(); + for (int32 x = 0; x < 13; x++) + { + placedSkillHexMap->rawdata[x] = 0; + } +} + +void USkillTreeWidget::NativeConstruct() +{ + Super::NativeConstruct(); + + UpdateVisibility(); + + // Get the tooltip widget + m_toolTipWidget = Cast(WidgetTree->FindWidget("ToolTipSWidget")); + + m_sizeBorder = Cast(WidgetTree->FindWidget("SizeBorder")); + + if ( !skillTreeAsset ) return; + TArray widgets; + WidgetTree->GetAllWidgets( widgets ); + UScrollBox* scrollBox = NULL; + m_skillTreeCanvas = WidgetTree->FindWidget("Main_SkillTree"); + //m_focusBorder = WidgetTree->FindWidget("FocusBorder"); + m_inputCapture = WidgetTree->FindWidget("InputCapture"); + m_inputCapture->SetVisibility(ESlateVisibility::SelfHitTestInvisible); + for ( int32 i = 0; i < widgets.Num(); i++ ) + { + UHexagonTile* tmpHex = Cast( widgets[i] ); + UScrollBox* tmpScrollBox = Cast( widgets[i] ); + //USkillWidget* tmpSkill = Cast( widgets[i] ); + if ( tmpScrollBox ) scrollBox = tmpScrollBox; + //if ( tmpSkill ) m_selectedSkill = tmpSkill; + if ( !tmpHex ) continue; + tiles.Push( tmpHex ); + bool test = skillTreeAsset->hexMap.Get( tmpHex->x, tmpHex->y ); + if ( test ) tmpHex->SetVisibility( ESlateVisibility::Hidden ); + } + if ( m_selectedSkill ) + { + m_selectedSkill->parent = this; + m_selectedSkill->SetDragable( true ); + } + else + { + YWARNING( "No Selected Skill found!" ); + } +} +void USkillTreeWidget::NativeDestruct() +{ + delete placedSkillHexMap; + Super::NativeDestruct(); +} + +void USkillTreeWidget::NativeTick(const FGeometry& MyGeometry, float DeltaTime) +{ + Super::NativeTick(MyGeometry, DeltaTime); + + //if ((m_focusBorder && m_focusBorder->IsHovered()) || draggingWidget) + //{ + // //m_inputCapture->SetVisibility(ESlateVisibility::Visible); + //} + //else + //{ + // //m_inputCapture->SetVisibility(ESlateVisibility::SelfHitTestInvisible); + //} + + if (m_toolTipWidget) + { + m_toolTipWidget->showTooltip = false; + + FVector2D mousePos; + UWidgetLayoutLibrary::GetMousePositionScaledByDPI(GetOwningPlayer(), mousePos.X, mousePos.Y); + FIntPoint mouseGridPos = GetGridIndex(mousePos); + USkillWidget** sw = tileMap.Find(mouseGridPos); + USkillWidget* skill = sw ? *sw : nullptr; + if (skill) + { + // Reset hovered state + UAbilityInfo* info = skill->GetSelectedEffectAbility(); + if (info) + { + m_toolTipWidget->SetTitle(info->name); + m_toolTipWidget->SetText(info->description); + m_toolTipWidget->position = skill->tooltipAreaPosition; + m_toolTipWidget->size = skill->tooltipAreaSize; + m_toolTipWidget->showTooltip = true; + } + skill->hovered = true; + } + if (m_lastFocusedWidget && m_lastFocusedWidget != skill) + { + m_lastFocusedWidget->hovered = false; + } + m_lastFocusedWidget = skill; + } +} + +FReply USkillTreeWidget::NativeOnMouseButtonUp(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) +{ + if(!IsInteractive()) + return FReply::Handled(); + //GWPRINT(L"Skill tree up"); + if(draggingWidget && !draggingWidget->IsUsingController()) + { + draggingWidget->StopDragging(); + return FReply::Handled(); + } + return FReply::Handled(); +} +FReply USkillTreeWidget::NativeOnMouseButtonDown(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) +{ + if(!IsInteractive()) + return FReply::Handled(); + //GWPRINT(L"Skill tree down"); + FKey button = InMouseEvent.GetEffectingButton(); + if(button == EKeys::LeftMouseButton) + { + if(draggingWidget && !draggingWidget->IsUsingController()) + { + draggingWidget->StopDragging(); + return FReply::Handled(); + } + else + { + if(m_lastFocusedWidget) + { + if(m_lastFocusedWidget->hovered) + m_lastFocusedWidget->StartDragging(); + } + } + } + else if(button == EKeys::RightMouseButton) + { + if(!draggingWidget && m_lastFocusedWidget) + { + if(m_lastFocusedWidget->hovered) + { + m_lastFocusedWidget->OnRequireSkillEffect(); + } + } + } + + return FReply::Handled(); +} +FReply USkillTreeWidget::NativeOnMouseWheel(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) +{ + //GWPRINT(L"USkillTreeWidget MouseWheel " + InMouseEvent.GetWheelDelta()); + if (draggingWidget) + { + float add = 60.0f * FMath::FloorToFloat(InMouseEvent.GetWheelDelta()); + draggingWidget->SetSkillRotation(add + draggingWidget->GetSkillRotation()); + } + return FReply::Unhandled(); +} + +void USkillTreeWidget::SetIsInteractive(bool interactive) +{ + m_interactive = interactive; + UpdateVisibility(); +} +void USkillTreeWidget::UpdateVisibility() +{ + if (m_shown) + { + SetVisibility(ESlateVisibility::SelfHitTestInvisible); + } + else + { + SetVisibility(ESlateVisibility::Hidden); + } + UImage* validImage = WidgetTree->FindWidget("Validation_Image"); + if (m_interactive) + { + validImage->SetVisibility(ESlateVisibility::Visible); + } + else + { + validImage->SetVisibility(ESlateVisibility::Hidden); + } +} + +void WalkTree(TMap>* a_map, TArray* a_checked, TArray a_nodes) +{ + for (int32 i = 0; i < a_nodes.Num(); i++) + { + if (a_checked->Contains(a_nodes[i])) continue; + a_checked->Push(a_nodes[i]); + TArray* connected = a_map->Find(a_nodes[i]); + if (!connected) + { + YERROR("Could not find the connected skills."); + continue; + } + WalkTree(a_map, a_checked, *connected); + } +} + +bool USkillTreeWidget::ValidateSkillTree() +{ + bool rootResult = false; + bool connectResult = true; + if (m_skillWidgets.Num() == 0) return true; + TMap> connectedSkillsMap; + USkillWidget* rootSkill = NULL; + for (int32 i = 0; i < m_skillWidgets.Num(); i++) + { + TArray points = m_skillWidgets[i]->GetPoints(); + if (!rootResult) + { + bool rootTest = m_skillWidgets[i]->ContainsRoot(points); + if (rootTest) + { + rootResult = true; + rootSkill = m_skillWidgets[i]; + } + } + TArray connectedSkills = m_skillWidgets[i]->ConnectedSkills(points); + connectedSkillsMap.Add(m_skillWidgets[i], connectedSkills); + if ( connectedSkills.Num() == 0 ) + { + connectResult = false; + break; + } + } + if (connectResult && rootResult) + { + if (!rootSkill) + { + YERROR("Root Skill is NULL!"); + return false; + } + TArray checkedSkills; + checkedSkills.Push(rootSkill); + TArray* connected = connectedSkillsMap.Find(rootSkill); + if (!connected) + { + YPRINT("Root Skill is not attached to any skills!"); + return false; + } + WalkTree(&connectedSkillsMap, &checkedSkills, *connected); + if (m_skillWidgets.Num() != checkedSkills.Num()) + connectResult = false; + else + { + for (int32 i = 0; i < m_skillWidgets.Num(); i++) + { + if (!checkedSkills.Contains(m_skillWidgets[i])) + { + connectResult = false; + } + } + } + } + if (m_skillWidgets.Num() == 1 && rootResult) + isValid = true; + else + isValid = (rootResult && connectResult); + if (isValid) + { + UpdateLevel(10.0f); + } + else + { + UpdateLevel(0.0f); + } + return isValid; +} + +FSkillTreeState USkillTreeWidget::GetState() +{ + FSkillTreeState state; + for(int32 i = 0; i < m_skillWidgets.Num(); i++) + { + FSkillTreeStateObject obj; + USkillWidget* skill = m_skillWidgets[i]; + obj.gridIndex = skill->GetGridIndex() /*- FVector2D(1.5,4) * m_skillTreeCanvas->RenderTransform.Scale.X*/; + obj.placedPoints = skill->placedPoints; + obj.skillObject = skill->skillAsset->GetClass(); + obj.rotation = skill->GetSkillRotation(); + obj.selectedEffect = skill->selectedEffect; + state.objects.Add(obj); + + //GWPRINT(L"Saving gridIndex " + obj.gridIndex); + //for(int32 i = 0; i < obj.placedPoints.Num(); i++) + //{ + // GWPRINT(L"Saving Placed point " + i + L" " + obj.placedPoints[i].X + L", " + obj.placedPoints[i].Y); + //} + } + + return state; +} + +TArray USkillTreeWidget::GetApearanceState() +{ + return m_skillClasses; +} + +void USkillTreeWidget::Clear() +{ + // Remove all placed hexes + auto arrayCopy = m_skillWidgets; + for(int32 i = 0; i < arrayCopy.Num(); i++) + { + arrayCopy[i]->RemoveFromParent(); + RemoveSkill(arrayCopy[i], arrayCopy[i]->placedPoints); + } + m_skillWidgets.SetNum(0); + m_skillClasses.SetNum(0); + tileMap.Reset(); + + // Clear Hex map + for(int32 x = 0; x < 13; x++) + { + placedSkillHexMap->rawdata[x] = 0; + } + + isValid = true; + + // Trigger Callbacks + NativeOnSkillTreeChanged(ESkillTreeChangeEvent::Cleared, nullptr); +} +void USkillTreeWidget::BuildFromState(const FSkillTreeState& state) +{ + Clear(); + for(int32 i = 0; i < state.objects.Num(); i++) + { + const FSkillTreeStateObject& obj = state.objects[i]; + UBaseSkillObject* baseSkill = obj.skillObject->GetDefaultObject(); + + if(!baseSkill) + continue; + + //GWPRINT(L"gridIndex " + obj.gridIndex); + //for(int32 i = 0; i < obj.placedPoints.Num(); i++) + //{ + // GWPRINT(L"Placed point " + i + L" " + obj.placedPoints[i].X + L", " + obj.placedPoints[i].Y); + //} + + m_selectedSkill = CreateWidget(GetWorld(), WidgetTemplate); + m_selectedSkill->skillAsset = baseSkill; + m_selectedSkill->parent = this; + if(m_skillTreeCanvas) + m_selectedSkill->SetRenderScale(m_skillTreeCanvas->RenderTransform.Scale); + m_selectedSkill->SetPlaced(); + if(m_skillTreeCanvas) + m_skillTreeCanvas->GetParent()->AddChild(m_selectedSkill); + UCanvasPanelSlot* slot = Cast(m_selectedSkill->Slot); + if(slot) + { + slot->SetAutoSize(true); + slot->SetAlignment(FVector2D(-0.5f, -0.5f)); + } + m_selectedSkill->SetSelectedEffect(obj.selectedEffect); + m_selectedSkill->placedPoints = obj.placedPoints; + m_selectedSkill->SetSkillRotation(obj.rotation); + m_selectedSkill->PlaceOnGridIndex(obj.gridIndex); + AddSkill(m_selectedSkill, obj.placedPoints); + } +} + +void USkillTreeWidget::RemoveSkill(UBaseSkillObject* skillObject) +{ + int32 skillID = m_skillClasses.Find(skillObject); + if (skillID == INDEX_NONE) return; + CancelSkill(m_skillWidgets[skillID]); + m_skillWidgets[skillID]->Remove(); +} + +bool USkillTreeWidget::IsUsingSkill(UBaseSkillObject* skillObject) const +{ + return m_skillClasses.Contains(skillObject); +} + +USkillWidget* USkillTreeWidget::GetUsedSkill(class UBaseSkillObject* skillObject) +{ + for (int32 i = 0; i < m_skillWidgets.Num(); i++) + { + if (m_skillWidgets[i]->skillAsset == skillObject) + return m_skillWidgets[i]; + } + return nullptr; +} + +void USkillTreeWidget::Save(int32 saveSlot) +{ + UDefaultGameInstance* inst = Cast(GetGameInstance()); + UCharacterSettings* settings = inst->GetCharacterSettings(); + + if (saveSlot < 0 || saveSlot >= settings->characterSaves.Num()) + { + JERROR("Invalid save slot"); + return; + } + + settings->characterSaves[saveSlot].skillTreeState = GetState(); + inst->SaveSettings(); +} +void USkillTreeWidget::Load(int32 saveSlot) +{ + UDefaultGameInstance* inst = Cast(GetGameInstance()); + UCharacterSettings* settings = inst->GetCharacterSettings(); + + if (saveSlot < 0 || saveSlot >= settings->characterSaves.Num()) + { + JERROR("Invalid save slot"); + return; + } + + BuildFromState(settings->characterSaves[saveSlot].skillTreeState); + ValidateSkillTree(); +} + +FIntPoint USkillTreeWidget::GetGridIndex(FVector2D in) const +{ + FVector2D result; + UCanvasPanelSlot* tmpSlot = UWidgetLayoutLibrary::SlotAsCanvasSlot(m_skillTreeCanvas); + float viewportScale = UWidgetLayoutLibrary::GetViewportScale(const_cast(this)); + FVector2D topLeft; + float scale = 32.0f * (m_skillTreeCanvas->RenderTransform.Scale.X / 2); + float XScale = (scale * 1.73205f); + float YScale = scale; + if (tmpSlot) + { + FVector2D screenTopRight = FVector2D(GEngine->GameViewport->Viewport->GetSizeXY().X * tmpSlot->GetAnchors().Minimum.X, GEngine->GameViewport->Viewport->GetSizeXY().Y * tmpSlot->GetAnchors().Minimum.Y); + FVector2D offset = tmpSlot->GetPosition() * viewportScale; + FVector2D widgetTopLeft = ((tmpSlot->GetSize() * m_skillTreeCanvas->RenderTransform.Scale.X * viewportScale) / 2); + topLeft = screenTopRight + offset - widgetTopLeft; + topLeft /= viewportScale; + //topLeft.X -= 16.0f; + } + + float XPreFloor = (in.X - topLeft.X) / XScale; + float YPreFloor = (in.Y - topLeft.Y) / YScale; + int32 XIndex = FMath::FloorToInt(XPreFloor); + int32 YIndex = FMath::FloorToInt(YPreFloor); + /*FVector2D magicOffset = FVector2D(1.5, 4) * m_skillTreeCanvas->RenderTransform.Scale.X;*/ + bool odd = (XIndex % 2) == 1; + if (odd) + YIndex = roundToNearestOdd1(YIndex); + else + YIndex = roundToNearestEven1(YIndex); + return FIntPoint(XIndex, (YIndex) / 2.0f); +} + +void USkillTreeWidget::StartDragging(USkillWidget* widget) +{ + check(draggingWidget == nullptr); + draggingWidget = widget; + m_inputCapture->SetVisibility(ESlateVisibility::Visible); +} + +void USkillTreeWidget::StopDragging(USkillWidget* widget) +{ + if(draggingWidget != widget) + { + GERROR("Calling StopDragging twice"); + } + draggingWidget = nullptr; + m_inputCapture->SetVisibility(ESlateVisibility::SelfHitTestInvisible); +} + +void USkillTreeWidget::UpdateTextInfo_Implementation() +{ +} + +void USkillTreeWidget::AddSkill(USkillWidget* a_skill, const TArray& a_points) +{ + for ( int32 i = 0; i < a_points.Num(); i++ ) + { + placedSkillHexMap->Set( a_points[i].X, a_points[i].Y, true ); + + tileMap.Add(a_points[i], a_skill); + } + + UWorld* const world = GetWorld(); + if ( !world ) + { + YWARNING( "Couldn't get the World." ); + return; + } + APlayerControllerBase* const controller = Cast( GetOwningPlayer() ); + if ( !controller ) + { + YWARNING( "Couldn't get the Player." ); + return; + } + controller->OnLearnSkill( a_skill->skillAsset ); + m_skillWidgets.Add(a_skill); + m_skillClasses.Add(a_skill->skillAsset); + + // Trigger Callbacks + NativeOnSkillTreeChanged(ESkillTreeChangeEvent::Added, a_skill->skillAsset); + + ValidateSkillTree(); +} + +void USkillTreeWidget::RemoveSkill( USkillWidget* a_skill, const TArray& a_points ) +{ + m_skillClasses.Remove(a_skill->skillAsset); + m_skillWidgets.Remove(a_skill); + for ( int32 i = 0; i < a_points.Num(); i++ ) + { + placedSkillHexMap->Set( a_points[i].X, a_points[i].Y, false ); + tileMap.Remove(a_points[i]); + } + + UWorld* const world = GetWorld(); + if ( !world ) + { + YWARNING( "Couldn't get the World." ); + return; + } + APlayerControllerBase* const controller = Cast( GetOwningPlayer() ); + if ( !controller ) + { + YWARNING( "Couldn't get the Player." ); + return; + } + controller->OnUnlearnSkill( a_skill->skillAsset ); + + // Trigger Callbacks + NativeOnSkillTreeChanged(ESkillTreeChangeEvent::Removed, a_skill->skillAsset); +} + +USkillWidget* USkillTreeWidget::NewSkill( USkillWidget* a_skill, bool controller ) +{ + return NewSkillFromAsset(a_skill->skillAsset, controller); +} + +class USkillWidget* USkillTreeWidget::NewSkillFromAsset(UBaseSkillObject* skillAsset, bool controller /*= false*/) +{ + if(draggingWidget) + return NULL; + //a_skill->Disable(); + m_selectedSkill = CreateWidget(GetWorld(), WidgetTemplate); + m_selectedSkill->skillAsset = skillAsset; + m_selectedSkill->parent = this; + m_selectedSkill->SetVisibility(ESlateVisibility::SelfHitTestInvisible); + m_selectedSkill->SetDragable(true, controller); + m_selectedSkill->SetRenderScale(m_skillTreeCanvas->RenderTransform.Scale); + m_skillTreeCanvas->GetParent()->AddChild(m_selectedSkill); + m_selectedSkill->SetUserFocus(GetOwningPlayer()); + UCanvasPanelSlot* slot = Cast(m_selectedSkill->Slot); + if(slot) + { + slot->SetAutoSize(true); + slot->SetAlignment(FVector2D(-0.5f, -0.5f)); + } + + if(controller) + { + // Set initial position + m_selectedSkill->MoveSkillAbsolute(lastGridIndex); + } + + return m_selectedSkill; +} + +void USkillTreeWidget::CancelSkill(USkillWidget* a_skill) +{ + a_skill->RemoveFromParent(); + ValidateSkillTree(); +} + +void USkillTreeWidget::Show() +{ + m_shown = true; + UpdateVisibility(); +} + +void USkillTreeWidget::Hide() +{ + m_shown = false; + UpdateVisibility(); +} + +void USkillTreeWidget::UpdateLevel(float level) +{ + for (int32 i = 0; i < m_skillWidgets.Num(); i++) + { + m_skillWidgets[i]->UpdateLevel(level); + } + if (IsInteractable()) + { + UpdateTextInfo(); + } +} + +void USkillTreeWidget::UpdateInfo(float skilltreeHeight, float skilltreeOffset) +{ + for (int32 i = 0; i < m_skillWidgets.Num(); i++) + { + m_skillWidgets[i]->UpdateInfo(skilltreeHeight, skilltreeOffset); + } +} + +/* +void USkillTreeWidget::NativeTick(const FGeometry& MyGeometry, float DeltaTime) +{ + FVector2D minPos; + FVector2D maxPos; + FVector2D viewportPos; + USlateBlueprintLibrary::LocalToViewport(this, MyGeometry, MyGeometry.GetLocalSize(), maxPos, viewportPos); + USlateBlueprintLibrary::LocalToViewport(this, MyGeometry, FVector2D(0,0), minPos, viewportPos); + FVector2D viewportSize = maxPos - minPos; + for (int32 i = 0; i < m_skillWidgets.Num(); i++) + { + m_skillWidgets[i]->UpdateInfo(viewportSize.Y, minPos.Y); + } +} +*/ \ No newline at end of file diff --git a/Source/UnrealProject/GUI/SkillTree/SkillTreeWidget.h b/Source/UnrealProject/GUI/SkillTree/SkillTreeWidget.h new file mode 100644 index 0000000..bb19880 --- /dev/null +++ b/Source/UnrealProject/GUI/SkillTree/SkillTreeWidget.h @@ -0,0 +1,155 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "../Menu/SubMenu.h" +#include "SkillTreeState.h" +#include "AbilityInfo.h" +#include "SkillTreeWidget.generated.h" + +class USkillTreeObject; +class USkillWidget; +class UCanvasPanel; +class UHexagonTile; +class ADefaultPlayerController; +struct FHexMap; + +UENUM(BlueprintType) +enum class ESkillTreeChangeEvent : uint8 +{ + Added, + Removed, + Cleared, +}; + +/* + Yosho's skill tree? +*/ +UCLASS() +class UNREALPROJECT_API USkillTreeWidget : public USubMenu +{ + GENERATED_BODY() +private: + TArray m_skillWidgets; + TArray m_skillClasses; + USkillWidget* m_selectedSkill; + UCanvasPanel* m_skillTreeCanvas; + UBorder* m_inputCapture; + UBorder* m_focusBorder; + class USizeBorder* m_sizeBorder; + class UToolTipWidget* m_toolTipWidget; + USkillWidget* m_lastFocusedWidget; + + bool m_interactive; + bool m_shown; + +public: + UPROPERTY(BlueprintReadOnly, Category = "UI") + bool isValid; + + TMap tileMap; + TArray tiles; + UPROPERTY( EditAnywhere, Category = "UI" ) + USkillTreeObject* skillTreeAsset; + UPROPERTY( EditAnywhere, Category = "UI" ) + FIntPoint rootPoint; + FVector2D lastGridIndex; + + class UToolTipWidget* GetToolTipWidget() const { + return m_toolTipWidget; + } + + UFUNCTION(BlueprintCallable, Category = "UI") + void SetIsInteractive(bool interactive); + void UpdateVisibility(); + bool IsShow() const { return m_shown; } + UFUNCTION(BlueprintCallable, Category = "UI") + bool IsInteractive() const { return m_interactive; } + class USizeBorder* GetSizeBorder() const { return m_sizeBorder; } + + UPROPERTY(BlueprintReadOnly) + EAbilityCategory dominantAbilityCategory; + + // Returns the complete state to reconstruct this skilltree later with BuildFromState() + UFUNCTION(BlueprintCallable, Category = "Skill Tree") + FSkillTreeState GetState(); + // Returns the array of used skill objects for visual usage + UFUNCTION(BlueprintCallable, Category = "Skill Tree") + TArray GetApearanceState(); + // Removes all skills from this skill tree widget + UFUNCTION(BlueprintCallable, Category = "UI") + void Clear(); + // Restores a given skill tree setup from a state struct + UFUNCTION(BlueprintCallable, Category = "Skill Tree") + void BuildFromState(const FSkillTreeState& state); + + UFUNCTION(BlueprintCallable, Category = "UI") + bool IsUsingSkill(class UBaseSkillObject* skillObject) const; + UFUNCTION(BlueprintCallable, Category = "UI") + USkillWidget* GetUsedSkill(class UBaseSkillObject* skillObject); + + UFUNCTION(BlueprintCallable, Category = "UI") + void Save(int32 saveSlot); + UFUNCTION(BlueprintCallable, Category = "UI") + void Load(int32 saveSlot); + UFUNCTION(BlueprintCallable, Category = "UI") + void RemoveSkill(class UBaseSkillObject* skillObject); + + void StartDragging(USkillWidget* widget); + UFUNCTION(BlueprintCallable, Category = "UI") + void StopDragging(USkillWidget* widget); + + FIntPoint GetGridIndex(FVector2D in) const; + + UPROPERTY(BlueprintReadOnly, Category = "UI") + USkillWidget* draggingWidget; + UFUNCTION(BlueprintNativeEvent, Category = "UI") + void UpdateTextInfo(); + + FHexMap* placedSkillHexMap; + ADefaultPlayerController* parent; + + UFUNCTION(BlueprintCallable, Category = "UI") + bool ValidateSkillTree(); + + UCanvasPanel* GetCanvas() + { + return m_skillTreeCanvas; + } + void AddSkill( USkillWidget* a_skill, const TArray& a_points ); + void RemoveSkill( USkillWidget* a_skill, const TArray& a_points ); + UFUNCTION(BlueprintCallable, Category = "UI") + class USkillWidget* NewSkill(USkillWidget* a_skill, bool controller = false); + UFUNCTION(BlueprintCallable, Category = "UI") + class USkillWidget* NewSkillFromAsset(UBaseSkillObject* skillAsset, bool controller = false); + UFUNCTION(BlueprintCallable, Category = "UI") + void CancelSkill( USkillWidget* a_skill ); + + void UpdateLevel( float level ); + UFUNCTION(BlueprintCallable, Category = "UI") + void UpdateInfo( float skilltreeHeight, float skilltreeOffset ); + + UFUNCTION(BlueprintCallable, Category="UI") + void Show(); + UFUNCTION(BlueprintCallable, Category="UI") + void Hide(); + + UPROPERTY( EditDefaultsOnly, BlueprintReadOnly, Category = UI ) + TSubclassOf WidgetTemplate; + + // Callback for when the skill tree state changes + DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnSkillTreeChanged, ESkillTreeChangeEvent, event, UBaseSkillObject*, object); + UPROPERTY(BlueprintAssignable) + FOnSkillTreeChanged onSkillTreeChanged; + + virtual void NativeOnSkillTreeChanged(ESkillTreeChangeEvent event, UBaseSkillObject* relevantObject); + + USkillTreeWidget( const FObjectInitializer& init ); + + virtual void NativeConstruct() override; + virtual void NativeDestruct() override; + virtual void NativeTick(const FGeometry& MyGeometry, float DeltaTime) override; + virtual FReply NativeOnMouseButtonUp(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) override; + virtual FReply NativeOnMouseButtonDown(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) override; + virtual FReply NativeOnMouseWheel(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) override; +}; diff --git a/Source/UnrealProject/GUI/SkillTree/SkillWidget.cpp b/Source/UnrealProject/GUI/SkillTree/SkillWidget.cpp new file mode 100644 index 0000000..41fe7f9 --- /dev/null +++ b/Source/UnrealProject/GUI/SkillTree/SkillWidget.cpp @@ -0,0 +1,843 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "SkillWidget.h" +#include "BaseSkillObject.h" +#include "SkillTreeObject.h" +#include "HexagonTile.h" +#include "CanvasPanel.h" +#include "Border.h" +#include "SkillTreeWidget.h" +#include "HexagonTile.h" +#include "WidgetLayoutLibrary.h" +#include "AbilityInfo.h" +#include "SizeBorder.h" +#include "MenuScreenBase.h" + +int32 roundToNearestOdd(float a_in) +{ + return 2 * FMath::FloorToInt(a_in / 2) + 1; +} + +int32 roundToNearestEven(float a_in) +{ + return 2 * FMath::FloorToInt(a_in / 2); +} + +//Convert from Odd-q coordinate system to Cube. +FIntVector Oddq2Cube( FIntPoint in ) +{ + int32 x = in.X; + int32 z = int32( float( in.Y ) - float( in.X - ( in.X & 1 ) ) / 2.0f ); + int32 y = -x - z; + return FIntVector( x, y, z ); +} + +//Convert from Cube coordinate system to Odd-q. +FIntPoint Cube2Oddq( FIntVector in ) +{ + int32 x = in.X; + int32 y = int32( float( in.Z ) + float( in.X - ( in.X & 1 ) ) / 2.0f ); + return FIntPoint( x, y ); +} + +//Convert from Even-q coordinate system to Cube. +FIntVector Evenq2Cube( FIntPoint in ) +{ + int32 x = in.X; + int32 z = int32( float( in.Y ) - float( in.X + ( in.X & 1 ) ) / 2.0f ); + int32 y = -x - z; + return FIntVector( x, y, z ); +} + +//Convert from Cube coordinate system to Even-q. +FIntPoint Cube2Evenq( FIntVector in ) +{ + int32 x = in.X; + int32 y = int32( float( in.Z ) + float( in.X + ( in.X & 1 ) ) / 2.0f ); + return FIntPoint( x, y ); +} + +//Rotates a hexoganal position by the angle. +//The position must be in Cube coordinates. +//The angle must be in degrees. +FIntVector RotateHexPos( FIntVector in, float angle ) +{ + while ( angle < 0 ) + { + angle += 360; + } + while ( angle > 360 ) + { + angle -= 360; + } + int32 steps = FMath::FloorToInt( angle / 60 ); + FIntVector result = in; + for ( int32 i = 0; i < steps; i++ ) + { + FIntVector tmp = FIntVector( -result.Z, -result.X, -result.Y ); + result = tmp; + } + return result; +} + +//Rotates a hexoganal position by the angle. +//The position must be in Odd-q or Even-q coordinates. +//The OddQ boolean decides what coordinate system is used. +//The angle must be in degrees. +FIntPoint RotateHexPos( FIntPoint in, float angle, bool oddq ) +{ + FIntVector cubeIn; + if ( oddq ) + cubeIn = Oddq2Cube( in ); + else + cubeIn = Evenq2Cube( in ); + + FIntVector cubeOut = RotateHexPos( cubeIn, angle ); + + FIntPoint Out; + if ( oddq ) + Out = Cube2Oddq( cubeOut ); + else + Out = Cube2Evenq( cubeOut ); + return Out; +} + +void USkillWidget::PlaceOnGridIndex(FVector2D index) +{ + m_lastGridIndex = index /*+ FVector2D(1.5, 4) * RenderTransform.Scale.X*/; + UCanvasPanelSlot* tmpSlot = UWidgetLayoutLibrary::SlotAsCanvasSlot(parent->GetCanvas()); + float viewportScale = UWidgetLayoutLibrary::GetViewportScale(parent); + FVector2D topLeft = GetSkillTreePos(); + float scale = 32.0f * (RenderTransform.Scale.X / 2); + float XScale = (scale * 1.73205f); + float YScale = scale; + if(tmpSlot) + { + FVector2D result; + result.X = index.X * XScale; + result.X += topLeft.X; + //result.X -= 2; + result.Y = index.Y * YScale; + result.Y += topLeft.Y; + //result.Y += 14.5f; + + UCanvasPanelSlot* selfSlot = UWidgetLayoutLibrary::SlotAsCanvasSlot(this); + selfSlot->SetPosition(result); + + placedPoints.SetNum(0); + CheckPosition(m_lastGridIndex, &placedPoints); + ChangeColor(GetShapeTypeColor()); + } +} + +void USkillWidget::SetPlaced() +{ + m_dragable = true; + m_placed = true; +} + +void USkillWidget::UpdateSkill() +{ + m_hexagons.Empty(); + if ( !skillAsset ) + { + //YWARNING( "No Skill Asset assigned to the Skill Widget." ); + SetVisibility( ESlateVisibility::Hidden ); + return; + } + SetVisibility(ESlateVisibility::SelfHitTestInvisible); + TArray widgets; + WidgetTree->GetAllWidgets( widgets ); + UCanvasPanel* canvasPanel = NULL; + + FLinearColor color = GetShapeTypeColor(); + + for ( int32 i = 0; i < widgets.Num(); i++ ) + { + UHexagonTile* tmp = Cast( widgets[i] ); + UCanvasPanel* tmpPanel = Cast( widgets[i] ); + if ( tmpPanel ) canvasPanel = tmpPanel; + if ( !tmp ) continue; + bool test = skillAsset->hexMap.Get( tmp->x, tmp->y ); + //tmp->SetColorAndOpacity( skillColor ); + m_hexagons.Push( tmp ); + if ( !test ) + { + tmp->SetVisibility(ESlateVisibility::Hidden); + } + else + { + tmp->SetVisibility(ESlateVisibility::SelfHitTestInvisible); + } + } + if (!m_dragable) + { + UpdateLevel(0); + } + if ( canvasPanel ) + { + m_canvasPanel = canvasPanel; + UCanvasPanelSlot* slot = Cast( canvasPanel->Slot ); + if ( slot ) + { + m_slot = slot; + float offset = 1.0f; + float width = ( skillAsset->hexMap.width * 27.7128f ) + 4.2871f; + FVector2D newSize = FVector2D(width, ( (skillAsset->hexMap.height * 32.0f) - offset )); + m_slot->SetSize(newSize); + //GWPRINT(L"Size of " + skillAsset->GetName() + L"(placed=" + m_placed + L") = " + newSize); + } + if ( m_dragable ) + { + FVector2D transformPivot; + transformPivot.X = ( float( skillAsset->pivot.X ) + 0.5f ) / float( skillAsset->hexMap.width ); + transformPivot.Y = ( float( skillAsset->pivot.Y ) + ( ( skillAsset->pivot.X & 1 ) ? 1.0f : 0.5f ) ) / float( skillAsset->hexMap.height ); + canvasPanel->SetRenderTransformPivot( transformPivot ); + //YPRINT( "Pivot: X=" + transformPivot.X + ", Y=" + transformPivot.Y ); + } + } + UCanvasPanel* mainCanvas = WidgetTree->FindWidget("Main_Canvas"); + if ( m_dragable ) + { + //m_spacer->SetVisibility( ESlateVisibility::Hidden ); + SetRenderScale( parent->WidgetTree->FindWidget("Main_SkillTree")->RenderTransform.Scale ); + } + else + { + //m_spacer->SetVisibility( ESlateVisibility::Visible ); + SetRenderScale( FVector2D( 1, 1 ) ); + } + //float scale = RenderTransform.Scale.X - 1.0f; + //float alignment = ( m_dragable ) ? (-scale * 0.5f) : 0.5f; + //FVector2D alignment2D ( alignment, alignment ); + //tmpSlot->SetAlignment( alignment2D ); + + if ( m_dragable && !m_controller ) + { + FVector2D mousePos; + UWidgetLayoutLibrary::GetMousePositionScaledByDPI( GetOwningPlayer(), mousePos.X, mousePos.Y ); + FVector2D skillPos; + skillPos = mousePos - ( m_slot->GetSize() / 2 ); + UCanvasPanelSlot* tmpSlot2 = Cast( Slot ); + if ( tmpSlot2 ) + { + tmpSlot2->SetPosition( skillPos ); + } + if(!m_placed) + StartDragging(); + else + { + FVector2D position = GetViewportPos(); + FVector2D mousePos; + UWidgetLayoutLibrary::GetMousePositionScaledByDPI(GetOwningPlayer(), mousePos.X, mousePos.Y); + m_offset = position - mousePos; + } + m_offset = -( ( m_slot->GetSize() * (RenderTransform.Scale.X / 2) ) / 2); + } + else if (m_controller) + { + StartDragging(); + } + + // Update color of hexagons + UpdateSkillIcon(); + ChangeColor(color); +} + +void USkillWidget::NativeConstruct() +{ + selectedEffect = -1; + hovered = false; + UpdateSkill(); + FIntPoint point( 0, 1 ); + FIntPoint a = RotateHexPos( point, 60, false ); + //YPRINT( "60: X:" + a.X + ", Y:" + a.Y ); + /* + FIntPoint b = RotateHexPos( point, 120 ); + YPRINT( "120: X:" + b.X + ", Y:" + b.Y ); + FIntPoint c = RotateHexPos( point, 180 ); + YPRINT( "180: X:" + c.X + ", Y:" + c.Y ); + FIntPoint d = RotateHexPos( point, 240 ); + YPRINT( "240: X:" + d.X + ", Y:" + d.Y ); + FIntPoint e = RotateHexPos( point, 300 ); + YPRINT( "300: X:" + e.X + ", Y:" + e.Y ); + FIntPoint f = RotateHexPos( point, -60 ); + YPRINT( "-60: X:" + f.X + ", Y:" + f.Y ); + FIntPoint g = RotateHexPos( point, -120 ); + YPRINT( "-120: X:" + g.X + ", Y:" + g.Y ); + FIntPoint h = RotateHexPos( point, -180 ); + YPRINT( "-180: X:" + h.X + ", Y:" + h.Y ); + */ + + //m_border = WidgetTree->FindWidget("Border"); + //m_border->SetVisibility(ESlateVisibility::Hidden); + + Super::NativeConstruct(); +} + +void USkillWidget::NativeDestruct() +{ + Super::NativeDestruct(); +} + +void USkillWidget::UpdateSkillColor() +{ + FLinearColor color; + if(m_dragging) + { + bool hover = CheckPosition(m_lastGridIndex); + if(hover) + { + m_hovering = true; + color = FLinearColor(0, 1, 0, 1); + if(!GetSelectedEffectAbility()) + color = FLinearColor::Yellow; + } + else + { + m_hovering = false; + color = FLinearColor(1, 0, 0, 1); + } + + } + else + { + color = GetShapeTypeColor(); + } + ChangeColor(color); +} + +void USkillWidget::UpdateSkillIcon() +{ + for(int32 i = 0; i < m_hexagons.Num(); i++) + { + if(m_hexagons[i]->material) + { + m_hexagons[i]->material->SetTextureParameterValue("Skill_Texture", m_skillIcon); + } + } +} + +void USkillWidget::SetSelectedEffect(int32 effect) +{ + //UpdateSkill(); + + if(effect >= 0 && effect < skillAsset->abilityEffects.Num()) + { + selectedEffect = effect; + + // Set icon on hexagons + UAbilityInfo* ability = skillAsset->abilityEffects[selectedEffect]; + if(ability) + { + m_skillIcon = ability->icon; + } + } + + // Update material + UpdateSkillIcon(); + UpdateSkillColor(); +} + +class UAbilityInfo* USkillWidget::GetSelectedEffectAbility() const +{ + if(selectedEffect >= 0 && selectedEffect < skillAsset->abilityEffects.Num()) + { + return skillAsset->abilityEffects[selectedEffect]; + } + return nullptr; +} + +void USkillWidget::Select() +{ + //if ( !m_spacer ) return; + //m_spacer->SetBrushColor( FLinearColor( 1, 1, 1, 0.68f ) ); + //parent->DeselectOther( this ); + //m_selected = true; + //UWidgetLayoutLibrary::GetMousePositionScaledByDPI( GetOwningPlayer(), m_mousedownPos.X, m_mousedownPos.Y ); +} + +void USkillWidget::Deselect() +{ + //if ( !m_spacer ) return; + //m_spacer->SetBrushColor( FLinearColor( 0, 0, 0, 0.68f ) ); + //m_selected = false; +} + +void USkillWidget::Remove() +{ + parent->RemoveSkill(this, placedPoints); +} + +bool USkillWidget::RestartDragging() +{ + if (parent->draggingWidget) + return false; + + parent->RemoveSkill(this, placedPoints); + SetDragable(true, true); + SetUserFocus(GetOwningPlayer()); + + parent->draggingWidget = this; + + m_hovering = true; + ChangeColor(FLinearColor(0, 1, 0, 1)); + return true; +} + +void USkillWidget::StartDragging() +{ + if(!m_dragging && parent->draggingWidget == nullptr && parent->IsInteractive()) + { + m_dragging = true; + FVector2D position = GetViewportPos(); + FVector2D mousePos; + UWidgetLayoutLibrary::GetMousePositionScaledByDPI(GetOwningPlayer(), mousePos.X, mousePos.Y); + m_offset = position - mousePos; + if(m_placed) parent->RemoveSkill(this, placedPoints); + m_placed = false; + parent->StartDragging(this); + OnStartDragging(); + } + //YPRINT( "Start... (X: " + position.X + ", Y: " + position.Y + ")" ); +} + +bool USkillWidget::PlaceSkill() +{ + // Check if we have selected a valid effect + bool canPlace = true; + bool effectAssigned = GetSelectedEffectAbility() != nullptr; + //if(m_controller && !effectAssigned) + // canPlace = false; + if(skillAsset->abilityEffects.Num() == 0) + { + GERROR("Skill has no ability effects assigned, " + skillAsset->GetName()); + canPlace = false; + } + + TArray points; + placedPoints.Empty(); + if(!CheckPosition(m_lastGridIndex, &points)) + canPlace = false; + + if(canPlace) + { + placedPoints = points; + parent->AddSkill(this, points); + m_placed = true; + ChangeColor(GetShapeTypeColor()); + parent->StopDragging(this); + + if(m_controller) + { + GetScreen()->CloseSubMenu(this); + } + + m_dragging = false; + if(!effectAssigned) + { + OnRequireSkillEffect(); + } + + OnPlaceDone(true); + return true; + } + else if(!m_controller) + { + // Using mouse + parent->CancelSkill(this); + parent->StopDragging(this); + OnPlaceDone(false); + return false; + } + else + { + OnPlaceDone(false); + return false; + } +} + +void USkillWidget::StopDragging() +{ + if(m_dragging) + { + FVector2D mousePos; + UWidgetLayoutLibrary::GetMousePositionScaledByDPI(GetOwningPlayer(), mousePos.X, mousePos.Y); + FVector2D newPos = mousePos + m_offset; + FVector4 gridresult = GetGridPos(newPos); + FVector2D gridPos = FVector2D(gridresult.X, gridresult.Y); + FVector2D gridIndex = FVector2D(gridresult.Z, gridresult.W); + m_dragging = false; + PlaceSkill(); + } +} + +FVector2D USkillWidget::GetPositionFromIndex(FIntPoint in) +{ + FVector2D result; + UCanvasPanelSlot* tmpSlot = UWidgetLayoutLibrary::SlotAsCanvasSlot(parent->GetCanvas()); + float viewportScale = UWidgetLayoutLibrary::GetViewportScale(parent); + FVector2D topLeft = GetSkillTreePos(); + float scale = 32.0f * ( RenderTransform.Scale.X / 2); + float XScale = (scale * 1.73205f); + float YScale = scale; + //FVector2D magicOffset = FVector2D(1.5, 4) * RenderTransform.Scale.X; + float XIndex = (float)in.X;// -magicOffset.X; + float YIndex = (float)in.Y;// -magicOffset.Y; + result.X = XIndex * XScale + topLeft.X; + result.Y = YIndex * YScale + topLeft.Y; + return result; +} + +FVector2D USkillWidget::GetSkillTreePos() +{ + UCanvasPanelSlot* tmpSlot = UWidgetLayoutLibrary::SlotAsCanvasSlot(parent->GetCanvas()); + float viewportScale = UWidgetLayoutLibrary::GetViewportScale(parent->GetCanvas()); + FVector2D topLeft; + if (tmpSlot) + { + FVector2D screenTopRight = FVector2D(GEngine->GameViewport->Viewport->GetSizeXY().X * tmpSlot->GetAnchors().Minimum.X, GEngine->GameViewport->Viewport->GetSizeXY().Y * tmpSlot->GetAnchors().Minimum.Y); + FVector2D offset = tmpSlot->GetPosition() * viewportScale; + FVector2D widgetTopLeft = ((tmpSlot->GetSize() * RenderTransform.Scale.X * viewportScale) / 2) ; + topLeft = screenTopRight + offset - widgetTopLeft; + topLeft /= viewportScale; + //topLeft.X -= 16.0f; + } + return topLeft; +} + +FVector2D USkillWidget::GetViewportPos() +{ + FVector2D result; + FVector2D position; + UCanvasPanelSlot* tmpSlot = Cast( Slot ); + if ( tmpSlot ) + { + position = tmpSlot->GetPosition( ); + } + result.X = position.X; + result.Y = position.Y; + return result; +} + +FVector4 USkillWidget::GetGridPos( FVector2D in ) +{ + FVector2D result; + FVector2D topLeft = GetSkillTreePos(); + float scale = 32.0f * (RenderTransform.Scale.X / 2); + float XScale = (scale * 1.73205f); + float YScale = scale; + int32 XIndex = FMath::FloorToInt( ( in.X - topLeft.X ) / XScale ); + int32 YIndex = FMath::FloorToInt( ( in.Y - topLeft.Y ) / YScale ); + if ( XIndex % 2 == 0 ) + YIndex = roundToNearestOdd( YIndex ); + else + YIndex = roundToNearestEven(YIndex); + result.X = XIndex * XScale; + result.X += topLeft.X; + result.Y = YIndex * YScale; + result.Y += topLeft.Y; + m_lastGridIndex = FVector2D(XIndex, YIndex) - FVector2D(1, 0);// Store last grid position + return FVector4(result.X , result.Y , XIndex, YIndex); +} + +bool USkillWidget::CheckPosition(FVector2D in, TArray* points) +{ + bool result = true; + TArray localPoints; + //Check if positions are valid and available. + for ( int32 x1 = 0; x1 < skillAsset->hexMap.width; x1++ ) + { + for ( int32 y1 = 0; y1 < skillAsset->hexMap.height; y1++ ) + { + if ( skillAsset->hexMap.Get( x1, y1 ) ) + { + int32 x2 = FMath::FloorToInt( in.X ); + int32 y2; + int32 angle = FMath::FloorToInt( m_canvasPanel->RenderTransform.Angle ); + FIntPoint pos1 = RotateHexPos( FIntPoint( x1 - skillAsset->pivot.X, y1 - skillAsset->pivot.Y ), angle, !(skillAsset->pivot.X & 1) ); + pos1.X += skillAsset->pivot.X; + pos1.Y += skillAsset->pivot.Y; + if ( FMath::FloorToInt( in.X ) % 2 != 0 && pos1.X % 2 != 0 ) + y2 = FMath::FloorToInt( ( in.Y + 1 ) / 2 ); + else + y2 = FMath::FloorToInt( in.Y / 2 ); + FIntPoint pos2 = pos1 + FIntPoint( x2, y2 ); + localPoints.Push( pos2 ); + + if (pos2.X < 0 || pos2.X >= 13 || pos2.Y < 0 || pos2.Y >= ( (pos2.X & 1) ? 15 : 16 ) || parent->skillTreeAsset->hexMap.Get(pos2.X, pos2.Y) || parent->placedSkillHexMap->Get(pos2.X, pos2.Y)) + { + result = false; + if ( !points ) + { + break; + } + } + } + } + if ( !result && !points ) break; + } + if ( points ) ( *points ) = localPoints; + + /* + for ( int32 i = 0; i < parent->tiles.Num(); i++ ) + { + bool test = true; + for ( int32 j = 0; j < points.Num(); j++ ) + { + if ( parent->tiles[i]->x == points[j].X && parent->tiles[i]->y == points[j].Y ) + { + parent->tiles[i]->SetColorAndOpacity( FLinearColor::Yellow ); + parent->tiles[i]->SetVisibility( ESlateVisibility::Visible ); + test = false; + break; + } + } + if ( test ) + { + if ( !parent->skillTreeAsset->hexMap.Get( parent->tiles[i]->x, parent->tiles[i]->y ) ) + { + parent->tiles[i]->SetColorAndOpacity( FLinearColor::White ); + parent->tiles[i]->SetVisibility( ESlateVisibility::Visible ); + } + else + { + parent->tiles[i]->SetColorAndOpacity( FLinearColor::White ); + parent->tiles[i]->SetVisibility( ESlateVisibility::Hidden ); + } + } + } + */ + return result; +} + +void USkillWidget::SetSkillRotation(float angle) +{ + if(m_canvasPanel) m_canvasPanel->SetRenderAngle(angle); + else YWARNING("No canvas panel found!"); + NativeOnSkillMove(); + OnRotate(); +} + +void USkillWidget::MoveSkill(FVector2D offset) +{ + //Check if odd + FVector2D tmpOffset = offset; + if (((int32)m_lastGridIndex.X) & 1 && tmpOffset.X != 0) tmpOffset.Y -= 1; + if (!(((int32)m_lastGridIndex.X) & 1) && tmpOffset.X != 0) tmpOffset.Y += 1; + m_lastGridIndex += tmpOffset; + + if(parent->lastGridIndex != m_lastGridIndex) + { + parent->lastGridIndex = m_lastGridIndex; // Store last index + NativeOnSkillMove(); + } +} + +void USkillWidget::MoveSkillAbsolute(FVector2D gridIndex) +{ + m_lastGridIndex = gridIndex; + parent->lastGridIndex = m_lastGridIndex; // Store last index + NativeOnSkillMove(); +} + +void USkillWidget::ChangeColor(FLinearColor color) +{ + for ( int32 i = 0; i < m_hexagons.Num(); i++ ) + { + if (m_hexagons[i]->material) m_hexagons[i]->material->SetVectorParameterValue("Skill_Color", color); + } +} + +void USkillWidget::UpdateLevel( float level ) +{ + if (!m_dragable) return; + for (int32 i = 0; i < m_hexagons.Num(); i++) + { + if( m_hexagons[i]->material ) m_hexagons[i]->material->SetScalarParameterValue("Skill_Level", level); + } + + float offset = 1.0f - level; + float skillHeight = 13.0f * offset; + float height = FMath::CeilToFloat(skillHeight); + int32 hexcount = 0; + + for (int32 i = 0; i < placedPoints.Num(); i++) + { + float YPos = ( placedPoints[i].X & 1 ) ? (float(placedPoints[i].Y) + 0.5f) : (float(placedPoints[i].Y)); + if ( YPos < height ) hexcount++; + } + + m_power = float(placedPoints.Num()) / float(hexcount); +} + +void USkillWidget::UpdateInfo(float skilltreeHeight, float skilltreeOffset) +{ + for (int32 i = 0; i < m_hexagons.Num(); i++) + { + if (m_hexagons[i]->material) + { + m_hexagons[i]->material->SetScalarParameterValue("Skill_Tree_Height", skilltreeHeight); + m_hexagons[i]->material->SetScalarParameterValue("Skill_Offset", skilltreeOffset); + } + } +} + +TArray USkillWidget::ConnectedSkills(TArray& points) +{ + //Check if surrounding positions contain another skill. + //if ( !PointsCointainsRoot(localPoints)) + //{ + TArray result; + const FIntPoint offsets[2][6]{ + { FIntPoint(0, -1), FIntPoint(1, -1), FIntPoint(1, 0), FIntPoint(0, 1), FIntPoint(-1, 0), FIntPoint(-1, -1) }, + { FIntPoint(0, -1), FIntPoint(1, 0), FIntPoint(1, 1), FIntPoint(0, 1), FIntPoint(-1, 1), FIntPoint(-1, 0) } }; + for (int32 i = 0; i < points.Num(); i++) + { + int32 k = points[i].X & 1; + for (int32 j = 0; j < 6; j++) + { + FIntPoint checkPoint = points[i] + offsets[k][j]; + if ( points.Contains( checkPoint ) ) continue; + if (parent->skillTreeAsset->hexMap.Get(checkPoint.X, checkPoint.Y)) continue; + if (parent->placedSkillHexMap->Get(checkPoint.X, checkPoint.Y)) + { + USkillWidget* widget = *parent->tileMap.Find(checkPoint); + if (result.Contains(widget)) continue; + result.Push(widget); + } + } + } + return result; + //} +} + +bool USkillWidget::ContainsRoot(TArray& points) +{ + return PointsCointainsRoot(points); +} + +TArray USkillWidget::GetPoints() +{ + TArray points; + CheckPosition(m_lastGridIndex, &points); + return points; +} + +bool USkillWidget::PointsCointainsRoot( TArray& points ) +{ + for ( int32 i = 0; i < points.Num(); i++ ) + { + if ( points[i] == parent->rootPoint ) return true; + } + return false; +} + +void USkillWidget::NativeOnSkillMove() +{ + UpdateSkillColor(); + + OnMove(); +} + +void USkillWidget::NativeTick( const FGeometry& geometry, float deltaTime ) +{ + FVector2D mousePos; + UWidgetLayoutLibrary::GetMousePositionScaledByDPI(GetOwningPlayer(), mousePos.X, mousePos.Y); + + if ( m_dragging && !m_controller ) + { + FVector2D newPos = mousePos + m_offset; + + UCanvasPanelSlot* tmpSlot = Cast( Slot ); + if ( tmpSlot ) + { + FVector4 gridresult = GetGridPos( newPos ); + FVector2D gridPos = FVector2D( gridresult.X, gridresult.Y ); + FVector2D gridIndex = FVector2D( gridresult.Z, gridresult.W ); + if(gridPos != m_lastGridPos) + { + NativeOnSkillMove(); + m_lastGridPos = gridPos; + } + } + else + YWARNING( "Couldn't get Slot." ); + } + else if( !m_dragging ) + { + if (hovered) + { + ChangeColor(GetShapeTypeColor() * 2.0f); + } + else + { + ChangeColor(GetShapeTypeColor() * 0.5f); + } + if(parent->draggingWidget == this) + parent->StopDragging(this); + } + if ( m_selected && m_enabled) + { + FVector2D mousePos; + UWidgetLayoutLibrary::GetMousePositionScaledByDPI( GetOwningPlayer(), mousePos.X, mousePos.Y ); + FVector2D distanceVect = mousePos - m_mousedownPos; + if ( distanceVect.SizeSquared() > 100 ) + { + parent->NewSkill( this ); + m_selected = false; + } + } + + UCanvasPanelSlot* tmpSlot = UWidgetLayoutLibrary::SlotAsCanvasSlot(parent->GetCanvas()); + if (m_dragable) + { + float scale = 32.0f * (RenderTransform.Scale.X / 2); + float XScale = (scale * 1.73205f); + float YScale = scale; + + FVector2D topLeft = GetSkillTreePos(); + FVector2D result; + result.X = (m_lastGridIndex.X) * XScale; + result.X += topLeft.X; + result.Y = (m_lastGridIndex.Y) * YScale; + result.Y += topLeft.Y; + + UCanvasPanelSlot* selfSlot = UWidgetLayoutLibrary::SlotAsCanvasSlot(this); + if (selfSlot) + { + selfSlot->SetPosition(result); + } + } + + Super::NativeTick( geometry, deltaTime ); +} + +FLinearColor USkillWidget::GetShapeTypeColor() const +{ + if(selectedEffect == -1) + return FLinearColor(1.0f, 1.0f, 1.0f) * 1.0f; // Hwhite + + static FLinearColor shapeTypeColors[] = + { + FLinearColor(0.1f, 1.0f, 0.3f) * 0.75f, // Green + FLinearColor(1.0f, 0.3f, 0.1f) * 0.6f, // Red-Ish + FLinearColor(0.0f, 0.0f, 1.0f) * 0.6f, // Blue + }; + + int32 idx = 0; + if(skillAsset) + { + idx = (int32)skillAsset->abilityEffects[selectedEffect]->abilityCategory; + } + idx = FMath::Clamp(idx, 0, 2); + return FLinearColor(shapeTypeColors[idx].R, shapeTypeColors[idx].G, shapeTypeColors[idx].B, 1.0f); +} + +void USkillWidget::SetDragable(bool dragable, bool controller /*= false */) +{ + m_controller = controller; + m_dragable = dragable; + UpdateSkill(); +} diff --git a/Source/UnrealProject/GUI/SkillTree/SkillWidget.h b/Source/UnrealProject/GUI/SkillTree/SkillWidget.h new file mode 100644 index 0000000..dc7cd80 --- /dev/null +++ b/Source/UnrealProject/GUI/SkillTree/SkillWidget.h @@ -0,0 +1,191 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "SubMenu.h" +#include "SkillWidget.generated.h" + +/** + * + */ +class UBaseSkillObject; +class UBorder; +class USkillTreeWidget; +class UHexagonTile; + +UCLASS() +class UNREALPROJECT_API USkillWidget : public USubMenu +{ + GENERATED_BODY() +private: + //Variables + + //Skill State + bool m_dragable = false; + bool m_dragging = false; + bool m_selected = false; + bool m_enabled = true; + bool m_hovering = false; + bool m_placed = false; + bool m_controller = false; + //SKill Widget pointers + UCanvasPanelSlot* m_slot; + UCanvasPanel* m_canvasPanel; + //Positions + FVector2D m_mousedownPos; + FVector2D m_offset; + FVector2D m_lastGridIndex; + FVector2D m_lastGridPos; + FVector2D m_hexSize; + + UPROPERTY() + UTexture2D* m_skillIcon; + + //Hexagons + TArray m_hexagons; + float m_power; + + //Functions + bool PointsCointainsRoot( TArray& points ); +public: + //Variables + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "UI" ) + UBaseSkillObject* skillAsset; + + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "UI") + USkillTreeWidget* parent; + + UPROPERTY(BlueprintReadOnly, Category = "UI") + bool hovered; + + UPROPERTY(BlueprintReadOnly) + int32 selectedEffect; + + UPROPERTY(BlueprintReadWrite, Category = "UI") + FVector2D tooltipAreaPosition; + UPROPERTY(BlueprintReadWrite, Category = "UI") + FVector2D tooltipAreaSize; + + TArray placedPoints; + + UFUNCTION(BlueprintCallable, Category = "UI") + bool IsUsingController() const { return m_controller; } + + void UpdateSkillColor(); + void UpdateSkillIcon(); + + // Checks if a point is contained in on of the hexagons of this skill + bool ContainsPoint(FVector2D screenPoint); + // Checks if the mouse is contained within one of the hexagons + bool ContainsMouse(); + + // Updates the selected effect for this skill widget + void SetSelectedEffect(int32 effect); + // Return the ability info class selected by this skill widget + class UAbilityInfo* GetSelectedEffectAbility() const; + + UFUNCTION(BlueprintImplementableEvent, Category = "UI") + void OnRequireSkillEffect(); + UFUNCTION(BlueprintImplementableEvent, Category = "UI") + void OnPlaceDone(bool successful); + UFUNCTION(BlueprintImplementableEvent, Category = "UI") + void OnStartDragging(); + UFUNCTION(BlueprintImplementableEvent, Category = "UI") + void OnRotate(); + UFUNCTION(BlueprintImplementableEvent, Category = "UI") + void OnMove(); + + UFUNCTION( BlueprintCallable, Category = "UI" ) + void Select(); + UFUNCTION( BlueprintCallable, Category = "UI" ) + void Release() + { + m_selected = false; + }; + void Deselect(); + void Enable() + { + m_enabled = true; + ChangeColor( FLinearColor( 0.1216f, 0.9569f, 1.0f ) ); + } + void Disable() + { + m_enabled = false; + ChangeColor( FLinearColor::Gray ); + } + UFUNCTION(BlueprintCallable, Category = "UI") + void UpdateSkill(); + UFUNCTION(BlueprintCallable, Category = "UI") + bool GetEnabled() + { + return m_enabled; + } + FVector2D GetSkillTreePos(); + FVector2D GetViewportPos(); + FVector4 GetGridPos( FVector2D in ); + FVector2D GetPositionFromIndex(FIntPoint in); + bool CheckPosition( FVector2D in, TArray* points = NULL ); + UFUNCTION( BlueprintCallable, Category = "UI" ) + void StartDragging(); + UFUNCTION( BlueprintCallable, Category = "UI" ) + void StopDragging(); + + FVector2D GetGridIndex() const + { + return m_lastGridIndex; + } + void PlaceOnGridIndex(FVector2D index); + void SetPlaced(); + void NativeOnSkillMove(); + UFUNCTION(BlueprintCallable, Category = "UI") + bool PlaceSkill(); + UFUNCTION(BlueprintCallable, Category = "UI") + void Remove(); + UFUNCTION(BlueprintCallable, Category = "UI") + bool RestartDragging(); + + FLinearColor GetShapeTypeColor() const; + + UFUNCTION(BlueprintCallable, Category = "UI") + void SetDragable( bool dragable, bool controller = false ); + UFUNCTION( BlueprintCallable, Category = "UI" ) + bool GetDragable() + { + return m_dragable; + } + UFUNCTION( BlueprintCallable, Category = "UI" ) + bool GetDragging() + { + return m_dragging; + } + UFUNCTION( BlueprintCallable, Category = "UI" ) + void SetSkillRotation( float angle ); + UFUNCTION( BlueprintCallable, Category = "UI" ) + float GetSkillRotation() + { + if ( m_canvasPanel ) return m_canvasPanel->RenderTransform.Angle; + else YWARNING("No canvas panel found!"); + return 0; + } + UFUNCTION(BlueprintCallable, Category = "UI") + void MoveSkill(FVector2D offset); + UFUNCTION(BlueprintCallable, Category = "UI") + void MoveSkillAbsolute(FVector2D gridIndex); + + float GetPower() + { + return m_power; + } + + void ChangeColor( FLinearColor color ); + void UpdateLevel( float level ); + UFUNCTION(BlueprintCallable, Category = "UI") + void UpdateInfo( float skilltreeHeight, float skilltreeOffset ); + bool ContainsRoot(TArray& points); + TArray ConnectedSkills(TArray& points); + TArray GetPoints(); + + virtual void NativeConstruct() override; + virtual void NativeDestruct() override; + virtual void NativeTick( const FGeometry& geometry, float deltaTime ) override; +}; diff --git a/Source/UnrealProject/GUI/SkillTree/SpellInfo.cpp b/Source/UnrealProject/GUI/SkillTree/SpellInfo.cpp new file mode 100644 index 0000000..5d21371 --- /dev/null +++ b/Source/UnrealProject/GUI/SkillTree/SpellInfo.cpp @@ -0,0 +1,65 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "SpellInfo.h" +#include "DefaultPlayerController.h" + +USpellInfo::USpellInfo(const FObjectInitializer& init) + : Super(init) +{ + showDuration = 1.0f; +} + +void USpellInfo::NativeTick(const FGeometry& MyGeometry, float InDeltaTime) +{ + m_life -= InDeltaTime; + if(m_life <= 0.0f) + { + RemoveFromParent(); + } + + Super::NativeTick(MyGeometry, InDeltaTime); +} + +void USpellInfo::Set(class UAbilityInfo* info, int32 level, float power, class USpellInfoDisplay* parent) +{ + m_ability = info; + m_parent = parent; + m_life = showDuration; + m_level = level; + m_power = power; + + ADefaultPlayerController* pc = Cast(GetOwningPlayer()); + int32 slot; + bool alt; + if(pc && pc->GetAbilityButtonLocation(info, slot, alt)) + { + SetButtonHint(slot, alt); + } + + int32 lastLevel = pc->GetCurrentAbilityLevel(m_ability); + + OnSetAbility(info, lastLevel == 0); +} + +float USpellInfo::GetLifeTimeRate() const +{ + return (float)m_life / (float)showDuration; +} + +int32 USpellInfo::GetLevel() const +{ + return m_level; +} +float USpellInfo::GetPower() const +{ + return m_power; +} + +void USpellInfo::SetButtonHint_Implementation(int32 buttonSlot, bool alt) +{ +} + +void USpellInfo::OnSetAbility_Implementation(class UAbilityInfo* info, bool isNew) +{ +} diff --git a/Source/UnrealProject/GUI/SkillTree/SpellInfo.h b/Source/UnrealProject/GUI/SkillTree/SpellInfo.h new file mode 100644 index 0000000..f51d5f5 --- /dev/null +++ b/Source/UnrealProject/GUI/SkillTree/SpellInfo.h @@ -0,0 +1,42 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Blueprint/UserWidget.h" +#include "SpellInfo.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API USpellInfo : public UUserWidget +{ + GENERATED_BODY() +public: + USpellInfo(const FObjectInitializer& init); + void NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override; + + UFUNCTION(BlueprintCallable, Category="GUI") + void Set(class UAbilityInfo* info, int32 level, float power, class USpellInfoDisplay* parent); + UFUNCTION(BlueprintCallable, Category = "GUI") + float GetLifeTimeRate() const; + UFUNCTION(BlueprintCallable, Category = "Ability") + int32 GetLevel() const; + UFUNCTION(BlueprintCallable, Category = "Ability") + float GetPower() const; + + UFUNCTION(BlueprintNativeEvent) + void OnSetAbility(class UAbilityInfo* info, bool isNew); + UFUNCTION(BlueprintNativeEvent) + void SetButtonHint(int32 buttonSlot, bool alt); + + UPROPERTY(EditDefaultsOnly) + float showDuration; + +private: + UAbilityInfo* m_ability; + class USpellInfoDisplay* m_parent; + float m_life; + int32 m_level; + float m_power; +}; diff --git a/Source/UnrealProject/GUI/SkillTree/SpellInfoDisplay.cpp b/Source/UnrealProject/GUI/SkillTree/SpellInfoDisplay.cpp new file mode 100644 index 0000000..48c17b0 --- /dev/null +++ b/Source/UnrealProject/GUI/SkillTree/SpellInfoDisplay.cpp @@ -0,0 +1,36 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "SpellInfoDisplay.h" +#include "BaseSkillObject.h" +#include "SpellInfo.h" + +void USpellInfoDisplay::NativeConstruct() +{ + m_container = Cast(WidgetTree->FindWidget("Container")); +} + +void USpellInfoDisplay::OnLevelUp(class ANetworkPlayer* _player, TArray updatedSkills) +{ + if (!m_container) + return; + + player = _player; + + for (int32 i = 0; i < updatedSkills.Num(); i++) + { + USpellInfo* info = CreateWidget(GetWorld(), spellInfoClass); + UPanelSlot* slot = m_container->AddChild(info); + if (Cast(slot)) + { + Cast(slot)->SetHorizontalAlignment(HAlign_Right); + } + else if(Cast(slot)) + { + UVerticalBoxSlot* vslot = Cast(slot); + vslot->SetHorizontalAlignment(HAlign_Left); + Cast(slot)->SetVerticalAlignment(VAlign_Fill); + } + info->Set(updatedSkills[i].selectedEffect, updatedSkills[i].level, updatedSkills[i].power, this); + } +} diff --git a/Source/UnrealProject/GUI/SkillTree/SpellInfoDisplay.h b/Source/UnrealProject/GUI/SkillTree/SpellInfoDisplay.h new file mode 100644 index 0000000..f2cfdc8 --- /dev/null +++ b/Source/UnrealProject/GUI/SkillTree/SpellInfoDisplay.h @@ -0,0 +1,29 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Blueprint/UserWidget.h" +#include "IngameSkillTree.h" +#include "SpellInfoDisplay.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API USpellInfoDisplay : public UUserWidget +{ + GENERATED_BODY() + +public: + void NativeConstruct() override; + void OnLevelUp(class ANetworkPlayer* player, TArray updatedSkills); + + UPROPERTY(BlueprintReadWrite) + ANetworkPlayer* player; + + UPROPERTY(EditDefaultsOnly) + TSubclassOf spellInfoClass; + +private: + UPanelWidget* m_container; +}; diff --git a/Source/UnrealProject/GUI/Submenus/CharacterDependentSubMenus.cpp b/Source/UnrealProject/GUI/Submenus/CharacterDependentSubMenus.cpp new file mode 100644 index 0000000..39ed129 --- /dev/null +++ b/Source/UnrealProject/GUI/Submenus/CharacterDependentSubMenus.cpp @@ -0,0 +1,61 @@ +#include "UnrealProject.h" +#include "CharacterDependentSubMenus.h" +#include "DefaultGameInstance.h" +#include "CharacterSubMenu.h" +#include "CharacterCarousel.h" +#include "EffectSelector.h" +#include "SkillWidget.h" + +void UCharacterDependentSubMenu::OnEnter(class UMenuScreenBase* screen) +{ + // Find character menu + auto submenus = screen->GetSubMenus(); + for(int32 i = submenus.Num() - 1; i >= 0; i--) + { + if(submenus[i]->IsA()) + { + characterSubMenu = Cast(submenus[i]); + characterCarousel = characterSubMenu->GetCarousel(); + displayCharacter = characterCarousel->GetCharacterModel(characterCarousel->selectedCharacterIndex); + } + } + + Super::OnEnter(screen); +} + +void UCharacterDependentSubMenu::OnSuspend(USubMenu* newSubMenu, bool loseFocus) +{ + USkillWidget* sw = Cast(newSubMenu); + UEffectSelector* es = Cast(newSubMenu); + if(es || sw) + USubMenu::OnSuspend(newSubMenu, loseFocus); // Prevent menu panel animations + else + Super::OnSuspend(newSubMenu, loseFocus); +} +void UCharacterDependentSubMenu::OnRestore(USubMenu* removedMenu) +{ + USkillWidget* sw = Cast(removedMenu); + UEffectSelector* es = Cast(removedMenu); + if(es || sw) + USubMenu::OnRestore(removedMenu); // Prevent menu panel animations + else + Super::OnRestore(removedMenu); +} + +FCharacterSave UCharacterDependentSubMenu::GetCharacterSave() const +{ + static FCharacterSave dummy; + if(!characterCarousel) + return dummy; + UDefaultGameInstance* inst = Cast(GetGameInstance()); + UCharacterSettings* settings = inst->GetCharacterSettings(); + return settings->characterSaves[characterCarousel->selectedCharacterIndex]; +} +void UCharacterDependentSubMenu::SetCharacterSave(const FCharacterSave& save) +{ + if(!characterCarousel) + return; + UDefaultGameInstance* inst = Cast(GetGameInstance()); + UCharacterSettings* settings = inst->GetCharacterSettings(); + settings->characterSaves[characterCarousel->selectedCharacterIndex] = save; +} diff --git a/Source/UnrealProject/GUI/Submenus/CharacterDependentSubMenus.h b/Source/UnrealProject/GUI/Submenus/CharacterDependentSubMenus.h new file mode 100644 index 0000000..fa0b4b0 --- /dev/null +++ b/Source/UnrealProject/GUI/Submenus/CharacterDependentSubMenus.h @@ -0,0 +1,50 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "MenuScreen.h" +#include "CharacterSettings.h" +#include "CharacterDependentSubMenus.generated.h" + +UCLASS() +class UCharacterDependentSubMenu : public UMenuPanel +{ + GENERATED_BODY() +public: + virtual void OnEnter(class UMenuScreenBase* screen) override; + + virtual void OnSuspend(USubMenu* newSubMenu, bool loseFocus) override; + virtual void OnRestore(USubMenu* removedMenu) override; + + UPROPERTY(BlueprintReadOnly, Category = "Skill Tree Sub Menu") + class UCharacterSubMenu* characterSubMenu; + UPROPERTY(BlueprintReadOnly, Category = "Skill Tree Sub Menu") + class ACharacterCarousel* characterCarousel; + // Curently displayed character in the menu + UPROPERTY(BlueprintReadOnly, Category = "Skill Tree Sub Menu") + class ACharacterBase* displayCharacter; + + UFUNCTION(BlueprintCallable, Category = "Skill Tree Sub Menu") + FCharacterSave GetCharacterSave() const; + UFUNCTION(BlueprintCallable, Category = "Skill Tree Sub Menu") + void SetCharacterSave(const FCharacterSave& save); +}; + +UCLASS() +class UCustomizationSubMenu : public UCharacterDependentSubMenu +{ + GENERATED_BODY() +public: +}; +UCLASS() +class USkillTreeSubMenu : public UCharacterDependentSubMenu +{ + GENERATED_BODY() +public: +}; +UCLASS() +class USkillSelectByAbilitySubMenu : public UCharacterDependentSubMenu +{ + GENERATED_BODY() +public: +}; \ No newline at end of file diff --git a/Source/UnrealProject/GUI/Submenus/CharacterSubMenu.cpp b/Source/UnrealProject/GUI/Submenus/CharacterSubMenu.cpp new file mode 100644 index 0000000..bd781ed --- /dev/null +++ b/Source/UnrealProject/GUI/Submenus/CharacterSubMenu.cpp @@ -0,0 +1,164 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "CharacterSubMenu.h" +#include "MenuButton.h" +#include "CharacterCarousel.h" +#include "MenuController.h" +#include "DefaultGameInstance.h" +#include "CharacterSettings.h" +#include "SkillTreeWidget.h" +#include "CharacterBase.h" + +TSubclassOf carouselClass; + +UCharacterSubMenu::UCharacterSubMenu(const FObjectInitializer& init) +{ + carouselClass = ConstructorHelpers::FClassFinder(L"/Game/Assets/Blueprints/CharacterCarousel/BP_CharacterCarousel").Class; +} + +void UCharacterSubMenu::NativeConstruct() +{ + // Get carousel spawn pos + FTransform carouselSpawnTransform; + for(TActorIterator it(GetWorld()); it; ++it) + { + if((*it)->PlayerStartTag == "Carousel") + carouselSpawnTransform = (*it)->GetTransform(); + } + + m_carousel = GetWorld()->SpawnActor(carouselClass, carouselSpawnTransform); + + // Initialize the characters + for(int32 i = 0; i < m_carousel->GetCharacterNum(); i++) + m_UpdateCharacter(i); + + Super::NativeConstruct(); + + m_nextButton = AddButton("Next"); + m_nextButton->onPressed.AddDynamic(this, &UCharacterSubMenu::m_Next); + m_prevButton = AddButton("Previous"); + m_prevButton->onPressed.AddDynamic(this, &UCharacterSubMenu::m_Prev); + m_editButton = AddButton("Edit"); + m_editButton->onPressed.AddDynamic(this, &UCharacterSubMenu::m_Edit); + m_newButton = AddButton("New"); + m_newButton->onPressed.AddDynamic(this, &UCharacterSubMenu::m_New); + m_deleteButton = AddButton("Delete"); + m_deleteButton->onPressed.AddDynamic(this, &UCharacterSubMenu::m_Delete); + m_backButton = AddButton("Back"); + m_backButton->onPressed.AddDynamic(this, &UCharacterSubMenu::m_Back); + SetBackButton(m_backButton); +} + +void UCharacterSubMenu::NativeDestruct() +{ + Super::NativeDestruct(); + m_carousel->Destroy(); +} + +void UCharacterSubMenu::UpdateCurrentCharacter() +{ + if(m_carousel) + { + m_UpdateCharacter(m_carousel->selectedCharacterIndex); + } +} + +FCharacterClassProperty UCharacterClassPropertySet::GetCharacterClass(int32 classID) const +{ + static FCharacterClassProperty dummy; + if(classes.Num() > 0) + { + return classes[FMath::Clamp(classID, 0, classes.Num() - 1)]; + } + return dummy; +} + +FCharacterClassProperty UCharacterSubMenu::GetCharacterClass(int32 classID) const +{ + return characterClassProperties->GetCharacterClass(classID); +} + +TArray UCharacterSubMenu::GetClassAbilities() const +{ + TArray res; + if(characterClassProperties) + { + for(auto cls : characterClassProperties->classes) + { + res.Add(cls.basicAttack); + } + } + return res; +} + +void UCharacterSubMenu::m_Next() +{ + m_carousel->Next(); +} +void UCharacterSubMenu::m_Prev() +{ + m_carousel->Previous(); +} +void UCharacterSubMenu::m_New() +{ + m_carousel->CreateNewCharacter(FString("New Character ") + FString::FromInt(m_carousel->GetCharacterNum()+1)); + m_UpdateCharacter(m_carousel->GetCharacterNum() - 1); +} +void UCharacterSubMenu::m_Delete() +{ + if(m_carousel->GetCharacterNum() > 0) + m_carousel->DeleteCharacter(m_carousel->selectedCharacterIndex); +} +void UCharacterSubMenu::m_Edit() +{ + TArray options; options.Add("OK"); + if(m_carousel->GetCharacterNum() > 0) + { + // Make this the active character + AMenuController* controller = Cast(GetOwningPlayer()); + UDefaultGameInstance* inst = Cast(GetGameInstance()); + + // Get save game + FCharacterSave& save = inst->GetCharacterSettings()->characterSaves[m_carousel->selectedCharacterIndex]; + controller->skillTree->BuildFromState(save.skillTreeState); + + OnEditCharacter(); + } + else + { + ShowMessageBox(FOverlayItemClosed(), "Error", "There are no characters", options, ""); + } +} +void UCharacterSubMenu::m_Back() +{ + CloseSubMenu(); +} + +void UCharacterSubMenu::m_UpdateCharacter(int32 index) +{ + // Make this the active character + AMenuController* controller = Cast(GetOwningPlayer()); + UDefaultGameInstance* inst = Cast(GetGameInstance()); + + // Get save game + FCharacterSave& save = inst->GetCharacterSettings()->characterSaves[index]; + + ACharacterBase* character = m_carousel->GetCharacterModel(index); + if(character) + { + character->SetCustomizations(save.characterCustomization); + character->EquipSkillsFromSkillTreeState(save.skillTreeState); + + // Set class specific equipment + if(characterClassProperties) + { + FCharacterClassProperty properties = characterClassProperties->GetCharacterClass(save.characterClass); + character->EquipItems(properties.classItems); + } + } + else + { + GERROR("Can't update character " + index + ", it does not have a character model."); + } +} diff --git a/Source/UnrealProject/GUI/Submenus/CharacterSubMenu.h b/Source/UnrealProject/GUI/Submenus/CharacterSubMenu.h new file mode 100644 index 0000000..ec2b6fa --- /dev/null +++ b/Source/UnrealProject/GUI/Submenus/CharacterSubMenu.h @@ -0,0 +1,65 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GUI/Menu/MenuScreen.h" +#include "PlayerSetupState.h" +#include "CharacterSubMenu.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API UCharacterSubMenu : public UMenuPanel +{ + GENERATED_BODY() + +public: + UCharacterSubMenu(const FObjectInitializer& init); + virtual void NativeConstruct() override; + virtual void NativeDestruct() override; + + UFUNCTION(BlueprintCallable, Category = "Character Sub Menu") + void UpdateCharacter(int32 charIndex) { m_UpdateCharacter(index); } + UFUNCTION(BlueprintCallable, Category = "Character Sub Menu") + void UpdateCurrentCharacter(); + + UFUNCTION(BlueprintImplementableEvent, Category = "Character Sub Menu") + void OnEditCharacter(); + + UPROPERTY(BlueprintReadOnly, EditDefaultsOnly, Category = "Character Sub Menu") + class UCharacterClassPropertySet* characterClassProperties; + + UFUNCTION(BlueprintCallable, Category = "Character Class") + FCharacterClassProperty GetCharacterClass(int32 classID) const; + + UFUNCTION(BlueprintCallable, Category = "Character Class") + TArray GetClassAbilities() const; + + class ACharacterCarousel* GetCarousel() const { return m_carousel; } + +private: + UFUNCTION() + void m_Next(); + UFUNCTION() + void m_Prev(); + UFUNCTION() + void m_New(); + UFUNCTION() + void m_Delete(); + UFUNCTION() + void m_Back(); + UFUNCTION() + void m_Edit(); + + void m_UpdateCharacter(int32 index); + + class UMenuButton* m_nextButton; + class UMenuButton* m_prevButton; + class UMenuButton* m_newButton; + class UMenuButton* m_deleteButton; + class UMenuButton* m_backButton; + class UMenuButton* m_editButton; + + class ACharacterCarousel* m_carousel; +}; diff --git a/Source/UnrealProject/GUI/Submenus/CustomizationSubMenu.cpp b/Source/UnrealProject/GUI/Submenus/CustomizationSubMenu.cpp new file mode 100644 index 0000000..e1a6387 --- /dev/null +++ b/Source/UnrealProject/GUI/Submenus/CustomizationSubMenu.cpp @@ -0,0 +1,5 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "CharacterDependentSubMenus.h" + diff --git a/Source/UnrealProject/GUI/Submenus/SkillBrowserSubMenu.cpp b/Source/UnrealProject/GUI/Submenus/SkillBrowserSubMenu.cpp new file mode 100644 index 0000000..89d8214 --- /dev/null +++ b/Source/UnrealProject/GUI/Submenus/SkillBrowserSubMenu.cpp @@ -0,0 +1,114 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "SkillBrowserSubMenu.h" +#include "MenuController.h" +#include "SkillTreeWidget.h" +#include "SkillTreeObject.h" +#include "BaseSkillObject.h" +#include "SkillWidget.h" + +void USkillBrowserItem::NativeConstruct() +{ + Super::NativeConstruct(); +} + +void USkillBrowserItem::NativeTick(const FGeometry& MyGeometry, float InDeltaTime) +{ + Super::NativeTick(MyGeometry, InDeltaTime); + + if(skillTree->IsUsingSkill(skillObject)) + { + this->SetIsEnabled(false); + } + else + { + this->SetIsEnabled(true); + } +} +void USkillBrowserItem::Init(UAbilityInfo* info) +{ + ability = info; + OnInit(); +} + +void USkillBrowserItem::NativeOnSelectionChanged(bool selected, bool controller) +{ + Super::NativeOnSelectionChanged(selected, controller); + if(selected && category && controller) + { + UScrollBox* sb = Cast(category->Slot->Parent); + if(sb) + { + sb->ScrollWidgetIntoView(category); + } + } +} + +void USkillBrowserItem::NativeOnPressed(bool controllerInput) +{ + Super::NativeOnPressed(controllerInput); + + if(!GetIsEnabled()) + return; + + USkillWidget* wdg = skillTree->NewSkillFromAsset(skillObject, controllerInput); + wdg->SetSelectedEffect(skillObject->abilityEffects.IndexOfByKey(ability)); + if(controllerInput) + GetSubMenu()->GetScreen()->OpenSubMenu(wdg); +} + +void USkillBrowserSubMenu::NativeConstruct() +{ + m_skillItemContainer = Cast(WidgetTree->FindWidget("ItemContainer")); + AMenuController* menuController = Cast(GetOwningPlayer()); + USkillTreeWidget* skillTree = menuController->skillTree; + USkillTreeObject* skObject = skillTree->skillTreeAsset; + + for(int32 i = 0; i < skObject->skills.Num(); i++) + { + UBaseSkillObject* skill = skObject->skills[i]->GetDefaultObject(); + + // Create a category item + USkillBrowserItemCategory* categoryItem = CreateWidget(GetWorld(), itemCategoryClass); + if(!categoryItem) + { + GERROR("Failed to create skill browser item category"); + continue; + } + + m_skillItemContainer->AddChild(categoryItem); + categoryItem->skillObject = skill; + + // Add all the abilities to this category + for(int32 j = 0; j < skill->abilityEffects.Num(); j++) + { + UAbilityInfo* effect = skill->abilityEffects[j]; + if(!effect) + continue; + USkillBrowserItem* item = CreateWidget(GetWorld(), itemClass); + if(!item) + { + GERROR("Failed to create skill browser item"); + continue; + } + item->skillObject = skill; + item->skillTree = skillTree; + item->category = categoryItem; + categoryItem->itemContainer->AddChild(item); + + // Call init on ability item + item->Init(effect); + } + + // Call init on category + categoryItem->OnInit(); + } + + Super::NativeConstruct(); +} + +void USkillBrowserItemCategory::NativeConstruct() +{ + itemContainer = Cast(WidgetTree->FindWidget("ItemContainer")); +} diff --git a/Source/UnrealProject/GUI/Submenus/SkillBrowserSubMenu.h b/Source/UnrealProject/GUI/Submenus/SkillBrowserSubMenu.h new file mode 100644 index 0000000..11ab81e --- /dev/null +++ b/Source/UnrealProject/GUI/Submenus/SkillBrowserSubMenu.h @@ -0,0 +1,67 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "CharacterDependentSubMenus.h" +#include "MenuButton.h" +#include "SkillBrowserSubMenu.generated.h" + +UCLASS() +class UNREALPROJECT_API USkillBrowserItemCategory : public UPanelUserWidget +{ + GENERATED_BODY() +public: + void NativeConstruct() override; + + UFUNCTION(BlueprintImplementableEvent) + void OnInit(); + + UPROPERTY(BlueprintReadOnly) + class UBaseSkillObject* skillObject; + + UPanelWidget* itemContainer; +}; + +UCLASS() +class UNREALPROJECT_API USkillBrowserItem : public UMenuButton +{ + GENERATED_BODY() +public: + void NativeConstruct() override; + void NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override; + void Init(UAbilityInfo* info); + void NativeOnSelectionChanged(bool selected, bool controller) override; + + virtual void NativeOnPressed(bool controllerInput) override; + + UFUNCTION(BlueprintImplementableEvent) + void OnInit(); + + UPROPERTY(BlueprintReadOnly) + class USkillBrowserItemCategory* category; + UPROPERTY(BlueprintReadOnly) + class USkillTreeWidget* skillTree; + UPROPERTY(BlueprintReadOnly) + class UAbilityInfo* ability; + UPROPERTY(BlueprintReadOnly) + class UBaseSkillObject* skillObject; + +private: +}; + +UCLASS() +class UNREALPROJECT_API USkillBrowserSubMenu : public UCharacterDependentSubMenu +{ + GENERATED_BODY() +public: + void NativeConstruct() override; + + UPROPERTY(EditDefaultsOnly) + TSubclassOf itemClass; + + UPROPERTY(EditDefaultsOnly) + TSubclassOf itemCategoryClass; + +private: + UPanelWidget* m_skillItemContainer; +}; diff --git a/Source/UnrealProject/GUI/Submenus/SkillTreeSubMenu.cpp b/Source/UnrealProject/GUI/Submenus/SkillTreeSubMenu.cpp new file mode 100644 index 0000000..e1a6387 --- /dev/null +++ b/Source/UnrealProject/GUI/Submenus/SkillTreeSubMenu.cpp @@ -0,0 +1,5 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "CharacterDependentSubMenus.h" + diff --git a/Source/UnrealProject/GUI/ToolTip/ToolTipText.cpp b/Source/UnrealProject/GUI/ToolTip/ToolTipText.cpp new file mode 100644 index 0000000..9916ae3 --- /dev/null +++ b/Source/UnrealProject/GUI/ToolTip/ToolTipText.cpp @@ -0,0 +1,14 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "ToolTipText.h" + + +void UToolTipText::SetTitle_Implementation(const FString& title) +{ + +} +void UToolTipText::SetText_Implementation(const FString& text) +{ + +} \ No newline at end of file diff --git a/Source/UnrealProject/GUI/ToolTip/ToolTipText.h b/Source/UnrealProject/GUI/ToolTip/ToolTipText.h new file mode 100644 index 0000000..5cfe77c --- /dev/null +++ b/Source/UnrealProject/GUI/ToolTip/ToolTipText.h @@ -0,0 +1,27 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Blueprint/UserWidget.h" +#include "ToolTipText.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API UToolTipText : public UUserWidget +{ + GENERATED_BODY() + + +public: + UPROPERTY(BlueprintReadWrite, Category = "ToolTip") + class USizeBox* sizeBox; + + UFUNCTION(BlueprintNativeEvent, Category = "ToolTip") + void SetTitle(const FString& title); + + UFUNCTION(BlueprintNativeEvent, Category = "ToolTip") + void SetText(const FString& text); + +}; diff --git a/Source/UnrealProject/GUI/ToolTip/ToolTipWidget.cpp b/Source/UnrealProject/GUI/ToolTip/ToolTipWidget.cpp new file mode 100644 index 0000000..00c1f4b --- /dev/null +++ b/Source/UnrealProject/GUI/ToolTip/ToolTipWidget.cpp @@ -0,0 +1,108 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "ToolTipWidget.h" +#include "ToolTipText.h" +#include "WidgetLayoutLibrary.h" + + +void UToolTipWidget::NativeConstruct() +{ + Super::NativeConstruct(); + + m_toolTip = CreateWidget(GetWorld(), textWidget); + canvas->AddChild(m_toolTip); + m_toolTip->SetVisibility(ESlateVisibility::Hidden); + + showTooltip = false; +} +void UToolTipWidget::NativeDestruct() +{ + Super::NativeDestruct(); +} + +void UToolTipWidget::NativeTick(const FGeometry& geometry, float deltaTime) +{ + Super::NativeTick(geometry, deltaTime); + + if (!showTooltip) + { + m_toolTip->SetVisibility(ESlateVisibility::Hidden); + } + else + { + UWorld* const world = GetWorld(); + if (!IsValid(world)) return; + + const FVector2D screenSize = FVector2D(world->GetGameViewport()->Viewport->GetSizeXY().X, world->GetGameViewport()->Viewport->GetSizeXY().Y); + const float viewportScale = UWidgetLayoutLibrary::GetViewportScale(this); + + m_toolTip->SetVisibility(ESlateVisibility::Visible); + + FVector2D currentPos = position + size + FVector2D(5, 5); + + if ((currentPos.X + m_toolTip->GetDesiredSize().X) * viewportScale >= screenSize.X) + currentPos.X = position.X - 5 - m_toolTip->GetDesiredSize().X; + if ((currentPos.Y + m_toolTip->GetDesiredSize().Y) * viewportScale >= screenSize.Y) + currentPos.Y = position.Y - 5 - m_toolTip->GetDesiredSize().Y; + + UCanvasPanelSlot* const slot = Cast(m_toolTip->Slot); + slot->SetPosition(currentPos); + slot->SetSize(m_toolTip->GetDesiredSize()); + } + + //UWorld* const world = GetWorld(); + //if (!IsValid(world)) return; + // + //FVector2D mousePos; + //const FVector2D screenSize = FVector2D(world->GetGameViewport()->Viewport->GetSizeXY().X, world->GetGameViewport()->Viewport->GetSizeXY().Y); + //const float viewportScale = UWidgetLayoutLibrary::GetViewportScale(this); + //if (UWidgetLayoutLibrary::GetMousePositionScaledByDPI(GetOwningPlayer(), mousePos.X, mousePos.Y)) + //{ + // for (int32 i = 0; i < m_handles.Num(); i++) + // { + // FToolTipHandle& handle = *m_handles[i]; + // UToolTipText& toolTip = *handle.m_toolTip; + // + // FVector2D triggerTopLeft; + // FVector2D triggerSize; + // const FVector2D scaledMouse = mousePos * viewportScale; + // const FVector2D scaledSize = handle.size * viewportScale; + // const FVector2D scaledPosition = handle.position * viewportScale; + // + // triggerTopLeft = handle.position; + // triggerSize = handle.size; + // + // mousePos = (scaledMouse - scaledPosition) / scaledSize; + // + // if (!(mousePos.X >= 0 && mousePos.X <= 1 && mousePos.Y >= 0 && mousePos.Y <= 1)) + // { + // toolTip.SetVisibility(ESlateVisibility::Hidden); + // return; + // } + // + // UCanvasPanelSlot* const slot = Cast(toolTip.Slot); + // + // toolTip.SetVisibility(ESlateVisibility::Visible); + // + // FVector2D currentPos = triggerTopLeft + triggerSize + FVector2D(5, 5); + // + // if ((currentPos.X + toolTip.GetDesiredSize().X) * viewportScale >= screenSize.X) + // currentPos.X = triggerTopLeft.X - 5 - toolTip.GetDesiredSize().X; + // if ((currentPos.Y + toolTip.GetDesiredSize().Y) * viewportScale >= screenSize.Y) + // currentPos.Y = triggerTopLeft.Y - 5 - toolTip.GetDesiredSize().Y; + // + // slot->SetPosition(currentPos); + // slot->SetSize(toolTip.GetDesiredSize()); + // } + //} +} + +void UToolTipWidget::SetTitle(const FString& title) +{ + m_toolTip->SetTitle(title); +} +void UToolTipWidget::SetText(const FString& text) +{ + m_toolTip->SetText(text); +} \ No newline at end of file diff --git a/Source/UnrealProject/GUI/ToolTip/ToolTipWidget.h b/Source/UnrealProject/GUI/ToolTip/ToolTipWidget.h new file mode 100644 index 0000000..784e54f --- /dev/null +++ b/Source/UnrealProject/GUI/ToolTip/ToolTipWidget.h @@ -0,0 +1,37 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Blueprint/UserWidget.h" +#include "ToolTipWidget.generated.h" + +/** + * + */ + +UCLASS() +class UNREALPROJECT_API UToolTipWidget : public UUserWidget +{ + GENERATED_BODY() + +public: + virtual void NativeConstruct(); + virtual void NativeDestruct(); + virtual void NativeTick(const FGeometry& geometry, float deltaTime) override; + + UPROPERTY(EditAnywhere, Category = "ToolTip") + TSubclassOf textWidget; + + UPROPERTY(BlueprintReadWrite, Category = "ToolTip") + class UCanvasPanel* canvas; + + bool showTooltip; + FVector2D position; + FVector2D size; + + void SetTitle(const FString& title); + void SetText(const FString& text); + +private: + class UToolTipText* m_toolTip; +}; diff --git a/Source/UnrealProject/GUI/TransitionScreen.cpp b/Source/UnrealProject/GUI/TransitionScreen.cpp new file mode 100644 index 0000000..9975c38 --- /dev/null +++ b/Source/UnrealProject/GUI/TransitionScreen.cpp @@ -0,0 +1,8 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "TransitionScreen.h" + + + + diff --git a/Source/UnrealProject/GUI/TransitionScreen.h b/Source/UnrealProject/GUI/TransitionScreen.h new file mode 100644 index 0000000..42cd1b9 --- /dev/null +++ b/Source/UnrealProject/GUI/TransitionScreen.h @@ -0,0 +1,24 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Blueprint/UserWidget.h" +#include "TransitionScreen.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API UTransitionScreen : public UUserWidget +{ + GENERATED_BODY() +public: + // When this menu needs to be hidden + UFUNCTION(BlueprintImplementableEvent) + void OnShow(); + // When this menu needs to be shown + UFUNCTION(BlueprintImplementableEvent) + void OnHide(); + + +}; diff --git a/Source/UnrealProject/GameState/AbilityBindings.h b/Source/UnrealProject/GameState/AbilityBindings.h new file mode 100644 index 0000000..5928954 --- /dev/null +++ b/Source/UnrealProject/GameState/AbilityBindings.h @@ -0,0 +1,24 @@ +#ifdef ABILITY_OP +ABILITY_ATTACK(0, slot0) +ABILITY_OP(1, slot1) +ABILITY_OP(2, slot2) +ABILITY_OP(3, slot3) +ABILITY_OP(4, slot4) +ABILITY_OP(5, slot5) +ABILITY_OP(6, slot6) +ABILITY_OP(7, slot7) +ABILITY_OP(8, slot8) +#undef ABILITY_OP +#endif +#ifdef ABILITY_KEYBINDING_OP +ABILITY_KEYBINDING_OP("Attack", 0) +ABILITY_KEYBINDING_OP("CastAbility1",1) +ABILITY_KEYBINDING_OP("CastAbility2", 2) +ABILITY_KEYBINDING_OP("CastAbility3", 3) +ABILITY_KEYBINDING_OP("CastAbility4", 4) +ABILITY_KEYBINDING_OP("CastAbility5", 5) +ABILITY_KEYBINDING_OP("CastAbility6", 6) +ABILITY_KEYBINDING_OP("CastAbility7", 7) +ABILITY_KEYBINDING_OP("CastAbility8", 8) +#undef ABILITY_KEYBINDING_OP +#endif \ No newline at end of file diff --git a/Source/UnrealProject/GameState/DefaultGameInstance.cpp b/Source/UnrealProject/GameState/DefaultGameInstance.cpp new file mode 100644 index 0000000..a94a7cd --- /dev/null +++ b/Source/UnrealProject/GameState/DefaultGameInstance.cpp @@ -0,0 +1,557 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "Runtime/Engine/Classes/Engine/LocalPlayer.h" + +#if PLATFORM_SPECIFIC_WIN == 0 +// Include input manager for windows to allow DS4 controllers +#include "InputManager.hpp" +using namespace Input; +#endif + +#include "DefaultGameInstance.h" +#include "CharacterSettings.h" +#include "Prefs.h" +#include "PlayerControllerBase.h" +#include "ScreenOverlay.h" +#include "SessionManager.h" +#include "ScreenOverlay.h" + +#include "MapData.h" +#include "MapList.h" +#include + +// Replicates the exact same data structure as FWindowsCursor except with a public cursor handle member +#if PLATFORM_SPECIFIC_WIN == 0 +class FWindowsCursor1 : public ICursor +{ +public: + EMouseCursor::Type CurrentType; + HCURSOR CursorHandles[EMouseCursor::TotalCursorCount]; +}; +HCURSOR originalCursor; +void InitWindowsCursors() +{ + // Store original application cursor for editor + FWindowsCursor1* windowsCursor = (FWindowsCursor1*)FSlateApplication::Get().GetPlatformCursor().Get(); + originalCursor = windowsCursor->CursorHandles[EMouseCursor::Default]; + +} +void ShutdownWindowsCursors() +{ + // Reset original cursor, mainly for editor + FWindowsCursor1* windowsCursor = (FWindowsCursor1*)FSlateApplication::Get().GetPlatformCursor().Get(); + windowsCursor->CursorHandles[EMouseCursor::Default] = originalCursor; +} +HCURSOR LoadCustomCursor(const FString& path) +{ + FString parentPath = FPaths::GameDir(); + FString cursorPath = parentPath + "\\" + path; + + HCURSOR cursorHandle = LoadCursorFromFileW(*cursorPath); + return cursorHandle; +} +void SetApplicationCursor(HCURSOR cursor) +{ + FWindowsCursor1* windowsCursor = (FWindowsCursor1*)FSlateApplication::Get().GetPlatformCursor().Get(); + if(windowsCursor) + { + HCURSOR handleDst; + if(cursor != INVALID_HANDLE_VALUE) + { + handleDst = cursor; + } + else + { + handleDst = LoadCursor(GetModuleHandle(0), IDC_ARROW); + } + + // Overwrite default cursor that unreal sets hack + windowsCursor->CursorHandles[EMouseCursor::Default] = handleDst; + } +} +#endif + +static UMapList* mapList; +UDefaultGameInstance::UDefaultGameInstance() +{ + mapList = ConstructorHelpers::FObjectFinder(TEXT("/Game/Assets/Levels/MapList")).Object; + menuLevelPath = "/Game/Assets/Levels/Menu"; + splashScreenShown = false; + +} + +void UDefaultGameInstance::Init() +{ + m_characterSettings = nullptr; + LoadSettings(); + +#if PLATFORM_SPECIFIC_WIN == 0 + InitWindowsCursors(); + SetApplicationCursor(LoadCustomCursor("cursor.cur")); +#endif + Super::Init(); + + m_prefs = nullptr; + LoadPrefs(); + + m_LoadMaps(); + +#if PLATFORM_SPECIFIC_WIN == 0 + // Initialize TEA Input + Input::InputManager::Initialize(); + Input::InputManager::GetInstance()->SearchForJoystick(); + m_tickDelegateHandle = FTicker::GetCoreTicker().AddTicker(FTickerDelegate::CreateUObject(this, &UDefaultGameInstance::m_Tick), 0.016666667f); +#endif + + m_localPlayer = nullptr; + + // Create session manager + sessionManager = NewObject(this); + sessionManager->m_instance = this; +} + +bool UDefaultGameInstance::HandleOpenCommand(const TCHAR* Cmd, FOutputDevice& Ar, UWorld* InWorld) +{ + GPRINT("Open command -> " + FString(Cmd) + " [" + InWorld->GetFullName() + "]"); + APlayerControllerBase* pcb = Cast(GetFirstLocalPlayerController()); + if(pcb && Super::HandleOpenCommand(Cmd, Ar, InWorld)) + { + FString msg = FString("Opening level [") + Cmd + "]"; + pcb->overlay->ShowOverlay(msg); + return true; + } + return false; +} + +bool UDefaultGameInstance::m_Tick(float DeltaSeconds) +{ +#if PLATFORM_SPECIFIC_WIN == 0 + InputManager* inputManager = Input::InputManager::GetInstance(); + + inputManager->Update(); + if(!inputManager->joystick) + { + std::vector names = inputManager->GetJoystickNames(); + for(size_t i = 0; i < names.size(); i++) + { + inputManager->ConnectJoystickByIndex(i); + if(inputManager->joystick) + break; + } + } +#endif + return true; +} + + +void UDefaultGameInstance::Shutdown() +{ + FTicker::GetCoreTicker().RemoveTicker(m_tickDelegateHandle); + Super::Shutdown(); + +#if PLATFORM_SPECIFIC_WIN == 0 + ShutdownWindowsCursors(); + Input::InputManager::Cleanup(); +#endif + + sessionManager->Shutdown(); +} + +const FString levelPath = TEXT("/Game/Assets/Levels"); +void UDefaultGameInstance::m_LoadMaps() +{ + if (mapList) + { + for (int32 i = 0; i < mapList->mapList.Num(); i++) + { + UMapData* mapData = mapList->mapList[i]; + + FString name = mapData->GetName(); + wchar_t* nameStrPtr = name.GetCharArray().GetData(); + std::wstring nameStr = std::wstring(nameStrPtr, nameStrPtr + name.Len()); + + //GWPRINT(mapData->GetName() + L"\n" + mapData->GetPathName() + L"\n" + mapData->GetFullGroupName(false)); + + static std::wregex nameRx = std::wregex(L"I_([_a-zA-Z0-9]+)"); + std::wsmatch match; + + if (std::regex_match(nameStr, match, nameRx)) + { + std::wstring levelNameStr = match[1]; + FString matchingLevelName = FString(levelNameStr.c_str()); + mapData->pathToAsset = levelPath + FString(L"/") + matchingLevelName + FString(L".") + matchingLevelName; + mapData->pathToAsset = levelPath + FString(L"/") + matchingLevelName; + //GWPRINT(L"Level asset path: " + mapData->pathToAsset); + maps.Add(mapData); + mapsByLevelName.Add(matchingLevelName, mapData); + mapsByLevelPath.Add(mapData->pathToAsset, mapData); + } + else + { + GWERROR(L"Can't extract map name from level asset " + mapData->GetPathName()); + } + } + } +} + +ULocalPlayer* UDefaultGameInstance::CreateInitialPlayer(FString& OutError) +{ + m_localPlayer = Super::CreateInitialPlayer(OutError); + check(m_localPlayer); + //m_localNetID = m_localPlayer->GetPreferredUniqueNetId(); + //GWPRINT(L"Created local player " + m_localPlayer->GetName() + + // ", NetID = " + m_localNetID->ToDebugString()); + //check(m_localNetID.IsValid()); + + // Retrieve player name + //IOnlineIdentityPtr identity = m_onlineSystem->GetIdentityInterface(); + //playerID = identity->GetPlayerNickname(*m_localNetID); + //GWPRINT(L"Assigned player ID: " + playerID); + + //IOnlineFriendsPtr friends = m_onlineSystem->GetFriendsInterface(); + //if (friends.IsValid()) + //{ + // onReadFriendsListCompleteDelegate = FOnReadFriendsListComplete::CreateUObject(this, &UDefaultGameInstance::m_OnReadFriendsListCompleteDelegate); + // friends->ReadFriendsList(0, TEXT("Friends"), onReadFriendsListCompleteDelegate); + //} + + //ISteamFriends* steamFriends = steamIdentity->GetSteamFriendsPtr(); + //steamIdentity + //friends->GetLargeFriendAvatar() + //ISteamUser* user; + + //FOnlineIdentitySteam* steam = (FOnlineIdentitySteam*)*identity; + //class ISteamUser* steamUser = identity->Get + + return m_localPlayer; +} + +void UDefaultGameInstance::OnSessionUserInviteAccepted(const bool bWasSuccess, const int32 ControllerId, TSharedPtr Us, const FOnlineSessionSearchResult& res) +{ + sessionManager->AcceptUserInvite(bWasSuccess, ControllerId, Us, res); +} + +void UDefaultGameInstance::SaveSettings() +{ + if (m_characterSettings) + { + UCharacterSettings::Save(m_characterSettings); + } +} + +void UDefaultGameInstance::LoadSettings() +{ + m_characterSettings = UCharacterSettings::Load(); +} + +UCharacterSettings* UDefaultGameInstance::GetCharacterSettings() +{ + return m_characterSettings; +} + +void UDefaultGameInstance::SavePrefs() +{ + if (m_prefs) + { + UPrefs::Save(m_prefs); + } +} + +void UDefaultGameInstance::LoadPrefs() +{ + m_prefs = UPrefs::Load(); +} + +UPrefs* UDefaultGameInstance::GetPrefs() +{ + return m_prefs; +} + +UMapData* UDefaultGameInstance::GetCurrentLevelMapData() +{ + UWorld* world = GetWorld(); + check(world); + FString mapName = world->GetMapName(); + FString name1 = world->GetName(); + UMapData** res = mapsByLevelName.Find(name1); + if (res) + return *res; + return nullptr; +} + +class UMapData* UDefaultGameInstance::GetMapData(FString levelPath) +{ + FString first; + FString last; + if(!levelPath.Split("/", &first, &last, ESearchCase::IgnoreCase, ESearchDir::FromEnd)) + return nullptr; + + FString la, lb; + if(last.Split(".", &la, &lb)) + { + last = lb; + } + + levelPath = first + "/" + last; + + UMapData** res = mapsByLevelPath.Find(levelPath); + if(res) + return *res; + return nullptr; +} + +void UDefaultGameInstance::ShowNetworkError(const FString& msg) +{ + APlayerControllerBase* controller = Cast(GetFirstLocalPlayerController()); + check(controller); + + TArray options; + options.Add("OK"); + controller->overlay->ShowMessageBox("Network Error", msg, options); +} + +int32 UDefaultGameInstance::GetScalabilityQuality() +{ + const Scalability::FQualityLevels current = GEngine->GetGameUserSettings()->ScalabilityQuality; + + // Check if any we know + Scalability::FQualityLevels setting; + for (int32 i = 0; i < 4; i++) + { + setting.SetFromSingleQualityLevel(i); + if (current == setting) + return i; + } + + // Custom + return -1; +} +void UDefaultGameInstance::SetScalabilityQuality(int32 scalability) +{ + GEngine->GetGameUserSettings()->ScalabilityQuality.SetFromSingleQualityLevel(scalability); + GEngine->GetGameUserSettings()->ApplySettings(false); + GEngine->GetGameUserSettings()->SaveSettings(); + + m_prefs->usingCustomGraphicsSettings = false; + SavePrefs(); + + //if (GConfig) + //{ + // GConfig->SetInt( + // TEXT("ScalabilityGroups"), + // TEXT("sg.Preset"), + // scalability, + // GGameUserSettingsIni); + // GConfig->Flush(false, GGameUserSettingsIni); + //} +} + +static int32 GenerateResolutionQuality(int32 value) +{ + Scalability::FQualityLevels setting; + setting.SetFromSingleQualityLevel(value); + return setting.ResolutionQuality; +} +static int32 RevertResolutionQuality(int32 value) +{ + Scalability::FQualityLevels setting; + for (int32 i = 0; i < 4; i++) + { + setting.SetFromSingleQualityLevel(i); + if (setting.ResolutionQuality == value) + return i; + } + + return 0; +} +void UDefaultGameInstance::SetScalabilityQualityValues(int32 ResolutionQuality, int32 AntiAliasingQuality, int32 ShadowQuality, int32 PostProcessQuality, int32 TextureQuality, int32 EffectsQuality) +{ + Scalability::FQualityLevels setting; + setting.SetFromSingleQualityLevel(ResolutionQuality); + + setting.AntiAliasingQuality = AntiAliasingQuality; + setting.ShadowQuality = ShadowQuality; + setting.PostProcessQuality = PostProcessQuality; + setting.TextureQuality = TextureQuality; + setting.EffectsQuality = EffectsQuality; + + setting.ViewDistanceQuality = TextureQuality; + + GEngine->GetGameUserSettings()->ScalabilityQuality = setting; + GEngine->GetGameUserSettings()->ApplySettings(false); + GEngine->GetGameUserSettings()->SaveSettings(); + + m_prefs->usingCustomGraphicsSettings = true; + m_prefs->customGraphicsSettings[0] = ResolutionQuality; + m_prefs->customGraphicsSettings[1] = AntiAliasingQuality; + m_prefs->customGraphicsSettings[2] = ShadowQuality; + m_prefs->customGraphicsSettings[3] = PostProcessQuality; + m_prefs->customGraphicsSettings[4] = TextureQuality; + m_prefs->customGraphicsSettings[5] = EffectsQuality; + SavePrefs(); +} + +int32 UDefaultGameInstance::GetScalabilityQualityValue(EGraphicsSetting setting) +{ + const Scalability::FQualityLevels current = GEngine->GetGameUserSettings()->ScalabilityQuality; + + switch (int32(setting)) + { + case 0: return RevertResolutionQuality(current.ResolutionQuality); + case 1: return current.AntiAliasingQuality; + case 2: return current.ShadowQuality; + case 3: return current.PostProcessQuality; + case 4: return current.TextureQuality; + case 5: return current.EffectsQuality; + } + + return 0; +} +void UDefaultGameInstance::SetScalabilityQualityValue(EGraphicsSetting setting, int32 value) +{ + if (int32(setting) >= 6) + return; + + Scalability::FQualityLevels current = GEngine->GetGameUserSettings()->ScalabilityQuality; + + switch (int32(setting)) + { + case 0: current.ResolutionQuality = GenerateResolutionQuality(value); break; + case 1: current.AntiAliasingQuality = value; break; + case 2: current.ShadowQuality = value; break; + case 3: current.PostProcessQuality = value; break; + case 4: current.TextureQuality = value; break; + case 5: current.EffectsQuality = value; break; + } + + GEngine->GetGameUserSettings()->ScalabilityQuality = current; + GEngine->GetGameUserSettings()->ApplySettings(false); + GEngine->GetGameUserSettings()->SaveSettings(); + + m_prefs->usingCustomGraphicsSettings = true; + m_prefs->customGraphicsSettings[int32(setting)] = value; + SavePrefs(); +} + +void UDefaultGameInstance::SetupLoadingScreen() +{ + m_loadingScreen.bAutoCompleteWhenLoadingCompletes = true; + m_loadingScreen.WidgetLoadingScreen = FLoadingScreenAttributes::NewTestLoadingScreenWidget(); // <-- test screen that comes with + m_loadingScreen.MinimumLoadingScreenDisplayTime = 1.0f; + GetMoviePlayer()->SetupLoadingScreen(m_loadingScreen); +} + +/* +void UDefaultGameInstance::OnSessionUserInviteAccepted(const bool bWasSuccess, const int32 ControllerId, TSharedPtr< const FUniqueNetId > Us, const FOnlineSessionSearchResult& res) +{ + if (bWasSuccess) + { + m_JoinOnlineSession(res); + } + else + { + GWWARNING(L"OnSessionUserInviteAccepted was not successful"); + } +} +void UDefaultGameInstance::m_OnCreateSessionComplete(FName sessionName, bool successful) +{ + JWPRINT(L"OnCreateSessionComplete " + sessionName.ToString().GetCharArray().GetData() + L", " + successful); + + m_session->ClearOnCreateSessionCompleteDelegate_Handle(onCreateSessionCompleteDelegateHandle); + if (successful) + { + //onStartSessionCompleteDelegateHandle = m_session->AddOnStartSessionCompleteDelegate_Handle(onStartSessionCompleteDelegate); + //m_session->StartSession(sessionName); + FString options = FString("listen"); + + // Add additional game settings here + options += FString("?teamCount=") + FString::FromInt(hostMaxTeamCount); + + SetupLoadingScreen(); + UGameplayStatics::OpenLevel(GetWorld(), FName(hostLoadMap.GetCharArray().GetData()), true, options); + } + else + { + ShowNetworkError("Failed to create session"); + } +} +void UDefaultGameInstance::m_OnStartOnlineGameComplete(FName sessionName, bool successful) +{ + JWPRINT(L"OnStartOnlineGameComplete " + sessionName.ToString().GetCharArray().GetData() + L", " + successful); + + m_session->ClearOnStartSessionCompleteDelegate_Handle(onStartSessionCompleteDelegateHandle); + + if (successful) + { + FString options = FString("listen"); + + // Add additional game settings here + options += FString("?teamCount=") + FString::FromInt(hostMaxTeamCount); + + SetupLoadingScreen(); + UGameplayStatics::OpenLevel(GetWorld(), FName(hostLoadMap.GetCharArray().GetData()), true, options); + } + else + { + ShowNetworkError("Failed to start session"); + } +} +void UDefaultGameInstance::m_OnFindSessionsComplete(bool successful) //__attribute__((optnone)) +{ + + JWPRINT(L"OnFindSessionsComplete " + successful); + + m_operationInProgress = false; + if(m_findingOverlay) + { + m_findingOverlay->Close(); + m_findingOverlay = nullptr; + } + + m_session->ClearOnFindSessionsCompleteDelegate_Handle(onFindSessionsCompleteDelegateHandle); + + JPRINT("OnFindSessionsComplete: " + sessionSearch->SearchResults.Num() + " sessions"); + + if (sessionSearch->SearchResults.Num() > 0) + { + for (int32 SearchIdx = 0; SearchIdx < sessionSearch->SearchResults.Num(); SearchIdx++) + { + JWPRINT(SearchIdx + L", " + sessionSearch->SearchResults[SearchIdx].Session.OwningUserName); + } + } +} +void UDefaultGameInstance::m_OnJoinSessionComplete(FName sessionName, EOnJoinSessionCompleteResult::Type result) +{ + JWPRINT(L"OnStartOnlineGameComplete " + sessionName.ToString().GetCharArray().GetData() + L", " + int32(result)); + m_session->ClearOnJoinSessionCompleteDelegate_Handle(onJoinSessionCompleteDelegateHandle); + m_operationInProgress = false; + + if(result != EOnJoinSessionCompleteResult::Success) + { + ShowNetworkError(FString("Failed to join session, Error Code ") + FString::FromInt(result)); + SetGameJoined(); + return; + } + + APlayerController* const playerController = GetFirstLocalPlayerController(); + check(playerController); + + SetupLoadingScreen(); + playerController->ClientTravel(m_travelURL, ETravelType::TRAVEL_Absolute); +} +void UDefaultGameInstance::m_OnDestroySessionComplete(FName sessionName, bool successful) +{ + JWPRINT(L"OnDestroySessionComplete " + sessionName.ToString().GetCharArray().GetData() + L", " + successful); + + m_session->ClearOnDestroySessionCompleteDelegate_Handle(onDestroySessionCompleteDelegateHandle); + if(m_travelOnSessionDestroy) + { + UGameplayStatics::OpenLevel(GetWorld(), "/Game/Assets/Levels/Menu", true); + } +} +void UDefaultGameInstance::m_OnReadFriendsListCompleteDelegate(int32, bool, const FString&, const FString&) +{ + GPRINT("Got friends list"); +} +*/ \ No newline at end of file diff --git a/Source/UnrealProject/GameState/DefaultGameInstance.h b/Source/UnrealProject/GameState/DefaultGameInstance.h new file mode 100644 index 0000000..f25a965 --- /dev/null +++ b/Source/UnrealProject/GameState/DefaultGameInstance.h @@ -0,0 +1,107 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Engine/GameInstance.h" +#include "MoviePlayer.h" +#include "DefaultGameInstance.generated.h" + + +UENUM(BlueprintType) +enum class EGraphicsSetting : uint8 +{ + ResolutionQuality = 0, + AntiAliasingQuality, + ShadowQuality, + PostProcessQuality, + TextureQuality, + EffectsQuality, +}; + + +UCLASS() +class UNREALPROJECT_API UDefaultGameInstance : public UGameInstance +{ + GENERATED_BODY() + friend class USessionManager; +public: + UDefaultGameInstance(); + + virtual void Init() override; + virtual void Shutdown() override; + virtual bool HandleOpenCommand(const TCHAR* Cmd, FOutputDevice& Ar, UWorld* InWorld); + + virtual ULocalPlayer* CreateInitialPlayer(FString& OutError) override; + virtual void OnSessionUserInviteAccepted(const bool bWasSuccess, const int32 ControllerId, + TSharedPtr Us, const FOnlineSessionSearchResult& res) override; + + void ShowNetworkError(const FString& msg); + void SetupLoadingScreen(); + + UFUNCTION(BlueprintCallable, Category = "Save") + void SaveSettings(); + UFUNCTION(BlueprintCallable, Category = "Save") + void LoadSettings(); + UFUNCTION(BlueprintCallable, Category = "Save") + UCharacterSettings* GetCharacterSettings(); + UFUNCTION(BlueprintCallable, Category = "Prefs") + void SavePrefs(); + UFUNCTION(BlueprintCallable, Category = "Prefs") + void LoadPrefs(); + UFUNCTION(BlueprintCallable, Category = "Prefs") + UPrefs* GetPrefs(); + UFUNCTION(BlueprintCallable, Category = "Levels") + class UMapData* GetCurrentLevelMapData(); + UFUNCTION(BlueprintCallable, Category = "Levels") + class UMapData* GetMapData(FString levelPath); + + // Get overall graphics settings, returns -1 if the user is using custom + UFUNCTION(BlueprintCallable, Category = "Quality") + int32 GetScalabilityQuality(); + // Set overall graphics settings + UFUNCTION(BlueprintCallable, Exec, Category = "Quality") + void SetScalabilityQuality(int32 scalability); + // Set graphics settings from custom values, calling this will enable custom + UFUNCTION(BlueprintCallable, Category = "Quality") + void SetScalabilityQualityValues(int32 ResolutionQuality, int32 AntiAliasingQuality, int32 ShadowQuality, int32 PostProcessQuality, int32 TextureQuality, int32 EffectsQuality); + + // Get individual graphics value + UFUNCTION(BlueprintCallable, Exec, Category = "Quality") + int32 GetScalabilityQualityValue(EGraphicsSetting setting); + // Set individual graphics value + UFUNCTION(BlueprintCallable, Category = "Quality") + void SetScalabilityQualityValue(EGraphicsSetting setting, int32 value); + + // The class that manages online sessions and establishing connections to other clients + UPROPERTY(BlueprintReadOnly, Category = "Network") + class USessionManager* sessionManager; + + UPROPERTY(BlueprintReadOnly, Category = "Levels") + TArray maps; + UPROPERTY() + TMap mapsByLevelName; + UPROPERTY() + TMap mapsByLevelPath; + + UPROPERTY(BlueprintReadOnly, Category = "Player") + bool splashScreenShown; + + UPROPERTY(EditDefaultsOnly) + FString menuLevelPath; + + UPROPERTY(BlueprintReadOnly, Category = "Player") + FString playerID; +private: + virtual bool m_Tick(float DeltaSeconds); + + void m_LoadMaps(); + + FLoadingScreenAttributes m_loadingScreen; + FDelegateHandle m_tickDelegateHandle; + ULocalPlayer* m_localPlayer; + + UPROPERTY() + class UCharacterSettings* m_characterSettings; + UPROPERTY() + class UPrefs* m_prefs; +}; diff --git a/Source/UnrealProject/GameState/DefaultGameMode.cpp b/Source/UnrealProject/GameState/DefaultGameMode.cpp new file mode 100644 index 0000000..a73f07b --- /dev/null +++ b/Source/UnrealProject/GameState/DefaultGameMode.cpp @@ -0,0 +1,381 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "DefaultGameMode.h" +#include "DefaultGameState.h" +#include "DefaultGameInstance.h" +#include "PlayerSpawn.h" +#include "NetworkPlayer.h" +#include "CreatureSpawn.h" +#include "DefaultPlayer.h" +#include "DefaultPlayerController.h" +#include "DefaultPlayerState.h" +#include "GameStateBase.h" +#include "SessionManager.h" + +#if PLATFORM_SPECIFIC_WIN == 0 +#include "HeatMapMetrics.h" +#endif + +#if UE_INCLUDE_METRICS +#include "MiniMapVolume.h" +#include "IngameHUD.h" +#include "MiniMapWidget.h" +#endif + +ADefaultGameMode::ADefaultGameMode() +{ + PrimaryActorTick.bCanEverTick = true; + + // Lobby system starts the match + bDelayedStart = true; + + PlayerControllerClass = ADefaultPlayerController::StaticClass(); + DefaultPawnClass = ConstructorHelpers::FClassFinder(TEXT("/Game/Assets/Blueprints/BP_DefaultPlayer")).Class; + SpectatorClass = ConstructorHelpers::FClassFinder(TEXT("/Game/Assets/Blueprints/BP_SpectatorPawn")).Class; + + GameStateClass = ADefaultGameState::StaticClass(); + PlayerStateClass = ADefaultPlayerState::StaticClass(); +} + +void ADefaultGameMode::PreInitializeComponents() +{ + Super::PreInitializeComponents(); + + ADefaultGameState* gameState = GetGameState(); + check(gameState); + m_playerSpawns.AddZeroed(4); + //FString str = UGameplayStatics::ParseOption(OptionsString, FString("teamCount")); + //int32 teamCountSetting = FCString::Atoi(*str); + //if(teamCountSetting > 1) + //{ + // gameState->m_mapTeamCount = teamCountSetting; + // GWPRINT(L"Set map team count to " + gameState->m_mapTeamCount); + //} +} + +void ADefaultGameMode::InitGame(const FString& MapName, const FString& Options, FString& ErrorMessage) +{ + Super::InitGame(MapName, Options, ErrorMessage); + + // Start game immediately in editor since we can't use seamless travel to obtain the players + UWorld* world = GetWorld(); + if(world->WorldType == EWorldType::PIE) + { + m_StartGameStartTimer(); + } + + // Find lobby state blueprint + for(TActorIterator it(world); it; ++it) + { + m_lobbyState = *it; + } + + if(m_lobbyState) + { + GPRINT("Received traveled lobby state " + m_lobbyState->GetName()); + m_totalPlayerCount = m_lobbyState->players.Num(); + } + else + { + m_totalPlayerCount = 1; + } +} +void ADefaultGameMode::BeginPlay() +{ + Super::BeginPlay(); + +#if PLATFORM_SPECIFIC_WIN == 0 + HeatMapMetrics::ResetMap(); +#endif +} +void ADefaultGameMode::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ +#if UE_INCLUDE_METRICS + if (Metrics::EndSession()) + JPRINT("Metrics session ended"); + else + JERROR("Failed to close metrics session"); +#endif + + Super::EndPlay(EndPlayReason); + +#if PLATFORM_SPECIFIC_WIN == 0 + HeatMapMetrics::ExportToFile(); +#endif +} + +void ADefaultGameMode::PostSeamlessTravel() +{ + GPRINT("PostSeamlessTravel"); + Super::PostSeamlessTravel(); +} + +void ADefaultGameMode::HandleSeamlessTravelPlayer(AController*& C) +{ + Super::HandleSeamlessTravelPlayer(C); + + UDefaultGameInstance* inst = Cast(GetGameInstance()); + + // Register new player + ADefaultPlayerController* newPC = Cast(C); + if(!newPC) + { + GERROR("Invalid player genereted by HandleSeamlessTravelPlayer"); + } + else + { + GPRINT("Transfering logged in player " + C->GetName()); + AGameStateBase* gameState = Cast(GameState); + gameState->RegisterPlayer(newPC); + } + + TSharedPtr netID = newPC->PlayerState->UniqueId.GetUniqueNetId(); + if(m_lobbyState) + { + m_lobbyState->players.RemoveAll([netID](FLobbyStatePlayer& item) + { + return item.netID.IsValid() && netID.IsValid() && (*item.netID == *netID); + }); + } + + m_numTravelledPlayers++; + if(m_numTravelledPlayers >= m_totalPlayerCount) + { + // Set a timer to start the game + m_StartGameStartTimer(); + } + else + { + int32 left = m_totalPlayerCount - m_numTravelledPlayers; + GPRINT("Still waiting for " + left + " more players"); + for(auto& p : m_lobbyState->players) + { + FString name = inst->sessionManager->GetPlayerName(*p.netID); + GPRINT("--" + name + " [" + p.netID->ToDebugString() + "]"); + } + } +} + +void ADefaultGameMode::PreLogin(const FString& Options, const FString& Address, const TSharedPtr& UniqueId, FString& ErrorMessage) +{ + Super::PreLogin(Options, Address, UniqueId, ErrorMessage); + FString username = "Invalid"; + + if(GameState->GetMatchState() == MatchState::InProgress) + { + // Check if player is reconnecting but was previously connected + FString uniqueIDString = UniqueId->ToString(); + if (m_connectedPlayersNetID.Contains(uniqueIDString)) + { + GWPRINT(L"Reconnecting player " + username + " / " + uniqueIDString); + } + else + { + ErrorMessage = "Game has already started"; + } + } +} +APlayerController* ADefaultGameMode::Login(class UPlayer* NewPlayer, ENetRole InRemoteRole, const FString& Portal, const FString& Options, const TSharedPtr& UniqueId, FString& ErrorMessage) +{ + // Register players that ever connected to the game so they can reconnect + APlayerController* controller = Super::Login(NewPlayer, InRemoteRole, Portal, Options, UniqueId, ErrorMessage); + if (controller) + { + FString uniqueIDString = UniqueId->ToString(); + m_connectedPlayersNetID.Add(uniqueIDString); + GWPRINT(L"Registering connected player ID " + uniqueIDString); + } + + // Register logged on player + // Note: this should only happen when running a PIE instance or standalone with a startup level + // normal login procedure happens in the menu and players are then transfered to the game using seamless travel + ADefaultPlayerController* defPC = Cast(controller); + if(!defPC) + { + GERROR("Invalid player genereted by HandleSeamlessTravelPlayer"); + } + else + { + GPRINT("Logging in new player " + defPC->GetName()); + AGameStateBase* gameState = Cast(GameState); + gameState->RegisterPlayer(defPC); + } + + return controller; +} + +void ADefaultGameMode::PostLogin(APlayerController* NewPlayer) +{ + Super::PostLogin(NewPlayer); + + // Auto assign team when in PIE + UWorld* world = GetWorld(); + if(world->WorldType == EWorldType::PIE) + { + AGameStateBase* gameState = Cast(GameState); + APlayerStateBase* state = Cast(NewPlayer->PlayerState); + state->AutoAssignTeam(); + } +} +void ADefaultGameMode::Logout(AController* Exiting) +{ + GWPRINT(L"Player left the game"); + + // Unregister players if not playing + if (GameState->GetMatchState() != MatchState::InProgress) + { + if (Exiting->PlayerState) + { + FString uniqueIDString = Exiting->PlayerState->UniqueId->ToString(); + GWPRINT(L"Removing connected player ID " + uniqueIDString); + m_connectedPlayersNetID.Remove(uniqueIDString); + } + } + Super::Logout(Exiting); +} + +void ADefaultGameMode::Tick(float DeltaTime) +{ + Super::Tick(DeltaTime); + m_gameTimer += DeltaTime; +} + +void ADefaultGameMode::HandleMatchHasStarted() +{ + GWPRINT(L"Match Started"); + GetGameState()->gameEnded = false; + + // Assign team mates + ADefaultGameState* gameState = GetWorld()->GetGameState(); + TArray> playersByTeam = gameState->GetPlayersByTeam(); + + for (int32 i = 0; i < playersByTeam.Num(); i++) + { + auto& arr = playersByTeam[i]; + if (arr.Num() == 2) + { + arr[0]->teamMate = arr[1]; + arr[1]->teamMate = arr[0]; + } + } + + Super::HandleMatchHasStarted(); +} +void ADefaultGameMode::HandleMatchHasEnded() +{ + GWPRINT(L"Match Ended"); + GetGameState()->gameEnded = true; + Super::HandleMatchHasStarted(); +} + +void ADefaultGameMode::RegisterPlayerSpawn(APlayerSpawn& spawn) +{ + if (spawn.assignedTeam > m_playerSpawns.Num() - 1) + m_playerSpawns.SetNumZeroed(spawn.assignedTeam + 1); + + m_playerSpawns[spawn.assignedTeam] = &spawn; +} + +void ADefaultGameMode::RegisterPlayer(class ANetworkPlayer& player) +{ + if(m_players.Contains(&player)) + { + GWARNING("Player already registered with game mode " + player.GetName()); + return; + } + + m_players.Add(&player); +} +void ADefaultGameMode::UnregisterPlayer(class ANetworkPlayer& player) +{ + m_players.Remove(&player); +} + +void ADefaultGameMode::StartGame() +{ +#if UE_INCLUDE_METRICS + // Start a new metrics session, and output the file in the Metrics folder + FString filePath = FPaths::GameDir() + FString(L"Metrics/"); + if (Metrics::StartSession(filePath.GetCharArray().GetData())) + { + // Retrieve the active map size + for (TActorIterator iter(GetWorld()); iter; ++iter) + { + AMiniMapVolume* const volume = *iter; + volume->SetActorRotation(FRotator(0, 0, 0)); + FVector area = volume->area->GetScaledBoxExtent(); + const FVector pos = volume->GetActorLocation(); + FVector2D min, max; + min.X = -area.X + pos.X; + min.Y = -area.Y + pos.Y; + max.X = area.X + pos.X; + max.Y = area.Y + pos.Y; + Metrics::SetMapData(min.X, max.X, min.Y, max.Y); + break; + } + JPRINT("New metrics session started"); + } + else + JERROR("Failed to open new metrics session"); +#endif + + GPRINT("Starting Game"); + SetMatchState(MatchState::InProgress); + m_gameTimer = 0; +} + +APlayerSpawn* ADefaultGameMode::GetOptimalSpawn(int32 team) +{ + check(team > 0); + + if (m_playerSpawns.Num() == 0) + return nullptr; + if (m_playerSpawns.Num() == 1) + return m_playerSpawns[0]; + + if (team - 1 < m_playerSpawns.Num()) + return m_playerSpawns[team - 1]; + + // Either no players yet, or something went wrong + // Pick random spawn + return m_playerSpawns[FMath::Rand() % m_playerSpawns.Num()]; +} + +TArray ADefaultGameMode::GetPlayers() +{ + return m_players; +} + +void ADefaultGameMode::BossHasBeenKilled(int32 team) +{ + TArray players(m_players); + + // Set winning team in gamestate (replicated) + GetGameState()->gameWinningTeam = team; + + EndMatch(); + + // Destroy all player pawns so that they respawn as spectators + for (int32 i = 0; i < players.Num(); i++) + { + players[i]->Destroy(true); + } + + TPRINT("Boss was killed. (ADefaultGameMode) the team = " + team); +} + +float ADefaultGameMode::GetGameTime() +{ + return m_gameTimer; +} + +void ADefaultGameMode::m_StartGameStartTimer() +{ + GPRINT("Starting game in 2 seconds"); + GetWorld()->GetTimerManager().SetTimer(m_gameStartTimer, this, &ADefaultGameMode::m_GameStart, 2.0f, false); +} +void ADefaultGameMode::m_GameStart() +{ + StartGame(); +} diff --git a/Source/UnrealProject/GameState/DefaultGameMode.h b/Source/UnrealProject/GameState/DefaultGameMode.h new file mode 100644 index 0000000..b4eed62 --- /dev/null +++ b/Source/UnrealProject/GameState/DefaultGameMode.h @@ -0,0 +1,65 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GameFramework/GameMode.h" +#include "DefaultGameMode.generated.h" + +UCLASS(minimalapi) +class ADefaultGameMode : public AGameMode +{ + GENERATED_BODY() + +public: + ADefaultGameMode(); + + virtual void PreInitializeComponents() override; + virtual void InitGame(const FString& MapName, const FString& Options, FString& ErrorMessage) override; + virtual void BeginPlay() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + + virtual void PostSeamlessTravel() override; + virtual void HandleSeamlessTravelPlayer(AController*& C) override; + virtual void PreLogin(const FString& Options, const FString& Address, const TSharedPtr& UniqueId, FString& ErrorMessage) override; + virtual APlayerController* Login(class UPlayer* NewPlayer, ENetRole InRemoteRole, const FString& Portal, const FString& Options, const TSharedPtr& UniqueId, FString& ErrorMessage) override; + virtual void PostLogin(APlayerController* NewPlayer) override; + virtual void Logout(AController* Exiting); + + virtual void Tick(float DeltaTime) override; + + virtual void HandleMatchHasStarted() override; + virtual void HandleMatchHasEnded() override; + + void RegisterPlayerSpawn(class APlayerSpawn& spawn); + + void RegisterPlayer(class ANetworkPlayer& player); + void UnregisterPlayer(class ANetworkPlayer& player); + + void StartGame(); + + APlayerSpawn* GetOptimalSpawn(int32 team); + + TArray GetPlayers(); + + void BossHasBeenKilled(int32 team); + float GetGameTime(); +protected: + void m_StartGameStartTimer(); + void m_GameStart(); + float m_gameTimer; + float m_gameRestartTimer; + FTimerHandle m_gameStartTimer; + + UPROPERTY() + class ALobbyState* m_lobbyState; + + int32 m_numTravelledPlayers; + int32 m_totalPlayerCount; + + TArray m_connectedPlayersNetID; + + UPROPERTY() + TArray m_playerSpawns; + UPROPERTY() + TArray m_players; +}; \ No newline at end of file diff --git a/Source/UnrealProject/GameState/DefaultGameState.cpp b/Source/UnrealProject/GameState/DefaultGameState.cpp new file mode 100644 index 0000000..d3d5528 --- /dev/null +++ b/Source/UnrealProject/GameState/DefaultGameState.cpp @@ -0,0 +1,32 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" + +#include "DefaultGameState.h" +#include "MapData.h" + +ADefaultGameState::ADefaultGameState() +{ + PrimaryActorTick.bCanEverTick = true; + + bReplicates = true; +} + +void ADefaultGameState::BeginPlay() +{ + Super::BeginPlay(); +} + +void ADefaultGameState::Tick(float DeltaTime) +{ + Super::Tick(DeltaTime); +} + +void ADefaultGameState::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + + DOREPLIFETIME(ADefaultGameState, gameEnded); + DOREPLIFETIME(ADefaultGameState, gameWinningTeam); + DOREPLIFETIME(ADefaultGameState, gameRestartingIn); +} \ No newline at end of file diff --git a/Source/UnrealProject/GameState/DefaultGameState.h b/Source/UnrealProject/GameState/DefaultGameState.h new file mode 100644 index 0000000..85c2929 --- /dev/null +++ b/Source/UnrealProject/GameState/DefaultGameState.h @@ -0,0 +1,27 @@ +// Project Lab - NHTV Igad +#pragma once +#include "GameStateBase.h" +#include "MiniMap.h" +#include "DefaultGameState.generated.h" + +UCLASS() +class UNREALPROJECT_API ADefaultGameState : public AGameStateBase +{ + GENERATED_BODY() + friend class ADefaultGameMode; +public: + ADefaultGameState(); + virtual void BeginPlay() override; + virtual void Tick(float DeltaSeconds) override; + + class ASoundEffect* CreateSoundEffect(class USoundBase* sndClass, const FVector& position); + + UPROPERTY(Replicated, BlueprintReadOnly, Category = "GameState") + bool gameEnded; + UPROPERTY(Replicated, BlueprintReadOnly, Category = "GameState") + int32 gameWinningTeam; + UPROPERTY(Replicated, BlueprintReadOnly, Category = "GameState") + float gameRestartingIn; + + MiniMap::QuadTree<6> minimapQuadtree; +}; diff --git a/Source/UnrealProject/GameState/DefaultPlayer.cpp b/Source/UnrealProject/GameState/DefaultPlayer.cpp new file mode 100644 index 0000000..8773055 --- /dev/null +++ b/Source/UnrealProject/GameState/DefaultPlayer.cpp @@ -0,0 +1,119 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "DefaultGameInstance.h" +#include "DefaultGameMode.h" +#include "PlayerSpawn.h" +#include "DefaultGameState.h" +#include "DefaultGameInstance.h" +#include "NetworkCharacter.h" + +#include "DefaultPlayer.h" +#include "KingOfTheHillGameMode.h" +#include "KOTHBossSpawner.h" +#if PLATFORM_SPECIFIC_WIN == 0 +#include "InputManager.hpp" +using namespace Input; +#endif +#include "DefaultPlayerController.h" + +ADefaultPlayer::ADefaultPlayer() +{ + PrimaryActorTick.bCanEverTick = true; + + + RootComponent = CreateDefaultSubobject(TEXT("Root")); + + // Create a camera boom + CameraBoom = CreateDefaultSubobject(TEXT("CameraBoom")); + CameraBoom->AttachTo(RootComponent); + CameraBoom->bAbsoluteRotation = true; + CameraBoom->TargetArmLength = 1500.f; + CameraBoom->RelativeRotation = FRotator(-60.f, 45.f, 0.f); + CameraBoom->bDoCollisionTest = false; + CameraBoom->bInheritPitch = false; + CameraBoom->bInheritYaw = false; + CameraBoom->bInheritRoll = false; + + // Create a camera + TopDownCamera = CreateDefaultSubobject(TEXT("TopDownCamera")); + TopDownCamera->AttachTo(CameraBoom, USpringArmComponent::SocketName); + TopDownCamera->bUsePawnControlRotation = false; + + // Don't rotate character to camera direction + bUseControllerRotationPitch = false; + bUseControllerRotationYaw = false; + bUseControllerRotationRoll = false; + + + respawnDelay = 0.25f; + respawnTimer = 0.0f; + isRespawning = false; + bReplicates = true; + bAlwaysRelevant = true; + bReplicateMovement = false; +} +void ADefaultPlayer::BeginPlay() +{ + Super::BeginPlay(); + if(Role == ROLE_Authority) + isRespawning = true; +} + +void ADefaultPlayer::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); +} +void ADefaultPlayer::Tick(float DeltaSeconds) +{ + Super::Tick(DeltaSeconds); + + // Spawn the player + if(Role == ROLE_Authority) + { + if(isRespawning) + { + respawnTimer -= DeltaSeconds; + m_OnRep_RespawnTimer(); + bool respawn = true; + AKingOfTheHillGameMode* gameMode = Cast(GetWorld()->GetAuthGameMode()); + if (gameMode) + { + respawn = gameMode->bossSpawner->IsBossAlive(); + } + if(respawnTimer <= 0.0f &&respawn) + { + ADefaultPlayerController* controller = Cast(GetController()); + if(IsValid(controller)) + { + controller->SpawnCharacterForClient(); + isRespawning = false; + } + else + { + isRespawning = false; + } + } + } + } +} + +void ADefaultPlayer::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + DOREPLIFETIME(ADefaultPlayer, respawnTimer); + DOREPLIFETIME(ADefaultPlayer, isRespawning); +} + +void ADefaultPlayer::OnSpawn() +{ + check(Role == ROLE_Authority); + respawnTimer = respawnDelay; + isRespawning = true; + m_OnRep_RespawnTimer(); +} + +void ADefaultPlayer::m_OnRep_RespawnTimer() +{ + onRespawnTimerSet.Broadcast(respawnTimer); +} \ No newline at end of file diff --git a/Source/UnrealProject/GameState/DefaultPlayer.h b/Source/UnrealProject/GameState/DefaultPlayer.h new file mode 100644 index 0000000..829d738 --- /dev/null +++ b/Source/UnrealProject/GameState/DefaultPlayer.h @@ -0,0 +1,47 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GameFramework/Pawn.h" +#include "DefaultPlayer.generated.h" + + +UCLASS(Config=Game) +class UNREALPROJECT_API ADefaultPlayer : public APawn +{ + GENERATED_BODY() + +public: + ADefaultPlayer(); + + virtual void BeginPlay() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + virtual void Tick(float DeltaSeconds) override; + + // Resets the respawn timer + void OnSpawn(); + + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true")) + class UCameraComponent* camera; + + UPROPERTY(ReplicatedUsing=m_OnRep_RespawnTimer, BlueprintReadOnly, Category = "RespawnTimer") + float respawnTimer; + UPROPERTY(Replicated, BlueprintReadOnly, Category = "RespawnTimer") + bool isRespawning; + + UPROPERTY(Config, BlueprintReadOnly) + float respawnDelay; + + DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnRespawnTimerSet, float, time); + UPROPERTY(BlueprintAssignable) + FOnRespawnTimerSet onRespawnTimerSet; + + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true")) + class USpringArmComponent* CameraBoom; + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true")) + class UCameraComponent* TopDownCamera; + +private: + UFUNCTION() + void m_OnRep_RespawnTimer(); +}; diff --git a/Source/UnrealProject/GameState/DefaultPlayerController.cpp b/Source/UnrealProject/GameState/DefaultPlayerController.cpp new file mode 100644 index 0000000..fbaec2a --- /dev/null +++ b/Source/UnrealProject/GameState/DefaultPlayerController.cpp @@ -0,0 +1,1335 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "DefaultGameInstance.h" +#include "DefaultGameState.h" +#include "KingOfTheHillGameMode.h" +#include "DefaultPlayer.h" +#include "DefaultPlayerState.h" +#include "DefaultPlayerController.h" +#include "CombatTextWidget.h" +#include "CharacterSettings.h" +#include "NetworkPlayer.h" +#include "NetworkGhost.h" +#include "NetworkSwitch.h" +#include "BaseSkillObject.h" +#include "PlayerSpawn.h" +#include "MiniMapWidget.h" +#include "IngameHUD.h" +#include "CombatTextWidget.h" +#include "AbilityInfo.h" +#include "HealthBar.h" +#include "LobbyMenu.h" +#include "ItemBase.h" +#include "SkillTreeWidget.h" +#include "IngameSkillTree.h" +#include "ButtonBarSwitcher.h" +#include "MenuScreenBase.h" + +#include "SessionManager.h" +#include "PreCastAbilityEventGroup.h" +#include "MenuScreen.h" +#include "WidgetBlueprintLibrary.h" + +// Use Inputmanager when not on playstation +#if PLATFORM_SPECIFIC_WIN == 0 +#include "InputManager.hpp" +using namespace Input; +#endif + +static UClass* HUDWidgetClass; +static UClass* characterClass; +static UClass* ghostClass; +static UClass* respawnWidgetClass; +static UClass* skilltreeWidgetClass; +static TSubclassOf menuWidgetClass; +static TSubclassOf ingameMenuPanelClass; + +ADefaultPlayerController::ADefaultPlayerController(const FObjectInitializer& init) + : Super(init) +{ + menuWidgetClass = ConstructorHelpers::FClassFinder(TEXT("/Game/Assets/GUI/WEEGEE_Menu")).Class; + ingameMenuPanelClass = ConstructorHelpers::FClassFinder(TEXT("/Game/Assets/GUI/Menus/WEEGEE_IngameSubMenu")).Class; + + characterClassProperties = ConstructorHelpers::FObjectFinder(TEXT("/Game/Assets/Abilities/Classes")).Object; + respawnWidgetClass = ConstructorHelpers::FClassFinder(TEXT("/Game/Assets/GUI/WEEGEE_Respawn")).Class; + HUDWidgetClass = ConstructorHelpers::FClassFinder(TEXT("/Game/Assets/GUI/WEEGEE_HUD")).Class; + characterClass = ConstructorHelpers::FClassFinder(TEXT("/Game/Assets/Blueprints/Creatures/BP_NetworkPlayer")).Class; + ghostClass = ConstructorHelpers::FClassFinder (TEXT("/Game/Assets/Blueprints/Creatures/BP_NetworkGhost")).Class; + skilltreeWidgetClass = ConstructorHelpers::FClassFinder (TEXT("/Game/Assets/GUI/WEEGEE_SkillTree")).Class; + PrimaryActorTick.bCanEverTick = true; + + m_framesSinceMenuFocus = 0; + m_rightMouseDown = false; + m_holdPosition = false; + m_skillTreeInitialized = false; + m_holdDirection = FVector(); + m_coopModifier = false; +} + +void ADefaultPlayerController::BeginPlay() +{ + Super::BeginPlay(); + + if(IsLocalController()) + { + m_hud = CreateWidget(this, HUDWidgetClass); + m_hud->AddToViewport(); + m_OnPawnChanged(); + + // Create skill tree widget + m_skillTreeWidget = CreateWidget(this, skilltreeWidgetClass); + check(m_skillTreeWidget); + m_skillTreeWidget->AddToViewport(); + + // Build initial tree + m_skillTreeWidget->BuildFromState(setupState.skills); + + // Load the skill tree + m_skillTreeWidget->SetIsInteractive(false); + m_skillTreeWidget->SetIsEnabled(true); + } + + if(GetWorld()->IsPlayInEditor() && Role == ROLE_Authority) + { + // Load setup state from settings (slot 0) + UCharacterSettings* settings = Cast(GetGameInstance())->GetCharacterSettings(); + if(settings->characterSaves.Num() > 0) + { + const FCharacterSave& save = settings->characterSaves[0]; + setupState.customizations = save.characterCustomization; + setupState.skills = save.skillTreeState; + setupState.characterClass = save.characterClass; + } + + // Handle setupState when not comming from seamless travel + OnRep_Setup(); + } + + this->bShowMouseCursor = true; +} +void ADefaultPlayerController::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + + if (m_hud) + m_hud->RemoveFromViewport(); + + if(IsValid(m_defaultPlayer)) + { + m_defaultPlayer->Destroy(); + } + if(m_respawnWidget) + { + m_respawnWidget->RemoveFromParent(); + } +} + +void ADefaultPlayerController::Destroyed() +{ + Super::Destroyed(); + +#if PLATFORM_SPECIFIC_WIN == 0 + GPRINT("Unbinding Input manager bindings on " + GetName()); + InputManager* inputManager = InputManager::GetInstance(); + + inputManager->DeregisterCallback(IJP_TRIGGERRIGHT, IME_PRESSED, this, &ADefaultPlayerController::CastAbility0); + inputManager->DeregisterCallback(IJP_FACEDOWN, IME_PRESSED, this, &ADefaultPlayerController::CastAbility1); + inputManager->DeregisterCallback(IJP_FACELEFT, IME_PRESSED, this, &ADefaultPlayerController::CastAbility2); + inputManager->DeregisterCallback(IJP_FACEUP, IME_PRESSED, this, &ADefaultPlayerController::CastAbility3); + inputManager->DeregisterCallback(IJP_FACERIGHT, IME_PRESSED, this, &ADefaultPlayerController::CastAbility4); + inputManager->DeregisterCallback(IJP_TRIGGERRIGHT, IME_RELEASED, this, &ADefaultPlayerController::UnCastAbility0); + inputManager->DeregisterCallback(IJP_FACEDOWN, IME_RELEASED, this, &ADefaultPlayerController::UnCastAbility1); + inputManager->DeregisterCallback(IJP_FACELEFT, IME_RELEASED, this, &ADefaultPlayerController::UnCastAbility2); + inputManager->DeregisterCallback(IJP_FACEUP, IME_RELEASED, this, &ADefaultPlayerController::UnCastAbility3); + inputManager->DeregisterCallback(IJP_FACERIGHT, IME_RELEASED, this, &ADefaultPlayerController::UnCastAbility4); + inputManager->DeregisterCallback(IJP_START, IME_PRESSED, this, &ADefaultPlayerController::ToggleMenu); + inputManager->DeregisterCallback(IJP_SHOULDERLEFT, IME_PRESSED, this, &ADefaultPlayerController::ToggleSkillTree); + inputManager->DeregisterCallback(IJP_SHOULDERLEFT, IME_RELEASED, this, &ADefaultPlayerController::ToggleSkillTree); + inputManager->DeregisterCallback(IJP_TRIGGERLEFT, IME_PRESSED, this, &ADefaultPlayerController::CoopModifierOn); + inputManager->DeregisterCallback(IJP_TRIGGERLEFT, IME_RELEASED, this, &ADefaultPlayerController::CoopModifierOff); +#endif +} + +void ADefaultPlayerController::SetupInputComponent() +{ + if (GetWorld()->WorldType == EWorldType::Preview) + return; + + Super::SetupInputComponent(); + +#if PLATFORM_SPECIFIC_WIN == 0 + GPRINT("Creating Input manager bindings on " + GetName()); + InputManager* inputManager = InputManager::GetInstance(); + + inputManager->RegisterCallback(IJP_TRIGGERRIGHT, IME_PRESSED, this, &ADefaultPlayerController::CastAbility0); + inputManager->RegisterCallback(IJP_FACEDOWN, IME_PRESSED, this, &ADefaultPlayerController::CastAbility1); + inputManager->RegisterCallback(IJP_FACELEFT, IME_PRESSED, this, &ADefaultPlayerController::CastAbility2); + inputManager->RegisterCallback(IJP_FACEUP, IME_PRESSED, this, &ADefaultPlayerController::CastAbility3); + inputManager->RegisterCallback(IJP_FACERIGHT, IME_PRESSED, this, &ADefaultPlayerController::CastAbility4); + inputManager->RegisterCallback(IJP_TRIGGERRIGHT, IME_RELEASED, this, &ADefaultPlayerController::UnCastAbility0); + inputManager->RegisterCallback(IJP_FACEDOWN, IME_RELEASED, this, &ADefaultPlayerController::UnCastAbility1); + inputManager->RegisterCallback(IJP_FACELEFT, IME_RELEASED, this, &ADefaultPlayerController::UnCastAbility2); + inputManager->RegisterCallback(IJP_FACEUP, IME_RELEASED, this, &ADefaultPlayerController::UnCastAbility3); + inputManager->RegisterCallback(IJP_FACERIGHT, IME_RELEASED, this, &ADefaultPlayerController::UnCastAbility4); + + inputManager->RegisterCallback(IJP_START, IME_PRESSED, this, &ADefaultPlayerController::ToggleMenu); + inputManager->RegisterCallback(IJP_SHOULDERLEFT, IME_PRESSED, this, &ADefaultPlayerController::ToggleSkillTree); + inputManager->RegisterCallback(IJP_SHOULDERLEFT, IME_RELEASED, this, &ADefaultPlayerController::ToggleSkillTree); + inputManager->RegisterCallback(IJP_TRIGGERLEFT, IME_PRESSED, this, &ADefaultPlayerController::CoopModifierOn); + inputManager->RegisterCallback(IJP_TRIGGERLEFT, IME_RELEASED, this, &ADefaultPlayerController::CoopModifierOff); +#endif + + InputComponent->BindAction("ToggleMenu", IE_Pressed, this, &ADefaultPlayerController::ToggleMenu); + InputComponent->BindAction("ToggleSkillTree", IE_Pressed, this, &ADefaultPlayerController::ToggleSkillTree); + InputComponent->BindAction("ToggleSkillTree", IE_Released, this, &ADefaultPlayerController::ToggleSkillTree); + InputComponent->BindAction("CoopModifier", IE_Pressed, this, &ADefaultPlayerController::CoopModifierOn); + InputComponent->BindAction("CoopModifier", IE_Released, this, &ADefaultPlayerController::CoopModifierOff); + + +#if PLATFORM_SPECIFIC_WIN == 0 +#define ABILITY_KEYBINDING_OP(__name, __id) \ + InputComponent->BindAction(__name, IE_Pressed, this, &ADefaultPlayerController::CastAbility##__id);\ + InputComponent->BindAction(__name, IE_Released, this, &ADefaultPlayerController::UnCastAbility##__id); + +#include "AbilityBindings.h" +#else // On playstation, have repeating attack button + InputComponent->BindAction("Attack", IE_Pressed, this, &ADefaultPlayerController::CastAbility0); + InputComponent->BindAction("CastAbility1", IE_Pressed, this, &ADefaultPlayerController::CastAbility1); + InputComponent->BindAction("CastAbility2", IE_Pressed, this, &ADefaultPlayerController::CastAbility2); + InputComponent->BindAction("CastAbility3", IE_Pressed, this, &ADefaultPlayerController::CastAbility3); + InputComponent->BindAction("CastAbility4", IE_Pressed, this, &ADefaultPlayerController::CastAbility4); + InputComponent->BindAction("Attack", IE_Released, this, &ADefaultPlayerController::UnCastAbility0); + InputComponent->BindAction("CastAbility1", IE_Released, this, &ADefaultPlayerController::UnCastAbility1); + InputComponent->BindAction("CastAbility2", IE_Released, this, &ADefaultPlayerController::UnCastAbility2); + InputComponent->BindAction("CastAbility3", IE_Released, this, &ADefaultPlayerController::UnCastAbility3); + InputComponent->BindAction("CastAbility4", IE_Released, this, &ADefaultPlayerController::UnCastAbility4); +#endif + + // We have 2 versions of the rotation bindings to handle different kinds of devices differently + // "turn" handles devices that provide an absolute delta, such as a mouse. + // "turnrate" is for devices that we choose to treat as a rate of change, such as an analog joystick + + InputComponent->BindAxis("MoveForward", this, &ADefaultPlayerController::MoveForward); + InputComponent->BindAxis("MoveRight", this, &ADefaultPlayerController::MoveRight); + + InputComponent->BindAxis("TurnRate", this, &ADefaultPlayerController::TurnAtRate); + InputComponent->BindAxis("LookUp", this, &ADefaultPlayerController::LookUp); + InputComponent->BindAxis("LookUpRate", this, &ADefaultPlayerController::LookUpAtRate); + + + InputComponent->BindAction("RightMouse", IE_Pressed, this, &ADefaultPlayerController::RightMouseDown); + InputComponent->BindAction("RightMouse", IE_Released, this, &ADefaultPlayerController::RightMouseUp); + InputComponent->BindAction("LeftMouse", IE_Pressed, this, &ADefaultPlayerController::LeftMouseDown); + InputComponent->BindAction("LeftMouse", IE_Released, this, &ADefaultPlayerController::LeftMouseUp); + + InputComponent->BindAction("HoldPosition", IE_Pressed, this, &ADefaultPlayerController::HoldDown); + InputComponent->BindAction("HoldPosition", IE_Released, this, &ADefaultPlayerController::HoldUp); + +} + +void ADefaultPlayerController::Tick(float DeltaSeconds) +{ + APawn* pawn = GetPawnOrSpectator(); + + if (IsLocalController() && IsValid(m_defaultPlayer) && IsValid(pawn) && pawn != m_defaultPlayer) + m_defaultPlayer->SetActorLocation(pawn->GetActorLocation()); + + // Tick basic attacks while the user keeps the button held + if(m_usingBasicAttack) + { + m_TickBasicAttack(); + } + + // Set the menu focus state + if(!m_ingameMenuPanel) + m_framesSinceMenuFocus++; + else + m_framesSinceMenuFocus = 0; + + + ANetworkGhost* const asGhost = Cast(pawn); + if (IsValid(asGhost) && asGhost->CanRespawn()) + { + // Respawn the player character when we are done spooking + SpawnCharacterForClient(asGhost->GetActorLocation(), asGhost->GetActorRotation()); + asGhost->Destroy(); + } + + // Get possessed character, if any + ANetworkPossessable* const character = Cast(pawn); + if(IsValid(character) && IsLocalController() && PlayerState && HasGameFocus()) + { + // Do UI / Input updates on this controller + m_UpdateUI(); + +#if PLATFORM_SPECIFIC_WIN == 0 + InputManager* inputManager = InputManager::GetInstance(); + + Joystick* joystick = inputManager->joystick; + if (joystick) + { + TeaLib::Math::Vector2f lStick = joystick->GetDelta(IJA_LSTICK); + if (lStick.Length() > 0.2f) + { + FVector forward = (character->CameraBoom->GetForwardVector() * -lStick.y) + (character->CameraBoom->GetRightVector() * lStick.x); + FRotator current = character->GetActorRotation(); + FRotator difference = forward.Rotation(); + character->SetActorRotation(FRotator(current.Pitch, difference.Yaw, current.Roll)); + { + MoveForward(-lStick.y); + MoveRight(lStick.x); + } + } + } +#endif + + FVector2D mousePos; + if(GetMousePosition(mousePos.X, mousePos.Y)) + { + FVector location; + FVector direction; + if(DeprojectMousePositionToWorld(location, direction)) + { + const FVector origin = character->TopDownCamera->GetComponentLocation(); + const FVector position = pawn->GetActorLocation(); + const FVector normal = FVector(0, 0, 1); + float entry = FVector::DotProduct(position - origin, normal) / FVector::DotProduct(direction, normal); + + const FVector lookatPos = origin + direction * entry; + + FVector dif = lookatPos - pawn->GetActorLocation(); + dif.Normalize(); + if(!m_rightMouseDown) + { + // Only update lookat if the mouse had moved + if(m_mouseLast != mousePos) + { + FRotator current = pawn->GetActorRotation(); + FRotator difference = dif.Rotation(); + character->SetCharacterRotation(FRotator(current.Pitch, difference.Yaw, current.Roll)); + m_mouseLast = mousePos; + } + } + else + character->AddMovementInput(dif, 1); + } + } + } +} + +void ADefaultPlayerController::Possess(APawn* pawn) +{ + Super::Possess(pawn); + + // Store the initialy posesesed player, since it is the default player. + if (!IsValid(m_defaultPlayer)) + m_defaultPlayer = Cast(pawn); + + // Get possessed character, if any + ANetworkPlayer* character = Cast(pawn); + + // Get possessed ghost, if any + ANetworkGhost* ghost = Cast(pawn); + + // Assign player name to character + ACharacterBase* charBase = Cast(pawn); + UDefaultGameInstance* inst = Cast(GetGameInstance()); + if(charBase) + charBase->playerName = inst->sessionManager->GetPlayerName(*PlayerState->UniqueId); + + // Set the character on the player state + if(Role == ROLE_Authority) + { + if(PlayerState) + { + // Customize ghost character + if(ghost) + { + TArray skills = m_skillTree->GetSkillsForLevel(Cast(PlayerState)); + TArray equip; + for(FIngameSkillTreeSkill& s : skills) + { + equip.Add(s.skillObject); + } + ghost->EquipSkills(equip); + ghost->SetCustomizations(setupState.customizations); + } + + Cast(PlayerState)->character = character; + } + + // Host should handle possess events directly instead of throug OnRep_Pawn + m_OnPawnChanged(); + } +} + +void ADefaultPlayerController::SeamlessTravelFrom(class APlayerController* OldPC) +{ + Super::SeamlessTravelFrom(OldPC); + m_seamlessTravelDone = true; + // Handle receiving the setup state + OnRep_Setup(); +} + +void ADefaultPlayerController::PawnPendingDestroy(APawn* inPawn) +{ + Super::PawnPendingDestroy(inPawn); + + ANetworkPlayer* asPlayer = Cast(inPawn); + if(IsValid(asPlayer)) // The player is destroyed? + { + // Clear learned skills array + m_alreadyLearnedSkills.Reset(); + } + + bool isKoth = false; + UWorld* world = GetWorld(); + if(!IsValid(world)) + return; + if(world->bIsTearingDown) + return; + AGameMode* gm = world->GetAuthGameMode(); + if(gm && gm->IsA()) + { + isKoth = true; + } + + + if (!isKoth && inPawn->IsA(ANetworkPossessable::StaticClass())) + { + // Spawn a ghost + FTransform f; + f.SetScale3D(FVector(1, 1, 1)); + ANetworkPossessable* asPossessable = Cast(inPawn); + if (asPossessable->GetCharacterMovement()->IsMovingOnGround()) + { + // We can spawn the ghost at the location of the dead player + f.SetTranslation(asPossessable->GetActorLocation()); + f.SetRotation(asPossessable->GetActorRotation().Quaternion()); + } + else if (playerLocationHistory.Num() > 0) + { + // The player was falling, we must refer to the location history for a valid spawn spot + f.SetTranslation(playerLocationHistory[0].location); + f.SetRotation(playerLocationHistory[0].rotation.Quaternion()); + } + + FActorSpawnParameters params; + params.bNoFail = true; + params.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn; + ANetworkGhost* ghost = GetWorld()->SpawnActor(ghostClass, f, params); + ADefaultPlayerState* playerState = Cast(PlayerState); + check(playerState); + ghost->SetTeam(playerState->GetTeam()); + check(ghost); + Possess(ghost); + } + + + // Handle reposessing the default player + if(IsValid(m_defaultPlayer)) + { + // Posess the default player if nothing is possessed + if (isKoth) + { + Possess(m_defaultPlayer); + m_defaultPlayer->OnSpawn(); + } + } + else + { + GERROR("Can't reposses default player, it hasen't previously been set"); + } + + // Update possessed character on player state + if(PlayerState) + { + Cast(PlayerState)->character = nullptr; + } + + // Host should handle possess events directly instead of throug OnRep_Pawn + m_OnPawnChanged(); +} + +void ADefaultPlayerController::UpdatePlayerPosition(const FVector& location, const FRotator& rotator) +{ + if (playerLocationHistory.Num() == 0) + { + playerLocationHistory.Add(ADefaultPlayerController::Location(location, rotator)); + } + else + { + // Add only if distance to last point is larger than 100 + ADefaultPlayerController::Location& mostRecent = playerLocationHistory.Last(); + const FVector2D thisPos2D = FVector2D(location.X, location.Y); + if (FVector2D::DistSquared(FVector2D(mostRecent.location.X, mostRecent.location.Y), thisPos2D) > 10000) + playerLocationHistory.Add(ADefaultPlayerController::Location(location, rotator)); + + // Ensure that we dont exceed more than 3 + if (playerLocationHistory.Num() > 3) + playerLocationHistory.RemoveAt(0, playerLocationHistory.Num() - 3); + } +} + +void ADefaultPlayerController::OnRep_Pawn() +{ + Super::OnRep_Pawn(); + m_OnPawnChanged(); +} +void ADefaultPlayerController::OnRep_Setup() +{ + Super::OnRep_Setup(); + if(IsLocalController()) + { + if(!m_skillTreeInitialized) + { + // Request the server to initialize the skilltree + GWPRINT(L"Loading skill tree for " + GetName()); + UCharacterSettings* settings = Cast(GetGameInstance())->GetCharacterSettings(); + + // Update state on the widget + if(m_skillTreeWidget) + { + m_skillTreeWidget->BuildFromState(setupState.skills); + } + + m_skillTreeInitialized = true; + } + } + + // Create a the ingame skilltree on clients and server for ability unlock calculation + if(!m_skillTree) + { + m_CreateIngameSkilltree(); + m_skillTree->BuildFromState(setupState.skills); + } + + // Assign basic attack + if(characterClassProperties) + { + if(characterClassProperties->classes.Num() > 0) + { + setupState.characterClass = FMath::Clamp(setupState.characterClass, 0, characterClassProperties->classes.Num()-1); + m_classProperties = characterClassProperties->classes[setupState.characterClass]; + } + } + else + { + GERROR("characterClassProperties is not assigned"); + } +} + +FCharacterClassProperty ADefaultPlayerController::GetCharacterClassProperties() const +{ + return m_classProperties; +} + +class UIngameHUD* ADefaultPlayerController::GetHUD() +{ + return m_hud; +} + +void ADefaultPlayerController::OnLevelUpClient_Implementation(const TArray& updatedSkills, const TArray& oldSkills) +{ + m_alreadyLearnedSkills = oldSkills; + + // Show level up hud + if (m_hud) + m_hud->OnLevelUp(updatedSkills); + UpdateLevel(); + + // Add abilities to the list of learned abilities + for (int32 i = 0; i < updatedSkills.Num(); i++) + { + UAbilityInfo* info = updatedSkills[i].selectedEffect; + if (info) + { + m_learnedAbilities.Add(info); + } + } +} +void ADefaultPlayerController::LearnSkillsForLevel() +{ + ANetworkPlayer* player = Cast(GetPawn()); + if(!player) + return; + if(!m_skillTree) + return; + + TArray skills = m_skillTree->GetSkillsForLevel(Cast(PlayerState)); + + TArray skillsToEquip; + + // Calculate skill delta + TArray updatedSkills; + for (int32 i = 0; i < skills.Num(); i++) + { + FIngameSkillTreeSkill& skillNew = skills[i]; + bool found = false; + for (int32 j = 0; j < m_alreadyLearnedSkills.Num(); j++) + { + FIngameSkillTreeSkill& skillOld = m_alreadyLearnedSkills[j]; + if (skillOld.skillObject == skillNew.skillObject) + { + if(skillOld.level < skillNew.level) + { + updatedSkills.Add(skills[i]); + } + found = true; + break; + } + } + if (!found) + updatedSkills.Add(skills[i]); + + skillsToEquip.Add(skillNew.skillObject); + } + + // Override player basic attack by class + if(player->abilities.Num() < 1) + player->abilities.SetNumZeroed(1); + player->abilities[0] = player->basicAttack = m_classProperties.basicAttack; + + // Equip skill items on all replicas of this player + player->EquipSkills(skillsToEquip); + + // Update customizations + player->SetCustomizations(setupState.customizations); + + // Learn abilities + player->LearnSkills_Server(updatedSkills); + + // Equip class specific items, overrides equipment set by the skill tree + if(m_classProperties.classItems.Num() > 0) + player->EquipItems(m_classProperties.classItems); + + // Equip more skill items + if(PlayerState) + { + FString steamID = Cast(GetGameInstance())->sessionManager->GetSteamID(*PlayerState->UniqueId); + if(steamID == "76561198008045751") + { + GPRINT("Hoi frank"); + } + } + + OnLevelUpClient(updatedSkills, m_alreadyLearnedSkills); + + // Update already learned skills + for(int32 i = 0; i < m_alreadyLearnedSkills.Num(); i++) + { + bool found = false; + for(int32 j = 0; j < skills.Num(); j++) + { + if(skills[j].skillObject == m_alreadyLearnedSkills[i].skillObject) + { + found = true; + break; + } + } + if(!found) + { + m_alreadyLearnedSkills[i].power = 0.0f; + m_alreadyLearnedSkills[i].level = 0; + skills.Add(m_alreadyLearnedSkills[i]); + } + } + + m_alreadyLearnedSkills = skills; +} +int32 ADefaultPlayerController::GetCurrentAbilityLevel(class UAbilityInfo* ability) +{ + for(int32 i = 0; i < m_alreadyLearnedSkills.Num(); i++) + { + if(m_alreadyLearnedSkills[i].selectedEffect == ability) + { + return m_alreadyLearnedSkills[i].level; + } + } + return 0; +} + +bool ADefaultPlayerController::GetAbilityButtonLocation(UAbilityInfo* ability, int32& slot, bool& isAlt) +{ + isAlt = false; + for(slot = 0; slot < m_mainSkillMapping.Num(); slot++) + { + if(m_mainSkillMapping[slot] == ability) + return true; + } + isAlt = true; + for(slot = 0; slot < m_altSkillMapping.Num(); slot++) + { + if(m_altSkillMapping[slot] == ability) + return true; + } + return false; +} + +void ADefaultPlayerController::ToggleSkillTree() +{ + if(IsLocalController() && HasGameFocus()) + { + if(!m_skillTreeWidget->IsShow()) + { + m_skillTreeWidget->Show(); + } + else + { + m_skillTreeWidget->Hide(); + } + } +} +void ADefaultPlayerController::ToggleMenu() +{ + if(!m_ingameMenu) + { + m_ingameMenu = CreateWidget(GetWorld(), menuWidgetClass); + m_ingameMenu->AddToViewport(50); + } + if(!m_ingameMenuPanel) + { + m_ingameMenu->OnShow(); + m_ingameMenuPanel = m_ingameMenu->OpenScreenMenu(ingameMenuPanelClass); + } + else + { + OnHideUI(); + } + UWidgetBlueprintLibrary::SetFocusToGameViewport(); +} +void ADefaultPlayerController::OnHideUI() +{ + if(!m_ingameMenuPanel) + return; + m_ingameMenu->OnHide(); + m_ingameMenu->CloseSubMenu(m_ingameMenuPanel); + m_ingameMenuPanel = nullptr; + UWidgetBlueprintLibrary::SetFocusToGameViewport(); +} + +void ADefaultPlayerController::m_OnPawnChanged() +{ + APawn* pawn = GetPawnOrSpectator(); + ANetworkPlayer* player = Cast(pawn); + ANetworkPossessable* possessable = Cast(pawn); + const bool isValid = IsValid(pawn) && pawn->IsA(); + + if (m_hud) + { + // Calculate skill prototypes + if (m_skillTree) + { + TArray skillsetPrototype = m_skillTree->GetSkillsForLevel(1.0f); + m_hud->NativeOnAssignCharacter(possessable, skillsetPrototype); + + // Set Skill bindings + m_mainSkillMapping.SetNum(0); + m_altSkillMapping.SetNum(0); + for (int32 i = 0; i < skillsetPrototype.Num(); i++) + { + switch (skillsetPrototype[i].abilityType) + { + case 0: + m_mainSkillMapping.Add(skillsetPrototype[i].selectedEffect); + break; + case 1: + m_altSkillMapping.Add(skillsetPrototype[i].selectedEffect); + break; + } + } + } + m_hud->SetVisibility(isValid ? ESlateVisibility::Visible : ESlateVisibility::Hidden); + } + + // Create respawn widget on local player + if(IsLocalController()) + { + if (isValid) + { + if (m_respawnWidget) + { + m_respawnWidget->RemoveFromViewport(); + m_respawnWidget = nullptr; + } + } + else // Assume default player + { + // Create respawn widget + if(!m_respawnWidget) + { + m_respawnWidget = CreateWidget(GetWorld(), respawnWidgetClass); + m_respawnWidget->AddToViewport(30); + } + } + } +} +void ADefaultPlayerController::m_UpdateUI() +{ + ANetworkPlayer* character = Cast(GetPawn()); + if(m_hud && character) + { + ADefaultPlayerState* state = Cast(PlayerState); + + TArray abilityStates; + for(int32 i = 0; i < character->abilities.Num(); ++i) + { + UAbilityInfo* ability = character->abilities[i]; + AAbilityState* state = character->GetAbilityState(ability); + state->cooldownRate = 1.0f - (state->onCooldownTimer / ability->cooldown); + if (ability->cooldown < 0.1f) + state->cooldownRate = 1.0f; + abilityStates.Add(state); + } + m_hud->UpdateCooldowns(abilityStates, character); + } +} + +void ADefaultPlayerController::m_CreateIngameSkilltree() +{ + if (!m_skillTree) + { + // Create logic-only skilltree + m_skillTree = GetWorld()->SpawnActor(AIngameSkillTree::StaticClass()); + check(m_skillTree); + } +} + +void ADefaultPlayerController::OnCharacterCreated(ANetworkCharacter* character) +{ + if (m_hud) + { + m_hud->OnCharacterCreated(character); + } + else + { + GWWARNING(L"OnCharacterCreated called on a controller without a HUD"); + } +} +void ADefaultPlayerController::OnCharacterDestroyed(ANetworkCharacter* character) +{ + if (m_hud) + { + m_hud->OnCharacterDestroyed(character); + } + else + { + GWWARNING(L"OnCharacterDestroyed called on a controller without a HUD"); + } +} + +const TArray& ADefaultPlayerController::GetAbilities(APawn* targetPawn) +{ + if (!IsValid(targetPawn)) + targetPawn = GetPawn(); + ANetworkPlayer* netPlayer = Cast(targetPawn); + if (netPlayer) + { + return netPlayer->abilities; + } + static TArray dummy; + return dummy; +} + +bool ADefaultPlayerController::HasGameFocus() +{ + return m_framesSinceMenuFocus > 10; +} + +void ADefaultPlayerController::CastAbility(int32 index) +{ + if(!HasGameFocus()) + return; + + // Basic Attack? + if(index == 0) + { + m_StartBasicAttack(); + m_usingBasicAttack = true; + } + + ANetworkPlayer* netPlayer = Cast(GetPawn()); + UAbilityInfo* info = GetMappedAbility(index); + if(netPlayer) + { + // Obtain assigned basic attack ability + if(index == 0) + info = netPlayer->basicAttack; + if(info) + { + netPlayer->CastAbility(info); + } + } +} +void ADefaultPlayerController::UnCastAbility(int32 index) +{ + if(!HasGameFocus()) + return; + + // Basic Attack? + if(index == 0) + { + m_StopBasicAttack(); + m_usingBasicAttack = false; + } + + // Only main-bar abilities and basic attack + if(index >= 5) + return; + + + // This casts abilities again which are hold abilities to turn them off + ANetworkPlayer* netPlayer = Cast(GetPawn()); + UAbilityInfo* info = GetMappedAbility(index); + + if (info && info->precastEvent && netPlayer && IsValid(netPlayer->m_currentPreCast)) + { + netPlayer->m_currentPreCast->StartAbility(); + return; + } + if(netPlayer && info) + { + if(info->actionType == EAbilityActionType::Hold) + { + AAbilityState* state = netPlayer->GetAbilityState(info); + if(state->toggleState == 1) + netPlayer->CastAbility(info); + } + } +} +UAbilityInfo* ADefaultPlayerController::GetMappedAbility(int32 index) +{ + ANetworkPlayer* netPlayer = Cast(GetPawn()); + if(netPlayer) + { + if(index == 0) + { + if(netPlayer->abilities.Num() > 0) + return netPlayer->abilities[0]; + } + else + { + bool useAlt = index > 4; + index = index - (useAlt ? 5 : 1); + + UAbilityInfo* ability = m_hud->buttonBarSwitcher->GetAbilityMapping(index, useAlt); + if(ability) + { + if(m_learnedAbilities.Contains(ability)) + { + return ability; + } + } + } + } + return nullptr; +} + +void ADefaultPlayerController::TurnAtRate(float Rate) +{ + if(!HasGameFocus()) + return; + + APawn* pawn = GetPawn(); + if (!pawn) + return; + // calculate delta for this frame from the rate information + pawn->AddControllerYawInput(Rate * 45.f * GetWorld()->GetDeltaSeconds()); +} +void ADefaultPlayerController::LookUp(float Rate) +{ + if(!HasGameFocus()) + return; + + APawn* pawn = GetPawn(); + if (!pawn) + return; + pawn->AddControllerPitchInput(Rate); +} +void ADefaultPlayerController::LookUpAtRate(float Rate) +{ + if(!HasGameFocus()) + return; + + APawn* pawn = GetPawn(); + if (!pawn) + return; + // calculate delta for this frame from the rate information + pawn->AddControllerPitchInput(Rate * 45.f * GetWorld()->GetDeltaSeconds()); +} +void ADefaultPlayerController::MoveForward(float Value) +{ + if(!HasGameFocus()) + return; + + ANetworkPossessable* pawn = Cast(GetPawn()); + if (!pawn) + return; + if (Value != 0.0f) + { + FVector forward = pawn->CameraBoom->GetForwardVector(); + forward.Z = 0; + forward.Normalize(); + pawn->AddMovementInput(forward, Value); + } +} +void ADefaultPlayerController::MoveRight(float Value) +{ + if(!HasGameFocus()) + return; + + ANetworkPossessable* pawn = Cast(GetPawn()); + if (!pawn) + return; + if (Value != 0.0f) + { + FVector right = pawn->CameraBoom->GetRightVector(); + right.Z = 0; + right.Normalize(); + pawn->AddMovementInput(right, Value); + } +} + +#define ABILITY_ATTACK(__id, __name) \ +void ADefaultPlayerController::CastAbility##__id()\ +{\ + CastAbility(__id);\ +}\ +void ADefaultPlayerController::UnCastAbility##__id()\ +{\ + UnCastAbility(__id);\ +} +#define ABILITY_OP(__id, __name) \ +void ADefaultPlayerController::CastAbility##__id()\ +{\ + if(m_coopModifier)\ + CastAbility(__id + 4);\ + else\ + CastAbility(__id);\ +}\ +void ADefaultPlayerController::UnCastAbility##__id()\ +{\ + UnCastAbility(__id);\ +} +#include "AbilityBindings.h" + +void ADefaultPlayerController::RightMouseDown() +{ + m_rightMouseDown = true; +} +void ADefaultPlayerController::RightMouseUp() +{ + m_rightMouseDown = false; +} +void ADefaultPlayerController::LeftMouseDown() +{ + if(!HasGameFocus()) + return; + + // Check for switches + FHitResult result; + if (GetHitResultUnderCursor(ECollisionChannel::ECC_WorldDynamic, false, result)) + { + ANetworkPlayer* pawn = Cast(GetPawn()); + if (result.Actor.Get() && result.Actor.Get()->IsA(ANetworkSwitch::StaticClass()) && pawn) + { + pawn->ToggleSwitch(Cast(result.Actor.Get())); + } + } +} + +void ADefaultPlayerController::ToggleSwitch() +{ + ANetworkPlayer* pawn = Cast(GetPawn()); + if (pawn) + { + TArray hits; + + FCollisionQueryParams TraceParams(FName(TEXT("OverlapMulti Trace")), false); + TraceParams.bTraceComplex = false; + TraceParams.bReturnPhysicalMaterial = false; + FVector position = pawn->GetActorLocation(); + FQuat rotation = FQuat(); + FCollisionShape colShape = FCollisionShape::MakeSphere(300); + + GetWorld()->OverlapMultiByObjectType(hits, position, rotation, FCollisionObjectQueryParams::AllDynamicObjects, colShape, TraceParams); + + for (size_t i = 0; i < hits.Num(); i++) + { + if (hits[i].GetActor()->IsA(ANetworkSwitch::StaticClass())) + { + pawn->ToggleSwitch(Cast(hits[i].GetActor())); + break; + } + } + + } +} + +void ADefaultPlayerController::LeftMouseUp() +{ + +} +void ADefaultPlayerController::HoldDown() +{ + m_holdPosition = true; +} +void ADefaultPlayerController::HoldUp() +{ + m_holdPosition = false; +} + +void ADefaultPlayerController::SpawnCharacterForClient() +{ + check(Role == ROLE_Authority); + UWorld* const world = GetWorld(); + check(world); + + ADefaultPlayerState* playerState = Cast(PlayerState); + check(playerState); + ADefaultGameMode* gameMode = world->GetAuthGameMode(); + check(gameMode); + if(gameMode->GetMatchState() != MatchState::InProgress) + return; + + int32 team = playerState->GetTeam(); + + ADefaultGameMode* mode = Cast(world->GetAuthGameMode()); + check(mode); + + // Get the spawns and spawn randomly + APlayerSpawn* const spawn = mode->GetOptimalSpawn(team); + if (IsValid(spawn)) + { + SpawnCharacterForClient(spawn->GetActorLocation() + FVector(0, 0, 120), spawn->GetActorRotation()); + } + else + JERROR("No spawn points available"); +} +void ADefaultPlayerController::SpawnCharacterForClient(const FVector& location, const FRotator& rotation) +{ + check(Role == ROLE_Authority); + UWorld* const world = GetWorld(); + check(world); + + ADefaultPlayerState* playerState = Cast(PlayerState); + check(playerState); + ADefaultGameMode* gameMode = world->GetAuthGameMode(); + check(gameMode); + if (gameMode->GetMatchState() != MatchState::InProgress) + return; + + int32 team = playerState->GetTeam(); + + ADefaultGameMode* mode = Cast(world->GetAuthGameMode()); + check(mode); + + FTransform f; + f.SetTranslation(location + FVector(0, 0, 120)); + f.SetRotation(rotation.Quaternion()); + ANetworkPlayer* character = world->SpawnActor(characterClass, f); + if (!character) + { + GWERROR(L"Failed to spawn character for client, update client??"); + return; + } + character->SetTeam(team); + + mode->RegisterPlayer(*character); + Possess(character); + +#if UE_INCLUDE_METRICS + if (Role == ROLE_Authority) + { + // Register a new player, with name + std::wstring playerName = std::wstring(L"Player ") + GetUniqueID(); + if (IsValid(playerState)) + { + playerName = std::wstring() + playerState->PlayerName; + if (playerName.length() > 512) + playerName.resize(512); + } + + // Assign metrics handle + if (!metricsHandle) + metricsHandle = &Metrics::RegisterPlayer(playerName, uint8(team)); + character->metricsHandle = metricsHandle; + metricsHandle->OnPlayerSpawn(location.X, location.Y); + } +#endif +} + +bool ADefaultPlayerController::LearnSkillOnServer_Validate(UBaseSkillObject* object) +{ + return object != nullptr && (m_skills.Find(object) == INDEX_NONE); +} +void ADefaultPlayerController::LearnSkillOnServer_Implementation(UBaseSkillObject* object) +{ + m_skills.Push(object); +} +bool ADefaultPlayerController::UnlearnSkillOnServer_Validate( UBaseSkillObject* object ) +{ + return object != nullptr && (m_skills.Find( object ) > INDEX_NONE); +} +void ADefaultPlayerController::UnlearnSkillOnServer_Implementation( UBaseSkillObject* object ) +{ + m_skills.Remove( object ); +} + +void ADefaultPlayerController::OnLearnSkill(UBaseSkillObject* object) +{ + //JPRINT("Learned skill " + object ); + //LearnSkillOnServer( object ); +} +void ADefaultPlayerController::OnUnlearnSkill(UBaseSkillObject* object) +{ + //JPRINT("Unlearned skill " + object ); + //UnlearnSkillOnServer( object ); +} + +TArray& ADefaultPlayerController::GetSkills() +{ + return m_skills; +} + +void ADefaultPlayerController::SpawnCombatText_Implementation(const FVector& position, const FString& string, const FLinearColor& color) +{ + if (IsValid(m_hud) && IsValid(m_hud->combatText)) + m_hud->combatText->CreateCombatText(position, string, color); +} +void ADefaultPlayerController::SpawnArcingCombatText_Implementation(const FVector& position, const FString& string, const FLinearColor& color) +{ + if (IsValid(m_hud) && IsValid(m_hud->combatText)) + m_hud->combatText->CreateArcingCombatText(position, string, color); +} + +void ADefaultPlayerController::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + + DOREPLIFETIME(ADefaultPlayerController, m_skills); + DOREPLIFETIME(ADefaultPlayerController, m_defaultPlayer); +} + +void ADefaultPlayerController::UpdateLevel() +{ + if(IsLocalController()) + { + ADefaultPlayerState* state = Cast(PlayerState); + if(m_skillTreeWidget && state) + { + m_skillTreeWidget->UpdateLevel(state->GetLevel() / (float)state->GetMaxLevel()); + } + } +} + +void ADefaultPlayerController::SetLevel(int32 level) +{ + SetLevel_Server(level); +} + +void ADefaultPlayerController::Suicide() +{ + Suicide_Server(); +} +bool ADefaultPlayerController::Suicide_Server_Validate() +{ + return true; +} +void ADefaultPlayerController::Suicide_Server_Implementation() +{ +#if WITH_EDITORONLY_DATA == 1 + ANetworkPlayer* player = Cast(GetPawn()); + if(player && player->abilities[0]) + { + player->NativeDealDamage(player, 9999999, 1.0f, player->abilities[0]); + } +#endif +} + +bool ADefaultPlayerController::SetLevel_Server_Validate(int32 level) +{ + return true; +} +void ADefaultPlayerController::SetLevel_Server_Implementation(int32 level) +{ +#if WITH_EDITORONLY_DATA == 1 + ADefaultPlayerState* state = Cast(PlayerState); + if(state) + { + state->SetLevel(level); + } +#endif +} + +void ADefaultPlayerController::TestWinGame(int32 team) +{ + if(Role == ROLE_Authority) + { + ADefaultGameMode* gm = Cast(GetWorld()->GetAuthGameMode()); + AKingOfTheHillGameMode* kgm = Cast(GetWorld()->GetAuthGameMode()); + if(kgm) + { + kgm->WinGame(team); + } + else if(gm) + { + gm->EndMatch(); + + auto players = gm->GetPlayers(); + // Destroy all player pawns so that they respawn as spectators + for(int32 i = 0; i < players.Num(); i++) + { + if(IsValid(players[i])) + { + players[i]->Destroy(true); + } + } + } + } +} + +void ADefaultPlayerController::CoopModifierOn() +{ + if(!HasGameFocus()) + return; + + m_coopModifier = true; + if(m_hud && m_hud->buttonBarSwitcher) + { + m_hud->buttonBarSwitcher->ToggleSkillSet(m_coopModifier); + } +} +void ADefaultPlayerController::CoopModifierOff() +{ + if(!HasGameFocus()) + return; + + m_coopModifier = false; + if(m_hud && m_hud->buttonBarSwitcher) + { + m_hud->buttonBarSwitcher->ToggleSkillSet(m_coopModifier); + } +} + +void ADefaultPlayerController::m_StartBasicAttack() +{ +} +void ADefaultPlayerController::m_TickBasicAttack() +{ + ANetworkPlayer* netPlayer = Cast(GetPawn()); + if(netPlayer) + { + UAbilityInfo* info = netPlayer->basicAttack; + + // Tick normal basic attacks + if(info && info->actionType == EAbilityActionType::Normal) + { + netPlayer->CastAbility(info); + } + } +} +void ADefaultPlayerController::m_StopBasicAttack() +{ +} \ No newline at end of file diff --git a/Source/UnrealProject/GameState/DefaultPlayerController.h b/Source/UnrealProject/GameState/DefaultPlayerController.h new file mode 100644 index 0000000..422ee18 --- /dev/null +++ b/Source/UnrealProject/GameState/DefaultPlayerController.h @@ -0,0 +1,212 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GameFramework/PlayerController.h" +#include "IngameSkillTree.h" +#include "PlayerControllerBase.h" +#include "PlayerSetupState.h" +#include "DefaultPlayerController.generated.h" + +UCLASS() +class UNREALPROJECT_API ADefaultPlayerController : public APlayerControllerBase +{ + GENERATED_BODY() + +public: + ADefaultPlayerController(const FObjectInitializer& init); + virtual void BeginPlay() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + virtual void Destroyed() override; + virtual void SetupInputComponent() override; + virtual void Tick(float DeltaSeconds) override; + + virtual void Possess(APawn* aPawn) override; + + virtual void SeamlessTravelFrom(class APlayerController* OldPC) override; + + // This is used to handle the player being destroyed + virtual void PawnPendingDestroy(APawn* inPawn) override; + + void UpdatePlayerPosition(const FVector& location, const FRotator& rotator); + + // Called when the possesed pawn is replicated + virtual void OnRep_Pawn() override; + + UFUNCTION(Reliable, Client) + void OnLevelUpClient(const TArray& updatedSkills, const TArray& oldSkills); + + // Only called on server, called to learn skills on the currently owned pawn + void LearnSkillsForLevel(); + + bool GetAbilityButtonLocation(class UAbilityInfo* ability, int32& slot, bool& isAlt); + int32 GetCurrentAbilityLevel(class UAbilityInfo* ability); + + void ToggleSkillTree(); + void ToggleMenu(); + UFUNCTION(BlueprintCallable, Category="UI") + void OnHideUI(); + void OnCharacterCreated(class ANetworkCharacter* character); + void OnCharacterDestroyed(class ANetworkCharacter* character); + const TArray& GetAbilities(APawn* targetPawn = nullptr); + + bool HasGameFocus(); + + // Ability cast + void CastAbility(int32 index); + // Called for hold abilities to turn them off + void UnCastAbility(int32 index); + + UAbilityInfo* GetMappedAbility(int32 index); + + // Ability Button-Down events + void CastAbility0(); + void CastAbility1(); + void CastAbility2(); + void CastAbility3(); + void CastAbility4(); + void CastAbility5(); + void CastAbility6(); + void CastAbility7(); + void CastAbility8(); + // Ability Button-Up events + void UnCastAbility0(); + void UnCastAbility1(); + void UnCastAbility2(); + void UnCastAbility3(); + void UnCastAbility4(); + void UnCastAbility5(); + void UnCastAbility6(); + void UnCastAbility7(); + void UnCastAbility8(); + + void CoopModifierOn(); + void CoopModifierOff(); + void MoveForward(float Value); + void MoveRight(float Value); + void TurnAtRate(float Rate); + void LookUp(float Rate); + void LookUpAtRate(float Rate); + + void RightMouseDown(); + void RightMouseUp(); + void LeftMouseDown(); + void ToggleSwitch(); + void LeftMouseUp(); + void HoldDown(); + void HoldUp(); + + void SpawnCharacterForClient(); + void SpawnCharacterForClient(const FVector& location, const FRotator& rotation); + + UFUNCTION(Reliable, Server, WithValidation) + void LearnSkillOnServer(class UBaseSkillObject* object); + UFUNCTION( Reliable, Server, WithValidation ) + void UnlearnSkillOnServer(class UBaseSkillObject* object); + + void OnLearnSkill(class UBaseSkillObject* object); + void OnUnlearnSkill(class UBaseSkillObject* object); + + TArray& GetSkills(); + + void UpdateLevel(); + + UFUNCTION(Exec) + void SetLevel(int32 level); + UFUNCTION(Reliable, Server, WithValidation) + void SetLevel_Server(int32 level); + + UFUNCTION(Exec) + void Suicide(); + UFUNCTION(Reliable, Server, WithValidation) + void Suicide_Server(); + + UFUNCTION(Exec) + void TestWinGame(int32 team); + + UFUNCTION(Client, Reliable) + void SpawnCombatText(const FVector& position, const FString& string, const FLinearColor& color); + UFUNCTION(Client, Reliable) + void SpawnArcingCombatText(const FVector& position, const FString& string, const FLinearColor& color); + + // Called when setupState is replicated + UFUNCTION() + virtual void OnRep_Setup() override; + + UFUNCTION(BlueprintCallable, Category="State") + FCharacterClassProperty GetCharacterClassProperties() const; + + UFUNCTION(BlueprintCallable, Category = "State") + class UIngameHUD* GetHUD(); + + // Player location history + struct Location + { + Location(const FVector& location, const FRotator& rotation) : location(location), rotation(rotation) {} + FVector location; + FRotator rotation; + }; + TArray playerLocationHistory; + + UPROPERTY(BlueprintReadOnly, EditAnywhere) + class UCharacterClassPropertySet* characterClassProperties; + + METRICS_EXPR(Metrics::PlayerHandle* metricsHandle); + +protected: + // Called when the player possesed pawn has changed, on client or server(players) + virtual void m_OnPawnChanged(); + +private: + void m_UpdateUI(); + void m_CreateIngameSkilltree(); + void m_StartBasicAttack(); + void m_TickBasicAttack(); + void m_StopBasicAttack(); + + // To check editor play + bool m_seamlessTravelDone; + + // Selected class properties the player chose for his character build + FCharacterClassProperty m_classProperties; + + UPROPERTY(Replicated) + TArray m_skills; + + // Check for recent mouse/controller usage + FVector2D m_mouseLast; + + FVector m_holdDirection; + + bool m_rightMouseDown; + bool m_coopModifier; + bool m_holdPosition; + bool m_skillTreeInitialized; + bool m_usingBasicAttack; + + TArray m_mainSkillMapping; + TArray m_altSkillMapping; + TSet m_learnedAbilities; + + TArray m_alreadyLearnedSkills; + + uint32 m_framesSinceMenuFocus; + UPROPERTY() + class UMenuScreen* m_ingameMenu; + UPROPERTY() + class UMenuPanel* m_ingameMenuPanel; + UPROPERTY() + class UIngameHUD* m_hud; + UPROPERTY() + class UUserWidget* m_respawnWidget; + UPROPERTY() + class USkillTreeWidget* m_skillTreeWidget; + friend class ABuff; + + UPROPERTY() + class AIngameSkillTree* m_skillTree; + + UPROPERTY(Replicated) + class ADefaultPlayer* m_defaultPlayer; + +}; diff --git a/Source/UnrealProject/GameState/DefaultPlayerState.cpp b/Source/UnrealProject/GameState/DefaultPlayerState.cpp new file mode 100644 index 0000000..5c61f46 --- /dev/null +++ b/Source/UnrealProject/GameState/DefaultPlayerState.cpp @@ -0,0 +1,121 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" + +#include "DefaultPlayerState.h" +#include "DefaultGameState.h" +#include "DefaultGameInstance.h" +#include "NetworkPlayer.h" + +int32 maxLevel = 16; + +ADefaultPlayerState::ADefaultPlayerState() +{ + // Set the default values for the constant formula variables. + // BaseXP + (VarXP * (Level ^ Exp)); + m_baseExperience = 200; + m_variableExperience = 20; + m_exponentExperience = 1.2f; + + // Default values for the player. + m_level = 1; + m_experience = 0; + character = nullptr; + + // Calculate the experience to level up. + m_experienceToLevel = m_CalculateExperienceToLevel(m_level); + + kills = 0; + deaths = 0; +} + +void ADefaultPlayerState::BeginPlay() +{ + Super::BeginPlay(); +} + +void ADefaultPlayerState::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + + DOREPLIFETIME(ADefaultPlayerState, m_level); + DOREPLIFETIME(ADefaultPlayerState, m_experience); + DOREPLIFETIME(ADefaultPlayerState, m_experienceToLevel); + DOREPLIFETIME(ADefaultPlayerState, character); + DOREPLIFETIME(ADefaultPlayerState, teamMate); + DOREPLIFETIME(ADefaultPlayerState, kills); + DOREPLIFETIME(ADefaultPlayerState, deaths); +} + +// The player level gets converted to an int32, because this function is BlueprintCallable, +// which does not allow int8 values. +int32 ADefaultPlayerState::GetLevel() const +{ + return (int32)m_level; +} + +int32 ADefaultPlayerState::GetMaxLevel() const +{ + return maxLevel; +} + +int32 ADefaultPlayerState::GetExperience() const +{ + return m_experience; +} +int32 ADefaultPlayerState::GetExperienceToLevel() const +{ + return m_experienceToLevel; +} + +void ADefaultPlayerState::GainExperience(int32 gainedExperience) +{ + check(gainedExperience >= 0); + m_experience += gainedExperience; + + if (m_level == maxLevel) + return; + + // Check if a player has leveled up (multiple times). + while (m_experience >= m_experienceToLevel) + { + // Level up. + ++m_level; + m_experience -= m_experienceToLevel; + // Calculate the experience to level up. + m_experienceToLevel = m_CalculateExperienceToLevel(m_level); + if (character) + character->OnLevelUp_Server(m_level); + + if (m_level == maxLevel) + { + m_experience = 0; + break; + } + } +} + +void ADefaultPlayerState::SetLevel(int32 level) +{ + if (Role == ROLE_Authority) + { + GPRINT("Setting level to " + level); + m_level = FMath::Clamp(level, 1, maxLevel); + m_experienceToLevel = m_CalculateExperienceToLevel(m_level + 1); + m_experience = 0; + if(character) + { + character->OnLevelUp_Server(level); + } + } +} + +// Refer to the google/excel sheet for the exact value this will generate. +// Google sheet: https://docs.google.com/spreadsheets/d/1iuSg5efQSg0l2iQ5RLv3wF44RX2-i-gF-1QUB896bVE/edit#gid=0 +// Excel sheet: I:/Y2015A-Y3-BountyMaze/Programming/Documentation/Experience required to level Sheet.xlsx +int32 ADefaultPlayerState::m_CalculateExperienceToLevel(int32 level) +{ + // BaseXP + (VarXP * (Level ^ Exp)); + return m_baseExperience + m_variableExperience * (pow(level, m_exponentExperience)); +} + diff --git a/Source/UnrealProject/GameState/DefaultPlayerState.h b/Source/UnrealProject/GameState/DefaultPlayerState.h new file mode 100644 index 0000000..c0e1c35 --- /dev/null +++ b/Source/UnrealProject/GameState/DefaultPlayerState.h @@ -0,0 +1,68 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "PlayerStateBase.h" +#include "DefaultPlayerState.generated.h" + +/* + In-game state of a player. +*/ +UCLASS() +class UNREALPROJECT_API ADefaultPlayerState : public APlayerStateBase +{ + GENERATED_BODY() +public: + ADefaultPlayerState(); + virtual void BeginPlay() override; + + // Get Functions + // Integer level value from 1-max + UFUNCTION(BlueprintCallable, Category = "Level Functions") + int32 GetLevel() const; + UFUNCTION(BlueprintCallable, Category = "Level Functions") + int32 GetMaxLevel() const; + // Current experience in-level + UFUNCTION(BlueprintCallable, Category = "Level Functions") + int32 GetExperience() const; + // Totale experience needed for the next level + UFUNCTION(BlueprintCallable, Category = "Level Functions") + int32 GetExperienceToLevel() const; + + // DEBUG functionality for setting a player level + void SetLevel(int32 level); + + // Call the function to grant a player with experience, this function will also handle leveling up. + UFUNCTION(BlueprintCallable, Category = "Level Functions") + void GainExperience(int32 gainedExperience); + + // The character the player currently controls, or null when dead + UPROPERTY(BlueprintReadOnly, Replicated, Category = "Character") + class ANetworkPlayer* character; + + // The person that is in the same team as this player, or null when dead or there is none + UPROPERTY(BlueprintReadOnly, Replicated, Category = "Character") + class ADefaultPlayerState* teamMate; + + UPROPERTY(BlueprintReadonly, Replicated, Category = "Score") + int32 kills; + UPROPERTY(BlueprintReadonly, Replicated, Category = "Score") + int32 deaths; + +private: + // Calculates the experience needed to level up to a given level + int32 m_CalculateExperienceToLevel(int32 level); + + // Variables to keep track of what level/experience the player has. + UPROPERTY(Replicated) + int8 m_level; + UPROPERTY(Replicated) + int32 m_experience; + // Variable to check if a player has leveled up. + UPROPERTY(Replicated) + int32 m_experienceToLevel; + // Variables for calculating the experience to level up. + int32 m_baseExperience; + int32 m_variableExperience; + float m_exponentExperience; +}; diff --git a/Source/UnrealProject/GameState/GameStateBase.cpp b/Source/UnrealProject/GameState/GameStateBase.cpp new file mode 100644 index 0000000..109089d --- /dev/null +++ b/Source/UnrealProject/GameState/GameStateBase.cpp @@ -0,0 +1,201 @@ +#include "UnrealProject.h" +#include "GameStateBase.h" + +#include "PlayerStateBase.h" +#include "DefaultPlayerController.h" +#include "DefaultGameInstance.h" +#include "MapData.h" + +AGameStateBase::AGameStateBase() +{ + m_mapTeamCount = 4; + m_hasWarnedFrank = false; +} +void AGameStateBase::BeginPlay() +{ + Super::BeginPlay(); + mapPath = GetWorld()->GetPathName(); + m_LoadActiveMapInfo(); +} +void AGameStateBase::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + OnPlayerStateChange.Clear(); +} +void AGameStateBase::RegisterPlayer(APlayerControllerBase* player) +{ + check(Role == ROLE_Authority); + check(player); + APlayerStateBase* state = Cast(player->PlayerState); + check(state); + m_playersByController.Add(player, state); + m_players.Add(state); + + // More than 1 player in editor means multiplayer in PIE mode + if(m_players.Num() > 1) + { + EnterLobby(); + } + + OnPlayerStateChange.Broadcast(nullptr); +} +void AGameStateBase::DeregisterPlayer(APlayerControllerBase* player) +{ + check(Role == ROLE_Authority); + m_playersByController.Remove(player); + + m_players.SetNum(0); + for(auto it = m_playersByController.CreateIterator(); it; ++it) + { + m_players.Add(it->Value); + } + + OnPlayerStateChange.Broadcast(nullptr); +} +void AGameStateBase::EnterLobby() +{ + check(Role == ROLE_Authority); + for(auto it = m_playersByController.CreateIterator(); it; ++it) + { + it->Key->EnterLobby(); + } +} + +void AGameStateBase::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + + DOREPLIFETIME(AGameStateBase, m_players); + DOREPLIFETIME(AGameStateBase, m_mapTeamCount); + DOREPLIFETIME(AGameStateBase, mapPath); +} + +TArray& AGameStateBase::GetPlayers() +{ + return m_players; +} +TArray> AGameStateBase::GetPlayersByTeam() +{ + TArray> ret; + for(int32 i = 0; i < m_players.Num(); i++) + { + APlayerStateBase* player = m_players[i]; + if(!player) + continue; + int32 team = player->GetTeam(); + if(team >= ret.Num()) + { + ret.SetNum(team + 1); + } + TArray& dstArray = ret[team]; + + dstArray.Add(player); + } + return ret; +} + +TArray AGameStateBase::GetTeamSizes() +{ + TArray teamSizes; + teamSizes.SetNumZeroed(m_mapTeamCount); + + for(int32 i = 0; i < m_players.Num(); i++) + { + if(!m_players[i]) + continue; + int32 team = m_players[i]->GetTeam() - 1; + if(team < 0 || team >= m_mapTeamCount) + continue; + teamSizes[team]++; + } + + return TArray(teamSizes); +} +int32 AGameStateBase::GetOptimalAutoJoinTeam() +{ + if(GetWorld()->IsPlayInEditor()) + { + // PIE uses different assignment, default to 2 players per team and then move to the next team + TArray teamSize = GetTeamSizes(); + int32 optimalTeam = -1; + + for(int32 i = 0; i < m_mapTeamCount; i++) + { + if(teamSize[i] < 2) + { + optimalTeam = i; + break; + } + } + + return optimalTeam + 1; + } + else + { + TArray teamSize = GetTeamSizes(); + int32 smallestSize = 2; + int32 optimalTeam = -1; + + for(int32 i = 0; i < m_mapTeamCount; i++) + { + if(teamSize[i] < smallestSize) + { + optimalTeam = i; + smallestSize = teamSize[i]; + } + } + + return optimalTeam + 1; + } +} +int32 AGameStateBase::GetMapTeamCount() const +{ + return m_mapTeamCount; +} + +UMapData* AGameStateBase::GetMapData() const +{ + return m_mapData; +} +void AGameStateBase::m_OnRep_MapPath() +{ + GPRINT("Map changed to " + mapPath); + m_LoadActiveMapInfo(); + if(m_mapData) + GPRINT("Found attached map data " + m_mapData->GetName()); + else + GERROR("No attached map data found."); +} + +void AGameStateBase::OnPlayerStateChange_Multi_Implementation() +{ + if (m_playersByController.Num() > 0) + OnPlayerStateChange.Broadcast(nullptr); +} + +TMap AGameStateBase::GetPlayersByController() +{ + return m_playersByController; +} + +bool AGameStateBase::m_LoadActiveMapInfo() +{ + UDefaultGameInstance* gameInstance = Cast(GetGameInstance()); + if(!gameInstance) + return false; + m_mapData = gameInstance->GetMapData(mapPath); + if(!m_mapData) + { + if(!m_hasWarnedFrank) + { + GWERROR(L"Failed to load map info, Create a map info asset with the name formated as I_ + map name in the same folder and add the I_ file to the map list frank!!!"); + m_hasWarnedFrank = true; + } + m_mapTeamCount = 4; + } + else + { + m_mapTeamCount = m_mapData->maxTeamCount; + } + return true; +} \ No newline at end of file diff --git a/Source/UnrealProject/GameState/GameStateBase.h b/Source/UnrealProject/GameState/GameStateBase.h new file mode 100644 index 0000000..ca36632 --- /dev/null +++ b/Source/UnrealProject/GameState/GameStateBase.h @@ -0,0 +1,106 @@ +#pragma once +#include "GameFramework/GameState.h" +#include "GameStateBase.Generated.h" + +/* + Lobby state +*/ + +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnPlayerStateChange, class APlayerControllerBase*, playerController); + +USTRUCT() +struct FLobbyStatePlayer +{ + GENERATED_USTRUCT_BODY() +public: + int32 team; + TSharedPtr netID; +}; + +UCLASS() +class ALobbyState : public AInfo +{ + GENERATED_BODY() +public: + UPROPERTY() + TArray players; +}; + +/* + Base game state, keeping all the players in the current game and keeping their assigned teams +*/ +UCLASS() +class AGameStateBase : public AGameState +{ + GENERATED_BODY() + friend class AMenuGameMode; + +public: + AGameStateBase(); + virtual void BeginPlay() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason); + + virtual void RegisterPlayer(class APlayerControllerBase* player); + virtual void DeregisterPlayer(class APlayerControllerBase* player); + + // Tells all the players to go to the lobby screen + void EnterLobby(); + + TArray& GetPlayers(); + template TArray GetPlayers() + { + return reinterpret_cast&>(GetPlayers()); + } + TArray> GetPlayersByTeam(); + template TArray> GetPlayersByTeam() + { + auto r = GetPlayersByTeam(); + return reinterpret_cast>&>(r); + } + + UFUNCTION(BlueprintCallable, Category = "Players") + TArray GetPlayerControllers() + { + TArray result; + m_playersByController.GenerateKeyArray(result); + return result; + } + + TArray GetTeamSizes(); + int32 GetOptimalAutoJoinTeam(); + + UFUNCTION(BlueprintCallable, Category="Team") + int32 GetMapTeamCount() const; + + UFUNCTION(BlueprintCallable, Category = "Map") + UMapData* GetMapData() const; + + UPROPERTY(Replicated, ReplicatedUsing = m_OnRep_MapPath, BlueprintReadOnly, Category = "Map") + FString mapPath; + + // Called when a player has joined/left or switched team + UFUNCTION(NetMulticast, Reliable) + void OnPlayerStateChange_Multi(); + UPROPERTY(BlueprintAssignable, Category = Events) + FOnPlayerStateChange OnPlayerStateChange; + + TMap GetPlayersByController(); + +private: + // Tries to load the current map data + bool m_LoadActiveMapInfo(); + UFUNCTION() + void m_OnRep_MapPath(); + + UPROPERTY(Replicated) + int32 m_mapTeamCount; + UPROPERTY() + class UMapData* m_mapData; + // For debugging + bool m_hasWarnedFrank; + + UPROPERTY() + TMap m_playersByController; + UPROPERTY(Replicated) + TArray m_players; +}; \ No newline at end of file diff --git a/Source/UnrealProject/GameState/KOTHGameState.cpp b/Source/UnrealProject/GameState/KOTHGameState.cpp new file mode 100644 index 0000000..78d77df --- /dev/null +++ b/Source/UnrealProject/GameState/KOTHGameState.cpp @@ -0,0 +1,31 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "KOTHGameState.h" + + +void AKOTHGameState::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + DOREPLIFETIME(AKOTHGameState, kothTeams); + DOREPLIFETIME(AKOTHGameState, maxGameScore); + DOREPLIFETIME(AKOTHGameState, overtime); +} + +FKOTHTeamState AKOTHGameState::GetTeam(int32 team) const +{ + // Team to array index [1-5] -> [0-4] + team -= 1; + if(team >= 0 && team < kothTeams.Num()) + return kothTeams[team]; + return FKOTHTeamState(); +} + +void AKOTHGameState::BroadcastOnHillCaptured_Implementation(int32 team) +{ + onHillCaptured.Broadcast(team); +} +void AKOTHGameState::m_OnRep_Overtime() +{ + GPRINT("Overtime = " + overtime); +} diff --git a/Source/UnrealProject/GameState/KOTHGameState.h b/Source/UnrealProject/GameState/KOTHGameState.h new file mode 100644 index 0000000..6f7ff5a --- /dev/null +++ b/Source/UnrealProject/GameState/KOTHGameState.h @@ -0,0 +1,38 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "DefaultGameState.h" +#include "KOTHTeamState.h" +#include "KOTHGameState.generated.h" + +UCLASS() +class AKOTHGameState : public ADefaultGameState +{ + GENERATED_BODY() +public: + void GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const; + + UFUNCTION(BlueprintCallable, Category="Game") + FKOTHTeamState GetTeam(int32 team) const; + + UFUNCTION(NetMulticast, Reliable) + void BroadcastOnHillCaptured(int32 team); + + DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnHillCaptured, int32, team); + UPROPERTY(BlueprintAssignable, Category="Game") + FOnHillCaptured onHillCaptured; + + UPROPERTY(Replicated, ReplicatedUsing=m_OnRep_Overtime, BlueprintReadOnly) + bool overtime; + UPROPERTY(Replicated, BlueprintReadOnly) + TArray kothTeams; + UPROPERTY(Replicated, BlueprintReadOnly) + float maxGameScore; + +private: + UFUNCTION() + void m_OnRep_Overtime(); + + friend class AKingOfTheHillGameMode; +}; diff --git a/Source/UnrealProject/GameState/KOTHPlayerController.cpp b/Source/UnrealProject/GameState/KOTHPlayerController.cpp new file mode 100644 index 0000000..4b53ac4 --- /dev/null +++ b/Source/UnrealProject/GameState/KOTHPlayerController.cpp @@ -0,0 +1,47 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "KOTHPlayerController.h" +#include "NetworkPlayer.h" +#include "KOTHHUD.h" +#include "KOTHGameState.h" + +void AKOTHPlayerController::BeginPlay() +{ + Super::BeginPlay(); +} + +void AKOTHPlayerController::Tick(float DeltaSeconds) +{ + Super::Tick(DeltaSeconds); + + AKOTHGameState* gs = GetGameState(); + if(gs && m_kothhud) + { + m_kothhud->Update(gs->kothTeams); + } +} + +void AKOTHPlayerController::m_OnPawnChanged() +{ + Super::m_OnPawnChanged(); + + class ANetworkPlayer* character = Cast(GetPawn()); + if(character) + { + if(IsLocalController()) + { + if(!m_kothhud) + { + m_kothhud = CreateWidget(GetWorld(), kothHUD); + if(m_kothhud) + { + m_kothhud->AddToViewport(2); + } + } + } + } + + if(m_kothhud) + m_kothhud->SetVisibility(character ? ESlateVisibility::Visible : ESlateVisibility::Hidden); +} diff --git a/Source/UnrealProject/GameState/KOTHPlayerController.h b/Source/UnrealProject/GameState/KOTHPlayerController.h new file mode 100644 index 0000000..18049f4 --- /dev/null +++ b/Source/UnrealProject/GameState/KOTHPlayerController.h @@ -0,0 +1,23 @@ +// Project Lab - NHTV Igad + +#pragma once +#include "DefaultPlayerController.h" +#include "KOTHPlayerController.generated.h" + +UCLASS() +class UNREALPROJECT_API AKOTHPlayerController : public ADefaultPlayerController +{ + GENERATED_BODY() +public: + virtual void BeginPlay() override; + virtual void Tick(float DeltaSeconds) override; + + UPROPERTY(EditDefaultsOnly) + TSubclassOf kothHUD; + +protected: + virtual void m_OnPawnChanged(); + +private: + class UKOTHHUD* m_kothhud; +}; diff --git a/Source/UnrealProject/GameState/KOTHTeamState.h b/Source/UnrealProject/GameState/KOTHTeamState.h new file mode 100644 index 0000000..f2d9e29 --- /dev/null +++ b/Source/UnrealProject/GameState/KOTHTeamState.h @@ -0,0 +1,18 @@ +#pragma once +#include "KOTHTeamState.Generated.h" + +USTRUCT(BlueprintType) +struct FKOTHTeamState +{ + GENERATED_USTRUCT_BODY() +public: + UPROPERTY(BlueprintReadOnly) + float score; + UPROPERTY(BlueprintReadOnly) + float maxScore; + // If this is greater than 0, the team has recently received score + UPROPERTY(BlueprintReadOnly) + int32 active; + UPROPERTY(BlueprintReadOnly) + bool containsMembers; +}; diff --git a/Source/UnrealProject/GameState/KingOfTheHillGameMode.cpp b/Source/UnrealProject/GameState/KingOfTheHillGameMode.cpp new file mode 100644 index 0000000..275bd1a --- /dev/null +++ b/Source/UnrealProject/GameState/KingOfTheHillGameMode.cpp @@ -0,0 +1,131 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "KingOfTheHillGameMode.h" +#include "DefaultGameState.h" +#include "DefaultGameState.h" +#include "DefaultGameInstance.h" +#include "PlayerSpawn.h" +#include "NetworkPlayer.h" +#include "CreatureSpawn.h" +#include "DefaultPlayer.h" +#include "DefaultPlayerState.h" +#include "KOTHPlayerController.h" +#include "KOTHGameState.h" +#include "KOTHBossSpawner.h" + +AKingOfTheHillGameMode::AKingOfTheHillGameMode() +{ + PrimaryActorTick.bCanEverTick = true; + + // Lobby system starts the match + bDelayedStart = true; + + PlayerControllerClass = AKOTHPlayerController::StaticClass(); + DefaultPawnClass = ConstructorHelpers::FClassFinder(TEXT("/Game/Assets/Blueprints/BP_DefaultPlayer")).Class; + SpectatorClass = ConstructorHelpers::FClassFinder(TEXT("/Game/Assets/Blueprints/BP_SpectatorPawn")).Class; + + GameStateClass = AKOTHGameState::StaticClass(); + PlayerStateClass = ADefaultPlayerState::StaticClass(); + maxGameScore = 60.0f; + m_currentTeamWithHill = -1; +} +void AKingOfTheHillGameMode::InitGame(const FString& MapName, const FString& Options, FString& ErrorMessage) +{ + Super::InitGame(MapName, Options, ErrorMessage); + + auto spawnerIt = TActorIterator(GetWorld(), AKOTHBossSpawner::StaticClass()); + if(!spawnerIt) + { + GERROR("No instance of AKOTHBossSpawner found in the level, you need one when using the KOTH game mode!"); + } + else + { + bossSpawner = *spawnerIt; + } +} +void AKingOfTheHillGameMode::HandleMatchHasStarted() +{ + AKOTHGameState* gameState = GetGameState(); + gameState->maxGameScore = maxGameScore; + TArray teamsize = gameState->GetTeamSizes(); + for (int i = 0; i < teamsize.Num(); i++) + { + FKOTHTeamState state; + state.active = 0; + state.score = 0.0f; + state.maxScore = maxGameScore; + state.containsMembers = teamsize[i] > 0; + gameState->kothTeams.Add(state); + } + + Super::HandleMatchHasStarted(); +} +void AKingOfTheHillGameMode::Tick(float deltaTime) +{ + Super::Tick(deltaTime); + + AKOTHGameState* gameState = GetGameState(); + for (int i = 0; i < gameState->kothTeams.Num(); i++) + { + FKOTHTeamState& state = gameState->kothTeams[i]; + if(state.score >= maxGameScore) + { + // Check overtime condition + if(bossSpawner) + { + // Check overtime conditions / convert index to team index [0-4] -> [1-5] + if(!bossSpawner->IsContested(i + 1) && bossSpawner->IsBossAlive()) + { + WinGame(i); + } + else + { + gameState->overtime = true; + } + } + } + + if(state.active > 0) + { + state.active--; + } + } + +} +void AKingOfTheHillGameMode::WinGame(int team) +{ + TArray players(m_players); + + // Set winning team in gamestate (replicated) + GetGameState()->gameWinningTeam = team; + + EndMatch(); + + // Destroy all player pawns so that they respawn as spectators + for (int32 i = 0; i < players.Num(); i++) + { + if(IsValid(players[i])) + { + players[i]->Destroy(true); + } + } + + //TPRINT("Boss was killed. (ADefaultGameMode) the team = " + team); +} + +void AKingOfTheHillGameMode::AddScore(int team, float duration) +{ + // team to array index [1-5] -> [0-4] + team -= 1; + AKOTHGameState* gameState = GetGameState(); + if(team < 0 || team >= gameState->kothTeams.Num()) + return; + gameState->kothTeams[team].score += duration; + gameState->kothTeams[team].active = 2; + if(m_currentTeamWithHill != team) + { + gameState->BroadcastOnHillCaptured(team); + m_currentTeamWithHill = team; + } +} \ No newline at end of file diff --git a/Source/UnrealProject/GameState/KingOfTheHillGameMode.h b/Source/UnrealProject/GameState/KingOfTheHillGameMode.h new file mode 100644 index 0000000..78bea4a --- /dev/null +++ b/Source/UnrealProject/GameState/KingOfTheHillGameMode.h @@ -0,0 +1,35 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GameState/DefaultGameMode.h" +#include "KOTHTeamState.h" +#include "KingOfTheHillGameMode.generated.h" + +/** + * + */ +UCLASS(Config=Game) +class UNREALPROJECT_API AKingOfTheHillGameMode : public ADefaultGameMode +{ + GENERATED_BODY() + +public: + AKingOfTheHillGameMode(); + virtual void InitGame(const FString& MapName, const FString& Options, FString& ErrorMessage) override; + virtual void HandleMatchHasStarted() override; + virtual void Tick(float DeltaTime) override; + + void AddScore(int team, float duration); + void WinGame(int team); + + UPROPERTY(Config) + float maxGameScore; + + UPROPERTY(BlueprintReadOnly) + class AKOTHBossSpawner* bossSpawner; + +private: + int32 m_currentTeamWithHill; + friend class AKOTHGameState; +}; diff --git a/Source/UnrealProject/GameState/MapData.h b/Source/UnrealProject/GameState/MapData.h new file mode 100644 index 0000000..ed20ae6 --- /dev/null +++ b/Source/UnrealProject/GameState/MapData.h @@ -0,0 +1,26 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Blueprint/UserWidget.h" +#include "MapData.generated.h" + +UCLASS(BlueprintType) +class UMapData : public UDataAsset +{ + GENERATED_BODY() + +public: + UMapData(); + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Level") + FString friendlyName; + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Level") + FString description; + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Level", + meta = (ClampMin = "2", ClampMax = "4", UIMin = "2", UIMax = "4")) + int32 maxTeamCount; + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Level") + UTexture2D* icon; + UPROPERTY(BlueprintReadOnly, Category = "Level") + FString pathToAsset; +}; \ No newline at end of file diff --git a/Source/UnrealProject/GameState/MapList.h b/Source/UnrealProject/GameState/MapList.h new file mode 100644 index 0000000..21388bb --- /dev/null +++ b/Source/UnrealProject/GameState/MapList.h @@ -0,0 +1,11 @@ +#pragma once +#include "MapList.generated.h" + +UCLASS(BlueprintType) +class UMapList : public UDataAsset +{ + GENERATED_BODY() +public: + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "MapList") + TArray mapList; +}; \ No newline at end of file diff --git a/Source/UnrealProject/GameState/MatchMaking.cpp b/Source/UnrealProject/GameState/MatchMaking.cpp new file mode 100644 index 0000000..6517983 --- /dev/null +++ b/Source/UnrealProject/GameState/MatchMaking.cpp @@ -0,0 +1,78 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "MatchMaking.h" +#include "Online.h" + +/* +const uint8* FUniqueNetIdMatchMaking::GetBytes() const +{ + return (uint8*)&UniqueNetId; +} +int32 FUniqueNetIdMatchMaking::GetSize() const +{ + return sizeof(uint64); +} + +#if PLATFORM_SPECIFIC_WIN == 0 +#pragma warning(push) +#pragma warning(disable:4996) +#include "steam/steam_api.h" +bool FUniqueNetIdMatchMaking::IsValid() const +{ + return UniqueNetId != 0 && CSteamID(UniqueNetId).IsValid(); +} +#pragma warning(pop) +#else +bool FUniqueNetIdMatchMaking::IsValid() const +{ + return UniqueNetId != 0; +} +#endif + +FString FUniqueNetIdMatchMaking::ToString() const +{ + return FString::Printf(TEXT("%llu"), UniqueNetId); +} +FString FUniqueNetIdMatchMaking::ToDebugString() const +{ + return ToString(); +} + + +inline uint64 GetNetId(FNamedOnlineSession* session) +{ + FOnlineSessionInfoMatchMaking* SessionInfo = (FOnlineSessionInfoMatchMaking*)(session->SessionInfo.Get()); + FInternetAddrMatchMaking* addr = (FInternetAddrMatchMaking*)SessionInfo->P2PAddr.Get(); + return addr->NetId.UniqueNetId; +} +inline uint32 GetChannelId(FNamedOnlineSession* session) +{ + FOnlineSessionInfoMatchMaking* SessionInfo = (FOnlineSessionInfoMatchMaking*)(session->SessionInfo.Get()); + FInternetAddrMatchMaking* addr = (FInternetAddrMatchMaking*)SessionInfo->P2PAddr.Get(); + return addr->ChannelId; +} + +MatchMaking::MatchMaking(FNamedOnlineSession* session) : IMatchMakingInterface(GetNetId(session), GetChannelId(session)) +{ + +} + +MatchMaking::~MatchMaking() +{ +} + + +void MatchMaking::OnConnect() +{ + JPRINT("Connected to matchmaking server"); +} +void MatchMaking::OnDisconnect() +{ + JERROR("Disconnected from matchmaking server"); +} +void MatchMaking::OnForceJoinSession(NetID netID, ChannelID channelID) +{ + +} +*/ \ No newline at end of file diff --git a/Source/UnrealProject/GameState/MatchMaking.h b/Source/UnrealProject/GameState/MatchMaking.h new file mode 100644 index 0000000..cdec7f1 --- /dev/null +++ b/Source/UnrealProject/GameState/MatchMaking.h @@ -0,0 +1,53 @@ +// Project Lab - NHTV Igad + +/* +#pragma once +#include "MatchMaking.hpp" +#include "Networking.h" + + +class FOnlineSessionInfoMatchMaking : public FOnlineSessionInfo +{ +public: + virtual ~FOnlineSessionInfoMatchMaking() {} + + enum PH {}; + PH SessionType; + TSharedPtr HostAddr; + TSharedPtr P2PAddr; +}; + +class FUniqueNetIdMatchMaking : public FUniqueNetId +{ +public: + ~FUniqueNetIdMatchMaking() {} + + uint64 UniqueNetId; + + virtual const uint8* GetBytes() const override; + virtual int32 GetSize() const override; + virtual bool IsValid() const override; + virtual FString ToString() const override; + virtual FString ToDebugString() const override; +}; + +class FInternetAddrMatchMaking : public FInternetAddr +{ +public: + virtual ~FInternetAddrMatchMaking() {} + + FUniqueNetIdMatchMaking NetId; + int32 ChannelId; +}; + +class UNREALPROJECT_API MatchMaking : public IMatchMakingInterface +{ +public: + MatchMaking(class FNamedOnlineSession* session); + ~MatchMaking(); + + virtual void OnConnect() override; + virtual void OnDisconnect() override; + virtual void OnForceJoinSession(NetID netID, ChannelID channelID) override; +}; +*/ \ No newline at end of file diff --git a/Source/UnrealProject/GameState/MenuController.cpp b/Source/UnrealProject/GameState/MenuController.cpp new file mode 100644 index 0000000..39925df --- /dev/null +++ b/Source/UnrealProject/GameState/MenuController.cpp @@ -0,0 +1,332 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "DefaultGameInstance.h" +#include "MenuController.h" +#include "SplashScreen.h" +#include "LobbyMenu.h" +#include "CharacterSettings.h" +#include "StartPromptScreen.h" +#include "PlayerStateBase.h" +#include "GameStateBase.h" +#include "SessionManager.h" +#include "TransitionScreen.h" +#include "ScreenOverlay.h" +#include "SkillTreeWidget.h" +#include "DefaultPlayerController.h" +#include "MenuScreen.h" +#include "MenuGameMode.h" + +static UClass* menuWidgetClass = nullptr; +static UClass* lobbyWidgetClass = nullptr; +static UClass* splashScreenClass = nullptr; +static UClass* startScreenClass = nullptr; +static UClass* skillTreeClass = nullptr; +static TSubclassOf mainSubMenuClass; + +AMenuController::AMenuController(const FObjectInitializer& ObjectInitializer) + : Super(ObjectInitializer) +{ + menuWidgetClass = ConstructorHelpers::FClassFinder(TEXT("/Game/Assets/GUI/WEEGEE_Menu")).Class; + lobbyWidgetClass = ConstructorHelpers::FClassFinder(TEXT("/Game/Assets/GUI/WEEGEE_Lobby")).Class; + splashScreenClass = ConstructorHelpers::FClassFinder(TEXT("/Game/Assets/GUI/WEEGEE_Splash")).Class; + startScreenClass = ConstructorHelpers::FClassFinder(TEXT("/Game/Assets/GUI/WEEGEE_StartPrompt")).Class; + skillTreeClass = ConstructorHelpers::FClassFinder(TEXT("/Game/Assets/GUI/WEEGEE_SkillTree")).Class; + mainSubMenuClass = ConstructorHelpers::FClassFinder(TEXT("/Game/Assets/GUI/Menus/WEEGEE_MainSubMenu")).Class; + + this->bShowMouseCursor = true; + m_inLobby = false; + PrimaryActorTick.bCanEverTick = true; +} + +void AMenuController::BeginPlay() +{ + Super::BeginPlay(); + + if(IsLocalController()) + { + // Create skill tree widget + skillTree = CreateWidget(GetWorld(), skillTreeClass); + skillTree->AddToViewport(5); + + UDefaultGameInstance* inst = Cast(GetGameInstance()); + UWorld* world = GetWorld(); + bool showSplash = !inst->splashScreenShown; + if(world->WorldType == EWorldType::PIE) + showSplash = false; + if(inst->sessionManager->HasNetConnection()) + showSplash = false; + + if(showSplash) + { + m_splash = CreateWidget(this, splashScreenClass); + m_splash->onDone.AddDynamic(this, &AMenuController::m_OnSplashScreenEnded); + check(m_splash); + m_splash->AddToViewport(); + } + else + { + m_OnStartPromptClosed(); + } + + inst->splashScreenShown = true; + + inst->sessionManager->onAcceptInvite.AddUObject(this, &AMenuController::m_OnInviteAccepted); + } +} +void AMenuController::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + + UDefaultGameInstance* inst = Cast(GetGameInstance()); + inst->sessionManager->onAcceptInvite.RemoveAll(this); +} + +void AMenuController::NotifyLoadedWorld(FName WorldPackageName, bool bFinalDest) +{ + Super::NotifyLoadedWorld(WorldPackageName, bFinalDest); + if(bFinalDest) + { + GPRINT("Final level loaded for player controller " + GetName()); + if(transitionScreen) + { + // Hide transition screen + transitionScreen->OnHide(); + } + } +} + +void AMenuController::Destroyed() +{ + GPRINT("Menu controller destroyed " + GetName()); + Super::Destroyed(); +} + +void AMenuController::PreClientTravel(const FString& PendingURL, ETravelType TravelType, bool bIsSeamlessTravel) +{ + if(bIsSeamlessTravel) + { + // Hide lobby UI + if(lobbyMenu) + lobbyMenu->OnHide(); + + // Close all the menu + if(m_splash) + m_splash->RemoveFromViewport(); + if(m_startScreen) + m_startScreen->RemoveFromViewport(); + if(lobbyMenu) + lobbyMenu->RemoveFromViewport(); + if(mainMenu) + mainMenu->RemoveFromViewport(); + if(skillTree) + skillTree->RemoveFromViewport(); + mainMenu = nullptr; + lobbyMenu = nullptr; + skillTree = nullptr; + m_startScreen = nullptr; + m_splash = nullptr; + + // Show transition screen + transitionScreen->OnShow(); + + GPRINT("Seamless travel on player " + GetName() + " to \"" + PendingURL + "\""); + } + else + { + GPRINT("Regular travel on player to " + GetName() + " to \"" + PendingURL + "\""); + } + Super::PreClientTravel(PendingURL, TravelType, bIsSeamlessTravel); +} + +void AMenuController::SeamlessTravelFrom(class APlayerController* OldPC) +{ + Super::SeamlessTravelFrom(OldPC); + GPRINT("Seamless travel to menu [" + GetName() + "]<-[" + OldPC->GetName() + "]"); +} +void AMenuController::SeamlessTravelTo(class APlayerController* NewPC) +{ + Super::SeamlessTravelTo(NewPC); + GPRINT("Seamless travel to game level [" + GetName() + "]->[" + NewPC->GetName() + "]"); + APlayerStateBase* pcbn = Cast(NewPC->PlayerState); + APlayerStateBase* pcbo = GetPlayerState(); + + check(pcbn && pcbo); + pcbn->Transfer(pcbo); + + ADefaultPlayerController* newDPC = Cast(NewPC); + if(newDPC) + { + newDPC->setupState = setupState; + } +} + +void AMenuController::OnLearnSkill(class UBaseSkillObject* object) +{ +} +void AMenuController::OnUnlearnSkill(class UBaseSkillObject* object) +{ +} + +void AMenuController::OnEnterLobby() +{ + if(m_inLobby) + return; + + if(mainMenu && lobbyMenu) + { + mainMenu->OnHide(); + lobbyMenu->OnShow(); + lobbyMenu->OnLobbyEnter(); + m_inLobby = true; + OnRep_PlayerState(); + } + else + { + GERROR("wat"); + } + + // Set Default character slot + /// TODO: Add selector widget + //UCharacterSettings* settings = Cast(GetGameInstance())->GetCharacterSettings(); + //if(settings->characterSaves.Num() > 0) + //{ + // const FCharacterSave& save = settings->characterSaves[0]; + // FPlayerSetupState pss; + // pss.customizations = save.characterCustomization; + // pss.skills = save.skillTreeState; + // pss.characterClass = save.characterClass; + // SetSetupState(pss); + //} +} + +/// TODO, validate skill tree / customization here +bool AMenuController::SetSetupState_Validate(const FPlayerSetupState& state) +{ + return true; +} +void AMenuController::SetSetupState_Implementation(const FPlayerSetupState& state) +{ + setupState = state; + + // Resync the lobby + UWorld* const world = GetWorld(); + if (IsValid(world)) + { + AGameStateBase* const gameState = Cast(GetWorld()->GetGameState()); + if (IsValid(gameState)) + gameState->OnPlayerStateChange.Broadcast(this); + } +} + +void AMenuController::OnRep_PlayerState() +{ + // Request a team if we're in a lobby + if(m_inLobby) + { + m_AutoRequestTeam(); + } + + // Send to the server that we got our player state + m_OnClientInitialized(); +} + +void AMenuController::SwitchToMenu() +{ + mainMenu->OnShow(); + lobbyMenu->OnHide(); + m_inLobby = false; +} + +bool AMenuController::m_OnClientInitialized_Validate() +{ + return true; +} +void AMenuController::m_OnClientInitialized_Implementation() +{ + AMenuGameMode* gm = Cast(GetWorld()->GetAuthGameMode()); + if(gm) + { + gm->onPlayerJoined.Broadcast(this); + } +} + +void AMenuController::m_OnInviteAccepted(bool success, const FOnlineSessionSearchResult& result) +{ + if(success) + { + GPRINT("Accepted an invite"); + UDefaultGameInstance* inst = Cast(GetGameInstance()); + + inst->sessionManager->onJoinSessionComplete.AddUObject(this, &AMenuController::m_OnSessionJoined); + inst->sessionManager->JoinSession(result); + } +} +void AMenuController::m_OnSessionJoined(int32 result) +{ + UDefaultGameInstance* inst = Cast(GetGameInstance()); + inst->sessionManager->onJoinSessionComplete.RemoveAll(this); + + if(result == EOnJoinSessionCompleteResult::Success) + { + ClientTravel(inst->sessionManager->joinConnectionString, ETravelType::TRAVEL_Absolute); + } + else + { + TArray options; + options.Add("OK"); + overlay->ShowMessageBox("Error", FString("Failed to accept invite (") + FString::FromInt(result) + ")", options); + GERROR("Failed to join session invite"); + SwitchToMenu(); + } +} + +void AMenuController::m_AutoRequestTeam() +{ + UWorld* world = GetWorld(); + APlayerStateBase* state = GetPlayerState(); + if(state) + { + state->AutoAssignTeam(); + if(world->IsPlayInEditor()) + state->SetReadyState(true); + //GetWorld()->GetTimerManager().ClearTimer(m_teamRequestTimer); + } +} +void AMenuController::m_OnSplashScreenEnded() +{ + m_splash = nullptr; + + // Create start prompt + m_startScreen = CreateWidget(this, startScreenClass); + check(m_startScreen); + m_startScreen->onClosed.AddUObject(this, &AMenuController::m_OnStartPromptClosed); + m_startScreen->AddToViewport(); +} +void AMenuController::m_OnStartPromptClosed() +{ + m_startScreen = nullptr; + + // Open main menu + lobbyMenu = CreateWidget(this, lobbyWidgetClass); + lobbyMenu->AddToViewport(); + mainMenu = CreateWidget(this, menuWidgetClass); + mainMenu->AddToViewport(); + mainMenu->OnShow(); + mainMenu->OpenScreenMenu(mainSubMenuClass); + + // Enter lobby when initially connected + UWorld* world = GetWorld(); + UDefaultGameInstance* inst = Cast(world->GetGameInstance()); + if(inst->sessionManager->HasNetConnection()) + { + OnEnterLobby(); + } +} + +bool AMenuController::WorldIsPIE() const +{ + UWorld* const world = GetWorld(); + if (!IsValid(world)) return false; + return world->WorldType == EWorldType::PIE; +} \ No newline at end of file diff --git a/Source/UnrealProject/GameState/MenuController.h b/Source/UnrealProject/GameState/MenuController.h new file mode 100644 index 0000000..8af02d1 --- /dev/null +++ b/Source/UnrealProject/GameState/MenuController.h @@ -0,0 +1,71 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GameFramework/PlayerController.h" +#include "PlayerControllerBase.h" +#include "MenuController.generated.h" + +UCLASS() +class UNREALPROJECT_API AMenuController : public APlayerControllerBase +{ + GENERATED_BODY() + +public: + AMenuController(const FObjectInitializer& ObjectInitializer); + + virtual void BeginPlay() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + virtual void NotifyLoadedWorld(FName WorldPackageName, bool bFinalDest) override; + virtual void Destroyed() override; + + virtual void PreClientTravel(const FString& PendingURL, ETravelType TravelType, bool bIsSeamlessTravel) override; + virtual void SeamlessTravelFrom(class APlayerController* OldPC) override; + virtual void SeamlessTravelTo(class APlayerController* NewPC) override; + + virtual void OnLearnSkill(class UBaseSkillObject* object); + virtual void OnUnlearnSkill(class UBaseSkillObject* object); + virtual void OnEnterLobby(); + + UFUNCTION(Server, WithValidation, Reliable) + virtual void SetSetupState(const FPlayerSetupState& state); + virtual void OnRep_PlayerState() override; + + void SwitchToMenu(); + + UPROPERTY(BlueprintReadOnly) + class UMenuScreen* mainMenu; + UPROPERTY(BlueprintReadOnly) + class ULobbyMenu* lobbyMenu; + UPROPERTY(BlueprintReadOnly) + class USkillTreeWidget* skillTree; + + UFUNCTION(BlueprintCallable, Category = "PIE") + bool WorldIsPIE() const; + +private: + UFUNCTION(Server, WithValidation, Reliable) + void m_OnClientInitialized(); + + void m_OnInviteAccepted(bool success, const FOnlineSessionSearchResult& result); + UFUNCTION() + void m_OnSessionJoined(int32 result); + + void m_AutoRequestTeam(); + FTimerHandle m_teamRequestTimer; + + // Called when the splash screens end + UFUNCTION() + void m_OnSplashScreenEnded(); + // Called when the start prompt closes + UFUNCTION() + void m_OnStartPromptClosed(); + + UPROPERTY() + class USplashScreen* m_splash; + UPROPERTY() + class UStartPromptScreen* m_startScreen; + + // True if we are currently in the lobby screen, this can be checked if it is set before the menu widgets are created + bool m_inLobby; +}; diff --git a/Source/UnrealProject/GameState/MenuGameMode.cpp b/Source/UnrealProject/GameState/MenuGameMode.cpp new file mode 100644 index 0000000..a716b34 --- /dev/null +++ b/Source/UnrealProject/GameState/MenuGameMode.cpp @@ -0,0 +1,160 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "MenuGameMode.h" +#include "MenuController.h" +#include "DefaultGameInstance.h" +#include "MapData.h" +#include "GameStateBase.h" +#include "PlayerStateBase.h" +#include "PlayerControllerBase.h" + +AMenuGameMode::AMenuGameMode() +{ + static ConstructorHelpers::FClassFinder MenuPawnCF(TEXT("/Game/Assets/Blueprints/BP_MenuPawn")); + + PlayerControllerClass = AMenuController::StaticClass(); + DefaultPawnClass = MenuPawnCF.Class; + GameStateClass = AGameStateBase::StaticClass(); + PlayerStateClass = APlayerStateBase::StaticClass(); + + bUseSeamlessTravel = true; +} +void AMenuGameMode::PreInitializeComponents() +{ + Super::PreInitializeComponents(); + GWPRINT(L"Menu arguments = " + OptionsString); + + AGameStateBase* gameState = GetGameState(); + check(gameState); + + // Set initial map + UWorld* world = GetWorld(); + if(world) + { + UDefaultGameInstance* inst = Cast(world->GetGameInstance()); + if(inst->maps.Num() > 0) + { + m_mapData = inst->maps[0]; + m_mapPath = gameState->mapPath = m_mapData->pathToAsset; + GPRINT("Setting default map to \"" + m_mapData->friendlyName + "\" [" + m_mapPath + "]"); + gameState->m_LoadActiveMapInfo(); + } + } +} +void AMenuGameMode::BeginPlay() +{ + Super::BeginPlay(); + UWorld* world = GetWorld(); + m_lobbyState = world->SpawnActor(ALobbyState::StaticClass()); +} + +void AMenuGameMode::GetSeamlessTravelActorList(bool bToEntry, TArray& ActorList) +{ + Super::GetSeamlessTravelActorList(bToEntry, ActorList); + ActorList.Add(m_lobbyState); +} + +APlayerController* AMenuGameMode::Login(class UPlayer* NewPlayer, ENetRole InRemoteRole, const FString& Portal, const FString& Options, const TSharedPtr& UniqueId, FString& ErrorMessage) +{ + // Aquire the player controller by calling the super function + APlayerController* player = Super::Login(NewPlayer, InRemoteRole, Portal, Options, UniqueId, ErrorMessage); + APlayerControllerBase* pc = Cast(player); + + // Update persona + APlayerStateBase* state = Cast(pc->PlayerState); + FString name = ""; + if(state) + { + state->UpdatePersona(); + name = state->nickname; + } + + GWARNING("Player " + name + " logged in [options=" + Options + "][portal=" + Portal + "]"); + return player; +} +FString AMenuGameMode::InitNewPlayer(class APlayerController* NewPlayerController, const TSharedPtr& UniqueId, const FString& Options, const FString& Portal /* = TEXT("") */) +{ + FString r = Super::InitNewPlayer(NewPlayerController, UniqueId, Options, Portal); + return r; +} + +void AMenuGameMode::Logout(AController* existing) +{ + // Get name of disconnected player + APlayerStateBase* state = Cast(existing->PlayerState); + FString name = ""; + if(state) + name = state->nickname; + GWARNING("Player " + name + " left the game"); + + // Deregister the player + APlayerControllerBase* pc = Cast(existing); + Cast(GameState)->DeregisterPlayer(pc); + + Super::Logout(existing); +} + +void AMenuGameMode::PostLogin(APlayerController* NewPlayer) +{ + Super::PostLogin(NewPlayer); + AGameStateBase* gs = GetGameState(); + APlayerControllerBase* pc = Cast(NewPlayer); + + // Register the player + Cast(GameState)->RegisterPlayer(pc); +} + +void AMenuGameMode::SetMap(FString mapPath) +{ + m_mapPath = mapPath; + Cast(GameState)->mapPath = m_mapPath; +} +bool AMenuGameMode::StartGame() +{ + UWorld* world = GetWorld(); + if(!world) + { + GERROR("No world, cant start game"); + return false; + } + + UDefaultGameInstance* inst = Cast(world->GetGameInstance()); + m_mapData = inst->GetMapData(m_mapPath); + if(!m_mapData) + { + GERROR("Can't start game, no map data found for map [" + m_mapPath + "]"); + return false; + } + + // Inject all the players into the lobby state + AGameStateBase* state = Cast(GameState); + m_lobbyState->players.SetNum(0); + for(APlayerState* ps : state->PlayerArray) + { + APlayerStateBase* psb = Cast(ps); + if(psb) + { + FLobbyStatePlayer lsp; + lsp.netID = psb->UniqueId.GetUniqueNetId(); + lsp.team = psb->GetTeam(); + m_lobbyState->players.Add(lsp); + } + } + + GWARNING("Performing server travel to " + m_mapPath); + world->ServerTravel(m_mapPath, true); + return true; +} + +void AMenuGameMode::AssignMapData(class UMapData* mapData) +{ + if(!mapData) + { + GERROR("Invalid map passed to AssignMapData"); + return; + } + AGameStateBase* gameState = GetGameState(); + gameState->mapPath = m_mapPath = mapData->pathToAsset; + gameState->m_LoadActiveMapInfo(); +} diff --git a/Source/UnrealProject/GameState/MenuGameMode.h b/Source/UnrealProject/GameState/MenuGameMode.h new file mode 100644 index 0000000..338ccdd --- /dev/null +++ b/Source/UnrealProject/GameState/MenuGameMode.h @@ -0,0 +1,42 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GameFramework/GameMode.h" +#include "MenuGameMode.generated.h" + +class AGameNameCharacter; +class AGameNamePlayerController; +class AGameNameSpectator; + +UCLASS(minimalapi) +class AMenuGameMode : public AGameMode +{ + GENERATED_BODY() + friend class AGameStateBase; + friend class APlayerStateBase; +public: + AMenuGameMode(); + virtual void PreInitializeComponents() override; + virtual void BeginPlay() override; + virtual void GetSeamlessTravelActorList(bool bToEntry, TArray& ActorList) override; + + virtual APlayerController* Login(class UPlayer* NewPlayer, ENetRole InRemoteRole, const FString& Portal, const FString& Options, const TSharedPtr& UniqueId, FString& ErrorMessage) override; + virtual FString InitNewPlayer(class APlayerController* NewPlayerController, const TSharedPtr& UniqueId, const FString& Options, const FString& Portal /* = TEXT("") */) override; + virtual void Logout(AController* existing) override; + virtual void PostLogin(APlayerController* NewPlayer) override; + + // Player joined callback + DECLARE_MULTICAST_DELEGATE_OneParam(FOnPlayerJoined, APlayerController*) + FOnPlayerJoined onPlayerJoined; + + void SetMap(FString mapPath); + bool StartGame(); + void AssignMapData(class UMapData* mapData); +private: + UPROPERTY() + class ALobbyState* m_lobbyState; + + FString m_mapPath; + class UMapData* m_mapData; +}; \ No newline at end of file diff --git a/Source/UnrealProject/GameState/MiniMapVolume.cpp b/Source/UnrealProject/GameState/MiniMapVolume.cpp new file mode 100644 index 0000000..31816ed --- /dev/null +++ b/Source/UnrealProject/GameState/MiniMapVolume.cpp @@ -0,0 +1,14 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "MiniMapVolume.h" + + +AMiniMapVolume::AMiniMapVolume() +{ + area = CreateDefaultSubobject(TEXT("Area")); + area->SetCollisionProfileName(UCollisionProfile::NoCollision_ProfileName); + area->bGenerateOverlapEvents = false; + area->Mobility = EComponentMobility::Static; + RootComponent = area; +} \ No newline at end of file diff --git a/Source/UnrealProject/GameState/MiniMapVolume.h b/Source/UnrealProject/GameState/MiniMapVolume.h new file mode 100644 index 0000000..2aff272 --- /dev/null +++ b/Source/UnrealProject/GameState/MiniMapVolume.h @@ -0,0 +1,18 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GameFramework/Actor.h" +#include "MiniMapVolume.generated.h" + +UCLASS() +class UNREALPROJECT_API AMiniMapVolume : public AActor +{ + GENERATED_BODY() + +public: + AMiniMapVolume(); + + UPROPERTY(EditAnywhere, Category = "Area") + class UBoxComponent* area; +}; diff --git a/Source/UnrealProject/GameState/PlayerControllerBase.cpp b/Source/UnrealProject/GameState/PlayerControllerBase.cpp new file mode 100644 index 0000000..fb7e39f --- /dev/null +++ b/Source/UnrealProject/GameState/PlayerControllerBase.cpp @@ -0,0 +1,397 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "DefaultGameInstance.h" +#include "PlayerControllerBase.h" +#include "ScreenOverlay.h" +#include "Prefs.h" +#include "TransitionScreen.h" +#include "SessionManager.h" +#include "Engine.h" + +#if PLATFORM_SPECIFIC_WIN == 0 +#include "InputManager.hpp" +using namespace Input; +#endif + +UClass* overlayWidgetClass; +UClass* transitionWidgetClass; +APlayerControllerBase::APlayerControllerBase(const FObjectInitializer& init) + : Super(init) +{ + overlayWidgetClass = ConstructorHelpers::FClassFinder(TEXT("/Game/Assets/GUI/WEEGEE_Overlay")).Class; + transitionWidgetClass = ConstructorHelpers::FClassFinder(TEXT("/Game/Assets/GUI/WEEGEE_Transition")).Class; +} + +void APlayerControllerBase::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + DOREPLIFETIME(APlayerControllerBase, setupState); +} + +void APlayerControllerBase::BeginPlay() +{ + UDefaultGameInstance* game = Cast(GetGameInstance()); + + if(IsLocalController()) + { + transitionScreen = CreateWidget(GetWorld(), transitionWidgetClass); + transitionScreen->AddToViewport(800); + + overlay = CreateWidget(GetWorld(), overlayWidgetClass); + overlay->AddToViewport(1000); + AddMenuInputItem(overlay, 10); + check(overlay); + + UWorld* world = GetWorld(); + AGameMode* gameMode = nullptr; + if(world) + gameMode = GetWorld()->GetAuthGameMode(); + //if(!game->errorMessage.IsEmpty()) + //{ + // game->DestroySession(false); + // game->ShowNetworkError(FString("Disconnected from game, ") + game->errorMessage); + // game->errorMessage.Empty(); + //} + //else if(gameMode && UGameplayStatics::HasOption(gameMode->OptionsString, "closed")) + //{ + // game->DestroySession(false); + // game->ShowNetworkError(FString("Disconnected from game")); + //} + } + + Super::BeginPlay(); +} +void APlayerControllerBase::SetupInputComponent() +{ + if (GetWorld()->WorldType == EWorldType::Preview) + return; + + Super::SetupInputComponent(); + + +#if PLATFORM_SPECIFIC_WIN == 0 + GPRINT("Binding Menu Input manager bindings on " + GetName()); + InputManager* inputManager = InputManager::GetInstance(); + + UPrefs* prefs = Cast(GetGameInstance())->GetPrefs(); + + // Connect initial controller + inputManager->SearchForJoystick(); + ScanForJoysticks(); + int32 connect = 0; + for(int32 i = 0; i < m_recentJoystickScan.Num(); i++) + { + if(m_recentJoystickScan[i] == prefs->useControllerName) + { + connect = i; + break; + } + } + SelectJoystick(connect); + + inputManager->RegisterCallback(IJP_FACEDOWN, IME_PRESSED, this, &APlayerControllerBase::m_OnMenuConfirm); + inputManager->RegisterCallback(IJP_FACERIGHT,IME_PRESSED, this, &APlayerControllerBase::m_OnMenuBack); + inputManager->RegisterCallback(IJP_START, IME_PRESSED, this, &APlayerControllerBase::m_OnMenuStart); + inputManager->RegisterCallback(IJP_DPADUP, IME_PRESSED, this, &APlayerControllerBase::m_OnMenuUp); + inputManager->RegisterCallback(IJP_DPADDOWN, IME_PRESSED, this, &APlayerControllerBase::m_OnMenuDown); + inputManager->RegisterCallback(IJP_DPADLEFT, IME_PRESSED, this, &APlayerControllerBase::m_OnMenuLeft); + inputManager->RegisterCallback(IJP_DPADRIGHT, IME_PRESSED, this, &APlayerControllerBase::m_OnMenuRight); + inputManager->RegisterCallback(IJP_TRIGGERLEFT, IME_PRESSED, this, &APlayerControllerBase::m_OnMenuLeftPressed); + inputManager->RegisterCallback(IJP_TRIGGERRIGHT, IME_PRESSED, this, &APlayerControllerBase::m_OnMenuRightPressed); + inputManager->RegisterCallback(IJP_TRIGGERLEFT, IME_RELEASED, this, &APlayerControllerBase::m_OnMenuLeftReleased); + inputManager->RegisterCallback(IJP_TRIGGERRIGHT, IME_RELEASED, this, &APlayerControllerBase::m_OnMenuRightReleased); + inputManager->RegisterCallback(IJP_SHOULDERLEFT, IME_PRESSED, this, &APlayerControllerBase::m_OnMenuShoulderLeft); + inputManager->RegisterCallback(IJP_SHOULDERRIGHT, IME_PRESSED, this, &APlayerControllerBase::m_OnMenuShoulderRight); + inputManager->RegisterCallback(IJP_START, IME_PRESSED, this, &APlayerControllerBase::m_OnMenuOptionsButton); + inputManager->RegisterCallback(IJP_FACELEFT, IME_PRESSED, this, &APlayerControllerBase::m_OnMenuOpt1); + inputManager->RegisterCallback(IJP_FACEUP, IME_PRESSED, this, &APlayerControllerBase::m_OnMenuOpt2); +#endif + + InputComponent->BindAction("MenuSelect", EInputEvent::IE_Pressed, this, &APlayerControllerBase::m_OnMenuConfirm); + InputComponent->BindAction("MenuBack", EInputEvent::IE_Pressed, this, &APlayerControllerBase::m_OnMenuBack); + InputComponent->BindAction("MenuStart", EInputEvent::IE_Pressed, this, &APlayerControllerBase::m_OnMenuStart); + InputComponent->BindAction("MenuUp", EInputEvent::IE_Pressed, this, &APlayerControllerBase::m_OnMenuUp); + InputComponent->BindAction("MenuDown", EInputEvent::IE_Pressed, this, &APlayerControllerBase::m_OnMenuDown); + InputComponent->BindAction("MenuLeft", EInputEvent::IE_Pressed, this, &APlayerControllerBase::m_OnMenuLeftPressed); + InputComponent->BindAction("MenuRight", EInputEvent::IE_Pressed, this, &APlayerControllerBase::m_OnMenuRightPressed); + InputComponent->BindAction("MenuLeftUp", EInputEvent::IE_Released, this, &APlayerControllerBase::m_OnMenuLeftReleased); + InputComponent->BindAction("MenuRightUp", EInputEvent::IE_Released, this, &APlayerControllerBase::m_OnMenuRightReleased); + InputComponent->BindAction("MenuOpt1", EInputEvent::IE_Pressed, this, &APlayerControllerBase::m_OnMenuOpt1); + InputComponent->BindAction("MenuOpt2", EInputEvent::IE_Pressed, this, &APlayerControllerBase::m_OnMenuOpt2); + InputComponent->BindAction("MenuShoulderLeft", EInputEvent::IE_Pressed, this, &APlayerControllerBase::m_OnMenuShoulderLeft); + InputComponent->BindAction("MenuShoulderRight", EInputEvent::IE_Pressed, this, &APlayerControllerBase::m_OnMenuShoulderRight); +} +void APlayerControllerBase::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + if(IsLocalController()) + { + if(transitionScreen) + { + transitionScreen->OnHide(); + transitionScreen->RemoveFromViewport(); + } + if(overlay) + { + overlay->RemoveFromViewport(); + } + } + Super::EndPlay(EndPlayReason); +} + +void APlayerControllerBase::PlayerTick(float DeltaTime) +{ + Super::PlayerTick(DeltaTime); + if(m_repeatLeft) + OnMenuAction(EMenuActionBinding::Repeat_Left); + if(m_repeatRight) + OnMenuAction(EMenuActionBinding::Repeat_Right); +} + +void APlayerControllerBase::Destroyed() +{ + Super::Destroyed(); +#if PLATFORM_SPECIFIC_WIN == 0 + GPRINT("Unbinding Menu Input manager bindings on " + GetName()); + InputManager* inputManager = InputManager::GetInstance(); + + inputManager->DeregisterCallback(IJP_FACEDOWN, IME_PRESSED, this, &APlayerControllerBase::m_OnMenuConfirm); + inputManager->DeregisterCallback(IJP_FACERIGHT, IME_PRESSED, this, &APlayerControllerBase::m_OnMenuBack); + inputManager->DeregisterCallback(IJP_START, IME_PRESSED, this, &APlayerControllerBase::m_OnMenuStart); + inputManager->DeregisterCallback(IJP_DPADUP, IME_PRESSED, this, &APlayerControllerBase::m_OnMenuUp); + inputManager->DeregisterCallback(IJP_DPADDOWN, IME_PRESSED, this, &APlayerControllerBase::m_OnMenuDown); + inputManager->DeregisterCallback(IJP_DPADLEFT, IME_PRESSED, this, &APlayerControllerBase::m_OnMenuLeft); + inputManager->DeregisterCallback(IJP_DPADRIGHT, IME_PRESSED, this, &APlayerControllerBase::m_OnMenuRight); + inputManager->DeregisterCallback(IJP_TRIGGERLEFT, IME_PRESSED, this, &APlayerControllerBase::m_OnMenuLeftPressed); + inputManager->DeregisterCallback(IJP_TRIGGERRIGHT, IME_PRESSED, this, &APlayerControllerBase::m_OnMenuRightPressed); + inputManager->DeregisterCallback(IJP_TRIGGERLEFT, IME_RELEASED, this, &APlayerControllerBase::m_OnMenuLeftReleased); + inputManager->DeregisterCallback(IJP_TRIGGERRIGHT, IME_RELEASED, this, &APlayerControllerBase::m_OnMenuRightReleased); + inputManager->DeregisterCallback(IJP_SHOULDERLEFT, IME_PRESSED, this, &APlayerControllerBase::m_OnMenuShoulderLeft); + inputManager->DeregisterCallback(IJP_SHOULDERRIGHT, IME_PRESSED, this, &APlayerControllerBase::m_OnMenuShoulderRight); + inputManager->DeregisterCallback(IJP_START, IME_PRESSED, this, &APlayerControllerBase::m_OnMenuOptionsButton); + inputManager->DeregisterCallback(IJP_FACELEFT, IME_PRESSED, this, &APlayerControllerBase::m_OnMenuOpt1); + inputManager->DeregisterCallback(IJP_FACEUP, IME_PRESSED, this, &APlayerControllerBase::m_OnMenuOpt2); +#endif +} + +void APlayerControllerBase::OnLearnSkill(class UBaseSkillObject* object) +{ +} +void APlayerControllerBase::OnUnlearnSkill(class UBaseSkillObject* object) +{ +} + +void APlayerControllerBase::AddMenuInputItem(class UMenuItemBase* item, int32 priority) +{ + if(!item) + return; + if(m_menuItemStack.Contains(item)) + return; + item->priority = priority; + + int32 at = m_menuItemStack.Num(); + if(at == -1) + { + m_menuItemStack.Add(item); + return; + } + + while(at > 0 && m_menuItemStack[at-1]->priority > priority) + { + at--; + } + m_menuItemStack.Insert(item, at); +} +void APlayerControllerBase::RemoveMenuInputItem(class UMenuItemBase* item) +{ + m_menuItemStack.Remove(item); +} + +EInputMethod APlayerControllerBase::GetInputMethod() const +{ +#if PLATFORM_SPECIFIC_WIN == 0 + InputManager* inputManager = InputManager::GetInstance(); + switch(inputManager->GetConnectedType()) + { + default: + case InputDeviceType::IDT_NONE: + case InputDeviceType::IDT_NOTDEFINED: + return EInputMethod::PC; + break; + case InputDeviceType::IDT_XBOX: + return EInputMethod::X360; + break; + case InputDeviceType::IDT_DS4: + return EInputMethod::DS4; + break; + } +#else + return EInputMethod::DS4; +#endif +} + +TArray APlayerControllerBase::ScanForJoysticks() +{ +#if PLATFORM_SPECIFIC_WIN == 0 + m_recentJoystickScan.SetNum(0); + InputManager* inputManager = InputManager::GetInstance(); + inputManager->SearchForJoystick(); + for(std::wstring s : inputManager->GetJoystickNames()) + { + m_recentJoystickScan.Add(FString(s.c_str())); + } +#endif + return m_recentJoystickScan; +} +void APlayerControllerBase::SelectJoystick(int32 joystick) +{ +#if PLATFORM_SPECIFIC_WIN == 0 + if(joystick >= m_recentJoystickScan.Num()) + return; + + InputManager* inputManager = InputManager::GetInstance(); + GWPRINT(L"Connecting joystick [" + joystick + L"] " + m_recentJoystickScan[joystick]); + inputManager->ConnectJoystickByIndex(joystick); +#endif +} + +void APlayerControllerBase::PreClientTravel(const FString& PendingURL, ETravelType TravelType, bool bIsSeamlessTravel) +{ + GPRINT("PRE TRAVEL: " + PendingURL); + Super::PreClientTravel(PendingURL, TravelType, bIsSeamlessTravel); +} + +void APlayerControllerBase::OnEnterLobby() +{ + GWARNING("PC: Entering lobby " + GetName()); +} +void APlayerControllerBase::ReturnToMenu() +{ + GWARNING("PC: Leaving game " + GetName()); + UDefaultGameInstance* inst = Cast(GetGameInstance()); + inst->sessionManager->DestroySession(); + inst->sessionManager->CloseNetConnections(); + + // Load menu level + //FString error; + //FWorldContext* worldContext = GEngine->GetWorldContextFromWorld(GetWorld()); + //FURL target = FURL(*inst->menuLevelPath); + //int32 ret = GEngine->Browse(*worldContext, target, error); + //if(ret == EBrowseReturnVal::Failure) + //{ + // GERROR("Failed to load menu level: " + error); + //} + GetWorld()->ServerTravel(inst->menuLevelPath, true); +} + +void APlayerControllerBase::OnRep_PlayerState() +{ + Super::OnRep_PlayerState(); + GPRINT("[" + GetName() + "]Got player state"); +} +void APlayerControllerBase::OnRep_Pawn() +{ + Super::OnRep_Pawn(); + if(GetPawn()) + { + GPRINT("[" + GetName() + "]Got pawn: " + GetPawn()->GetName()); + } + else + { + GPRINT("[" + GetName() + "]Unpossessed pawn"); + } +} + +void APlayerControllerBase::EnterLobby_Implementation() +{ + OnEnterLobby(); +} + +void APlayerControllerBase::OnRep_Setup() +{ + GPRINT("GOT SETUP STATE ON " + GetName()); + m_onSetupStateSet = true; +} +void APlayerControllerBase::m_OnMenuConfirm() +{ + OnMenuAction(EMenuActionBinding::Confirm); +} +void APlayerControllerBase::m_OnMenuBack() +{ + OnMenuAction(EMenuActionBinding::Back); +} +void APlayerControllerBase::m_OnMenuStart() +{ + OnMenuAction(EMenuActionBinding::Start); +} +void APlayerControllerBase::m_OnMenuUp() +{ + OnMenuAction(EMenuActionBinding::Up); +} +void APlayerControllerBase::m_OnMenuDown() +{ + OnMenuAction(EMenuActionBinding::Down); +} +void APlayerControllerBase::m_OnMenuLeft() +{ + OnMenuAction(EMenuActionBinding::Left); +} +void APlayerControllerBase::m_OnMenuRight() +{ + OnMenuAction(EMenuActionBinding::Right); +} +void APlayerControllerBase::m_OnMenuOpt1() +{ + OnMenuAction(EMenuActionBinding::Opt1); +} +void APlayerControllerBase::m_OnMenuOpt2() +{ + OnMenuAction(EMenuActionBinding::Opt2); +} +void APlayerControllerBase::m_OnMenuLeftPressed() +{ + m_repeatLeft = true; + m_OnMenuLeft(); + OnMenuAction(EMenuActionBinding::Repeat_Left); + OnMenuAction(EMenuActionBinding::Trigger_Left); +} +void APlayerControllerBase::m_OnMenuRightPressed() +{ + m_repeatRight = true; + m_OnMenuRight(); + OnMenuAction(EMenuActionBinding::Repeat_Right); + OnMenuAction(EMenuActionBinding::Trigger_Right); +} +void APlayerControllerBase::m_OnMenuLeftReleased() +{ + m_repeatLeft = false; +} +void APlayerControllerBase::m_OnMenuRightReleased() +{ + m_repeatRight = false; +} +void APlayerControllerBase::m_OnMenuShoulderLeft() +{ + OnMenuAction(EMenuActionBinding::Shoulder_Left); +} +void APlayerControllerBase::m_OnMenuShoulderRight() +{ + OnMenuAction(EMenuActionBinding::Shoulder_Right); +} +void APlayerControllerBase::m_OnMenuOptionsButton() +{ + OnMenuAction(EMenuActionBinding::Options); +} + + +void APlayerControllerBase::OnMenuAction(EMenuActionBinding action) +{ + m_menuItemStack.Remove(nullptr); + for(int32 i = m_menuItemStack.Num(); i > 0;) + { + i--; + m_menuItemStack[i]->NativeOnMenuAction(action); + if(m_menuItemStack[i]->blockInput) + break; + } +} diff --git a/Source/UnrealProject/GameState/PlayerControllerBase.h b/Source/UnrealProject/GameState/PlayerControllerBase.h new file mode 100644 index 0000000..00cf41f --- /dev/null +++ b/Source/UnrealProject/GameState/PlayerControllerBase.h @@ -0,0 +1,122 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "MenuAction.h" +#include "GameFramework/PlayerController.h" +#include "PlayerSetupState.h" +#include "PlayerControllerBase.generated.h" + +// Input method for local players +UENUM(BlueprintType) +enum class EInputMethod : uint8 +{ + PC, + X360, + DS4 +}; + +/** + * + */ +UCLASS() +class UNREALPROJECT_API APlayerControllerBase : public APlayerController +{ + GENERATED_BODY() + +public: + APlayerControllerBase(const FObjectInitializer& init); + + virtual void BeginPlay() override; + virtual void SetupInputComponent() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + virtual void PlayerTick(float DeltaTime) override; + virtual void Destroyed() override; + + virtual void OnLearnSkill(class UBaseSkillObject* object); + virtual void OnUnlearnSkill(class UBaseSkillObject* object); + + UFUNCTION(BlueprintCallable, Category = "MenuStack") + void AddMenuInputItem(class UMenuItemBase* item, int32 priority = 0); + UFUNCTION(BlueprintCallable, Category = "MenuStack") + void RemoveMenuInputItem(class UMenuItemBase* item); + + UFUNCTION(BlueprintCallable, Category = "Input") + EInputMethod GetInputMethod() const; + UFUNCTION(BlueprintCallable, Category = "Input") + TArray ScanForJoysticks(); + UFUNCTION(BlueprintCallable, Category = "Input") + void SelectJoystick(int32 joystick); + + virtual void PreClientTravel(const FString& PendingURL, ETravelType TravelType, bool bIsSeamlessTravel); + + // Called from the game when we should move to the lobby + UFUNCTION(Client, Reliable) + void EnterLobby(); + virtual void OnEnterLobby(); + + // Call to return to the main menu / leave current game + UFUNCTION(BlueprintCallable, Category = "Game") + void ReturnToMenu(); + + // Replication callbacks + virtual void OnRep_PlayerState() override; + virtual void OnRep_Pawn() override; + + // Template state acquisition functions + template T* GetPlayerState() + { + return Cast(PlayerState); + } + template T* GetGameState() + { + if(!GetWorld()) + return nullptr; + return Cast(GetWorld()->GameState); + } + + // Called when the setupState is replicated + UFUNCTION() + virtual void OnRep_Setup(); + + // Lobby Character selection + UPROPERTY(replicatedUsing=OnRep_Setup) + FPlayerSetupState setupState; + + UPROPERTY(BlueprintReadOnly, Category = "Overlay") + class UScreenOverlay* overlay; + + UPROPERTY(BlueprintReadOnly, Category = "Overlay") + class UTransitionScreen* transitionScreen; + +protected: + virtual void OnMenuAction(EMenuActionBinding action); +private: + + void m_OnMenuConfirm(); + void m_OnMenuBack(); + void m_OnMenuStart(); + void m_OnMenuUp(); + void m_OnMenuDown(); + void m_OnMenuLeft(); + void m_OnMenuRight(); + void m_OnMenuOpt1(); + void m_OnMenuOpt2(); + void m_OnMenuLeftPressed(); + void m_OnMenuRightPressed(); + void m_OnMenuLeftReleased(); + void m_OnMenuRightReleased(); + void m_OnMenuShoulderLeft(); + void m_OnMenuShoulderRight(); + void m_OnMenuOptionsButton(); + + bool m_onSetupStateSet; + + bool m_repeatLeft; + bool m_repeatRight; + + TArray m_recentJoystickScan; + + UPROPERTY() + TArray m_menuItemStack; +}; diff --git a/Source/UnrealProject/GameState/PlayerSetupState.h b/Source/UnrealProject/GameState/PlayerSetupState.h new file mode 100644 index 0000000..7b4063e --- /dev/null +++ b/Source/UnrealProject/GameState/PlayerSetupState.h @@ -0,0 +1,79 @@ +#pragma once +#include "SkillTreeState.h" +#include "PlayerSetupState.generated.h" + +// Properties belonging to a character class +USTRUCT() +struct FCharacterClassProperty +{ + GENERATED_BODY() +public: + UPROPERTY(BlueprintReadOnly, EditAnywhere) + FString name; + UPROPERTY(BlueprintReadOnly, EditAnywhere) + class UAbilityInfo* basicAttack; + UPROPERTY(BlueprintReadOnly, EditAnywhere) + TArray> classItems; + + // Class Specific Curves, if these are not set the character defaults are used + UPROPERTY(BlueprintReadOnly, EditAnywhere) + UCurveFloat* healthCurve; + UPROPERTY(BlueprintReadOnly, EditAnywhere) + UCurveFloat* manaCurve; + UPROPERTY(BlueprintReadOnly, EditAnywhere) + UCurveFloat* armorCurve; + UPROPERTY(BlueprintReadOnly, EditAnywhere) + UCurveFloat* attackSpeedCurve; +}; + +// A data asset that provides a list of character classes +UCLASS() +class UCharacterClassPropertySet : public UDataAsset +{ + GENERATED_BODY() +public: + UPROPERTY(BlueprintReadOnly, EditAnywhere) + TArray classes; + + UFUNCTION(BlueprintCallable, Category = "Character Class") + FCharacterClassProperty GetCharacterClass(int32 classID) const; +}; + +// Setings for character bone scales +USTRUCT(BlueprintType) +struct FCharacterCustomization +{ + GENERATED_BODY() + +public: + UPROPERTY(BlueprintReadWrite, Category = "Save") + float overallScale = 1.0f; + UPROPERTY(BlueprintReadWrite, Category = "Save") + float headScale = 1.0f; + UPROPERTY(BlueprintReadWrite, Category = "Save") + float torsoScale = 1.0f; + UPROPERTY(BlueprintReadWrite, Category = "Save") + float leftArmScale = 1.0f; + UPROPERTY(BlueprintReadWrite, Category = "Save") + float rightArmScale = 1.0f; + UPROPERTY(BlueprintReadWrite, Category = "Save") + float legThicknessYScale = 1.0f; + UPROPERTY(BlueprintReadWrite, Category = "Save") + float legThicknessZScale = 1.0f; + +}; + +// All player settings, from the lobby +// this includes selected skill set and character customizations +USTRUCT() +struct FPlayerSetupState +{ + GENERATED_BODY() +public: + UPROPERTY() + FSkillTreeState skills; + UPROPERTY() + FCharacterCustomization customizations; + UPROPERTY() + int32 characterClass; +}; \ No newline at end of file diff --git a/Source/UnrealProject/GameState/PlayerStateBase.cpp b/Source/UnrealProject/GameState/PlayerStateBase.cpp new file mode 100644 index 0000000..e1b12ea --- /dev/null +++ b/Source/UnrealProject/GameState/PlayerStateBase.cpp @@ -0,0 +1,110 @@ +#include "UnrealProject.h" +#include "PlayerStateBase.h" + +#include "GameStateBase.h" +#include "DefaultGameInstance.h" +#include "SessionManager.h" + +APlayerStateBase::APlayerStateBase() +{ + bReplicates = true; + bAlwaysRelevant = true; +} +void APlayerStateBase::BeginPlay() +{ + Super::BeginPlay(); +} + +void APlayerStateBase::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + DOREPLIFETIME(APlayerStateBase, m_team); + DOREPLIFETIME(APlayerStateBase, m_readyToStart); +} + +bool APlayerStateBase::SetReadyState_Validate(bool state) +{ + return true; +} +void APlayerStateBase::SetReadyState_Implementation(bool state) +{ + m_readyToStart = state; +} +bool APlayerStateBase::GetReadyState() const +{ + return m_readyToStart; +} + +void APlayerStateBase::Transfer(APlayerStateBase* oldState) +{ + m_team = oldState->m_team; + UpdatePersona(); +} + +int32 APlayerStateBase::GetTeam() const +{ + return m_team; +} +bool APlayerStateBase::AutoAssignTeam_Validate() +{ + return true; +} +void APlayerStateBase::AutoAssignTeam_Implementation() +{ + if(m_team > 0) + return; // Already has a team + + AGameStateBase* const state = Cast(GetWorld()->GetGameState()); + check(state); + RequestTeamEntry(state->GetOptimalAutoJoinTeam()); +} +void APlayerStateBase::UpdatePersona() +{ + UDefaultGameInstance* inst = Cast(GetGameInstance()); + if (inst && UniqueId.IsValid()) + { + avatar = inst->sessionManager->GetPlayerAvatar(*UniqueId); + nickname = inst->sessionManager->GetPlayerName(*UniqueId); + } +} + +bool APlayerStateBase::RequestTeamEntry_Validate(uint8 team) +{ + UWorld* const world = GetWorld(); + check(world); + AGameStateBase* const state = Cast(world->GetGameState()); + check(state); + + return (team > 0 && team <= state->GetMapTeamCount()); +} +void APlayerStateBase::RequestTeamEntry_Implementation(uint8 team) +{ + if(team == m_team) + return; + + if(m_readyToStart && !(m_team == 0)) + return; + + UWorld* const world = GetWorld(); + if(world) + { + AGameStateBase* const state = Cast(world->GetGameState()); + if(state) + { + TArray players = state->GetPlayers(); + int32 teamSize = 0; + for(int32 i = 0; i < players.Num(); i++) + { + if(players[i] == nullptr) + continue; + if(players[i]->GetTeam() == team) + teamSize++; + } + if (teamSize < 2) + { + m_team = team; + state->OnPlayerStateChange_Multi(); + } + } + } +} \ No newline at end of file diff --git a/Source/UnrealProject/GameState/PlayerStateBase.h b/Source/UnrealProject/GameState/PlayerStateBase.h new file mode 100644 index 0000000..ea8ec49 --- /dev/null +++ b/Source/UnrealProject/GameState/PlayerStateBase.h @@ -0,0 +1,52 @@ +#pragma once +#include "PlayerStateBase.Generated.h" + +/* + Base player state, keeping the team the player is in + this class also keeps the ready state of players in the lobby and contains some functionality for joining/switching teams +*/ +UCLASS() +class APlayerStateBase : public APlayerState +{ + GENERATED_BODY() + friend class AGameStateBase; + friend class AMenuGameMode; +public: + APlayerStateBase(); + virtual void BeginPlay() override; + + UFUNCTION(Server, Reliable, WithValidation, Category = "Lobby") + void SetReadyState(bool state); + UFUNCTION(BlueprintCallable, Category = "Lobby") + bool GetReadyState() const; + + // Used for seamless travel, this copies the previous player state into the current one + void Transfer(APlayerStateBase* oldState); + + // Requests entry to a team + UFUNCTION(Server, Reliable, WithValidation, Category = "Lobby") + void RequestTeamEntry(uint8 team); + // Automatically join the prefered team by the server + UFUNCTION(Server, Reliable, WithValidation, BlueprintCallable, Category = "Lobby") + void AutoAssignTeam(); + + UFUNCTION(BlueprintCallable, Category = "Lobby") + int32 GetTeam() const; + + // Updates the nickname and the avatar of the player using the online subsystem + UFUNCTION(BlueprintCallable, Category = "Character") + void UpdatePersona(); + + UPROPERTY(BlueprintReadOnly, Category = "Character") + UTexture2D* avatar; + + UPROPERTY(BlueprintReadOnly, Category = "Character") + FString nickname; + +private: + UPROPERTY(Replicated) + bool m_readyToStart; + + UPROPERTY(Replicated) + int32 m_team; +}; \ No newline at end of file diff --git a/Source/UnrealProject/GameState/SessionManager.cpp b/Source/UnrealProject/GameState/SessionManager.cpp new file mode 100644 index 0000000..b54bda7 --- /dev/null +++ b/Source/UnrealProject/GameState/SessionManager.cpp @@ -0,0 +1,488 @@ +#include "UnrealProject.h" +#include "SessionManager.h" +#include "DefaultGameInstance.h" +#include "MatchMaking.h" + +#if PLATFORM_SPECIFIC_WIN == 0 +// Steam includes + disable warnings for unsafe functions +#pragma warning(push) +#pragma warning(disable:4996) +#include "steam/steam_api.h" +#include "steam/isteamutils.h" +#include "steam/isteamfriends.h" + +#pragma warning(pop) +#endif + +// For avatar to UTexture2D +#include "ImageUtils.h" + +#include + +#define POST_DESTROY_CREATE 1 +#define POST_DESTROY_JOIN 2 +#define POST_DESTROY_FIND 3 + + +namespace +{ + uint64 NetIDToInt(const FUniqueNetId& id) + { + std::wstring str = id.ToString().GetCharArray().GetData(); + uint64 asInt = 0; + str >> asInt; + return asInt; + } +} + + +static UTexture2D* defaultAvatar; +USessionManager::USessionManager() +{ + onCreateSessionCompleteDelegate = FOnCreateSessionCompleteDelegate::CreateUObject(this, &USessionManager::m_OnCreateSessionComplete); + onDestroySessionCompleteDelegate = FOnDestroySessionCompleteDelegate::CreateUObject(this, &USessionManager::m_OnDestroySessionComplete); + onStartSessionCompleteDelegate = FOnStartSessionCompleteDelegate::CreateUObject(this, &USessionManager::m_OnStartOnlineGameComplete); + onFindSessionsCompleteDelegate = FOnFindSessionsCompleteDelegate::CreateUObject(this, &USessionManager::m_OnFindSessionsComplete); + onJoinSessionCompleteDelegate = FOnJoinSessionCompleteDelegate::CreateUObject(this, &USessionManager::m_OnJoinSessionComplete); + onPingSearchResultsCompleteDelegate = FOnPingSearchResultsCompleteDelegate::CreateUObject(this, &USessionManager::m_OnPingSearchResultsComplete); + + // Default avatar in case some doesn't have an avatar or the online subsystem does not provide one + defaultAvatar = ConstructorHelpers::FObjectFinder(TEXT("/Game/Assets/GUI/564e176e1a279230")).Object; + + m_postDestroyAction = 0; + + sessionSearch = MakeShareable(new FOnlineSessionSearch()); + sessionSearch->bIsLanQuery = false; + sessionSearch->MaxSearchResults = 100; + sessionSearch->PingBucketSize = 50; + sessionSearch->QuerySettings.Set(SEARCH_PRESENCE, true, EOnlineComparisonOp::Equals); + + // Cached online settings + m_onlineSystem = IOnlineSubsystem::Get(); + check(m_onlineSystem); + m_session = m_onlineSystem->GetSessionInterface(); + check(m_session.IsValid()); + + GPRINT("Session manager created with subsystem: " + m_onlineSystem->GetInstanceName()); + + uint32 sessionCount = m_session->GetNumSessions(); + GPRINT(sessionCount + " initial sessions found."); + + // Set default session settings + sessionSettings.bIsLANMatch = false; + sessionSettings.bUsesPresence = true; + sessionSettings.NumPublicConnections = 4; + sessionSettings.NumPrivateConnections = 0; + sessionSettings.bAllowInvites = true; + sessionSettings.bAllowJoinInProgress = true; + sessionSettings.bShouldAdvertise = true; + sessionSettings.bAllowJoinViaPresence = true; + sessionSettings.bAllowJoinViaPresenceFriendsOnly = false; + + sessionSettings.Set(SETTING_MAPNAME, FString("No Map"), EOnlineDataAdvertisementType::ViaOnlineServiceAndPing); + + // Register ping callback + onPingSearchResultsCompleteDelegateHandle = m_session->AddOnPingSearchResultsCompleteDelegate_Handle(onPingSearchResultsCompleteDelegate); +} +void USessionManager::Shutdown() +{ + m_session->ClearOnPingSearchResultsCompleteDelegate_Handle(onPingSearchResultsCompleteDelegateHandle); + + // Clean up sessions + uint32 sessionCount = m_session->GetNumSessions(); + if(sessionCount > 0) + { + DestroySession(); + } + + // Close net connections + CloseNetConnections(); +} + +void USessionManager::CreateSession(bool destroyOld) +{ + if(destroyOld && SessionExists()) + { + m_postDestroyAction = POST_DESTROY_CREATE; + DestroySession(); + return; + } + + APlayerController* pc = m_instance->GetFirstLocalPlayerController(); + if(!pc) + { + GERROR("There is no player controller!!"); + onCreateSessionComplete.Broadcast(false); + return; + } + + // Register delegate + onCreateSessionCompleteDelegateHandle = m_session->AddOnCreateSessionCompleteDelegate_Handle(onCreateSessionCompleteDelegate); + + const FUniqueNetId& netID = *pc->PlayerState->UniqueId; + if(!m_session->CreateSession(netID, GameSessionName, sessionSettings)) + { + GERROR("m_session->CreateSession call failed!"); + onCreateSessionComplete.Broadcast(false); + m_session->ClearOnCreateSessionCompleteDelegate_Handle(onCreateSessionCompleteDelegateHandle); + } +} +void USessionManager::FindSessions(bool destroyOld) +{ + APlayerController* pc = m_instance->GetFirstLocalPlayerController(); + if(!pc) + { + GERROR("There is no player controller!!"); + onFindSessionsComplete.Broadcast(false); + return; + } + + if(destroyOld && SessionExists()) + { + m_postDestroyAction = POST_DESTROY_FIND; + DestroySession(); + return; + } + + // Register delegate + onFindSessionsCompleteDelegateHandle = m_session->AddOnFindSessionsCompleteDelegate_Handle(onFindSessionsCompleteDelegate); + + const FUniqueNetId& netID = *pc->PlayerState->UniqueId; + if(!m_session->FindSessions(netID, sessionSearch.ToSharedRef())) + { + GERROR("m_session->CreateSession call failed!"); + onCreateSessionComplete.Broadcast(false); + m_session->ClearOnCreateSessionCompleteDelegate_Handle(onCreateSessionCompleteDelegateHandle); + } +} +void USessionManager::JoinSession(const FOnlineSessionSearchResult& searchResult, bool destroyOld) +{ + joinSessionResult = searchResult; + + if(destroyOld && SessionExists()) + { + m_postDestroyAction = POST_DESTROY_JOIN; + DestroySession(); + return; + } + + APlayerController* pc = m_instance->GetFirstLocalPlayerController(); + if(!pc) + { + GERROR("There is no player controller!!"); + onFindSessionsComplete.Broadcast(false); + return; + } + + // Register delegate + onJoinSessionCompleteDelegateHandle = m_session->AddOnJoinSessionCompleteDelegate_Handle(onJoinSessionCompleteDelegate); + + const FUniqueNetId& netID = *pc->PlayerState->UniqueId; + if(!m_session->JoinSession(netID, GameSessionName, joinSessionResult)) + { + GERROR("m_session->CreateSession call failed!"); + onCreateSessionComplete.Broadcast(false); + m_session->ClearOnJoinSessionCompleteDelegate_Handle(onJoinSessionCompleteDelegateHandle); + } +} +void USessionManager::DestroySession() +{ + onDestroySessionCompleteDelegateHandle = m_session->AddOnDestroySessionCompleteDelegate_Handle(onDestroySessionCompleteDelegate); + + if(!m_session->DestroySession(GameSessionName)) + { + GERROR("m_session->DestroySession call failed!"); + onDestroySessionComplete.Broadcast(false); + m_session->ClearOnDestroySessionCompleteDelegate_Handle(onDestroySessionCompleteDelegateHandle); + } +} +void USessionManager::PingResult(const FOnlineSessionSearchResult& result) +{ + if(!m_session->PingSearchResults(result)) + { + onPingComplete.Broadcast(false); + } +} + +bool USessionManager::SessionExists() const +{ + return m_session->GetNumSessions() > 0; +} + +void USessionManager::StartSession() +{ + m_session->StartSession(GameSessionName); +} +void USessionManager::EndSession() +{ + m_session->EndSession(GameSessionName); +} + +bool USessionManager::HasNetConnection() +{ + // Server? + UWorld* world = m_instance->GetWorld(); + if(world->GetNetDriver()) + return true; + + // Client? + APlayerController* pc = m_instance->GetFirstLocalPlayerController(); + if(pc->GetNetConnection()) + return true; + return false; +} + +void USessionManager::CloseNetConnections() +{ + if(!m_instance) + { + GERROR("INSTANCE NOT SET/INVALID??"); + return; + } + + // Close the network connection + UWorld* world = m_instance->GetWorld(); + if(!world) + { + GERROR("Can't close net connections, No world set"); + return; + } + ENetMode netMode = world->GetNetMode(); + GPRINT("Leaving client's net mode = " + netMode); + + UNetDriver* netDriver = world->GetNetDriver(); + + APlayerController* pc = m_instance->GetFirstLocalPlayerController(); + UNetConnection* netConnection = pc ? pc->GetNetConnection() : nullptr; + if(netConnection) + { + check(netMode == NM_Client); + // Close the client connection + netConnection->Close(); + } + else if(netDriver) + { + check(netMode == NM_ListenServer); + // Shutdown the net driver + world->SetNetDriver(nullptr); + GEngine->DestroyNamedNetDriver(world, NAME_GameNetDriver); + } +} + +void USessionManager::AcceptUserInvite(const bool bWasSuccess, const int32 ControllerId, TSharedPtr Us, const FOnlineSessionSearchResult& res) +{ + onAcceptInvite.Broadcast(bWasSuccess, res); +} + +FString USessionManager::GetPlayerName(const FUniqueNetId& netID) +{ + FString ret; +#if PLATFORM_SPECIFIC_WIN == 0 + ISteamFriends* friends = SteamFriends(); + if(friends) + { + FString steamIDString = netID.ToString(); + CSteamID steamID((uint64)_wtoi64(steamIDString.GetCharArray().GetData())); + const char* name = SteamFriends()->GetFriendPersonaName(steamID); + if(!name) + ret = FString(TEXT("")); + else + ret = FString(name); + } + else +#endif + { + IOnlineIdentityPtr identity = m_onlineSystem->GetIdentityInterface(); + ret = identity->GetPlayerNickname(netID); + } + return ret; +} + +FString USessionManager::GetSteamID(const FUniqueNetId& netID) +{ + FString ret; +#if PLATFORM_SPECIFIC_WIN == 0 + ISteamFriends* friends = SteamFriends(); + if(friends) + { + FString steamIDString = netID.ToString(); + CSteamID steamID((uint64)_wtoi64(steamIDString.GetCharArray().GetData())); + return steamIDString; + } +#endif + return ret; +} + +UTexture2D* USessionManager::GetPlayerAvatar(const FUniqueNetId& netID) +{ +#if PLATFORM_SPECIFIC_WIN == 0 + FString idString = netID.GetHexEncodedString(); + if(m_profilePictures.Contains(idString)) + { + UTexture2D* ret = m_profilePictures[idString]; + if(ret) + { + return ret; + } + else + { + m_profilePictures.Remove(idString); + } + } + + FString steamIDString = netID.ToString(); + CSteamID steamID((uint64)_wtoi64(steamIDString.GetCharArray().GetData())); + + ISteamFriends* steamFriends = SteamFriends(); + if(!steamFriends) + return defaultAvatar; + int imgId = steamFriends->GetMediumFriendAvatar(steamID); + if(imgId == -1) + return defaultAvatar; + + uint32 w, h; + if(!SteamUtils()->GetImageSize(imgId, &w, &h)) + return defaultAvatar; + TArray imagePixels; + imagePixels.SetNumUninitialized(w * h); + if(!SteamUtils()->GetImageRGBA(imgId, (uint8*)imagePixels.GetData(), w * h * 4)) + return defaultAvatar; + + for(uint32 i = 0; i < (w*h); i++) + { + imagePixels[i] = FColor(imagePixels[i].B, imagePixels[i].G, imagePixels[i].R, imagePixels[i].A); + } + + FString imageName = FString("T_Avatar_") + netID.ToString(); + FCreateTexture2DParameters params; + params.bDeferCompression = false; + params.bSRGB = false; + params.bUseAlpha = true; + UTexture2D* tex = m_CreateTexture2D(w, h, imagePixels, true); + //FImageUtils::CreateTexture2D(w, h, imagePixels, GetWorld(), imageName, EObjectFlags)0, params); + check(tex); + m_profilePictures.Add(idString, tex); + return tex; +#else + return defaultAvatar; +#endif +} + +// Solution to ConstructTexture2D not being supported on consoles. +// From: https://answers.unrealengine.com/questions/33571/fimageutilscreatetexture2d-causes-brief-hang-is-th.html +UTexture2D* USessionManager::m_CreateTexture2D(const int32 srcWidth, const int32 srcHeight, const TArray& srcColor, const bool useAlpha) +{ + UTexture2D* texture = UTexture2D::CreateTransient(srcWidth, srcHeight, PF_B8G8R8A8); + + uint8* MipData = static_cast(texture->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE)); + + // Create base mip. + uint8* DestPtr = NULL; + const FColor* SrcPtr = NULL; + for(int32 y = 0; y < srcHeight; y++) + { + DestPtr = &MipData[(srcHeight - 1 - y) * srcWidth * sizeof(FColor)]; + SrcPtr = const_cast(&srcColor[(srcHeight - 1 - y) * srcWidth]); + for(int32 x = 0; x < srcWidth; x++) + { + *DestPtr++ = SrcPtr->B; + *DestPtr++ = SrcPtr->G; + *DestPtr++ = SrcPtr->R; + if(useAlpha) + { + *DestPtr++ = SrcPtr->A; + } + else + { + *DestPtr++ = 0xFF; + } + SrcPtr++; + } + } + + // Unlock the texture + texture->PlatformData->Mips[0].BulkData.Unlock(); + texture->UpdateResource(); + + return texture; +} + +void USessionManager::m_OnCreateSessionComplete(FName sessionName, bool successful) +{ + GWARNING("OnCreateSessionComplete " + sessionName.ToString().GetCharArray().GetData() + ", " + successful); + + m_session->ClearOnCreateSessionCompleteDelegate_Handle(onCreateSessionCompleteDelegateHandle); + + // Start listen server + UWorld* world = m_instance->GetWorld(); + if(world->Listen(m_listenURL)) + { + GPRINT("Started listen server on " + m_listenURL.ToString()); + } + else + { + successful = false; + GERROR("Failed to start listen server!"); + } + + onCreateSessionComplete.Broadcast(successful); +} +void USessionManager::m_OnStartOnlineGameComplete(FName sessionName, bool successful) +{ + GWARNING("OnStartOnlineGameComplete " + sessionName.ToString().GetCharArray().GetData() + ", " + successful); + m_session->ClearOnStartSessionCompleteDelegate_Handle(onStartSessionCompleteDelegateHandle); +} +void USessionManager::m_OnFindSessionsComplete(bool successful) +{ + GWARNING("OnFindSessionsComplete " + successful + + " with " + sessionSearch->SearchResults.Num() + " sessions"); + + m_session->ClearOnFindSessionsCompleteDelegate_Handle(onFindSessionsCompleteDelegateHandle); + onFindSessionsComplete.Broadcast(true); +} +void USessionManager::m_OnJoinSessionComplete(FName sessionName, EOnJoinSessionCompleteResult::Type result) +{ + GWARNING("OnJoinSessionComplete " + sessionName.ToString().GetCharArray().GetData() + ", " + int32(result)); + + m_session->ClearOnJoinSessionCompleteDelegate_Handle(onJoinSessionCompleteDelegateHandle); + if(result == EOnJoinSessionCompleteResult::Success) + { + if(!m_session->GetResolvedConnectString(joinSessionResult, GamePort, joinConnectionString)) + result = EOnJoinSessionCompleteResult::CouldNotRetrieveAddress; + else if(joinConnectionString.IsEmpty()) + result = EOnJoinSessionCompleteResult::CouldNotRetrieveAddress; + else + GPRINT("Resolved joined session address to: " + joinConnectionString); + } + onJoinSessionComplete.Broadcast(result); +} +void USessionManager::m_OnDestroySessionComplete(FName sessionName, bool successful) +{ + GWARNING("OnDestroySessionComplete " + sessionName.ToString().GetCharArray().GetData() + ", " + successful); + + m_session->ClearOnDestroySessionCompleteDelegate_Handle(onDestroySessionCompleteDelegateHandle); + + if(m_postDestroyAction != 0) + { + if(m_postDestroyAction == POST_DESTROY_CREATE) + { + CreateSession(false); + } + else if(m_postDestroyAction == POST_DESTROY_JOIN) + { + JoinSession(joinSessionResult, false); + } + else if(m_postDestroyAction == POST_DESTROY_FIND) + { + FindSessions(false); + } + m_postDestroyAction = 0; + return; + } + + onDestroySessionComplete.Broadcast(successful); +} +void USessionManager::m_OnPingSearchResultsComplete(bool successful) +{ + onPingComplete.Broadcast(successful); +} diff --git a/Source/UnrealProject/GameState/SessionManager.h b/Source/UnrealProject/GameState/SessionManager.h new file mode 100644 index 0000000..1a9c9bc --- /dev/null +++ b/Source/UnrealProject/GameState/SessionManager.h @@ -0,0 +1,115 @@ +#pragma once + +#include "Online.h" +#include "SessionManager.Generated.h" + +/* + A Class for managing the online subsystem and sessions +*/ +UCLASS() +class USessionManager : public UObject +{ + GENERATED_BODY() + friend class UDefaultGameInstance; + UPROPERTY() + class UDefaultGameInstance* m_instance; +public: + USessionManager(); + void Shutdown(); + + void CreateSession(bool destroyOld = true); + void FindSessions(bool destroyOld = true); + void JoinSession(const class FOnlineSessionSearchResult& searchResult, bool destroyOld = true); + void DestroySession(); + void PingResult(const class FOnlineSessionSearchResult& result); + + // Checks if a session is active + bool SessionExists() const; + + // Mark session as in progress + void StartSession(); + // Mark session as ended + void EndSession(); + + // Check if we currently are connected to a other clients, client or server + bool HasNetConnection(); + + // Closes all network connections, client or server + void CloseNetConnections(); + + // Routed from the game instance to signal the user has accepted an invite through the online subsystem + void AcceptUserInvite(const bool bWasSuccess, const int32 ControllerId, + TSharedPtr Us, const FOnlineSessionSearchResult& res); + + // Get a player's nickname for a NetId in the current session + //UFUNCTION(BlueprintCallable, Category = "Friends") + FString GetPlayerName(const FUniqueNetId& netID); + // Get the SteamID of a player or an empty string if not connected to steam + FString GetSteamID(const FUniqueNetId& netID); + // Get a player's avatar for a NetId in the current session + //UFUNCTION(BlueprintCallable, Category="Friends") + UTexture2D* GetPlayerAvatar(const FUniqueNetId& netID); + + // Public delegates + DECLARE_MULTICAST_DELEGATE_OneParam(FSessionCallback, bool); + FSessionCallback onDestroySessionComplete; + FSessionCallback onCreateSessionComplete; + FSessionCallback onFindSessionsComplete; + DECLARE_MULTICAST_DELEGATE_OneParam(FOnJoinSessionComplete, int32); + FOnJoinSessionComplete onJoinSessionComplete; + DECLARE_MULTICAST_DELEGATE_TwoParams(FOnAcceptInvite, bool, const FOnlineSessionSearchResult&); + FOnAcceptInvite onAcceptInvite; + DECLARE_MULTICAST_DELEGATE_OneParam(FOnPingComplete, bool) + FOnPingComplete onPingComplete; + + // The settings used when creating new sessions + FOnlineSessionSettings sessionSettings; + FOnlineSessionSearchResult joinSessionResult; + FString joinConnectionString; + + // An ongoing session search + TSharedPtr sessionSearch; + +private: + // Session action callbacks + void m_OnCreateSessionComplete(FName sessionName, bool successful); + void m_OnStartOnlineGameComplete(FName sessionName, bool successful); + void m_OnFindSessionsComplete(bool successful); + void m_OnJoinSessionComplete(FName sessionName, EOnJoinSessionCompleteResult::Type result); + void m_OnDestroySessionComplete(FName sessionName, bool successful); + void m_OnPingSearchResultsComplete(bool successful); + + // Used to create a texture for the player avatars + class UTexture2D* m_CreateTexture2D(const int32 srcWidth, const int32 srcHeight, const TArray& srcColor, const bool useAlpha); + + // Session action callback delegate handles + FOnCreateSessionCompleteDelegate onCreateSessionCompleteDelegate; + FOnStartSessionCompleteDelegate onStartSessionCompleteDelegate; + FOnFindSessionsCompleteDelegate onFindSessionsCompleteDelegate; + FOnJoinSessionCompleteDelegate onJoinSessionCompleteDelegate; + FOnDestroySessionCompleteDelegate onDestroySessionCompleteDelegate; + FOnPingSearchResultsCompleteDelegate onPingSearchResultsCompleteDelegate; + FDelegateHandle onCreateSessionCompleteDelegateHandle; + FDelegateHandle onStartSessionCompleteDelegateHandle; + FDelegateHandle onFindSessionsCompleteDelegateHandle; + FDelegateHandle onJoinSessionCompleteDelegateHandle; + FDelegateHandle onDestroySessionCompleteDelegateHandle; + FDelegateHandle onPingSearchResultsCompleteDelegateHandle; + + // Action to perform after destroy event finished + int32 m_postDestroyAction; + + // Online subsystem handles + IOnlineSubsystem* m_onlineSystem; + IOnlineSessionPtr m_session; + + // The local player's NetId + TSharedPtr m_localNetID; + + // A list of cached profile pictures + UPROPERTY() + TMap m_profilePictures; + + // URL for the listen server + FURL m_listenURL; +}; \ No newline at end of file diff --git a/Source/UnrealProject/Items/ItemBase.cpp b/Source/UnrealProject/Items/ItemBase.cpp new file mode 100644 index 0000000..92cb91e --- /dev/null +++ b/Source/UnrealProject/Items/ItemBase.cpp @@ -0,0 +1,125 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "ItemBase.h" +#include "BaseSkillObject.h" +#include "CharacterBase.h" + +// Sets default values +AItemBase::AItemBase() +{ + // Create a mesh subcomponent without collision. + Mesh = CreateDefaultSubobject(TEXT("Mesh")); + RootComponent = Mesh; + Mesh->SetCollisionEnabled(ECollisionEnabled::NoCollision); +} + +void AItemBase::CreateItemsFromSkill(UWorld* world, class UBaseSkillObject* skillObject, class ACharacterBase* character) +{ + + // Check if passed arguments are valid. + if (world && skillObject && character) + { + for (size_t i = 0; i < skillObject->visibleItems.itemsToEquip.Num(); i++) + { + if (!skillObject->visibleItems.itemsToEquip[i].mesh) + { + TERROR("Skill item does not have a mesh attached to it!"); + continue; + } + + // Get the Skeletal Mesh of the character. + USkeletalMeshComponent* charMesh = character->GetMesh(); + + // Check if the socket has already been taken by another item. + bool hasBeenTaken = false; + for (auto SceneComp : charMesh->AttachChildren) + { + AItemBase* item = Cast(SceneComp->GetOwner()); + if (item) + { + if (item->type == skillObject->visibleItems.itemsToEquip[i].type) + { + hasBeenTaken = true; + break; + } + } + } + if (!hasBeenTaken) + { + // Spawn a new item. + AItemBase* createdItem = Cast(world->SpawnActor(StaticClass())); + // Set the item with the correct settings and mesh. + createdItem->type = skillObject->visibleItems.itemsToEquip[i].type; + createdItem->SetMesh(skillObject->visibleItems.itemsToEquip[i].mesh); + createdItem->skillObject = skillObject; + createdItem->AttachItemToCharacter(character); + } + } + return; + } + TERROR("Either world (" + world + "), skillObject (" + skillObject + ") or character (" + character + ") passed to AItemBase::CreateItemFromSkill was a nullptr."); +} + +AItemBase* AItemBase::CheckSlotOccupied(EItemTypeEnum slotType, class ACharacterBase* character) +{ + + // Check if passed arguments are valid. + if(character) + { + UWorld* world = character->GetWorld(); + + // Get the Skeletal Mesh of the character. + USkeletalMeshComponent* charMesh = character->GetMesh(); + // Check if the socket has already been taken by another item. + bool hasBeenTaken = false; + for(auto SceneComp : charMesh->AttachChildren) + { + AItemBase* item = Cast(SceneComp->GetOwner()); + if (item) + { + if(item->type == slotType) + return item; + } + } + } + return nullptr; +} + +void AItemBase::Destroyed() +{ + ACharacterBase* attachedParent = Cast(this->GetAttachParentActor()); + if(IsValid(attachedParent)) + { + attachedParent->m_OnItemRemoved(this); + } + Super::Destroyed(); +} + +void AItemBase::SetMesh(USkeletalMesh* newMesh) +{ + Mesh->SetSkeletalMesh(newMesh); +} + +bool AItemBase::AttachItemToCharacter(class ACharacterBase* networkCharacter) +{ + // Variable used to retrieve names of the EItemTypeEnum values. + const static UEnum* EnumPtr = FindObject(ANY_PACKAGE, TEXT("EItemTypeEnum"), true); + // Retrieve the name of the type the item was assigned to. This is to attach the item to a socket. + FName socketName = FName(*EnumPtr->GetEnumName((int32)type)); + // Get the Skeletal Mesh of the character. + USkeletalMeshComponent* charMesh = networkCharacter->GetMesh(); + + // Check if the socket actually exists. + if(!charMesh->DoesSocketExist(socketName)) + { + return false; + } + + // Attach the item to the socket. + RootComponent->AttachTo(charMesh, NAME_None, EAttachLocation::SnapToTargetIncludingScale); + Mesh->SetMasterPoseComponent(charMesh); + // Notify character + networkCharacter->m_OnItemAdded(this); + return true; +} diff --git a/Source/UnrealProject/Items/ItemBase.h b/Source/UnrealProject/Items/ItemBase.h new file mode 100644 index 0000000..673b75b --- /dev/null +++ b/Source/UnrealProject/Items/ItemBase.h @@ -0,0 +1,44 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GameFramework/Actor.h" +#include "ItemBase.generated.h" + +UENUM(BlueprintType) +enum class EItemTypeEnum : uint8 +{ + Hat UMETA(DisplayName = "Hat") , + MainWeapon UMETA(DisplayName = "Main Weapon") , + OffWeapon UMETA(DisplayName = "Off Weapon") , + Chest UMETA(DisplayName = "Chest"), + Ammo UMETA(DisplayName = "Ammo"), + Feet UMETA(DisplayName = "Feet"), +}; + +UCLASS() +class UNREALPROJECT_API AItemBase : public AActor +{ + GENERATED_BODY() + friend class ACharacterBase; +public: + AItemBase(); + // Creating an item using a Skill Object's data. + static void CreateItemsFromSkill(UWorld* world, class UBaseSkillObject* skillObject, class ACharacterBase* character); + + // Returns the item currently equiped in a given slot + static AItemBase* CheckSlotOccupied(EItemTypeEnum slotType, class ACharacterBase* character); + + virtual void Destroyed() override; + + void SetMesh(class USkeletalMesh* newMesh); + // Attaches this item to a character. + bool AttachItemToCharacter(class ACharacterBase* networkCharacter); + + // Type of the item. This variable also correlates to the socket the item attaches to. + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Item) + EItemTypeEnum type; + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Components) + class USkeletalMeshComponent* Mesh; + class UBaseSkillObject* skillObject; +}; diff --git a/Source/UnrealProject/Sound/MusicPlayer.cpp b/Source/UnrealProject/Sound/MusicPlayer.cpp new file mode 100644 index 0000000..3f5d85b --- /dev/null +++ b/Source/UnrealProject/Sound/MusicPlayer.cpp @@ -0,0 +1,127 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "DefaultGameInstance.h" +#include "Prefs.h" +#include "MusicPlayer.h" + + +AMusicPlayer::AMusicPlayer() +{ + PrimaryActorTick.bCanEverTick = true; + + RootComponent = audioComponent = CreateDefaultSubobject(TEXT("Audio")); + + bReplicates = true; + + m_setInCombat = false; + m_isInCombat = false; +} + +void AMusicPlayer::BeginPlay() +{ + Super::BeginPlay(); + + float volume = Cast(GetGameInstance())->GetPrefs()->musicVolume; + audioComponent->SetVolumeMultiplier(volume); + + if (generalMusic.Num() > 0) + { + m_currentTrack = FMath::Rand() % generalMusic.Num(); + + audioComponent->SetSound(generalMusic[m_currentTrack]); + audioComponent->Play(); + } +} + +void AMusicPlayer::Tick( float DeltaTime ) +{ + Super::Tick( DeltaTime ); + + // Change the music combat state + if (m_setInCombat != m_isInCombat) + { + // Fade out the volume + m_changeTime += DeltaTime * 1.5f; + if (m_changeTime >= 1) + { + // Set next state + m_isInCombat = m_setInCombat; + audioComponent->Stop(); + m_changeTime = 0; + } + } + + float volume = Cast(GetGameInstance())->GetPrefs()->musicVolume; + audioComponent->SetVolumeMultiplier(volume * (1.0f - m_changeTime)); + + if (!audioComponent->IsPlaying()) + m_SelectNextTrack(); +} + +void AMusicPlayer::m_SelectNextTrack() +{ + // Regenerate the array of music (in case any tracks are NULL) + TArray& sampleFrom = (m_isInCombat ? combatMusic : generalMusic); + if (sampleFrom.Num() == 0) + return; + TArray availableTracks; + for (int32 i = 0; i < sampleFrom.Num(); i++) + { + if (sampleFrom[i]) + availableTracks.Add(sampleFrom[i]); + } + if (availableTracks.Num() == 0) + return; + + // Only select a random playlist if there are plenty of tracks + const int32 trackCount = availableTracks.Num(); + if (trackCount > 5) + { + // Add the current track to the recently played list + m_lastTracks.Add(m_currentTrack); + while (m_lastTracks.Num() > 3) + m_lastTracks.RemoveAt(0); + + // Select a random number + m_currentTrack = FMath::Rand() % availableTracks.Num(); + while (true) + { + // Check in the array of recently played to see if we already played this + bool found = false; + for (int32 i = 0; i < m_lastTracks.Num(); i++) + { + if (m_currentTrack == m_lastTracks[i]) + { + found = true; + break; + } + } + if (!found) + break; + + // Pick the next track and see if we havent already played that + m_currentTrack = (m_currentTrack + 1) % availableTracks.Num(); + } + } + else + m_currentTrack = (m_currentTrack + 1) % availableTracks.Num(); + + // Set the new track + audioComponent->SetSound(availableTracks[m_currentTrack]); + audioComponent->Play(); +} + +void AMusicPlayer::SetInCombat(bool inCombat) +{ + check(Role == ROLE_Authority); + m_setInCombat = inCombat; + m_changeTime = 0; +} + +void AMusicPlayer::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + + DOREPLIFETIME(AMusicPlayer, m_setInCombat); +} \ No newline at end of file diff --git a/Source/UnrealProject/Sound/MusicPlayer.h b/Source/UnrealProject/Sound/MusicPlayer.h new file mode 100644 index 0000000..b9abc0b --- /dev/null +++ b/Source/UnrealProject/Sound/MusicPlayer.h @@ -0,0 +1,41 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GameFramework/Actor.h" +#include "MusicPlayer.generated.h" + +UCLASS() +class UNREALPROJECT_API AMusicPlayer : public AActor +{ + GENERATED_BODY() + +public: + AMusicPlayer(); + + virtual void BeginPlay() override; + + virtual void Tick( float DeltaSeconds ) override; + + UPROPERTY(EditAnywhere) + TArray generalMusic; + UPROPERTY(EditAnywhere) + TArray combatMusic; + + void SetInCombat(bool inCombat); + + UPROPERTY(VisibleAnywhere, BlueprintReadOnly) + class UAudioComponent* audioComponent; + +private: + int32 m_currentTrack; + TArray m_lastTracks; + + UPROPERTY(Replicated) + bool m_setInCombat; + + bool m_isInCombat; + float m_changeTime; + + void m_SelectNextTrack(); +}; diff --git a/Source/UnrealProject/Sound/SoundEffect.cpp b/Source/UnrealProject/Sound/SoundEffect.cpp new file mode 100644 index 0000000..65b3cb6 --- /dev/null +++ b/Source/UnrealProject/Sound/SoundEffect.cpp @@ -0,0 +1,59 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" + +#include "SoundEffect.h" +#include "Prefs.h" +#include "DefaultGameInstance.h" + + +// Sets default values +ASoundEffect::ASoundEffect() +{ + PrimaryActorTick.bCanEverTick = true; + + bReplicates = true; + RootComponent = m_audio = CreateDefaultSubobject(TEXT("Audio")); +} + +void ASoundEffect::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + DOREPLIFETIME_CONDITION(ASoundEffect, m_audio, COND_InitialOnly); +} + +// Called when the game starts or when spawned +void ASoundEffect::BeginPlay() +{ + Super::BeginPlay(); + m_audio->OnAudioFinished.AddDynamic(this, &ASoundEffect::OnAudioFinished); + + if (!m_audio->Sound) + Destroy(); + + // Initial volume + float volume = Cast(GetGameInstance())->GetPrefs()->sfxVolume; + m_audio->SetVolumeMultiplier(volume); + + m_audio->Play(); +} + +// Called every frame +void ASoundEffect::Tick( float DeltaTime ) +{ + Super::Tick( DeltaTime ); + + // Update volume settings + float volume = Cast(GetGameInstance())->GetPrefs()->sfxVolume; + m_audio->SetVolumeMultiplier(volume); +} + +void ASoundEffect::OnAudioFinished() +{ + Destroy(); +} + +void ASoundEffect::Init(USoundBase* sound) +{ + m_audio->SetSound(sound); +} \ No newline at end of file diff --git a/Source/UnrealProject/Sound/SoundEffect.h b/Source/UnrealProject/Sound/SoundEffect.h new file mode 100644 index 0000000..874e557 --- /dev/null +++ b/Source/UnrealProject/Sound/SoundEffect.h @@ -0,0 +1,27 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GameFramework/Actor.h" +#include "SoundEffect.generated.h" + +UCLASS() +class UNREALPROJECT_API ASoundEffect : public AActor +{ + GENERATED_BODY() +public: + ASoundEffect(); + + virtual void BeginPlay() override; + virtual void Tick( float DeltaSeconds ) override; + + void Init(USoundBase* sound); + + UFUNCTION() + void OnAudioFinished(); + +private: + UPROPERTY(Replicated) + class UAudioComponent* m_audio; + +}; diff --git a/Source/UnrealProject/Sound/SoundFunctionLibrary.cpp b/Source/UnrealProject/Sound/SoundFunctionLibrary.cpp new file mode 100644 index 0000000..2781ccf --- /dev/null +++ b/Source/UnrealProject/Sound/SoundFunctionLibrary.cpp @@ -0,0 +1,50 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "SoundEffect.h" +#include "DefaultGameInstance.h" +#include "Prefs.h" +#include "SoundFunctionLibrary.h" + +ASoundEffect* USoundFunctionLibrary::CreateSoundEffect(USoundBase* sndClass, AActor* spawner) +{ + if (!sndClass) + { + JERROR("Sound class was not assigned when spawning Sound Effect"); + return nullptr; + } + if (!spawner) + { + JERROR("Spawner was not assigned when spawning Sound Effect"); + return nullptr; + } + + UWorld* const world = spawner->GetWorld(); + + FTransform transform; + transform.SetIdentity(); + transform.TransformPosition(spawner->GetActorLocation()); + ASoundEffect* sound = world->SpawnActorDeferred(ASoundEffect::StaticClass(), transform); + if (sound) + { + sound->Init(sndClass); + UGameplayStatics::FinishSpawningActor(sound, transform); + } + else + { + GWERROR(L"Failed to CreateSoundEffect()"); + } + return sound; +} + + +float USoundFunctionLibrary::GetSFXVolume(UDefaultGameInstance* gameInstance) +{ + if (!gameInstance || !gameInstance->IsA(UDefaultGameInstance::StaticClass())) { JERROR("GameInstance was not assigned getting Sound Volume"); return 0; } + return Cast(gameInstance)->GetPrefs()->sfxVolume; +} +float USoundFunctionLibrary::GetMusicVolume(UDefaultGameInstance* gameInstance) +{ + if (!gameInstance || !gameInstance->IsA(UDefaultGameInstance::StaticClass())) { JERROR("GameInstance was not assigned getting Music Volume"); return 0; } + return Cast(gameInstance)->GetPrefs()->musicVolume; +} \ No newline at end of file diff --git a/Source/UnrealProject/Sound/SoundFunctionLibrary.h b/Source/UnrealProject/Sound/SoundFunctionLibrary.h new file mode 100644 index 0000000..f8bbf9b --- /dev/null +++ b/Source/UnrealProject/Sound/SoundFunctionLibrary.h @@ -0,0 +1,25 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Kismet/BlueprintFunctionLibrary.h" +#include "SoundFunctionLibrary.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API USoundFunctionLibrary : public UBlueprintFunctionLibrary +{ + GENERATED_BODY() + + +public: + UFUNCTION(BlueprintCallable, Category = "Sound") + static class ASoundEffect* CreateSoundEffect(class USoundBase* sndClass, class AActor* spawner); + + UFUNCTION(BlueprintCallable, Category = "Sound") + static float GetSFXVolume(class UDefaultGameInstance* gameInstance); + UFUNCTION(BlueprintCallable, Category = "Sound") + static float GetMusicVolume(class UDefaultGameInstance* gameInstance); +}; diff --git a/Source/UnrealProject/Spawners/CreatureSpawn.cpp b/Source/UnrealProject/Spawners/CreatureSpawn.cpp new file mode 100644 index 0000000..f1f2200 --- /dev/null +++ b/Source/UnrealProject/Spawners/CreatureSpawn.cpp @@ -0,0 +1,354 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "NPCBase.h" +#include "NetworkDoor.h" +#include "DefaultGameMode.h" +#include "CreatureSpawn.h" +#include "Modifier.h" +#include "NativeModifiers.h" +#include "NetworkPlayer.h" +#include "TouhouBoss.h" + +ACreatureSpawn::ACreatureSpawn() +{ + respawnTime = 5; + m_respawnTimer = 0; + + spawnContinuous = true; + + spawnTrigger = CreateDefaultSubobject(TEXT("Sphere")); + spawnTrigger->SetCollisionProfileName(TEXT("PlayerOverlap")); + spawnTrigger->AttachTo(RootComponent); + spawnTrigger->OnComponentBeginOverlap.AddDynamic(this, &ACreatureSpawn::OnOverlapBegin); + spawnTrigger->OnComponentEndOverlap.AddDynamic(this, &ACreatureSpawn::OnOverlapEnd); + spawnTrigger->SetSphereRadius(3000); + spawnTrigger->SetVisibility(false); +} + +void ACreatureSpawn::BeginPlay() +{ + Super::BeginPlay(); + + if (Role != ROLE_Authority) + return; + + if (aggroRadius < 0) aggroRadius = 0; + if (respawnTime < 0) respawnTime = 0; + + if (spawns.Num() == 0) + { + JWARNING("Empty spawner in scene"); + return; + } + else if (spawns.Num() != 1 && isBoss) + { + FWARNING("Unexpected amount of spawners for boss"); + } + + // Calculate spawn sub positions + if (spawns.Num() > 1) + { + float angle = (360.0f) / 180.0f * PI; + float anglestep = (angle) / (spawns.Num() + 1); + float rot = angle * 0.5f; + for (int32 i = 0; i < spawns.Num(); i++) + { + float f = cosf(rot); + float r = sinf(rot); + rot += anglestep; + if (hasGeneral) + { + m_resetPoints.Add(GetActorLocation() + FVector(f * 200, r * 200, 0)); + } + else m_resetPoints.Add(FVector(formationPoints[i].X,formationPoints[i].Y,0) + GetActorLocation()); + } + } + else if (spawns.Num() == 1) + m_resetPoints.Add(GetActorLocation()); + + m_respawnTimer = -1.0f; + +} +void ACreatureSpawn::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + +} + +void ACreatureSpawn::Tick(float DeltaTime) +{ + Super::Tick(DeltaTime); + + if (Role != ROLE_Authority) + return; + + UWorld* const world = GetWorld(); + if (!world) return; + + m_respawnTimer = m_respawnTimer > 0 ? (m_respawnTimer - DeltaTime) : 0; + + /*if (m_nearbyPlayers.empty()) + { + // Despawn if there are no players nearby and the timer is depleted + if (m_respawnTimer <= 0) + { + // m_DespawnMobs(); + } + } + else + {*/ + // Respawn time mobs if the timer has ran out and we are missing mobs + if (m_respawnTimer <= 0 && m_mobCount != m_mobs.Num() && spawnContinuous) + m_RespawnMobs(); +// } + + // No mobs to update + if (m_mobs.Num() == 0) + return; + + // Decrement respawntime + bool anyIdle = false; + for (int32 i = 0; i < spawns.Num(); i++) + { + if (!spawns[i] || !m_mobs[i]) + continue; + // Check if any mob is idle + const FVector2D mobPos = FVector2D(m_mobs[i]->GetActorLocation().X, m_mobs[i]->GetActorLocation().Y); + const FVector2D targetPos = FVector2D(SpawnResetPosition().X, SpawnResetPosition().Y); + const float distSqr = FVector2D::DistSquared(mobPos, targetPos); + if (!m_mobs[i]->target && distSqr < deaggroRadius*deaggroRadius) + anyIdle = true; + } + + //// We can start attacking if any mob is idle and there is a player nearby + //if (anyIdle) + //{ + // for (int32 i = 0; i < spawns.Num(); i++) + // { + // if (m_mobs[i] == nullptr) + // continue; + // //find the biggest threat of the enemies + // ANetworkCharacter* threat = m_GetBiggestThreat(i); + // if (m_mobs[i]->target != nullptr) + // continue; + // const FVector2D mobPos = FVector2D(m_mobs[i]->GetActorLocation().X, m_mobs[i]->GetActorLocation().Y); + // const FVector2D targetPos = FVector2D(m_resetPoints[i].X, m_resetPoints[i].Y); + // const float distSqr = FVector2D::DistSquared(mobPos, targetPos); + // if (distSqr < aggroRadius * aggroRadius)// (m_mobs[i]->collisionRadius*m_mobs[i]->collisionRadius)*collisionScaler) + // { + // FPRINT("idledistsettarget"); + // m_mobs[i]->target = threat; + // } + // + // } + //} + + if (isBoss && m_mobs.Num() == 1) + { + UWorld* const world = GetWorld(); + if (!world) return; + ADefaultGameMode* mode = Cast(world->GetAuthGameMode()); + if (!mode) return; + + //check if it is more than 1 team + int teamcount = 0; + int32 team = 0; + for (auto iter = m_nearbyPlayers.begin(); iter != m_nearbyPlayers.end(); iter++) + { + ANetworkCharacter* player = *iter; + if ((player->GetActorLocation() - GetActorLocation()).Size() < aggroRadius) + { + if (teamcount == 0) + { + team = player->GetTeam(); + teamcount++; + } + else if (team != player->GetTeam()) + { + teamcount++; + break; + } + } + } + if (teamcount > 1 && m_invulnerableModifier == nullptr) + { + if (m_mobs[0] != nullptr) + { + ModifierManager* manager = m_mobs[0]->GetModifierManager(); + TSubclassOf subclass = ADamageTakenModifier::StaticClass(); + m_invulnerableModifier = GetWorld()->SpawnActor(subclass); + if (m_invulnerableModifier != nullptr) + { + Cast(m_invulnerableModifier)->damageTakenMultiplier = 0.0f; + m_invulnerableModifier->character = m_mobs[0]; + manager->AddModifier(m_invulnerableModifier); + Cast(m_mobs[0])->SetShield(true); + } + else + { + FPRINT("failed to spawn m_invulnerableModifier in creaturespawn"); + } + } + } + else if (teamcount <2 && m_invulnerableModifier != nullptr) + { + m_invulnerableModifier->ForceDestroy(); + m_invulnerableModifier = nullptr; + } + } +} + +int32 ACreatureSpawn::OnMobDie(class ANPCBase* mob) +{ + const int32 idx = Super::OnMobDie(mob); + + m_respawnTimer = respawnTime; + + if (m_mobCount == 0) + { + for (int32 i = 0; i < doorsToOpen.Num(); i++) + { + if (doorsToOpen[i]) + doorsToOpen[i]->SetDoorState(false); + } + } + + return idx; +} + +void ACreatureSpawn::SpawnMobs() +{ + m_RespawnMobs(); +} + +void ACreatureSpawn::OnOverlapBegin(AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) +{ + if (!OtherActor) + return; + if (!OtherActor->IsA(ANetworkCharacter::StaticClass())) + return; + + ANetworkCharacter* player = Cast(OtherActor); + if(player) + m_OnPlayerEnterOverlap(*player); +} +void ACreatureSpawn::OnOverlapEnd(AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex) +{ + if (!OtherActor) + return; + if (!OtherActor->IsA(ANetworkCharacter::StaticClass())) + return; + + ANetworkCharacter* player = Cast(OtherActor); + if(player) + m_OnPlayerExitOverlap(*player); +} + +void ACreatureSpawn::m_DespawnMobs() +{ + for (int32 i = 0; i < m_mobs.Num(); i++) + { + if (m_mobs[i]) + { + m_mobs[i]->UnsetSpawn(); + m_mobs[i]->Destroy(); + m_mobs[i] = nullptr; + } + } + + for (int32 i = 0; i < doorsToOpen.Num(); i++) + { + if (doorsToOpen[i]) + doorsToOpen[i]->SetDoorState(false); + } + formationEnemies.Empty(); + m_mobCount = 0; +} +void ACreatureSpawn::m_RespawnMobs() +{ + UWorld* const world = GetWorld(); + if (!world) + return; + for (int32 i = 0; i < m_mobs.Num(); i++) + { + if (!spawns[i]) + continue; + if (m_mobs[i] == nullptr) + { + // Respawn! + FTransform spawnTransform = GetTransform(); + FVector spawnVector = FVector(); + spawnTransform.SetLocation(m_resetPoints[i] + FVector(0, 0, 120)); + if (SpawnLocation.Num()>0) + { + int randnum = rand() % SpawnLocation.Num(); + spawnTransform = SpawnLocation[randnum]->GetTransform(); + FVector rotation = FVector(GetActorLocation() - spawnTransform.GetLocation()); + spawnTransform.SetRotation(FQuat(rotation.Rotation())); + //spawnVector = SpawnLocation->GetActorLocation() - GetActorLocation(); + //spawnTransform.SetLocation(spawnVector); + } + + ANPCBase* character = world->SpawnActorDeferred(spawns[i], spawnTransform, nullptr, nullptr, ESpawnActorCollisionHandlingMethod::AlwaysSpawn); + + character->SetSpawn(this); + character->SetTeam((int32)team); + m_mobs[i] = character; + m_mobCount++; + m_OnMobSpawn(i); + UGameplayStatics::FinishSpawningActor(character, spawnTransform); + character->SpawnDefaultController(); + } + } + + m_respawnTimer = respawnTime; +} + + +void ACreatureSpawn::GetNewTarget(class ANPCBase* mob) +{ + if (mob == nullptr) + return; + + int32 index = -1; + for (ANPCBase* currentMob : m_mobs) + { + index++; + if (mob != currentMob) + continue; + + + ANetworkCharacter* threat = nullptr; + bool end = false; + //keeps looping to make sure if the biggest threat is not in aggrorange it still works; + int32 biggestThreat = -1; + float dist = 1e34; + for (ANetworkCharacter *character:m_nearbyPlayers) + { + if (character->GetTeam() == (int)team) + continue; + + //check if it is bigger than the last biggestThreat + + const FVector2D spawnpost = FVector2D(GetActorLocation().X, GetActorLocation().Y); + const FVector2D targetPos = FVector2D(character->GetActorLocation().X, character->GetActorLocation().Y); + const float distSqr = FVector2D::DistSquared(spawnpost, targetPos); + //making sure the new biggest thread is withing the aggroRadius + if (distSqr < aggroRadius * aggroRadius&&dist>distSqr) + { + dist = distSqr; + threat = character; + + } + + } + + + m_resetTimer = resetTimer; + currentMob->target = threat; + return; + } + + return; +} \ No newline at end of file diff --git a/Source/UnrealProject/Spawners/CreatureSpawn.h b/Source/UnrealProject/Spawners/CreatureSpawn.h new file mode 100644 index 0000000..89c7261 --- /dev/null +++ b/Source/UnrealProject/Spawners/CreatureSpawn.h @@ -0,0 +1,54 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "SpawnerBase.h" +#include "CreatureSpawn.generated.h" + +UCLASS() +class ACreatureSpawn : public ASpawnerBase +{ + GENERATED_BODY() + +public: + ACreatureSpawn(); + + virtual void BeginPlay() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + + virtual void Tick(float DeltaTime) override; + + UPROPERTY(EditAnywhere, Category = "Switch Components") + TArray doorsToOpen; + + UPROPERTY(EditAnywhere) + float respawnTime; + + UPROPERTY(EditAnywhere, Category = "Switch Components") + class USphereComponent* spawnTrigger; + + UPROPERTY(EditAnywhere, Category = "Gamestate Components") + bool isBoss; + UPROPERTY(EditAnywhere, Category = "Gamestate Components") + bool spawnContinuous; + + UFUNCTION() + void OnOverlapBegin(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult); + UFUNCTION() + void OnOverlapEnd(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex); + + virtual int32 OnMobDie(class ANPCBase* mob) override; + virtual void GetNewTarget(class ANPCBase* mob) override; + void SpawnMobs(); + +protected: + virtual void m_RespawnMobs(); +private: + TArray m_resetPoints; + float m_respawnTimer; + + class AModifier* m_invulnerableModifier; + + void m_DespawnMobs(); + +}; diff --git a/Source/UnrealProject/Spawners/CreatureSpawnComponent.cpp b/Source/UnrealProject/Spawners/CreatureSpawnComponent.cpp new file mode 100644 index 0000000..5899453 --- /dev/null +++ b/Source/UnrealProject/Spawners/CreatureSpawnComponent.cpp @@ -0,0 +1,244 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "CreatureSpawnComponent.h" +#include "SpawnerBase.h" +#include "GeneralEnemy.h" +#include "OffensiveEnemy.h" +#include "RangedEnemy.h" +#include "EnemyBase.h" + +#define CONEARCVERTEXCOUNT 50 + +UCreatureSpawnComponent::UCreatureSpawnComponent(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) +{ + ShapeColor = FColor(223, 149, 157, 255); + spawnerBase = Cast(GetAttachmentRootActor()); + bUseEditorCompositing = true; +} + +FPrimitiveSceneProxy* UCreatureSpawnComponent::CreateSceneProxy() +{ + class FDrawConeSceneProxy : public FPrimitiveSceneProxy + { + public: + const UCreatureSpawnComponent* component; + FDrawConeSceneProxy(const UCreatureSpawnComponent* InComponent) + : FPrimitiveSceneProxy(InComponent) + , spawnerBase(InComponent->spawnerBase) + , bDrawOnlyIfSelected(InComponent->bDrawOnlyIfSelected) + , component(InComponent) + { + bWillEverBeLit = false; + } + + + virtual void GetDynamicMeshElements(const TArray& Views, const FSceneViewFamily& ViewFamily, uint32 VisibilityMap, FMeshElementCollector& Collector) const override + { + QUICK_SCOPE_CYCLE_COUNTER(STAT_GetDynamicMeshElements_DrawDynamicElements); + + const FMatrix& LocalToWorld = GetLocalToWorld(); + + for (int32 ViewIndex = 0; ViewIndex < Views.Num(); ViewIndex++) + { + const FSceneView* View = Views[ViewIndex]; + + FPrimitiveDrawInterface* PDI = Collector.GetPDI(ViewIndex); + if (spawnerBase) + { + + FTransform transform = component->GetAttachParent()->GetComponentTransform(); + FVector base = transform.GetLocation(); + + + const float scale = 1.0f / 180.0f * PI; + float baseRot = (360.0f - transform.GetRotation().Euler().Z) * scale; + + //FVector forward = FVector(1, 0, 0).RotateAngleAxis(0.0f, FVector(0, 0, 1)); + //FVector right = FVector(0, 1, 0).RotateAngleAxis(0.0f, FVector(0, 0, 1)); + FVector forward = FVector(1, 0, 0); + FVector right = FVector(0, 1, 0); + float angle = (360.0f) / 180.0f * PI; + + FVector linePoints[CONEARCVERTEXCOUNT]; + float anglestep = (angle) / (CONEARCVERTEXCOUNT - 1); + + float rot = baseRot - angle * 0.5f; + for (int i = 0; i < CONEARCVERTEXCOUNT; i++) + { + float f = cosf(rot); + float r = sinf(rot); + linePoints[i] = base + (forward * f - right * r) * spawnerBase->aggroRadius; + rot += anglestep; + } + + for (int i = 0; i < CONEARCVERTEXCOUNT - 1; i++) + { + + PDI->DrawLine(linePoints[i], linePoints[i + 1], ShapeColor, SDPG_World); + } + for (int i = 0; i < CONEARCVERTEXCOUNT; i++) + { + float f = cosf(rot); + float r = sinf(rot); + linePoints[i] = base + (forward * f - right * r) * spawnerBase->deaggroRadius; + rot += anglestep; + } + + for (int i = 0; i < CONEARCVERTEXCOUNT - 1; i++) + { + + PDI->DrawLine(linePoints[i], linePoints[i + 1], FColor(0,0,255), SDPG_World); + } + FVector last = spawnerBase->GetActorLocation(); + FVector first; + for (int32 i = 0; i < spawnerBase->controlPoints.Num(); i++) + { + + FTransform transform = component->GetAttachParent()->GetComponentTransform(); + FVector base = transform.GetLocation() + FVector(spawnerBase->controlPoints[i].X, spawnerBase->controlPoints[i].Y, 0); + if (i == 0) + first = base; + + const float scale = 1.0f / 180.0f * PI; + float baseRot = (360.0f - transform.GetRotation().Euler().Z) * scale; + + //FVector forward = FVector(1, 0, 0).RotateAngleAxis(0.0f, FVector(0, 0, 1)); + //FVector right = FVector(0, 1, 0).RotateAngleAxis(0.0f, FVector(0, 0, 1)); + FVector forward = FVector(1, 0, 0); + FVector right = FVector(0, 1, 0); + float angle = (360.0f) / 180.0f * PI; + + FVector linePoints[CONEARCVERTEXCOUNT]; + float anglestep = (angle) / (CONEARCVERTEXCOUNT - 1); + + float rot = baseRot - angle * 0.5f; + for (int i = 0; i < CONEARCVERTEXCOUNT; i++) + { + float f = cosf(rot); + float r = sinf(rot); + linePoints[i] = base + (forward * f - right * r) * spawnerBase->drawingRadius; + rot += anglestep; + } + + for (int i = 0; i < CONEARCVERTEXCOUNT - 1; i++) + { + + PDI->DrawLine(linePoints[i], linePoints[i + 1], ShapeColor, SDPG_World); + } + PDI->DrawLine(base, last, ShapeColor, SDPG_World); + last = base; + //PDI->DrawLine(base, linePoints[CONEARCVERTEXCOUNT - 1], ShapeColor, SDPG_World); + } + if (spawnerBase->isConnected) + PDI->DrawLine(first, last, ShapeColor, SDPG_World); + for (int32 i = 0; i < spawnerBase->formationPoints.Num(); i++) + { + FColor formationColor = FColor(100, 100, 100); + //AEnemyBase *creature = (dynamic_cast(spawnerBase->spawns[i])); + FTransform transform = component->GetAttachParent()->GetComponentTransform(); + FVector base = transform.GetLocation() + spawnerBase->GetActorRotation().RotateVector( FVector(spawnerBase->formationPoints[i].X, spawnerBase->formationPoints[i].Y, 0))*spawnerBase->formationScale; + if (i == 0) + first = base; + + const float scale = 1.0f / 180.0f * PI; + float baseRot = (360.0f - transform.GetRotation().Euler().Z) * scale; + + //FVector forward = FVector(1, 0, 0).RotateAngleAxis(0.0f, FVector(0, 0, 1)); + //FVector right = FVector(0, 1, 0).RotateAngleAxis(0.0f, FVector(0, 0, 1)); + FVector forward = FVector(1, 0, 0); + FVector right = FVector(0, 1, 0); + float angle = (360.0f) / 180.0f * PI; + + FVector linePoints[CONEARCVERTEXCOUNT]; + float anglestep = (angle) / (CONEARCVERTEXCOUNT - 1); + + float rot = baseRot - angle * 0.5f; + for (int j = 0; j < CONEARCVERTEXCOUNT; j++) + { + float f = cosf(rot); + float r = sinf(rot); + linePoints[j] = base + (forward * f - right * r) * spawnerBase->drawingRadius; + rot += anglestep; + } + if (i >= spawnerBase->spawns.Num()) + { + formationColor.B = 10; + formationColor.G = 10; + formationColor.R = 10; + + } + else + { + + if ((spawnerBase->spawns[i])->IsChildOf(AGeneralEnemy::StaticClass())) + { + formationColor.B = 255; + formationColor.G = 255; + formationColor.R = 255; + } + else + { + formationColor.B = 42; + formationColor.G = 42; + formationColor.R = 42; + } + if ((spawnerBase->spawns[i])->IsChildOf(ARangedEnemy::StaticClass())&& !spawnerBase->spawns[i]->IsChildOf(AGeneralEnemy::StaticClass())) + { + formationColor.B = 0; + formationColor.G = 255; + formationColor.R = 0; + } + + if ((spawnerBase->spawns[i])->IsChildOf(AOffensiveEnemy::StaticClass())) + { + formationColor.B = 0; + formationColor.G = 0; + formationColor.R = 255; + } + + } + for (int j = 0; j < CONEARCVERTEXCOUNT - 1; j++) + { + + PDI->DrawLine(linePoints[j], linePoints[j + 1], formationColor, SDPG_World); + } + if (i < spawnerBase->formationRotation.Num()) + { + + PDI->DrawLine(base, base+(FRotator(0, spawnerBase->formationRotation[i],0).RotateVector( spawnerBase->GetActorForwardVector())* spawnerBase->drawingRadius), formationColor, SDPG_World); + } + else PDI->DrawLine(base, base + (spawnerBase->GetActorForwardVector())* spawnerBase->drawingRadius, formationColor, SDPG_World); + // PDI->DrawLine(base, last, formationColor, SDPG_World); + last = base; + //PDI->DrawLine(base, linePoints[CONEARCVERTEXCOUNT - 1], ShapeColor, SDPG_World); + } + //if (spawnerBase->isConnected) + // PDI->DrawLine(first, last, ShapeColor, SDPG_World); + + } + } + } + + virtual FPrimitiveViewRelevance GetViewRelevance(const FSceneView* View) const override + { + FPrimitiveViewRelevance Result; + Result.bDrawRelevance = IsSelected(); + Result.bDynamicRelevance = true; + Result.bShadowRelevance = IsShadowCast(View); + Result.bEditorPrimitiveRelevance = UseEditorCompositing(View); + return Result; + } + + virtual uint32 GetMemoryFootprint(void) const override { return(sizeof(*this) + GetAllocatedSize()); } + uint32 GetAllocatedSize(void) const { return(FPrimitiveSceneProxy::GetAllocatedSize()); } + + private: + const uint32 bDrawOnlyIfSelected : 1; + const ASpawnerBase* spawnerBase; + const FColor ShapeColor = FColor(255, 0, 0, 255); + const FTransform transform; + }; + + return new FDrawConeSceneProxy(this); +} \ No newline at end of file diff --git a/Source/UnrealProject/Spawners/CreatureSpawnComponent.h b/Source/UnrealProject/Spawners/CreatureSpawnComponent.h new file mode 100644 index 0000000..2c98e53 --- /dev/null +++ b/Source/UnrealProject/Spawners/CreatureSpawnComponent.h @@ -0,0 +1,22 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Components/CapsuleComponent.h" +#include "CreatureSpawnComponent.generated.h" + +/** + * + */ +class ASpawnerBase; +UCLASS() +class UNREALPROJECT_API UCreatureSpawnComponent : public UCapsuleComponent +{ + GENERATED_UCLASS_BODY() + +public: + ASpawnerBase* spawnerBase; + + virtual FPrimitiveSceneProxy* CreateSceneProxy() override; + +}; diff --git a/Source/UnrealProject/Spawners/KOTHBossSpawner.cpp b/Source/UnrealProject/Spawners/KOTHBossSpawner.cpp new file mode 100644 index 0000000..e9b2f9c --- /dev/null +++ b/Source/UnrealProject/Spawners/KOTHBossSpawner.cpp @@ -0,0 +1,41 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "KOTHBossSpawner.h" +#include "NPCBase.h" + +void AKOTHBossSpawner::BeginPlay() +{ + Super::BeginPlay(); + for (TActorIteratoractorIt(GetWorld()); actorIt; ++actorIt) + { + ASpawnerBase *spawn = *actorIt; + if (!spawn->possesable) + spawn->SetTeam((int)team); + } +} +void AKOTHBossSpawner::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); +} +void AKOTHBossSpawner::Tick(float deltaTime) +{ + Super::Tick(deltaTime); +} +bool AKOTHBossSpawner::IsBossAlive() const +{ + if(m_mobs.Num() > 0) + { + if(IsValid(m_mobs[0])) + return true; + } + return false; +} +void AKOTHBossSpawner::m_RespawnMobs() +{ + if (IsContested(m_currentTeam) && m_currentTeam<5) + { + return; + } + Super::m_RespawnMobs(); +} \ No newline at end of file diff --git a/Source/UnrealProject/Spawners/KOTHBossSpawner.h b/Source/UnrealProject/Spawners/KOTHBossSpawner.h new file mode 100644 index 0000000..5c21597 --- /dev/null +++ b/Source/UnrealProject/Spawners/KOTHBossSpawner.h @@ -0,0 +1,26 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Spawners/KOTHSpawnerBase.h" +#include "KOTHBossSpawner.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API AKOTHBossSpawner : public AKOTHSpawnerBase +{ + GENERATED_BODY() +public: + virtual void BeginPlay() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + virtual void Tick(float deltaTime)override; + // Check if the KOTH boss is currently alive + bool IsBossAlive() const; + +protected: + virtual void m_RespawnMobs()override; +private: + +}; diff --git a/Source/UnrealProject/Spawners/KOTHMinionSpawner.cpp b/Source/UnrealProject/Spawners/KOTHMinionSpawner.cpp new file mode 100644 index 0000000..43d7bb0 --- /dev/null +++ b/Source/UnrealProject/Spawners/KOTHMinionSpawner.cpp @@ -0,0 +1,78 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "NPCBase.h" +#include "NetworkDoor.h" +#include "DefaultGameMode.h" +#include "KOTHMinionSpawner.h" +#include "KOTHBossSpawner.h" +#include "NetworkCharacter.h" + + + +AKOTHMinionSpawner::AKOTHMinionSpawner(const FObjectInitializer& init) + : Super(init) +{ + respawnTime = 5; + // m_respawnTimer = 0; + + spawnContinuous = true; +} +void AKOTHMinionSpawner::BeginPlay() +{ + Super::BeginPlay(); + if (Role == ROLE_Authority) + { + kothagroRadius = aggroRadius; + kothdeagroRadius = deaggroRadius; + + for (TActorIteratorbSpawn(GetWorld()); bSpawn; ++bSpawn) + { + if (bSpawn) + bossSpawner = *bSpawn; + } + Super::m_RespawnMobs(); + } +} +void AKOTHMinionSpawner::Tick(float DeltaTime) +{ + Super::Tick(DeltaTime); + + if (!HasAuthority()) + return; + + // Reset the camp to the NPC team after an amount of time(captureTime) + m_captureTimer -= DeltaTime; + if (m_captureTimer < 0 && (int)team < 5) + { + SetTeam((int)(NPCTeam::Team1)); + m_reset = true; + } +} +void AKOTHMinionSpawner::GetNewTarget(ANPCBase* mob) +{ + + if (team == bossSpawner->team || (int)team>5) + { + aggroRadius = kothagroRadius; + deaggroRadius = kothdeagroRadius; + Super::GetNewTarget(mob); + return; + } + for (ANPCBase* bMob : bossSpawner->m_mobs) + { + aggroRadius = 1e34; + deaggroRadius = 1e34; + ANetworkCharacter* threat = Cast(bMob); + if (threat) + mob->target = threat; + + } +} +void AKOTHMinionSpawner::m_RespawnMobs() +{ + if (((int)team < 5 || m_reset)) + { + Super::m_RespawnMobs(); + } +} diff --git a/Source/UnrealProject/Spawners/KOTHMinionSpawner.h b/Source/UnrealProject/Spawners/KOTHMinionSpawner.h new file mode 100644 index 0000000..20fb467 --- /dev/null +++ b/Source/UnrealProject/Spawners/KOTHMinionSpawner.h @@ -0,0 +1,30 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Spawners/KOTHSpawnerBase.h" +#include "KOTHMinionSpawner.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API AKOTHMinionSpawner : public AKOTHSpawnerBase +{ + GENERATED_BODY() +public: + AKOTHMinionSpawner(const FObjectInitializer& init); + virtual void GetNewTarget(class ANPCBase* mob)override; + virtual void BeginPlay()override; + virtual void Tick(float deltaTime) override; + + + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "KOTH Spawner Properties") + FText CampName; + +private: + virtual void m_RespawnMobs()override; + float kothagroRadius; + float kothdeagroRadius; +}; diff --git a/Source/UnrealProject/Spawners/KOTHSpawnerBase.cpp b/Source/UnrealProject/Spawners/KOTHSpawnerBase.cpp new file mode 100644 index 0000000..3c6252f --- /dev/null +++ b/Source/UnrealProject/Spawners/KOTHSpawnerBase.cpp @@ -0,0 +1,132 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "KOTHSpawnerBase.h" +#include "NetworkPlayer.h" +#include "KOTHBossSpawner.h" +AKOTHSpawnerBase::AKOTHSpawnerBase(const FObjectInitializer& init) +{ + captureRadius = 500; + captureTime = 30; + possesionTime = 1; + + captureParticle = CreateDefaultSubobject("PossessParticle"); + captureParticle->AttachTo(RootComponent); +} + +void AKOTHSpawnerBase::BeginPlay() +{ + Super::BeginPlay(); + + // Assign team + m_currentTeam = (int)team; + + beingCaptured = false; +} +void AKOTHSpawnerBase::Tick(float DeltaTime) +{ + Super::Tick(DeltaTime); + + // Run capture polling code on host + if(Role == ROLE_Authority) + { + if(beingCaptured) + { + bool capture = false; + auto nearbyPlayers = GetNearbyPlayers(); + // Check contested condition + + if (m_mobCount == 0 && (nearbyPlayers.Num() <= 2)) + { + + if (nearbyPlayers.Num() > 0 && !IsContested(nearbyPlayers[0]->GetTeam()) && (int)team != nearbyPlayers[0]->GetTeam()) + { + capture = true; + + if (bossSpawner) + { + if ((int)bossSpawner->team == nearbyPlayers[0]->GetTeam() || (int)team < 5) + { + capture = false; + } + } + } + } + + if(capture) + { + m_possesionTimer += DeltaTime; + if(m_possesionTimer > possesionTime) + { + // Nearby team captures camp + m_ExeCaptureCamp(nearbyPlayers[0]->GetTeam()); + } + } + else + { + m_possesionTimer = 0; + } + } + } +} + +void AKOTHSpawnerBase::m_ExeCaptureCamp_Implementation(int32 targetTeam) +{ + if(Role == ROLE_Authority) + { + SetTeam(targetTeam); + onCampCaptured.Broadcast(targetTeam); + m_captureTimer = captureTime; + m_currentTeam = (int)NPCTeam::Team1; + beingCaptured = false; + m_reset = false; + } + + // Callback + OnEndCaptureCamp(targetTeam); + onEndCapture.Broadcast(targetTeam); + + // Deactivate capture particle + captureParticle->DeactivateSystem(); +} + +void AKOTHSpawnerBase::m_OnCampCleared() +{ + Super::m_OnCampCleared(); + + if(Role == ROLE_Authority) + { + beingCaptured = true; + } + + // Callback + OnBeginCaptureCamp(); + onBeginCapture.Broadcast(); + + // Enable capture particle + if(captureParticle->Template) + { + captureParticle->bAutoDestroy = false; + captureParticle->ResetParticles(); + captureParticle->ActivateSystem(); + } +} + +void AKOTHSpawnerBase::CaptureCamp(int targetTeam) +{ + Super::CaptureCamp(targetTeam); + + m_currentTeam = targetTeam; + m_possesionTimer = 0; +} + +bool AKOTHSpawnerBase::IsContested(int32 targetTeam) const +{ + for(ANetworkCharacter* character : m_nearbyPlayers) + { + ANetworkPlayer* player = Cast(character); + if(player && player->GetTeam() != targetTeam && FVector::DistSquared(GetActorLocation(), player->GetActorLocation()) < captureRadius * captureRadius) + return true; + } + return false; +} \ No newline at end of file diff --git a/Source/UnrealProject/Spawners/KOTHSpawnerBase.h b/Source/UnrealProject/Spawners/KOTHSpawnerBase.h new file mode 100644 index 0000000..ac88496 --- /dev/null +++ b/Source/UnrealProject/Spawners/KOTHSpawnerBase.h @@ -0,0 +1,70 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "Spawners/CreatureSpawn.h" +#include "KOTHSpawnerBase.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API AKOTHSpawnerBase : public ACreatureSpawn +{ + GENERATED_BODY() +public: + AKOTHSpawnerBase(const FObjectInitializer& init); + void BeginPlay() override; + void Tick(float DeltaTime) override; + + // Overrided capture camp behaviour + virtual void CaptureCamp(int team) override; + + DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnBeginCapture); + DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnEndCapture, int32, targetTeam); + + UFUNCTION(BlueprintImplementableEvent, Category = "KOTH Spawner") + void OnBeginCaptureCamp(); + UFUNCTION(BlueprintImplementableEvent, Category = "KOTH Spawner") + void OnEndCaptureCamp(int32 targetTeam); + UPROPERTY(BlueprintAssignable) + FOnBeginCapture onBeginCapture; + UPROPERTY(BlueprintAssignable) + FOnEndCapture onEndCapture; + + UFUNCTION(BlueprintCallable, Category = "KOTH Spawner") + bool IsContested(int32 targetTeam) const; + + DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnCampCaptured, int32, targetTeam); + UPROPERTY(BlueprintAssignable, Category = "Game") + FOnCampCaptured onCampCaptured; + + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Capture Particle") + UParticleSystemComponent* captureParticle; + + UPROPERTY(BlueprintReadOnly, Category = "KOTH Spawner Properties") + bool beingCaptured; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "KOTH Spawner Properties") + float captureRadius; + // The duration the camp is captured for + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "KOTH Spawner Properties") + float captureTime; + // The time it takes to capture a camp + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "KOTH Spawner Properties") + float possesionTime; + class AKOTHBossSpawner* bossSpawner; + +protected: + // Handle to start the capture process + void m_OnCampCleared() override; + + // Called when a camp is no longer contested and should be captured by the target team + UFUNCTION(NetMulticast, Reliable) + void m_ExeCaptureCamp(int32 targetTeam); + + float m_captureTimer; + float m_possesionTimer; + int m_currentTeam; + bool m_reset; +}; diff --git a/Source/UnrealProject/Spawners/LobbySpawn.cpp b/Source/UnrealProject/Spawners/LobbySpawn.cpp new file mode 100644 index 0000000..b60a247 --- /dev/null +++ b/Source/UnrealProject/Spawners/LobbySpawn.cpp @@ -0,0 +1,20 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "LobbySpawn.h" + + +ALobbySpawn::ALobbySpawn() +{ + displayMesh = CreateDefaultSubobject(TEXT("Mesh")); + displayMesh->bHiddenInGame = true; + displayMesh->bGenerateOverlapEvents = false; + displayMesh->SetCollisionEnabled(ECollisionEnabled::NoCollision); + displayArrow = CreateDefaultSubobject(TEXT("Arrow")); + assignedTeam = 0; +} + +void ALobbySpawn::BeginPlay() +{ + Super::BeginPlay(); +} \ No newline at end of file diff --git a/Source/UnrealProject/Spawners/LobbySpawn.h b/Source/UnrealProject/Spawners/LobbySpawn.h new file mode 100644 index 0000000..621e115 --- /dev/null +++ b/Source/UnrealProject/Spawners/LobbySpawn.h @@ -0,0 +1,25 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GameFramework/Actor.h" +#include "LobbySpawn.generated.h" + +UCLASS() +class UNREALPROJECT_API ALobbySpawn : public AActor +{ + GENERATED_BODY() + +public: + ALobbySpawn(); + + virtual void BeginPlay() override; + + UPROPERTY(EditAnywhere, Category = "Gamestate Components") + int32 assignedTeam; + + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Display) + class UStaticMeshComponent* displayMesh; + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Display) + class UArrowComponent* displayArrow; +}; diff --git a/Source/UnrealProject/Spawners/PatrolSpawn.cpp b/Source/UnrealProject/Spawners/PatrolSpawn.cpp new file mode 100644 index 0000000..22853d0 --- /dev/null +++ b/Source/UnrealProject/Spawners/PatrolSpawn.cpp @@ -0,0 +1,259 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "PatrolSpawn.h" +#include "NPCBase.h" +#include "DefaultGameMode.h" +#include "NetworkPlayer.h" + +APatrolSpawn::APatrolSpawn() +{ + respawnTime = 5; + m_respawnTimer = 0; + + spawnContinuous = true; +} + +void APatrolSpawn::BeginPlay() +{ + Super::BeginPlay(); + if (Role != ROLE_Authority) + return; + FName name; + + if (aggroRadius < 0) aggroRadius = 0; + if (respawnTime < 0) respawnTime = 0; + + if (spawns.Num() == 0) + { + JWARNING("Empty spawner in scene"); + return; + } + + for (int i = 0; i < controlPoints.Num(); i++) + m_controlPoints.Add(FVector(controlPoints[i].X + this->GetActorLocation().X, controlPoints[i].Y + this->GetActorLocation().Y, this->GetActorLocation().Z)); + + m_controlPointSign = 1; + m_isPulled = false; + + m_currentControlPoint = 0; + m_lastPosition = GetActorLocation(); + + //SpawnMobs(); +} + +void APatrolSpawn::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + +} + +void APatrolSpawn::Tick(float DeltaTime) +{ + Super::Tick(DeltaTime); + + + + if (Role != ROLE_Authority) + return; + + UWorld* const world = GetWorld(); + if (!world) return; + + check(m_mobs.Num() == spawns.Num()); + + m_respawnTimer = m_respawnTimer > 0 ? (m_respawnTimer - DeltaTime) : 0; + if (m_respawnTimer <= 0 && m_mobCount != m_mobs.Num() && spawnContinuous) + m_RespawnMobs(); + if (m_mobs.Num() == 0) + return; + // Respawn the mobs + /* if (spawnContinuous) + m_RespawnMobs();*/ + if (m_controlPoints.Num() <= 0) + { + RWARNING("There are no control points"); + return; + } + + bool anyIdle = false; + for (int32 i = 0; i < spawns.Num(); i++) + { + if (!spawns[i]) + continue; + + if (i == 0 && m_mobs[i] != nullptr) + { + if (m_isPulled == false) + { + RPRINT("testing"); + m_lastPosition = m_mobs[i]->GetActorLocation(); + } + else if (!m_mobs[i]->target) + { + const FVector2D mobPos = FVector2D(m_mobs[i]->GetActorLocation().X, m_mobs[i]->GetActorLocation().Y); + const float distSqr = FVector2D::DistSquared(mobPos, FVector2D(m_lastPosition.X, m_lastPosition.Y)); + if (distSqr < (m_mobs[i]->collisionRadius*m_mobs[i]->collisionRadius)*collisionScaler) + m_isPulled = false; + } + + + // Any of the mobs not doing anything? + const FVector2D mobPos = FVector2D(m_mobs[i]->GetActorLocation().X, m_mobs[i]->GetActorLocation().Y); + const float distSqr = FVector2D::DistSquared(mobPos, FVector2D(m_lastPosition.X, m_lastPosition.Y)); + + ////// Regeneration (hardcoded, remove in future) + if (!m_mobs[i]->target && distSqr < aggroRadius*aggroRadius) + { + anyIdle = true; + } + } + } + + if (m_mobs[0] != nullptr && m_isPulled) + { + m_mobs[0]->SetControlPoint(m_lastPosition); + for (int i = 1; i < m_mobs.Num(); i++) + { + m_mobs[i]->SetControlPoint(m_lastPosition); + } + } + ADefaultGameMode* const mode = Cast(world->GetAuthGameMode()); + if (mode) + { + FVector controlLocation = GetActorLocation(); + // check if there are some controll points + if (m_mobs[0] != nullptr && !m_isPulled) + { + if (FVector2D::DistSquared(FVector2D(m_mobs[0]->GetActorLocation().X, m_mobs[0]->GetActorLocation().Y), FVector2D(m_controlPoints[m_currentControlPoint].X, m_controlPoints[m_currentControlPoint].Y)) < 10000) + { + m_currentControlPoint += m_controlPointSign; + if (m_currentControlPoint >= m_controlPoints.Num() || m_currentControlPoint < 0) + { + m_controlPointSign *= -1; + m_currentControlPoint += m_controlPointSign; + if (isConnected) + { + m_currentControlPoint = 0; + m_controlPointSign *= -1; + } + } + } + // set new control location + controlLocation = m_controlPoints[m_currentControlPoint]; + + m_mobs[0]->SetControlPoint(controlLocation); + if (m_mobs.Num() > 1) + { + + for (int i = 1; i < m_mobs.Num(); i++) + { + m_mobs[i]->SetControlPoint(m_lastPosition); + } + } + } + + if (anyIdle && !m_isPulled) + { + /*// Find the closest player (in aggroRadius) + ANetworkCharacter* closest = nullptr; + float closestDist = BIG_NUMBER; + TArray players = mode->GetPlayers(); + const float aggroSqr = aggroRadius * aggroRadius; + for (int32 i = 0; i < players.Num(); i++) + { + const float distSqr = FVector::DistSquared(m_mobs[0]->GetActorLocation(), players[i]->GetActorLocation()); + if (distSqr < closestDist && distSqr <= aggroSqr) + { + closest = players[i]; + closestDist = distSqr; + } + }*/ + ANetworkPlayer* closest = m_GetClosestPlayer(); + if (closest) + { + // Attack the closest player + for (int32 i = 0; i < spawns.Num(); i++) + { + if (m_mobs[i] == nullptr) + continue; + + m_mobs[i]->target = (closest); + m_isPulled = true; + } + } + } + + } +} + +FVector APatrolSpawn::SpawnResetPosition() +{ + return m_lastPosition; +} + +void APatrolSpawn::SpawnMobs() +{ + m_RespawnMobs(); +} +void APatrolSpawn::m_RespawnMobs() +{ + UWorld* const world = GetWorld(); + if (!world) + return; + for (int32 i = 0; i < m_mobs.Num(); i++) + { + if (!spawns[i]) + continue; + if (m_mobs[i] == nullptr) + { + // Respawn! + FTransform spawnTransform = GetTransform(); + if (hasGeneral) + { + spawnTransform.SetLocation(FVector(formationPoints[i].X, formationPoints[i].Y,0) + GetActorLocation()); + } + else + { + spawnTransform.SetLocation(GetActorLocation() + FVector(0, 0, 120)); + } + spawnTransform.SetRotation(FRotator(GetActorRotation() + FRotator(0, formationRotation[i], 0)).Quaternion()); + ANPCBase* character = world->SpawnActorDeferred(spawns[i], spawnTransform, nullptr, nullptr, ESpawnActorCollisionHandlingMethod()); + character->SetSpawn(this); + character->SetTeam((int32)team); + m_mobs[i] = character; + m_mobCount++; + m_OnMobSpawn(i); + UGameplayStatics::FinishSpawningActor(character, spawnTransform); + character->SpawnDefaultController(); + } + } + + m_respawnTimer = respawnTime; +} +class ANetworkPlayer* APatrolSpawn::m_GetClosestPlayer() +{ + UWorld* const world = GetWorld(); + if (!world) + return nullptr; + ADefaultGameMode* const mode = Cast(world->GetAuthGameMode()); + if (!mode) + return nullptr; + + // Find the closest player (in aggroRadius) + ANetworkPlayer* closest = nullptr; + float closestDist = BIG_NUMBER; + TArray players = mode->GetPlayers(); + const float aggroSqr = aggroRadius * aggroRadius; + for (int32 i = 0; i < players.Num(); i++) + { + const float distSqr = FVector2D::DistSquared(FVector2D(m_mobs[0]->GetActorLocation()), FVector2D(players[i]->GetActorLocation())); + if (distSqr < closestDist && distSqr <= aggroSqr) + { + closest = players[i]; + closestDist = distSqr; + } + } + + return closest; +} \ No newline at end of file diff --git a/Source/UnrealProject/Spawners/PatrolSpawn.h b/Source/UnrealProject/Spawners/PatrolSpawn.h new file mode 100644 index 0000000..856c16d --- /dev/null +++ b/Source/UnrealProject/Spawners/PatrolSpawn.h @@ -0,0 +1,39 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "SpawnerBase.h" +#include "PatrolSpawn.generated.h" + +/** + * + */ +UCLASS() +class UNREALPROJECT_API APatrolSpawn : public ASpawnerBase +{ + GENERATED_BODY() + +public: + APatrolSpawn(); + virtual void BeginPlay() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + virtual void Tick(float DeltaTime) override; + + virtual FVector SpawnResetPosition() override; + UPROPERTY(EditAnywhere) + float respawnTime; + UPROPERTY(EditAnywhere, Category = "Gamestate Components") + bool spawnContinuous; + void SpawnMobs(); + +private: + float m_respawnTimer; + TArray m_controlPoints; + int32 m_controlPointSign; + int32 m_currentControlPoint; + TArray m_respawnTimers; + FVector m_lastPosition; + bool m_isPulled; + void m_RespawnMobs(); + class ANetworkPlayer* m_GetClosestPlayer(); +}; diff --git a/Source/UnrealProject/Spawners/PlayerSpawn.cpp b/Source/UnrealProject/Spawners/PlayerSpawn.cpp new file mode 100644 index 0000000..90f7631 --- /dev/null +++ b/Source/UnrealProject/Spawners/PlayerSpawn.cpp @@ -0,0 +1,26 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "DefaultGameMode.h" +#include "PlayerSpawn.h" + + +APlayerSpawn::APlayerSpawn() +{ + displayMesh = CreateDefaultSubobject(TEXT("Mesh")); + displayMesh->bHiddenInGame = true; + displayMesh->bGenerateOverlapEvents = false; + displayMesh->SetCollisionEnabled(ECollisionEnabled::NoCollision); + displayArrow = CreateDefaultSubobject(TEXT("Arrow")); + assignedTeam = 0; +} + +void APlayerSpawn::BeginPlay() +{ + if (Role != ROLE_Authority) + return; + + ADefaultGameMode* mode = Cast(GetWorld()->GetAuthGameMode()); + if (mode) + mode->RegisterPlayerSpawn(*this); +} \ No newline at end of file diff --git a/Source/UnrealProject/Spawners/PlayerSpawn.h b/Source/UnrealProject/Spawners/PlayerSpawn.h new file mode 100644 index 0000000..f2acb74 --- /dev/null +++ b/Source/UnrealProject/Spawners/PlayerSpawn.h @@ -0,0 +1,25 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GameFramework/Actor.h" +#include "PlayerSpawn.generated.h" + +UCLASS() +class UNREALPROJECT_API APlayerSpawn : public AActor +{ + GENERATED_BODY() + +public: + APlayerSpawn(); + virtual void BeginPlay() override; + + UPROPERTY(EditAnywhere, Category = "Gamestate Components") + int32 assignedTeam; + + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Display) + class UStaticMeshComponent* displayMesh; + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Display) + class UArrowComponent* displayArrow; + +}; diff --git a/Source/UnrealProject/Spawners/SpawnerBase.cpp b/Source/UnrealProject/Spawners/SpawnerBase.cpp new file mode 100644 index 0000000..331820a --- /dev/null +++ b/Source/UnrealProject/Spawners/SpawnerBase.cpp @@ -0,0 +1,476 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" +#include "NetworkSwitchComponent.h" +#include "CreatureSpawnComponent.h" +#include "DefaultGameMode.h" +#include "SpawnerBase.h" +#include "NPCBase.h" +#include "NetworkCharacter.h" +#include "NetworkPlayer.h" +#include "EnemyBase.h" +#include "GeneralEnemy.h" +#include "MiniBossCreature.h" + + +ASpawnerBase::ASpawnerBase() +{ + PrimaryActorTick.bCanEverTick = true; + + USceneComponent* spawnerRoot = CreateDefaultSubobject("Spawner Root"); + RootComponent = spawnerRoot; + + displayMesh = CreateDefaultSubobject(TEXT("Mesh")); + displayMesh->bHiddenInGame = true; + displayMesh->bGenerateOverlapEvents = false; + displayMesh->SetCollisionEnabled(ECollisionEnabled::NoCollision); + displayMesh->AttachTo(RootComponent); + + // Kill particle effect + killParticle = CreateDefaultSubobject(TEXT("Kill Particle1")); + killParticle->AttachTo(RootComponent); + + displayArrow = CreateDefaultSubobject(TEXT("Arrow")); + displayArrow->AttachTo(displayMesh); + + displayDoors = CreateDefaultSubobject(TEXT("Visualizer")); + displayDoors->AttachTo(displayMesh); + + visualizerComponent = CreateDefaultSubobject(TEXT("Control points visualizer")); + + visualizerComponent->AttachTo(displayMesh); + + team = NPCTeam::Team1; + aggroRadius = 800; + deaggroRadius = aggroRadius; + m_mobCount = 0; + formationScale = 1.0f; + formationDistance = 100; + formationRadius = 100; + resetTimer = 30; + dropKeyFragmentIndex = 0; + hasDroppedKey = false; + + bReplicates = true; + bAlwaysRelevant = true; +} + +void ASpawnerBase::BeginPlay() +{ + Super::BeginPlay(); + + TArray test; + GetAttachedActors(test); + for (int i = 0; i < test.Num(); i++) + { + + if (Cast(test[i])) + { + spawns.Add(test[i]->GetClass()); + formationPoints.Add(FVector2D(test[i]->GetActorLocation() - GetActorLocation())); + formationRotation.Add(test[i]->GetActorRotation().Yaw); + //RPRINT("mobs" + spawns[i]->GetName()); + if (Role == ROLE_Authority) + { + Cast(test[i])->UnsetSpawn(); + } + (test[i])->Destroy(); + (test[i]) = nullptr; + } + else + { + SpawnLocation.Add(test[i]); + + } + + } + for (int32 i = 0; i < spawns.Num(); i++) + m_mobs.Add(nullptr); + + m_threatMap.SetNum(m_mobs.Num()); + for (int i = 0; i < spawns.Num(); i++) + { + if (i != 0 && spawns[i]->IsChildOf(AGeneralEnemy::StaticClass())) + { + Swap(spawns[i], spawns[0]); + Swap(formationPoints[i], formationPoints[0]); + Swap(formationRotation[i], formationRotation[0]); + } + } + TArray hitResult; + GetWorld()->LineTraceMultiByChannel(hitResult, GetActorLocation(), GetActorLocation() + GetActorUpVector()*-10000.0f, ECollisionChannel::ECC_WorldStatic, FCollisionQueryParams(FName(L"spawnerPlacementTrace"),true)); + bool hit = false; + float distance = BIG_NUMBER; + FVector impactLocation; + for (int i = 0; i < hitResult.Num(); i++) + { + if (FVector::Dist(FVector(hitResult[i].ImpactPoint), GetActorLocation()) < distance&&FVector(hitResult[i].ImpactPoint)!= GetActorLocation()) + { + distance = FVector::Dist(FVector(hitResult[i].ImpactPoint), GetActorLocation()); + impactLocation = FVector(hitResult[i].ImpactPoint); + hit = true; + } + } + + // Correct spawner position when it can move to the ground below it + if (hit) + { + this->SetActorLocation(FVector(GetActorLocation().X, GetActorLocation().Y, impactLocation.Z)); + } + + for (int i = 0; i < formationPoints.Num(); i++) + { + formationPoints[i] = FVector2D(GetActorRotation().RotateVector(FVector(formationPoints[i].X, formationPoints[i].Y, 0))); + formationPoints[i] *= formationScale; + } + if (spawns.Num() > formationPoints.Num()) + { + int difference = spawns.Num() - formationPoints.Num(); + for (int i = 0; i < difference; i++) + { + formationPoints.Add(FVector2D()); + } + } + if (spawns.Num() > formationRotation.Num()) + { + int difference = spawns.Num() - formationRotation.Num(); + for (int i = 0; i < difference; i++) + { + formationRotation.Add(0); + } + } + +} + +void ASpawnerBase::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + + if (Role != ROLE_Authority) + return; + + for (int32 i = 0; i < m_mobs.Num(); i++) + { + if (m_mobs[i]) + { + m_mobs[i]->UnsetSpawn(); + m_mobs[i] = nullptr; + } + } + formationEnemies.Empty(); + m_nearbyPlayers.clear(); +} + +void ASpawnerBase::Tick(float DeltaTime) +{ + Super::Tick(DeltaTime); +// if (formationEnemies.Num() > spawns.Num()) +// formationEnemies.Empty(); + bool reset = false; + m_resetTimer -= DeltaTime; + if (m_resetTimer <= 0) + { + reset = true; + } + for (int i = 0; i < m_mobs.Num(); i++) + { + if (m_mobs[i] == nullptr) + continue; + if (reset) + { + ForceResetTarget(m_mobs[i]); + } + if (m_mobs[i]->IsA(AEnemyBase::StaticClass())) + { + Cast(m_mobs[i])->hasGeneral = hasGeneral; + } + if (m_mobs[i]->IsA(AGeneralEnemy::StaticClass())) + { + AGeneralEnemy* asGeneral = Cast(m_mobs[i]); + if (formationEnemies != asGeneral->formationEnemies) + { + asGeneral->formationEnemies = formationEnemies; + } + } + } +} + +int32 ASpawnerBase::OnMobDie(class ANPCBase* mob) +{ + check(m_mobCount > 0); + check(Role == ROLE_Authority); + + int32 idx = -1; + for (int32 i = 0; i < spawns.Num(); i++) + { + if (m_mobs[i] == mob) + { + if (m_mobs[i]->IsA(AGeneralEnemy::StaticClass())) + { + formationEnemies.Empty(); + } + if (m_mobs[i]->IsA(AEnemyBase::StaticClass())) + { + AEnemyBase* asEnemyBase = Cast(m_mobs[i]); + if (asEnemyBase->hasGeneral) + formationEnemies.Remove(asEnemyBase); + } + + m_mobCount--; + + if(m_mobCount == 0) + { + OnCampCleared(); + } + + m_mobs[i] = nullptr; + + idx = i; + + m_threatMap[i].clear(); + + break; + } + } + + check(idx >= 0); + return idx; +} + +void ASpawnerBase::OnCampCleared_Implementation() +{ + if(killParticle->Template) + { + killParticle->ResetParticles(); + killParticle->ActivateSystem(); + } + m_OnCampCleared(); +} + +int32 ASpawnerBase::GetAliveMobCount() +{ + return m_mobCount; +} + +FVector ASpawnerBase::SpawnResetPosition() +{ + return GetActorLocation(); +} + +void ASpawnerBase::m_OnPlayerEnterOverlap(class ANetworkCharacter& player) +{ + auto find = m_nearbyPlayers.find(&player); + if (find != m_nearbyPlayers.end()) + return; + + ANetworkPlayer* playerCast = Cast(&player); + if (IsValid(playerCast)) + { + playerCast->AddThreatLevel_Client(threatLevel); + } + + // Player was succesfully added + m_nearbyPlayers.emplace(&player); + + //adding the threat to all mobs + +/* for (int32 i = 0; i < m_mobs.Num(); i++) + { + if (m_mobs[i] == nullptr) + continue; + // auto ret = m_threatMap[i].emplace(&player, 0); + if (!ret.second) + { + FPRINT("failed to add player to creaturemap "); + } + }*/ +} +void ASpawnerBase::m_OnPlayerExitOverlap(class ANetworkCharacter& player) +{ + auto find = m_nearbyPlayers.find(&player); + if (find == m_nearbyPlayers.end()) + { + FERROR("leaving player was not found in the nearbyPlayers"); + return; + } + + ANetworkPlayer* playerCast = Cast(&player); + if (IsValid(playerCast)) + { + playerCast->RemoveThreatLevel_Client(threatLevel); + } + + // Player was succesfully removed + m_nearbyPlayers.erase(find); +} + +class ANetworkPlayer* ASpawnerBase::m_GetBiggestThreat(int32 index) +{ + ANetworkPlayer* ret = nullptr; + int32 biggestThreat = -1; + for (auto cpair : m_threatMap[index]) + { + if (cpair.second > biggestThreat) + { + biggestThreat = cpair.second; + ret = cpair.first; + } + } + return ret; +} +void ASpawnerBase::m_OnMobSpawn(int32 index) +{ + ANPCBase* creature = m_mobs[index]; + if (creature == nullptr) + { + FWARNING("creature is null at spawn"); + return; + } + if (creature->IsA(AGeneralEnemy::StaticClass())) + { + AGeneralEnemy* asGeneral = Cast(creature); + asGeneral->formationPoints = formationPoints; + } + else + { + if (creature->IsA(AEnemyBase::StaticClass())) + formationEnemies.Add(Cast(creature)); + } + m_threatMap[index].clear(); + +/* for (ANetworkPlayer* player : m_nearbyPlayers) + { + auto ret = m_threatMap[index].insert(std::pair(player, 0)); + if (!ret.second) + { + FPRINT("adding failed"); + } + }*/ + + if (creature->IsA(AMiniBossCreature::StaticClass()) && dropKeyFragmentIndex >= keyFragmentMin && dropKeyFragmentIndex <= keyFragmentMax) + Cast(creature)->keyDropped = PlayerKeyType(dropKeyFragmentIndex); +} + +class ANetworkPlayer* ASpawnerBase::GetClosestPlayer() +{ + if (m_nearbyPlayers.empty()) + return nullptr; + UWorld* const world = GetWorld(); + if (!world) + return nullptr; + ADefaultGameMode* const mode = Cast(world->GetAuthGameMode()); + if (!mode) + return nullptr; + + // Find the closest player (in aggroRadius) + ANetworkPlayer* closest = nullptr; + float closestDist = BIG_NUMBER; + const float aggroSqr = aggroRadius * aggroRadius; + for (ANetworkCharacter* character :m_nearbyPlayers) + { + + ANetworkPlayer *player = Cast(character); + if (player) + { + + // ANetworkPlayer* player = Cast(*iter); + const float distSqr = FVector2D::DistSquared(FVector2D(this->GetActorLocation()), FVector2D(player->GetActorLocation())); + if (distSqr < closestDist && distSqr <= aggroSqr) + { + closest = player; + closestDist = distSqr; + } + } + } + + return closest; +} + +void ASpawnerBase::AddThreat(class ANPCBase* creature, class ANetworkPlayer* character, int32 threat) +{ + if (creature == nullptr || creature->IsPendingKill() || character == nullptr || character->IsPendingKill()) + return; + //find the creaturemap + + int32 index = 0; + bool found = false; + for (ANPCBase* mob : m_mobs) + { + if (creature == mob) + { + found = true; + break; + } + index++; + } + if (!found) + { + FERROR("creature not part of threatMap"); + return; + } + + //find the player + map::iterator it = m_threatMap[index].find(character); + + if (it == m_threatMap[index].end()) + { + FERROR("character not part of creatureMap"); + return; + } + it->second += threat; +} + +void ASpawnerBase::GetNewTarget(class ANPCBase* mob) +{ + return; +} +void ASpawnerBase::ForceResetTarget(class ANPCBase* mob) +{ + mob->target = nullptr; +} +void ASpawnerBase::ForceSetTarget(class ANPCBase* mob,class ANetworkPlayer* target) +{ + mob->target = target; +} +void ASpawnerBase::SetTeam(int newTeam) +{ + team = (NPCTeam)newTeam; + + for (int i = 0; i < m_mobs.Num(); i++) + { + if (!IsValid(m_mobs[i])) + continue; + + m_mobs[i]->SetTeam(newTeam); + + if (!m_mobs[i]->target) + continue; + if(m_mobs[i]->target->GetTeam() == newTeam) + m_mobs[i]->target = nullptr; + } +} +void ASpawnerBase::CaptureCamp(int team) +{ + SetTeam(team); +} + +TArray ASpawnerBase::GetNearbyPlayers() +{ + TArray players; + for(ANetworkCharacter* character : m_nearbyPlayers) + { + ANetworkPlayer* player = Cast(character); + if(player) + { + players.Add(player); + } + } + return players; +} + +void ASpawnerBase::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + + DOREPLIFETIME(ASpawnerBase, team); +} \ No newline at end of file diff --git a/Source/UnrealProject/Spawners/SpawnerBase.h b/Source/UnrealProject/Spawners/SpawnerBase.h new file mode 100644 index 0000000..f326fc5 --- /dev/null +++ b/Source/UnrealProject/Spawners/SpawnerBase.h @@ -0,0 +1,126 @@ +// Project Lab - NHTV Igad + +#pragma once + +#include "GameFramework/Actor.h" +#include +#include +using std::unordered_set; +using std::map; +#include "SpawnerBase.generated.h" + +UENUM(BlueprintType) +enum class NPCTeam : uint8 +{ + Team1 = 50, +}; + +UCLASS() +class ASpawnerBase : public AActor +{ + GENERATED_BODY() + +public: + ASpawnerBase(); + + virtual void BeginPlay() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + virtual void Tick(float DeltaTime) override; + virtual void GetNewTarget(class ANPCBase* mob); + UFUNCTION(BlueprintCallable, Category="Capture") + virtual void CaptureCamp(int team); + void ForceSetTarget(class ANPCBase* mob,class ANetworkPlayer* target); + void ForceResetTarget(class ANPCBase* mob); + void SetTeam(int team); + class ANetworkPlayer* GetClosestPlayer(); + // Call when the camp is killed entirely + UFUNCTION(NetMulticast, Reliable) + void OnCampCleared(); + + void AddThreat(class ANPCBase* creature, class ANetworkPlayer* character, int32 threat); + + virtual int32 OnMobDie(class ANPCBase* mob); + + virtual FVector SpawnResetPosition(); + + int32 GetAliveMobCount(); + + // m_nearbyPlayers but as ANetworkPlayer array instead of ANetworkCharacter's + TArray GetNearbyPlayers(); + + UPROPERTY(EditAnywhere) + float aggroRadius; + UPROPERTY(EditAnywhere) + float deaggroRadius; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "FMod") + float threatLevel; + + UPROPERTY(EditAnywhere, Replicated) + NPCTeam team; + + UPROPERTY(EditAnywhere) + FColor debugColorCode; + + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Display) + class UStaticMeshComponent* displayMesh; + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Display) + class UArrowComponent* displayArrow; + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Display) + class UNetworkSwitchComponent* displayDoors; + + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Kill Particle") + UParticleSystemComponent* killParticle; + + UPROPERTY(EditAnywhere, BlueprintReadWrite) + TArray> spawns; + UPROPERTY(EditAnywhere, Category = "Spawn Settings") + float drawingRadius; + UPROPERTY(EditAnywhere, Category = "Spawn Settings") + float collisionScaler; + UPROPERTY(EditAnywhere, Category = "Spawn Settings") + float resetTimer; + UPROPERTY(EditAnywhere, Category = "Spawn Settings") + bool possesable; + UPROPERTY(EditAnywhere, Category = "Spawn Settings") + TArray SpawnLocation; + + bool isConnected; + + UPROPERTY(EditAnywhere, Category = "Switch Components") + class UCreatureSpawnComponent* visualizerComponent; + UPROPERTY(EditAnywhere, Category = "ControlPoints Settings") + TArray controlPoints; + UPROPERTY(EditAnywhere, Category = "Formation Settings") + float formationDistance; + UPROPERTY(EditAnywhere, Category = "Formation Settings") + float formationRadius; + TArray formationPoints; + + TArray formationRotation; + UPROPERTY(EditAnywhere, Category = "Formation Settings") + float formationScale; + TArray formationEnemies; + bool hasGeneral; + + UPROPERTY(EditAnywhere, Category = "Miniboss") + int32 dropKeyFragmentIndex; + bool hasDroppedKey; + TArray m_mobs; +protected: + virtual void m_OnCampCleared() {}; + virtual void m_OnPlayerEnterOverlap(class ANetworkCharacter& player); + virtual void m_OnPlayerExitOverlap(class ANetworkCharacter& player); + class ANetworkPlayer* m_GetBiggestThreat(int32 index); + + + + void m_OnMobSpawn(int32 index); + + int32 m_mobCount; + + unordered_set m_nearbyPlayers; + TArray> m_threatMap; + float m_resetTimer; + //float formationDistance = 0; + //float formationRadius = 0; +}; \ No newline at end of file diff --git a/Source/UnrealProject/UnrealProject.Build.cs b/Source/UnrealProject/UnrealProject.Build.cs new file mode 100644 index 0000000..c733d1b --- /dev/null +++ b/Source/UnrealProject/UnrealProject.Build.cs @@ -0,0 +1,68 @@ +// Project Lab - NHTV Igad + +using UnrealBuildTool; +using System.IO; +using System; + +public class UnrealProject : ModuleRules +{ + private string ModulePath + { + get { return Path.GetDirectoryName(RulesCompiler.GetModuleFilename(this.GetType().Name)); } + } + + private string RootPath + { + get { return Path.GetFullPath(Path.Combine(ModulePath, "..\\..\\")); } + } + private string ThirdPartyPath + { + get { return Path.GetFullPath(Path.Combine(ModulePath, "..\\..\\ThirdParty\\")); } + } + + private string FilterName(string name) + { + return "..\\Source\\UnrealProject\\" + name + "\\"; + } + + public UnrealProject(TargetInfo Target) + { + MinFilesUsingPrecompiledHeaderOverride = 1; + bFasterWithoutUnity = true; + + PublicDependencyModuleNames.AddRange(new string[] { + "Core", "CoreUObject", "Engine", "InputCore", + "UMG", "Slate", "SlateCore", + "OnlineSubsystem", "OnlineSubsystemUtils", + "MoviePlayer", "MediaAssets", "Blutility" }); + + // Add steam, external library and metrics for PC + if(Target.Platform == UnrealTargetPlatform.Win64) + { + // Matchmaking + //PublicIncludePaths.Add(RootPath + "MatchMaking\\"); + //PublicAdditionalLibraries.Add(RootPath + "MatchMaking\\MatchMakingClient_x64_Release.lib"); + + DynamicallyLoadedModuleNames.Add("OnlineSubsystemSteam"); + PublicDependencyModuleNames.Add("Steamworks"); + PrivateDependencyModuleNames.Add("Networking"); + } + + // Add steam, external library and metrics for PC + if (Target.Platform == UnrealTargetPlatform.Mac) + { + DynamicallyLoadedModuleNames.Add("OnlineSubsystemSteam"); + PublicDependencyModuleNames.Add("Steamworks"); + } + DynamicallyLoadedModuleNames.Add("OnlineSubsystemNull"); + + // Fetch all subdirectories, and add them as filters + string[] directories = Directory.GetDirectories(ModuleDirectory, "*", SearchOption.AllDirectories); + for (int i = 0; i < directories.Length; i++) + { + string dir = directories[i]; + string subdir = dir.Substring(ModuleDirectory.Length + 1, dir.Length - ModuleDirectory.Length - 1); + PublicIncludePaths.Add(FilterName(subdir)); + } + } +} diff --git a/Source/UnrealProject/UnrealProject.cpp b/Source/UnrealProject/UnrealProject.cpp new file mode 100644 index 0000000..23c508f --- /dev/null +++ b/Source/UnrealProject/UnrealProject.cpp @@ -0,0 +1,77 @@ +// Project Lab - NHTV Igad + +#include "UnrealProject.h" + + +IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, UnrealProject, "UnrealProject" ); + +DEFINE_LOG_CATEGORY(FRANK); +DEFINE_LOG_CATEGORY(JAN); +DEFINE_LOG_CATEGORY(TED); +DEFINE_LOG_CATEGORY(YOSHI); +DEFINE_LOG_CATEGORY(GUUS); +DEFINE_LOG_CATEGORY(RAUL); + +#include +using namespace std; + +void Output::WriteOut(char name, char type, const string& message) +{ + WriteWOut(wchar_t(name), wchar_t(type), (convert_cstring_type(message.data()))); +} +void Output::WriteWOut(wchar_t name, wchar_t type, const wstring& message) +{ + // Retrieve the line number and file name + wstring content = message; + const size_t end = content.find(L']'); + if (end == wstring::npos) + return; + + wstring path_content = content.substr(0, end + 1); + const size_t seperator = path_content.find_last_of(L':'); + wstring path = path_content.substr(1, seperator - 1); + replace(path.begin(), path.end(), L'\\', L'/'); + const size_t slash = path.find_last_of(L'/'); + if (slash != wstring::npos) path = path.substr(slash + 1, path.size()); + wstring line = path_content.substr(seperator + 1, end - seperator - 1); + + content = L"(" + path + L":" + line + L") " + content.substr(end + 1, content.size()); + + // Log to the proper output + if (type == L'L') + { + switch (name) + { + case L'F': UE_LOG(FRANK, Log, TEXT("%s"), content.data()); break; + case L'J': UE_LOG(JAN, Log, TEXT("%s"), content.data()); break; + case L'T': UE_LOG(TED, Log, TEXT("%s"), content.data()); break; + case L'Y': UE_LOG(YOSHI, Log, TEXT("%s"), content.data()); break; + case L'G': UE_LOG(GUUS, Log, TEXT("%s"), content.data()); break; + case L'R': UE_LOG(RAUL, Log, TEXT("%s"), content.data()); break; + } + } + if (type == L'W') + { + switch (name) + { + case L'F': UE_LOG(FRANK, Warning, TEXT("%s"), content.data()); break; + case L'J': UE_LOG(JAN, Warning, TEXT("%s"), content.data()); break; + case L'T': UE_LOG(TED, Warning, TEXT("%s"), content.data()); break; + case L'Y': UE_LOG(YOSHI, Warning, TEXT("%s"), content.data()); break; + case L'G': UE_LOG(GUUS, Warning, TEXT("%s"), content.data()); break; + case L'R': UE_LOG(RAUL, Warning, TEXT("%s"), content.data()); break; + } + } + if (type == L'E') + { + switch (name) + { + case L'F': UE_LOG(FRANK, Error, TEXT("%s"), content.data()); break; + case L'J': UE_LOG(JAN, Error, TEXT("%s"), content.data()); break; + case L'T': UE_LOG(TED, Error, TEXT("%s"), content.data()); break; + case L'Y': UE_LOG(YOSHI, Error, TEXT("%s"), content.data()); break; + case L'G': UE_LOG(GUUS, Error, TEXT("%s"), content.data()); break; + case L'R': UE_LOG(RAUL, Error, TEXT("%s"), content.data()); break; + } + } +} \ No newline at end of file diff --git a/Source/UnrealProject/UnrealProject.h b/Source/UnrealProject/UnrealProject.h new file mode 100644 index 0000000..ff20fb4 --- /dev/null +++ b/Source/UnrealProject/UnrealProject.h @@ -0,0 +1,73 @@ +// Project Lab - NHTV Igad + +#ifndef __UNREALPROJECT_H__ +#define __UNREALPROJECT_H__ + +#include "EngineMinimal.h" +#include +#include "Metrics.hpp" +#include "Runtime/UMG/Public/UMG.h" +#include "Runtime/UMG/Public/UMGStyle.h" +#include "Runtime/UMG/Public/Slate/SObjectWidget.h" +#include "Runtime/UMG/Public/IUMGModule.h" +#include "Runtime/UMG/Public/Blueprint/UserWidget.h" +#include "UnrealNetwork.h" + +#define PLATFORM_SPECIFIC_WIN (PLATFORM_PS4 + PLATFORM_MAC + PLATFORM_APPLE) + +DECLARE_LOG_CATEGORY_EXTERN(FRANK, Log, All); +DECLARE_LOG_CATEGORY_EXTERN(JAN, Log, All); +DECLARE_LOG_CATEGORY_EXTERN(TED, Log, All); +DECLARE_LOG_CATEGORY_EXTERN(YOSHI, Log, All); +DECLARE_LOG_CATEGORY_EXTERN(GUUS, Log, All); +DECLARE_LOG_CATEGORY_EXTERN(RAUL, Log, All); + +namespace Output +{ + void WriteOut(char name, char type, const std::string& message); + void WriteWOut(wchar_t name, wchar_t type, const std::wstring& message); +} + +#define _WRITE_OUT(name, type, msg) Output::WriteOut(name, type, (std::string() + "[" + __FILE__ + ":" + __LINE__ + "]" + msg)) +#define _WWRITE_OUT(name, type, msg) Output::WriteWOut(name, type, (std::wstring() + L"[" + (convert_cstring_type(__FILE__)) + L":" + __LINE__ + L"]" + msg)) + +#define FPRINT(msg) _WRITE_OUT('F', 'L', msg) +#define FWPRINT(msg) _WWRITE_OUT(L'F', L'L', msg) +#define JPRINT(msg) _WRITE_OUT('J', 'L', msg) +#define JWPRINT(msg) _WWRITE_OUT(L'J', L'L', msg) +#define TPRINT(msg) _WRITE_OUT('T', 'L', msg) +#define TWPRINT(msg) _WWRITE_OUT(L'T', L'L', msg) +#define YPRINT(msg) _WRITE_OUT('Y', 'L', msg) +#define YWPRINT(msg) _WWRITE_OUT(L'Y', L'L', msg) +#define GPRINT(msg) _WRITE_OUT('G', 'L', msg) +#define GWPRINT(msg) _WWRITE_OUT(L'G', L'L', msg) +#define RPRINT(msg) _WRITE_OUT('R', 'L', msg) +#define RWPRINT(msg) _WWRITE_OUT(L'R', L'L', msg) + +#define FWARNING(msg) _WRITE_OUT('F', 'W', msg) +#define FWWARNING(msg) _WWRITE_OUT(L'F', L'W', msg) +#define JWARNING(msg) _WRITE_OUT('J', 'W', msg) +#define JWWARNING(msg) _WWRITE_OUT(L'J', L'W', msg) +#define TWARNING(msg) _WRITE_OUT('T', 'W', msg) +#define TWWARNING(msg) _WWRITE_OUT(L'T', L'W', msg) +#define YWARNING(msg) _WRITE_OUT('Y', 'W', msg) +#define YWWARNING(msg) _WWRITE_OUT(L'Y', L'W', msg) +#define GWARNING(msg) _WRITE_OUT('G', 'W', msg) +#define GWWARNING(msg) _WWRITE_OUT(L'G', L'W', msg) +#define RWARNING(msg) _WRITE_OUT('R', 'W', msg) +#define RWWARNING(msg) _WWRITE_OUT(L'R', L'W', msg) + +#define FERROR(msg) _WRITE_OUT('F', 'E', msg) +#define FWERROR(msg) _WWRITE_OUT(L'F', L'E', msg) +#define JERROR(msg) _WRITE_OUT('J', 'E', msg) +#define JWERROR(msg) _WWRITE_OUT(L'J', L'E', msg) +#define TERROR(msg) _WRITE_OUT('T', 'E', msg) +#define TWERROR(msg) _WWRITE_OUT(L'T', L'E', msg) +#define YERROR(msg) _WRITE_OUT('Y', 'E', msg) +#define YWERROR(msg) _WWRITE_OUT(L'Y', L'E', msg) +#define GERROR(msg) _WRITE_OUT('G', 'E', msg) +#define GWERROR(msg) _WWRITE_OUT(L'G', L'E', msg) +#define RERROR(msg) _WRITE_OUT('R', 'E', msg) +#define RWERROR(msg) _WWRITE_OUT(L'R', L'E', msg) + +#endif diff --git a/Source/UnrealProjectDev.Target.cs b/Source/UnrealProjectDev.Target.cs new file mode 100644 index 0000000..98eb3ca --- /dev/null +++ b/Source/UnrealProjectDev.Target.cs @@ -0,0 +1,22 @@ +// Project Lab - NHTV Igad + +using UnrealBuildTool; +using System.Collections.Generic; + +public class UnrealProjectDevTarget : TargetRules +{ + public UnrealProjectDevTarget(TargetInfo Target) + { + Type = TargetType.Game; + } + + + public override void SetupBinaries( + TargetInfo Target, + ref List OutBuildBinaryConfigurations, + ref List OutExtraModuleNames + ) + { + OutExtraModuleNames.Add("UnrealProject"); + } +} diff --git a/Source/UnrealProjectEditor.Target.cs b/Source/UnrealProjectEditor.Target.cs new file mode 100644 index 0000000..8284f59 --- /dev/null +++ b/Source/UnrealProjectEditor.Target.cs @@ -0,0 +1,25 @@ +// Project Lab - NHTV Igad + +using UnrealBuildTool; +using System.Collections.Generic; + +public class UnrealProjectEditorTarget : TargetRules +{ + public UnrealProjectEditorTarget(TargetInfo Target) + { + Type = TargetType.Editor; + } + + // + // TargetRules interface. + // + + public override void SetupBinaries( + TargetInfo Target, + ref List OutBuildBinaryConfigurations, + ref List OutExtraModuleNames + ) + { + OutExtraModuleNames.Add("UnrealProject"); + } +} diff --git a/UnrealProjectDev.uproject b/UnrealProjectDev.uproject new file mode 100644 index 0000000..c8b8134 --- /dev/null +++ b/UnrealProjectDev.uproject @@ -0,0 +1,29 @@ +{ + "FileVersion": 3, + "EngineAssociation": "4.11", + "Category": "", + "Description": "", + "Modules": [ + { + "Name": "UnrealProject", + "Type": "Runtime", + "LoadingPhase": "Default", + "AdditionalDependencies": [ + "Engine", + "UMG", + "Slate", + "SlateCore", + "CoreUObject", + "SkillTree", + "AIModule" + ] + } + ], + "Plugins": [ + { + "Name": "FMODStudio", + "Enabled": true, + "LoadingPhase": "PreDefault" + } + ] +} \ No newline at end of file diff --git a/cursor.cur b/cursor.cur new file mode 100644 index 0000000000000000000000000000000000000000..89777d690c4b84734c460fff569c2b1cdc1e1428 GIT binary patch literal 4286 zcmcInX-rgC7##sob~LiLETUqOMa5_+ia=s43a!Re?V<%F2&ia^2|;23qk>Tz7Zjx` zDuSSFS`uP4De?ocCPIsdfeNS;3PKCA&dh!9_I$6*WSkTzh&MU&-d)~3_gn8bGMSES zip(IC;q`!v7^pgDu#zUCSXO{nQxTU&pzWy_YXprD{mGc&XAv5PC9 z4-hZu!yEV<_!{^M2m(9-nxk{QOEYwGa{4wlHdcQ0=urkeJk!z93B!iAfY*!}Gm;$~ z94dT#e4Ymc1T-#Py7bw+dGo3;mjiqW%mWO8i8fPrclX47`}Pf9yLOH3+O@0C($exL zLqo#^@cbAW8rqSVn5aB``ZUYP$PkVnKh6#vI;4z>it1moWJ$G&iAe&87XZ^IcmNA8 zFRzRP2M#deKYRA9a_!o+eUSN&ty{MaUc7jbWo2ctt5>h8k)55*Dk>^iNl6K z(V|jte+-P<7hr1_KR>?*r%s&`RQ#7NT@rWh+$keZ`j&z(Cb4C`5d4n)|S2L=X;>({Rr4j(?u zE?l@E>EYhJd#t^^oe{S}pGBT2#IB|k>&Fbpv*x=xx#7+DJ_=4Qg(Xj;F*5l;YMeGM{+O(ew;%D zI3Xe;Lb3zmgB2AOu@^61u+Gj-*4^DLp|`h}J$(3ZVD8+xdBgmaGxPv@j^&Sf$a&v{ zgoN~~Y>#tD`X_FTaoC=(TD3|9g#G*XvomMTFgh#wV{UG)rEtoxfb{^t44QGl1zZEc2o;H|2fBuoUxHu)n^e{I)$rmO46Mt!G zDX*`u=PzHr|iGl;c}kTBQ7Sojz6*U!kKfgl`L{)L``;iD~( zRjH|W%JJ3J)vUk2U+q_#+;s2Y4p6{v+fWZ20XN+}Q^yooYXSH}5W|0J^WVLDmvwY> zNIKW#r2&i!w{G1U!oBc|r>7^?LzHtzif=8(x4Js8Rs8PVySsC8awOYRPRq~Fmva2j z(9m15(>>GF)FeN4>{vT&mX4Y+0K1Kr+ukDkkB+W|g+(gv*Ix29@;S0Wd3m|yQ<`%3 z_4Tnwj~*!z)4wfTxG)LaPS}rf{JS(GTU*;K)EZLVMY2P$tg*3C@@o};Pfri!`QB~Y zwv}61S%rd-^2tQ>t$kKg)OW?Gd*tN%qyxyvNLJ#e1|Jh}@3tUEWWrYN*nsNq$!ZSJ zGu&}<-0^Lw`%=K;1-z?| zjdt8mH*enDgqlW4H5Kkn0d>}WC;S(|M-4#R@Cv? zvu4er|5+xZeK%Qi@aK>X8#dGzP1LXh! literal 0 HcmV?d00001

  • w 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%0AmsOL0j#RZVoHW)xdH-!xe};pJx9!eu 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 f2QyPggw<(Q=Ht1cCE!@GA5!+cdoqk@5=lXpm1 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

    waGMQ`UtK{?CRvKtmNeE=d|4Lyj}lJ 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℞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 z zLHloHr}Gv-y(`Wh!k%%wgRA4$n`{b&uzB?~In(gSt5^c$)DQSxv@~k_R%_Odz3R?q z->(JQ@otBUaA(RUi*9_r$S$RMPDMmOsu}9 zuPqQTbK4t;8RUBl$wtVTcDsv#4QmOLJ=DMFW;KH8Ba9RMpd0BzM$@+)Cl^UnBEBdh z@zbaj`L9QtpS?wEJ?;PL-b=+)01P`U^7_3D&wV=O%O$JgS+n2pP*-L4&=^JF4JXJ4b)?D@#^TMTk-`l%YcnLLv1yAlbNe?lb zSzB9!n+U)?KXsk%3Qxvs=<&4cSst24tChJLsAc)!PQq7PunZBO>oj(M*rkty<=$wX zELS%~sp;Hw(Nd5Y3257!NM}H^H^Zk2?H2g0+sV~_{L+=|yHS>{I3u_fJM-AyAZ+WA?Zocdnj2PjBo^(+v%R5QoV^2}NHRLY8lJkDM+v z1-QCzwTaAF3}UgIwIgz_zMPB(QNc>Gn$+L#A7v8!|1<0mv#H%NwINC-cpMj zM;nOSMm`$f&NUS_y1ymr!w$uSjN9uZ7lWtVTlC%#bYQ#0T_zR={GvXlS=(wfnr0(x zW0txD(fL>GDMbtaxTIR|v!1V4cwp-Ls0wLF;?cQ-FuJ~Y5*~!nW2VNfOnxhzVM~J3 zKL_ro1QDJK9)5T%vp9fxA{~&EksL^YvXm1qrq!;A~J*;=dI|2@;)(&ozZVF)^mf&TuHyFD*-_jRat(^IzTHAZObw2XlF z@!0U%V$gNf5D;EfC>eP2oS&*-{vP(tIIa_mn|)6oeYV7oPvt%dXihV~Z2w++RK$tA zgNS9iG}erma%WCZ$X}3xl-qgnbSQyu_%a&pyQ1xyXgBK96``SW-U!W3?^{mMTgEXM z6_w$-c48Kp{|RQvq;^hmhRt09;__>B&^~+wuAKhS`o_^c&CV!e$OoZ_{%Uze77M+rDeK0tdCk!$KUhI z62e8I8nkS=VI&|9NyoqVkYDP~FKp_H4c~DUUB6^g>km-fPBqj4;*4qvDnH@f+YI$h zn5Bb$Td#NngDdmiEnPAtwGe9irzTRius9DpFgRSFzX$7hdiOjxg%|(?e!qT1Pzj=` zARxM|ZBFMp8wYzF9862+nKFfv3Nx;jucr^?UG4@UvzzBH}XkBJ2RjX`lOa zFTJcpP=#Ct!CxL%0NPnDeMX1PTfrwB7vp}g$_AgRnuEh$u>L-n(~s|i_YIek8oZ;6 zcypR%U)`I2yp8wXhlezqO;t&sF0dN-#Rw+)ENtViDs-3RHE<4n%%0AF+&zwX@oaP? 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 z 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 Iw+m0;dV=VI&2grF`I%4RzqgTi@LpEpe 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≀03*xc<%&txI{0! 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

    g$&x{RoG~ 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Ƌ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�C&`!=uYkuX2yS%wYALF=GAJf(}{Eky92Y^0YcD3=J)!zIS{mz?;r{@p(wP3OeZ;Be!&aSA z@4J2-SthId4ywxfSZc6-)aRW)PeA?z;>7mjoQ>qKJA4QHXN?H$GYMFqV$MJ7PsMm| z*FL9#Yt8fs(wWU}sFG~Id7d3{oFtt#b7A!s1;``y&L1}m#vi|F(pAI1`u6X^E?yCS z1$Y_&T@tm=N9vHWmRV@rUvi$fzJ2`tM50j5i+6wtE&(=C^tAgm80w1MGL(rw{4zpG z|9-UqlbEutHzMp7r&=zpx@9muD54;k1RoYaLYxvy;=BQugvjI+R`oDw+-mJ2w)Xz* zwGu~s55Eu(@SVrU2@l2rJ?QiyD+3n?U*mjwpZhSBhqQVMcb1nZjXR7NVtVF>)YIfH zp+XVlUch4Fy!|XDq_a@V0+D zB$s(Kqc1v(Mh9xD!Ma3yk0<5f8oAWU{LB9y9f)c1+cT?aYv7!@W16^cbr3$2<&Phk z4`PXml5RAyz*bBprSo2NRAY7nfxD+Z5&?vm`WQ01{|1^iAPm7S?Odldi0JYdt=s=zPL49KA zWlg%DR}JU|>X+m2)_jQ9`X?w8z9VZC6wOspgC&USqaO%(1+|J-} zI{b41zG=g+c~Wx`L<))~SfU?f=bz0txz9ve)&)(gUQVYHccen#`;=&q7Gy>#3siHX z1zONF8@yI{@=0l3eJJ*se!7o5t99>U%(Oj`HaO@l9k2rjSs5GRMG!79z*AM72=nve zr(UOfZZ4r|w$o*-!FM>IW+X_4o`8Eh$4h%hY-v0{Z^+$dTXOT?SBtlD{xSy(M_TG# z)-Tl1;H9(YWQDr%nW|hiviOrk8O*TswIj`=V70m`yi{bzJPW4R^bic~$GW3dLRZ>pP-k@_;q`JlPZ^G$Cx3aDrWd>E0+0P!M}AvG?Fq`sD#s*b#X7 zrs@ZziGMiu1T_Vtr=}(;jL-Cs435_R(t!AH=6F~gMsly%`czD!yF27lA_8wKi-t&V zf{ph&q(7Dgle!4?mDQ6#!IW z;UVb5E)feU(HM=rGUHVkggR@)a3A|h^>Em(^y6sZ2<#V04>TI_>Z0$_K&QN zz_7e)7D7h<_Fw;W=KCfU<~t*$&`=`q6Q5MX8D+`gIU%57BKPh8W1^oCbgDLdsnjZ- z_3xAVnkiM%f{Eeg|7)Mo1LN^#uJlmQrs^N2juH_gEmcg+;k#MU|SUazMXjYgU8FGAQ7bd54az=ht?PUhfCmomR&w*$+}!_}Vv>#ujpE-P0-c zVQe>nVWz8b?EEDI?V6_&@8rub9l#c=707DK%dRQPdji(Q)C9F2Px|Pv zVK*K+M2Q4-USc|n3Zpr44`L#^$kCz5V2ymnV;L*qjupgG-j7tDZ#|_nF{Gj`r7>lF7!my=a(ghsFRuNOYONW}~_ zU-1zLy)2LUhJ4=o0{(S;f~#!XG@NzI_&AqcZ;6}{HY`O4tWUcC@a#jH?emH)EktZH zxM503qtTCoSOrNUsc5W^=iLWtmCCnjYtf~=d`n8?5J7l}K-5Ut7iY8bbqJJBsl9vjUR+h~ z*@#nTHpjnfv4)$bCp#pmjo!vOgyQz7=apt>q9ouT8(o}?_a!!k5^0yVlg`d$XSVs^ zRgG|a>xkbvmS$>8?6C$$MQ6LNVpU-le->f)Z0;l}{>IJrNT7cWN8Rn2@+6q~|K|U9 zCCiVIW`bXaZ3I0E@B4=ql4`{FcTquE;EU8>lS2Eid#(*IJy)vxIB=6Zo{@Oy&4=p!x$E4KAZy`GmNDF~t-dWIp) z5(Ll6d?MlH4$6Je<#Zs8Z3?p*xCMzL7TRouB$PgWERCmUeQf-stIJ z@;Hb9uozmAI@MV2>vGnyXYyw8_s*w9{9H(D#98LKG-KhivxS&kk&}Ndu|Pf8-gsPL z9JYr%9kHVPVrE!H-fG!8K#oZ~dAu5qP_EB}E(ZC-P|Q)-W|t!f(T5S7Jvdv=&EK0l zKwX)<8J!6^6y|m#z7;%3h%|zv?$LPZp5(4(@!bS|g_o2Djf6lJmvfYhqrJ&kmzwX{ z_B*$HTj?yi-qyUtRF~X0oF-m3(}gm^)MD|?MB$tGUT|K?Wc}A(qb4jp=0mct4$V>_ za*g0jcQw5WoFtFa%YEUz8Y}i*(GZPp1+)Wyd)z%$pye#;X!8g<%k3-c9L_n6e6$qQFC=Y zhK!+J3otyfL2R6cVjmep*fpKBqIRyDnp)lBQ{y>3-+ijOUg*dZDs}?_fqk~RGKW6i z-)Hm?!Lc&OyBF#uT1|^w!9#eBLT%?r@eZ(Q?pyTU`P7so)9{SS-v&4~CUm(ZIoR4`e^9^=}BZ#StmLN zexiZ$09u?`OW;Qt%rvHXV}*bSw~H*q3wh1!T+*JV7&#=t+c5iTjSL*pW_>T`dqVCa z?-^o|K16d47bRD@(GZSf+Z~9O24(N*#Fj~SP>{0CDlOWWYTs%DPfZt$h?wP<7E=*U zXy%}+A*k$oK=T0NLdRGFs6O_VV`Mkbai=i$gM_Q}otbjxbGDH%OC-++H$y^h*MBrA zJw@_SR4ZrFyMM+lP}!EfRbDG7tWd_vt2&|KSJ309YWX)WU&#oZ+w|bv;msRQguZ@i zuO)b0o4yJrU|Mugw+<+!wB^EF?YrmsmVJ>|7;~qJY%eW&kHpKKmZCD`vgQiZaj4Uz z9ARgE1onZ0no-Cmc2)qFt&ojEYprjGfhUHW8uyh^C4@XY$dDN%V1rP7FW^4&3=+HAr!`IMEU{n%A>rZb==GQCC!N}wY zy^^4^c0O^%tdh24K=QdSO*uEiR0((Lk4hkpShFF{qa8Nxk>kK<1li&45I^h37U{Y2 z@aF1?dJerzGt*(6-zo4=%ujIkK)pt=aeEbFXE| z>d7c$iR^C{`C8FbEx8QYhhAY~yGs|eHtaghK1+uGq_Z1aPEmYPw+Euqo@#Z~l3z!U)v911L z@<`KFY3*kx?K*Q|dQKI5&CfXA!ND_=u~QP#rT$_q(}FN>+O$P{xur6E#Lk4t-_)A4 z0>&GoM#L_@MiS{;T%#HC%dO%dOmVo!;HM6E{ng_VwFp&=q~%o}v#v`}^I{;zsM~3L zhuz#S-y8KHcezS_r76Sv=O{+!E~4IjHU^j+HYTqimypmJBdB#MJSFO;^}b@-;Nq0g zHXpsl+O^6`B&RuVI&Vk7&tI8OhvG+-L|9|54KKG_1`NEVVfB)4SNI+||J1!ZUZZ;3 zv{>i#pVR|s@}7!jZ2O}`z)r$jmHC!HJNXHB@90ACU+}_v<59R&E+C!Fw-z(x>N!vz z1F=su+O=6poC-yZQU2mYE=-3mQt8=xOn;E@W;Yn+m(x_idZ-$ zpc^pM#c3ayg$TH$BsSVJinmrOfV9Upf-iZw^|I6gTVD}ooqq!hRlaF#avw98XkGe} zW(W~BJVb_gAxxS=6T4Z5H8OrHZ+0whMGT{T+=<7h6CllL%Uf_2AxfdmRAm+6H8nV% zMhU88p&806>GS_|;12SZ2(q>HZ7eitw!Za%OgSdG&9exgk2Zb=vm6EzrD_NV*UKIe ztZHT?|NmDJ%Cb^0lqOSvF)*jcQ!^IrAfpZ=w1UUp`XY8QjIbXZ0L@#|{&Iq7+ECtG z)aRq9-}=?;50x_fEF~xlmg15l6_pJb^kq{HPc)R_jr-IlgsGpxF|K!YHTm#;u{R7Q z5vtc<6C!9$%^bh^oMZW0z$O&g>Cgjr7>h}`3-gkLCd}0JwT_MP!6>y|*OoSCq?P3E z>*68RS&>0D{cq}Te12(i0F{L?rp=Ir3$|O0XI|H1d#}qY*WeM*cii^$Tn6+$!IqvY z<*1IBjV7{6B7T1p*zF@j;hOH5$Z~t3KERsf-6eV3*aWCMr|Th^+6pv*ktA{Bo_JR= zB4a-<&^Ln(?=$EsgNt*y z$N;?J(Y&OA@mu^OR20@B*e8AXEwj{xjjn^-Zp>O(R9@vFml5hSpZs}{VVl>PC@DL% z3XfbxGNMEng9sW{MBa<^*E)9ZLRTqao8o*YR*Nv9=7GKT|CELwKM}C1^6@`CJ^`wajp#qPui8AU)K|Bd zTG|o94A?JD^L3SvL3H>^y+uaxXFp?@a`hNFNT+*?mG0T~wQ7rN5q8i4o(q&^7SV{3 zoG2nV?|6BamQYP&m!C1SrPsinyQx`Xl3v_2F-D4DwI^@Wc?mfoE_#{YU@4tI%=MBD zGPA`tQPIe-pkS5=Ry*hG-T5#N@T!i9wg_I$9O6wm&*J8F$fFpPmYEto^Cuwuyap%7 zy;Kp;)keArHo>l@XLW73DmN0>Vw&w`Vk= zhEL*!g}ecoB0)VY`M~m4npJom{hD9z>(jR4GHPynk>38lqeUs zAE`1v?$NO3;MbiRfSX66cl8m;?)FGWd3CjXnm-@Eu$S@pvBy1TGDW-WLVnU#ag>^# z6oK#MD>qz7EQh3^fKf1e9pp?IzVsaiq{cmkfk8oijWt|+z~rFN6U`1TI14m!XxMXj zZq1>vys^fo<%P2525I^20Qf{byjy696Wj4RzWyf8<1^>6aWO0YY_{soKHA?q4!(ci z-V@M8Tgj~TOcHgL$dSF3Ko~<^IRHpE@VSY*%c@jdp9KGs|U%TOprDv_&~Eq3%~;@r_52v7-Z!YGKFr zSmgsgMFu4_@Zg+|4!+t~VplobX%6W5xor3N6d|DpvdLAgrXw8s%+{XfGWZA+;~w9a zOnX}J)xdabhdaR;+-z_>w^cha-lZYv;uSL!nZ~=FH)TfUb8D4Gimiup_N_yW)%Bs` zHS@ZG31-BBaWWqrNydx9X(hM$z+qGA>GQ460{2_YUTH|zH%{rPHww+Yw5>~)I)P1_Iqol3b7X^nxV3YLF`2k(fd+p!+$h2i+`=j^`gj>gh7_0 zJp&rKg&eVmfLTWQlhx8DJ%#S@x@7OM0-@q<0dQCNnc+u3VSy|O_P+2^N zPfPiy>uuB;dKOAqp^l5^x0o>CyDoXdRZgEGdW$3QJ?*NU*y4mSJX2mnFg@iF=)G+`$c!c#@r$1lzh7 z!qi9Ypq_$pn}0TbGsrpsO5l0Y>f!Zo1mW;|Q-_Jge;HQUXq@k~Q8^rPW$ za8{;HYOL4R!u}to?p@i9S7}`{Hf2VS(4Hrro8ZJrwna^n4Ew!dpZpAnu>E7veG> zm}2C|Jx@a(cJgzw2!-eI%%43ayl1@u<{GH~jQYX!Nc9j=|A?$7WxK_DtvJU%&NH4nhbou=G_8p~G^i9cS*F3W+ z6xbOuR#@Tu_PmG91GD+qy_{RmB(d@%@kG(Ac}z_b^zr(ubh**^fLZ#Q&YE+Z=J)Q? zozPp4+Sh8-QK=|2r25O;{HiELm`YtOr+~^CEy27OZsR+u>gf9+c!U6HOgkbt zV5xZaPV3_Bbh%ZREjO0-2uOjq7=#;SQUHjm;NgysE@1p}lJ&eHNFA*I(OU33?i|Ch zdOgbYxN$LU&pq%yTBJWQBY$9I>^iQ0SG$&3q9>~BHJg}|hk8~6yGNwOsAVrY28Fp= zaKXnbTBJ^f9Dl@ku|C{Q6dz*XvNNBVWLI`XzBhH*k0Kf{I6q8fg4l<$VVjlqHzAGp z)zIAIo^!b8*JJxCkN9O#CZcFW0KvRn2v0YnEjpXcw=@H8a z9YXm{p1R--pGFxhj0gIgl~a>@5&R09+;IKL$4y6l%r>1rSHtgH_lIVCcUszf-!|%S2fts=9~R+k0^)Rr%g~k9-_v zsaEwQ4SV5;p=vNb0A7nnVJaW(=k#Ni?pF>9<4#|iC$5#K_7!pB@LXHj$_qz7w3FR6kbx-7b=wWd z&k$#_Y6>4)tSnhuW`K)RS~9vuU3B{8g5p`Zs|}2Tbt<&3D$aFKDyjq+)DCr|v__k3 zC~T9uo2B!8bj5y_e>3BxKOgUWRg*R=>%p*)h7@$2_Ss=+6}6Ch=AR-e;><4fmk-~D zZB|pM6Q3YgrfRv+v5=(2XKQ#O^xyFdG5RLzJl5`li=zNOA=rW?B6JV`tI8r#`NY$UN=mvAb=h1L`~5P zx;={X3^u?<iW_au7&lJn~t?2(GoV(zV}j2&nH^M?>2eTp7C9?n{u8# zI8ED;Uuglf^1YSol;l5ImWR_Pt`}^k47VG%=DWjJkeS+d&lEC*K>g5&(WGsiS8fYT zie;nB$;_JVB>4Z?N=9&s`OX7DIO9RKb%#*9+q%HXuf2rzq=jR6pQDp~ z9Mr3#t?lG&pe`y>jg@^HOTeA?mf> zWKv$sZL-@-U#FXOKxCOp@PG-Hg&QHPK8ZCN;dpmO9ZU(l9$Z%F)`=HoVRLn+y-|Lp z#e_15^`X}PiS zVyP!17nPygw_aX{GBxz-%ca~wz3%%i;xlriR%~mWw5>a}pknglht}I7bWd`d5JRrx zh-fTNZT~Ky=`HjN$}PgJr!mGaWeQM3n7<&QZ9_mBtm*W zm$Z1{6XlE1)XrLLa)acZWg$n%)oTmC)Y+fb#~?-qQj_>T+*7e--3k(9@ZYb*7!hsq2z0p`$5P0nEBXz+I?Wfl#y z`zv;RU_`O*lf$I--s?&DGnuhyk{We}DJVqw2{-KiNl-P|$X!f-+3ly$_ZIuE%Oriu zJ`(~{I9bN(PJ$7n3{gS^2wr248N0!9DbYT_h;J9}bvzVj~0m1Vv@bte*i7o!B(|(?mrxZWVRv!ra>1%$ydqc%*M_pO%PL8VBVn$^3 zOcx8WWpp@ls}Seche5Vrix#nL?Ss&n@R= zSKa})eL4bcVCQaZyljbh_TY?ra*Z~Y*bYpCo(|2rw_+|Z=NhR>crCjq?+m;b+_S?b z<1FTqUxsV!2JsMxRNkK~@>tBfkf~75M|uz^N^C?-{z`#wk$u)PoH%sR5)@>zV^tyV zPL^kuxxb*`mNLgoNjy8!s7e~dL?f!F<t^Oj#kI*uV z+x&nYv4)|WMS`jx_A!tB27VU*2VDdoE%xJhdk1yd#zY%xg}d83;TDyVvoyp{?(4D3 zu#jebqXZ<;%T(0vT?;)az_Ro0JDAK391f3*yr|JV^X$q%n!NPGGztVd$c%#rsj5H< z__51csss5;7Fy(e;WRUn2D+NKU^oK8A%my1C~g^qrMks{LDb$>51xZOrB$+4<+)9} z3d%0~{{0-U8T&?>=1!s~rdNDHVsXU0XFw2;KR?#IA99KGgXh?Lm30XheWfY$8!f`aRg2@*LEPEXD#KWA@c-R*XY~Z&LRibO4m$?aafw>K~7gZHr?|Ir}koOV@mlaD!OUNqPipF6NhR;$jph`V!pWoYBko_-n_MaC+!$(u7JvF3CHX}y=b3$rFLu?fc5rng~yo&}7 zA@!g4x(}a@(+aLon}Q=&Gu#KA^1!+dGmLyr0nNWeEFFZB(6&JoQYuJf!-w{u`fZ8u z#)V|QXyN6I@=fT2QBO&pkO%N?>JdoXeub^pi_C_-EA>IuYvB`Ln05s!Rkzv-g%4EH zK=%Bg7kJ+IXh}(^o3aENRmAEJgWvdFjtsIPK*$xoI2?TO5)z|JrfZpz$uPJYN=Uj!?U*bho{r!pd}f%*aORpM-B4JYl@ zbSmM&sFrpp*9rY~x?Vv2zMV%HoXboX(ANl9&eO7K@U4I#=MxWj-{3Pz0F zqOSCpJnrlALhBs(1LHO(NS2938QyT-Du_3zPeuI`KH_VBW_cRL-j0qhtGu~to}F@) z%fyGKf#HLVVL>MN}_vX=6+ER9Z2tKj;GP-NoxobOYbUq=0qJv>{^ zLh;4botjpbt4e1uNO+`O_hg!)Vcs}21`8K4FOT!>x?u-V&-unH@c(=j1SN)|+BccDed_e09D~w12qHv?XkJ)$AXxA}_Xp1X z8KgdRT?*e6-vdQ=4tLk{hcGXJ#1XGgnv~3L2hrBJu`kc)oGf7PjuIn)70FCSC>rhI z`s+3NanWZh*PQEG9(=%b*s)W4Ak{0)G(oc`K|vF{)B@ zt${^P6}H$r6=8i_w*Ll8{9)$&FVZ2vrYFkw}8F_PSG}5fHijI1q#m_ViDIZgVd*5el?D`B>(j_1G z-ICY!>qI;HFkJcU8Ef%G42h7C>B`1VRd(#B_qDr`B-oJA(ms4|yw3D%_C1(6dK!dZP{=go9UNt!bEWUc?_(thdo*)YRjxXE5&oO+d20 z;apzSHKO$R-RS#ch-ipZJ~1J4p85XbK?Js*F{EL?Pw&OS6m21;@PwxLrwa?@$p`9E zHA6WY!os(4G?w~+)u;^Y@Mi`*}RSbUUBk4 z&PGp0Cj&p9q=`jDeEFKwagqPB93x?z88c?QE2NVQTgH(5a?L`dH+0T6$u}qFL-@;^ zHtUt4q0t}UZ+H!L*ZO7|o=v10nk6>l&kIygqw%J;t67-+)F3_>G`7(euRYHi9^J_K zv!U4=ipH_ruD*L<zRBN6RSabSuTCYe+i<2T6 zcR}p%gV=A%sjw^oY|`iJn$$82^3a8YLwjrN&X8M#=8?at`4vUF$&~#_uo!wv6&pMk zbO}Bts!Rk>q5EpP{8UMb`0)pn@T`vsDf@Hq@W=@Xke&6pDEu&J6451f9%&tm*WuW1 zc%tf?t&JPiBUeI2$y7~etXK_(atCH$c}+RxxJLhVNmPV8M{pY|nWfQ-?T08ijcx}$ z2Jd8dElR{m!BI~uh_ue|#H&VqlYl2Me!RbxHJPi{AE42=m3O|x+fev~r(H-b;Kw&V zH3w2~wUAy|8ODF|Fx&3jDD~1jR%ti&s_s^Z#4cDhcxrC5IfN}Nz@xQzxD}xHGaDYM zcbW!Ok?b*oOj6J&=_Fj41e@otF{*Fh61<`sQY4lGU@lD;_Z6lE!e)DFB|ZGqxFnVs9RMd^4sOVG=K9>gk0Y z<@MCI1$w=s z8^CyLilZxHTzQ^h9mX+Ap7SrYRR-fy7R}lQFvG1o$D+}#;yz7(tbrCSLw5+mr?SG& z!q!q{lt9N75pYghC2+qi08=~osz9BZSQLTzy%M5pl_W*^Nj4);lqpE9X7wy?ZP$p$ zRHL1CS139BW}28S-pbr<{BZtSVeL&>m&V}#i51>`f{B(Nrc+yTu<#ly@TLl6*br|4 zEnC@}iv(Jqnz4RNS#Uhr{L%%mGNe{E)r%;Dx$DQ^+v9!l;rHR%l zln3}!Gt?L*gr)qbg}Qh};WG;#p?&_8i=JcjSr%p2*#t*wUFa#Ou{Xsm2#^x^^zIlR zDM>>h;D)Y>c~hj?sZ&3GeK{R?Akj0cG53C_o+NBCu_Q1@;+O>!mO=FGo*3yR30MG% zj;S_`L+?U+L#zDbKJ#M{&p=8D;AQ)?$~74MBgfCb_sRV$_B@AaNECwVl@G#!L(SY$ z)0e2rl=#R`=m;?dmt#;;ga$?Pg4#_tJnZ9&+OdPz@`&0kMpChztq>#v3S^QQ#K=f0 zik@q@b)UgWM!QhTr@(i!m=0Zlz}u-m%K@lLK4nTXBQu8mMQ|b22HW;w9XoH77*m&R zjLY-L4Bfl7Pf@8BU>3)bXdy}{04+4{~PCNj+rGH1UJ+_ zR<27Utv0(~ZF(U=FCq*omuK+bMQYHJnZ>IWK&*Y;7H$Q~P0O~FTCnf;m63W~_Ys+T zFF$w@911K*Vj%h2)SQhTu+^FbP`WiLKD;@G%wfe5Q5>Ke?y?SsaZn&E9+IB$%9sKA zRQkf39#ZzrqJ!UNyw3(&Xu~h64k&%nD9=ij;TcMe*%lmQNl5cWrREs|>n|G}&cKc& z9IZM`Q$?H=B&*+ulpd4xN@s6L+2m(=KK)r$20yf0M#uVsEE%DJmVk7gu7G>$oUHpm z(vL;lOptT}->_PM?_)11#SFf5mw4Kr%Q8EtNBRA zNZirQ3u4zBD66j_?js|Czb`3qWM}rn1kM+G%`nY%vf%r)$-Dx!v@1sx8POQhZX<=% z(xTp1)|J{HuL(Ppm`X!(4S+5oN zlx8Vno~W+n)Gn&+Ks0GP{W?Orq~w;cvi5>j)K8rG>v#;7ULh<)#7{;tV*B7KjKvb? z!n-KvLfxLSZ^ER5##ie84mb&lBN^y8dWz(0v@OD)JT#Z4gg;(z)MCRf1f*H34#z%H z0+GXmYYo3wouJip13R7Zb+Z{G z>XvyS@U~!fID+fktbQ_HQ*bK;=sGI^X!>00qbq(wz%|%6s8k3k2I_- z%oL}TW>!uCIKEoQ3&SCma0Efk6agMb2M!CaD1DP-=VQ00Ju+g*Gu2OMe(YR32U5@KZsY0aLVsARhfz z%|43N-72d3MJf=hxQfa{d0b<~H?Mf82}$9wdfNrSKl!3Bz?eRQekfJi#A@)3iS?GH z$fS8cHbLH65(|Aa#Y_srunmr*`d1UMCRK8dmBfQ3B|$W*-x7R_PFR=5=`tIHYQhWp zyWEE`9I;&;{KyW^D*nf2av6BViyU|Q0Ifjnn1v|Xi>^v%y(6YcfJ5$cwiyXH=NEOum8$6qS_qa1__(moEK}-748bo!NcUK6|Z64Q2SM%;rSMJC{Vu zW^WR<$4}HW4cNUXNXAR$ot{n`Q;fiUoyg`0)~jmgF#l73hi9m2u{UImgxy4a&5ZT7 zix>{^(WA%@pr8qlb`*|}M3|H^9OvQwO~D@stRb@e`O;pbbG7Q6N!=zn7C z25#wME1&hNuK~V0beusWC%lWgl_%H{bO~Pt{p@fil}Gb8*NBCn!Rg`GqDxan`f{nA zN-fYqQCq~0ZUrc_**B~ zCsV+a+7g}#Q01sJH}!Dii#1fl3R|&saF9h)$f$F6(d><9Q&n{nf@@LIcY)Eq252F) z`iZ)Qnxdi1#Y&i*B*-aR6CW+1o71VxCu;tA9L*e?t+g zo_0&~{$bZl8O-2fEMwb} zi{x$sHZ2MnxTpkSO8vxiSoF^c3O#*8l?l@y9w9`p5f;iK+osSXt~%}l+kXKLv!nzB zwjgjGUTz0ffs2AX*;Og}w@StISuwSd2)XSL1RLlCIm|+|)8{u(ZJ1KE_u5T940b3a zWDmB3=7n@62F3UTTYvi}M6LfdEL!*4QEPD0!xv{C|NdjVU|$~ZLNm~4@OxRKnaI<^ zDz@d{U3L2mP*mgO9m3$V=%jOSLFAg0W0Zw=pT9*e>uhqAA`UA>s!7bZwBxKLh%UNl z|LHKp60OOT9w3;5GXNK8}!I*j)}Iuk1{7^mZl zuNAkY0lLXA4mS~*IU<~`3XzvvVJ0RI-5Nk4 zFdvh;+E76df$yA@XYezW61=i$Ruzok(+(mz? z>W&f*F~TZfQPG_z9hQU#mPhCC>_zPMH=70^Nycm; zj2% z3MX2v8x_fDpbE2S;F%OkfH?O9ilfMunOGMxV{Rp}EMV0|jjI_?rW|w;nVr8_=+PaM zgi(lSNfceFGW9Y7bdF6nhDxOn%-|JwLau!PNLi+txSRR=sEJZ&v(jTpBZJq8S*lP& zLXRl2Ac`$#U5m@rkj7+KF29=i5Y`|V-wUN32AQ{kY-CAwUVp_`Nr>D8C=3qoF6!FB z_9LbG(QJGC0N03o43CL}t}PC%U79q&z|QRH43K zUc5r|6ErMrlo)1kz(7>(YZ$h!Gkdk`!r(LGCC2cUhGl*bbK%zD?=u#NYodFHuO8Fz zf%;J}YmpKIC4iu>G2MA3&ov0{;YQYgZ16)WrlsT7=4XdWq(H;4hd=V92}PIUPc$~r!Q?|=4H$?ZLjkx zO1}ILE)uOVtTgCl{S>+>wQSiJ!Lvuv^yO$O;@1QM2A%A(OqvY?*uC{+&kfVXR_dSd z2N5c+Nn)f}n*7gecF=@rjj(4ggWBnKXo6$$i95#Lk;tD(hZLCxCWngbz2kQ+>k>tL z)igNHC2<%7MZW7snmUTGvJU`Z8S}{?iDkc?(LEfiykPDOk`GXcFlJL(Z}O{ z9#7(#&5qAIHO`H!MX>M>pVhP38npr5!H}6(KH|nkYAE={`@PdREAHJPE|6yb_^3*h zuT5P%>BE_fLo}8EyEBwOM^#LL+t?o>_rB-f^z5LqOfT!UgFG>Hf@&NQ&I7vHP1-WlY1sY9S+V|JobVZ2j>W9HZ=I2l;mYNkTO#pfbV zsP=_i?~55Epaj6-0xqdqcCSvX#l+`q7uz!8=E;J3&a$=|c=zLpc{7qCq{B_Tuw98S z2QmcXy`M7FgsE62Z7b>a((iI-E`(aCYB}GtZ(EJ4wuzopUzD_$PA&wmaYJVvG|3Rq zt>5b5dMcV_sxR}>W^;Cy6J9^V+&0e!eMHqAmR@P3xS2pdfHRQft(&-PVDWud3K{++ z_Dowbr?~wh9qXidl&cokf}4(dse<2fUnGBB#qABi#HDM$h}~&@mzE4Fu{m)7FYx2H z>BGd-gP66pBw{KEe5}!&)Sj`Oo7I!jbspIs8;NJ;L4;!21xeUn6giL>*tK{=#;ZWf zVfZjx)s&gO8MYl}{zv0)M9EQjIl}jNGyDP+5Y{8fqoUrApHe$0r#ZD#Z{577{BF8V zYvP_i_O4d1H>H0gd*O(Q;PPY6nyHkD*@RN$Q6uk?%CSrit@84q6Hp;GTWI{dj2Q+U zKJi1T^ntj6f~RCek8A#vHI6ZDc{MQLG2)B+&oc^}^I2^GiLBObweP z$94fuOYg^e%yZNz5%N&hA_#XF&-UUI8|Q`tSQWP2G z{otsGa_~5$`+%cu^$i}Ze-KQT=&D)I^RXKk8W*_wkqzw9CC{tM_hR(d;<{0EbH4Yp zrH1WF!MFz}%yz=nj=K19i?$A&htF6p#TMDO4Rd<%_h23Vr$YyGQ7hu!POI1AR$bxD z6?+_oM{!*wrdEf>ksSvJZlX8Omaay6p-PYi->5RK?1hGAj9_%<=GdcnKQG)wh^qzv z&V>t1(TMOdEA5=q*~T5OPgc3rOIU@R_39F$CZwxhFm!m3pY3JC)*6y(!GW(Pj-Ga2 z)^1n#21Te3p-8v2hG2dnlZzF*(7g=A_GO$`#VEZ>WcaS4>gHtvrl(JES|iGDGmW;m zDs5Ip=hR|~dXG5yO-#-k4bOeP)mKcjFUhKa35%oUI8Q8lAKy4xp(AVphabW=Jvky4miU zk>>5j0G=oP3ymeE`+oZ=x*O{tm*;g^u87y&S8HpJYhA@2v zcO2N_=RH%9`K@FP>U_Wugy9|z1UM~x}+3^yucsGTeMVP0Q>QODH7Mm^8X-4UIfWL1Cj$F0i)tD}y@=dbK#+X;dnim3T-$-NX3GLQ~=PhONM<{stZJKPJRxt{F>eg=TDE_;r)sk zYO(A~e*P2N3_2!W`4mJKM4gk+=N^55Fn4Gur z)2xp@$)0*)3?#q9i}xl`B1@?66&ub~zm?AMuj}QWhy|K{h7^fqq^`|v-@@E|PIM&cxGYyW+=1>MwHXCGhZGr92&+UN-BFr{jr}R-!>)VVW!gx`Kbuo-J!(MxAWh zX-#^tGL6<;nS|U>{3w14B5QSrL{eDsQ&ycie%1o!!enkNT#pih29rIaF!{`aOzI@R zt)P4{Z_ZSOKhiE?pAY3y3M7kMyy~)#_p0C@=n>|2g@%#AiW-$(N9qY2Rk=n2Ci#mW zru8vL8)9l+KY+|TOuAc_k$Jek?{3yjo#1VsKdR^e?ta%MGOd$+jzadypHXx4`z?Ld z=0M-C;!jlZJoY*?V^N!s4S3m@_3qR6Y7M z9c#6zX>1oB!~ZirLY?`(57^9Xs0ODf4wqrh8m0&*r!AQ@U}sSjrX?hkCcL*sAJfi-o;DHQ1BsQ4 z>&IyKfY#dl*N3_!@U&vlxXHLVjaOGdv@62cL($Y=?Q;_eygFEsx$4Jmdh=trC3lMx zOf+X?uO3u=TE02qenl|_E*NFE!XG_}h}%ehU*D3;LyB}<>&t?7DVv^a$!Y==?2D$` zRBhG@Uj|-DpF5TmM{}s2c^Io^-okb^RaO3*Dm$u)Rk>h5py}_ zd9v`iIK5sz{iprdg+GM<3<|fA7E@9k6N8sHW?P22F|&61C@^Z!uTBj_?k%rN9+;uo zYgdM+cJ@Zt4IK%1oYoUSWrJ+4f&+Y+?5$@94$QjL*O#x)#grM@>|g4x(Ai=AJ3NTz z_Y>h^snOw8QJ9$`((?>{G;P`kg`xxmOXGZ`mGY$~8AZcsoYu4>n}W~ehVL<2RhWdq zPfZUMv-H7{#I9$Yx|1XK?*&N3FxggcN^x+e3-Y4Hy`_6lwI#$JxN2;fl8n!`{Ofx@ zchYe#?^kreUO1mVUYBo>i};b;Z-1}Nla^T4Bws6rL(yCx$I%->EwY?y76Cbx52H%0 zd4v}ZUD2iMIpj|$?geIJ&eI1MU6dF{ZZ|8WwRB< zGbs@sb^|e=(+*tAoD9-R(g%tw89<#Xtdkxmv}!VvuJ5YPV#Y1N0VNLG(~wk@6m{4S zi;HZZ)dn|~EmnZO03?zyfSD7zp>AUyaxO#1zeqVB)<|RWL##H(3@tr)>G(`4IR@_g zv1&?>@!lrLYe)3zGk7>+2a6@$5dz&N_@D%=i|jUif(et|#Zq5pbxYmJ>sXI^C4 zfZBFgl})>k7HB`;>7i-K#xpSWF{&OXF+4aSj_Pg_nziO9dhT&d<3sXxBKV?b>nV;D zU0!M{g)QKAo;Z0^lG4Llrc4?3hd3E#vj?P`Q#_+lBT~~%=mQ2D3xWjNg8x_@z$A6i zMC}HFp4JJPbE7BG&&G~dPncWHd^>1mcMvu2ON1n3XkSv4bxA+@i`;I!$CcJDq;6)x zK84#RaZ%fztySYm8UbUyreRNv-$X}k@5=VXk8+Tpms6MJFBZL$9kLne<%=}hv(>K8 zJ_{QY1#pOaD001`M%hDdEahAx(X zum5yAmK?FQmXD(Gi~Jkl&wOyz=7d44+d4N zksB4{R7Mt@DFF{gEYL>mc&bKV8EP-y@AX378$bdj(72B{dGMuq!7A6&r%f7ZOxuF> z=*v>T3hwH2{lbESqwnWARus96lK=1>!|{AnY%81Q}Ox8&7>S=FVKZa ziVRK&2aTCj}L{|jb;@hIEnc@l5|w0nGQO_g9=!HSqpN3KbixE0)wgn z@|KoD;&>FQuDnu_`XTtPY@XsE{X&Ye$!UKXz1!*7+M|WHe(-^P{J~0^Tk0n(%gk>0 ze>0s;_zsNvi9aOD=5sbmxtJp_TB{Npb1dyNlzxjvfcSuoD{)E}pq`2`h#|Cjemr;z zCd@TajNwwcTAviMun97eQpDP(i72p=jb18T1qC2dGeKl>ij+t`rYvcYKS^D# zC_#v8yq4q}ixJ?5ZuzlFB|8;G73nkw)4|G0qP``F?U>};t=G_4qlMC5ZXKzF7CctD zng9cI(x}#bH6{ItnJi6CU_9uLYDcPYU~-oBtE01AFE}QwgEecTep~o*gyy6>0Kd*1 zjIft-E&ags{HkVwOwgO6{W5knLLPe$-!WpY25{Z5@*{R?b(AMSb4rzIQNvfy(cZ4c zly)A9#s#AjpdBA8I0&q06TunvARp6u$h(paYGd)Q5rCfBvX$)ha}3TAa zXXPOmi>rS_W%~XHzXms9r4p-pMrGLN385BxvC)$5YiwX5doDCH$?z)1eIIlq-`*{- z<-S^u8K*i`0&oI*$uc0NrV2Ap#wTkTs;H8AsZGLd);0^dJ}b|0NKYjo2{y3|u7PIs zwg9o&`MN|TEtypH<~Rbcv=~sNC5l3vcd*RJ5X#?qS6BZxIQ_J0b*vy~uoN5@Ly>3L z-9y!F-G~u%E+O3^B%H0dwLvC|>C6!_1pYdcyz)TRTCiw2Q0rHIGd1ctk-9QyLCMKB za~63db%9W*r`GHkKi5>HkEbhuS?4x&!^doCdL40EY+b_D9#_+&a@71t{RskyK{etf zAvLNpxvnTmc=IT#!`6t)XI4aCR^DKO;?XVBcB6KKEGWAikl7g?z)Fq@na5zhQin5 zqWjeXRXThJLC4}07DSU*L;uVEGFi&;P>Q=Hw|`C8!2j!qzIQMB=YVMets6Eu!gofH zQB%~Z9gT5xAsF55$5QL?jV#&9$%5;fnt$tM5n$z>kB8lyBn8cG+Fu*xU5_j7N@g(Q z>!cOMHN<3KcKI2$vYVb5z4QJTEPe$%k)l)(M}uV7p+=oj!imjU@eyhEam;}I4SO+r z@s>1cJS-dqf($A;P!*QIAKaF>@;H!-J-R?jeMSsj*!@BY$7BGIbtKt8%&Y{kBucU1 zPJb!h>Y7ymc|)Q=2JPuUZR`*O?)^k~uXqrkG*r4tj}@*|gm0$Sv#h{C@i4F|lUU8< zpWlxypUARY+0CmN#Pg5;v6aW{kK(e&c~fY--6wRocq+5b+TPAc^jB2(3;9t|$BDpm zl$U8di@jx$gGG474As^7Q3TLx6?Hh?k-T{y8oh23(5}E3XGJFl&RGTq{A!g0Dl2MC z1y#a`D8w%ny&e_9OytVgx#@)jtPB7G1X~TF5NQod50f>PWm-luf_E-?Gfq*N^^>Pa z_fZJ*mE<)-j_*kQ%P!Gn9Tp*^Z2Z=68k0(Pjmzm2fS8Beqx_LwTSZdei&sXf%?t++ zL8jnI$hxK>e3jaZ=X4>1B{jn1YrX)LxGmwVd{any_~XpgT`csWdvXd&_^{Q@IE=}n z#gHxEKVx@|E$;xxW;GC^vQr=WDJS9fvlu6FA-bXYx5T-|t&V#$Bl;MsF8gE=f^&qN4qVE>qEoy|fz8tR5R zmR3)oEGLJih5g)UhD>ht4hgx#WG=ajtQn^f0Yk9ks4yVIspjPzC9vqtbdN!_yG zf0`GEtO*(0sTPXyJ7nqT;>r2Y*)nr;q?#&H;&AHfmA`K<-*8Qv1qs{tu(u(qCg8Sd zF*NN*-1wlRZ++$MDtP=N3w7MZK=P@?3hc4-(+E^(fo5gNXWE{*Jf(JXkvurP4&6Dn zvfC#CJ9zEnuqd|e$-{oFUH5~Ewn#CBZ+9qUMxzqN52K%x`|=Ed)r&+i zpJTNuRhT)yP~iedaLQDVvbnOi!BRZu?t&Zj|FFwX!s`gvyzSmfvKKFE(F5d9MjPhk z5li?M#vFh52eDa7;}sUy*#;`OShBHHq$Xl5hJcNFI|_0FUzafD;3k|iZx8abF-&zN z?81xAUbx!25D~T4&|Y)kM{o5f17Eyf9J8_4`RDuN8ZLlP3d*K_F|8S+QL&0~!e84W z_!OaF;dA2-!=lWa)o|7_;)$Xg84@U{rz8z;6Or!>9^^$FHcViu*6abgs{6&fF{cnd-BrT+AMe(N-?Z{MBNf?H1+^HzvUk3pYqYZYnDn?p<%<;hEXEQ#*Hb!)_c8cb|nl z{%-E9YgDL;`OGG~coKV9oC78GuIy^-&@Kg95PFh?VA599v!m=Bjx-Y1S4TOaEn&*8 zmQn0m=twzx;cHJJ7p4=bk`lfZ8=lmL&Y(AV+zV`=1nj`z?N?;{FxS^o4P+M$g7WO{ z4A31tL)8R83n$Qw=TLfaSo2Cfym2LQLme-LmL0++1C7u`uoANQy$!-lCy_|&k==}V zE+1bw6pLo2DCyNs{yaBkS&O5`J{Y}SSPEpv7_)b9(NL1wn1sjo^fYD&q8LW8&qteT zOEAl2vmhQg*5@eRT>@^XksYPn_2cwFe*OKUm_s66Ya7K-#Es+f^4PNjBIqB!wMRjq zugw`5E9)r?!aMZL!w=1HPDM%R$lFA zq^+sT#DdZe)7SjK)Ku!lbIjj!ubNmC0ym47D+14y<`>c=I`*&-%O$5d1`4Ldv3VF5 zI746)qu-Tq&x7Nzcc=j_(a7v9o(2in7d)2;wCYW4se;U*$QX=~DTZu_AxPQQNrV8x z_d8?SIZmKq5YuYP?3 zPzVWSW9;{?75x%8zF-qURS`kb|Clv1>xf>`5ekLc@lJdG_F&uz-X3|YNkR#qE4sHg zQWdh~J@dcqB*^KczE&z}(MJVDn$mDqDaL$+QnjzPD)K~X_HSEQ97GS?r3H)6QA(){ zb4$x+^elVTe0_)deqc;o678rwPAj!BwnVT_&~`=~D;*m2-0bs9*gU>L7lA$Bha%KxR0-S9PH(Y(LaPv+6~Wu{?-_B&t=PuK6~V zG@mg_<&tVH;2VvVi~>_uQ2hTT%CPf67afSe^nglb#(ar>M@Bd_6(T+1`FhUM(Bnqon!f*5NkGLcD?N{UKycB7KUUZSOy4pFj~ zBD}-1oN@q8w(!LWxpbb&Zw9{s`v0rb5jM+KDTE3V%!JskVnL8|QLdp%V2f$cs`Uet z2x9Caqsr$nPyrILWVgZ38cV25&S~MzBR*+7(*fKSCWBc-S|59JVh9@>TtE(8WILl7 zfnk!hcOxbSuRFO;=FeaGOizyD(`K!uV~O1q^>>jWCdK=eT%C-U5Dp~^3XyjLg}{)3 z^#lcA2;$Z~GUS8a)Z15ckbGOh$^r&msdp=cZ`sC1Mkbq>zR*(RPT8$6+-TNT% z09kAQ&Rq?@BcR&nRm^ylz$BqCeLF7sVe=-By~J2L650qeOio*_ct_XLynyLQ9kCH1 ztFLhg7db25Oo+-6jI0T&lwg(uD%Z{12*IaIs^U$rPn!_Kf{s`zodl1k%?=c~SbTYv zOmMFtNKdpfN^vxu9-vwOx z>UyIIM*g(?DG~|+`U9nM3iD&=VB%O-N|OXc0RGr#PqR7I$7o0@7n@- zC8ycnHg!P`GCc_av?4o$@v?sAVcy$S;G_9?Pu0s^Z9UN74mjc zuIsWBnPD!fH;$g9+R&L=@74r=u;!be$RH_qHC%{e?&*|`34x&mVGNi(b{{uLrvBDt z4ZuMq?8Y-&6qlg!ko^poK|xjqS34DimaG`rlJFw6%u{h<^d$SR|IN^Rv#T7~+>6`t z0dj1DRyZCUXsk}K`t2NnS|FxNzQjFFoCj{O)lqt=cOn5YTAHy`0T5#PYg`qrxi~aC zSD(ch*o^^JXjbUo+Jl+&ws#(eNv2MVrZ%@pzTxZ>6gidpxr|B4wKwQNufK=j1xkvq zAxZn{lkT(SoA@LUZmL2F-Zdo0d*SU1@gth|P2ASvv7NUY#+Mq&ytWB2z`7N9QjftW5`!N5FL@wm6nRr8vo%bDiR{`;W|UT!y^iw2(pbgTFrfW#jmrT?JUv zF8l_n7Z(Pf7dT<4;ybx4anp4Uf2hKo3rd0VIFzv9^DN?UM7mwIRKnbLZhbth>}07n zWJ@x8##V4CQykku<6}WKOAm#?Iy#Y?kZVI$vODv7T*<}z>@Se<)Z#`B{(MR}`pf1960+mpv<`13!;jCnZeAx%`wXL?c-l_iz28(V%Rmt`|aVcM2FWl%@T*7tQ!GWw}aY_$SP?%~x^x`cED z09=h@QoK->LGCT4paLLE0bFmUl6}-XpK|oAiR~R77Lo_Y==gn)p5OZ;A*39prZE43kF z9VoSa$6*6G_@Vk=gku4=6EzX%|;A}+=$&1O_To7E#2DmIDabgv(5J1JqYJ84ma z3Csz~Hj=FVjEVq&JWuH>np;nf!tv{?Y8g}>zGd10)(Em9rTNpE0bqpnhT8o`&9jm%m&NE zvjB?G-B_d$!`fh4<=Y~o8`Mw)89+js#d-;VyHO0m0_XneJM~G{ZY&;#CzZPhwJZG< z$V>u&TP08&7})uqD4i4;AQiJoiNgA*DkJZ@NDB$&!tXx)tS$4^kI?|+l5jX>{)(Xx zv3SL_9?i2|6PD_Ov)cH0J^>7?brFFhO8e#D54THX5LU0$sxV~G6UkN(QfN~;d^j6f zL7H)=7M-d-l+|JuN;5-R!x%!Gdg!o=jH?>z2VDdI<>s6*z>xzkpB87SY?nDz;9ifB zAIBG~z1nKuF^(nsV*eh176xNRUaMbk+V)g^{COJxB(ZRGF?UHGgNrp1!u1<1f0{Hr z`9D8jcxli$KV7sFDRVV|IPcBV9s|NP52D@P{B|INFD48KGc4)v)c?34xz}^f?dy}> z4wJx*{n;ddEmFRtG41(q+=$_;0>du+?c|SOk=t1T(q(@tsAheyYoWrtJ7=d6Ln>Gq z$Rg$;b-BP(;=WJEkB~O+sI!EM>RZR_Bjh(#mR?ODD>9D84R}+lQvpQX@C&esCYlw> zXW-J+>~XzHu!e&sr_O~h2t(k29rL?Yi3pM?S1%1QzYwh0LmUD*g$^@(>0{+XW-7#3 z=M^I=futurQ>FX8Qntg7J--5@IhRZ~o2MR zow+(Wu`1hF*ZX7jODhW7WT+2P-358k(fn9@O&$DyIz3n~IALc>v)r+G+rlYi1bJ)b zpoTM7=LiS;8pcLM6R$`{2wjceRR9u^PVZxRSzv4v8*XE@Yw_e`MhBxny%$~APEgj? zR{fRH4C9Q|O?tNQ7Y%OqD$z|nM8m;R@fi8uQcT|{%*+NgF3Sb;Tl^xHtP1D8+LZa! z8jw&95pwI(64mhpn<>%Hf2~Cy)0c`X7O&D?}*L5?aSgYD!5NMOy>hOttey~4H(baVkbP6VFXobB+aGT3#SMPf_3 z5;>lL7&N`E#!S5)nep82r@A!ZbY13heMM5uWu;go78x8XYIsW?zXCd-`_t;7IKO^j z$~o7Uf;Li>XF_2MRoW|Rsv(Rmx6W+>wsQE-T-H85YN-{ibFAI=jY>^&wEXU8bM9ng zwpG^9a?sObj7wb#vWV5~s<~J+!U1%_h%1H~HQJD0KjHUcm<@VKl+t`n80G`Xdzvv} zWe3tJ$OXQk9PI5h7#1e#IhK4&a{nivL86dgkA8nwk0c5jO+#em--=aF0i{^S$Apm- z8`fuP(-5rmtR4hBR;;2w<- zM`}-SVP2!5y2Z~V!lN~t)NfQ^WCC|xR;{Ibtr31voRQ)*8CVwbT$8+s`+I~_bfv~c zsvZeXam>b6z2h475!rLizBv+)1``G4U23lvbv%*ku z988M$-cMZ_b%ehag|On!#daQn*b&;Kx33kti&gVAaMFWPZTW0k{T9&9-H0GM#B& zF{8eqe-Z@1F{fVlL_a&pRIaAh4>gSWeO<;y)2}2_G?v#Y`zuku6;L@#ED;YV4f;y7 zF6tZ>yHR@oB`UT)l1(jQh$G07<#aE&Py?xBPwj-V+K9dU2!d!DKo=2|L7rBN+Sa&R z!{cGCD^YA1ic%w>Pj8GiQeRo#p7@@oJ7M0my8t;r#=pnlEP;umI+e3YyC&%S27J?QhVlEk)~@ zW9=el*zA4alQCawegzt^L}ai=d;kbEEA-{ToLQ=)k)AAbdxhtu*rk*yK9Yp!#TP-I zx=L7l-h`^8#{DqCXJY!*HIuH`@Fax9|Hi0yPa z)-Tsi3Q>?sy$%}znaAAYDG6%h&JO`$yJVjfnNL$@WOnN3{96(^hgK@@>@$^d}uj;(3^bL=t_b`3AAS zaNx3IK^PN+!at(I1+CIq#!${t#f!9No{`b2*b0=N3@5`)Xp=05gWZ3Pg{5-F->!hU zJwBd87x#7P^e@<@u@_O=AbH+erYG?9p=hb93Qo!Cm%B-wlJ~_|fTa64HzRR0{6ebX zC)Y))xf#P!$lmFaI?oTM-_@-moc?P*jV{q1x90{F1n1%JU>USQa3DB(BxPJ8k%d&@ zqb!awRU-@|A8p9vE`{2FcfC?P8a!q4#0`sx4zbT8i1E3R_7nP>bq4BPcaIca8i1v! z+Ut$@WDGWyG?q*_zI5DkrIGJEI7!>JoXaaXBvqk%hx*xOF6VxvUMI?f)rSYr6+Mkj zNA|Uf-R9kL;xZiT$MI7Rr+XP=`)X(LZ)(0_SZHP`BSs#zL~eoc%1d~;krH#=DIs%gA1y9Y)AN?=E8Zx~5`s02)lXO&HlU8WFhVGA7Lo0tAW=qO>FW*lV|$34rD$20vpTVK_-@|?3(X0pLkCOshXDcuX@Iyu>2>2A zNt7t;`wVMYtR|c#9ULcMBS{2>>IBRl#~!N6q@e*}<}&dSujLi(_F z%V$?mVCg75wHO|;45j*ow;h1M5q98Z#Xc|l#|!>sF9TO{3O-bvid#z*N1)t_SD zW_~YS$OtOo>&qjgjq9#afv+=i)GNW?H(d@@QrkQx?65^e(4@^!7Efg7%p0SdSQ)Eq zor=Yakr!1YZt(E-iXT^V2td&VuH~wWkpb^ zzel2?TTafmIp`TN1H6GEI$~|dPc}%47`hd04V7nBzFTrn0Z2+Ph&WGd%B9C3^99X6S!#Proo>F08d)hm7=O#u}wr-gyU(j)}hr+VX90X zBz1*E01z0Dic0$dQbBpqZ$|+a@}M5O%^>g+!GAzUWNQE*YQ8UJ*C(nJ#k6w;K9zza z+XBbHvy5S!Wbb2raqkcIv{ieEIPB|AmmI6+AG^M{Xdm*~J`wRZ%OCQ$BuCaMms{wo zxAN;X7RErVqiqFz3EXGsh^GYAwbNazOLd1RhKd)aq(;_T34JBwVY&VsGqky#S4f-(ET$_CV5vXl}dTI@F8ChHEyTr z*{{+gh*Km(V`Q9<#Babf z#n>w$2-uiq^w?-ScdZ!=b3iWci~!(sBWl_HT~}f?I+nb=I}9ix z%uF9lm`~b7z8^e!HD#I>tR102`t6^Jt^#gu z0E;hfH^i#ay`0ds8?lnwTgO?p*yf&-5JfsJ^p`q%@dSs)!|>w4i2x3-I5POBEw?1^ zlv@;zY!x(-XQ$Y$#3<>T)qxu3w0+RmK2*NYzD+2MfwEDW1F^U|E%w#7V-ZROkxDm> zo9m;0`y+|3-&*jZjwuCB#3)>$P^#4mZFY|u9Vp4CH(n9O1q1kbH zZ(8UBVI`E_OnA$74Yr{$-WF{jnA@!-N6~?2nP~Gbwzi!RcgNe>$ko%+v??TE&8xf+=?*s7 zuk~i9n$r05O*>o^PSCJH4TxV^rzb>`m{Ci!EH&mS9L$Y}jVfM;{2Kdr_hs>Zq;2qv z8|0zKU6d|u_R>wKi!wngKu(o=yRgIMeY>Q}HF1qPzK5ZwB#L1`-pegfS=*sc(c3xs zNKQe`SE+(!27q#qkmh?IZMY}NKvj^o*{;V}v*caKnM=f@RxVo=oq`GCsJk?tsa-B1 z+$S_PABESCiT8WS`ime-xMdj2DNe09&W;TYIW4u03bTu1< zjd4+C5Pu$wFNq*-iiU!Sh~yqpGv9m(&_{qiAW>wk#JT4F6?H5ydDNbfwYHQv=IgXn z9&AIj1f+kqHO`TMFpjq)x+O{0qrzP~0$t#DU~=RfIz}0)lOHmL&Y=&%Pf5uo&)g31 z=o}iY($5rJM84%O>p_+SGT`du8Q>|-GqtGKE-qCU)daMGrKU(8rMe`mJp(_^Z3aR; zd^A|UP5Z>JpkQ~kdsMa@G^*=JA||8Xd19C*?e~M;87JMX@SPtn(-9}FU_9V%c&A4m z6aqV1PXT0Es{4{Mb`pUdQx9Q~GXw5>wi69Xy=@cZoKR_5m2oEO*^S`!MIaB-0~I3= zyV(U0L13n=cSaX>Sq1F!Zmnx{Omc^>FXZ;PkB$=}AjOZZ)Lu|wcXHG^tqb)4pyWA|q5 zijHT$3^94NhTWf}6DUu936Lo0u1dt$_i(hqTnGlXb=RWcD_`ZUm%a zyAy>-G+0hKf4W-2r$@{7tay#(%i82In!3p`s)dp+KvpA4LZcc;o0wWg(zjkdfU4(e z4(r~tx=n`v7MYzzgngz7SA+p|D}X3ixJ?TFw_j_>h4l0weRepMAjFJOCu@L9_x{lVq zMF&eMo?wLxjyPdK7*!{n5PGq^%3IXFdWF4)5B_4UAw_SLl`QjSJq_ zy`0F=dm^%HcveG7ebjY!bkfi+vDn4zpeiJRN3S+9@9GIyj9YF!G?cnCb#u2%QaSf@ zK$A~f(h5_~5=O^ED!_zQpRVBf=1!=iFW!V2&=uX6>xgXYpFCh=={sz23QU*~x8K|D zckVSfTHmvfu@p(#O<9;f9ukx3q(Z5CV$j#Z7ag!{3Y-&?eP*xTZ9a?2ri|rkg~2au zd4x?(XkfLQ2>P?@*c~*a zWt2GfBT1|0QLMfcTEi0p9H+N!h3)Rp51&uP=dM!XR>z~%I9oBX`$Q~|hz4$|pFF&tkPTWb`0>DCOafp5UdUbuj0>8iPFCd@mNLr!V zVQAi_rt~7h$y(|zRn1YB6|W+c1O0786sH_aNTH>{_)!(Q3b{#Tt`Qc#zvhO9CozXc zuhNibzT?=&8^zy+_iLo+V47jo#uIGa?1Y`t(O%F_e9^76PU?|SBPMocWPF=1T8m~u zFLLRJZqcfDOD?`Boy+7%2)SbH?>dyDCMw4taKS#YBk$NHwj?J3?cG%L?04sBX~R2; zn85v;aEim{y;}av(yi96nQX|HzKuyatYhmoS)z4xl{oqby3)KTWjPj~*W->OfgN3x zXm4tnSH5J;HJ!lY&)K@o*d&E^)LZoZtOABc=MVorc+GX!cf`UoxzY z{JWk$h1+w!8!J_J=aq>?i|1+{pRb>By|b&=)x5==c4WWx1d90}_D1d1WU9)?l*s9l z%}`V#U$Mny2|1?KH(^c~IFjA77B85OMlyLA(wZU^&Z`xRLWS5zV;&m$q&?D`Sb8AU zpXKaNVoDxs2KcQ)lgqY3t;k+3d=1r}D!Vy^?~uLMO+<|HVV_=``v-QX5*j^gSP6U0 zJ+)Y_-g!80f(URCO5J!O9H%|g$L}4MB1;hCS!lY-}-W!k)%k%?Ksc%6bO zv%`GgY)>t0vXn-&nFgdR8M4ttV99jxoeJLV_S^*z=)Nv(|Mu`9VEr&o)X`hxHOABq z?aEAUr{wphTv4;4^}tEp$_?gUXSCeG!xuaf)CJUWuW6jrX-Zl!e9yt57416OFltTA zNVfD4LpRp?%sVg|bIZc1ADEpc+cvz{2w%r{sOfG7ERPxNjiYCDIW`~YLQ1%o`IWc0 zPtG}Q-bHyU_fMj9@oJ;I?`o8i0X3BOw9zk8mm!aZ>Z%c8 zJ!s4>wUiaC2f`c_Sy%DmmlY{3%=QYsGWTm2hg9Q9oakN7Bla2}mY@Dr+tPk86p^Ov zMpA1?<&Ww5!tkcw#urErI|Lv&(;=LZI?g>Z!rR!ZP}i9}7F90?(LYn+esd22HU%$s z#b$zVE^RQ)k=?wwVV_dPw7{xxX*h9y_oL6%7tR1hhISHIt8sXzXuxlL83-I%usgtTKhYk&>C z|IFiddVO}Iyr>z%W=||0*0vGlS?dxVSKf7+~xKBafDW7bpMt| zIbo+swn}?43VcR=xyghwnMQm?kt%tL%x$?A2ZIf3y!@AK%~(kzrxOaxS2QcapD zfwJpay|1g$`4};tZ9imJB(;gwbQhCf+9LRnS$4=Gg{nJ#tv1xheLwmfN1Ls*hl@qy zs|e80*+;=ehnAOEqm%N{RS>0xCK1hKSk})+PV34mOcaR`_eHlwisp+RI_&vpn%9U5 zgd!Lk)@kTds+lUSYw*3FGkGr?BGSz0>D<(}ts^q+68}h)vvsXa3HgN)?UpK1xQPg2 z^je64#|hq%4jX?LCw?)dc?_Wyx@Mydmtsf}yCf&&bek_JG|LXm$4H07$=D})ha*qo z0$sYennj&Rm=Arte*%!d^#N^?V@qLAz-PknuP#%hruyiUhVHG?qA_+fQmF18MBey3 zzgq1xM~W|QKv0#dGGPaMz$4dsqL*&7{&tKi&`j)+U?qSW!rMoB{?u#rm%LEoU}2Kk zSB=|d+iucjdmAV*p@pX6VnlZMZG%1ZmCs>ICJ~K(GwZ zhm4S?D(6~k5{~7wEzr|IY**7VHRFSlug@4ER>Mqd?q4o~ z2F!n8RV+)WeoOT#HRs;)wJ~NCX&Bkqq8WEjDge^A=1+Er+rUVO4j)q=5+z~i$hoXz zv0=m6cD0^z)5!7ELie%2;TKq{XYzI?>2Z+Gn0}8ZiTE1Jm^gwaV2$AEgB7v0-W0OU z07j_PN_Zpoys!~}G*fNpwib!MVLmy9k!tR-=$1w6H!7M&L%dJREPNw7!_Jm2)@DNV z?M3dYBG)HPgi(!cbvmEtP^`kcb?Zn7LpcqHAr-akpv4yOK^o5&lo?W9Fr-mV{G)z+ zTr9sK!9&+w)Yju=u*>aQ$?8O$H*!IZVlH3Euor3XcpvH*l!l`i7W*WvGPX6CHMUhU zA;ahFG?!DxM=^RHt|Li!!V-O@8oV#E1d%oVJMT5y!V0?rsyLzNdT@yiOArbog-B7Y zn8J>~R;{oXtqeO&oF!f+ElI23xi>KVx`*8CV2^cISEgJ%eV5axMCnB-K_{+Le+Xej zq9u-^ifT>+)q@D%`d(r(yVndW3aM%2{u;yj@Q$<9X}fG`JAZE7PxT8eSzBqyQ^6Uy zP>YimHumwhx}?14*WU(1DM&z!?*f?(a~dq3NG+xEXY|Q3i!M9M5_p>O-N-4oX3Dk$ z;)$fiLeP~b?gaRr;hVvrZ>MlA(1x{;N3^k4_mfV01ihPB2k&a)sZ_&?@8q^=hzL4Z zqABdq*P{g!;P8!oX;~6&ad3&BUausdnD0Zc9_`znv3V^pz=xF4(!@32JN##i5lFJ$ zZ)7hjF@ilEP2o!wh2c-lDp5tz*npH(J7I~$^({tl$+)%HgxikOqL$b)1r~r0t?Ez< z+Ct9SkPv~oL_H%l6F6&f77auQpH0?EOI3@IeL`<4EN@q&q?#FfZ6eIQeTk+#l<*Cq z7gt}2QQS`9+wsmzC5W^o72vGv2ZC>R@}VW$A2i@R0)iM&w-eHsHTRty~!K%6*co(^D4y>`IubyWsAZR(wG)zgXSG5m_jZV z8+A7T*EVs*rD@(csKa?YG!@N-KgoJP0Hf$df;nYr^~`fmR$)o~Dwk-NFLcR^Mcwil zBQ2?q+#1~>#k+Wyl$*VG1oVRCI|h$37xLx0{`1fVB>s9K+QqOA9Hfc{_p!9F(ne7h zTZn$Gq;1iuqfzz{YxV@_)s;Hzad^zyb8+a25ZV8tSt_cy%VI5eaih93zyz-xKZYL`qe6Jv;n=}F%CB!z^VcNlwj@Hn_7<8n ziFub->IJM-ZUdBr;zF#{rg={_i{Gd7JmnRRI2*b`tfZL}!Fb{kXz-9T-&N0rpa7(e zMqOFRP0vU)^JVvrG)&YY*$gRYcHHdtSDw~$S|8`gqB{*}v*dkGx|#~AkQt4dNWpGn zd6E((_R4gYSlByAgnJ(-zVUKIP^^^e!neA;K&O%32iQ&PerDs_@OZM^#FyP)u2jqr@>NwKnUHIIOd-U6^Qgd6mh~#I z*8R_#g|q^ko}%@A(sO2Lvq)c9ad~b|>x98yjIC{xt{0WmmZ~gudD^le8B`6a7NF-{ zEKv3GZ;>n*+7{21H`%uHKXJv^1kET=|347Ofp$HVf&>Ik1e;kp=-B33KLHrDR&Xzi z6NBHNKZ8xsa(zEJoCq`|B!=wq36EouFVIiZS`cG)WOlIzNPdJ%i<-$wtyWTP2P|fy zpIJh*Lh!Go`@xY0l+oF3c9JR|UobR4nuyD74hV^8I+}6ArFHU@ z9&@zXJ8p_+btP5-9|4O%6v^oR!?M^Fw-#B^=OW;i*q-e`7l$k43z|TroA%(er7+{K zEOE*-|8c%km`I4WcnE7iUUrB8?B%8YrnZY`pC+wMt!;)g?IB6p$}JuEZfkTH5*7zl z1B1@&N)5ltPFhz}g1KY1%gpcYKh47np$@6W_p;pmmS(bB_r%(3%SWY)l-sHHwJE<4B)s z(6k&`ZSLTZ2TgfToMdl`ea=2YeO;OstAh$O=vyjY=VNwpZJ&|%fS%0X$(D2Hegd~udoP+P|)W*WY%+=Nu_+SR(Uk%l}{j`zc7WbiW99&tHk?0PR(Q}WfGqZL)A}B=Gza= z&RI`h$MHn4LprIyDh+r=A#Wlw@s#y$O$YBHdzo7N8nR@&#We1r8^d^8(OwsN%f6gw7o7O-ZR-0Il}?pa(beOrKdpGG z?+i4LK;;gbkVq6q9g5+borL4>ofFhrk4xa-_&Naa6=D|787h`HZS`34)Bc)~(1dp6 zVfM_4&9ktAVG!go$UFpnK}ruD;_!YR=AlXCO<6Q)Kur-@q^aVzBsG#KVonY2x~E{{SD(5&7Ss_ifqd||9a%vP(y zFRL-1nW9b{h?o`cGg`_+C~ zc*XpMh&Uu!I?R>i1x?or@@l@uK1F9)Y+l;0r%b$^9S$lgvN5PJt!{od^ zHkQ@O**%F~7>!nz2p&0yDg;J?kLlXLwKgZ^Hnb3Hk6EDKL`0sCRu(vBJPW(qH!pXm zzEh(o<(1=aKrhi)yPY4Wjfn4UFjL{b(<0=Su|gYiEzlR1K<-s>w;;ECUMXGou2BK6 zpwlD@tldV$1;)Po8Dhw^5G(}pT5aT-=;-VPNm-2KKabITwM4$Voa<|V#6fpLEZ&8j z@vj6;drz=I!ATep(MxY4NYBn=bm7P6)iXX22~f(5D=0Rx0MkCT5nqs`H=XK1ey<9TPVL(uJdr@ufCwC|6j-tEPOm0^cP|yp(igMh4 zAs$5IsZmzkHcfFg;p>$d+R0b_pJ0PruYF(I%eK9UQF_=qE1V*(*O;w3GN&Silc&cn zCJ@HAsdg;Pt!h#q17?)TlT%PIDLHRbZ} z*$?r1uD#`3w?`-`xjUI%EPE5J*tGlP#KMJ!s>-JcW5{VDk~Q>{wY=HR>H4{|BFTA% zT}VEt0mb+{XCiq1-%^i2DijV2J-@Acg$JQHs<8+f|DdyFEV$k|j`nk#TBRd5*SEM) z?)Va^y2lOa*G*T^mzQNmZJY|bcPs27Sr-`z z^Ks688Qr`7!vF!*1%1y1gMyX_V-+fhr^mNjUYI)6NVOOd6^wV|Td41_dJbwG`bI2| z#suPlvGiydExj2Mif-8xf0b8wdgV?QLW`>-kzCjLd}MsQofC4F%e9sG(8ih8Ol{&JTs5Z85+;O^lG+meeMN2;f+T}D)OD*gU>(8h?&)vK)V4eE)TMEkL|b;Ez2WvAr!LSt`6A~b zGV<{RMTWTcE`Ni6zwI?h028{8jUV*97+azp4UOb|F-5PT`C2!;VV_9>kw4)WAG)3y znI1)%dMgW7ds*GMlq$yEB+0Ny>u|E-PcmBjyz$|LSz0}^XPUd=Nca)WZOXbva;xJV z|A1lUJZ*#`*nrx^wIvO#LVTwXX(k81(~$kViG@-X)JZ&`CB>029%j5Wqg9NvhP>?9 z!h2udj%i9uhCJP`|?o5uabb1mDG*%G6?16>lG08Up% zSCj67j6z|o)+HDl#U>6Gn*mVeEt0lB!j!0`Q>xfKKf-Bo$2cR&G)U-l;xDGEQ|IOB zppYT>ktKR&3bK|w*{?Ir`f4o6>xzIQJ1~jhCe6<#*Qfc!WhbmFR%)YdA!!~Gk*1=ky@g93@XcU>RxM0b_ku`!rU{Qm>Npa+1V6Hye+!RIm zn)wszg5RqspXT^o)+p=2p6U8C_|gYjm#Peu!bgith@K6e1^$GEvlpFfc*L-Femu|g z?Q2zf1CVb0qpTP-Y=51Xyzfcbj~dZ%+ERd45<@#tX4$xo6KU9|P;+AAt6yVZ9$>W- zU5MJR?^viYsV(?f1vTNS^6)w2dx1Db$BN}rmsvC6>hwYc1ev6@6v}>4KRcNBge#JwjvZE!(TdS1885tUg9DL}9OjN7 zz!!_zdfIsSyk4EjgTlSk+^FmEtv^rc%W+49vg=JC1j*7U)O)*Zydnhek-Xl%f`#cf zJxrG8EQNlWO{(ejDB3o!G$G3LVEQTiJu(V;%ua&oeiLMLi4Q2a5$d4c9-5XhwZ@JL zsz75H0&~6r-b;*t+_kL9BF37_^IEOc4Pp(fPAEniUPRO!qLAJ_80VfK&qzE#$0XC^L?^# zs7U27M)3W0E`x|3Vk5klYFxL)N$r>D{yCeJaZ1CId^9y49bPDB*mZlfU~}s+SUv97 z{s9Kf+jh5>K=))V_t;jId&QLW$gm`_;+IyGNNz&GuswxVSf&;=FO zVp}F_tGXrAht;Greci%I^@!saL5z`Wx>3D7Y=!M+He(z=PRBK#d)?q&MymY{{=Q;M zaut8Wc7eM;#&L6Yc{$^9`hshjGSR7=b|@;!So*@u+h2O!Bn;DDw&67{HfI<}uT)Hp zllL3C+L3wa*GXgLFj5tq!dMf!y9r$S_^l?V%vRRaW%GX1r|?ERM+vB$z37RY4E+a3 z)C*ijt~zRJ1gvabaRR$qgMaO=pIaxQyOuv=XH}nyVOg4o5uQ!K1V`cQ`$o2(LZ$2^ z7iI0}Gq}(Y+UuN)DR=y|tN@=@EbIy*oRbzLNN1Z^w6xLI=&p$=dU(@Q86i1q6)L<| zq8%z_ZSIIrPcw>wOlHC{pSBj6`4Be_pr#17fgC|dn2on*S@4npdvCOkU&^#JFks<1 zMZ9d+OuQ*+z-QFy-+GvtO9Z?gy=rKlk~?RTQ(1&hj07}}oPhIvW~m5Tn?&i)D)Oa5 zd)esP3tcPkmpA=j19>w#q=*;siBQenSFA6AnC5YqyG!&&$vAz6arUd$TsG_ithlBI zORC4ic|TR99qVv=hr2?4(bM?X&0Mp+AjIL-K+d)MtrkKl$r5pA0SS`D*=DK=u=rUF zPnGEo1wWUd(Y5}7WDRasz5hb*@s6|W~{%+T<=h*h09sC07Tv(FIb+cT%@o#Lp<2i1mREus>U z90Nt~XVYB~&Z&c({To&BnHP19a1bfy;A=g%Fw-G^5UKafyCqRi3&kphui(}_B2UaD zb1a-^b^7n&oP-;X}Vj#NG%<=fT4$I-^xJ^NWC)C~EwbSc#@K06umAgI-D`n=!k z;eQVO)kmOZcWqWA+>(%*l2;n?Vy9u7M-CNIAu~8@umxYbYDV7#y+V1gy_M~w?d9|g z9j}*NikZ)v-FxGQM)yi6%|ySR_Q-zI-gjjrZjJ?PUt(`U2*xLH zZW%w}u)TfzWks^P_9=ZCrd76>x3$+`)fPr{z;lY=G&R(8JhdWHnw;STd7Fz#3(HSE z2cwC#`u#pRNBmZ$hE2y4U|z3_dAD&Bf6(8Y`GA05G8WWWPSJ$5UTA$$i#estH$5wH zcp)hw-{jm=6z_fzGr{W^Y*WBJG++25UbI9|6dC5F>jg*S$Ij^nN=XE ze|F?SCP?3JB!TuHG^}$~i8tOUK-moUW=h4YiG$6fJ@OrP+aJ3?<~!hj9Q| z_0E4Jpvo(J^H$_DZ~pfzsgIJf&y8iFIOYN+DD<}Bvky|!ja{KpRPVtFC425X>wx)) zZ4$KxpRw~k;>t_>vD1$?^2i{GtgFTAsdG|NQhT=8N|>;$h;h$T>bsu=<4X}thU6Mc zhc7V;z#va6zua)EA#NGJmS{>BEv3|5(U@wFxG$)E>NkG2JxM$XMOz!ZoqwI93*S9{ zsyG{asILd8v(0J->$tVpR(pV`JpDHE$>cx_^-Oe@rU- z-|pMF{`Yu27a?JcTGa`9UB+lfKd+uKM%E!yG&W9x4aYUy>9{>)e}nu>fou*!=Cc`F z%8q-k@}Q(D!k&F4Hitq%XQ5OkIP_sJoA8OnSxFLOWLgm#SU?40Lm@<%RhS2uqrV3( zozr6!oO(M-qmLUVDCaFKsx1ccq!FB9IpO=IgPIUVm|@tc08n99h*JT?qwD$qa+@aD zIIs)fEXA)x%4Z)(h7-O{u5MaT4tC#!k3W^nvogEo9~6tdV@gyK*B+ll3>8*IeSKS6 zw-8kb)WI$^Iq-$tAkw$JH?b7BP>V1Yde@l$29y$bce5$(yAqdIJ^`KDtGm+js%q)* zIicu&8SAZI9Lj$SUW_z7kg;N(ztvWF32gv46(y(a2i3?(K!g~SB-jBhD6vn)>Vw{79U2F;@kIBW+fNPh~Mh1T*+2CEOI!d7oz|U;# z+=K({!G6_RG0ujWbszGZF#DvVN-=Y8;OfebB5r{MeYpte{ zK5pjfRf@^^c5rJwT`3n3XnlZ^)#Pel@Hn9}b;C{WT~{@1BYq2+-o@XmeOiX3x;~s2 zc0P@WAn}SeA@Map5~NwFl0?ovy}hM^p7^ zDzs#>ONu{(DSAXkjc5IS`iVg*9K+}WZ$$yElcVOUR0K~GX%6O0xnt`cbrc3~?oe1mmhsA^_iN;VysyX=cV|B^A zvndp)&A&3)=J4u3I+1{}5u!9p6yOaw36g6NQ~uYgSi*u6hckUbNc>cnog%b`LdcnH z0@FkRTJK0bkDldcjEYKKK@KGtsS>~etEg=>E4y(ah_|pSRyg*2gK~4yrVE6+VGzU? zha<9oPq?LU&s*9{^I2bSM9oz(KvYjPgGOm`@v)2Iy%w zMUE_+Hi6}nc&|pXmx|ENk5Z1@OiJ*Ly*f^bl_D(O0I|(;>i`j;m|kV2Fe;_`oi5hA z?fKU_)Xj{3C`#%gq`426IqQni}I(WI3E71$vh{1EeD^H6O7f` zp^MF5i(?gp!gAIDpa&Mnia8%d%(($AbFjzqeDAU~{> z`(_cny5SWl7=L+;Ci5q*QgUOKYBfAW-js{_D6lfXwLZrZ%nf)UwWAT_gg~j9)AJ!m z-nRD4$uTeq9_7gA@_YH6tukqL^VJEBgqf++DK-Ca6S3QMs zvce!%dzdfEASqK%{Eyt1<$GOBgk#%#+U%K{&qU66j*)=p8OnK5+)qg=rT1@~_Rv-6?y|JZhI63CPSSw`2M)>PYnZa0f z-FUkw-p9Xg0SzkSJpUX$@1|BvD~Sm4@zo^>;_JM`fzeRjN_aL&<5OiCZm&)Mo;3f( z3%z(g9(F#_m5_4+Ie<({gIO?QUTD;BJOPtd-$v`uXcDpE?cw7Z?qvH^3VW*-ud$5W zdBa{w=K6-@dLH^>bQ)WEY3>Ql#t=$GzZZ;n5vbEEyfAqw zAQ-HmX6E&Vrm$H(7zuM*=-99iB5^AimDC0^Q0vVI0sA~xy^hCaJ0?0qhSISDlb*K& zOhpt@(U5r2c=W}9=vP|Q4fL&HcUmw533n$#;;2UdAGQQ{lv{bJpsBD6>;Z#o+Zix!9;r-8*=LJwK+71%wE0gf_aB|&Y*swZiubPY%4T*XkAmqd9DL#( zUdKATiGMhn*UT8#bk7&peNL~sS&J>&WihbJwR#GC^boAQO(;=5-HxslmydG)lYEyaA)(T>$Ruyvztq>6*JR}Z?ma(wP2gP_Yy3W;lj~Y z$bqYih45ghCN(U{i&!8}F@u%4uZ+1q?>tJ}8WA*C6)oh??6|~NWaTm%XK}klv^>V& zT_mo>8n*~gd39sx`$4oxn2TCYr_Kkbu%S?ytzIr7l|#?)>uJB^Zl5(GaEis9F1Vw7+$ZCI?{NgR{cw z!xJ%>Db_lEj~F_$W_QV4@+<LeM;<3_PA=uuX*BX( z0{EJz!g+UlV_u&4V2Pu)oTyb5w;Mo1~RVyMF%!`7BGgNLvlfl7M z2S3RKsG}a?KY!n&Ow&m0&oEb)VG=C1%|=Xn)n6#&8kW!WSuc#AaHbJm0)y%uvWVDy@Ac z+&g&g8+Rh!l!Lqb8!G)q7192Jwv<;|Bn~G=N#?V^#o7u0azS!B^&E(9wF_P{5AFDK zXGzRTiM&r?#!}&tcu^F=)lj=*mfFaTT`58HIKu1zFXS(Wo2` zj=wvS9K=C{PoSboZ0tubEDUc99=Se|$hQN;7|^Q*lg;#Vllk5NO9kx$sEZLRQl+MZ zQ9^Fjen7lhtsk;wb->mr=}z9cNyFSNzVH(ZPTNEPDwV$kxd3!v;P_Yt|90Ki1}GW7 zi=1M2q)Jj^IL4%FxoAE-HB!Z1Cs6-2qea;MJon98p@T}Tlm^6Ioo<}438AYG95{A z_$X_hgW*aUA()F|@8GZj?+~~p0O?&rchQPbyA)1FtQI*MGH^R&!{Ys#RjyE`6>H$g z;}rI*YgQr!QLW#tM?|cv{=KRyd|webn-d%cuKIe%;SS{F6>e`SO>wktA4P?%y%d0c z)UI)c%$n4nJY8+c}MR77@$1W_`0{C zqqh2LN4OYatyhSi#*WIX%J{zC7}T83TQa$8Ot(+<5O*_1jp6mG;2-i)y*r6{G3Y*X zjv4-it!T0M0RQIEu85et~+7Z%z#yE(7jv|TrLU-FlF5tw3_A;ECr*cHgf$1R+ z>553*WZ~9eP%DgAeL@RB40w0!t(JgaQ{Jcv>8}tdCadwQrep;IVTWjlSYg-_GNLxoLT~>>iAnf=pbA+xyaPWt|VDS#XeJW_V#H; zRAnCBV!fo7-*~GLC0lI2j+>6fl4vWlQi*7_*3!IO?pmykxSjuYhO`_0_XJ157Y<}v z+u)!$-ccDUZjCL!5*pr$P zE%BE>lq}9svkQEsFR-Xc5Y4Nh+Ft6BXO+h7B>IN0`0ytWebAV;DHK%zKS030liGFG z)|(=8P&zq2yJ!8~W~f_*cEi)=@4e(u@6dVD1-jCy_JS-AFTahStIxb)-d zIy}(TB3F*N*qdCAIcf)Lk{J<)GPgK!U$TyvEa?zU^ue8epW$=)Dp-|~He z@0>R$7xIm5db6phb&99JoVuPnLXn6X&2VoX5m2vHk}IZ2!LG4fg7ZwGQ$DKtdX8WtPAjMI>r~E47Sq2 zR)pX#Jb09G02QDRh5=Le2xE7|L6SvR$I8Gh=k{XYs!P%$A&UtV3-;Xp^i(3Fz^A#; zGMf-t^nCoSE2fjSsKYHUew0NxGCsMx=mI1lcY^{ypF9Jh^Twyi(|;-(u`6c~GiB6- zEl8qv^`*LAzI9*ny>r_tvU&eJgLB&9%^0uhkLB^lWJ(OegmkJgDC_gc2r8;QCBj+D z@gP4c#7QU%YAoT~8fbw9qyB#cj;On02BuEC4f{P-MXJ_3I*@pZJWt)I<8!tIaK`F` zWHlqUvdPO%3jUl(I-R#Joodk|-EKBLrI#K)M?^qq)liK0Y{H2MK?9=;1b8j$vg5fZOB3Va${$f@}(%H zwHmtg0*>hcrCXUNaDjB(h;o#V1jRI58mOL5wXv)~TAX2FHm;=c1F~y`DYQVNIvA4! z7@n?GN&+R+@Ub6Bl+_~u2`xvaie$Fa0<%5SL3UA1>R|Gm6%RYMhXCm&T3>bR5LG4D zftn=TsWKlhff+4`1STw0-IV(fAh`j;%qlfy5}Q4npV7V9rexbk!U7&#;h>3vnuRry zUwv+A`KpUc20@d$xu){8s#L40;KX>)3FP3@6w_2Wwjrf$T`e?)f6LPGa4%9F2y1} zTmT0?p zz%UOtQk&X@T=`Ag?#b@Gi*!_4=Vj`|iL;+b?QowuJp=D6s&Da9VA88YORd+Ek$VZ! zTZ*hj`M{td$%u{O{jowtEvn*yNBW7;Z^{u$M?0usVL5c@C`*~ z84T~I37H->l_R*hD{Tn7D6!v3!hf21_b=`tb+j4SNpa$VOm@}xc%=(orR6(P0%{-I zxs_COSxa@eCeI)S4Onp>QR^A;(xv2Uhu>+JQgtM~T0!8__C{KVb3t;D5P@2{YrtX` zTNo`-ID%-?tQL2ymWnU(p!smyMfNqZJFLE-fCSCaqO+wQf1`z@grLm?T>*r%QWorL zG^VFM=hHZ-1cROx33EC6fi*nduB4-^OkqHJ&wOR;%g!tQa5f5!>T(&v_aw+G8 z4?S|)HUQ?mftvo8=A6asRaCrTC!x?tf$bz~6H`AY*I_o0@W&Vc)vN@HOJB`<4o4p073kw06cbx)@?34gWw1b7-B)| zP&zW_R+Z|!i29%U{wZFp?VTc_E3R4V!z7esv-!{q_-ab@4_kAtJgl?FpbZ@-b;AYLmL?D**Cym8VY_iRVYE&(C=igCFQG>?p;OkS&u{!oLB=1R#6@^TgUelx9&f*Fm%-o&Z;)YT_5(u{NUr)K~v z%V`DMN>OPcH@hZS@o0tQyurm$5mhy9$M;c=^g>O{ppb{`q!~?g1cy(I5L-$Bv!Z>F z9u_bn)`-Y*2gK50%qwwAX&jNkv9SUl8V`ld7*=1KD-`=h!71N2j%IM`#!~KG^ru zjI>WdNiWl+B}B?H{SBUXcD&dx4gAIP=xZJr{=Ego?gZ08A5FAzgh$QAr~>IRy~ z0s4xX5mej=b?QyooO9$?LTs^0R+-)pf*8UtibiFjA!$z}tJ6CCod7P92Xbg!F|y6# zrM&h`NwQcd%g{sy-g7YrY@lKmi|=%s)eDOK49JAFm*u0<;CFHzl}qA9If=SQP`^$o zA~8`F3iWL`E3S*HAbays6s8~P)y815l~kc7IT)OMd8YlfmtbW<%_`sTwwm4yeh$n) z))z&*oNycf#N2gGVk7}~)A0Y9`e|SV+bWqtTFs~6Yr=}jwbbWJlJqM8pOS$2s)x=2 zd@+`gwk)R;O{~EP#Jcty3Dv?O?=VG9lz97|m3860`h_V%srQ?MfGfnVca|ulC9_jS zjM-@1gCxVji7Z8n-NZd#Fcj#!BWSBl1ZK%bIMFJ8G<1$!X|ccgpPABQHsM*IcuG?H zWUeb-it~2)$m&Qp3tRP)D+CE>?NyNYtRfH;< zPntxkMAlRQ$NnlUah=v|{FBT6xt;y%Fj&N>tGs*kTbyJm;y=W+s*C%}vulj{LJ(6aadZ%;Yxsix7zQi9#YmkFc9HM=2Hn07Kk zm9tTp!wElMf`4sA)MIp1gz~s}ao?eGrO4c+DPBk9odsVB&dA;8hgPCX?Y-23S_uko z6<)(p5>8#~3qHog?u&Mt+X~!xgfnmI-!G9i^T^VE?l-d3`rv)J>!}U;ns3buSLcrk zn3-)2#MJRXf6X*tx>p-ef0rZ6f08XM2T^@TV%kWRr()GbOUF0m;$q}01m30Vavq3? zhv~BOfoY-F?ak`;hAA}_lYVTAnlxGx`j`9P>wJ06D;)50zK^Om>M^UvWKRcV zBbVY(zvdPm2AH?T?KJ(#kjZ;c9=n9SFQoulfaCLxEfm}rn4hC9fZx!b!K0&&*%6;p zD!1eLh($2>$I|k=;S0Z1fZle5ce5$szfh7iVO9DC$2*e8Suw3tTE8>_j(+i;E`#0%8s@-vOrVBbsMk#7j9YraeB#!Kj`FLfco``M5HM2-$jd zzS871$=Q5!0}cH(*##DXT1GThJK^YW>Iop#ah6Z<6*AQoj@qBL1`ZKqEL&`c)06J@*^`Kl|eI zsO%5m{(V<91?dNgs^}35Uy}Z94_HY0aPCCOzuyB> zzT(!_VB*GTMq*%UU;xL*W+?Sa<|0a?3ht`D>|tf5@V!hOOxhaEbR~T0nqD0{@_nbSGvGlF$l#-s&y{_w_lWpy zts9NEoBQ@}ev3t$bFRj{9G<)ummk%qau3gaPSD_^&s?cKS0(Sw16f6RVd_qgdon%m z=H6VgAI8_x54EVAi^1Y_=b!3bH^%9&pR^O~_g7mw_xGEf{lfHNz<81JkzTZ!PNOoe{;3=PlW(H{LeW-E z%d>@JtJ~9fiH^@e2;wC0k)g=gob+&0dx&qjxn|^(EPsCO?bNBf(`h;t@3SWO3DyxY zrb?}$R%JcQDBmPxWS_~X1Mj+Yd)}=c-bXao)&5TPgddT=OIAszd%oZ3A-UFj zi$WRGZ8zxWd$-hWv{d#2|Af$4*+08$HMDo0t(R4`T`Rz^Ef>Vs_H##f7B9ABPb+=Z zr$%4zeCWfm%9%q#8rt4F&Y8^Bw;0?KcD|KP zt%h%FmPW6mU?RuAwZA74$@=&0U(;xL;W*y)_55Dd94boXa-k)Apy#W6$UKM0xcePs zxjO4o+3oBRs>D|i6_%5q)eRd(^!+fuqn#UFIOV!SlbFu)^(@~R+MoS|yNj3$A?n8K z zdHQ-r-2V0T$SsN=_f!2w_rv|^#;V*Fmf26$x69fP4;Q z)7Q;)?_1e?NX%hesJUd|t1rTAbMBHgPjBKk*kwK*5k>8_!`Jh ze%gCX_5hs_kSbvVg56}|; zRTF_v@a{c&x;}%WUsD^op*1#qwupx)UXf&(f7tE5C@38cc+OSLI9dKoOr`V&lBdK7 zePJc>y|X_h+s#Lo6eNCe@a10GZ=U2Vox|@ML8K|c+YWIlR9&L#t#I{Bk#5-7=bQLV z2Fk*$h`72YMh;dE{(cHxgAW6sFB(7>?Ok(v12NAqTit8;;JDMBL*>tz&S`j~>S^#c zSaAA-_}o2W^MBViX~ZZ