diff --git a/package-lock.json b/package-lock.json
index b7be796..fb111c7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -3690,9 +3690,9 @@
       }
     },
     "node_modules/es-module-lexer": {
-      "version": "1.5.4",
-      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz",
-      "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==",
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz",
+      "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==",
       "dev": true,
       "license": "MIT"
     },
diff --git a/src/application/types.ts b/src/application/types.ts
index a8a148e..17445e3 100644
--- a/src/application/types.ts
+++ b/src/application/types.ts
@@ -21,7 +21,7 @@ export type AssetDataT = {
   frameRate?: number
   frameWidth?: number
   frameHeight?: number
-  frameRate?: number
+  frameCount?: number
 }
 
 export type Tile = {
diff --git a/src/components/Effects.vue b/src/components/Effects.vue
index c9c100a..4df3424 100644
--- a/src/components/Effects.vue
+++ b/src/components/Effects.vue
@@ -55,20 +55,23 @@ const initializeEffects = (scene: Phaser.Scene) => {
   effects.light.value = scene.add.graphics().setDepth(1000)
 
   // Rain
-  effects.rain.value = scene.add.particles(0, 0, 'raindrop', {
-    x: { min: 0, max: window.innerWidth },
-    y: -50,
-    quantity: 5,
-    lifespan: 2000,
-    speedY: { min: 300, max: 500 },
-    scale: { start: 0.005, end: 0.005 },
-    alpha: { start: 0.5, end: 0 },
-    blendMode: 'ADD'
-  }).setDepth(900)
+  effects.rain.value = scene.add
+    .particles(0, 0, 'raindrop', {
+      x: { min: 0, max: window.innerWidth },
+      y: -50,
+      quantity: 5,
+      lifespan: 2000,
+      speedY: { min: 300, max: 500 },
+      scale: { start: 0.005, end: 0.005 },
+      alpha: { start: 0.5, end: 0 },
+      blendMode: 'ADD'
+    })
+    .setDepth(900)
   effects.rain.value.stop()
 
   // Fog
-  effects.fog.value = scene.add.sprite(window.innerWidth / 2, window.innerHeight / 2, 'fog')
+  effects.fog.value = scene.add
+    .sprite(window.innerWidth / 2, window.innerHeight / 2, 'fog')
     .setScale(2)
     .setAlpha(0)
     .setDepth(950)
@@ -77,10 +80,13 @@ const initializeEffects = (scene: Phaser.Scene) => {
 // Effect updates
 const updateScene = () => {
   const timeBasedLight = calculateLightStrength(gameStore.world.date)
-  const zoneEffects = zoneStore.zone?.zoneEffects?.reduce((acc, curr) => ({
-    ...acc,
-    [curr.effect]: curr.strength
-  }), {}) as { [key: string]: number }
+  const zoneEffects = zoneStore.zone?.zoneEffects?.reduce(
+    (acc, curr) => ({
+      ...acc,
+      [curr.effect]: curr.strength
+    }),
+    {}
+  ) as { [key: string]: number }
 
   // Only update effects once zoneEffects are loaded
   if (!zoneEffectsReady.value) {
@@ -91,13 +97,14 @@ const updateScene = () => {
     }
   }
 
-  const finalEffects = zoneEffects && Object.keys(zoneEffects).length
-    ? zoneEffects
-    : {
-      light: timeBasedLight,
-      rain: weatherState.value.isRainEnabled ? weatherState.value.rainPercentage : 0,
-      fog: weatherState.value.isFogEnabled ? weatherState.value.fogDensity * 100 : 0
-    }
+  const finalEffects =
+    zoneEffects && Object.keys(zoneEffects).length
+      ? zoneEffects
+      : {
+          light: timeBasedLight,
+          rain: weatherState.value.isRainEnabled ? weatherState.value.rainPercentage : 0,
+          fog: weatherState.value.isFogEnabled ? weatherState.value.fogDensity * 100 : 0
+        }
 
   applyEffects(finalEffects)
 }
@@ -105,16 +112,12 @@ const updateScene = () => {
 const applyEffects = (effectValues: any) => {
   if (effects.light.value) {
     const darkness = 1 - (effectValues.light ?? 100) / 100
-    effects.light.value.clear()
-      .fillStyle(0x000000, darkness)
-      .fillRect(0, 0, window.innerWidth, window.innerHeight)
+    effects.light.value.clear().fillStyle(0x000000, darkness).fillRect(0, 0, window.innerWidth, window.innerHeight)
   }
 
   if (effects.rain.value) {
     const strength = effectValues.rain ?? 0
-    strength > 0
-      ? effects.rain.value.start().setQuantity(Math.floor((strength / 100) * 10))
-      : effects.rain.value.stop()
+    strength > 0 ? effects.rain.value.start().setQuantity(Math.floor((strength / 100) * 10)) : effects.rain.value.stop()
   }
 
   if (effects.fog.value) {
@@ -126,19 +129,14 @@ const calculateLightStrength = (time: Date): number => {
   const hour = time.getHours()
   const minute = time.getMinutes()
 
-  if (hour >= LIGHT_CONFIG.SUNSET_HOUR || hour < LIGHT_CONFIG.SUNRISE_HOUR)
-    return LIGHT_CONFIG.NIGHT_STRENGTH
+  if (hour >= LIGHT_CONFIG.SUNSET_HOUR || hour < LIGHT_CONFIG.SUNRISE_HOUR) return LIGHT_CONFIG.NIGHT_STRENGTH
 
-  if (hour > LIGHT_CONFIG.SUNRISE_HOUR && hour < LIGHT_CONFIG.SUNSET_HOUR - 2)
-    return LIGHT_CONFIG.DAY_STRENGTH
+  if (hour > LIGHT_CONFIG.SUNRISE_HOUR && hour < LIGHT_CONFIG.SUNSET_HOUR - 2) return LIGHT_CONFIG.DAY_STRENGTH
 
-  if (hour === LIGHT_CONFIG.SUNRISE_HOUR)
-    return LIGHT_CONFIG.NIGHT_STRENGTH +
-      ((LIGHT_CONFIG.DAY_STRENGTH - LIGHT_CONFIG.NIGHT_STRENGTH) * minute) / 60
+  if (hour === LIGHT_CONFIG.SUNRISE_HOUR) return LIGHT_CONFIG.NIGHT_STRENGTH + ((LIGHT_CONFIG.DAY_STRENGTH - LIGHT_CONFIG.NIGHT_STRENGTH) * minute) / 60
 
   const totalMinutes = (hour - (LIGHT_CONFIG.SUNSET_HOUR - 2)) * 60 + minute
-  return LIGHT_CONFIG.DAY_STRENGTH -
-    (LIGHT_CONFIG.DAY_STRENGTH - LIGHT_CONFIG.NIGHT_STRENGTH) * (totalMinutes / 120)
+  return LIGHT_CONFIG.DAY_STRENGTH - (LIGHT_CONFIG.DAY_STRENGTH - LIGHT_CONFIG.NIGHT_STRENGTH) * (totalMinutes / 120)
 }
 
 // Socket and window handlers
@@ -157,17 +155,19 @@ const setupSocketListeners = () => {
 }
 
 const handleResize = () => {
-  if (effects.rain.value)
-    effects.rain.value.updateConfig({ x: { min: 0, max: window.innerWidth } })
-  if (effects.fog.value)
-    effects.fog.value.setPosition(window.innerWidth / 2, window.innerHeight / 2)
+  if (effects.rain.value) effects.rain.value.updateConfig({ x: { min: 0, max: window.innerWidth } })
+  if (effects.fog.value) effects.fog.value.setPosition(window.innerWidth / 2, window.innerHeight / 2)
 }
 
 // Lifecycle
-watch(() => zoneStore.zone, () => {
-  zoneEffectsReady.value = false
-  updateScene()
-}, { deep: true })
+watch(
+  () => zoneStore.zone,
+  () => {
+    zoneEffectsReady.value = false
+    updateScene()
+  },
+  { deep: true }
+)
 
 onMounted(() => window.addEventListener('resize', handleResize))
 
@@ -176,4 +176,4 @@ onBeforeUnmount(() => {
   if (sceneRef.value) sceneRef.value.scene.remove('effects')
   gameStore.connection?.off('weather')
 })
-</script>
\ No newline at end of file
+</script>
diff --git a/src/components/game/character/Character.vue b/src/components/game/character/Character.vue
index 38e4e04..f1a467f 100644
--- a/src/components/game/character/Character.vue
+++ b/src/components/game/character/Character.vue
@@ -3,7 +3,7 @@
   <Healthbar :zoneCharacter="props.zoneCharacter" :currentX="currentX" :currentY="currentY" />
   <Container ref="charContainer" :depth="isometricDepth" :x="currentX" :y="currentY">
     <CharacterHair :zoneCharacter="props.zoneCharacter" :currentX="currentX" :currentY="currentY" />
-<!--    <CharacterChest :zoneCharacter="props.zoneCharacter" :currentX="currentX" :currentY="currentY" />-->
+    <!--    <CharacterChest :zoneCharacter="props.zoneCharacter" :currentX="currentX" :currentY="currentY" />-->
     <Sprite ref="charSprite" :origin-y="1" :flipX="isFlippedX" />
   </Container>
 </template>
diff --git a/src/components/game/character/partials/CharacterChest.vue b/src/components/game/character/partials/CharacterChest.vue
index b64e942..238b6e4 100644
--- a/src/components/game/character/partials/CharacterChest.vue
+++ b/src/components/game/character/partials/CharacterChest.vue
@@ -31,16 +31,14 @@ const isFlippedX = computed(() => [6, 4].includes(props.zoneCharacter.character.
 const imageProps = computed(() => {
   // Get the current sprite action based on direction
   const direction = [0, 6].includes(props.zoneCharacter.character.rotation ?? 0) ? 'back' : 'front'
-  const spriteAction = props.zoneCharacter.character.characterHair?.sprite?.spriteActions?.find(
-    spriteAction => spriteAction.action === direction
-  )
+  const spriteAction = props.zoneCharacter.character.characterHair?.sprite?.spriteActions?.find((spriteAction) => spriteAction.action === direction)
 
   return {
     depth: 1,
     originX: Number(spriteAction?.originX) ?? 0,
     originY: Number(spriteAction?.originY) ?? 0,
     flipX: isFlippedX.value,
-    texture: texture.value,
+    texture: texture.value
     // y: props.zoneCharacter.isMoving ? Math.floor(Date.now() / 250) % 2 : 0
   }
 })
diff --git a/src/components/game/character/partials/CharacterHair.vue b/src/components/game/character/partials/CharacterHair.vue
index b8e25b6..0036ba8 100644
--- a/src/components/game/character/partials/CharacterHair.vue
+++ b/src/components/game/character/partials/CharacterHair.vue
@@ -31,9 +31,7 @@ const isFlippedX = computed(() => [6, 4].includes(props.zoneCharacter.character.
 const imageProps = computed(() => {
   // Get the current sprite action based on direction
   const direction = [0, 6].includes(props.zoneCharacter.character.rotation ?? 0) ? 'back' : 'front'
-  const spriteAction = props.zoneCharacter.character.characterHair?.sprite?.spriteActions?.find(
-    spriteAction => spriteAction.action === direction
-  )
+  const spriteAction = props.zoneCharacter.character.characterHair?.sprite?.spriteActions?.find((spriteAction) => spriteAction.action === direction)
 
   return {
     depth: 1,
diff --git a/src/components/game/zone/Zone.vue b/src/components/game/zone/Zone.vue
index 27370a4..eac611e 100644
--- a/src/components/game/zone/Zone.vue
+++ b/src/components/game/zone/Zone.vue
@@ -51,7 +51,7 @@ gameStore.connection!.on('zone:character:leave', (characterId: number) => {
   zoneStore.removeCharacter(characterId)
 })
 
-gameStore.connection!.on('character:move', (data: { id: number, positionX: number, positionY: number, rotation: number, isMoving: boolean }) => {
+gameStore.connection!.on('character:move', (data: { id: number; positionX: number; positionY: number; rotation: number; isMoving: boolean }) => {
   zoneStore.updateCharacterPosition(data)
 })
 
diff --git a/src/components/gameMaster/assetManager/partials/characterHair/CharacterHairList.vue b/src/components/gameMaster/assetManager/partials/characterHair/CharacterHairList.vue
index a40a022..c9b2e7b 100644
--- a/src/components/gameMaster/assetManager/partials/characterHair/CharacterHairList.vue
+++ b/src/components/gameMaster/assetManager/partials/characterHair/CharacterHairList.vue
@@ -11,7 +11,13 @@
   </div>
   <div v-bind="containerProps" class="overflow-y-auto relative p-2.5 rounded-md default-border bg-gray" @scroll="onScroll">
     <div v-bind="wrapperProps" ref="elementToScroll">
-      <a v-for="{ data: characterHair } in list" :key="characterHair.id" class="relative p-2.5 cursor-pointer block rounded hover:bg-cyan group" :class="{ 'bg-cyan': assetManagerStore.selectedCharacterHair?.id === characterHair.id }" @click="assetManagerStore.setSelectedCharacterHair(characterHair as CharacterHair)">
+      <a
+        v-for="{ data: characterHair } in list"
+        :key="characterHair.id"
+        class="relative p-2.5 cursor-pointer block rounded hover:bg-cyan group"
+        :class="{ 'bg-cyan': assetManagerStore.selectedCharacterHair?.id === characterHair.id }"
+        @click="assetManagerStore.setSelectedCharacterHair(characterHair as CharacterHair)"
+      >
         <div class="flex items-center gap-2.5">
           <span class="group-hover:text-white" :class="{ 'text-white': assetManagerStore.selectedCharacterHair?.id === characterHair.id }">{{ characterHair.name }}</span>
         </div>
diff --git a/src/components/gameMaster/assetManager/partials/characterType/CharacterTypeList.vue b/src/components/gameMaster/assetManager/partials/characterType/CharacterTypeList.vue
index ada453d..6809725 100644
--- a/src/components/gameMaster/assetManager/partials/characterType/CharacterTypeList.vue
+++ b/src/components/gameMaster/assetManager/partials/characterType/CharacterTypeList.vue
@@ -11,7 +11,13 @@
   </div>
   <div v-bind="containerProps" class="overflow-y-auto relative p-2.5 rounded-md default-border bg-gray" @scroll="onScroll">
     <div v-bind="wrapperProps" ref="elementToScroll">
-      <a v-for="{ data: characterType } in list" :key="characterType.id" class="relative p-2.5 cursor-pointer block rounded hover:bg-cyan group" :class="{ 'bg-cyan': assetManagerStore.selectedCharacterType?.id === characterType.id }" @click="assetManagerStore.setSelectedCharacterType(characterType as CharacterType)">
+      <a
+        v-for="{ data: characterType } in list"
+        :key="characterType.id"
+        class="relative p-2.5 cursor-pointer block rounded hover:bg-cyan group"
+        :class="{ 'bg-cyan': assetManagerStore.selectedCharacterType?.id === characterType.id }"
+        @click="assetManagerStore.setSelectedCharacterType(characterType as CharacterType)"
+      >
         <div class="flex items-center gap-2.5">
           <span class="group-hover:text-white" :class="{ 'text-white': assetManagerStore.selectedCharacterType?.id === characterType.id }">{{ characterType.name }}</span>
         </div>
diff --git a/src/components/gameMaster/assetManager/partials/item/itemDetails.vue b/src/components/gameMaster/assetManager/partials/item/itemDetails.vue
index 3415aa0..e1ca767 100644
--- a/src/components/gameMaster/assetManager/partials/item/itemDetails.vue
+++ b/src/components/gameMaster/assetManager/partials/item/itemDetails.vue
@@ -140,4 +140,4 @@ onMounted(() => {
 onBeforeUnmount(() => {
   assetManagerStore.setSelectedItem(null)
 })
-</script>
\ No newline at end of file
+</script>
diff --git a/src/components/gameMaster/assetManager/partials/item/itemList.vue b/src/components/gameMaster/assetManager/partials/item/itemList.vue
index a741333..2cdcc43 100644
--- a/src/components/gameMaster/assetManager/partials/item/itemList.vue
+++ b/src/components/gameMaster/assetManager/partials/item/itemList.vue
@@ -64,10 +64,7 @@ const filteredItems = computed(() => {
   if (!searchQuery.value) {
     return assetManagerStore.itemList
   }
-  return assetManagerStore.itemList.filter((item) =>
-    item.name.toLowerCase().includes(searchQuery.value.toLowerCase()) ||
-    item.itemType.toLowerCase().includes(searchQuery.value.toLowerCase())
-  )
+  return assetManagerStore.itemList.filter((item) => item.name.toLowerCase().includes(searchQuery.value.toLowerCase()) || item.itemType.toLowerCase().includes(searchQuery.value.toLowerCase()))
 })
 
 const { list, containerProps, wrapperProps, scrollTo } = useVirtualList(filteredItems, {
@@ -95,4 +92,4 @@ onMounted(() => {
     assetManagerStore.setItemList(response)
   })
 })
-</script>
\ No newline at end of file
+</script>
diff --git a/src/components/login/LoginForm.vue b/src/components/login/LoginForm.vue
index 58d9e46..d95eb50 100644
--- a/src/components/login/LoginForm.vue
+++ b/src/components/login/LoginForm.vue
@@ -1,5 +1,5 @@
 <template>
-  <form @submit.prevent="loginFunc" class="relative px-6 py-11">
+  <form @submit.prevent="submit" class="relative px-6 py-11">
     <div class="flex flex-col gap-5 p-2 mb-8 relative">
       <div class="w-full grid gap-3 relative">
         <input class="input-field xs:min-w-[350px] min-w-64" id="username-login" v-model="username" type="text" name="username" placeholder="Username" required autofocus />
@@ -7,7 +7,7 @@
           <input class="input-field xs:min-w-[350px] min-w-64" id="password-login" v-model="password" :type="showPassword ? 'text' : 'password'" name="password" placeholder="Password" required />
           <button type="button" @click.prevent="showPassword = !showPassword" :class="{ 'eye-open': showPassword }" class="bg-[url('/assets/icons/eye.svg')] p-0 absolute right-3 w-5 h-4 top-1/2 -translate-y-1/2 bg-no-repeat bg-center"></button>
         </div>
-        <span v-if="loginError" class="text-red-200 text-xs absolute top-full mt-1">{{ loginError }}</span>
+        <span v-if="formError" class="text-red-200 text-xs absolute top-full mt-1">{{ formError }}</span>
       </div>
       <button @click.stop="() => emit('openResetPasswordModal')" type="button" class="inline-flex self-end p-0 text-cyan-300 text-base">Forgot password?</button>
       <button class="btn-cyan px-0 xs:w-full" type="submit">Play now</button>
@@ -36,7 +36,7 @@ const emit = defineEmits(['openResetPasswordModal', 'switchToRegister'])
 const gameStore = useGameStore()
 const username = ref('')
 const password = ref('')
-const loginError = ref('')
+const formError = ref('')
 const showPassword = ref(false)
 
 // automatic login because of development
@@ -48,10 +48,10 @@ onMounted(async () => {
   }
 })
 
-async function loginFunc() {
+async function submit() {
   // check if username and password are valid
   if (username.value === '' || password.value === '') {
-    loginError.value = 'Please enter a valid username and password'
+    formError.value = 'Please enter a valid username and password'
     return
   }
 
@@ -59,7 +59,7 @@ async function loginFunc() {
   const response = await login(username.value, password.value)
 
   if (response.success === undefined) {
-    loginError.value = response.error
+    formError.value = response.error
     return
   }
   gameStore.setToken(response.token)
diff --git a/src/components/login/RegisterForm.vue b/src/components/login/RegisterForm.vue
index 206c086..46506c2 100644
--- a/src/components/login/RegisterForm.vue
+++ b/src/components/login/RegisterForm.vue
@@ -1,5 +1,5 @@
 <template>
-  <form @submit.prevent="registerFunc" class="relative px-6 py-11">
+  <form @submit.prevent="submit" class="relative px-6 py-11">
     <div class="flex flex-col gap-5 p-2 mb-8 relative">
       <div class="w-full grid gap-3 relative">
         <input class="input-field xs:min-w-[350px] min-w-64" id="username-register" v-model="username" type="text" name="username" placeholder="Username" required autofocus />
@@ -8,7 +8,7 @@
           <input class="input-field xs:min-w-[350px] min-w-64" id="password-register" v-model="password" :type="showPassword ? 'text' : 'password'" name="password" placeholder="Password" required />
           <button type="button" @click.prevent="showPassword = !showPassword" :class="{ 'eye-open': showPassword }" class="bg-[url('/assets/icons/eye.svg')] p-0 absolute right-3 w-4 h-3 top-1/2 -translate-y-1/2 bg-no-repeat"></button>
         </div>
-        <span v-if="loginError" class="text-red-200 text-xs -mt-2">{{ loginError }}</span>
+        <span v-if="formError" class="text-red-200 text-xs -mt-2">{{ formError }}</span>
       </div>
       <button class="btn-cyan xs:w-full" type="submit">Register now</button>
 
@@ -37,7 +37,7 @@ const gameStore = useGameStore()
 const username = ref('')
 const password = ref('')
 const email = ref('')
-const loginError = ref('')
+const formError = ref('')
 const showPassword = ref(false)
 
 // automatic login because of development
@@ -49,34 +49,15 @@ onMounted(async () => {
   }
 })
 
-async function loginFunc() {
-  // check if username and password are valid
-  if (username.value === '' || password.value === '') {
-    loginError.value = 'Please enter a valid username and password'
-    return
-  }
-
-  // send login event to server
-  const response = await login(username.value, password.value)
-
-  if (response.success === undefined) {
-    loginError.value = response.error
-    return
-  }
-  gameStore.setToken(response.token)
-  gameStore.initConnection()
-  return true // Indicate success
-}
-
-async function registerFunc() {
+async function submit() {
   // check if username and password are valid
   if (username.value === '' || email.value === '' || password.value === '') {
-    loginError.value = 'Please enter a valid username, email, and password'
+    formError.value = 'Please enter a valid username, email, and password'
     return
   }
 
   if (email.value === '') {
-    loginError.value = 'Please enter an email'
+    formError.value = 'Please enter an email'
     return
   }
 
@@ -84,14 +65,18 @@ async function registerFunc() {
   const response = await register(username.value, email.value, password.value)
 
   if (response.success === undefined) {
-    loginError.value = response.error
+    formError.value = response.error
     return
   }
 
-  const loginSuccess = await loginFunc()
-  if (!loginSuccess) {
-    loginError.value = 'Login after registration failed. Please try logging in manually.'
+  const loginResponse = await login(username.value, password.value)
+
+  if (!loginResponse) {
+    formError.value = 'Login after registration failed. Please try logging in manually.'
     return
   }
+
+  gameStore.setToken(loginResponse.token)
+  gameStore.initConnection()
 }
 </script>
diff --git a/src/components/screens/Characters.vue b/src/components/screens/Characters.vue
index e2c12f4..7ec391a 100644
--- a/src/components/screens/Characters.vue
+++ b/src/components/screens/Characters.vue
@@ -16,12 +16,7 @@
         <div class="flex w-full max-lg:flex-col lg:h-[400px] default-border rounded-md rounded-tl-none bg-gray">
           <div class="lg:min-w-[285px] max-lg:min-h-[383px] lg:w-1/3 h-full bg-[url('/assets/ui-texture.png')] bg-no-repeat bg-cover bg-center border-0 max-lg:border-b lg:border-r border-solid border-gray-500 max-lg:rounded-tr-md lg:rounded-bl-md relative">
             <div class="absolute right-full -top-px flex gap-1 flex-col">
-              <div
-                v-for="character in characters"
-                :key="character.id"
-                class="character relative rounded-l default-border w-9 h-[50px] bg-[url('/assets/ui-texture.png')] after:absolute after:w-full after:h-px after:bg-gray-500"
-                :class="{ active: selectedCharacterId === character.id }"
-              >
+              <div v-for="character in characters" :key="character.id" class="character relative rounded-l default-border w-9 h-[50px] bg-[url('/assets/ui-texture.png')] after:absolute after:w-full after:h-px after:bg-gray-500" :class="{ active: selectedCharacterId === character.id }">
                 <img src="/assets/placeholders/head.png" class="w-9 h-9 object-contain absolute top-1/2 -translate-y-1/2" alt="Player head" />
                 <input class="h-full w-full absolute m-0 z-10 hover:cursor-pointer focus-visible:outline-offset-0" type="radio" name="character" :value="character.id" v-model="selectedCharacterId" />
               </div>
@@ -33,13 +28,14 @@
             </div>
             <div class="py-6 px-8 h-[calc(100%_-_48px)] flex flex-col items-center gap-6 justify-center" v-if="selectedCharacterId">
               <input class="input-field w-[158px]" type="text" name="name" :placeholder="characters.find((c) => c.id == selectedCharacterId)?.name" />
-              <div class="flex flex-col gap-4 items-center">s
+              <div class="flex flex-col gap-4 items-center">
+                s
                 <div class="flex flex-col gap-3">
                   <div class="bg-[url('/assets/ui-elements/character-select-ui-shape.svg')] w-[190px] h-52 bg-no-repeat bg-center flex items-center justify-between">
                     <button class="ml-6 w-4 h-8 p-0">
                       <img src="/assets/icons/triangle-icon.svg" class="w-3 h-3.5 m-auto" alt="Arrow left" />
                     </button>
-                    <img class="w-24 object-contain mb-3.5" alt="Player avatar" :src="config.server_endpoint + '/avatar/s/' + characters.find(c => c.id === selectedCharacterId)?.characterType?.id + '/' + (selectedHairId ?? 'default')" />
+                    <img class="w-24 object-contain mb-3.5" alt="Player avatar" :src="config.server_endpoint + '/avatar/s/' + characters.find((c) => c.id === selectedCharacterId)?.characterType?.id + '/' + (selectedHairId ?? 'default')" />
                     <button class="mr-6 w-4 h-8 p-0">
                       <img src="/assets/icons/triangle-icon.svg" class="w-3 h-3.5 -scale-x-100" alt="Arrow right" />
                     </button>
diff --git a/src/components/screens/Login.vue b/src/components/screens/Login.vue
index 188bdad..9391586 100644
--- a/src/components/screens/Login.vue
+++ b/src/components/screens/Login.vue
@@ -6,7 +6,7 @@
     <div class="bg-[url('/assets/login/login-bg.png')] w-full lg:w-1/2 h-[35dvh] lg:h-dvh absolute left-0 max-lg:bottom-0 lg:top-0 bg-no-repeat bg-cover bg-center"></div>
     <div class="bg-gray-900 z-20 w-full lg:w-1/2 h-[65dvh] lg:h-dvh relative">
       <div class="h-dvh flex items-center lg:justify-center flex-col px-8 max-lg:pt-20">
-<!--        <img src="/assets/tlogo.png" class="mb-10 w-52" alt="Noxious logo" />-->
+        <!--        <img src="/assets/tlogo.png" class="mb-10 w-52" alt="Noxious logo" />-->
         <div class="relative">
           <img src="/assets/ui-elements/login-ui-box-outer.svg" class="absolute w-full h-full" alt="UI box outer" />
           <img src="/assets/ui-elements/login-ui-box-inner.svg" class="absolute left-2 top-2 w-[calc(100%_-_16px)] h-[calc(100%_-_16px)] max-lg:hidden" alt="UI box inner" />
diff --git a/src/components/utilities/Controls.vue b/src/components/utilities/Controls.vue
index 83a3345..b924bfc 100644
--- a/src/components/utilities/Controls.vue
+++ b/src/components/utilities/Controls.vue
@@ -32,21 +32,13 @@ const { setupPointerHandlers, cleanupPointerHandlers } = usePointerHandlers(scen
 function handleScrollZoom(pointer: Phaser.Input.Pointer) {
   if (!(pointer.event instanceof WheelEvent && pointer.event.shiftKey)) return
 
-  const zoomLevel = Phaser.Math.Clamp(
-    camera.zoom - pointer.event.deltaY * ZOOM_SETTINGS.WHEEL_FACTOR,
-    ZOOM_SETTINGS.MIN,
-    ZOOM_SETTINGS.MAX
-  )
+  const zoomLevel = Phaser.Math.Clamp(camera.zoom - pointer.event.deltaY * ZOOM_SETTINGS.WHEEL_FACTOR, ZOOM_SETTINGS.MIN, ZOOM_SETTINGS.MAX)
   camera.setZoom(zoomLevel)
 }
 
 function handleKeyComboZoom(event: { keyCodes: number[] }) {
   const deltaY = event.keyCodes[1] === 38 ? 1 : -1 // 38 is Up, 40 is Down
-  const zoomLevel = Phaser.Math.Clamp(
-    camera.zoom + deltaY * ZOOM_SETTINGS.KEY_FACTOR,
-    ZOOM_SETTINGS.MIN,
-    ZOOM_SETTINGS.MAX
-  )
+  const zoomLevel = Phaser.Math.Clamp(camera.zoom + deltaY * ZOOM_SETTINGS.KEY_FACTOR, ZOOM_SETTINGS.MIN, ZOOM_SETTINGS.MAX)
   camera.setZoom(zoomLevel)
 }
 
@@ -63,4 +55,4 @@ onBeforeUnmount(() => {
   scene.input.keyboard?.off('keycombomatch')
   scene.input.off(Phaser.Input.Events.POINTER_WHEEL, handleScrollZoom)
 })
-</script>
\ No newline at end of file
+</script>
diff --git a/src/composables/gameComposable.ts b/src/composables/gameComposable.ts
index f5f5787..fcfe1c8 100644
--- a/src/composables/gameComposable.ts
+++ b/src/composables/gameComposable.ts
@@ -61,8 +61,9 @@ export async function loadSpriteTextures(scene: Phaser.Scene, sprite: Sprite) {
 
   // @TODO: Fix this
   const sprite_actions: HttpResponse<any[]> = await fetch(config.server_endpoint + '/assets/list_sprite_actions/' + sprite?.id).then((response) => response.json())
-  
+
   for await (const sprite_action of sprite_actions.data ?? []) {
+    console.log(sprite_action)
     await loadTexture(scene, {
       key: sprite_action.key,
       data: sprite_action.data,
@@ -73,7 +74,7 @@ export async function loadSpriteTextures(scene: Phaser.Scene, sprite: Sprite) {
       isAnimated: sprite_action.isAnimated,
       frameWidth: sprite_action.frameWidth,
       frameHeight: sprite_action.frameHeight,
-      frameRate: sprite_action.frameRate,
+      frameRate: sprite_action.frameRate
     } as AssetDataT)
 
     // If the sprite is not animated, skip
@@ -88,7 +89,7 @@ export async function loadSpriteTextures(scene: Phaser.Scene, sprite: Sprite) {
     scene.anims.create({
       key: sprite_action.key,
       frameRate: sprite_action.frameRate,
-      frames: scene.anims.generateFrameNumbers(sprite_action.key, { start: 0, end: sprite_action.frameRate! - 1 }),
+      frames: scene.anims.generateFrameNumbers(sprite_action.key, { start: 0, end: sprite_action.frameCount! - 1 }),
       repeat: -1
     })
   }
diff --git a/src/services/authentication.ts b/src/services/authentication.ts
index 2ed37a7..035d761 100644
--- a/src/services/authentication.ts
+++ b/src/services/authentication.ts
@@ -6,8 +6,10 @@ import { getDomain } from '@/application/utilities'
 export async function register(username: string, email: string, password: string) {
   try {
     const response = await axios.post(`${config.server_endpoint}/register`, { username, email, password })
-    useCookies().set('token', response.data.data.token as string)
-    return { success: true, token: response.data.data.token }
+    if (response.status === 200) {
+      return { success: true }
+    }
+    return { error: response.data.message }
   } catch (error: any) {
     if (typeof error.response?.data === 'undefined') {
       return { error: 'Could not connect to server' }
diff --git a/src/storage/assetStorage.ts b/src/storage/assetStorage.ts
index afe2095..54b4304 100644
--- a/src/storage/assetStorage.ts
+++ b/src/storage/assetStorage.ts
@@ -33,9 +33,10 @@ export class AssetStorage {
         originX: asset.originX,
         originY: asset.originY,
         isAnimated: asset.isAnimated,
+        frameRate: asset.frameRate,
         frameWidth: asset.frameWidth,
         frameHeight: asset.frameHeight,
-        frameRate: asset.frameRate
+        frameCount: asset.frameCount
       })
     } catch (error) {
       console.error(`Failed to add asset ${asset.key}:`, error)
diff --git a/src/stores/zoneStore.ts b/src/stores/zoneStore.ts
index 67552e7..ce66218 100644
--- a/src/stores/zoneStore.ts
+++ b/src/stores/zoneStore.ts
@@ -40,10 +40,10 @@ export const useZoneStore = defineStore('zone', {
     setCharacterLoaded(loaded: boolean) {
       this.characterLoaded = loaded
     },
-    updateCharacterPosition(data: { id: number, positionX: number, positionY: number, rotation: number, isMoving: boolean }) {
-      const character = this.characters.find(char => char.character.id === data.id)
+    updateCharacterPosition(data: { id: number; positionX: number; positionY: number; rotation: number; isMoving: boolean }) {
+      const character = this.characters.find((char) => char.character.id === data.id)
       if (character) {
-        character.character.positionX= data.positionX
+        character.character.positionX = data.positionX
         character.character.positionY = data.positionY
         character.character.rotation = data.rotation
         character.isMoving = data.isMoving