From c196646955bb5b30953debe4f3d40da27c7224f1 Mon Sep 17 00:00:00 2001 From: Dylan Pizzo Date: Sat, 4 Jan 2025 22:32:17 -0500 Subject: [PATCH] progress! --- deno.json | 5 +++- src/client/Card.tsx | 7 +++-- src/draw.ts | 66 +++++++++++++++++++++++++++++++++++++++------ tools/dev.ts | 37 +++++++++++++++++++++++++ 4 files changed, 104 insertions(+), 11 deletions(-) create mode 100644 tools/dev.ts diff --git a/deno.json b/deno.json index 6e358b2..f8db202 100644 --- a/deno.json +++ b/deno.json @@ -1,8 +1,11 @@ { "lock": false, "tasks": { + "dev": "deno run -A tools/dev.ts", "build": "deno run -A tools/build.ts", - "serve": "deno run -A src/server/index.ts" + "build:watch": "deno run --watch=src/client,src/server -A tools/build.ts", + "serve": "deno run -A src/server/index.ts", + "serve:watch": "deno run --watch=src/client,src/server -A src/server/index.ts" }, "lint": { "rules": { diff --git a/src/client/Card.tsx b/src/client/Card.tsx index 21c68a7..7b22ee7 100644 --- a/src/client/Card.tsx +++ b/src/client/Card.tsx @@ -1,4 +1,4 @@ -import { drawCard } from "../draw.ts"; +import { drawCard, loadImages } from "../draw.ts"; import { DominionCard } from "../types.ts"; const sizeMap = { @@ -15,10 +15,13 @@ const sizeMap = { export const Card = (props: {card: DominionCard}) => { const {card} = props; const {width, height} = sizeMap[card.orientation]; - return { + return { if (canvasElement) { const context = canvasElement.getContext("2d"); if (context) { + console.log("loading"); + await loadImages() + console.log("done loading"); drawCard(context, card); } } diff --git a/src/draw.ts b/src/draw.ts index b28845d..5e21a34 100644 --- a/src/draw.ts +++ b/src/draw.ts @@ -5,6 +5,8 @@ export const loadImage = ( key: string, src: string ): Promise => { + console.log("2", key); + console.log(src); return new Promise((resolve) => { if (key in imageCache && imageCache[key]) { resolve(imageCache[key]); @@ -14,21 +16,39 @@ export const loadImage = ( imageCache[key] = img; resolve(img); }; + img.onerror = (e) => { + console.log("err", e); + }; img.src = src; }); }; const imageList = [ { - key: "card", - src: "/assets/CardColorOne.png", + key: "card-color-1", + src: "/static/assets/CardColorOne.png", + }, + { + key: "card-brown", + src: "/static/assets/CardBrown.png", + }, + { + key: "card-gray", + src: "/static/assets/CardGray.png", + }, + { + key: "card-description-focus", + src: "/static/assets/DescriptionFocus.png", }, ]; -for (const imageInfo of imageList) { - const { key, src } = imageInfo; - await loadImage(key, src); -} +export const loadImages = async () => { + for (const imageInfo of imageList) { + const { key, src } = imageInfo; + console.log(key); + await loadImage(key, src); + } +}; export const getImage = (key: string) => { const image = imageCache[key]; @@ -38,6 +58,25 @@ export const getImage = (key: string) => { return image; }; +export const colorImage = ( + image: HTMLImageElement, + color: string +): HTMLCanvasElement => { + const canvas = document.createElement("canvas"); + canvas.width = image.width; + canvas.height = image.height; + const context = canvas.getContext("2d")!; + context.save(); + context.drawImage(image, 0, 0); + context.globalCompositeOperation = "multiply"; + context.fillStyle = color; + context.fillRect(0, 0, canvas.width, canvas.height); + context.globalCompositeOperation = "destination-atop"; // restore transparency + context.drawImage(image, 0, 0); + context.restore(); + return canvas; +}; + export const drawCard = ( context: CanvasRenderingContext2D, card: DominionCard @@ -56,8 +95,19 @@ const drawStandardCard = async ( const w = context.canvas.width; const h = context.canvas.height; context.save(); - context.fillStyle = "brown"; - context.drawImage(getImage("card"), 0, 0); + // Draw the image + // Draw the card base + context.drawImage(colorImage(getImage("card-color-1"), "#ff9900"), 0, 0); + context.drawImage(getImage("card-gray"), 0, 0); + context.drawImage(colorImage(getImage("card-brown"), "#ff9911"), 0, 0); + context.drawImage(getImage("card-description-focus"), 44, 1094); + // Draw the name + // Draw the description + // Draw the types + // Draw the cost + // Draw the preview + // Draw the icon + // Draw the credit context.restore(); }; diff --git a/tools/dev.ts b/tools/dev.ts new file mode 100644 index 0000000..c96c8db --- /dev/null +++ b/tools/dev.ts @@ -0,0 +1,37 @@ +runConcurrentTasks().catch((error) => { + console.error("Error running tasks:", error); + Deno.exit(1); +}); + +async function runConcurrentTasks() { + const tasks = [ + runCommand("deno task build:watch"), + runCommand("deno task serve:watch"), + ]; + + const results = await Promise.all(tasks); + if (results.includes(false)) { + console.error("One or more tasks failed."); + Deno.exit(1); + } else { + console.log("All tasks completed successfully."); + } +} + +async function runCommand(fullCommand: string) { + const [command, ...args] = fullCommand.split(" "); + + const cmd = new Deno.Command(command!, { + args, + stdout: "piped", + }); + const process = cmd.spawn(); + + const status = await process.status; + if (status.code !== 0) { + console.error(`Command failed: ${command}`); + return false; + } + + return true; +}