import config from '@/application/config' import { getTile, tileToWorldXY } from '@/composables/mapComposable' import { useGameStore } from '@/stores/gameStore' import { useMapEditorStore } from '@/stores/mapEditorStore' import { computed, type Ref } from 'vue' export function useMapEditorPointerHandlers(scene: Phaser.Scene, layer: Phaser.Tilemaps.TilemapLayer, waypoint: Ref<{ visible: boolean; x: number; y: number }>, camera: Phaser.Cameras.Scene2D.Camera) { const gameStore = useGameStore() const mapEditorStore = useMapEditorStore() const isMoveTool = computed(() => mapEditorStore.tool === 'move') function updateWaypoint(pointer: Phaser.Input.Pointer) { const { x: px, y: py } = camera.getWorldPoint(pointer.x, pointer.y) const pointerTile = getTile(layer, px, py) if (pointerTile) { const worldPoint = tileToWorldXY(layer, pointerTile.x, pointerTile.y) if (!worldPoint.positionX || !worldPoint.positionY) return waypoint.value = { visible: true, x: worldPoint.positionX, y: worldPoint.positionY + config.tile_size.height + 15 } } else { waypoint.value.visible = false } } function dragMap(pointer: Phaser.Input.Pointer) { if (!gameStore.game.isPlayerDraggingCamera) return camera.setScroll(camera.scrollX - (pointer.x - pointer.prevPosition.x) / camera.zoom, scrollY - (pointer.y - pointer.prevPosition.y) / camera.zoom) } function handlePointerMove(pointer: Phaser.Input.Pointer) { if (isMoveTool.value || pointer.event.shiftKey) { dragMap(pointer) } updateWaypoint(pointer) } function handleZoom(pointer: Phaser.Input.Pointer) { if (pointer.event instanceof WheelEvent && pointer.event.shiftKey) { const deltaY = pointer.event.deltaY const zoomLevel = camera.zoom - deltaY * 0.005 if (zoomLevel > 0 && zoomLevel < 3) { camera.setZoom(zoomLevel) } } } const setupPointerHandlers = () => { 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_MOVE, handlePointerMove) scene.input.off(Phaser.Input.Events.POINTER_WHEEL, handleZoom) } return { setupPointerHandlers, cleanupPointerHandlers } }