This commit is contained in:
2026-05-24 20:50:34 +03:00
parent 321683941e
commit 799fc8a4ae
25 changed files with 266 additions and 218 deletions
+42 -8
View File
@@ -6,10 +6,47 @@
#include "BodyPart.h" #include "BodyPart.h"
#include "ClothingSlotType.h" #include "ClothingSlotType.h"
#include "Engine/DataAsset.h" #include "Engine/DataAsset.h"
#include "NakedDesire/Player/PrivateBodyPartType.h"
#include "NakedDesire/Progression/ProgressionPath.h" #include "NakedDesire/Progression/ProgressionPath.h"
#include "ClothingItem.generated.h" #include "ClothingItem.generated.h"
USTRUCT(BlueprintType)
struct NAKEDDESIRE_API FBodyPartCoverage
{
GENERATED_BODY()
UPROPERTY()
float Coverage = 1.0f;
UPROPERTY()
EBodyPart BodyPart = EBodyPart::Ass;
};
UENUM(BlueprintType)
enum class ERestrictionType : uint8
{
BlockRun = 0,
BlockCrouch = 1,
BlockPhoneUsage = 2,
BlockItemPickup = 3,
BlockMasturbate = 4,
BlockBoobsExpose = 5,
BlockVaginaExpose = 6,
BlockAnalExpose = 7,
BlockSlotChange = 8,
};
USTRUCT(BlueprintType)
struct NAKEDDESIRE_API FClothingRestriction
{
GENERATED_BODY()
UPROPERTY()
ERestrictionType RestrictionType = ERestrictionType::BlockRun;
UPROPERTY()
EClothingSlotType AffectedSlot = EClothingSlotType::Anal;
};
UENUM(BlueprintType) UENUM(BlueprintType)
enum class EGarmentContainerSlotType : uint8 enum class EGarmentContainerSlotType : uint8
{ {
@@ -58,9 +95,9 @@ public:
int BasePrice; int BasePrice;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
TArray<EPrivateBodyPartType> CoveredBodyParts; // TODO: Add coverage per body part TArray<FBodyPartCoverage> CoveredBodyParts;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta = (EditCondition = "SlotType == EClothingSlotType::Shoes", Category = "Shoes")) UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta = (EditCondition = "SlotType == EClothingSlotType::Footwear", Category = "Shoes"))
float ShoesOffset = 0.0f; float ShoesOffset = 0.0f;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
@@ -72,15 +109,12 @@ public:
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
TArray<EBodyPart> CanExpose; TArray<EBodyPart> CanExpose;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
bool IsRestrictive;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
float Coverage = 1.0f; float Coverage = 1.0f;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
bool IsUnderwear; TArray<FGarmentContainerSlot> ContainerSlots;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
TArray<FGarmentContainerSlot> ContainerSlots; TArray<FClothingRestriction> Restrictions;
}; };
@@ -11,11 +11,11 @@ UClothingManager::UClothingManager()
PrimaryComponentTick.bCanEverTick = false; PrimaryComponentTick.bCanEverTick = false;
} }
bool UClothingManager::IsBodyTypeExposed(const EPrivateBodyPartType PrivateBodyPartType) bool UClothingManager::IsBodyTypeExposed(const EBodyPart BodyPart)
{ {
for (const auto& ClothingSlot : ClothingSlots) for (const auto& ClothingSlot : ClothingSlots)
{ {
if (ClothingSlot.ClothingItemInstance && ClothingSlot.ClothingItemInstance->GetClothingItem()->CoveredBodyParts.Contains(PrivateBodyPartType)) if (ClothingSlot.ClothingItemInstance) // TODO: Add covered body part resolution
{ {
return false; return false;
} }
@@ -74,7 +74,7 @@ void UClothingManager::HydrateClothing(UGlobalSaveGameData* SaveGameData)
float UClothingManager::GetHeelHeight() float UClothingManager::GetHeelHeight()
{ {
if (FClothingSlotData ClothingSlotData; GetClothingSlotData(EClothingSlotType::Shoes, ClothingSlotData)) if (FClothingSlotData ClothingSlotData; GetClothingSlotData(EClothingSlotType::Footwear, ClothingSlotData))
{ {
if (ClothingSlotData.ClothingItemInstance) if (ClothingSlotData.ClothingItemInstance)
{ {
@@ -173,5 +173,5 @@ bool UClothingManager::IsClothingTypeOn(const EClothingSlotType ClothingType)
bool UClothingManager::IsPartiallyNaked() bool UClothingManager::IsPartiallyNaked()
{ {
return IsBodyTypeExposed(EPrivateBodyPartType::BackBottom) || IsBodyTypeExposed(EPrivateBodyPartType::FrontBottom) || IsBodyTypeExposed(EPrivateBodyPartType::FrontTop); return IsBodyTypeExposed(EBodyPart::Ass) || IsBodyTypeExposed(EBodyPart::Genitals) || IsBodyTypeExposed(EBodyPart::Boobs);
} }
@@ -3,13 +3,11 @@
#pragma once #pragma once
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "BodyPart.h"
#include "ClothingSlotData.h" #include "ClothingSlotData.h"
#include "Components/ActorComponent.h" #include "Components/ActorComponent.h"
#include "NakedDesire/Player/PrivateBodyPartType.h"
#include "ClothingManager.generated.h" #include "ClothingManager.generated.h"
// TODO: Check clothing colors
class UGlobalSaveGameData; class UGlobalSaveGameData;
class AClothingPickup; class AClothingPickup;
class UClothingItemInstance; class UClothingItemInstance;
@@ -53,7 +51,7 @@ public:
bool IsPartiallyNaked(); bool IsPartiallyNaked();
UFUNCTION(BlueprintCallable) UFUNCTION(BlueprintCallable)
bool IsBodyTypeExposed(EPrivateBodyPartType PrivateBodyPartType); bool IsBodyTypeExposed(EBodyPart BodyPart);
UFUNCTION(BlueprintCallable) UFUNCTION(BlueprintCallable)
void TakeClothing(UClothingItemInstance* ClothingItemInstance); void TakeClothing(UClothingItemInstance* ClothingItemInstance);
+11 -7
View File
@@ -7,18 +7,22 @@
UENUM(BlueprintType) UENUM(BlueprintType)
enum class EClothingSlotType : uint8 enum class EClothingSlotType : uint8
{ {
Nipples, Nipples UMETA(ToolTip = "Sex Toy slot only"),
Anal, Anal UMETA(ToolTip = "Sex Toy slot only"),
Vagina, Vagina UMETA(ToolTip = "Sex Toy slot only"),
Head, Head,
Neck, Neck,
Face, Face,
Eyes, Eyes,
Body, BodySuit,
Top, Top,
Bottom, Bottom,
Bra, UnderwearTop,
Panties, UnderwearBottom,
Socks, Socks,
Shoes, Footwear,
Outerwear,
WristRestraint,
AnkleRestraint,
NeckRestraint,
}; };
@@ -9,6 +9,7 @@
#include "NakedDesire/MissionBuilder/MissionsConfig.h" #include "NakedDesire/MissionBuilder/MissionsConfig.h"
#include "NakedDesire/MissionBuilder/MissionsManager.h" #include "NakedDesire/MissionBuilder/MissionsManager.h"
#include "NakedDesire/Player/NakedDesireCharacter.h" #include "NakedDesire/Player/NakedDesireCharacter.h"
#include "NakedDesire/SaveGame/GlobalSaveGameData.h"
void ANakedDesireGameMode::RestartGame() void ANakedDesireGameMode::RestartGame()
{ {
@@ -22,18 +23,19 @@ AWardrobe* ANakedDesireGameMode::GetWardrobe() const
void ANakedDesireGameMode::BuyItem(UClothingItemInstance* ClothingItemInstance) void ANakedDesireGameMode::BuyItem(UClothingItemInstance* ClothingItemInstance)
{ {
ANakedDesireCharacter* Player = Cast<ANakedDesireCharacter>(UGameplayStatics::GetPlayerCharacter(GetWorld(), 0)); UGlobalSaveGameData* SaveGame = UGlobalSaveGameData::LoadGame();
if (!Player) if (!SaveGame)
{
UE_LOG(LogTemp, Error, TEXT("ANakedDesireGameMode::BuyItem Couldn't load save game"));
return;
}
if (SaveGame->Money < ClothingItemInstance->GetClothingItem()->BasePrice)
{ {
return; return;
} }
if (Player->Money < ClothingItemInstance->GetClothingItem()->BasePrice) SaveGame->Money -= ClothingItemInstance->GetClothingItem()->BasePrice;
{
return;
}
Player->Money -= ClothingItemInstance->GetClothingItem()->BasePrice;
Wardrobe->ClothingItems.Add(ClothingItemInstance); Wardrobe->ClothingItems.Add(ClothingItemInstance);
} }
-16
View File
@@ -1,16 +0,0 @@
// © 2025 Naked People Team. All Rights Reserved.
#include "Utils.h"
#include "Constants.h"
FString UUtils::GetSlotName()
{
return SLOT_NAME;
}
int UUtils::GetSlotPlayer()
{
return SLOT_PLAYER;
}
-23
View File
@@ -1,23 +0,0 @@
// © 2025 Naked People Team. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "Utils.generated.h"
/**
*
*/
UCLASS()
class NAKEDDESIRE_API UUtils : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, BlueprintPure)
static FString GetSlotName();
UFUNCTION(BlueprintCallable, BlueprintPure)
static int GetSlotPlayer();
};
@@ -0,0 +1 @@
#include "SexToyInstance.h"
+20
View File
@@ -0,0 +1,20 @@
#pragma once
#include "CoreMinimal.h"
#include "ItemInstance.h"
#include "SexToyInstance.generated.h"
class USexToyItem;
UCLASS()
class NAKEDDESIRE_API USexToyInstance : public UItemInstance
{
GENERATED_BODY()
public:
USexToyItem* GetSexToyItem() const { return SexToyItem; }
private:
UPROPERTY()
TObjectPtr<USexToyItem> SexToyItem;
};
+1
View File
@@ -0,0 +1 @@
#include "SexToyItem.h"
+28
View File
@@ -0,0 +1,28 @@
#pragma once
#include "CoreMinimal.h"
#include "Engine/DataAsset.h"
#include "NakedDesire/Clothing/ClothingSlotType.h"
#include "SexToyItem.generated.h"
UCLASS()
class NAKEDDESIRE_API USexToyItem : public UPrimaryDataAsset
{
GENERATED_BODY()
public:
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Sed Toy")
float LustModifier = 0.0f;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Sed Toy")
float EmbarrassmentModifier = 0.0f;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Sed Toy")
float PulseModifier = 0.0f;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Sed Toy")
bool HasVibration = false;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Sed Toy")
EClothingSlotType SlotType = EClothingSlotType::Anal;
};
@@ -27,7 +27,23 @@ void UFlashGoal::Complete()
FText UFlashGoal::GetDescription() const FText UFlashGoal::GetDescription() const
{ {
const FText BodyTypeString = UPrivateBodyPartType::GetString(BodyType); FText BodyTypeString;
switch (BodyType)
{
case EBodyPart::Ass:
BodyTypeString = FText::FromString("Ass");
break;
case EBodyPart::Boobs:
BodyTypeString = FText::FromString("Boobs");
break;
case EBodyPart::Genitals:
BodyTypeString = FText::FromString("Genitals");
break;
default:
BodyTypeString = FText::FromString("None");
break;
}
if (RequiredFlashCount == 1) if (RequiredFlashCount == 1)
{ {
@@ -3,8 +3,8 @@
#pragma once #pragma once
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "NakedDesire/Clothing/BodyPart.h"
#include "NakedDesire/MissionBuilder/MissionGoal.h" #include "NakedDesire/MissionBuilder/MissionGoal.h"
#include "NakedDesire/Player/PrivateBodyPartType.h"
#include "FlashGoal.generated.h" #include "FlashGoal.generated.h"
class ANPCAIController; class ANPCAIController;
@@ -20,7 +20,7 @@ class NAKEDDESIRE_API UFlashGoal : public UMissionGoal
int RequiredFlashCount = 1; int RequiredFlashCount = 1;
UPROPERTY(EditDefaultsOnly) UPROPERTY(EditDefaultsOnly)
EPrivateBodyPartType BodyType; EBodyPart BodyType;
FDelegateHandle PlayerNoticedHandle; FDelegateHandle PlayerNoticedHandle;
@@ -32,24 +32,6 @@ void UMissionsManager::CompleteMission(UMission* Mission)
OnMissionCompleted.Broadcast(Mission); OnMissionCompleted.Broadcast(Mission);
} }
void UMissionsManager::CollectRewards()
{
if (CompletedMissions.IsEmpty())
{
return;
}
int TotalReward = 0;
for (const UMission* Mission : CompletedMissions)
{
TotalReward += Mission->GetMoneyReward();
}
Player->Money += TotalReward;
CompletedMissions.Empty();
OnRewardsCollected.Broadcast(TotalReward);
}
void UMissionsManager::RefreshDailyMissions(const TArray<UMission*>& NewMissions) void UMissionsManager::RefreshDailyMissions(const TArray<UMission*>& NewMissions)
{ {
for (UMission* Mission : AvailableMissions) for (UMission* Mission : AvailableMissions)
@@ -37,13 +37,9 @@ public:
FOnRewardsCollected OnRewardsCollected; FOnRewardsCollected OnRewardsCollected;
void CompleteMission(UMission* Mission); void CompleteMission(UMission* Mission);
UFUNCTION(BlueprintCallable)
void CollectRewards();
UFUNCTION() UFUNCTION()
void RefreshDailyMissions(const TArray<UMission*>& NewMissions); void RefreshDailyMissions(const TArray<UMission*>& NewMissions);
protected:
virtual void BeginPlay() override; virtual void BeginPlay() override;
}; };
@@ -32,18 +32,33 @@ void UExposeBodyPartRestriction::Stop()
FText UExposeBodyPartRestriction::GetDescription() const FText UExposeBodyPartRestriction::GetDescription() const
{ {
FText Part = UPrivateBodyPartType::GetString(BodyPart); FText BodyPartString;
switch (BodyPart)
{
case EBodyPart::Ass:
BodyPartString = FText::FromString("Ass");
break;
case EBodyPart::Boobs:
BodyPartString = FText::FromString("Boobs");
break;
case EBodyPart::Genitals:
BodyPartString = FText::FromString("Genitals");
break;
default:
BodyPartString = FText::FromString("None");
break;
}
return FText::Format(RestrictionsExposeBodyPartDescription, return FText::Format(RestrictionsExposeBodyPartDescription,
FFormatNamedArguments FFormatNamedArguments
{ {
{TEXT("BodyPart"), Part} {TEXT("BodyPart"), BodyPartString}
}); });
} }
void UExposeBodyPartRestriction::EquipClothing(const UClothingItemInstance* ClothingItemInstance) void UExposeBodyPartRestriction::EquipClothing(const UClothingItemInstance* ClothingItemInstance)
{ {
if (IsSuccess && ClothingItemInstance->GetClothingItem()->CoveredBodyParts.Contains(BodyPart)) if (IsSuccess) // TODO: Add covered body part resolution
{ {
Init(Player); Init(Player);
} }
@@ -68,7 +83,7 @@ void UExposeBodyPartRestriction::CheckClothing()
{ {
if (ClothingSlot.ClothingItemInstance) if (ClothingSlot.ClothingItemInstance)
{ {
return ClothingSlot.ClothingItemInstance->GetClothingItem()->CoveredBodyParts.Contains(BodyPart); return true; // TODO: Add exposed body part resolution
} }
return false; return false;
@@ -3,7 +3,7 @@
#pragma once #pragma once
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "NakedDesire/Player/PrivateBodyPartType.h" #include "NakedDesire/Clothing/BodyPart.h"
#include "NakedDesire/MissionBuilder/GoalRestriction.h" #include "NakedDesire/MissionBuilder/GoalRestriction.h"
#include "ExposeBodyPartRestriction.generated.h" #include "ExposeBodyPartRestriction.generated.h"
@@ -18,7 +18,7 @@ class NAKEDDESIRE_API UExposeBodyPartRestriction : public UGoalRestriction
FDelegateHandle UnequipClothingHandle; FDelegateHandle UnequipClothingHandle;
UPROPERTY(EditDefaultsOnly) UPROPERTY(EditDefaultsOnly)
EPrivateBodyPartType BodyPart; EBodyPart BodyPart;
protected: protected:
virtual void Init(ANakedDesireCharacter* PlayerCharacter) override; virtual void Init(ANakedDesireCharacter* PlayerCharacter) override;
@@ -51,29 +51,37 @@ ANakedDesireCharacter::ANakedDesireCharacter()
FaceMeshComponent->SetupAttachment(GetMesh()); FaceMeshComponent->SetupAttachment(GetMesh());
EyesMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Eyes"); EyesMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Eyes");
EyesMeshComponent->SetupAttachment(GetMesh()); EyesMeshComponent->SetupAttachment(GetMesh());
BodyMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Body"); BodySuitMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Body Suit");
BodyMeshComponent->SetupAttachment(GetMesh()); BodySuitMeshComponent->SetupAttachment(GetMesh());
TopMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Top"); TopMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Top");
TopMeshComponent->SetupAttachment(GetMesh()); TopMeshComponent->SetupAttachment(GetMesh());
BottomMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Bottom"); BottomMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Bottom");
BottomMeshComponent->SetupAttachment(GetMesh()); BottomMeshComponent->SetupAttachment(GetMesh());
BraMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Bra"); UnderwearTopMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Underwear Top");
BraMeshComponent->SetupAttachment(GetMesh()); UnderwearTopMeshComponent->SetupAttachment(GetMesh());
PantiesMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Panties"); UnderwearBottomMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Underwear Bottom");
PantiesMeshComponent->SetupAttachment(GetMesh()); UnderwearBottomMeshComponent->SetupAttachment(GetMesh());
SocksMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Socks"); SocksMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Socks");
SocksMeshComponent->SetupAttachment(GetMesh()); SocksMeshComponent->SetupAttachment(GetMesh());
ShoesMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Shoes"); FootwearMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Footwear");
ShoesMeshComponent->SetupAttachment(GetMesh()); FootwearMeshComponent->SetupAttachment(GetMesh());
OuterwearMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Outerwear");
OuterwearMeshComponent->SetupAttachment(GetMesh());
WristRestraintMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Wrist Restraint");
WristRestraintMeshComponent->SetupAttachment(GetMesh());
AnkleRestraintMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Ankle Restraint");
AnkleRestraintMeshComponent->SetupAttachment(GetMesh());
NeckRestraintMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Neck Restraint");
NeckRestraintMeshComponent->SetupAttachment(GetMesh());
BoobLCensorship = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Boob L Censorship")); BoobLCensorship = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Boob L Censorship"));
BoobLCensorship->SetupAttachment(GetMesh(), FName(TEXT("boob_l"))); BoobLCensorship->SetupAttachment(GetMesh(), FName(TEXT("boob_l")));
BoobRCensorship = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Boob R Censorship")); BoobRCensorship = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Boob R Censorship"));
BoobRCensorship->SetupAttachment(GetMesh(), FName(TEXT("boob_r"))); BoobRCensorship->SetupAttachment(GetMesh(), FName(TEXT("boob_r")));
FrontBottomCensorship = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Front Bottom Censorship")); VaginaCensorship = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Vagina Censorship"));
FrontBottomCensorship->SetupAttachment(GetMesh(), FName(TEXT("pelvis"))); VaginaCensorship->SetupAttachment(GetMesh(), FName(TEXT("pelvis")));
BackBottomCensorship = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Back Bottom Censorship")); AnalCensorship = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Anal Censorship"));
BackBottomCensorship->SetupAttachment(GetMesh(), FName(TEXT("pelvis"))); AnalCensorship->SetupAttachment(GetMesh(), FName(TEXT("pelvis")));
StimuliSourceComponent = CreateDefaultSubobject<UAIPerceptionStimuliSourceComponent>(TEXT("Stimuli Source Component")); StimuliSourceComponent = CreateDefaultSubobject<UAIPerceptionStimuliSourceComponent>(TEXT("Stimuli Source Component"));
} }
@@ -176,7 +184,7 @@ UAISense_Sight::EVisibilityResult ANakedDesireCharacter::CanBeSeenFrom(const FCa
FHitResult PelvisHitResult; FHitResult PelvisHitResult;
const bool PelvisHit = CheckSight(StartLocation, PelvisBoneLocation, PelvisHitResult, Context.IgnoreActor); const bool PelvisHit = CheckSight(StartLocation, PelvisBoneLocation, PelvisHitResult, Context.IgnoreActor);
if ((!BoobsHit || BoobsHitResult.GetActor() == this) && ClothingManager->IsBodyTypeExposed(EPrivateBodyPartType::FrontTop)) if ((!BoobsHit || BoobsHitResult.GetActor() == this) && ClothingManager->IsBodyTypeExposed(EBodyPart::Boobs))
{ {
UE_LOG(LogTemp, Warning, TEXT("Boobs hit")); UE_LOG(LogTemp, Warning, TEXT("Boobs hit"));
OutSeenLocation = BoobsBoneLocation; OutSeenLocation = BoobsBoneLocation;
@@ -185,7 +193,7 @@ UAISense_Sight::EVisibilityResult ANakedDesireCharacter::CanBeSeenFrom(const FCa
} }
if ((!PelvisHit || PelvisHitResult.GetActor() == this) && if ((!PelvisHit || PelvisHitResult.GetActor() == this) &&
(ClothingManager->IsBodyTypeExposed(EPrivateBodyPartType::BackBottom) || ClothingManager->IsBodyTypeExposed(EPrivateBodyPartType::FrontBottom))) (ClothingManager->IsBodyTypeExposed(EBodyPart::Ass) || ClothingManager->IsBodyTypeExposed(EBodyPart::Genitals)))
{ {
UE_LOG(LogTemp, Warning, TEXT("Pelvis hit")); UE_LOG(LogTemp, Warning, TEXT("Pelvis hit"));
OutSeenLocation = PelvisBoneLocation; OutSeenLocation = PelvisBoneLocation;
@@ -250,19 +258,20 @@ void ANakedDesireCharacter::OnEndOverlap(UPrimitiveComponent* OverlappedComponen
void ANakedDesireCharacter::OnClothingEquip(const UClothingItemInstance* ClothingItemInstance) void ANakedDesireCharacter::OnClothingEquip(const UClothingItemInstance* ClothingItemInstance)
{ {
if (ClothingItemInstance->GetClothingItem()->CoveredBodyParts.Contains(EPrivateBodyPartType::BackBottom)) // TODO: Add covered body part resolution
{ // if (ClothingItemInstance->GetClothingItem()->CoveredBodyParts.Contains(EBodyPart::Ass))
BackBottomCensorship->SetVisibility(false); // {
} // AnalCensorship->SetVisibility(false);
if (ClothingItemInstance->GetClothingItem()->CoveredBodyParts.Contains(EPrivateBodyPartType::FrontBottom)) // }
{ // if (ClothingItemInstance->GetClothingItem()->CoveredBodyParts.Contains(EBodyPart::Genitals))
FrontBottomCensorship->SetVisibility(false); // {
} // VaginaCensorship->SetVisibility(false);
if (ClothingItemInstance->GetClothingItem()->CoveredBodyParts.Contains(EPrivateBodyPartType::FrontTop)) // }
{ // if (ClothingItemInstance->GetClothingItem()->CoveredBodyParts.Contains(EBodyPart::Boobs))
BoobLCensorship->SetVisibility(false); // {
BoobRCensorship->SetVisibility(false); // BoobLCensorship->SetVisibility(false);
} // BoobRCensorship->SetVisibility(false);
// }
} }
void ANakedDesireCharacter::OnClothingUnequip(const UClothingItemInstance* ClothingItemInstance) void ANakedDesireCharacter::OnClothingUnequip(const UClothingItemInstance* ClothingItemInstance)
@@ -270,15 +279,15 @@ void ANakedDesireCharacter::OnClothingUnequip(const UClothingItemInstance* Cloth
if (!UNakedDesireUserSettings::GetNakedDesireUserSettings()->GetIsCensorshipEnabled() && !IS_DEMO) if (!UNakedDesireUserSettings::GetNakedDesireUserSettings()->GetIsCensorshipEnabled() && !IS_DEMO)
return; return;
if (ClothingManager->IsBodyTypeExposed(EPrivateBodyPartType::BackBottom)) if (ClothingManager->IsBodyTypeExposed(EBodyPart::Ass))
{ {
BackBottomCensorship->SetVisibility(true); AnalCensorship->SetVisibility(true);
} }
if (ClothingManager->IsBodyTypeExposed(EPrivateBodyPartType::FrontBottom)) if (ClothingManager->IsBodyTypeExposed(EBodyPart::Genitals))
{ {
FrontBottomCensorship->SetVisibility(true); VaginaCensorship->SetVisibility(true);
} }
if (ClothingManager->IsBodyTypeExposed(EPrivateBodyPartType::FrontTop)) if (ClothingManager->IsBodyTypeExposed(EBodyPart::Boobs))
{ {
BoobLCensorship->SetVisibility(true); BoobLCensorship->SetVisibility(true);
BoobRCensorship->SetVisibility(true); BoobRCensorship->SetVisibility(true);
@@ -289,15 +298,15 @@ void ANakedDesireCharacter::OnSettingsChanged(UNakedDesireUserSettings* Settings
{ {
if (Settings->GetIsCensorshipEnabled()) if (Settings->GetIsCensorshipEnabled())
{ {
if (ClothingManager->IsBodyTypeExposed(EPrivateBodyPartType::BackBottom)) if (ClothingManager->IsBodyTypeExposed(EBodyPart::Ass))
{ {
BackBottomCensorship->SetVisibility(true); AnalCensorship->SetVisibility(true);
} }
if (ClothingManager->IsBodyTypeExposed(EPrivateBodyPartType::FrontBottom)) if (ClothingManager->IsBodyTypeExposed(EBodyPart::Genitals))
{ {
FrontBottomCensorship->SetVisibility(true); VaginaCensorship->SetVisibility(true);
} }
if (ClothingManager->IsBodyTypeExposed(EPrivateBodyPartType::FrontTop)) if (ClothingManager->IsBodyTypeExposed(EBodyPart::Boobs))
{ {
BoobLCensorship->SetVisibility(true); BoobLCensorship->SetVisibility(true);
BoobRCensorship->SetVisibility(true); BoobRCensorship->SetVisibility(true);
@@ -305,8 +314,8 @@ void ANakedDesireCharacter::OnSettingsChanged(UNakedDesireUserSettings* Settings
} }
else if (!IS_DEMO) else if (!IS_DEMO)
{ {
BackBottomCensorship->SetVisibility(false); AnalCensorship->SetVisibility(false);
FrontBottomCensorship->SetVisibility(false); VaginaCensorship->SetVisibility(false);
BoobLCensorship->SetVisibility(false); BoobLCensorship->SetVisibility(false);
BoobRCensorship->SetVisibility(false); BoobRCensorship->SetVisibility(false);
} }
@@ -395,9 +404,9 @@ void ANakedDesireCharacter::SetupClothingSlots()
LOCTEXT("Eyes", "Eyes"))); LOCTEXT("Eyes", "Eyes")));
ClothingManager->ClothingSlots.Add( ClothingManager->ClothingSlots.Add(
FClothingSlotData( FClothingSlotData(
BodyMeshComponent, EClothingSlotType::Body, BodySuitMeshComponent, EClothingSlotType::BodySuit,
nullptr, nullptr,
LOCTEXT("Body", "Body"))); LOCTEXT("BodySuit", "BodySuit")));
ClothingManager->ClothingSlots.Add( ClothingManager->ClothingSlots.Add(
FClothingSlotData( FClothingSlotData(
TopMeshComponent, EClothingSlotType::Top, TopMeshComponent, EClothingSlotType::Top,
@@ -410,14 +419,14 @@ void ANakedDesireCharacter::SetupClothingSlots()
LOCTEXT("Bottom", "Bottom"))); LOCTEXT("Bottom", "Bottom")));
ClothingManager->ClothingSlots.Add( ClothingManager->ClothingSlots.Add(
FClothingSlotData( FClothingSlotData(
BraMeshComponent, EClothingSlotType::Bra, UnderwearTopMeshComponent, EClothingSlotType::UnderwearTop,
nullptr, nullptr,
LOCTEXT("Bra", "Bra"))); LOCTEXT("UnderwearTop", "UnderwearTop")));
ClothingManager->ClothingSlots.Add( ClothingManager->ClothingSlots.Add(
FClothingSlotData( FClothingSlotData(
PantiesMeshComponent, EClothingSlotType::Panties, UnderwearBottomMeshComponent, EClothingSlotType::UnderwearBottom,
nullptr, nullptr,
LOCTEXT("Panties", "Panties"))); LOCTEXT("UnderwearBottom", "UnderwearBottom")));
ClothingManager->ClothingSlots.Add( ClothingManager->ClothingSlots.Add(
FClothingSlotData( FClothingSlotData(
SocksMeshComponent, EClothingSlotType::Socks, SocksMeshComponent, EClothingSlotType::Socks,
@@ -425,9 +434,29 @@ void ANakedDesireCharacter::SetupClothingSlots()
LOCTEXT("Socks", "Socks"))); LOCTEXT("Socks", "Socks")));
ClothingManager->ClothingSlots.Add( ClothingManager->ClothingSlots.Add(
FClothingSlotData( FClothingSlotData(
ShoesMeshComponent, EClothingSlotType::Shoes, FootwearMeshComponent, EClothingSlotType::Footwear,
nullptr, nullptr,
LOCTEXT("Shoes", "Shoes"))); LOCTEXT("Footwear", "Footwear")));
ClothingManager->ClothingSlots.Add(
FClothingSlotData(
FootwearMeshComponent, EClothingSlotType::Outerwear,
nullptr,
LOCTEXT("Outerwear", "Outerwear")));
ClothingManager->ClothingSlots.Add(
FClothingSlotData(
FootwearMeshComponent, EClothingSlotType::WristRestraint,
nullptr,
LOCTEXT("WristRestraint", "WristRestraint")));
ClothingManager->ClothingSlots.Add(
FClothingSlotData(
FootwearMeshComponent, EClothingSlotType::AnkleRestraint,
nullptr,
LOCTEXT("AnkleRestraint", "AnkleRestraint")));
ClothingManager->ClothingSlots.Add(
FClothingSlotData(
FootwearMeshComponent, EClothingSlotType::NeckRestraint,
nullptr,
LOCTEXT("NeckRestraint", "NeckRestraint")));
#undef LOCTEXT_NAMESPACE #undef LOCTEXT_NAMESPACE
} }
@@ -73,7 +73,7 @@ public:
USkeletalMeshComponent* EyesMeshComponent; USkeletalMeshComponent* EyesMeshComponent;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing") UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing")
USkeletalMeshComponent* BodyMeshComponent; USkeletalMeshComponent* BodySuitMeshComponent;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing") UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing")
USkeletalMeshComponent* TopMeshComponent; USkeletalMeshComponent* TopMeshComponent;
@@ -82,16 +82,28 @@ public:
USkeletalMeshComponent* BottomMeshComponent; USkeletalMeshComponent* BottomMeshComponent;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing") UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing")
USkeletalMeshComponent* BraMeshComponent; USkeletalMeshComponent* UnderwearTopMeshComponent;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing") UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing")
USkeletalMeshComponent* PantiesMeshComponent; USkeletalMeshComponent* UnderwearBottomMeshComponent;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing") UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing")
USkeletalMeshComponent* SocksMeshComponent; USkeletalMeshComponent* SocksMeshComponent;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing") UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing")
USkeletalMeshComponent* ShoesMeshComponent; USkeletalMeshComponent* FootwearMeshComponent;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing")
USkeletalMeshComponent* OuterwearMeshComponent;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing")
USkeletalMeshComponent* WristRestraintMeshComponent;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing")
USkeletalMeshComponent* AnkleRestraintMeshComponent;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing")
USkeletalMeshComponent* NeckRestraintMeshComponent;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Censorship") UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Censorship")
UStaticMeshComponent* BoobLCensorship; UStaticMeshComponent* BoobLCensorship;
@@ -100,10 +112,10 @@ public:
UStaticMeshComponent* BoobRCensorship; UStaticMeshComponent* BoobRCensorship;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Censorship") UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Censorship")
UStaticMeshComponent* FrontBottomCensorship; UStaticMeshComponent* VaginaCensorship;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Censorship") UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Censorship")
UStaticMeshComponent* BackBottomCensorship; UStaticMeshComponent* AnalCensorship;
// Components // Components
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing") UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing")
@@ -127,11 +139,8 @@ public:
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
float RunSpeed = 500.0f; float RunSpeed = 500.0f;
UPROPERTY(BlueprintReadWrite)
int Money = 0;
int XP = 0; float XP = 0.0f;
UPROPERTY() UPROPERTY()
ULocationData* CurrentArea = nullptr; ULocationData* CurrentArea = nullptr;
@@ -88,19 +88,19 @@ USkeletalMeshComponent* APlayerCinematic::GetMeshByType(const EClothingSlotType
return FaceMeshComponent; return FaceMeshComponent;
case EClothingSlotType::Eyes: case EClothingSlotType::Eyes:
return EyesMeshComponent; return EyesMeshComponent;
case EClothingSlotType::Body: case EClothingSlotType::BodySuit:
return BodyMeshComponent; return BodyMeshComponent;
case EClothingSlotType::Top: case EClothingSlotType::Top:
return TopMeshComponent; return TopMeshComponent;
case EClothingSlotType::Bottom: case EClothingSlotType::Bottom:
return BottomMeshComponent; return BottomMeshComponent;
case EClothingSlotType::Bra: case EClothingSlotType::UnderwearTop:
return BraMeshComponent; return BraMeshComponent;
case EClothingSlotType::Panties: case EClothingSlotType::UnderwearBottom:
return PantiesMeshComponent; return PantiesMeshComponent;
case EClothingSlotType::Socks: case EClothingSlotType::Socks:
return SocksMeshComponent; return SocksMeshComponent;
case EClothingSlotType::Shoes: case EClothingSlotType::Footwear:
return ShoesMeshComponent; return ShoesMeshComponent;
default: default:
return NipplesMeshComponent; return NipplesMeshComponent;
+4 -4
View File
@@ -93,19 +93,19 @@ USkeletalMeshComponent* APlayerImpostor::GetMeshByType(const EClothingSlotType S
return FaceMeshComponent; return FaceMeshComponent;
case EClothingSlotType::Eyes: case EClothingSlotType::Eyes:
return EyesMeshComponent; return EyesMeshComponent;
case EClothingSlotType::Body: case EClothingSlotType::BodySuit:
return BodyMeshComponent; return BodyMeshComponent;
case EClothingSlotType::Top: case EClothingSlotType::Top:
return TopMeshComponent; return TopMeshComponent;
case EClothingSlotType::Bottom: case EClothingSlotType::Bottom:
return BottomMeshComponent; return BottomMeshComponent;
case EClothingSlotType::Bra: case EClothingSlotType::UnderwearTop:
return BraMeshComponent; return BraMeshComponent;
case EClothingSlotType::Panties: case EClothingSlotType::UnderwearBottom:
return PantiesMeshComponent; return PantiesMeshComponent;
case EClothingSlotType::Socks: case EClothingSlotType::Socks:
return SocksMeshComponent; return SocksMeshComponent;
case EClothingSlotType::Shoes: case EClothingSlotType::Footwear:
return ShoesMeshComponent; return ShoesMeshComponent;
default: default:
return NipplesMeshComponent; return NipplesMeshComponent;
@@ -1,42 +0,0 @@
// © 2025 Naked People Team. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "PrivateBodyPartType.generated.h"
#define LOCTEXT_NAMESPACE "Missions.BodyType"
const FText BackBottom = LOCTEXT("BackBottom", "back bottom");
const FText FrontBottom = LOCTEXT("FrontBottom", "front bottom");
const FText FrontTop = LOCTEXT("FrontTop", "front top");
#undef LOCTEXT_NAMESPACE
UENUM(BlueprintType)
enum class EPrivateBodyPartType : uint8
{
FrontBottom = 0,
BackBottom = 1,
FrontTop = 2
};
UCLASS()
class UPrivateBodyPartType : public UObject
{
GENERATED_BODY()
public:
static FText GetString(const EPrivateBodyPartType BodyType)
{
switch (BodyType)
{
case EPrivateBodyPartType::BackBottom:
return BackBottom;
case EPrivateBodyPartType::FrontBottom:
return FrontBottom;
case EPrivateBodyPartType::FrontTop:
return FrontTop;
default:
return FText::GetEmpty();
}
}
};
@@ -8,11 +8,10 @@
UGlobalSaveGameData* UGlobalSaveGameData::CreateNewSaveGame() UGlobalSaveGameData* UGlobalSaveGameData::CreateNewSaveGame()
{ {
UGlobalSaveGameData* NewSave = Cast<UGlobalSaveGameData>(UGameplayStatics::CreateSaveGameObject(StaticClass())); UGlobalSaveGameData* NewSave = Cast<UGlobalSaveGameData>(UGameplayStatics::CreateSaveGameObject(StaticClass()));
NewSave->Money = STARTING_MONEY;
if (!NewSave) if (!NewSave)
{
return nullptr; return nullptr;
}
return NewSave; return NewSave;
} }
@@ -8,7 +8,6 @@
#include "GlobalSaveGameData.generated.h" #include "GlobalSaveGameData.generated.h"
struct FItemSaveRecord; struct FItemSaveRecord;
class UClothingList;
UCLASS() UCLASS()
class NAKEDDESIRE_API UGlobalSaveGameData : public USaveGame class NAKEDDESIRE_API UGlobalSaveGameData : public USaveGame
@@ -32,7 +31,7 @@ public:
UPROPERTY(SaveGame) UPROPERTY(SaveGame)
TArray<FItemSaveRecord> EquippedItems; TArray<FItemSaveRecord> EquippedItems;
UPROPERTY(SaceGame) UPROPERTY(SaveGame)
int32 DaysPassed = 0; int32 DaysPassed = 0;
UPROPERTY(SaveGame) UPROPERTY(SaveGame)
@@ -19,14 +19,10 @@ void USaveSubsystem::AddItem(const FItemSaveRecord& Record)
void USaveSubsystem::RemoveItem(const FGuid& InstanceId) void USaveSubsystem::RemoveItem(const FGuid& InstanceId)
{ {
FItemSaveRecord* ItemSaveRecord = Items.FindByPredicate([InstanceId](FItemSaveRecord ItemSaveRecord) Items.RemoveAll([InstanceId](const FItemSaveRecord& Item)
{ {
return ItemSaveRecord.InstanceId == InstanceId; return Item.InstanceId == InstanceId;
}); });
if (ItemSaveRecord)
{
Items.Remove(*ItemSaveRecord);
}
} }
void USaveSubsystem::Initialize(FSubsystemCollectionBase& Collection) void USaveSubsystem::Initialize(FSubsystemCollectionBase& Collection)