import config from '@/application/config' import { getTile, tileToWorldXY } from '@/composables/mapComposable' import { useGameStore } from '@/stores/gameStore' import { ref, type Ref } from 'vue' 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 pointerStartPosition = ref({ x: 0, y: 0 }) const dragThreshold = 5 // pixels function updateWaypoint(worldX: number, worldY: number) { const pointerTile = getTile(layer, worldX, worldY) if (!pointerTile) { waypoint.value.visible = false return } const worldPoint = tileToWorldXY(layer, pointerTile.x, pointerTile.y) if (!worldPoint.worldPositionX || !worldPoint.worldPositionX) return waypoint.value = { visible: true, x: worldPoint.worldPositionX, y: worldPoint.worldPositionY + config.tile_size.height + 15 } } function handlePointerDown(pointer: Phaser.Input.Pointer) { pointerStartPosition.value = { x: pointer.x, y: pointer.y } gameStore.setPlayerDraggingCamera(true) } function handlePointerMove(pointer: Phaser.Input.Pointer) { updateWaypoint(pointer.worldX, pointer.worldY) if (!gameStore.game.isPlayerDraggingCamera) return const distance = Phaser.Math.Distance.Between( pointerStartPosition.value.x, pointerStartPosition.value.y, pointer.x, pointer.y ) if (distance <= dragThreshold) return camera.setScroll( camera.scrollX - (pointer.x - pointer.prevPosition.x) / camera.zoom, camera.scrollY - (pointer.y - pointer.prevPosition.y) / camera.zoom ) } function handlePointerUp(pointer: Phaser.Input.Pointer) { gameStore.setPlayerDraggingCamera(false) const distance = Phaser.Math.Distance.Between( pointerStartPosition.value.x, pointerStartPosition.value.y, pointer.x, pointer.y ) if (distance > dragThreshold) return const pointerTile = getTile(layer, pointer.worldX, pointer.worldY) if (!pointerTile) return console.log(pointerTile.x, pointerTile.y) gameStore.connection?.emit('map:character:move', { positionX: pointerTile.x, positionY: pointerTile.y }) } const setupPointerHandlers = () => { scene.input.on(Phaser.Input.Events.POINTER_DOWN, handlePointerDown) scene.input.on(Phaser.Input.Events.POINTER_MOVE, handlePointerMove) scene.input.on(Phaser.Input.Events.POINTER_UP, handlePointerUp) } const cleanupPointerHandlers = () => { scene.input.off(Phaser.Input.Events.POINTER_DOWN, handlePointerDown) scene.input.off(Phaser.Input.Events.POINTER_MOVE, handlePointerMove) scene.input.off(Phaser.Input.Events.POINTER_UP, handlePointerUp) } return { setupPointerHandlers, cleanupPointerHandlers } }