From 71f5330b9bf4aa66c6606cc55bfe72d7f3912128 Mon Sep 17 00:00:00 2001 From: Dennis Postma Date: Fri, 26 Jul 2024 04:40:46 +0200 Subject: [PATCH] Worked on sprite logic --- .../migration.sql | 1 + prisma/schema/sprite.prisma | 27 ++++++-------- src/events/gm/sprite/Update.ts | 35 +++++++++++-------- src/repositories/SpriteRepository.ts | 14 +++++++- 4 files changed, 45 insertions(+), 32 deletions(-) rename prisma/migrations/{20240725185237_init => 20240725232808_init}/migration.sql (99%) diff --git a/prisma/migrations/20240725185237_init/migration.sql b/prisma/migrations/20240725232808_init/migration.sql similarity index 99% rename from prisma/migrations/20240725185237_init/migration.sql rename to prisma/migrations/20240725232808_init/migration.sql index 38b4810..b508011 100644 --- a/prisma/migrations/20240725185237_init/migration.sql +++ b/prisma/migrations/20240725232808_init/migration.sql @@ -24,6 +24,7 @@ CREATE TABLE `SpriteAction` ( `id` VARCHAR(191) NOT NULL, `spriteId` VARCHAR(191) NOT NULL, `action` VARCHAR(191) NOT NULL, + `sprites` JSON NULL, `origin_x` DECIMAL(65, 30) NOT NULL DEFAULT 0, `origin_y` DECIMAL(65, 30) NOT NULL DEFAULT 0, `isAnimated` BOOLEAN NOT NULL DEFAULT false, diff --git a/prisma/schema/sprite.prisma b/prisma/schema/sprite.prisma index be21d04..a47fe76 100644 --- a/prisma/schema/sprite.prisma +++ b/prisma/schema/sprite.prisma @@ -8,23 +8,16 @@ model Sprite { } model SpriteAction { - id String @id @default(uuid()) + id String @id @default(uuid()) spriteId String - sprite Sprite @relation(fields: [spriteId], references: [id], onDelete: Cascade) + sprite Sprite @relation(fields: [spriteId], references: [id], onDelete: Cascade) action String - origin_x Decimal @default(0) - origin_y Decimal @default(0) - isAnimated Boolean @default(false) - isLooping Boolean @default(false) - frameWidth Int @default(0) - frameHeight Int @default(0) - frameSpeed Int @default(0) - images SpriteActionImage[] -} - -model SpriteActionImage { - id String @id @default(uuid()) - spriteActionId String - spriteAction SpriteAction @relation(fields: [spriteActionId], references: [id], onDelete: Cascade) - order Int + sprites Json? + origin_x Decimal @default(0) + origin_y Decimal @default(0) + isAnimated Boolean @default(false) + isLooping Boolean @default(false) + frameWidth Int @default(0) + frameHeight Int @default(0) + frameSpeed Int @default(0) } diff --git a/src/events/gm/sprite/Update.ts b/src/events/gm/sprite/Update.ts index f81b16f..9377518 100644 --- a/src/events/gm/sprite/Update.ts +++ b/src/events/gm/sprite/Update.ts @@ -2,22 +2,17 @@ import { Server } from 'socket.io' import { TSocket } from '../../../utilities/Types' import prisma from '../../../utilities/Prisma' import type { SpriteAction } from '@prisma/client' - -type uploadSpriteAction = SpriteAction & { - base64?: string -} +import path from 'path' +import { writeFile } from 'node:fs/promises' +import fs from 'fs/promises' +import spriteRepository from '../../../repositories/SpriteRepository' type Payload = { id: string name: string - spriteActions: uploadSpriteAction[] + spriteActions: SpriteAction[] } -/** - * Handle game master sprite update event - * @param socket - * @param io - */ export default function (socket: TSocket, io: Server) { socket.on('gm:sprite:update', async (data: Payload, callback: (success: boolean) => void) => { if (socket.character?.role !== 'gm') { @@ -25,7 +20,7 @@ export default function (socket: TSocket, io: Server) { } try { - const sprite = await prisma.sprite.update({ + await prisma.sprite.update({ where: { id: data.id }, @@ -35,12 +30,24 @@ export default function (socket: TSocket, io: Server) { deleteMany: { spriteId: data.id }, - create: data.spriteActions + create: data.spriteActions.map((spriteAction) => ({ + action: spriteAction.action, + origin_x: spriteAction.origin_x, + origin_y: spriteAction.origin_y, + isAnimated: spriteAction.isAnimated, + isLooping: spriteAction.isLooping, + sprites: spriteAction.sprites as string[], + })) } } }) - // store the sprite image + const public_folder = path.join(process.cwd(), 'public', 'sprites', data.id) + + // Ensure the folder exists + await fs.mkdir(public_folder, { recursive: true }) + + const sprite = await spriteRepository.getById(data.id) callback(true) } catch (error) { @@ -48,4 +55,4 @@ export default function (socket: TSocket, io: Server) { callback(false) } }) -} +} \ No newline at end of file diff --git a/src/repositories/SpriteRepository.ts b/src/repositories/SpriteRepository.ts index e46e007..c0093d6 100644 --- a/src/repositories/SpriteRepository.ts +++ b/src/repositories/SpriteRepository.ts @@ -12,7 +12,19 @@ class SpriteRepository { } async getAll(): Promise { - return prisma.sprite.findMany() + return prisma.sprite.findMany({ + include: { + spriteActions: true + } + }) + } + + async getSpriteActions(spriteId: string) { + return prisma.spriteAction.findMany({ + where: { + spriteId + } + }) } }