// Copyright ExByte Studios. Item Interaction Ecosystem. #pragma once #include "CoreMinimal.h" #include "Engine/DataTable.h" #include "GameplayTagContainer.h" #include "ItemEnums.h" #include "ItemAuxiliaryRows.generated.h" /** * DT_ItemProperties row (section 6.2): default runtime property for an item. * Multiple rows share one ItemId, so the row name is arbitrary - the database * indexes these by ItemId. */ USTRUCT(BlueprintType) struct ITEMDATABASE_API FItemPropertyRow : public FTableRowBase { GENERATED_BODY() UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Property") FName ItemId; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Property") FGameplayTag PropertyTag; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Property") float DefaultValue = 0.f; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Property") float Min = 0.f; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Property") float Max = 1.f; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Property") EItemPropertyReplicationPolicy ReplicationPolicy = EItemPropertyReplicationPolicy::OwnerOnly; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Property") bool bSave = true; }; /** * DT_ItemFeatures row (section 6.3): one tunable parameter of a feature. * e.g. raw_meat | Rotting | DecayRatePerHour | 0.08 * Value is stored as text so it can carry floats, ints or item ids uniformly. */ USTRUCT(BlueprintType) struct ITEMDATABASE_API FItemFeatureRow : public FTableRowBase { GENERATED_BODY() UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Feature") FName ItemId; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Feature") FGameplayTag Feature; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Feature") FName Param; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Feature") FString Value; float GetFloat(float Fallback = 0.f) const { return Value.IsNumeric() ? FCString::Atof(*Value) : Fallback; } int32 GetInt(int32 Fallback = 0) const { return Value.IsNumeric() ? FCString::Atoi(*Value) : Fallback; } }; /** * DT_ItemInteractions row (section 6.4): a data-driven interaction option. * The interaction resolver turns matching rows into FInteractionOptions. */ USTRUCT(BlueprintType) struct ITEMDATABASE_API FItemInteractionRow : public FTableRowBase { GENERATED_BODY() UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Interaction") FName ItemId; /** Context filter, e.g. "World", "Inventory", "Held+Vehicle", "Held+Generator". */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Interaction") FName Context; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Interaction") FGameplayTag ActionTag; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Interaction") EItemInteractionMode InteractionMode = EItemInteractionMode::None; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Interaction") int32 Priority = 0; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Interaction") bool bRequiresHold = false; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Interaction") float HoldDuration = 0.f; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Interaction") float ActionDuration = 0.f; /** Free-form requirement expression resolved by the requirement system (section 18). */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Interaction") FString Requirement; /** Result verb, e.g. AddToInventory / HoldWorldItem / InstallIntoSlot / TransferFuel. */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Interaction") FName Result; }; /** DT_ItemRedirects row (section 26.1): maps a retired ItemId to its replacement. */ USTRUCT(BlueprintType) struct ITEMDATABASE_API FItemRedirectRow : public FTableRowBase { GENERATED_BODY() UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Redirect") FName OldItemId; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Redirect") FName NewItemId; };