From 4e708dbd61365ab865f912a844106f1e66f91688 Mon Sep 17 00:00:00 2001
From: Dennis Postma <dennis@directonline.io>
Date: Fri, 14 Jun 2024 21:17:45 +0200
Subject: [PATCH] zone editor stuff

---
 .../utilities/zoneEditor/Toolbar.vue          |  46 +++----
 .../utilities/zoneEditor/ZoneEditor.vue       |  26 ++--
 .../utilities/zoneEditor/ZoneSettings.vue     |   8 +-
 src/types.ts                                  | 112 ++++++++++++------
 4 files changed, 107 insertions(+), 85 deletions(-)

diff --git a/src/components/utilities/zoneEditor/Toolbar.vue b/src/components/utilities/zoneEditor/Toolbar.vue
index 15565db..2f02fda 100644
--- a/src/components/utilities/zoneEditor/Toolbar.vue
+++ b/src/components/utilities/zoneEditor/Toolbar.vue
@@ -10,24 +10,17 @@
 
         <button class="tool pencil" :class="{ active: zoneEditorStore.tool === 'pencil' }" @click="zoneEditorStore.setTool('pencil')">
           <img src="/assets/icons/zoneEditor/pencil.svg" alt="Pencil" />
-          <select v-model="drawMode" v-if="zoneEditorStore.tool === 'pencil'">
-            <option value="tile" :selected="zoneEditorStore.drawMode === 'tile'">tile</option>
-            <option value="wall" :selected="zoneEditorStore.drawMode === 'wall'">wall</option>
-            <option value="decoration" :selected="zoneEditorStore.drawMode === 'decoration'">decoration</option>
-            <option value="teleport" :selected="zoneEditorStore.drawMode === 'teleport'">teleport</option>
-            <option value="blocking_tile" :selected="zoneEditorStore.drawMode === 'blocking_tile'">blocking tile</option>
-          </select>
           <div class="select" v-if="zoneEditorStore.tool === 'pencil'">
             <div class="select-trigger" :class="{ open: selectPencilOpen }" @click="selectPencilOpen = !selectPencilOpen">
               {{ zoneEditorStore.drawMode }}
               <img src="/assets/icons/zoneEditor/chevron.svg"/>
             </div>
             <div class="options" v-show="selectPencilOpen && zoneEditorStore.tool === 'pencil'">
-              <span class="option" data-value="tile">Tile</span>
-              <span class="option" data-value="wall">Wall</span>
-              <span class="option" data-value="decoration">Decoration</span>
-              <span class="option" data-value="teleport">Teleport</span>
-              <span class="option" data-value="blocking_tile">Blocking tile</span>
+              <span class="option" @click="setDrawMode('tile')">Tile</span>
+              <span class="option" @click="setDrawMode('wall')">Wall</span>
+              <span class="option" @click="setDrawMode('decoration')">Decoration</span>
+              <span class="option" @click="setDrawMode('teleport')">Teleport</span>
+              <span class="option" @click="setDrawMode('blocking tile')">Blocking tile</span>
             </div>
           </div>
         </button>
@@ -36,24 +29,17 @@
 
         <button class="tool eraser" :class="{ active: zoneEditorStore.tool === 'eraser' }" @click="zoneEditorStore.setTool('eraser')">
           <img src="/assets/icons/zoneEditor/eraser.svg" alt="Eraser" />
-          <select v-model="drawMode" v-if="zoneEditorStore.tool === 'pencil'">
-            <option value="tile" :selected="zoneEditorStore.drawMode === 'tile'">tile</option>
-            <option value="wall" :selected="zoneEditorStore.drawMode === 'wall'">wall</option>
-            <option value="decoration" :selected="zoneEditorStore.drawMode === 'decoration'">decoration</option>
-            <option value="teleport" :selected="zoneEditorStore.drawMode === 'teleport'">teleport</option>
-            <option value="blocking_tile" :selected="zoneEditorStore.drawMode === 'blocking_tile'">blocking tile</option>
-          </select>
           <div class="select" v-if="zoneEditorStore.tool === 'eraser'">
             <div class="select-trigger" :class="{ open: selectEraserOpen }" @click="selectEraserOpen = !selectEraserOpen">
               {{ zoneEditorStore.drawMode }}
               <img src="/assets/icons/zoneEditor/chevron.svg"/>
             </div>
             <div class="options" v-show="selectEraserOpen">
-              <span class="option" data-value="tile">Tile</span>
-              <span class="option" data-value="wall">Wall</span>
-              <span class="option" data-value="decoration">Decoration</span>
-              <span class="option" data-value="teleport">Teleport</span>
-              <span class="option" data-value="blocking_tile">Blocking tile</span>
+              <span class="option" @click="setDrawMode('tile')">Tile</span>
+              <span class="option" @click="setDrawMode('wall')">Wall</span>
+              <span class="option" @click="setDrawMode('decoration')">Decoration</span>
+              <span class="option" @click="setDrawMode('teleport')">Teleport</span>
+              <span class="option" @click="setDrawMode('blocking tile')">Blocking tile</span>
             </div>
           </div>
         </button>
@@ -94,14 +80,12 @@ const emit = defineEmits(['move', 'eraser', 'pencil', 'save'])
 let selectPencilOpen = ref(false);
 let selectEraserOpen = ref(false);
 
-
 // drawMode
-const drawMode = ref('tile')
-
-// on change of select
-watch(drawMode, (value) => {
+function setDrawMode(value: string) {
   zoneEditorStore.setDrawMode(value)
-})
+  selectPencilOpen.value = false
+  selectEraserOpen.value = false
+}
 
 function drawTile(pointer: Phaser.Input.Pointer) {
   if (zoneEditorStore.tool !== 'eraser' && zoneEditorStore.tool !== 'pencil') {
@@ -139,7 +123,7 @@ onBeforeUnmount(() => {
 })
 
 function clear() {
-  zoneEditorStore.setTiles(Array.from({ length: zoneEditorStore.zoneSettings?.width ?? 10 }, () => Array.from({ length: zoneEditorStore.zoneSettings?.height ?? 10 }, () => 0)))
+  zoneEditorStore.setTiles(Array.from({ length: zoneEditorStore.width ?? 10 }, () => Array.from({ length: zoneEditorStore.height ?? 10 }, () => 0)))
 }
 </script>
 
diff --git a/src/components/utilities/zoneEditor/ZoneEditor.vue b/src/components/utilities/zoneEditor/ZoneEditor.vue
index 808c257..8f1e6b8 100644
--- a/src/components/utilities/zoneEditor/ZoneEditor.vue
+++ b/src/components/utilities/zoneEditor/ZoneEditor.vue
@@ -2,8 +2,8 @@
   <TilemapLayerC :tilemap="tileMap" :tileset="zoneEditorStore.tiles" :layerIndex="0" :cull-padding-x="10" :cull-padding-y="10" />
   <Controls :layer="layer" />
   <Toolbar :layer="layer" @eraser="eraser" @pencil="pencil" @save="save" />
-  <Tiles v-if="zoneEditorStore.tool === 'pencil' || zoneEditorStore.tool === 'eraser'" />
-  <Walls v-if="zoneEditorStore.tool === 'pencil' || zoneEditorStore.tool === 'eraser'" />
+  <Tiles v-if="(zoneEditorStore.tool === 'pencil' || zoneEditorStore.tool === 'eraser') && zoneEditorStore.drawMode === 'tile'" />
+  <Walls v-if="(zoneEditorStore.tool === 'pencil' || zoneEditorStore.tool === 'eraser') && zoneEditorStore.drawMode === 'wall'" />
   <ZoneSettings v-if="zoneEditorStore.isSettingsModalShown" />
 </template>
 
@@ -28,7 +28,7 @@ let scene = useScene()
 const socket = useSocketStore()
 const zoneEditorStore = useZoneEditorStore()
 
-let tileMap = generateTilemap(scene, 10, 10);
+let tileMap = generateTilemap(scene, zoneEditorStore.width, zoneEditorStore.height);
 let tileset: Tileset = tileMap.addTilesetImage('default', 'tiles') as Tileset
 let layer: TilemapLayer = tileMap.createBlankLayer('layer', tileset, 0, config.tile_size.y) as TilemapLayer
 
@@ -41,25 +41,25 @@ onBeforeMount(() => {
   socket.connection.emit('gm:zone_editor:zone:request', { zoneId: socket.character.zoneId })
 })
 
-const tiles = Array.from({ length: 10 }, () => Array.from({ length: 10 }, () => 0))
+const tiles = Array.from({ length: zoneEditorStore.width }, () => Array.from({ length: zoneEditorStore.height }, () => 0))
 zoneEditorStore.setTiles(tiles)
 zoneEditorStore.tiles.forEach((row, y) => row.forEach((tile, x) => layer.putTileAt(tile, x, y)))
 
 // Watch for changes in the zoneStore and update the layer
-watch(
-  () => zoneEditorStore.tiles,
-  () => {
-    // @TODO : change to zone for when loading other maps
-    zoneEditorStore.tiles.forEach((row, y) => row.forEach((tile, x) => layer.putTileAt(tile, x, y)))
-  },
-  { deep: true }
-)
+// watch(
+//   () => zoneEditorStore.tiles,
+//   () => {
+//     // @TODO : change to zone for when loading other maps
+//     zoneEditorStore.tiles.forEach((row, y) => row.forEach((tile, x) => layer.putTileAt(tile, x, y)))
+//   },
+//   { deep: true }
+// )
 
 socket.connection.on('gm:zone_editor:zone:load', (data: Zone) => {
   tileMap = generateTilemap(scene, data.width, data.height);
   zoneEditorStore.setName(data.name)
   zoneEditorStore.setWidth(data.width)
-  zoneEditorStore.setTiles(data.tiles)
+  zoneEditorStore.setTiles(data.tilesForPublic)
 })
 
 function eraser(tile: Phaser.Tilemaps.Tile) {
diff --git a/src/components/utilities/zoneEditor/ZoneSettings.vue b/src/components/utilities/zoneEditor/ZoneSettings.vue
index 2b5ca73..0066a8e 100644
--- a/src/components/utilities/zoneEditor/ZoneSettings.vue
+++ b/src/components/utilities/zoneEditor/ZoneSettings.vue
@@ -13,11 +13,11 @@
           </div>
           <div>
             <label for="name">Width</label>
-            <input v-model="width" name="name" id="name" />
+            <input v-model="width" name="name" id="name" type="number" />
           </div>
           <div>
             <label for="name">Height</label>
-            <input v-model="height" name="name" id="name" />
+            <input v-model="height" name="name" id="name" type="number" />
           </div>
           <div>
             <label for="name">PVP enabled</label>
@@ -45,10 +45,10 @@ watch(name, (value) => {
 })
 
 watch(width, (value) => {
-  zoneEditorStore.setWidth(value)
+  zoneEditorStore.setWidth(parseInt(value))
 })
 
 watch(height, (value) => {
-  zoneEditorStore.setHeight(value)
+  zoneEditorStore.setHeight(parseInt(value))
 })
 </script>
\ No newline at end of file
diff --git a/src/types.ts b/src/types.ts
index 273e821..b198686 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -3,47 +3,85 @@ export type Notification = {
   message: string
 }
 
+// User model
 export type User = {
-  id: number
-  username: string
-  password: string
-  characters: Character[]
-}
+  id: number;
+  username: string;
+  password: string;
+  characters: Character[];
+};
 
+// Character model
 export type Character = {
-  id: number
-  userId: number
-  user: User
-  name: string
-  hitpoints: number
-  mana: number
-  level: number
-  experience: number
-  role: string
-  position_x: number
-  position_y: number
-  rotation: number
-  zoneId: number
-  zone: Zone
-  chats: Chat[]
-}
+  id: number;
+  userId: number;
+  user: User;
+  name: string;
+  hitpoints: number;
+  mana: number;
+  level: number;
+  experience: number;
+  role: string;
+  position_x: number;
+  position_y: number;
+  rotation: number;
+  zoneId: number;
+  zone: Zone;
+  chats: Chat[];
+};
 
+// Zone model
 export type Zone = {
-  id: number
-  name: string
-  width: number
-  height: number
-  tiles: number[][]
-  characters: Character[]
-  chats: Chat[]
-}
+  id: number;
+  name: string;
+  width: number;
+  height: number;
+  tiles: ZoneTile[];
+  decorations: ZoneDecoration[];
+  walls: ZoneWall[];
+  characters: Character[];
+  chats: Chat[];
+  createdAt: Date;
+  updatedAt: Date;
+};
 
+// ZoneTile model
+export type ZoneTile = {
+  id: number;
+  zone: Zone;
+  zoneId: number;
+  x: number;
+  y: number;
+  type: number;
+};
+
+// ZoneDecoration model
+export type ZoneDecoration = {
+  id: number;
+  zone: Zone;
+  zoneId: number;
+  x: number;
+  y: number;
+  type: number;
+};
+
+// ZoneWall model
+export type ZoneWall = {
+  id: number;
+  zone: Zone;
+  zoneId: number;
+  x: number;
+  y: number;
+  type: number;
+};
+
+// Chat model
 export type Chat = {
-  id: number
-  characterId: number
-  character: Character
-  zoneId: number
-  zone: Zone
-  message: string
-  createdAt: Date
-}
+  id: number;
+  characterId: number;
+  character: Character;
+  zoneId: number;
+  zone: Zone;
+  message: string;
+  createdAt: Date;
+};