forked from noxious/client
Added game store, stupid tile shit
This commit is contained in:
parent
16d830df66
commit
7ec1c73f1f
@ -7,16 +7,18 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { type Ref, ref } from 'vue'
|
import { useGameStore } from '@/stores/game'
|
||||||
import { useSocketStore } from '@/stores/socket'
|
|
||||||
import Notifications from '@/components/utilities/Notifications.vue'
|
import Notifications from '@/components/utilities/Notifications.vue'
|
||||||
import Login from '@/screens/Login.vue'
|
import Login from '@/screens/Login.vue'
|
||||||
import Register from '@/screens/Register.vue'
|
import Register from '@/screens/Register.vue'
|
||||||
import Characters from '@/screens/Characters.vue'
|
import Characters from '@/screens/Characters.vue'
|
||||||
import Game from '@/screens/Game.vue'
|
import Game from '@/screens/Game.vue'
|
||||||
|
import { storeToRefs } from 'pinia'
|
||||||
|
import { useSocketStore } from '@/stores/socket'
|
||||||
|
|
||||||
const screen: Ref<string> = ref('login')
|
|
||||||
const socket = useSocketStore()
|
const socket = useSocketStore()
|
||||||
|
const gameStore = useGameStore()
|
||||||
|
const {screen} = storeToRefs(gameStore);
|
||||||
|
|
||||||
socket.$subscribe(
|
socket.$subscribe(
|
||||||
(mutation, state) => {
|
(mutation, state) => {
|
||||||
|
@ -17,13 +17,12 @@ import { onBeforeMount, onBeforeUnmount, ref, type Ref, watch } from 'vue'
|
|||||||
import Controls from '@/components/utilities/Controls.vue'
|
import Controls from '@/components/utilities/Controls.vue'
|
||||||
import { useSocketStore } from '@/stores/socket'
|
import { useSocketStore } from '@/stores/socket'
|
||||||
import { useZoneStore } from '@/stores/zone'
|
import { useZoneStore } from '@/stores/zone'
|
||||||
import { generateTilemap } from '@/services/zone'
|
|
||||||
|
|
||||||
// Phavuer logic
|
// Phavuer logic
|
||||||
let scene = useScene()
|
let scene = useScene()
|
||||||
let tilemapLayer = ref()
|
let tilemapLayer = ref()
|
||||||
|
|
||||||
const tileMap = generateTilemap(scene, 10, 10)
|
const tileMap = null
|
||||||
let tileset: Tileset = tileMap.addTilesetImage('default', 'tiles') as Tileset
|
let tileset: Tileset = tileMap.addTilesetImage('default', 'tiles') as Tileset
|
||||||
let layer: TilemapLayer = tileMap.createBlankLayer('layer', tileset, 0, config.tile_size.y) as TilemapLayer
|
let layer: TilemapLayer = tileMap.createBlankLayer('layer', tileset, 0, config.tile_size.y) as TilemapLayer
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="flex justify-center m-2.5">
|
<div class="flex justify-center m-2.5">
|
||||||
<div class="toolbar fixed top-5 rounded flex bg-gray-300 bg-opacity-80 border-2 border-solid border-cyan text-gray-50 p-1.5 pl-2.5 min-w-[90%] h-10">
|
<div class="toolbar fixed top-5 rounded flex bg-gray-300 bg-opacity-80 border-2 border-solid border-cyan text-gray-50 p-1.5 pl-2.5 min-w-[90%] h-10">
|
||||||
<div class="tools flex gap-2.5">
|
<div class="tools flex gap-2.5" v-if="zoneEditorStore.zone">
|
||||||
<button class="flex justify-center items-center min-w-10 p-0 relative" :class="{ 'border-0 border-b-[3px] border-solid border-cyan-50 gap-2.5': zoneEditorStore.tool === 'move' }" @click="zoneEditorStore.setTool('move')">
|
<button class="flex justify-center items-center min-w-10 p-0 relative" :class="{ 'border-0 border-b-[3px] border-solid border-cyan-50 gap-2.5': zoneEditorStore.tool === 'move' }" @click="zoneEditorStore.setTool('move')">
|
||||||
<img class="invert w-5 h-5" src="/assets/icons/zoneEditor/move.svg" alt="Move camera" />
|
<img class="invert w-5 h-5" src="/assets/icons/zoneEditor/move.svg" alt="Move camera" />
|
||||||
</button>
|
</button>
|
||||||
@ -68,15 +68,15 @@
|
|||||||
|
|
||||||
<div class="w-[1px] bg-cyan"></div>
|
<div class="w-[1px] bg-cyan"></div>
|
||||||
|
|
||||||
<button class="flex justify-center items-center min-w-10 p-0 relative" @click="() => zoneEditorStore.toggleSettingsModal()">
|
<button class="flex justify-center items-center min-w-10 p-0 relative" @click="() => zoneEditorStore.toggleSettingsModal()" v-if="zoneEditorStore.zone">
|
||||||
<img class="invert w-5 h-5" src="/assets/icons/zoneEditor/gear.svg" alt="Zone settings" />
|
<img class="invert w-5 h-5" src="/assets/icons/zoneEditor/gear.svg" alt="Zone settings" />
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex gap-2.5 ml-auto">
|
<div class="flex gap-2.5 ml-auto">
|
||||||
<button class="btn-cyan px-3.5" @click="() => zoneEditorStore.toggleZoneListModal()">Load</button>
|
<button class="btn-cyan px-3.5" @click="() => zoneEditorStore.toggleZoneListModal()">Load</button>
|
||||||
<button class="btn-cyan px-3.5" @click="() => emit('save')">Save</button>
|
<button class="btn-cyan px-3.5" @click="() => emit('save')" v-if="zoneEditorStore.zone">Save</button>
|
||||||
<button class="btn-cyan px-3.5" @click="() => emit('clear')">Clear</button>
|
<button class="btn-cyan px-3.5" @click="() => emit('clear')" v-if="zoneEditorStore.zone">Clear</button>
|
||||||
<button class="btn-cyan px-3.5" @click="() => zoneEditorStore.toggleActive()">Exit</button>
|
<button class="btn-cyan px-3.5" @click="() => zoneEditorStore.toggleActive()">Exit</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
<Controls :layer="tiles" />
|
<Controls :layer="tiles" />
|
||||||
|
|
||||||
<Container>
|
<Container>
|
||||||
<Image v-for="object in zoneObjects" :key="object.object.id" :x="object.position_x" :y="object.position_y" :texture="object.object.id" :originY="Number(object.object.origin_x)" :originX="Number(object.object.origin_y)" />
|
<Image v-for="object in zoneObjects" :depth="3" :key="object.object.id" :x="object.position_x" :y="object.position_y" :texture="object.object.id" :originY="Number(object.object.origin_x)" :originX="Number(object.object.origin_y)" />
|
||||||
</Container>
|
</Container>
|
||||||
|
|
||||||
<Toolbar :layer="tiles" @eraser="eraser" @pencil="pencil" @paint="paint" @save="save" />
|
<Toolbar :layer="tiles" @eraser="eraser" @pencil="pencil" @paint="paint" @save="save" />
|
||||||
@ -15,9 +15,7 @@
|
|||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import config from '@/config'
|
import config from '@/config'
|
||||||
import Tileset = Phaser.Tilemaps.Tileset
|
import { Container, Image, TilemapLayer as TilemapLayerC, useScene } from 'phavuer'
|
||||||
import TilemapLayer = Phaser.Tilemaps.TilemapLayer
|
|
||||||
import { Container, TilemapLayer as TilemapLayerC, useScene, Image } from 'phavuer'
|
|
||||||
import { onBeforeMount, onBeforeUnmount, ref, toRaw, watch } from 'vue'
|
import { onBeforeMount, onBeforeUnmount, ref, toRaw, watch } from 'vue'
|
||||||
import Controls from '@/components/utilities/Controls.vue'
|
import Controls from '@/components/utilities/Controls.vue'
|
||||||
import { useSocketStore } from '@/stores/socket'
|
import { useSocketStore } from '@/stores/socket'
|
||||||
@ -25,19 +23,14 @@ import Toolbar from '@/components/utilities/zoneEditor/Toolbar.vue'
|
|||||||
import Tiles from '@/components/utilities/zoneEditor/Tiles.vue'
|
import Tiles from '@/components/utilities/zoneEditor/Tiles.vue'
|
||||||
import { useZoneEditorStore } from '@/stores/zoneEditor'
|
import { useZoneEditorStore } from '@/stores/zoneEditor'
|
||||||
import ZoneSettings from '@/components/utilities/zoneEditor/ZoneSettings.vue'
|
import ZoneSettings from '@/components/utilities/zoneEditor/ZoneSettings.vue'
|
||||||
import { getTiles, placeTile, tileToWorldXY } from '@/services/zone'
|
import { getTiles, placeTile, setAllTiles, tileToWorldXY } from '@/services/zone'
|
||||||
import { useAssetStore } from '@/stores/assets'
|
import { useAssetStore } from '@/stores/assets'
|
||||||
import Objects from '@/components/utilities/zoneEditor/Objects.vue'
|
import Objects from '@/components/utilities/zoneEditor/Objects.vue'
|
||||||
import type { Object } from '@/types'
|
import type { ZoneObject } from '@/types'
|
||||||
import { storeToRefs } from 'pinia'
|
import { storeToRefs } from 'pinia'
|
||||||
import ZoneList from '@/components/utilities/zoneEditor/ZoneList.vue'
|
import ZoneList from '@/components/utilities/zoneEditor/ZoneList.vue'
|
||||||
|
import Tileset = Phaser.Tilemaps.Tileset
|
||||||
type ZoneObject = {
|
import TilemapLayer = Phaser.Tilemaps.TilemapLayer
|
||||||
id: number
|
|
||||||
object: Object
|
|
||||||
position_x: number
|
|
||||||
position_y: number
|
|
||||||
}
|
|
||||||
|
|
||||||
const scene = useScene()
|
const scene = useScene()
|
||||||
const socket = useSocketStore()
|
const socket = useSocketStore()
|
||||||
@ -89,7 +82,10 @@ function eraser(tile: Phaser.Tilemaps.Tile) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (zoneEditorStore.drawMode === 'object') {
|
if (zoneEditorStore.drawMode === 'object') {
|
||||||
zoneObjects.value = zoneObjects.value.filter((object) => object.position_x !== tileToWorldXY(tiles, tile.x, tile.y).position_x && object.position_y !== tileToWorldXY(tiles, tile.x, tile.y).position_y)
|
zoneObjects.value = zoneObjects.value.filter((object) => {
|
||||||
|
const worldXY = tileToWorldXY(tiles, tile.x, tile.y)
|
||||||
|
return object.position_x !== worldXY.position_x || object.position_y !== worldXY.position_y
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -100,13 +96,21 @@ function pencil(tile: Phaser.Tilemaps.Tile) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (zoneEditorStore.drawMode === 'object') {
|
if (zoneEditorStore.drawMode === 'object') {
|
||||||
|
if (zoneEditorStore.zone === null) return
|
||||||
if (zoneEditorStore.selectedObject === null) return
|
if (zoneEditorStore.selectedObject === null) return
|
||||||
|
|
||||||
zoneObjects.value.push({
|
zoneObjects.value.push({
|
||||||
id: zoneObjects.value.length + 1,
|
id: Math.random(),
|
||||||
|
zoneId: zoneEditorStore.zone.id,
|
||||||
|
zone: zoneEditorStore.zone,
|
||||||
|
objectId: zoneEditorStore.selectedObject.id,
|
||||||
object: zoneEditorStore.selectedObject,
|
object: zoneEditorStore.selectedObject,
|
||||||
position_x: tileToWorldXY(tiles, tile.x, tile.y).position_x,
|
position_x: tileToWorldXY(tiles, tile.x, tile.y).position_x,
|
||||||
position_y: tileToWorldXY(tiles, tile.x, tile.y).position_y
|
position_y: tileToWorldXY(tiles, tile.x, tile.y).position_y
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// remove duplicates based on object, pos x and y
|
||||||
|
zoneObjects.value = zoneObjects.value.filter((object, index, self) => index === self.findIndex((t) => t.objectId === object.objectId && t.position_x === object.position_x && t.position_y === object.position_y))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -116,18 +120,34 @@ function paint(tile: Phaser.Tilemaps.Tile) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function save() {
|
function save() {
|
||||||
console.log(getTiles(zoneTilemap))
|
|
||||||
|
if (!zoneEditorStore.zone) return
|
||||||
|
console.log(getTiles);
|
||||||
|
const tilesArray = []
|
||||||
|
|
||||||
|
socket.connection.emit('gm:zone_editor:zone:update', {
|
||||||
|
zoneId: zoneEditorStore.zone.id,
|
||||||
|
name: zoneEditorStore.zone.name,
|
||||||
|
width: zoneTilemap.width,
|
||||||
|
height: zoneTilemap.height,
|
||||||
|
tiles: tilesArray,
|
||||||
|
objects: zoneObjects.value
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
onBeforeMount(() => {
|
onBeforeMount(() => {
|
||||||
exampleTilesArray.forEach((row, y) => row.forEach((tile, x) => placeTile(zoneTilemap, tiles, x, y, 'blank_tile')))
|
exampleTilesArray.forEach((row, y) => row.forEach((tile, x) => placeTile(zoneTilemap, tiles, x, y, 'blank_tile')))
|
||||||
|
if (zoneEditorStore.zone) {
|
||||||
|
if (zoneEditorStore.zone.tiles) setAllTiles(zoneTilemap, tiles, zoneEditorStore.zone.tiles)
|
||||||
|
zoneObjects.value = zoneEditorStore.zone?.zoneObjects ?? []
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
onBeforeUnmount(() => {
|
onBeforeUnmount(() => {
|
||||||
tiles.destroy()
|
tiles.destroy()
|
||||||
zoneTilemap.removeAllLayers()
|
zoneTilemap.removeAllLayers()
|
||||||
zoneTilemap.destroy()
|
zoneTilemap.destroy()
|
||||||
// zoneEditorStore.reset()
|
zoneEditorStore.reset()
|
||||||
})
|
})
|
||||||
|
|
||||||
// center camera
|
// center camera
|
||||||
|
@ -9,6 +9,10 @@ export function getTile(x: number, y: number, layer: Phaser.Tilemaps.TilemapLaye
|
|||||||
return tile
|
return tile
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getTiles(layer: Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tile[] {
|
||||||
|
return layer.getTilesWithin()
|
||||||
|
}
|
||||||
|
|
||||||
export function tileToWorldX(layer: Phaser.Tilemaps.TilemapLayer, pos_x: number) {
|
export function tileToWorldX(layer: Phaser.Tilemaps.TilemapLayer, pos_x: number) {
|
||||||
const worldPoint = layer.tileToWorldX(pos_x)
|
const worldPoint = layer.tileToWorldX(pos_x)
|
||||||
return worldPoint + config.tile_size.y
|
return worldPoint + config.tile_size.y
|
||||||
@ -32,17 +36,13 @@ export function placeTile(zone: Tilemap, layer: TilemapLayer, x: number, y: numb
|
|||||||
layer.putTileAt(tileImg.firstgid, x, y)
|
layer.putTileAt(tileImg.firstgid, x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getTiles(zone: Tilemap): string[][] {
|
export function setAllTiles(zone: Tilemap, layer: TilemapLayer, tiles: string[][]) {
|
||||||
const tiles = []
|
|
||||||
for (let y = 0; y < zone.height; y++) {
|
for (let y = 0; y < zone.height; y++) {
|
||||||
const row = []
|
|
||||||
for (let x = 0; x < zone.width; x++) {
|
for (let x = 0; x < zone.width; x++) {
|
||||||
const tile = zone.getTileAt(x, y)
|
let tileName = tiles[y][x]
|
||||||
row.push(!tile?.index ? 'blank_tile' : zone.tilesets[tile.index].name)
|
const tileImg = zone.getTileset(tileName ?? 'blank_tile') as Tileset
|
||||||
|
if (!tileImg) continue
|
||||||
|
placeTile(zone, layer, x, y, tileName)
|
||||||
}
|
}
|
||||||
tiles.push(row)
|
|
||||||
}
|
}
|
||||||
return tiles
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function generateTilemap(scene: Phaser.Scene, width: number, height: number) {}
|
|
||||||
|
12
src/stores/game.ts
Normal file
12
src/stores/game.ts
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import { defineStore } from 'pinia'
|
||||||
|
|
||||||
|
export const useGameStore = defineStore('game', {
|
||||||
|
state: () => ({
|
||||||
|
screen: 'login',
|
||||||
|
}),
|
||||||
|
actions: {
|
||||||
|
setScreen(screen: string) {
|
||||||
|
this.screen = screen
|
||||||
|
},
|
||||||
|
}
|
||||||
|
})
|
@ -1,6 +1,5 @@
|
|||||||
import { defineStore } from 'pinia'
|
import { defineStore } from 'pinia'
|
||||||
import type { Character } from '@/types'
|
import type { Character } from '@/types'
|
||||||
import config from '@/config'
|
|
||||||
|
|
||||||
export const useZoneStore = defineStore('zone', {
|
export const useZoneStore = defineStore('zone', {
|
||||||
state: () => ({
|
state: () => ({
|
||||||
|
@ -51,7 +51,6 @@ export const useZoneEditorStore = defineStore('zoneEditor', {
|
|||||||
this.isCreateZoneModalShown = !this.isCreateZoneModalShown
|
this.isCreateZoneModalShown = !this.isCreateZoneModalShown
|
||||||
},
|
},
|
||||||
reset() {
|
reset() {
|
||||||
this.zone = null
|
|
||||||
this.tileList = []
|
this.tileList = []
|
||||||
this.objectList = []
|
this.objectList = []
|
||||||
this.tool = 'move'
|
this.tool = 'move'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user