// © 2025 Naked People Team. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "GameFramework/SaveGame.h" #include "NakedDesire/Global/Constants.h" #include "ItemSaveRecord.h" #include "NakedDesire/Commissions/CommissionTypes.h" #include "GlobalSaveGameData.generated.h" class UItemInstance; UCLASS() class NAKEDDESIRE_API UGlobalSaveGameData : public USaveGame { GENERATED_BODY() public: static UGlobalSaveGameData* CreateNewSaveGame(); static UGlobalSaveGameData* LoadGame(const FString& SlotName = DefaultSaveSlotName); static bool SaveGame(UGlobalSaveGameData* SaveGameData, const FString& SlotName = DefaultSaveSlotName); UPROPERTY(SaveGame) bool HaveSeenTutorial = false; UPROPERTY(SaveGame) float Money = 0; FItemSaveRecord AddWardrobeItem(const UItemInstance* ItemInstance); bool UpdateWardrobeItem(UItemInstance* ItemInstance); bool RemoveWardrobeItem(UItemInstance* ItemInstance); TArray GetWardrobeItems() const { return WardrobeItems; } FItemSaveRecord AddEquippedItem(const UItemInstance* ItemInstance); void AddEquippedItem(const FItemSaveRecord& ItemRecord); bool UpdateEquippedItem(UItemInstance* ItemInstance); bool RemoveEquippedItem(UItemInstance* ItemInstance); TArray GetEquippedItems() const { return EquippedItems; } FItemSaveRecord AddWorldItem(const UItemInstance* ItemInstance, FTransform Transform); bool UpdateWorldItem(UItemInstance* ItemInstance, FTransform Transform); bool RemoveWorldItem(UItemInstance* ItemInstance); TArray GetWorldItems() const { return WorldItems; } // Commission board state (§13). State-level only; see FCommissionSaveRecord. TArray GetCommissionRecords() const { return Commissions; } void SetCommissionRecords(const TArray& InRecords) { Commissions = InRecords; } UPROPERTY(SaveGame) int32 DaysPassed = 0; // Time of day in minutes since 00:00, range [0, 1440). Owned by UTimeOfDaySubsystem. UPROPERTY(SaveGame) float MinuteOfDay = DAY_START_HOUR * MINUTES_PER_HOUR; // start the campaign at 08:00 // Endless mode disables the weekly rent charge / eviction (§3.3). UPROPERTY(SaveGame) bool bEndlessMode = false; // Day index of the most recent successful rent payment (book-keeping / bank UI). UPROPERTY(SaveGame) int32 LastRentChargeDay = 0; private: UPROPERTY(SaveGame) TArray WardrobeItems; UPROPERTY(SaveGame) TArray EquippedItems; UPROPERTY(SaveGame) TArray WorldItems; UPROPERTY(SaveGame) TArray Commissions; };