diff --git a/store/useInventoryStore.ts b/store/useInventoryStore.ts index 8935101..d28b837 100644 --- a/store/useInventoryStore.ts +++ b/store/useInventoryStore.ts @@ -2,140 +2,161 @@ import { create } from 'zustand'; import { persist } from 'zustand/middleware'; export interface InventoryState { - unlockedCharacters: string[]; - unlockedCustomizations: string[]; - unlockedDLCs: string[]; - items: Record; - offerings: Record; - - toggleItem: (id: string, category: 'characters' | 'customizations' | 'items' | 'offerings' | 'dlcs') => void; - setItemQuantity: (id: string, qty: number) => void; - setOfferingQuantity: (id: string, qty: number) => void; - - unlockAllInCategory: (category: 'characters' | 'customizations' | 'items' | 'offerings' | 'dlcs', allIds: string[], qty?: number) => void; - clearCategory: (category: 'characters' | 'customizations' | 'items' | 'offerings' | 'dlcs') => void; - clearAll: () => void; - importProfile: (profile: any) => void; + unlockedCharacters: string[]; + unlockedCustomizations: string[]; + unlockedDLCs: string[]; + unlockedPerks: string[]; + items: Record; + offerings: Record; + addons: Record; + + spoofItems: boolean; + spoofPerks: boolean; + spoofCatalog: boolean; + spoofDLCs: boolean; + + toggleItem: (id: string, category: 'characters' | 'customizations' | 'items' | 'offerings' | 'addons' | 'dlcs' | 'perks') => void; + setItemQuantity: (id: string, qty: number) => void; + setOfferingQuantity: (id: string, qty: number) => void; + setAddonQuantity: (id: string, qty: number) => void; + setToggle: (key: 'spoofItems' | 'spoofPerks' | 'spoofCatalog' | 'spoofDLCs', val: boolean) => void; + importToggles: (toggles: any) => void; + + unlockAllInCategory: (category: 'characters' | 'customizations' | 'items' | 'offerings' | 'addons' | 'dlcs' | 'perks', allIds: string[], qty?: number) => void; + clearCategory: (category: 'characters' | 'customizations' | 'items' | 'offerings' | 'addons' | 'dlcs' | 'perks') => void; + clearAll: () => void; + importProfile: (profile: any) => void; } export const useInventoryStore = create()( - persist( - (set) => ({ - unlockedCharacters: [], - unlockedCustomizations: [], - unlockedDLCs: [], - items: {}, - offerings: {}, + persist( + (set) => ({ + unlockedCharacters: [], + unlockedCustomizations: [], + unlockedDLCs: [], + unlockedPerks: [], + items: {}, + offerings: {}, + addons: {}, - toggleItem: (id, category) => set((state) => { - if (category === 'characters') { - const arr = state.unlockedCharacters; - return { - unlockedCharacters: arr.includes(id) ? arr.filter(i => i !== id) : [...arr, id] - }; - } else if (category === 'customizations') { - const arr = state.unlockedCustomizations; - return { - unlockedCustomizations: arr.includes(id) ? arr.filter(i => i !== id) : [...arr, id] - }; - } else if (category === 'dlcs') { - const arr = state.unlockedDLCs; - return { - unlockedDLCs: arr.includes(id) ? arr.filter(i => i !== id) : [...arr, id] - }; - } else if (category === 'items') { - const current = state.items[id] || 0; - const newItems = { ...state.items }; - if (current > 0) { - delete newItems[id]; - } else { - newItems[id] = 100; - } - return { items: newItems }; - } else { - const current = state.offerings[id] || 0; - const newOfferings = { ...state.offerings }; - if (current > 0) { - delete newOfferings[id]; - } else { - newOfferings[id] = 100; - } - return { offerings: newOfferings }; + spoofItems: false, + spoofPerks: false, + spoofCatalog: false, + spoofDLCs: false, + + setToggle: (key, val) => set({ [key]: val }), + + importToggles: (toggles) => set((state) => { + if (!toggles) return {}; + return { + spoofItems: typeof toggles.spoofItems === 'boolean' ? toggles.spoofItems : state.spoofItems, + spoofPerks: typeof toggles.spoofPerks === 'boolean' ? toggles.spoofPerks : state.spoofPerks, + spoofCatalog: typeof toggles.spoofCatalog === 'boolean' ? toggles.spoofCatalog : state.spoofCatalog, + spoofDLCs: typeof toggles.spoofDLCs === 'boolean' ? toggles.spoofDLCs : state.spoofDLCs, + }; + }), + + toggleItem: (id, category) => set((state) => { + if (category === 'characters') { + const arr = state.unlockedCharacters; + return { unlockedCharacters: arr.includes(id) ? arr.filter(i => i !== id) : [...arr, id] }; + } else if (category === 'customizations') { + const arr = state.unlockedCustomizations; + return { unlockedCustomizations: arr.includes(id) ? arr.filter(i => i !== id) : [...arr, id] }; + } else if (category === 'dlcs') { + const arr = state.unlockedDLCs; + return { unlockedDLCs: arr.includes(id) ? arr.filter(i => i !== id) : [...arr, id] }; + } else if (category === 'perks') { + const arr = state.unlockedPerks; + return { unlockedPerks: arr.includes(id) ? arr.filter(i => i !== id) : [...arr, id] }; + } else if (category === 'items') { + const newItems = { ...state.items }; + if ((newItems[id] || 0) > 0) delete newItems[id]; else newItems[id] = 100; + return { items: newItems }; + } else if (category === 'addons') { + const newAddons = { ...state.addons }; + if ((newAddons[id] || 0) > 0) delete newAddons[id]; else newAddons[id] = 100; + return { addons: newAddons }; + } else { + const newOfferings = { ...state.offerings }; + if ((newOfferings[id] || 0) > 0) delete newOfferings[id]; else newOfferings[id] = 100; + return { offerings: newOfferings }; + } + }), + + setItemQuantity: (id, qty) => set((state) => { + const newItems = { ...state.items }; + if (qty <= 0) delete newItems[id]; else newItems[id] = Math.min(32767, Math.max(0, qty)); + return { items: newItems }; + }), + + setOfferingQuantity: (id, qty) => set((state) => { + const newOfferings = { ...state.offerings }; + if (qty <= 0) delete newOfferings[id]; else newOfferings[id] = Math.min(32767, Math.max(0, qty)); + return { offerings: newOfferings }; + }), + + setAddonQuantity: (id, qty) => set((state) => { + const newAddons = { ...state.addons }; + if (qty <= 0) delete newAddons[id]; else newAddons[id] = Math.min(32767, Math.max(0, qty)); + return { addons: newAddons }; + }), + + unlockAllInCategory: (category, allIds, qty = 100) => set((state) => { + if (category === 'characters') return { unlockedCharacters: allIds }; + if (category === 'customizations') return { unlockedCustomizations: allIds }; + if (category === 'dlcs') return { unlockedDLCs: allIds }; + if (category === 'perks') return { unlockedPerks: allIds }; + if (category === 'items') { + const newItems = { ...state.items }; + allIds.forEach(id => { newItems[id] = qty; }); + return { items: newItems }; + } else if (category === 'addons') { + const newAddons = { ...state.addons }; + allIds.forEach(id => { newAddons[id] = qty; }); + return { addons: newAddons }; + } else { + const newOfferings = { ...state.offerings }; + allIds.forEach(id => { newOfferings[id] = qty; }); + return { offerings: newOfferings }; + } + }), + + clearCategory: (category) => set(() => { + if (category === 'characters') return { unlockedCharacters: [] }; + if (category === 'customizations') return { unlockedCustomizations: [] }; + if (category === 'dlcs') return { unlockedDLCs: [] }; + if (category === 'perks') return { unlockedPerks: [] }; + if (category === 'items') return { items: {} }; + if (category === 'addons') return { addons: {} }; + return { offerings: {} }; + }), + + clearAll: () => set({ + unlockedCharacters: [], + unlockedCustomizations: [], + unlockedDLCs: [], + unlockedPerks: [], + items: {}, + offerings: {}, + addons: {}, + }), + + importProfile: (profile) => set((state) => { + if (!profile) return {}; + return { + unlockedCharacters: Array.isArray(profile.unlockedCharacters) ? profile.unlockedCharacters : state.unlockedCharacters, + unlockedCustomizations: Array.isArray(profile.unlockedCustomizations) ? profile.unlockedCustomizations : state.unlockedCustomizations, + unlockedDLCs: Array.isArray(profile.unlockedDLCs) ? profile.unlockedDLCs : state.unlockedDLCs, + unlockedPerks: Array.isArray(profile.unlockedPerks) ? profile.unlockedPerks : state.unlockedPerks, + items: (profile.items && typeof profile.items === 'object') ? profile.items : state.items, + offerings: (profile.offerings && typeof profile.offerings === 'object') ? profile.offerings : state.offerings, + addons: (profile.addons && typeof profile.addons === 'object') ? profile.addons : state.addons, + }; + }) + }), + { + name: 'hex-unlocked-inventory', } - }), - - setItemQuantity: (id, qty) => set((state) => { - const newItems = { ...state.items }; - if (qty <= 0) { - delete newItems[id]; - } else { - newItems[id] = Math.min(32767, Math.max(0, qty)); - } - return { items: newItems }; - }), - - setOfferingQuantity: (id, qty) => set((state) => { - const newOfferings = { ...state.offerings }; - if (qty <= 0) { - delete newOfferings[id]; - } else { - newOfferings[id] = Math.min(32767, Math.max(0, qty)); - } - return { offerings: newOfferings }; - }), - - - unlockAllInCategory: (category, allIds, qty = 100) => set((state) => { - if (category === 'characters') { - return { unlockedCharacters: allIds }; - } else if (category === 'customizations') { - return { unlockedCustomizations: allIds }; - } else if (category === 'dlcs') { - return { unlockedDLCs: allIds }; - } else if (category === 'items') { - const newItems = { ...state.items }; - allIds.forEach(id => { - newItems[id] = qty; - }); - return { items: newItems }; - } else { - const newOfferings = { ...state.offerings }; - allIds.forEach(id => { - newOfferings[id] = qty; - }); - return { offerings: newOfferings }; - } - }), - - clearCategory: (category) => set((state) => { - if (category === 'characters') return { unlockedCharacters: [] }; - if (category === 'customizations') return { unlockedCustomizations: [] }; - if (category === 'dlcs') return { unlockedDLCs: [] }; - if (category === 'items') return { items: {} }; - return { offerings: {} }; - }), - - clearAll: () => set({ - unlockedCharacters: [], - unlockedCustomizations: [], - unlockedDLCs: [], - items: {}, - offerings: {}, - }), - - importProfile: (profile) => set((state) => { - if (!profile) return {}; - return { - unlockedCharacters: Array.isArray(profile.unlockedCharacters) ? profile.unlockedCharacters : state.unlockedCharacters, - unlockedCustomizations: Array.isArray(profile.unlockedCustomizations) ? profile.unlockedCustomizations : state.unlockedCustomizations, - unlockedDLCs: Array.isArray(profile.unlockedDLCs) ? profile.unlockedDLCs : state.unlockedDLCs, - items: (profile.items && typeof profile.items === 'object') ? profile.items : state.items, - offerings: (profile.offerings && typeof profile.offerings === 'object') ? profile.offerings : state.offerings, - }; - }) - }), - { - name: 'hex-unlocked-inventory', - } - ) + ) ); \ No newline at end of file