-
{{ message.character.name }}
+
{{ message.character }}
{{ message.message }}
@@ -21,7 +21,7 @@
diff --git a/src/components/game/gui/Clock.vue b/src/components/game/gui/Clock.vue
index 5d97111..f5f9938 100644
--- a/src/components/game/gui/Clock.vue
+++ b/src/components/game/gui/Clock.vue
@@ -7,6 +7,7 @@
diff --git a/src/components/game/map/Characters.vue b/src/components/game/map/Characters.vue
index 611cc88..39228c2 100644
--- a/src/components/game/map/Characters.vue
+++ b/src/components/game/map/Characters.vue
@@ -3,6 +3,7 @@
diff --git a/src/components/game/map/Map.vue b/src/components/game/map/Map.vue
index cb38a11..fe891ef 100644
--- a/src/components/game/map/Map.vue
+++ b/src/components/game/map/Map.vue
@@ -5,6 +5,7 @@
diff --git a/src/components/game/map/partials/PlacedMapObject.vue b/src/components/game/map/partials/PlacedMapObject.vue
index 9e3a4cd..74eeabc 100644
--- a/src/components/game/map/partials/PlacedMapObject.vue
+++ b/src/components/game/map/partials/PlacedMapObject.vue
@@ -61,7 +61,7 @@ function calculateObjectPlacement(mapObj: PlacedMapObject): { x: number; y: numb
const imageProps = computed(() => ({
alpha: mapEditor.movingPlacedObject.value?.id == props.placedMapObject.id || mapEditor.selectedMapObject.value?.id == props.placedMapObject.id ? 0.5 : 1,
tint: mapEditor.selectedPlacedObject.value?.id == props.placedMapObject.id ? 0x00ff00 : 0xffffff,
- depth: calculateIsometricDepth(props.placedMapObject.positionX, props.placedMapObject.positionY, mapObject.value!.frameWidth, mapObject.value!.frameHeight),
+ depth: calculateIsometricDepth(props.placedMapObject.positionX, props.placedMapObject.positionY, mapObject.value!.frameWidth, mapObject.value!.frameHeight, mapObject.value!.originX, mapObject.value!.originY),
...calculateObjectPlacement(props.placedMapObject),
flipX: props.placedMapObject.isRotated,
texture: mapObject.value!.id,
diff --git a/src/components/gameMaster/assetManager/partials/characterHair/CharacterHairDetails.vue b/src/components/gameMaster/assetManager/partials/characterHair/CharacterHairDetails.vue
index 71f5501..9cdf891 100644
--- a/src/components/gameMaster/assetManager/partials/characterHair/CharacterHairDetails.vue
+++ b/src/components/gameMaster/assetManager/partials/characterHair/CharacterHairDetails.vue
@@ -34,6 +34,7 @@
diff --git a/src/components/screens/MapEditor.vue b/src/components/screens/MapEditor.vue
index dff2a13..bb39eec 100644
--- a/src/components/screens/MapEditor.vue
+++ b/src/components/screens/MapEditor.vue
@@ -19,6 +19,7 @@
diff --git a/src/composables/controls/useGameControlsComposable.ts b/src/composables/controls/useGameControlsComposable.ts
index 3325997..ce36396 100644
--- a/src/composables/controls/useGameControlsComposable.ts
+++ b/src/composables/controls/useGameControlsComposable.ts
@@ -1,3 +1,4 @@
+import { SocketEvent } from '@/application/enums'
import { getTile } from '@/services/mapService'
import { useGameStore } from '@/stores/gameStore'
import type { Ref } from 'vue'
@@ -22,7 +23,7 @@ export function useGameControlsComposable(scene: Phaser.Scene, layer: Phaser.Til
const pointerTile = getTile(layer, pointer.worldX, pointer.worldY)
if (!pointerTile) return
- gameStore.connection?.emit('map:character:move', {
+ gameStore.connection?.emit(SocketEvent.MAP_CHARACTER_MOVE, {
positionX: pointerTile.x,
positionY: pointerTile.y
})
@@ -37,7 +38,7 @@ export function useGameControlsComposable(scene: Phaser.Scene, layer: Phaser.Til
if (['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'].includes(event.key)) {
// Prevent key repeat events
if (event.repeat) return
-
+
pressedKeys.add(event.key)
// Start movement loop if not already running
@@ -49,7 +50,7 @@ export function useGameControlsComposable(scene: Phaser.Scene, layer: Phaser.Til
// Attack on CTRL
if (event.key === 'Control') {
- gameStore.connection?.emit('map:character:attack')
+ gameStore.connection?.emit(SocketEvent.MAP_CHARACTER_ATTACK)
}
}
@@ -65,9 +66,6 @@ export function useGameControlsComposable(scene: Phaser.Scene, layer: Phaser.Til
function moveCharacter() {
if (!gameStore.character) return
-
- // Don't allow movement while attacking
- if (gameStore.character.isAttacking) return
const { positionX, positionY } = gameStore.character
let newX = positionX
@@ -81,7 +79,7 @@ export function useGameControlsComposable(scene: Phaser.Scene, layer: Phaser.Til
// Only emit if position changed
if (newX !== positionX || newY !== positionY) {
- gameStore.connection?.emit('map:character:move', {
+ gameStore.connection?.emit(SocketEvent.MAP_CHARACTER_MOVE, {
positionX: newX,
positionY: newY
})
diff --git a/src/composables/useCharacterSpriteComposable.ts b/src/composables/useCharacterSpriteComposable.ts
index 171938f..5c0449d 100644
--- a/src/composables/useCharacterSpriteComposable.ts
+++ b/src/composables/useCharacterSpriteComposable.ts
@@ -18,7 +18,7 @@ export function useCharacterSpriteComposable(scene: Phaser.Scene, tilemap: Phase
const tween = ref
(null)
const updateIsometricDepth = (positionX: number, positionY: number) => {
- isometricDepth.value = calculateIsometricDepth(positionX, positionY, 30, 95, true)
+ isometricDepth.value = calculateIsometricDepth(positionX, positionY, 30, 95)
}
const updatePosition = (positionX: number, positionY: number) => {
diff --git a/src/services/mapService.ts b/src/services/mapService.ts
index fd4d1bf..daf22fe 100644
--- a/src/services/mapService.ts
+++ b/src/services/mapService.ts
@@ -62,13 +62,18 @@ export function createTileArray(width: number, height: number, tile: string = 'b
return Array.from({ length: height }, () => Array.from({ length: width }, () => tile))
}
-export const calculateIsometricDepth = (positionX: number, positionY: number, width: number = 0, height: number = 0, isCharacter: boolean = false) => {
- const baseDepth = positionX + positionY
- if (isCharacter) {
- return baseDepth
- }
- return baseDepth + (width + height) / (2 * config.tile_size.width)
-}
+export const calculateIsometricDepth = (
+ positionX: number,
+ positionY: number,
+ objectWidth: number = 0,
+ objectHeight: number = 0
+): number => {
+ const tileWidth = config.tile_size.width;
+ const tileHeight = config.tile_size.height;
+ const tileSize = Math.max(tileWidth, tileHeight);
+ const objectSize = Math.max(objectWidth, objectHeight);
+ return Math.floor(positionY * tileSize + positionX * objectSize);
+};
async function loadTileTextures(tiles: TileT[], scene: Phaser.Scene) {
// Load each tile into the scene
diff --git a/src/stores/gameStore.ts b/src/stores/gameStore.ts
index 75fb55e..65ad950 100644
--- a/src/stores/gameStore.ts
+++ b/src/stores/gameStore.ts
@@ -1,4 +1,5 @@
import config from '@/application/config'
+import { SocketEvent } from '@/application/enums'
import type { Character, Notification, User, WorldSettings } from '@/application/types'
import { useCookies } from '@vueuse/integrations/useCookies'
import { defineStore } from 'pinia'
@@ -85,10 +86,10 @@ export const useGameStore = defineStore('game', {
})
// Let the server know the user is logged in
- this.connection.emit('login')
+ this.connection.emit(SocketEvent.LOGIN)
// set user
- this.connection.on('logged_in', (user: User) => {
+ this.connection.on(SocketEvent.LOGGED_IN, (user: User) => {
this.setUser(user)
})
@@ -98,7 +99,7 @@ export const useGameStore = defineStore('game', {
})
// Listen for new date from socket
- this.connection.on('date', (data: Date) => {
+ this.connection.on(SocketEvent.DATE, (data: Date) => {
this.world.date = new Date(data)
})
},
@@ -106,7 +107,7 @@ export const useGameStore = defineStore('game', {
// Remove event listeners
this.connection?.off('connect_error')
this.connection?.off('reconnect_failed')
- this.connection?.off('date')
+ this.connection?.off(SocketEvent.DATE)
this.connection?.disconnect()
useCookies().remove('token', {
diff --git a/src/stores/mapStore.ts b/src/stores/mapStore.ts
index 8537f9a..3f981b1 100644
--- a/src/stores/mapStore.ts
+++ b/src/stores/mapStore.ts
@@ -6,7 +6,6 @@ export const useMapStore = defineStore('map', {
return {
mapId: '',
characters: [] as MapCharacter[],
- characterLoaded: false
}
},
getters: {
@@ -36,9 +35,6 @@ export const useMapStore = defineStore('map', {
removeCharacter(characterId: UUID) {
this.characters = this.characters.filter((char) => char.character.id !== characterId)
},
- setCharacterLoaded(loaded: boolean) {
- this.characterLoaded = loaded
- },
updateCharacterPosition(data: { characterId: UUID; positionX: number; positionY: number; rotation: number; isMoving: boolean }) {
const character = this.characters.find((char) => char.character.id === data.characterId)
if (character) {
@@ -51,7 +47,6 @@ export const useMapStore = defineStore('map', {
reset() {
this.mapId = ''
this.characters = []
- this.characterLoaded = false
}
}
})
diff --git a/vite.config.ts b/vite.config.ts
index 119a5e4..46e5595 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -2,6 +2,7 @@ import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue';
import viteCompression from 'vite-plugin-compression';
+import {ViteImageOptimizer} from "vite-plugin-image-optimizer";
// https://vitejs.dev/config/
export default defineConfig({
@@ -11,7 +12,8 @@ export default defineConfig({
algorithm: 'gzip',
ext: '.gz',
threshold: 10240 // Only compress files larger than 10KB
- })
+ }),
+ ViteImageOptimizer()
],
build: {
minify: 'terser', // Better minification