diff --git a/EndlessVendetta/Content/BountySystem/Waypoint/TextBackground.png b/EndlessVendetta/Content/BountySystem/Waypoint/TextBackground.png deleted file mode 100644 index d5781e4c..00000000 --- a/EndlessVendetta/Content/BountySystem/Waypoint/TextBackground.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d3cccd91fdbe7e0090f451048771e56d36dbe24c3cb716b63d99261f414f868 -size 2232177 diff --git a/EndlessVendetta/Content/BountySystem/Waypoint/TextBackground.uasset b/EndlessVendetta/Content/BountySystem/Waypoint/TextBackground.uasset deleted file mode 100644 index c80f44a0..00000000 --- a/EndlessVendetta/Content/BountySystem/Waypoint/TextBackground.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c06aa560dd0dffcca87ab60abe3a290e98e28c94ef52e58338c9e985c83d1ac0 -size 1854378 diff --git a/EndlessVendetta/Content/FirstPerson/Blueprints/BP_FirstPersonCharacter.uasset b/EndlessVendetta/Content/FirstPerson/Blueprints/BP_FirstPersonCharacter.uasset index 68f6e73f..ea9b685a 100644 --- a/EndlessVendetta/Content/FirstPerson/Blueprints/BP_FirstPersonCharacter.uasset +++ b/EndlessVendetta/Content/FirstPerson/Blueprints/BP_FirstPersonCharacter.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b0a493fd95d8b0b43306329298c058cfa2f164ec071457bc575a8eafee95f1b1 -size 53936 +oid sha256:58139ccad1a63dd9fa03404f0fb0b7af3f742d844b0ed7da0e081b96319600b9 +size 54773 diff --git a/EndlessVendetta/Content/FirstPerson/Blueprints/WBP_Crosshair.uasset b/EndlessVendetta/Content/FirstPerson/Blueprints/WBP_Crosshair.uasset index 939e70d9..29ebde67 100644 --- a/EndlessVendetta/Content/FirstPerson/Blueprints/WBP_Crosshair.uasset +++ b/EndlessVendetta/Content/FirstPerson/Blueprints/WBP_Crosshair.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:13ff21aa89e2ded711aff8ee6617abc2d565d222c39ce3878969fdfe44d5a81f -size 75992 +oid sha256:8ac7733948c885fda46dd009dd75dfe5c79abf1262e9aadcf17c401bb8f64ecf +size 93512 diff --git a/EndlessVendetta/Content/FirstPerson/Input/Actions/IA_Sprint.uasset b/EndlessVendetta/Content/FirstPerson/Input/Actions/IA_Sprint.uasset new file mode 100644 index 00000000..1a2ea734 --- /dev/null +++ b/EndlessVendetta/Content/FirstPerson/Input/Actions/IA_Sprint.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e25b72a06c43ac63140b164e9ee5e2a8222f021ac5bd045149a27c2d8f073a1 +size 1360 diff --git a/EndlessVendetta/Content/FirstPerson/Input/IMC_Default.uasset b/EndlessVendetta/Content/FirstPerson/Input/IMC_Default.uasset index 6f199667..4764655f 100644 --- a/EndlessVendetta/Content/FirstPerson/Input/IMC_Default.uasset +++ b/EndlessVendetta/Content/FirstPerson/Input/IMC_Default.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:750ab013f24a45539806fd40e9cd2a328ff31b40c5d3edcce0676fb3bf6935ee -size 18664 +oid sha256:8576231cc54d32ecfa8c00c7570ec51bb9d741dabc85bc0b4ef684bbc8209d04 +size 19248 diff --git a/EndlessVendetta/Content/Levels/TrainingFacility.umap b/EndlessVendetta/Content/Levels/TrainingFacility.umap index 19053416..174ac378 100644 --- a/EndlessVendetta/Content/Levels/TrainingFacility.umap +++ b/EndlessVendetta/Content/Levels/TrainingFacility.umap @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9085d76489c04f7d273f580154acee8bbe53b285514f36e2770d3be3e9407730 -size 679662 +oid sha256:7711a7f6afcfd75419a73d627b6359ec3fb76c48d9dbb34e50b2a2318ee05b7d +size 679380 diff --git a/EndlessVendetta/Content/StarterContent/Architecture/Floor_400x400.uasset b/EndlessVendetta/Content/StarterContent/Architecture/Floor_400x400.uasset index c2a34afc..9fe9e00c 100644 --- a/EndlessVendetta/Content/StarterContent/Architecture/Floor_400x400.uasset +++ b/EndlessVendetta/Content/StarterContent/Architecture/Floor_400x400.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4c0ecf0ac0702cc2bd355ec050232a61c49e10f102448efbeb735a51824adef6 -size 14948 +oid sha256:1dab05352d920eb93c5a61a681634f187e65971458c68dd559602b2510811889 +size 14831 diff --git a/EndlessVendetta/Content/StarterContent/Materials/M_Wood_Pine.uasset b/EndlessVendetta/Content/StarterContent/Materials/M_Wood_Pine.uasset index fb828784..eafee70c 100644 --- a/EndlessVendetta/Content/StarterContent/Materials/M_Wood_Pine.uasset +++ b/EndlessVendetta/Content/StarterContent/Materials/M_Wood_Pine.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:196eb4590144ea90058b1a8b48d4662f2ba04302d4184e5e68698a3e715cc50e -size 29377 +oid sha256:b12c6d7285dd95b1c5669e07fc665f8859a17ee78c51f139170726848c06ee67 +size 31142 diff --git a/EndlessVendetta/Content/StarterContent/Materials/M_Wood_Walnut.uasset b/EndlessVendetta/Content/StarterContent/Materials/M_Wood_Walnut.uasset index 1d3466c4..2e926194 100644 --- a/EndlessVendetta/Content/StarterContent/Materials/M_Wood_Walnut.uasset +++ b/EndlessVendetta/Content/StarterContent/Materials/M_Wood_Walnut.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:da10621d164f621c3c598d9d293d707a2879d7caf8c0525652a06b38323820f0 -size 20139 +oid sha256:8491e0b8978a41999e0f4fc6520cab088fcbe6ddf8b51655f34753aa45234c66 +size 20495 diff --git a/EndlessVendetta/Content/StarterContent/Props/MaterialSphere.uasset b/EndlessVendetta/Content/StarterContent/Props/MaterialSphere.uasset index 89145d94..56bddfc9 100644 --- a/EndlessVendetta/Content/StarterContent/Props/MaterialSphere.uasset +++ b/EndlessVendetta/Content/StarterContent/Props/MaterialSphere.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b7943b84a70f66da9ce4c738e5748bd6853c3af285ea2f99a76efa584cb31301 -size 47710 +oid sha256:3a8777c01491888bba9f40eda9d2bed76a611f0e80f75917501ce69c1a321342 +size 47333 diff --git a/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.cpp b/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.cpp index 04a8f415..438d89e8 100644 --- a/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.cpp +++ b/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.cpp @@ -69,14 +69,15 @@ void AEndlessVendettaCharacter::BeginPlay() } InventoryComponent = Cast(GetWorld()->GetFirstPlayerController()->GetComponentByClass(UInventoryComponent::StaticClass())); + WalkSpeed = CharacterMovement->MaxWalkSpeed; + OriginalWalkSpeed = CharacterMovement->MaxWalkSpeed; + CurrentStamina = MaxStamina; } void AEndlessVendettaCharacter::Tick(float DeltaTime) { Super::Tick(DeltaTime); - WeaponPickUpSystem(); - MoveGroundSpeed = Cast(GetComponentByClass(UMovementComponent::StaticClass()))->Velocity.Size(); if (MoveGroundSpeed > 0) @@ -85,8 +86,40 @@ void AEndlessVendettaCharacter::Tick(float DeltaTime) } else if (MoveGroundSpeed <= 0) { + this->GetFirstPersonCameraComponent()->SetFieldOfView(90); bIsPlayerMoving = false; } + if (bPressedJump) + { + if(CurrentStamina <= 0.0f) + { + CurrentStamina -= 20.0f; + } + } + //PLAYER STAMINA HANDLING + if (MoveGroundSpeed > 0) + { + if (bIsPlayerSprinting) + { + CurrentStamina -= FMath::Clamp(StaminaDecreaseRate, 0.0f, 100.0f); + if (CurrentStamina <= 0.0f) + { + bIsPlayerSprinting = false; + this->GetFirstPersonCameraComponent()->SetFieldOfView(90); + CurrentStamina = 0.0f; + CharacterMovement->MaxWalkSpeed = OriginalWalkSpeed; + } + } + } + if (!bIsPlayerSprinting) + { + if(CurrentStamina >= 100.0f) + { + CurrentStamina = 100.0f; + return; + } + CurrentStamina += FMath::Clamp(StaminaRegenRate, 0.0f, 100.0f); + } } void AEndlessVendettaCharacter::RegenHealth() @@ -129,11 +162,13 @@ void AEndlessVendettaCharacter::SetupPlayerInputComponent(class UInputComponent* if (UEnhancedInputComponent* EnhancedInputComponent = CastChecked(PlayerInputComponent)) { //Jumping - EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Triggered, this, &ACharacter::Jump); - EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Completed, this, &ACharacter::StopJumping); - + EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Started, this, &AEndlessVendettaCharacter::Jumping); + EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Completed, this, &AEndlessVendettaCharacter::StopJump); + //Moving EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AEndlessVendettaCharacter::Move); + EnhancedInputComponent->BindAction(SprintAction, ETriggerEvent::Started, this, &AEndlessVendettaCharacter::Sprint); + EnhancedInputComponent->BindAction(SprintAction, ETriggerEvent::Completed, this, &AEndlessVendettaCharacter::StopSprint); //Looking EnhancedInputComponent->BindAction(LookAction, ETriggerEvent::Triggered, this, &AEndlessVendettaCharacter::Look); @@ -511,6 +546,54 @@ void AEndlessVendettaCharacter::Move(const FInputActionValue& Value) } } +void AEndlessVendettaCharacter::Sprint() +{ + bIsPlayerSprinting = true; + if (bIsPlayerSprinting) + { + if (MoveGroundSpeed > 0) + { + CharacterMovement->MaxWalkSpeed = SprintSpeed; + this->GetFirstPersonCameraComponent()->SetFieldOfView(100); + } + } +} + +void AEndlessVendettaCharacter::StopSprint() +{ + bIsPlayerSprinting = false; + if (!bIsPlayerSprinting) + { + UE_LOG(LogTemp, Display, TEXT("Player stopped sprinting")); + CharacterMovement->MaxWalkSpeed = OriginalWalkSpeed; + this->GetFirstPersonCameraComponent()->SetFieldOfView(90); + } +} + +void AEndlessVendettaCharacter::Jumping() +{ + if (CurrentStamina > 10.0f) + { + bHasPlayerJumped = true; + if (bHasPlayerJumped) + { + Super::Jump(); + if (!CharacterMovement->IsFalling()) + { + CurrentStamina -= 10.0f; + } + bHasPlayerJumped = false; + } + } +} + +void AEndlessVendettaCharacter::StopJump() +{ + Super::StopJumping(); + UE_LOG(LogTemp, Display, TEXT("Player has stopped jumping")); + bHasPlayerJumped = false; +} + void AEndlessVendettaCharacter::Look(const FInputActionValue& Value) { // input is a Vector2D diff --git a/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.h b/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.h index 9a14b875..8bfa7c05 100644 --- a/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.h +++ b/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.h @@ -73,6 +73,9 @@ class AEndlessVendettaCharacter : public ACharacter UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true")) UInputAction* InteractAction; + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true")) + UInputAction* SprintAction; + public: AEndlessVendettaCharacter(); @@ -83,6 +86,23 @@ public: UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Stats") float DefaultHealth = 100.0f; + //STAMINA AND SPRINT SPEED + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Stats") + float MaxStamina = 100; + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Stats") + float CurrentStamina; + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Stats") + float StaminaDecreaseRate = 0.2; + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Stats") + float StaminaRegenRate = 0.05; + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Stats") + float SprintSpeed = 900; + + //Getting the charMovementComp + UCharacterMovementComponent* CharacterMovement = GetCharacterMovement(); + float WalkSpeed; + float OriginalWalkSpeed; + AActor* PrimaryWeaponActor; AActor* SecondaryWeaponActor; bool bIsPrimaryWeaponCreated = false; @@ -107,6 +127,9 @@ public: bool bIsPlayerMoving = false; + UPROPERTY(VisibleAnywhere) + bool bIsPlayerSprinting = false; + double MoveGroundSpeed; /** Look Input Action */ @@ -149,6 +172,13 @@ public: UFUNCTION(BlueprintCallable, Category = "Weapons") void StopFire(); + void Sprint(); + void StopSprint(); + + void Jumping(); + void StopJump(); + bool bHasPlayerJumped = false; + UArrowComponent* ScopedLocationArrow; UPROPERTY(EditAnywhere, Category = "Dont Touch") diff --git a/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetClasses/Recon/VisionLink/VisionLink.cpp b/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetClasses/Recon/VisionLink/VisionLink.cpp index 1dbe1dd7..eca0e33f 100644 --- a/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetClasses/Recon/VisionLink/VisionLink.cpp +++ b/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetClasses/Recon/VisionLink/VisionLink.cpp @@ -6,7 +6,7 @@ #include "CollisionDebugDrawingPublic.h" #include "Kismet/KismetMathLibrary.h" #include "Camera/CameraComponent.h" -#include "VisionLinkEnemyLOSTest.h" +#include "EndlessVendetta/EndlessVendettaCharacter.h" #include "GameFramework/Character.h" void AVisionLink::BeginPlay() @@ -47,9 +47,16 @@ void AVisionLink::SendOutPingPulse() GetWorld()->GetTimerManager().SetTimer(PulseHandle, this, &AVisionLink::SendOutPingPulse, TimeInbetweenPingPulses, false); PlayPingPulseAnim(TimeInbetweenPingPulses); - UCameraComponent* PlayerCamComp = Cast(GetWorld()->GetFirstPlayerController()->GetCharacter()->GetComponentByClass(UCameraComponent::StaticClass())); + ACharacter* PlayersCharacter = GetWorld()->GetFirstPlayerController()->GetCharacter(); + UCameraComponent* PlayerCamComp = Cast(PlayersCharacter->GetComponentByClass(UCameraComponent::StaticClass())); + + // Ignored Actors TArray ActorsToIgnore; - ActorsToIgnore.Add(GetWorld()->GetFirstPlayerController()->GetCharacter()); + AEndlessVendettaCharacter* EV_Character = Cast(PlayersCharacter); + if ( IsValid(EV_Character) && IsValid(EV_Character->PrimaryWeaponActor)) ActorsToIgnore.Add(EV_Character->PrimaryWeaponActor); + if ( IsValid(EV_Character) && IsValid(EV_Character->SecondaryWeaponActor)) ActorsToIgnore.Add(EV_Character->SecondaryWeaponActor); + ActorsToIgnore.Add(PlayersCharacter); + TestLOS(PlayerCamComp->GetComponentTransform(), ActorsToIgnore); } @@ -75,7 +82,7 @@ void AVisionLink::TestLOS(FTransform StartingPos, TArray &ActorsToIgnor if (!GetWorld()->LineTraceSingleByChannel(outHit, StartingPos.GetLocation(), LT_EndPoint, ECC_Camera, QueryParams)) continue; AActor* HitActor = outHit.GetActor(); - if (!HitActor->ActorHasTag(FName("Enemy"))) continue; + if (!HitActor->ActorHasTag(FName("Enemy")) || HitActor->ActorHasTag("Dead")) continue; //DrawDebugLine(GetWorld(), outHit.TraceStart, outHit.ImpactPoint, FColor::Blue, false, 3, 0, 3); ActorsToIgnore.Add(HitActor); diff --git a/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetClasses/Recon/VisionLink/VisionLink.h b/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetClasses/Recon/VisionLink/VisionLink.h index 2a3b7789..40d5c103 100644 --- a/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetClasses/Recon/VisionLink/VisionLink.h +++ b/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetClasses/Recon/VisionLink/VisionLink.h @@ -3,7 +3,6 @@ #pragma once #include "CoreMinimal.h" -#include "VisionLinkEnemyLOSTest.h" #include "EndlessVendetta/GadgetSystem/ReconGadget.h" #include "VisionLink.generated.h" diff --git a/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetClasses/Recon/VisionLink/VisionLinkEnemyLOSTest.cpp b/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetClasses/Recon/VisionLink/VisionLinkEnemyLOSTest.cpp deleted file mode 100644 index eb11bf58..00000000 --- a/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetClasses/Recon/VisionLink/VisionLinkEnemyLOSTest.cpp +++ /dev/null @@ -1,74 +0,0 @@ -// Fill out your copyright notice in the Description page of Project Settings. - - -#include "VisionLinkEnemyLOSTest.h" - -#include "Components/BoxComponent.h" -#include "Kismet/KismetMathLibrary.h" - -// Sets default values -AVisionLinkEnemyLOSTest::AVisionLinkEnemyLOSTest() -{ - // 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; - -} - -// Called when the game starts or when spawned -void AVisionLinkEnemyLOSTest::BeginPlay() -{ - Super::BeginPlay(); - -} - -// Called every frame -void AVisionLinkEnemyLOSTest::Tick(float DeltaTime) -{ - Super::Tick(DeltaTime); - -} - -void AVisionLinkEnemyLOSTest::TestLOS(TArray EnemiesInLink, AActor* LOSActor) -{ - // Get all overlapping Actors - UBoxComponent* CollisionBox = Cast(GetComponentByClass(UBoxComponent::StaticClass())); - if (!IsValid(CollisionBox)) - { - Destroy(); - return; - } - TArray OverlappingEnemies; - CollisionBox->GetOverlappingActors(OverlappingEnemies); - if (OverlappingEnemies.IsEmpty()) - { - Destroy(); - return; - } - - for (int i = 0; i < OverlappingEnemies.Num(); i++) - { - // Overlapping Enemies Array should only contain enemies which aren't already in the link - if (!OverlappingEnemies[i]->ActorHasTag(FName("Enemy")) || EnemiesInLink.Contains(OverlappingEnemies[i]->GetUniqueID())) - { - UE_LOG(LogTemp, Warning, TEXT("enemy name: %s"), *OverlappingEnemies[i]->GetName()); - OverlappingEnemies.RemoveAt(i); - } - } - if (OverlappingEnemies.IsEmpty()) - { - Destroy(); - return; - } - - /*for (AActor* Enemy : OverlappingEnemies) - { - FRotator LookAtRotation = UKismetMathLibrary::FindLookAtRotation(LOSActor->GetActorLocation(), Enemy->GetActorLocation()); - UE_LOG(LogTemp, Warning, TEXT("Look at Rotation: %f"), LookAtRotation.Yaw); - }*/ - - Destroy(); - - -} - - diff --git a/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetClasses/Recon/VisionLink/VisionLinkEnemyLOSTest.h b/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetClasses/Recon/VisionLink/VisionLinkEnemyLOSTest.h deleted file mode 100644 index add35b97..00000000 --- a/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetClasses/Recon/VisionLink/VisionLinkEnemyLOSTest.h +++ /dev/null @@ -1,30 +0,0 @@ -// Fill out your copyright notice in the Description page of Project Settings. - -#pragma once - -#include "CoreMinimal.h" -#include "GameFramework/Actor.h" -#include "VisionLinkEnemyLOSTest.generated.h" - -UCLASS() -class ENDLESSVENDETTA_API AVisionLinkEnemyLOSTest : public AActor -{ - GENERATED_BODY() - - -protected: - // Called when the game starts or when spawned - virtual void BeginPlay() override; - -public: - UPROPERTY(EditDefaultsOnly, Category = "Vision Link") - float SpawnOffset = 0; - - // Sets default values for this actor's properties - AVisionLinkEnemyLOSTest(); - - // Called every frame - virtual void Tick(float DeltaTime) override; - - void TestLOS(TArray EnemiesInLink, AActor* LOS_Actor); -}; diff --git a/readme.md b/readme.md index aeaae7ea..43d60662 100644 --- a/readme.md +++ b/readme.md @@ -12,3 +12,11 @@ https://docs.google.com/presentation/d/18K_XKPOnZg56S7NocoEVEdA8lVHvtSVWkflCJFtD ## Endless Vendetta Script https://docs.google.com/document/d/1MvQ3F871koZ53Iz9kEm1RQPiGyirKYcUlOa3ygn4et8/edit?usp=sharing +## Storyboard +https://docs.google.com/presentation/d/19U0EaM-FMOQF1PJK32SKJUJZpXn9ee6TqFE8gCitA64/edit?usp=sharing + +## Asset List +https://docs.google.com/document/d/1Fdbr4cpkdt6jJFpZQmIbvP3FGk25JDIMfuRHyolwX_Y/edit?usp=sharing + +## Dialogue tree +https://drive.google.com/file/d/11lsDzHkY9VMklJm8PkwArHKXqH1wdvxN/view?usp=sharing