client/src/stores/gameStore.ts

115 lines
3.2 KiB
TypeScript

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
}
}
})