Skip to content

Commit

Permalink
#248 WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
xthebat committed Apr 23, 2024
1 parent ac39c65 commit f0c2cd8
Show file tree
Hide file tree
Showing 12 changed files with 124 additions and 7 deletions.
Binary file modified Content/Characters/Common/Materials/M_CharacterBase.uasset
Binary file not shown.
Binary file modified Content/Maps/warmup.umap
Binary file not shown.
Binary file modified Content/Weapons/Common/Materials/M_WeaponSkinBase.uasset
Binary file not shown.
Binary file modified Content/Weapons/Rifle/ak47/Materials/MI_w_rifle_ak47_vulkan.uasset
Binary file not shown.
Binary file not shown.
17 changes: 16 additions & 1 deletion Source/Cloud9/Character/Cloud9Character.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ ACloud9Character::ACloud9Character(const FObjectInitializer& ObjectInitializer)

Score = 0;

// Activate ticking in order to update the cursor every frame.
// Activate ticking to update the cursor every frame.
PrimaryActorTick.bCanEverTick = true;
PrimaryActorTick.bStartWithTickEnabled = true;
}
Expand Down Expand Up @@ -410,6 +410,17 @@ void ACloud9Character::OnConstruction(const FTransform& Transform)
MyMesh->bAffectDynamicIndirectLighting = true;
MyMesh->SetCollisionProfileName(COLLISION_PROFILE_HITBOX);

MyMesh->GetMaterials()
| ETContainer::WithIndex{}
| ETContainer::Filter{[](let It) { return not Cast<UMaterialInstanceDynamic>(It.Value); }}
| ETContainer::ForEach{
[&MyMesh](let It)
{
let Dynamic = UMaterialInstanceDynamic::Create(It.Value, MyMesh);
MyMesh->SetMaterial(It.Key, Dynamic);
}
};

#ifdef USE_PHYSICAL_ASSET_HITBOX
// TODO: Make same hit boxes for all character's type - currently disabled
let PhysicsAsset = MyMesh->GetPhysicsAsset();
Expand Down Expand Up @@ -461,4 +472,8 @@ void ACloud9Character::Tick(float DeltaSeconds)
{
InventoryComponent->SelectOtherAvailableWeapon(false);
}

Effects
| ETContainer::Filter{[&](let It) { return It->Elapsed(this, DeltaSeconds); }}
| ETContainer::ForEach{[&](let It) { It->Remove(this); }};
}
4 changes: 4 additions & 0 deletions Source/Cloud9/Character/Cloud9Character.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@

#include "Cloud9Character.generated.h"

class UCloud9CharacterEffect;
class UWidgetInteractionComponent;
class ACloud9PlayerController;
class UCloud9InventoryComponent;
Expand Down Expand Up @@ -200,6 +201,9 @@ class ACloud9Character : public ACharacter
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Utility, meta=(AllowPrivateAccess))
UWidgetInteractionComponent* WidgetInteractionComponent;

UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Effects, meta=(AllowPrivateAccess))
TArray<UCloud9CharacterEffect*> Effects;

/** Current number of frags made by character */
UPROPERTY(BlueprintReadOnly, Category=State, meta=(AllowPrivateAccess))
int Score;
Expand Down
3 changes: 3 additions & 0 deletions Source/Cloud9/Character/Effects/Cloud9CharacterEffect.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,7 @@ class CLOUD9_API ICloud9CharacterEffect

UFUNCTION(BlueprintCallable, BlueprintNativeEvent)
bool Remove(ACloud9Character* Character);

UFUNCTION(BlueprintCallable, BlueprintNativeEvent)
bool Elapsed(ACloud9Character* Character, float DeltaSeconds);
};
29 changes: 23 additions & 6 deletions Source/Cloud9/Character/Effects/Cloud9CharacterShieldEffect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,44 @@
#include "Cloud9/Character/Cloud9Character.h"
#include "Cloud9/Tools/Extensions/TContainer.h"

const FName UCloud9CharacterShieldEffect::ShieldEnableName = TEXT("Shield Enabled");

UCloud9CharacterShieldEffect::UCloud9CharacterShieldEffect() {}

UCloud9CharacterShieldEffect::UCloud9CharacterShieldEffect()
{
EffectTime = -1.0f;
}

void UCloud9CharacterShieldEffect::BeginPlay()
{
Super::BeginPlay();
}

bool UCloud9CharacterShieldEffect::Apply_Implementation(ACloud9Character* Character)
bool UCloud9CharacterShieldEffect::ToggleEffect(const ACloud9Character* Character, bool IsEnabled) const
{
if (let Mesh = Character->GetMesh(); IsValid(Mesh))
{
let Materials = Mesh->GetMaterials();
let Dynamic = Cast<UMaterialInstanceDynamic>(Mesh->GetMaterial(0));
Mesh->GetMaterials()
| ETContainer::Transform{[](let It) { return Cast<UMaterialInstanceDynamic>(It); }}
| ETContainer::Filter{[](let It) { return IsValid(It); }}
| ETContainer::ForEach{
[IsEnabled](let It) { It->SetScalarParameterValue(ShieldEnableName, IsEnabled); }
};
}

return true;
}

bool UCloud9CharacterShieldEffect::Apply_Implementation(ACloud9Character* Character)
{
return ToggleEffect(Character, true);
}

bool UCloud9CharacterShieldEffect::Remove_Implementation(ACloud9Character* Character)
{
return true;
return ToggleEffect(Character, false);
}

bool UCloud9CharacterShieldEffect::Elapsed_Implementation(ACloud9Character* Character, float DeltaSeconds)
{
return false;
}
10 changes: 10 additions & 0 deletions Source/Cloud9/Character/Effects/Cloud9CharacterShieldEffect.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,22 @@ class CLOUD9_API UCloud9CharacterShieldEffect : public UActorComponent, public I
GENERATED_BODY()

public:
static const FName ShieldEnableName;

UCloud9CharacterShieldEffect();

protected:
UPROPERTY()
float EffectTime;

protected:
virtual void BeginPlay() override;

bool ToggleEffect(const ACloud9Character* Character, bool IsEnabled) const;

virtual bool Apply_Implementation(ACloud9Character* Character) override;

virtual bool Remove_Implementation(ACloud9Character* Character) override;

virtual bool Elapsed_Implementation(ACloud9Character* Character, float DeltaSeconds) override;
};
20 changes: 20 additions & 0 deletions Source/Cloud9/Tests/Unit/Tools/TestContainer.spec.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,26 @@ void FRangeSpec::Define()
}
});

It("WithIndex", [=]
{
{
using FItem = TPair<int, int>;

let Expected = TArray{
FItem{0, 1},
FItem{1, 2},
FItem{2, 3},
FItem{3, 4},
FItem{4, 5}
};

let Result = Container
| ETContainer::WithIndex{}
| ETContainer::ToArray{};
TestEqual("Result == {{0, 1}, {1, 2}, ...}", Result, Expected);
}
});

It("ArrayOf", [=]
{
{
Expand Down
48 changes: 48 additions & 0 deletions Source/Cloud9/Tools/Extensions/TContainer.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,9 @@ namespace Private_ETContainer
template <typename OperatorType, typename ContainerType>
struct TIndexesIterator;

template <typename OperatorType, typename ContainerType>
struct TWithIndexIterator;

template <typename OperatorType, typename ContainerType>
struct TTransformIterator;

Expand Down Expand Up @@ -177,6 +180,11 @@ namespace ETContainer
SEQUENCE_OPERATOR_BODY(Indexes, Private_ETContainer::TIndexesIterator)
};

struct WithIndex
{
SEQUENCE_OPERATOR_BODY(WithIndex, Private_ETContainer::TWithIndexIterator)
};

template <typename InOperationType>
struct Transform
{
Expand Down Expand Up @@ -384,6 +392,46 @@ namespace Private_ETContainer
ElementType Index = 0;
};

template <typename OperatorType, typename ContainerType>
struct TWithIndexIterator
{
using ElementType = TTuple<int, typename TDecay<ContainerType>::Type::ElementType>;

constexpr TWithIndexIterator(ContainerType&& Container, OperatorType&& Operator)
: Container(Container)
, Iterator(Container.CreateConstIterator())
, Operator(Operator) {}

// ReSharper disable once CppMemberFunctionMayBeStatic
constexpr void Initialize() {}

constexpr TWithIndexIterator& operator++()
{
++Index;
++Iterator;
return *this;
}

constexpr const ElementType& operator*()
{
Cache = ElementType{Index, *Iterator};
return *Cache;
}

constexpr explicit operator bool() const { return not Iterator; }

private:
using IteratorType = typename TDecay<ContainerType>::Type::TConstIterator;

ContainerType Container;
IteratorType Iterator;
OperatorType Operator;

int Index = 0;

TOptional<ElementType> Cache;
};

template <typename OperatorType, typename ContainerType>
struct TTransformIterator
{
Expand Down

0 comments on commit f0c2cd8

Please sign in to comment.