// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "Engine/DataAsset.h" #include "ItemDataAsset.generated.h" class UStaticMesh; class UTexture2D; /** * Definition d'un TYPE d'objet : "Bois", "Pomme", "Corde". * Un asset par type, cree dans le Content Browser, edite a la main. * * C'est l'equivalent exact d'un ScriptableObject Unity : une donnee partagee * que tout le monde reference et que personne ne duplique. Cent buches dans * le monde pointent toutes vers le meme UItemDataAsset "Bois". * * Regle a ne jamais enfreindre : ceci decrit ce qu'est un objet, jamais son * etat. La quantite, la durabilite, l'usure appartiennent a l'inventaire ou * a l'acteur, pas ici -- sinon ramasser une pomme modifierait toutes les * pommes du jeu. */ UCLASS(BlueprintType) class SURVIVAL_PROJET_API UItemDataAsset : public UPrimaryDataAsset { GENERATED_BODY() public: /** Identifiant stable, utilise par la sauvegarde et les recettes de craft. */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item") FName ItemId; /** Nom affiche au joueur. */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item") FText DisplayName; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item", meta = (MultiLine = "true")) FText Description; /** Icone affichee dans la grille d'inventaire. */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item") TObjectPtr Icon; /** Mesh utilise quand l'objet est pose au sol. */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item") TObjectPtr WorldMesh; /** * Nombre maximum d'exemplaires par slot. * 1 = ne s'empile pas (outils, armes), 20 = ressource classique. */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item", meta = (ClampMin = "1")) int32 MaxStackSize = 1; /** * Nombre d'utilisations avant que l'objet soit consomme. * 1 = objet a usage unique. 3 = une canette qu'on boit en trois gorgees. * * Les valeurs de restauration sont appliquees A CHAQUE utilisation, pas * reparties : une canette a 3 usages et 20 de soif rend 20 par gorgee. */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item", meta = (ClampMin = "1")) int32 MaxUses = 1; /** * Taille de pile reellement applicable. * * Un objet a charges ne s'empile jamais : deux canettes entamees a des * niveaux differents ne peuvent pas partager un slot, il faudrait stocker * deux compteurs dans une seule case. La regle est centralisee ici pour * qu'aucun appelant ne puisse l'oublier. */ UFUNCTION(BlueprintPure, Category = "Item") int32 GetEffectiveMaxStack() const { return MaxUses > 1 ? 1 : FMath::Max(1, MaxStackSize); } /** * Slots ajoutes a l'inventaire quand cet objet est equipe comme sac. * Laisse a 0 pour tout ce qui n'est pas un contenant. */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Sac", meta = (ClampMin = "0")) int32 BonusInventorySlots = 0; // ------------------------------------------------------------------ // Consommable // ------------------------------------------------------------------ /** Coche pour qu'un clic gauche consomme l'objet et applique ses effets. */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Consommable") bool bIsConsumable = false; /** Faim rendue a la consommation. */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Consommable", meta = (EditCondition = "bIsConsumable")) float HungerRestore = 0.f; /** Soif rendue. Une valeur negative deshydrate -- utile pour l'eau salee. */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Consommable", meta = (EditCondition = "bIsConsumable")) float ThirstRestore = 0.f; /** Vie rendue. Negative pour un aliment avarie ou toxique. */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Consommable", meta = (EditCondition = "bIsConsumable")) float HealthRestore = 0.f; };