Add sprite logics

This commit is contained in:
Dennis Postma 2024-07-20 15:18:14 +02:00
parent 86123c64a8
commit 23f06061c0
8 changed files with 197 additions and 3 deletions

View File

@ -3,7 +3,7 @@
// npx prisma init // npx prisma init
// 2. Create a new database schema // 2. Create a new database schema
// npx prisma db push // npx prisma db push
// 3. Generate Prisma Client // 3. Generate Prisma Client and type-safe models based on schema
// npx prisma generate // npx prisma generate
// 4. Create a new migration // 4. Create a new migration
// npx prisma migrate dev --name init // npx prisma migrate dev --name init
@ -24,6 +24,7 @@ model Sprite {
name String name String
origin_x Decimal @default(0) origin_x Decimal @default(0)
origin_y Decimal @default(0) origin_y Decimal @default(0)
type String
frameSpeed Int @default(0) frameSpeed Int @default(0)
isAnimated Boolean @default(false) isAnimated Boolean @default(false)
isLooping Boolean @default(false) isLooping Boolean @default(false)

View File

@ -0,0 +1,26 @@
import { Server } from "socket.io";
import {TSocket} from "../../../utilities/Types";
import { Sprite } from '@prisma/client'
import SpriteRepository from '../../../repositories/SpriteRepository'
interface IPayload {
}
/**
* Handle game master list sprite event
* @param socket
* @param io
*/
export default function (socket: TSocket, io: Server) {
socket.on('gm:sprite:list', async (data: any, callback: (response: Sprite[]) => void) => {
if (socket.character?.role !== 'gm') {
console.log(`---Character #${socket.character?.id} is not a game master.`);
return;
}
// get all sprites
const sprites = await SpriteRepository.getAll();
callback(sprites);
});
}

View File

@ -0,0 +1,45 @@
import { Server } from "socket.io";
import {TSocket} from "../../../utilities/Types";
import path from "path";
import fs from "fs";
import SpriteRepository from '../../../repositories/SpriteRepository'
interface IPayload {
sprite: string;
}
/**
* Handle game master remove sprite event
* @param socket
* @param io
*/
export default function (socket: TSocket, io: Server) {
socket.on('gm:sprite:remove', async (data: IPayload, callback: (response: boolean) => void) => {
if (socket.character?.role !== 'gm') {
return;
}
try {
await SpriteRepository.delete(data.sprite);
// get root path
const public_folder = path.join(process.cwd(), 'public', 'sprites');
// remove the tile from the disk
const finalFilePath = path.join(public_folder, data.sprite + '.png');
fs.unlink(finalFilePath, (err) => {
if (err) {
console.log(err);
callback(false);
return;
}
callback(true);
});
} catch (e) {
console.log(e);
callback(false);
}
});
}

View File

@ -0,0 +1,34 @@
import { Server } from "socket.io";
import {TSocket} from "../../../utilities/Types";
import SpriteRepository from '../../../repositories/SpriteRepository'
import { Sprite } from '@prisma/client'
interface IPayload {
id: string;
name: string;
origin_x: number;
origin_y: number;
}
/**
* Handle game master sprite update event
* @param socket
* @param io
*/
export default function (socket: TSocket, io: Server) {
socket.on('gm:sprite:update', async (data: IPayload, callback: (success: boolean) => void) => {
if (socket.character?.role !== 'gm') {
return;
}
try {
const sprite = await SpriteRepository.update(data.id, data.name, data.origin_x, data.origin_y);
callback(true);
} catch (error) {
console.error(error);
callback(false);
}
});
}

View File

@ -0,0 +1,46 @@
import { Server } from "socket.io";
import { TSocket } from "../../../utilities/Types";
import { writeFile } from "node:fs/promises";
import path from "path";
import fs from "fs/promises";
import spriteRepository from '../../../repositories/SpriteRepository'
interface ISpriteData {
[key: string]: Buffer;
}
/**
* Handle game master upload sprite event
* @param socket
* @param io
*/
export default function (socket: TSocket, io: Server) {
socket.on('gm:sprite:upload', async (data: ISpriteData, callback: (response: boolean) => void) => {
try {
if (socket.character?.role !== 'gm') {
callback(false);
return;
}
const public_folder = path.join(process.cwd(), 'public', 'sprites');
// Ensure the folder exists
await fs.mkdir(public_folder, { recursive: true });
const uploadPromises = Object.entries(data).map(async ([key, spriteData]) => {
const sprite = await spriteRepository.create('New sprite', 0, 0);
const uuid = sprite.id;
const filename = `${uuid}.png`;
const finalFilePath = path.join(public_folder, filename);
await writeFile(finalFilePath, spriteData);
});
await Promise.all(uploadPromises);
callback(true);
} catch (error) {
console.error('Error uploading tile:', error);
callback(false);
}
});
}

View File

@ -1,6 +1,5 @@
import prisma from '../utilities/Prisma'; // Import the global Prisma instance import prisma from '../utilities/Prisma'; // Import the global Prisma instance
import {Character} from '@prisma/client'; import {Character} from '@prisma/client';
import CharacterService from "../services/CharacterService";
class CharacterRepository { class CharacterRepository {
async getByUserId(userId: number): Promise<Character[] | null> { async getByUserId(userId: number): Promise<Character[] | null> {

View File

@ -0,0 +1,43 @@
import prisma from '../utilities/Prisma'; // Import the global Prisma instance
import { Sprite } from '@prisma/client'
class SpriteRepository {
async getById(id: string): Promise<Sprite | null> {
return prisma.sprite.findUnique({
where: { id },
});
}
async getAll(): Promise<Sprite[]> {
return prisma.sprite.findMany();
}
async create(name: string, origin_x: number, origin_y: number): Promise<Sprite> {
return prisma.sprite.create({
data: {
name,
origin_x,
origin_y
},
});
}
async update(id: string, name: string, origin_x: number, origin_y: number): Promise<Sprite> {
return prisma.sprite.update({
where: { id },
data: {
name,
origin_x,
origin_y
},
});
}
async delete(id: string): Promise<Sprite> {
return prisma.sprite.delete({
where: { id },
});
}
}
export default new SpriteRepository();

View File

@ -9,9 +9,9 @@ import config from "./Config";
import {loginAccountSchema, registerAccountSchema} from "./ZodTypes"; import {loginAccountSchema, registerAccountSchema} from "./ZodTypes";
import path from "path"; import path from "path";
import { TAsset } from './Types' import { TAsset } from './Types'
import fs from 'fs'
import tileRepository from '../repositories/TileRepository' import tileRepository from '../repositories/TileRepository'
import objectRepository from '../repositories/ObjectRepository' import objectRepository from '../repositories/ObjectRepository'
import spriteRepository from '../repositories/SpriteRepository'
async function addHttpRoutes(app: Application) { async function addHttpRoutes(app: Application) {
app.get('/assets', async (req: Request, res: Response) => { app.get('/assets', async (req: Request, res: Response) => {