diff --git a/Content/Legumix/Ennemy/MeleeEnemy/BP_MeleeEnemy.uasset b/Content/Legumix/Ennemy/MeleeEnemy/BP_MeleeEnemy.uasset index fd32e0c..15490a4 100644 --- a/Content/Legumix/Ennemy/MeleeEnemy/BP_MeleeEnemy.uasset +++ b/Content/Legumix/Ennemy/MeleeEnemy/BP_MeleeEnemy.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:534f38474dde37a8637b3476a7a04b14e09c77bf6d3d273b345e0a9464057ff8 -size 140384 +oid sha256:79ce1eaf8c92f3dcbe0b59ca6c976be1a161d8acf14d36cea7a8f3e6e3b43349 +size 141512 diff --git a/Content/Legumix/Levels/LVL_GYM_00.umap b/Content/Legumix/Levels/LVL_GYM_00.umap index 7c5a4e3..2794140 100644 --- a/Content/Legumix/Levels/LVL_GYM_00.umap +++ b/Content/Legumix/Levels/LVL_GYM_00.umap @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9c0f7a83ea411981c11010e37f610332042e1f1d2bcf43c1dc81fb8f3ba21483 -size 979519 +oid sha256:a030ec9cab6b4b991b2cd4ac11ab5e88b47346bcd0bcb657b6af3208bdbd8320 +size 979590 diff --git a/Content/Legumix/Player/BP_Play.uasset b/Content/Legumix/Player/BP_Play.uasset index 542de20..47cf459 100644 --- a/Content/Legumix/Player/BP_Play.uasset +++ b/Content/Legumix/Player/BP_Play.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bc671ebd77c88ba91852256def97a396662efbc816caff40f18381e2eac44413 -size 286911 +oid sha256:281dcd4cdfd08af9eaa65e33fe67f7d72e40c10d2ca503cb9668058e15549aa0 +size 463534 diff --git a/Content/Legumix/Player/HUD/Greyscale.uasset b/Content/Legumix/Player/HUD/Greyscale.uasset new file mode 100644 index 0000000..4185ef5 --- /dev/null +++ b/Content/Legumix/Player/HUD/Greyscale.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ab485ad2bb51767342e4f10983b22737c5bafc972d39fcd62b0cc856de8a415 +size 9283 diff --git a/Content/Legumix/Player/HUD/M_Postprocess_Damage.uasset b/Content/Legumix/Player/HUD/M_Postprocess_Damage.uasset new file mode 100644 index 0000000..d01996c --- /dev/null +++ b/Content/Legumix/Player/HUD/M_Postprocess_Damage.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e9485574a4e11a2b875255a8dc3a7874ae00b4caac0e5cd995e55f6c0df992d +size 24558 diff --git a/Content/Legumix/Player/HUD/M_Postprocess_Damage_Inst.uasset b/Content/Legumix/Player/HUD/M_Postprocess_Damage_Inst.uasset new file mode 100644 index 0000000..0a2f168 --- /dev/null +++ b/Content/Legumix/Player/HUD/M_Postprocess_Damage_Inst.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47f61885148b08c7dce5a87092f0bd7f50862c2e37c11269ae5092f7fc60757a +size 6220 diff --git a/Content/Legumix/Player/HUD/T_LavaMat4_Emissive.uasset b/Content/Legumix/Player/HUD/T_LavaMat4_Emissive.uasset new file mode 100644 index 0000000..f4847bd --- /dev/null +++ b/Content/Legumix/Player/HUD/T_LavaMat4_Emissive.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ebcff105190025a7407d86121af16d8ea7e5860dcc7d2773d3716c5f44708146 +size 57666122 diff --git a/Content/Legumix/Player/HUD/WBP_DamageDisplay.uasset b/Content/Legumix/Player/HUD/WBP_DamageDisplay.uasset new file mode 100644 index 0000000..3600b61 --- /dev/null +++ b/Content/Legumix/Player/HUD/WBP_DamageDisplay.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:958ac948dde4c5891f4b3661c3190f9ea3163a184885808557829b3ea5e2d090 +size 39409 diff --git a/Source/LegumeMix/Private/Enemy/LMEnemy.cpp b/Source/LegumeMix/Private/Enemy/LMEnemy.cpp index 25abcfa..aadbe70 100644 --- a/Source/LegumeMix/Private/Enemy/LMEnemy.cpp +++ b/Source/LegumeMix/Private/Enemy/LMEnemy.cpp @@ -6,6 +6,7 @@ ALMEnemy::ALMEnemy() { PrimaryActorTick.bCanEverTick = true; EnemyState = EEnemyState::EES_Chasing; + AttackingRadius = 100.f; AttackingDamage = 0.f; } diff --git a/Source/LegumeMix/Private/Player/LMPlayer.cpp b/Source/LegumeMix/Private/Player/LMPlayer.cpp index e611f89..c21a898 100644 --- a/Source/LegumeMix/Private/Player/LMPlayer.cpp +++ b/Source/LegumeMix/Private/Player/LMPlayer.cpp @@ -27,6 +27,17 @@ ALMPlayer::ALMPlayer() SpreadStream = FRandomStream(FMath::Rand()); HealthComponent = CreateDefaultSubobject(TEXT("HealthComponent")); + + HitPeriodLengthInSeconds = 15.f; + bHitPeriodInProgress = false; + TimeOfTheLastDamage = 0.f; + HealthAtTheCurrentHitPeriodBeginning = 100.f; + CumulatedDamagesOnCurrentHitPeriod = 0.f; + PlayerViewOcclusionPercent = 0.f; + NextPlayerViewOcclusionPercent = 0.f; + PlayerViewOcclusionPercent = 0.f; + AlphaLerpForPlayerViewOcclusionPercent = 0.f; + } void ALMPlayer::BeginPlay() @@ -37,9 +48,41 @@ void ALMPlayer::BeginPlay() GetCamera()->SetFieldOfView(ULMUserSettings::GetLegumixUserSettings()->FieldOfView); - + HealthComponent->OnHealthChanged.AddDynamic(this, &ALMPlayer::SetDisplayDamageParameters); } +void ALMPlayer::Tick(float DeltaTime) +{ + if(bHitPeriodInProgress == true) + { + double TimeElapsedSinceLastDamage = GetWorld()->GetTimeSeconds() - TimeOfTheLastDamage; + if(TimeElapsedSinceLastDamage > HitPeriodLengthInSeconds) + { + if(bHitPeriodInProgress == true) + { + bHitPeriodInProgress = false; + PlayerViewOcclusionPercent = NextPlayerViewOcclusionPercent; + NextPlayerViewOcclusionPercent = 0.f; + AlphaLerpForPlayerViewOcclusionPercent = 0.f; + TimeOfTheLastDamage = 0.f; + CumulatedDamagesOnCurrentHitPeriod = 0.f; + } + } + } + + if(PlayerViewOcclusionPercent != NextPlayerViewOcclusionPercent) + { + AlphaLerpForPlayerViewOcclusionPercent = FMath::Clamp(AlphaLerpForPlayerViewOcclusionPercent + DeltaTime, 0, 1); + PlayerViewOcclusionPercent = FMath::Lerp(PlayerViewOcclusionPercent, NextPlayerViewOcclusionPercent, AlphaLerpForPlayerViewOcclusionPercent); + DamageDynamicMaterialInstance->SetScalarParameterValue("PlayerViewOcclusionPercent", PlayerViewOcclusionPercent); + } + else if(PlayerViewOcclusionPercent == NextPlayerViewOcclusionPercent) + { + AlphaLerpForPlayerViewOcclusionPercent = 0; + } +} + + bool ALMPlayer::PickUpAmmo(ALMAmmo* Ammo) { if (GEngine) @@ -159,3 +202,25 @@ USkeletalMeshComponent* ALMPlayer::GetArms() return ArmsMesh; } +void ALMPlayer::SetDisplayDamageParameters(float Health, float Damage) +{ + if (bHitPeriodInProgress == false) + { + HealthAtTheCurrentHitPeriodBeginning = Health; + bHitPeriodInProgress = true; + } + TimeOfTheLastDamage = GetWorld()->GetTimeSeconds(); + CumulatedDamagesOnCurrentHitPeriod += Damage; + SetPlayerViewOcclusionPercent(); +} + + + +void ALMPlayer::SetPlayerViewOcclusionPercent() +{ + AlphaLerpForPlayerViewOcclusionPercent = 0; + PlayerViewOcclusionPercent = NextPlayerViewOcclusionPercent; + NextPlayerViewOcclusionPercent = CumulatedDamagesOnCurrentHitPeriod / HealthAtTheCurrentHitPeriodBeginning; +} + + diff --git a/Source/LegumeMix/Public/Enemy/LMEnemy.h b/Source/LegumeMix/Public/Enemy/LMEnemy.h index 919aa54..b129aa2 100644 --- a/Source/LegumeMix/Public/Enemy/LMEnemy.h +++ b/Source/LegumeMix/Public/Enemy/LMEnemy.h @@ -44,7 +44,7 @@ protected: double GetDistanceToTarget(const AActor* TargetedActor); /** - * Returns the distance between the enemy and a target. + * Performs an attack on the targeted pawn * @param TargetedPawn * @returns */ diff --git a/Source/LegumeMix/Public/Player/LMHealthComponent.h b/Source/LegumeMix/Public/Player/LMHealthComponent.h index cb9a577..a780596 100644 --- a/Source/LegumeMix/Public/Player/LMHealthComponent.h +++ b/Source/LegumeMix/Public/Player/LMHealthComponent.h @@ -23,6 +23,8 @@ public: void Kill(); public: + FORCEINLINE float GetHealth() const { return Health; } + /** * Applies an amount of damage to the component. * @param Damage The damage to apply the Health to. diff --git a/Source/LegumeMix/Public/Player/LMPlayer.h b/Source/LegumeMix/Public/Player/LMPlayer.h index a7bef32..f86b10c 100644 --- a/Source/LegumeMix/Public/Player/LMPlayer.h +++ b/Source/LegumeMix/Public/Player/LMPlayer.h @@ -11,6 +11,7 @@ class UCameraComponent; class ULMWeaponManager; class ULMHealthComponent; +class UMaterialInstanceDynamic; class ALMAmmo; DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnRequestUnpauseSignature); @@ -48,6 +49,9 @@ protected: // Called when the game starts or when spawned virtual void BeginPlay() override; + // Called every frame + virtual void Tick(float DeltaTime) override; + public: UFUNCTION(BlueprintCallable) ULMWeaponManager* GetWeaponManager() { return WeaponManager; } @@ -113,6 +117,76 @@ private: UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Legumix, meta = (AllowPrivateAccess = true)) TObjectPtr HealthComponent; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Legumix, meta = (AllowPrivateAccess = true)) + TObjectPtr DamageDynamicMaterialInstance; + + /** + * Is a hit period in progress + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Legumix, meta = (AllowPrivateAccess = true)) + bool bHitPeriodInProgress; + + /** + * Length of the period in which the damage texture effect will be displayed on player screen. + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Legumix, meta = (AllowPrivateAccess = true)) + double HitPeriodLengthInSeconds; + + /** + * Time of last damage taken. + * If the time elapsed since is superior to the HitPeriodLengthInSeconds variable, ends the Hit period + * and so the displaying the damage texture effect on player screen + */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Legumix, meta = (AllowPrivateAccess = true)) + double TimeOfTheLastDamage; + + /** + * Cumulated damages taken by the player on the current hit period + * To calculate view occlusion percent for the damage texture effect + */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Legumix, meta = (AllowPrivateAccess = true)) + float CumulatedDamagesOnCurrentHitPeriod; + + /** + * Player health at the current hit period beginning + * To calculate view occlusion percent for the damage texture effect + */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Legumix, meta = (AllowPrivateAccess = true)) + float HealthAtTheCurrentHitPeriodBeginning; + + /** + * Percent of the player screen occupied with damage texture effect to reach + */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Legumix, meta = (AllowPrivateAccess = true)) + float NextPlayerViewOcclusionPercent; + + /** + * Previous percent of the player screen occupied with damage texture effect + * mandatory to make interpolation between this core and the current one + */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Legumix, meta = (AllowPrivateAccess = true)) + float PlayerViewOcclusionPercent; + + /** + * Percent of the player screen occupied with damage texture effect + */ + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category=Legumix, meta = (AllowPrivateAccess = true)) + float AlphaLerpForPlayerViewOcclusionPercent; + + /** + * Actualize all parameters needed to calculate PlayerViewOcclusionPercent + */ + UFUNCTION(BlueprintCallable, Category=PostProcess) + void SetDisplayDamageParameters(float Health, float Damage); + + /** + * Determine Percent of the player screen occupied with damage texture effect + */ + UFUNCTION(BlueprintCallable, Category=PostProcess) + void SetPlayerViewOcclusionPercent(); + + + private: #if WITH_EDITORONLY_DATA /** If set, bullet debug will be drawn. */