import { SocketEvent } from '@/application/enums' import type { Character, Notification, User, WorldSettings } from '@/application/types' import { socketManager } from '@/managers/SocketManager' import { defineStore } from 'pinia' export const useGameStore = defineStore('game', { state: () => { return { notifications: [] as Notification[], user: null as User | null, character: null as Character | null, world: { date: new Date(), weatherState: { rainPercentage: 0, fogDensity: 0 } } as WorldSettings, game: { isLoading: false, isLoaded: false, // isLoaded is currently being used to determine if the player has interacted with the game loadedTextures: [] as string[], isPlayerDraggingCamera: false, isCameraFollowingCharacter: false }, uiSettings: { isChatOpen: false, isCharacterProfileOpen: false, isGmPanelOpen: false } } }, getters: { isTextureLoaded: (state) => { return (key: string) => { return state.game.loadedTextures.includes(key) } } }, actions: { addNotification(notification: Notification) { if (!notification.id) { notification.id = Math.random().toString(16) } this.notifications.push(notification) }, removeNotification(id: string) { this.notifications = this.notifications.filter((notification: Notification) => notification.id !== id) }, setUser(user: User | null) { this.user = user }, setCharacter(character: Character | null) { this.character = character }, toggleGmPanel() { this.uiSettings.isGmPanelOpen = !this.uiSettings.isGmPanelOpen }, setPlayerDraggingCamera(moving: boolean) { this.game.isPlayerDraggingCamera = moving }, toggleChat() { this.uiSettings.isChatOpen = !this.uiSettings.isChatOpen }, toggleCharacterProfile() { this.uiSettings.isCharacterProfileOpen = !this.uiSettings.isCharacterProfileOpen }, initConnection() { const socket = socketManager.initConnection() // Handle connect error socket.on(SocketEvent.CONNECT_ERROR, () => { this.disconnectSocket() }) // Handle failed reconnection socket.on(SocketEvent.RECONNECT_FAILED, () => { this.disconnectSocket() }) // Emit login event socketManager.emit(SocketEvent.LOGIN) // Handle logged in event socketManager.on(SocketEvent.LOGGED_IN, (user: User) => { this.setUser(user) }) // Handle date updates socketManager.on(SocketEvent.DATE, (data: Date) => { this.world.date = new Date(data) }) }, disconnectSocket() { socketManager.disconnect() this.user = null this.character = null this.game.isLoaded = false this.game.loadedTextures = [] this.game.isPlayerDraggingCamera = false this.game.isCameraFollowingCharacter = false this.uiSettings.isChatOpen = false this.uiSettings.isCharacterProfileOpen = false this.uiSettings.isGmPanelOpen = false this.world.date = new Date() this.world.weatherState.rainPercentage = 0 this.world.weatherState.fogDensity = 0 } } })