diff --git a/Source/NakedDesire/Clothing/ClothingItem.h b/Source/NakedDesire/Clothing/ClothingItem.h index 991f30f2..f47ae768 100644 --- a/Source/NakedDesire/Clothing/ClothingItem.h +++ b/Source/NakedDesire/Clothing/ClothingItem.h @@ -6,10 +6,47 @@ #include "BodyPart.h" #include "ClothingSlotType.h" #include "Engine/DataAsset.h" -#include "NakedDesire/Player/PrivateBodyPartType.h" #include "NakedDesire/Progression/ProgressionPath.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) enum class EGarmentContainerSlotType : uint8 { @@ -58,9 +95,9 @@ public: int BasePrice; UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) - TArray CoveredBodyParts; // TODO: Add coverage per body part + TArray 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; UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) @@ -72,15 +109,12 @@ public: UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) TArray CanExpose; - UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) - bool IsRestrictive; - UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) float Coverage = 1.0f; UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) - bool IsUnderwear; + TArray ContainerSlots; UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) - TArray ContainerSlots; + TArray Restrictions; }; diff --git a/Source/NakedDesire/Clothing/ClothingManager.cpp b/Source/NakedDesire/Clothing/ClothingManager.cpp index a2d668d7..d54faa6f 100644 --- a/Source/NakedDesire/Clothing/ClothingManager.cpp +++ b/Source/NakedDesire/Clothing/ClothingManager.cpp @@ -11,11 +11,11 @@ UClothingManager::UClothingManager() PrimaryComponentTick.bCanEverTick = false; } -bool UClothingManager::IsBodyTypeExposed(const EPrivateBodyPartType PrivateBodyPartType) +bool UClothingManager::IsBodyTypeExposed(const EBodyPart BodyPart) { 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; } @@ -74,7 +74,7 @@ void UClothingManager::HydrateClothing(UGlobalSaveGameData* SaveGameData) float UClothingManager::GetHeelHeight() { - if (FClothingSlotData ClothingSlotData; GetClothingSlotData(EClothingSlotType::Shoes, ClothingSlotData)) + if (FClothingSlotData ClothingSlotData; GetClothingSlotData(EClothingSlotType::Footwear, ClothingSlotData)) { if (ClothingSlotData.ClothingItemInstance) { @@ -173,5 +173,5 @@ bool UClothingManager::IsClothingTypeOn(const EClothingSlotType ClothingType) bool UClothingManager::IsPartiallyNaked() { - return IsBodyTypeExposed(EPrivateBodyPartType::BackBottom) || IsBodyTypeExposed(EPrivateBodyPartType::FrontBottom) || IsBodyTypeExposed(EPrivateBodyPartType::FrontTop); + return IsBodyTypeExposed(EBodyPart::Ass) || IsBodyTypeExposed(EBodyPart::Genitals) || IsBodyTypeExposed(EBodyPart::Boobs); } diff --git a/Source/NakedDesire/Clothing/ClothingManager.h b/Source/NakedDesire/Clothing/ClothingManager.h index 1080f22a..055c0c05 100644 --- a/Source/NakedDesire/Clothing/ClothingManager.h +++ b/Source/NakedDesire/Clothing/ClothingManager.h @@ -3,13 +3,11 @@ #pragma once #include "CoreMinimal.h" +#include "BodyPart.h" #include "ClothingSlotData.h" #include "Components/ActorComponent.h" -#include "NakedDesire/Player/PrivateBodyPartType.h" #include "ClothingManager.generated.h" -// TODO: Check clothing colors - class UGlobalSaveGameData; class AClothingPickup; class UClothingItemInstance; @@ -53,7 +51,7 @@ public: bool IsPartiallyNaked(); UFUNCTION(BlueprintCallable) - bool IsBodyTypeExposed(EPrivateBodyPartType PrivateBodyPartType); + bool IsBodyTypeExposed(EBodyPart BodyPart); UFUNCTION(BlueprintCallable) void TakeClothing(UClothingItemInstance* ClothingItemInstance); diff --git a/Source/NakedDesire/Clothing/ClothingSlotType.h b/Source/NakedDesire/Clothing/ClothingSlotType.h index 8323c2fb..20251e50 100644 --- a/Source/NakedDesire/Clothing/ClothingSlotType.h +++ b/Source/NakedDesire/Clothing/ClothingSlotType.h @@ -7,18 +7,22 @@ UENUM(BlueprintType) enum class EClothingSlotType : uint8 { - Nipples, - Anal, - Vagina, + Nipples UMETA(ToolTip = "Sex Toy slot only"), + Anal UMETA(ToolTip = "Sex Toy slot only"), + Vagina UMETA(ToolTip = "Sex Toy slot only"), Head, Neck, Face, Eyes, - Body, + BodySuit, Top, Bottom, - Bra, - Panties, + UnderwearTop, + UnderwearBottom, Socks, - Shoes, + Footwear, + Outerwear, + WristRestraint, + AnkleRestraint, + NeckRestraint, }; diff --git a/Source/NakedDesire/Global/NakedDesireGameMode.cpp b/Source/NakedDesire/Global/NakedDesireGameMode.cpp index e9662bd7..667fcc29 100644 --- a/Source/NakedDesire/Global/NakedDesireGameMode.cpp +++ b/Source/NakedDesire/Global/NakedDesireGameMode.cpp @@ -9,6 +9,7 @@ #include "NakedDesire/MissionBuilder/MissionsConfig.h" #include "NakedDesire/MissionBuilder/MissionsManager.h" #include "NakedDesire/Player/NakedDesireCharacter.h" +#include "NakedDesire/SaveGame/GlobalSaveGameData.h" void ANakedDesireGameMode::RestartGame() { @@ -22,18 +23,19 @@ AWardrobe* ANakedDesireGameMode::GetWardrobe() const void ANakedDesireGameMode::BuyItem(UClothingItemInstance* ClothingItemInstance) { - ANakedDesireCharacter* Player = Cast(UGameplayStatics::GetPlayerCharacter(GetWorld(), 0)); - if (!Player) + UGlobalSaveGameData* SaveGame = UGlobalSaveGameData::LoadGame(); + if (!SaveGame) + { + UE_LOG(LogTemp, Error, TEXT("ANakedDesireGameMode::BuyItem Couldn't load save game")); + return; + } + + if (SaveGame->Money < ClothingItemInstance->GetClothingItem()->BasePrice) { return; } - if (Player->Money < ClothingItemInstance->GetClothingItem()->BasePrice) - { - return; - } - - Player->Money -= ClothingItemInstance->GetClothingItem()->BasePrice; + SaveGame->Money -= ClothingItemInstance->GetClothingItem()->BasePrice; Wardrobe->ClothingItems.Add(ClothingItemInstance); } diff --git a/Source/NakedDesire/Global/Utils.cpp b/Source/NakedDesire/Global/Utils.cpp deleted file mode 100644 index b3b8bb4d..00000000 --- a/Source/NakedDesire/Global/Utils.cpp +++ /dev/null @@ -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; -} diff --git a/Source/NakedDesire/Global/Utils.h b/Source/NakedDesire/Global/Utils.h deleted file mode 100644 index 88a14b4e..00000000 --- a/Source/NakedDesire/Global/Utils.h +++ /dev/null @@ -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(); -}; diff --git a/Source/NakedDesire/Items/SexToyInstance.cpp b/Source/NakedDesire/Items/SexToyInstance.cpp new file mode 100644 index 00000000..13cbfdc9 --- /dev/null +++ b/Source/NakedDesire/Items/SexToyInstance.cpp @@ -0,0 +1 @@ +#include "SexToyInstance.h" diff --git a/Source/NakedDesire/Items/SexToyInstance.h b/Source/NakedDesire/Items/SexToyInstance.h new file mode 100644 index 00000000..b1e25307 --- /dev/null +++ b/Source/NakedDesire/Items/SexToyInstance.h @@ -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 SexToyItem; +}; diff --git a/Source/NakedDesire/Items/SexToyItem.cpp b/Source/NakedDesire/Items/SexToyItem.cpp new file mode 100644 index 00000000..3356d339 --- /dev/null +++ b/Source/NakedDesire/Items/SexToyItem.cpp @@ -0,0 +1 @@ +#include "SexToyItem.h" diff --git a/Source/NakedDesire/Items/SexToyItem.h b/Source/NakedDesire/Items/SexToyItem.h new file mode 100644 index 00000000..5d4735d6 --- /dev/null +++ b/Source/NakedDesire/Items/SexToyItem.h @@ -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; +}; diff --git a/Source/NakedDesire/MissionBuilder/Goals/FlashGoal.cpp b/Source/NakedDesire/MissionBuilder/Goals/FlashGoal.cpp index 53c0d1ed..7ee74056 100644 --- a/Source/NakedDesire/MissionBuilder/Goals/FlashGoal.cpp +++ b/Source/NakedDesire/MissionBuilder/Goals/FlashGoal.cpp @@ -27,7 +27,23 @@ void UFlashGoal::Complete() 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) { diff --git a/Source/NakedDesire/MissionBuilder/Goals/FlashGoal.h b/Source/NakedDesire/MissionBuilder/Goals/FlashGoal.h index 9f9fa215..f8f99564 100644 --- a/Source/NakedDesire/MissionBuilder/Goals/FlashGoal.h +++ b/Source/NakedDesire/MissionBuilder/Goals/FlashGoal.h @@ -3,8 +3,8 @@ #pragma once #include "CoreMinimal.h" +#include "NakedDesire/Clothing/BodyPart.h" #include "NakedDesire/MissionBuilder/MissionGoal.h" -#include "NakedDesire/Player/PrivateBodyPartType.h" #include "FlashGoal.generated.h" class ANPCAIController; @@ -20,7 +20,7 @@ class NAKEDDESIRE_API UFlashGoal : public UMissionGoal int RequiredFlashCount = 1; UPROPERTY(EditDefaultsOnly) - EPrivateBodyPartType BodyType; + EBodyPart BodyType; FDelegateHandle PlayerNoticedHandle; diff --git a/Source/NakedDesire/MissionBuilder/MissionsManager.cpp b/Source/NakedDesire/MissionBuilder/MissionsManager.cpp index a52495ac..9de1a2dd 100644 --- a/Source/NakedDesire/MissionBuilder/MissionsManager.cpp +++ b/Source/NakedDesire/MissionBuilder/MissionsManager.cpp @@ -32,24 +32,6 @@ void UMissionsManager::CompleteMission(UMission* 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& NewMissions) { for (UMission* Mission : AvailableMissions) diff --git a/Source/NakedDesire/MissionBuilder/MissionsManager.h b/Source/NakedDesire/MissionBuilder/MissionsManager.h index 1357219c..43033570 100644 --- a/Source/NakedDesire/MissionBuilder/MissionsManager.h +++ b/Source/NakedDesire/MissionBuilder/MissionsManager.h @@ -37,13 +37,9 @@ public: FOnRewardsCollected OnRewardsCollected; void CompleteMission(UMission* Mission); - - UFUNCTION(BlueprintCallable) - void CollectRewards(); UFUNCTION() void RefreshDailyMissions(const TArray& NewMissions); -protected: virtual void BeginPlay() override; }; diff --git a/Source/NakedDesire/MissionBuilder/Restrictions/ExposeBodyPartRestriction.cpp b/Source/NakedDesire/MissionBuilder/Restrictions/ExposeBodyPartRestriction.cpp index 6b5503a2..e08b5eed 100644 --- a/Source/NakedDesire/MissionBuilder/Restrictions/ExposeBodyPartRestriction.cpp +++ b/Source/NakedDesire/MissionBuilder/Restrictions/ExposeBodyPartRestriction.cpp @@ -32,18 +32,33 @@ void UExposeBodyPartRestriction::Stop() 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, FFormatNamedArguments { - {TEXT("BodyPart"), Part} + {TEXT("BodyPart"), BodyPartString} }); } void UExposeBodyPartRestriction::EquipClothing(const UClothingItemInstance* ClothingItemInstance) { - if (IsSuccess && ClothingItemInstance->GetClothingItem()->CoveredBodyParts.Contains(BodyPart)) + if (IsSuccess) // TODO: Add covered body part resolution { Init(Player); } @@ -68,7 +83,7 @@ void UExposeBodyPartRestriction::CheckClothing() { if (ClothingSlot.ClothingItemInstance) { - return ClothingSlot.ClothingItemInstance->GetClothingItem()->CoveredBodyParts.Contains(BodyPart); + return true; // TODO: Add exposed body part resolution } return false; diff --git a/Source/NakedDesire/MissionBuilder/Restrictions/ExposeBodyPartRestriction.h b/Source/NakedDesire/MissionBuilder/Restrictions/ExposeBodyPartRestriction.h index 0abe7271..470f4f0b 100644 --- a/Source/NakedDesire/MissionBuilder/Restrictions/ExposeBodyPartRestriction.h +++ b/Source/NakedDesire/MissionBuilder/Restrictions/ExposeBodyPartRestriction.h @@ -3,7 +3,7 @@ #pragma once #include "CoreMinimal.h" -#include "NakedDesire/Player/PrivateBodyPartType.h" +#include "NakedDesire/Clothing/BodyPart.h" #include "NakedDesire/MissionBuilder/GoalRestriction.h" #include "ExposeBodyPartRestriction.generated.h" @@ -18,7 +18,7 @@ class NAKEDDESIRE_API UExposeBodyPartRestriction : public UGoalRestriction FDelegateHandle UnequipClothingHandle; UPROPERTY(EditDefaultsOnly) - EPrivateBodyPartType BodyPart; + EBodyPart BodyPart; protected: virtual void Init(ANakedDesireCharacter* PlayerCharacter) override; diff --git a/Source/NakedDesire/Player/NakedDesireCharacter.cpp b/Source/NakedDesire/Player/NakedDesireCharacter.cpp index d25f0f27..93356881 100644 --- a/Source/NakedDesire/Player/NakedDesireCharacter.cpp +++ b/Source/NakedDesire/Player/NakedDesireCharacter.cpp @@ -51,29 +51,37 @@ ANakedDesireCharacter::ANakedDesireCharacter() FaceMeshComponent->SetupAttachment(GetMesh()); EyesMeshComponent = CreateDefaultSubobject("Eyes"); EyesMeshComponent->SetupAttachment(GetMesh()); - BodyMeshComponent = CreateDefaultSubobject("Body"); - BodyMeshComponent->SetupAttachment(GetMesh()); + BodySuitMeshComponent = CreateDefaultSubobject("Body Suit"); + BodySuitMeshComponent->SetupAttachment(GetMesh()); TopMeshComponent = CreateDefaultSubobject("Top"); TopMeshComponent->SetupAttachment(GetMesh()); BottomMeshComponent = CreateDefaultSubobject("Bottom"); BottomMeshComponent->SetupAttachment(GetMesh()); - BraMeshComponent = CreateDefaultSubobject("Bra"); - BraMeshComponent->SetupAttachment(GetMesh()); - PantiesMeshComponent = CreateDefaultSubobject("Panties"); - PantiesMeshComponent->SetupAttachment(GetMesh()); + UnderwearTopMeshComponent = CreateDefaultSubobject("Underwear Top"); + UnderwearTopMeshComponent->SetupAttachment(GetMesh()); + UnderwearBottomMeshComponent = CreateDefaultSubobject("Underwear Bottom"); + UnderwearBottomMeshComponent->SetupAttachment(GetMesh()); SocksMeshComponent = CreateDefaultSubobject("Socks"); SocksMeshComponent->SetupAttachment(GetMesh()); - ShoesMeshComponent = CreateDefaultSubobject("Shoes"); - ShoesMeshComponent->SetupAttachment(GetMesh()); + FootwearMeshComponent = CreateDefaultSubobject("Footwear"); + FootwearMeshComponent->SetupAttachment(GetMesh()); + OuterwearMeshComponent = CreateDefaultSubobject("Outerwear"); + OuterwearMeshComponent->SetupAttachment(GetMesh()); + WristRestraintMeshComponent = CreateDefaultSubobject("Wrist Restraint"); + WristRestraintMeshComponent->SetupAttachment(GetMesh()); + AnkleRestraintMeshComponent = CreateDefaultSubobject("Ankle Restraint"); + AnkleRestraintMeshComponent->SetupAttachment(GetMesh()); + NeckRestraintMeshComponent = CreateDefaultSubobject("Neck Restraint"); + NeckRestraintMeshComponent->SetupAttachment(GetMesh()); BoobLCensorship = CreateDefaultSubobject(TEXT("Boob L Censorship")); BoobLCensorship->SetupAttachment(GetMesh(), FName(TEXT("boob_l"))); BoobRCensorship = CreateDefaultSubobject(TEXT("Boob R Censorship")); BoobRCensorship->SetupAttachment(GetMesh(), FName(TEXT("boob_r"))); - FrontBottomCensorship = CreateDefaultSubobject(TEXT("Front Bottom Censorship")); - FrontBottomCensorship->SetupAttachment(GetMesh(), FName(TEXT("pelvis"))); - BackBottomCensorship = CreateDefaultSubobject(TEXT("Back Bottom Censorship")); - BackBottomCensorship->SetupAttachment(GetMesh(), FName(TEXT("pelvis"))); + VaginaCensorship = CreateDefaultSubobject(TEXT("Vagina Censorship")); + VaginaCensorship->SetupAttachment(GetMesh(), FName(TEXT("pelvis"))); + AnalCensorship = CreateDefaultSubobject(TEXT("Anal Censorship")); + AnalCensorship->SetupAttachment(GetMesh(), FName(TEXT("pelvis"))); StimuliSourceComponent = CreateDefaultSubobject(TEXT("Stimuli Source Component")); } @@ -176,7 +184,7 @@ UAISense_Sight::EVisibilityResult ANakedDesireCharacter::CanBeSeenFrom(const FCa FHitResult PelvisHitResult; 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")); OutSeenLocation = BoobsBoneLocation; @@ -185,7 +193,7 @@ UAISense_Sight::EVisibilityResult ANakedDesireCharacter::CanBeSeenFrom(const FCa } 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")); OutSeenLocation = PelvisBoneLocation; @@ -250,19 +258,20 @@ void ANakedDesireCharacter::OnEndOverlap(UPrimitiveComponent* OverlappedComponen void ANakedDesireCharacter::OnClothingEquip(const UClothingItemInstance* ClothingItemInstance) { - if (ClothingItemInstance->GetClothingItem()->CoveredBodyParts.Contains(EPrivateBodyPartType::BackBottom)) - { - BackBottomCensorship->SetVisibility(false); - } - if (ClothingItemInstance->GetClothingItem()->CoveredBodyParts.Contains(EPrivateBodyPartType::FrontBottom)) - { - FrontBottomCensorship->SetVisibility(false); - } - if (ClothingItemInstance->GetClothingItem()->CoveredBodyParts.Contains(EPrivateBodyPartType::FrontTop)) - { - BoobLCensorship->SetVisibility(false); - BoobRCensorship->SetVisibility(false); - } + // TODO: Add covered body part resolution + // if (ClothingItemInstance->GetClothingItem()->CoveredBodyParts.Contains(EBodyPart::Ass)) + // { + // AnalCensorship->SetVisibility(false); + // } + // if (ClothingItemInstance->GetClothingItem()->CoveredBodyParts.Contains(EBodyPart::Genitals)) + // { + // VaginaCensorship->SetVisibility(false); + // } + // if (ClothingItemInstance->GetClothingItem()->CoveredBodyParts.Contains(EBodyPart::Boobs)) + // { + // BoobLCensorship->SetVisibility(false); + // BoobRCensorship->SetVisibility(false); + // } } void ANakedDesireCharacter::OnClothingUnequip(const UClothingItemInstance* ClothingItemInstance) @@ -270,15 +279,15 @@ void ANakedDesireCharacter::OnClothingUnequip(const UClothingItemInstance* Cloth if (!UNakedDesireUserSettings::GetNakedDesireUserSettings()->GetIsCensorshipEnabled() && !IS_DEMO) 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); BoobRCensorship->SetVisibility(true); @@ -289,15 +298,15 @@ void ANakedDesireCharacter::OnSettingsChanged(UNakedDesireUserSettings* Settings { 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); BoobRCensorship->SetVisibility(true); @@ -305,8 +314,8 @@ void ANakedDesireCharacter::OnSettingsChanged(UNakedDesireUserSettings* Settings } else if (!IS_DEMO) { - BackBottomCensorship->SetVisibility(false); - FrontBottomCensorship->SetVisibility(false); + AnalCensorship->SetVisibility(false); + VaginaCensorship->SetVisibility(false); BoobLCensorship->SetVisibility(false); BoobRCensorship->SetVisibility(false); } @@ -395,9 +404,9 @@ void ANakedDesireCharacter::SetupClothingSlots() LOCTEXT("Eyes", "Eyes"))); ClothingManager->ClothingSlots.Add( FClothingSlotData( - BodyMeshComponent, EClothingSlotType::Body, + BodySuitMeshComponent, EClothingSlotType::BodySuit, nullptr, - LOCTEXT("Body", "Body"))); + LOCTEXT("BodySuit", "BodySuit"))); ClothingManager->ClothingSlots.Add( FClothingSlotData( TopMeshComponent, EClothingSlotType::Top, @@ -410,14 +419,14 @@ void ANakedDesireCharacter::SetupClothingSlots() LOCTEXT("Bottom", "Bottom"))); ClothingManager->ClothingSlots.Add( FClothingSlotData( - BraMeshComponent, EClothingSlotType::Bra, + UnderwearTopMeshComponent, EClothingSlotType::UnderwearTop, nullptr, - LOCTEXT("Bra", "Bra"))); + LOCTEXT("UnderwearTop", "UnderwearTop"))); ClothingManager->ClothingSlots.Add( FClothingSlotData( - PantiesMeshComponent, EClothingSlotType::Panties, + UnderwearBottomMeshComponent, EClothingSlotType::UnderwearBottom, nullptr, - LOCTEXT("Panties", "Panties"))); + LOCTEXT("UnderwearBottom", "UnderwearBottom"))); ClothingManager->ClothingSlots.Add( FClothingSlotData( SocksMeshComponent, EClothingSlotType::Socks, @@ -425,9 +434,29 @@ void ANakedDesireCharacter::SetupClothingSlots() LOCTEXT("Socks", "Socks"))); ClothingManager->ClothingSlots.Add( FClothingSlotData( - ShoesMeshComponent, EClothingSlotType::Shoes, + FootwearMeshComponent, EClothingSlotType::Footwear, 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 } diff --git a/Source/NakedDesire/Player/NakedDesireCharacter.h b/Source/NakedDesire/Player/NakedDesireCharacter.h index 6ddf5132..45f98012 100644 --- a/Source/NakedDesire/Player/NakedDesireCharacter.h +++ b/Source/NakedDesire/Player/NakedDesireCharacter.h @@ -73,7 +73,7 @@ public: USkeletalMeshComponent* EyesMeshComponent; UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing") - USkeletalMeshComponent* BodyMeshComponent; + USkeletalMeshComponent* BodySuitMeshComponent; UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing") USkeletalMeshComponent* TopMeshComponent; @@ -82,16 +82,28 @@ public: USkeletalMeshComponent* BottomMeshComponent; UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing") - USkeletalMeshComponent* BraMeshComponent; + USkeletalMeshComponent* UnderwearTopMeshComponent; UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing") - USkeletalMeshComponent* PantiesMeshComponent; + USkeletalMeshComponent* UnderwearBottomMeshComponent; UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing") USkeletalMeshComponent* SocksMeshComponent; 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") UStaticMeshComponent* BoobLCensorship; @@ -100,10 +112,10 @@ public: UStaticMeshComponent* BoobRCensorship; UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Censorship") - UStaticMeshComponent* FrontBottomCensorship; + UStaticMeshComponent* VaginaCensorship; UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Censorship") - UStaticMeshComponent* BackBottomCensorship; + UStaticMeshComponent* AnalCensorship; // Components UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing") @@ -127,11 +139,8 @@ public: UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) float RunSpeed = 500.0f; - - UPROPERTY(BlueprintReadWrite) - int Money = 0; - int XP = 0; + float XP = 0.0f; UPROPERTY() ULocationData* CurrentArea = nullptr; diff --git a/Source/NakedDesire/Player/PlayerCinematic.cpp b/Source/NakedDesire/Player/PlayerCinematic.cpp index b358e32f..54f08ac4 100644 --- a/Source/NakedDesire/Player/PlayerCinematic.cpp +++ b/Source/NakedDesire/Player/PlayerCinematic.cpp @@ -88,19 +88,19 @@ USkeletalMeshComponent* APlayerCinematic::GetMeshByType(const EClothingSlotType return FaceMeshComponent; case EClothingSlotType::Eyes: return EyesMeshComponent; - case EClothingSlotType::Body: + case EClothingSlotType::BodySuit: return BodyMeshComponent; case EClothingSlotType::Top: return TopMeshComponent; case EClothingSlotType::Bottom: return BottomMeshComponent; - case EClothingSlotType::Bra: + case EClothingSlotType::UnderwearTop: return BraMeshComponent; - case EClothingSlotType::Panties: + case EClothingSlotType::UnderwearBottom: return PantiesMeshComponent; case EClothingSlotType::Socks: return SocksMeshComponent; - case EClothingSlotType::Shoes: + case EClothingSlotType::Footwear: return ShoesMeshComponent; default: return NipplesMeshComponent; diff --git a/Source/NakedDesire/Player/PlayerImpostor.cpp b/Source/NakedDesire/Player/PlayerImpostor.cpp index 75b9593b..ddfa7104 100644 --- a/Source/NakedDesire/Player/PlayerImpostor.cpp +++ b/Source/NakedDesire/Player/PlayerImpostor.cpp @@ -93,19 +93,19 @@ USkeletalMeshComponent* APlayerImpostor::GetMeshByType(const EClothingSlotType S return FaceMeshComponent; case EClothingSlotType::Eyes: return EyesMeshComponent; - case EClothingSlotType::Body: + case EClothingSlotType::BodySuit: return BodyMeshComponent; case EClothingSlotType::Top: return TopMeshComponent; case EClothingSlotType::Bottom: return BottomMeshComponent; - case EClothingSlotType::Bra: + case EClothingSlotType::UnderwearTop: return BraMeshComponent; - case EClothingSlotType::Panties: + case EClothingSlotType::UnderwearBottom: return PantiesMeshComponent; case EClothingSlotType::Socks: return SocksMeshComponent; - case EClothingSlotType::Shoes: + case EClothingSlotType::Footwear: return ShoesMeshComponent; default: return NipplesMeshComponent; diff --git a/Source/NakedDesire/Player/PrivateBodyPartType.h b/Source/NakedDesire/Player/PrivateBodyPartType.h deleted file mode 100644 index 7462368b..00000000 --- a/Source/NakedDesire/Player/PrivateBodyPartType.h +++ /dev/null @@ -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(); - } - } -}; diff --git a/Source/NakedDesire/SaveGame/GlobalSaveGameData.cpp b/Source/NakedDesire/SaveGame/GlobalSaveGameData.cpp index 5d6dfd74..368fc300 100644 --- a/Source/NakedDesire/SaveGame/GlobalSaveGameData.cpp +++ b/Source/NakedDesire/SaveGame/GlobalSaveGameData.cpp @@ -8,11 +8,10 @@ UGlobalSaveGameData* UGlobalSaveGameData::CreateNewSaveGame() { UGlobalSaveGameData* NewSave = Cast(UGameplayStatics::CreateSaveGameObject(StaticClass())); + NewSave->Money = STARTING_MONEY; if (!NewSave) - { return nullptr; - } return NewSave; } diff --git a/Source/NakedDesire/SaveGame/GlobalSaveGameData.h b/Source/NakedDesire/SaveGame/GlobalSaveGameData.h index 2348b6dc..dc7eefa2 100644 --- a/Source/NakedDesire/SaveGame/GlobalSaveGameData.h +++ b/Source/NakedDesire/SaveGame/GlobalSaveGameData.h @@ -8,7 +8,6 @@ #include "GlobalSaveGameData.generated.h" struct FItemSaveRecord; -class UClothingList; UCLASS() class NAKEDDESIRE_API UGlobalSaveGameData : public USaveGame @@ -32,7 +31,7 @@ public: UPROPERTY(SaveGame) TArray EquippedItems; - UPROPERTY(SaceGame) + UPROPERTY(SaveGame) int32 DaysPassed = 0; UPROPERTY(SaveGame) diff --git a/Source/NakedDesire/SaveGame/SaveSubsystem.cpp b/Source/NakedDesire/SaveGame/SaveSubsystem.cpp index 8a368eff..dbbfac6c 100644 --- a/Source/NakedDesire/SaveGame/SaveSubsystem.cpp +++ b/Source/NakedDesire/SaveGame/SaveSubsystem.cpp @@ -19,14 +19,10 @@ void USaveSubsystem::AddItem(const FItemSaveRecord& Record) 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)