import { ref, type Ref } from 'vue' import { getTile, tileToWorldXY } from '@/composables/zoneComposable' import { useGameStore } from '@/stores/gameStore' import config from '@/config' export function useGamePointerHandlers(scene: Phaser.Scene, layer: Phaser.Tilemaps.TilemapLayer, waypoint: Ref<{ visible: boolean; x: number; y: number }>, camera: Phaser.Cameras.Scene2D.Camera) { const gameStore = useGameStore() const lastDragTime = ref(0) const dragTimeout = 500 // 500ms timeout for dragging, to prevent accidental clicks function updateWaypoint(pointer: Phaser.Input.Pointer) { const { x: px, y: py } = camera.getWorldPoint(pointer.x, pointer.y) const pointerTile = getTile(px, py, layer) waypoint.value.visible = !!pointerTile if (!pointerTile) return const worldPoint = tileToWorldXY(layer, pointerTile.x, pointerTile.y) waypoint.value.x = worldPoint.positionX waypoint.value.y = worldPoint.positionY + config.tile_size.y + 15 } function dragZone(pointer: Phaser.Input.Pointer) { if (!gameStore.isPlayerDraggingCamera) return const { x, y, prevPosition } = pointer const { scrollX, scrollY, zoom } = camera camera.setScroll(scrollX - (x - prevPosition.x) / zoom, scrollY - (y - prevPosition.y) / zoom) lastDragTime.value = Date.now() } function handlePointerMove(pointer: Phaser.Input.Pointer) { dragZone(pointer) updateWaypoint(pointer) } function clickTile(pointer: Phaser.Input.Pointer) { const currentTime = Date.now() if (currentTime - lastDragTime.value < dragTimeout) { return } const { x: px, y: py } = camera.getWorldPoint(pointer.x, pointer.y) const pointerTile = getTile(px, py, layer) if (!pointerTile) return gameStore.connection?.emit('character:initMove', { positionX: pointerTile.x, positionY: pointerTile.y }) } function handleZoom(pointer: Phaser.Input.Pointer) { if (!(pointer.event instanceof WheelEvent) || !pointer.event.shiftKey) return const deltaY = pointer.event.deltaY let zoomLevel = camera.zoom - deltaY * 0.005 if(zoomLevel <= 0 || zoomLevel >= 3) return camera.setZoom(zoomLevel) } const setupPointerHandlers = () => { scene.input.on(Phaser.Input.Events.POINTER_UP, clickTile) scene.input.on(Phaser.Input.Events.POINTER_MOVE, handlePointerMove) scene.input.on(Phaser.Input.Events.POINTER_WHEEL, handleZoom) } const cleanupPointerHandlers = () => { scene.input.off(Phaser.Input.Events.POINTER_UP, clickTile) scene.input.off(Phaser.Input.Events.POINTER_MOVE, handlePointerMove) scene.input.off(Phaser.Input.Events.POINTER_WHEEL, handleZoom) } return { setupPointerHandlers, cleanupPointerHandlers } }