forked from noxious/server
86 lines
3.3 KiB
TypeScript
86 lines
3.3 KiB
TypeScript
import prisma from '../utilities/prisma'
|
|
import { AssetData } from '../utilities/types'
|
|
import tileRepository from '../repositories/tileRepository'
|
|
import zoneRepository from '../repositories/zoneRepository'
|
|
import { Object, Zone, ZoneObject } from '@prisma/client'
|
|
|
|
type getZoneAsetsZoneType = Zone & {
|
|
zoneObjects: (ZoneObject & {
|
|
object: Object
|
|
})[]
|
|
}
|
|
|
|
class ZoneService {
|
|
async createDemoZone(): Promise<boolean> {
|
|
const tiles = [
|
|
['blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile'],
|
|
['blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile'],
|
|
['blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile'],
|
|
['blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile'],
|
|
['blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile'],
|
|
['blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile'],
|
|
['blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile'],
|
|
['blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile'],
|
|
['blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile'],
|
|
['blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile']
|
|
]
|
|
|
|
await prisma.zone.create({
|
|
data: {
|
|
name: 'Demo zone',
|
|
width: 10,
|
|
height: 10,
|
|
tiles
|
|
}
|
|
})
|
|
|
|
console.log('Demo zone created.')
|
|
return true
|
|
}
|
|
|
|
async getZoneAssets(zone: getZoneAsetsZoneType): Promise<AssetData[]> {
|
|
const assets: AssetData[] = []
|
|
|
|
// zone.tiles is prisma jsonvalue
|
|
let tiles = JSON.parse(JSON.stringify(zone.tiles))
|
|
tiles = [...new Set(tiles.flat())]
|
|
|
|
// Add tile assets
|
|
for (const tile of tiles) {
|
|
const tileInfo = await tileRepository.getById(tile)
|
|
if (!tileInfo) continue
|
|
|
|
assets.push({
|
|
key: tileInfo.id,
|
|
data: '/assets/tiles/' + tileInfo.id + '.png',
|
|
group: 'tiles',
|
|
updatedAt: tileInfo?.updatedAt || new Date()
|
|
} as AssetData)
|
|
}
|
|
|
|
// Add object assets
|
|
for (const zoneObject of zone.zoneObjects) {
|
|
if (!zoneObject.object) continue
|
|
|
|
assets.push({
|
|
key: zoneObject.object.id,
|
|
data: '/assets/objects/' + zoneObject.object.id + '.png',
|
|
group: 'objects',
|
|
updatedAt: zoneObject.object.updatedAt || new Date()
|
|
} as AssetData)
|
|
}
|
|
|
|
// Filter out duplicate assets
|
|
return assets.reduce((acc: AssetData[], current) => {
|
|
const x = acc.find((item) => item.key === current.key && item.group === current.group)
|
|
if (!x) {
|
|
return acc.concat([current])
|
|
} else {
|
|
return acc
|
|
}
|
|
}, [])
|
|
}
|
|
}
|
|
|
|
export default ZoneService
|