the placement of map objects sometimes placed in a tile that the mouse wasnt over. but i didnt try reproducing the issue. opening map editor doesnt close the gm window (nor show the map editor). not obvious. side panels like map objects doesnt have a close button. so i was only able to close it by switching to "move" tool.
138 lines
3.2 KiB
TypeScript
138 lines
3.2 KiB
TypeScript
import type { Map, MapObject, PlacedMapObject, UUID } from '@/application/types'
|
|
import { ref } from 'vue'
|
|
import {useGameStore} from "@/stores/gameStore";
|
|
|
|
export type TeleportSettings = {
|
|
toMapId: string
|
|
toPositionX: number
|
|
toPositionY: number
|
|
toRotation: number
|
|
}
|
|
|
|
const currentMap = ref<Map | null>(null)
|
|
const active = ref(false)
|
|
const tool = ref('move')
|
|
const drawMode = ref('tile')
|
|
const inputMode = ref('tap')
|
|
const selectedTile = ref('')
|
|
const isPlacedMapObjectPreviewEnabled = ref(true)
|
|
const selectedMapObject = ref<MapObject | null>(null)
|
|
const movingPlacedObject = ref<PlacedMapObject | null>(null)
|
|
const selectedPlacedObject = ref<PlacedMapObject | null>(null)
|
|
const shouldClearTiles = ref(false)
|
|
const teleportSettings = ref<TeleportSettings>({
|
|
toMapId: '1000',
|
|
toPositionX: 0,
|
|
toPositionY: 0,
|
|
toRotation: 0
|
|
})
|
|
|
|
/**
|
|
* We can update origin X and Y in src/components/gameMaster/mapEditor/partials/SelectedPlacedMapObject.vue
|
|
* and this will trigger a refresh for spawned mao objects
|
|
*/
|
|
const refreshMapObject = ref(0)
|
|
|
|
export function useMapEditorComposable() {
|
|
const loadMap = (map: Map) => {
|
|
currentMap.value = map
|
|
}
|
|
|
|
const updateProperty = <K extends keyof Map>(property: K, value: Map[K]) => {
|
|
if (currentMap.value) {
|
|
currentMap.value[property] = value
|
|
}
|
|
}
|
|
|
|
const toggleActive = () => {
|
|
if (active.value) reset()
|
|
active.value = !active.value
|
|
const gameStore = useGameStore()
|
|
gameStore.toggleGmPanel()
|
|
}
|
|
|
|
const togglePlacedMapObjectPreview = () => {
|
|
isPlacedMapObjectPreviewEnabled.value = !isPlacedMapObjectPreviewEnabled.value
|
|
}
|
|
|
|
const setTool = (newTool: string) => {
|
|
tool.value = newTool
|
|
}
|
|
|
|
const setDrawMode = (mode: string) => {
|
|
drawMode.value = mode
|
|
}
|
|
|
|
const setInputMode = (mode: string) => {
|
|
inputMode.value = mode
|
|
}
|
|
|
|
const setSelectedTile = (tile: string) => {
|
|
selectedTile.value = tile
|
|
}
|
|
|
|
const setSelectedMapObject = (mapObject: MapObject) => {
|
|
selectedMapObject.value = mapObject
|
|
}
|
|
|
|
const setTeleportSettings = (settings: TeleportSettings) => {
|
|
teleportSettings.value = settings
|
|
}
|
|
|
|
const triggerClearTiles = () => {
|
|
shouldClearTiles.value = true
|
|
}
|
|
|
|
const resetClearTilesFlag = () => {
|
|
shouldClearTiles.value = false
|
|
}
|
|
|
|
function triggerMapObjectRefresh() {
|
|
refreshMapObject.value++ // Increment to trigger watchers
|
|
}
|
|
|
|
const reset = () => {
|
|
tool.value = 'move'
|
|
drawMode.value = 'tile'
|
|
inputMode.value = 'tap'
|
|
selectedTile.value = ''
|
|
isPlacedMapObjectPreviewEnabled.value = false
|
|
selectedMapObject.value = null
|
|
shouldClearTiles.value = false
|
|
refreshMapObject.value = 0
|
|
}
|
|
|
|
return {
|
|
// State
|
|
currentMap,
|
|
active,
|
|
tool,
|
|
drawMode,
|
|
inputMode,
|
|
selectedTile,
|
|
isPlacedMapObjectPreviewEnabled,
|
|
selectedMapObject,
|
|
movingPlacedObject,
|
|
selectedPlacedObject,
|
|
shouldClearTiles,
|
|
teleportSettings,
|
|
refreshMapObject,
|
|
|
|
// Methods
|
|
loadMap,
|
|
updateProperty,
|
|
toggleActive,
|
|
setTool,
|
|
setDrawMode,
|
|
setInputMode,
|
|
setSelectedTile,
|
|
togglePlacedMapObjectPreview,
|
|
setSelectedMapObject,
|
|
setTeleportSettings,
|
|
triggerClearTiles,
|
|
resetClearTilesFlag,
|
|
triggerMapObjectRefresh,
|
|
reset
|
|
}
|
|
}
|